diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
index 05f5588..1ca9711 100644
--- a/.github/workflows/node.js.yml
+++ b/.github/workflows/node.js.yml
@@ -4,28 +4,27 @@
name: Node.js CI
on:
- push:
- branches: [ "master" ]
- pull_request:
- branches: [ "master" ]
+ push:
+ branches: ['master']
+ pull_request:
+ branches: ['master']
jobs:
- build:
+ build:
+ runs-on: ubuntu-latest
- runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [12.x, 14.x, 16.x]
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
- strategy:
- matrix:
- node-version: [12.x, 14.x, 16.x]
- # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
-
- steps:
- - uses: actions/checkout@v3
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- cache: 'npm'
- - run: npm ci
- - run: npm run build --if-present
- - run: npm test
+ steps:
+ - uses: actions/checkout@v3
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+ - run: npm ci
+ - run: npm run build --if-present
+ - run: npm test
diff --git a/.husky/.gitignore b/.husky/.gitignore
new file mode 100644
index 0000000..31354ec
--- /dev/null
+++ b/.husky/.gitignore
@@ -0,0 +1 @@
+_
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 0000000..36af219
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx lint-staged
diff --git a/.imgbotconfig b/.imgbotconfig
index 6046bb6..8f538db 100644
--- a/.imgbotconfig
+++ b/.imgbotconfig
@@ -2,4 +2,4 @@
"minKBReduced": null,
"compressWiki": "true",
"aggressiveCompression": "true"
-}
\ No newline at end of file
+}
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..7ed70f2
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,2 @@
+views/
+pnpm-lock.yaml
\ No newline at end of file
diff --git a/.prettierrc.toml b/.prettierrc.toml
new file mode 100644
index 0000000..327d72b
--- /dev/null
+++ b/.prettierrc.toml
@@ -0,0 +1,4 @@
+trailingComma = "es5"
+tabWidth = 4
+semi = false
+singleQuote = true
diff --git a/README.md b/README.md
index a0891b3..8ef78f7 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# IPost
+
IPost, formerly known as "authwebsite" is a chatting platform that also server as a gateway for me to have authentication for my other projects.
-You can visit IPost under https://ipost.rocks
\ No newline at end of file
+You can visit IPost under https://ipost.rocks
diff --git a/css/authorize.css b/css/authorize.css
index 9a3e35b..c710ab5 100644
--- a/css/authorize.css
+++ b/css/authorize.css
@@ -18,4 +18,4 @@ body {
.hidden {
display: none;
-}
\ No newline at end of file
+}
diff --git a/css/changePW.css b/css/changePW.css
index 0bc5495..124dfda 100644
--- a/css/changePW.css
+++ b/css/changePW.css
@@ -1,37 +1,37 @@
body {
- text-align: center;
- background: black;
+ text-align: center;
+ background: black;
}
div {
- align-items: center;
- text-align: center;
- border-radius: 20px;
- border: 5px solid black;
- display: inline-block;
- padding: 5%;
- padding-top: 1%;
- background-color: darkgray;
+ align-items: center;
+ text-align: center;
+ border-radius: 20px;
+ border: 5px solid black;
+ display: inline-block;
+ padding: 5%;
+ padding-top: 1%;
+ background-color: darkgray;
}
button {
- border-radius: 5px;
- font-size: 19px;
- background-color: purple;
- color: white;
+ border-radius: 5px;
+ font-size: 19px;
+ background-color: purple;
+ color: white;
}
input {
- border-radius: 8px;
- font-size: 20px;
- text-align: center;
- background-color: darkgray;
- color: black;
+ border-radius: 8px;
+ font-size: 20px;
+ text-align: center;
+ background-color: darkgray;
+ color: black;
}
label {
- display: inline-block;
- width: 150px;
- text-align: right;
- font-size: 18px;
+ display: inline-block;
+ width: 150px;
+ text-align: right;
+ font-size: 18px;
}
diff --git a/css/global.css b/css/global.css
index 50e0fc5..ea4d060 100644
--- a/css/global.css
+++ b/css/global.css
@@ -1,131 +1,132 @@
:root {
- --green: #C2F9BB; /* links etc */
- --fg-color: #303034; /* post background */
- --bg-color: #1B1B1E; /* page background etc */
- --text-color: #ECEAF1; /* text */
- --blue-ish: #587291; /* buttons etc */
+ --green: #c2f9bb; /* links etc */
+ --fg-color: #303034; /* post background */
+ --bg-color: #1b1b1e; /* page background etc */
+ --text-color: #eceaf1; /* text */
+ --blue-ish: #587291; /* buttons etc */
}
* {
- font-family: Arial, Helvetica, sans-serif;
+ font-family: Arial, Helvetica, sans-serif;
}
html {
- scroll-behavior: smooth;
+ scroll-behavior: smooth;
}
body {
- margin: 8px;
+ margin: 8px;
}
.noselect {
- user-select: none;
+ user-select: none;
}
#modal-shade,
#modal {
- display: none;
- text-align: center;
+ display: none;
+ text-align: center;
}
#modal-shade {
- position: fixed;
- z-index: 100;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
+ position: fixed;
+ z-index: 100;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
}
#modal {
- z-index: 101;
- position: fixed;
- width: 50%;
- height:50%;
- left:25%;
- right:25%;
- top:25%;
-
+ z-index: 101;
+ position: fixed;
+ width: 50%;
+ height: 50%;
+ left: 25%;
+ right: 25%;
+ top: 25%;
}
#modal-shade {
- background: silver;
- opacity: 0.5;
- filter: alpha(opacity=50);
+ background: silver;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
}
#modal {
- background: rgba(0,0,0,.5);
+ background: rgba(0, 0, 0, 0.5);
}
ul {
- list-style-type: none;
- margin: 0;
- padding: 0;
- overflow: hidden;
- background-color: var(--fg-color);
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+ background-color: var(--fg-color);
}
li {
- float: left;
+ float: left;
}
li a {
- display: block;
- color: white;
- text-align: center;
- padding: 14px 16px;
- text-decoration: none;
+ display: block;
+ color: white;
+ text-align: center;
+ padding: 14px 16px;
+ text-decoration: none;
}
.totib {
- margin-top: 6.5%;
+ margin-top: 6.5%;
}
li a:hover {
- background-color: #111;
+ background-color: #111;
}
a {
- text-decoration: none;
+ text-decoration: none;
}
-a:link:not(.no-link-style), a:visited:not(.no-link-style) {
- color: var(--green);
+a:link:not(.no-link-style),
+a:visited:not(.no-link-style) {
+ color: var(--green);
}
-.no-link-style:visited, .no-link-style:link {
- color: var(--text-color);
+.no-link-style:visited,
+.no-link-style:link {
+ color: var(--text-color);
}
a:hover {
- color: red;
+ color: red;
}
footer {
- color: white;
- margin-top: 100px;
- background-color: var(--fg-color);
+ color: white;
+ margin-top: 100px;
+ background-color: var(--fg-color);
}
.right {
- float: right;
+ float: right;
}
.less_padding {
- padding: 6px 14px;
+ padding: 6px 14px;
}
.pd-great {
- padding: 10px 30px;
+ padding: 10px 30px;
}
.bg-light {
- background-color: var(--fg-color);
+ background-color: var(--fg-color);
}
.bg-dark {
- background-color: var(--bg-color);
+ background-color: var(--bg-color);
}
.no-bg-img {
- background: none;
+ background: none;
}
diff --git a/css/logon.css b/css/logon.css
index 12c79b5..f392bb6 100644
--- a/css/logon.css
+++ b/css/logon.css
@@ -1,98 +1,99 @@
* {
- padding: 0px;
- margin: 0px;
+ padding: 0px;
+ margin: 0px;
}
body {
- background-color: var(--bg-color);
+ background-color: var(--bg-color);
}
header {
- color: white;
- display: flex;
- align-items: center;
- justify-content: center;
- height: 15vh;
- box-shadow: 5px 5px 10px rgb(0,0,0,0.3);
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 15vh;
+ box-shadow: 5px 5px 10px rgb(0, 0, 0, 0.3);
}
h1 {
- letter-spacing: 1.5vw;
- text-transform: uppercase;
- text-align: center;
+ letter-spacing: 1.5vw;
+ text-transform: uppercase;
+ text-align: center;
}
main {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 75vh;
- width: 100%;
- background: url(https://ipost.rocks/images/Mountains.webp) no-repeat center center;
- background-size: cover;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 75vh;
+ width: 100%;
+ background: url(https://ipost.rocks/images/Mountains.webp) no-repeat center
+ center;
+ background-size: cover;
}
.form_class {
- width: 500px;
- padding: 40px;
- border-radius: 8px;
- background-color: var(--bg-color);
- color: var(--text-color);
- box-shadow: 5px 5px 10px rgb(0,0,0,.3);
+ width: 500px;
+ padding: 40px;
+ border-radius: 8px;
+ background-color: var(--bg-color);
+ color: var(--text-color);
+ box-shadow: 5px 5px 10px rgb(0, 0, 0, 0.3);
}
.form_div {
- text-transform: uppercase;
+ text-transform: uppercase;
}
.form_div > label {
- letter-spacing: 3px;
- font-size: 1rem;
+ letter-spacing: 3px;
+ font-size: 1rem;
}
.info_div {
- text-align: center;
- margin-top: 20px;
+ text-align: center;
+ margin-top: 20px;
}
.info_div {
- letter-spacing: 1px;
+ letter-spacing: 1px;
}
.field_class {
- width: 100%;
- border-radius: 6px;
- border-style: solid;
- border-width: 1px;
- padding: 5px 0px;
- text-indent: 6px;
- margin-top: 10px;
- margin-bottom: 20px;
- font-size: 0.9rem;
- letter-spacing: 2px;
+ width: 100%;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ padding: 5px 0px;
+ text-indent: 6px;
+ margin-top: 10px;
+ margin-bottom: 20px;
+ font-size: 0.9rem;
+ letter-spacing: 2px;
}
.submit_class {
- border-style: none;
- border-radius: 5px;
- background-color: #FFE6D4;
- padding: 8px 20px;
- text-transform: uppercase;
- letter-spacing: .8px;
- display: block;
- margin: auto;
- margin-top: 10px;
- box-shadow: 2px 2px 5px rgb(0,0,0,0.2);
- cursor: pointer;
+ border-style: none;
+ border-radius: 5px;
+ background-color: #ffe6d4;
+ padding: 8px 20px;
+ text-transform: uppercase;
+ letter-spacing: 0.8px;
+ display: block;
+ margin: auto;
+ margin-top: 10px;
+ box-shadow: 2px 2px 5px rgb(0, 0, 0, 0.2);
+ cursor: pointer;
}
footer {
- height: 10vh;
- background-color: black;
- color: white;
- display: flex;
- align-items: center;
- justify-content: center;
- box-shadow: -5px -5px 10px rgb(0,0,0,0.3);
+ height: 10vh;
+ background-color: black;
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: -5px -5px 10px rgb(0, 0, 0, 0.3);
}
footer > p {
- text-align: center;
- letter-spacing: 3px;
+ text-align: center;
+ letter-spacing: 3px;
}
footer > p > a {
- text-decoration: none;
- color: white;
- font-weight: bold;
+ text-decoration: none;
+ color: white;
+ font-weight: bold;
}
a {
- color: red;
- text-decoration: none;
+ color: red;
+ text-decoration: none;
}
diff --git a/css/main.css b/css/main.css
index f7e9b19..044390d 100644
--- a/css/main.css
+++ b/css/main.css
@@ -1,46 +1,47 @@
* {
- padding: 0px;
- margin: 0px;
+ padding: 0px;
+ margin: 0px;
}
body {
- background-color: lightgreen;
+ background-color: lightgreen;
}
header {
- background-color: black;
- color: white;
- display: flex;
- align-items: center;
- justify-content: center;
- height: 15vh;
- box-shadow: 5px 5px 10px rgb(0,0,0,0.3);
+ background-color: black;
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 15vh;
+ box-shadow: 5px 5px 10px rgb(0, 0, 0, 0.3);
}
h1 {
- letter-spacing: 1.5vw;
- text-transform: uppercase;
- text-align: center;
+ letter-spacing: 1.5vw;
+ text-transform: uppercase;
+ text-align: center;
}
main {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 75vh;
- width: 100%;
- background: url(https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mountains-1412683.svg/1280px-Mountains-1412683.svg.png) no-repeat center center;
- background-size: cover;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 75vh;
+ width: 100%;
+ background: url(https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mountains-1412683.svg/1280px-Mountains-1412683.svg.png)
+ no-repeat center center;
+ background-size: cover;
}
.info_div {
- text-align: center;
- margin-top: 20px;
+ text-align: center;
+ margin-top: 20px;
}
.info_div {
- letter-spacing: 1px;
+ letter-spacing: 1px;
}
footer {
- height: 10vh;
- background-color: black;
- color: white;
- display: flex;
- align-items: center;
- justify-content: center;
- box-shadow: -5px -5px 10px rgb(0,0,0,0.3);
+ height: 10vh;
+ background-color: black;
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: -5px -5px 10px rgb(0, 0, 0, 0.3);
}
diff --git a/css/posts.css b/css/posts.css
index a4de1c8..e6d67d9 100644
--- a/css/posts.css
+++ b/css/posts.css
@@ -1,108 +1,111 @@
#posts > div > p > span:first-child {
- color: #BFE7D4;
+ color: #bfe7d4;
}
.status {
- color: var(--text-color);
+ color: var(--text-color);
}
.self {
- color: var(--text-color);
+ color: var(--text-color);
}
#username-self {
- color: #036D19;
+ color: #036d19;
}
.specialtext {
- color: yellow;
+ color: yellow;
}
.crossout {
- text-decoration: line-through;
+ text-decoration: line-through;
}
.greentext {
- color: var(--green);
+ color: var(--green);
}
#posts > div {
- background-color: var(--fg-color);
- padding-left: 5px;
- padding-bottom: 2px;
+ background-color: var(--fg-color);
+ padding-left: 5px;
+ padding-bottom: 2px;
}
.avatar {
- margin-right: 5px;
- margin-top: 10px;
- margin-left: 5px;
+ margin-right: 5px;
+ margin-top: 10px;
+ margin-left: 5px;
}
.mention {
- color: blue;
+ color: blue;
}
.user-mention {
- color: #036D19;
+ color: #036d19;
}
.everyone-mention {
- color: aqua;
+ color: aqua;
}
body {
- background-color: var(--bg-color);
+ background-color: var(--bg-color);
}
textarea {
- background-color: var(--bg-color);
+ background-color: var(--bg-color);
}
button {
- background-color: var(--blue-ish);
+ background-color: var(--blue-ish);
}
-.post,.self,.status {
- padding: 1%;
- color: var(--text-color);
- width: 50%;
- margin-left: 25%;
- margin-right: 25%;
- margin-top: 10px;
- margin-bottom: 10px;
- border-radius: 10px;
- overflow-wrap: break-word;
- overflow: hidden;
+.post,
+.self,
+.status {
+ padding: 1%;
+ color: var(--text-color);
+ width: 50%;
+ margin-left: 25%;
+ margin-right: 25%;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border-radius: 10px;
+ overflow-wrap: break-word;
+ overflow: hidden;
}
.ovfl-bw {
- overflow-wrap: break-word;
- overflow: hidden;
- background-color: var(--bg-color);
- padding: 1%;
+ overflow-wrap: break-word;
+ overflow: hidden;
+ background-color: var(--bg-color);
+ padding: 1%;
}
-#post-text, button {
- color: var(--text-color);
- border-radius: 5px;
- resize: none;
- overflow-wrap: break-word;
- overflow: hidden;
+#post-text,
+button {
+ color: var(--text-color);
+ border-radius: 5px;
+ resize: none;
+ overflow-wrap: break-word;
+ overflow: hidden;
}
.channelTab {
- color: var(--text-color);
- background-color: var(--fg-color);
- text-align: center;
- float: left;
- margin-left: 20px;
- margin-right: 20px;
+ color: var(--text-color);
+ background-color: var(--fg-color);
+ text-align: center;
+ float: left;
+ margin-left: 20px;
+ margin-right: 20px;
}
.channel {
- padding: 10px;
+ padding: 10px;
}
#scriptonly {
- margin: auto;
+ margin: auto;
}
diff --git a/css/search.css b/css/search.css
index 55e5081..3588c27 100644
--- a/css/search.css
+++ b/css/search.css
@@ -4,5 +4,5 @@ body {
}
.form_div {
- text-align: center;
+ text-align: center;
}
diff --git a/css/style.css b/css/style.css
index b3eedcc..cd04628 100644
--- a/css/style.css
+++ b/css/style.css
@@ -5,7 +5,7 @@ body {
}
h1 {
- color: white;
+ color: white;
}
button {
@@ -13,29 +13,30 @@ button {
margin: 10px;
}
-::placeholder{
- color: white;
+::placeholder {
+ color: white;
}
-#bio {
- color:black;
- font-size: 20px;
- background-color: black;
- border: 0px solid black;
- border-radius: 7px;
+#bio {
+ color: black;
+ font-size: 20px;
+ background-color: black;
+ border: 0px solid black;
+ border-radius: 7px;
}
.bio {
- color:black;
- font-size: 20px;
+ color: black;
+ font-size: 20px;
}
main {
-display: flex;
-/* align-items: center; */
-justify-content: center;
-height: 75vh;
-width: 100%;
-background: url(https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mountains-1412683.svg/1280px-Mountains-1412683.svg.png) no-repeat center center;
-background-size: cover;
+ display: flex;
+ /* align-items: center; */
+ justify-content: center;
+ height: 75vh;
+ width: 100%;
+ background: url(https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mountains-1412683.svg/1280px-Mountains-1412683.svg.png)
+ no-repeat center center;
+ background-size: cover;
}
diff --git a/docker-compose.yml b/docker-compose.yml
index ac1ca98..eaa7802 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,35 +1,35 @@
services:
- app:
- build: .
- ports:
- - "23080:80"
- environment:
- - MYSQL_HOST=db
- - MYSQL_USER=ipost
- - MYSQL_PASSWORD=ipost_password
- - MYSQL_DATABASE=ipost
- depends_on:
- - db
- volumes:
- - ./logs:/app/logs
- - ./server_config.json:/app/server_config.json
- - ./cookiesecret.txt:/app/cookiesecret.txt
- - ./mysql_password.txt:/app/mysql_password.txt
- restart: unless-stopped
+ app:
+ build: .
+ ports:
+ - '23080:80'
+ environment:
+ - MYSQL_HOST=db
+ - MYSQL_USER=ipost
+ - MYSQL_PASSWORD=ipost_password
+ - MYSQL_DATABASE=ipost
+ depends_on:
+ - db
+ volumes:
+ - ./logs:/app/logs
+ - ./server_config.json:/app/server_config.json
+ - ./cookiesecret.txt:/app/cookiesecret.txt
+ - ./mysql_password.txt:/app/mysql_password.txt
+ restart: unless-stopped
- db:
- image: mysql:8.0
- environment:
- - MYSQL_ROOT_PASSWORD=root_password
- - MYSQL_DATABASE=ipost
- - MYSQL_USER=ipost
- - MYSQL_PASSWORD=ipost_password
- volumes:
- - mysql_data:/var/lib/mysql
- - ./createSchema.sql:/docker-entrypoint-initdb.d/createSchema.sql
- ports:
- - "3306:3306"
- restart: unless-stopped
+ db:
+ image: mysql:8.0
+ environment:
+ - MYSQL_ROOT_PASSWORD=root_password
+ - MYSQL_DATABASE=ipost
+ - MYSQL_USER=ipost
+ - MYSQL_PASSWORD=ipost_password
+ volumes:
+ - mysql_data:/var/lib/mysql
+ - ./createSchema.sql:/docker-entrypoint-initdb.d/createSchema.sql
+ ports:
+ - '3306:3306'
+ restart: unless-stopped
volumes:
- mysql_data:
\ No newline at end of file
+ mysql_data:
diff --git a/extra_modules/SHA.js b/extra_modules/SHA.js
index 14ddeca..07599f2 100644
--- a/extra_modules/SHA.js
+++ b/extra_modules/SHA.js
@@ -1,12 +1,9 @@
-import crypto from "crypto";
+import crypto from 'crypto'
let SHA256_cache = {}
function _SHA256(str) {
- return crypto
- .createHash("sha256")
- .update(str)
- .digest("base64");
+ return crypto.createHash('sha256').update(str).digest('base64')
}
/**
@@ -17,25 +14,23 @@ function _SHA256(str) {
* @returns {string} base64 digested hash
*/
function SHA256(str, salt, num) {
- if (!num && num !== 0)
- num = 1;
- if (!str)
- return;
- let identifier = _SHA256(str+salt+num.toString())
- if(SHA256_cache[identifier] != undefined) {
- return SHA256_cache[identifier];
+ if (!num && num !== 0) num = 1
+ if (!str) return
+ let identifier = _SHA256(str + salt + num.toString())
+ if (SHA256_cache[identifier] != undefined) {
+ return SHA256_cache[identifier]
}
- let ret = str;
+ let ret = str
for (let i = 0; i < num; i++) {
ret = _SHA256(ret + salt)
}
- SHA256_cache[identifier] = ret;
- setTimeout(()=>{
+ SHA256_cache[identifier] = ret
+ setTimeout(() => {
SHA256_cache[identifier] = undefined
- },10000) //cache for 10s
- return ret;
+ }, 10000) //cache for 10s
+ return ret
}
-export { SHA256 };
+export { SHA256 }
export default {
- SHA256: SHA256
-};
+ SHA256: SHA256,
+}
diff --git a/extra_modules/ensureExists.js b/extra_modules/ensureExists.js
index 0d14170..70bc021 100644
--- a/extra_modules/ensureExists.js
+++ b/extra_modules/ensureExists.js
@@ -1,4 +1,4 @@
-import {mkdir} from "fs"
+import { mkdir } from 'fs'
/**
* makes sure that a given folder exists, if it doesn't it creates one for you
@@ -7,23 +7,19 @@ import {mkdir} from "fs"
* @param {Function} cb callback, gives null if the folder exists, otherwise gives the error
* @return {undefined} see: callback
*/
- function ensureExists(path, mask, cb) {
- if (typeof mask === 'function') { // Allow the `mask` parameter to be optional
- cb = mask;
- mask = 0o744;
+function ensureExists(path, mask, cb) {
+ if (typeof mask === 'function') {
+ // Allow the `mask` parameter to be optional
+ cb = mask
+ mask = 0o744
}
mkdir(path, mask, function (err) {
if (err) {
if (err.code === 'EEXIST')
- cb(null); // Ignore the error if the folder already exists
- else
- cb(err); // Something else went wrong
- }
- else
- cb(null); // Successfully created folder
- });
+ cb(null) // Ignore the error if the folder already exists
+ else cb(err) // Something else went wrong
+ } else cb(null) // Successfully created folder
+ })
}
-export {
- ensureExists
-} ;
\ No newline at end of file
+export { ensureExists }
diff --git a/extra_modules/getip.js b/extra_modules/getip.js
index 7cf79bd..9c1b2bb 100644
--- a/extra_modules/getip.js
+++ b/extra_modules/getip.js
@@ -1,14 +1,17 @@
-import fs from "fs";
-const config = JSON.parse(fs.readFileSync("server_config.json"));
+import fs from 'fs'
+const config = JSON.parse(fs.readFileSync('server_config.json'))
/**
* gets ip of a request
* @param {request} req
* @returns ip of the given request, after taking preferred headers into account
*/
function getIP(req) {
- let ip = req.socket.remoteAddress;
- if (req.headers[config.preferred_ip_header] !== undefined && ip === config.only_prefer_when_ip)
- ip = req.headers[config.preferred_ip_header];
- return ip;
+ let ip = req.socket.remoteAddress
+ if (
+ req.headers[config.preferred_ip_header] !== undefined &&
+ ip === config.only_prefer_when_ip
+ )
+ ip = req.headers[config.preferred_ip_header]
+ return ip
}
-export default getIP;
+export default getIP
diff --git a/extra_modules/navbar.html b/extra_modules/navbar.html
index 2fe1d34..1d24991 100644
--- a/extra_modules/navbar.html
+++ b/extra_modules/navbar.html
@@ -1,7 +1,15 @@
\ No newline at end of file
+ Home
+ Profile
+ Posts
+ DMs
+
+
+
+
diff --git a/extra_modules/unsign.js b/extra_modules/unsign.js
index dc98c99..b65efdb 100644
--- a/extra_modules/unsign.js
+++ b/extra_modules/unsign.js
@@ -1,7 +1,7 @@
-import * as signature from "cookie-signature";
-import fs from "fs";
-import getIP from "./getip.js";
-const cookiesecret = fs.readFileSync("cookiesecret.txt").toString();
+import * as signature from 'cookie-signature'
+import fs from 'fs'
+import getIP from './getip.js'
+const cookiesecret = fs.readFileSync('cookiesecret.txt').toString()
/**
* usignes a string
* @param {string} text text to unsign
@@ -10,14 +10,14 @@ const cookiesecret = fs.readFileSync("cookiesecret.txt").toString();
* @return {string/boolean} unsigned text, or if unsigning was unsuccessful, false
*/
function unsign(text, req, res) {
- let ip = getIP(req);
- let unsigned = signature.unsign(text, cookiesecret + ip);
+ let ip = getIP(req)
+ let unsigned = signature.unsign(text, cookiesecret + ip)
if (!unsigned) {
- unsigned = signature.unsign(text, cookiesecret); //unsafe login?
- if(!unsigned)return false;
+ unsigned = signature.unsign(text, cookiesecret) //unsafe login?
+ if (!unsigned) return false
return unsigned
}
- return unsigned;
+ return unsigned
}
/**
* unsignes the auth cookie of a request, also sends json response if auth cookie was invalid
@@ -26,26 +26,25 @@ function unsign(text, req, res) {
* @return {string/boolean} unsigned cookie, or if unsigning was unsuccessful, false
*/
function getunsigned(req, res) {
- let cookie = req.cookies.AUTH_COOKIE;
+ let cookie = req.cookies.AUTH_COOKIE
if (!cookie) {
- res.status(403);
- res.json({ "error": "you are not logged in! (no cookie)" });
- return;
+ res.status(403)
+ res.json({ error: 'you are not logged in! (no cookie)' })
+ return
}
- let unsigned = unsign(cookie, req, res);
+ let unsigned = unsign(cookie, req, res)
if (!unsigned) {
try {
- res.status(401);
- res.json({ "error": "Bad auth cookie set" });
- }
- catch (ignored) { } //sometimes it errors, gotta debug soon
- return false;
+ res.status(401)
+ res.json({ error: 'Bad auth cookie set' })
+ } catch (ignored) {} //sometimes it errors, gotta debug soon
+ return false
}
- return decodeURIComponent(unsigned);
+ return decodeURIComponent(unsigned)
}
-export { unsign };
-export { getunsigned };
+export { unsign }
+export { getunsigned }
export default {
unsign: unsign,
- getunsigned: getunsigned
-};
+ getunsigned: getunsigned,
+}
diff --git a/extra_modules/xor.js b/extra_modules/xor.js
index 40719ac..f567a3f 100644
--- a/extra_modules/xor.js
+++ b/extra_modules/xor.js
@@ -1,19 +1,24 @@
function XOR_hex(a, b) {
- var res = "", i = a.length, j = b.length;
+ var res = '',
+ i = a.length,
+ j = b.length
while (i-- > 0 && j-- > 0)
- res = (parseInt(a.charAt(i), 16) ^ parseInt(b.charAt(j), 16)).toString(16) + res;
- return res;
+ res =
+ (parseInt(a.charAt(i), 16) ^ parseInt(b.charAt(j), 16)).toString(
+ 16
+ ) + res
+ return res
}
function hexEncode(a) {
- let hex;
- let result = "";
+ let hex
+ let result = ''
for (let i = 0; i < a.length; i++) {
- hex = a.charCodeAt(i).toString(16);
- result += ("000" + hex).slice(-4);
+ hex = a.charCodeAt(i).toString(16)
+ result += ('000' + hex).slice(-4)
}
- return result;
+ return result
}
function xor(a, b) {
- return XOR_hex(hexEncode(a), hexEncode(b)).toString("hex");
+ return XOR_hex(hexEncode(a), hexEncode(b)).toString('hex')
}
-export default xor;
+export default xor
diff --git a/js/addnavbar.js b/js/addnavbar.js
index 6a67c0c..02ef55c 100644
--- a/js/addnavbar.js
+++ b/js/addnavbar.js
@@ -9,7 +9,7 @@ const navbar = `
//Search
function addnavbar() {
- document.body.innerHTML = navbar + document.body.innerHTML
+ document.body.innerHTML = navbar + document.body.innerHTML
}
-document.addEventListener("DOMContentLoaded", addnavbar)
+document.addEventListener('DOMContentLoaded', addnavbar)
diff --git a/js/changePW.js b/js/changePW.js
index 10e10de..f9de984 100644
--- a/js/changePW.js
+++ b/js/changePW.js
@@ -1,22 +1,31 @@
async function setUser() {
- let user = await (await fetch("/api/getuser")).json()
- //user["username"],user["error"]
- if(user["username"])document.getElementById("username").innerText = `Current User: ${user["username"]}`
- if(user["error"])document.getElementById("username").innerText = `Error: ${user["error"]}`
-
+ let user = await (await fetch('/api/getuser')).json()
+ //user["username"],user["error"]
+ if (user['username'])
+ document.getElementById('username').innerText =
+ `Current User: ${user['username']}`
+ if (user['error'])
+ document.getElementById('username').innerText =
+ `Error: ${user['error']}`
}
setUser()
-async function changePW(){
- if(window.confirm("Are you sure that you want to change your Password?")){
- let re = await (await post("/api/changePW",{"currentPW":document.getElementById("currentPW").value,"newPW":document.getElementById("newPW").value})).json()
- document.getElementById("response").innerText = re["error"] || re["success"]
- document.getElementById("response").style="color:green"
- if(re["error"]) {
- document.getElementById("response").style="color:red"
+async function changePW() {
+ if (window.confirm('Are you sure that you want to change your Password?')) {
+ let re = await (
+ await post('/api/changePW', {
+ currentPW: document.getElementById('currentPW').value,
+ newPW: document.getElementById('newPW').value,
+ })
+ ).json()
+ document.getElementById('response').innerText =
+ re['error'] || re['success']
+ document.getElementById('response').style = 'color:green'
+ if (re['error']) {
+ document.getElementById('response').style = 'color:red'
+ }
+ document.getElementById('currentPW').value = ''
+ document.getElementById('newPW').value = ''
}
- document.getElementById("currentPW").value = ""
- document.getElementById("newPW").value = ""
- }
}
diff --git a/js/changeUsername.js b/js/changeUsername.js
index 274e45b..72ca9c9 100644
--- a/js/changeUsername.js
+++ b/js/changeUsername.js
@@ -1,25 +1,36 @@
async function setUser() {
- let user = await (await fetch("/api/getuser")).json()
- //user["username"],user["error"]
- if(user["username"])document.getElementById("username").innerText = `Current User: ${user["username"]}`
- if(user["error"])document.getElementById("username").innerText = `Error: ${user["error"]}`
-
+ let user = await (await fetch('/api/getuser')).json()
+ //user["username"],user["error"]
+ if (user['username'])
+ document.getElementById('username').innerText =
+ `Current User: ${user['username']}`
+ if (user['error'])
+ document.getElementById('username').innerText =
+ `Error: ${user['error']}`
}
setUser()
-async function change(){
- if(window.confirm("Are you sure that you want to change your Username?")){
- let re = await (await post("/api/changeUsername",{"currentPW":document.getElementById("currentPW").value.toString(),"newUsername":document.getElementById("newUsername").value})).json()
- document.getElementById("response").innerText = re["error"] || re["success"]
- document.getElementById("response").style="color:green"
- if(re["error"]) {
- document.getElementById("response").style="color:red"
+async function change() {
+ if (window.confirm('Are you sure that you want to change your Username?')) {
+ let re = await (
+ await post('/api/changeUsername', {
+ currentPW: document
+ .getElementById('currentPW')
+ .value.toString(),
+ newUsername: document.getElementById('newUsername').value,
+ })
+ ).json()
+ document.getElementById('response').innerText =
+ re['error'] || re['success']
+ document.getElementById('response').style = 'color:green'
+ if (re['error']) {
+ document.getElementById('response').style = 'color:red'
+ }
+ document.getElementById('currentPW').value = ''
+ document.getElementById('newUsername').value = ''
+ setUser()
}
- document.getElementById("currentPW").value = ""
- document.getElementById("newUsername").value = ""
- setUser()
- }
}
-document.getElementById("submit").addEventListener("click",change)
+document.getElementById('submit').addEventListener('click', change)
diff --git a/js/dms.js b/js/dms.js
index 56b8bf5..a4d9068 100644
--- a/js/dms.js
+++ b/js/dms.js
@@ -1,8 +1,8 @@
let username
-const wss_server = "wss://ipost.rocks"
-const wss_port = "443"
-const wss_URI = wss_server + ":" + wss_port
+const wss_server = 'wss://ipost.rocks'
+const wss_port = '443'
+const wss_URI = wss_server + ':' + wss_port
var reply_id = 0
@@ -10,51 +10,51 @@ var highest_id
var currentChannel
-let socket = new WebSocket(wss_URI);
-socket.addEventListener("message", async function (_event) {
- console.info("TODO: add websocket support to dms")
- // return
- // if(wss_server === event.origin) {
- // let data = event.data;
- // let ds = JSON.parse(data)
- // let message = ds.message
- // let item = ds.data
- // let username = decodeURIComponent(item.post_user_name)
- // if(message === "new_post") {
- // await createPost(decodeURIComponent(item.post_user_name),decodeURIComponent(item.post_text),item.post_time,item.post_special_text,highest_id+1,item.post_from_bot,item.post_reply_id,true)
- // if(user["username"]!==username)mainNoti(username)
+let socket = new WebSocket(wss_URI)
+socket.addEventListener('message', async function (_event) {
+ console.info('TODO: add websocket support to dms')
+ // return
+ // if(wss_server === event.origin) {
+ // let data = event.data;
+ // let ds = JSON.parse(data)
+ // let message = ds.message
+ // let item = ds.data
+ // let username = decodeURIComponent(item.post_user_name)
+ // if(message === "new_post") {
+ // await createPost(decodeURIComponent(item.post_user_name),decodeURIComponent(item.post_text),item.post_time,item.post_special_text,highest_id+1,item.post_from_bot,item.post_reply_id,true)
+ // if(user["username"]!==username)mainNoti(username)
- // let highest_known_posts = await (await fetch(`/api/getPostsLowerThan?id=${highest_id+28}&channel=${currentChannel}`)).json()
- // for (let i = 0; i < highest_known_posts.length; i++) {
- // if(document.getElementById(highest_known_posts[i].post_id) === undefined) {
- // main()
- // return;
- // }
- // }
- // highest_id++;
- // }
- // }
+ // let highest_known_posts = await (await fetch(`/api/getPostsLowerThan?id=${highest_id+28}&channel=${currentChannel}`)).json()
+ // for (let i = 0; i < highest_known_posts.length; i++) {
+ // if(document.getElementById(highest_known_posts[i].post_id) === undefined) {
+ // main()
+ // return;
+ // }
+ // }
+ // highest_id++;
+ // }
+ // }
})
var cd = true //inversed "cooldown"
-let encryption_keys = ""
+let encryption_keys = ''
function set_keys(s_key) {
- let key = extend(s_key,512)
- let msgkey = key.substring(0,128)
- let sigkey = key.substring(129,512)
+ let key = extend(s_key, 512)
+ let msgkey = key.substring(0, 128)
+ let sigkey = key.substring(129, 512)
- let packed = pack_keys({
- signkey: sigkey,
- messagekey: msgkey
- })
+ let packed = pack_keys({
+ signkey: sigkey,
+ messagekey: msgkey,
+ })
- localStorage.setItem(currentChannel+"enc_key",packed)
-
- encryption_keys = packed
+ localStorage.setItem(currentChannel + 'enc_key', packed)
- main()
+ encryption_keys = packed
+
+ main()
}
let last_called_postMsg = Date.now()
@@ -63,424 +63,487 @@ let last_called_postMsg = Date.now()
previously called postMessage
*/
async function postMsg() {
- if((Date.now() - last_called_postMsg) < 100) {
- createModal("slow down there")
- debugger;
- return;
- }
- last_called_postMsg = Date.now()
- let len = document.getElementById("post-text").value.length
- if(len >= 1001) {
- alert(`Your message cant contain more than 1000 characters! (${len})`)
- return
- }
- if(cd && posting_id!==undefined) {
- cd = false
-
- let text = document.getElementById("post-text").value
-
- if(typeof encrypt === "function" && encryption_keys !== "") {
- text = encrypt(text,{
- packed: encryption_keys
- })
+ if (Date.now() - last_called_postMsg < 100) {
+ createModal('slow down there')
+ debugger
+ return
}
+ last_called_postMsg = Date.now()
+ let len = document.getElementById('post-text').value.length
+ if (len >= 1001) {
+ alert(`Your message cant contain more than 1000 characters! (${len})`)
+ return
+ }
+ if (cd && posting_id !== undefined) {
+ cd = false
- let r = await post("/api/dms/post",{"message":text,"reply_id":reply_id,"receiver":currentChannel,"pid": posting_id})
- update_pid()
- if(window.location.href.split("?mention=")[1])location.replace('/posts');
- document.getElementById("post-text").value=""
- unreply()
- setTimeout(function(){
- cd = true
- },200)
- } else {
- alert("Please wait a tiny bit before posting again")
- }
+ let text = document.getElementById('post-text').value
+
+ if (typeof encrypt === 'function' && encryption_keys !== '') {
+ text = encrypt(text, {
+ packed: encryption_keys,
+ })
+ }
+
+ let r = await post('/api/dms/post', {
+ message: text,
+ reply_id: reply_id,
+ receiver: currentChannel,
+ pid: posting_id,
+ })
+ update_pid()
+ if (window.location.href.split('?mention=')[1])
+ location.replace('/posts')
+ document.getElementById('post-text').value = ''
+ unreply()
+ setTimeout(function () {
+ cd = true
+ }, 200)
+ } else {
+ alert('Please wait a tiny bit before posting again')
+ }
}
async function update_pid() {
- let r = await (await fetch("/api/dms/pid")).json()
- console.log("new pid info: ",r)
- if(r.error) {
- //an error occurred
- if(r.error === "you cannot access the api without being logged in") {
- //account error, go to login page
- location.replace("/")
- return
+ let r = await (await fetch('/api/dms/pid')).json()
+ console.log('new pid info: ', r)
+ if (r.error) {
+ //an error occurred
+ if (r.error === 'you cannot access the api without being logged in') {
+ //account error, go to login page
+ location.replace('/')
+ return
+ }
+
+ //possibly more errors coming soon :tm: ?
+
+ return
}
-
- //possibly more errors coming soon :tm: ?
-
-
- return
- }
- posting_id = r.pid
- console.log("Updated pid",posting_id)
+ posting_id = r.pid
+ console.log('Updated pid', posting_id)
}
function spacerTextNode() {
- return document.createTextNode(" | ")
+ return document.createTextNode(' | ')
}
const user_cache = {}
async function getavatar(username) {
- let user = user_cache[username]
- if(user === undefined) {
- user = (await (await fetch("/api/getotheruser?user="+encodeURIComponent(username))).json())["avatar"]
- if(user) {
- user = "/avatars/"+user
+ let user = user_cache[username]
+ if (user === undefined) {
+ user = (
+ await (
+ await fetch(
+ '/api/getotheruser?user=' + encodeURIComponent(username)
+ )
+ ).json()
+ )['avatar']
+ if (user) {
+ user = '/avatars/' + user
+ } else {
+ user = '/images/default_avatar.png'
+ }
+ user_cache[username] = user
+ }
+ return user
+}
+
+async function reply_link_clicked(reply_channel, reply_id) {
+ console.log('clicked link')
+ if (reply_channel !== currentChannel) {
+ console.log('reply is in another channel')
+ switchChannel(reply_channel)
+ console.log('switched channel')
+ await main()
+ console.log('loaded new messages')
+ let replied_msg = document.getElementById(reply_id)
+ if (replied_msg) {
+ console.log('found element')
+ replied_msg.scrollIntoView()
+ }
} else {
- user = "/images/default_avatar.png"
+ let replied_msg = document.getElementById(reply_id)
+ if (replied_msg) {
+ console.log('found element')
+ replied_msg.scrollIntoView()
+ }
}
- user_cache[username]=user
- }
- return user
}
-async function reply_link_clicked(reply_channel,reply_id) {
- console.log("clicked link")
- if(reply_channel !== currentChannel) {
- console.log("reply is in another channel")
- switchChannel(reply_channel)
- console.log("switched channel")
- await main()
- console.log("loaded new messages")
- let replied_msg = document.getElementById(reply_id)
- if(replied_msg) {
- console.log("found element")
- replied_msg.scrollIntoView()
- }
- } else {
- let replied_msg = document.getElementById(reply_id)
- if(replied_msg) {
- console.log("found element")
- replied_msg.scrollIntoView()
- }
- }
-}
+async function createPost(
+ username,
+ text,
+ time,
+ specialtext,
+ postid,
+ isbot,
+ reply_id,
+ add_on_top
+) {
+ if (!specialtext) specialtext = ''
+ const newDiv = document.createElement('div')
+ const newP = document.createElement('p')
+ const newA = document.createElement('a')
+ const newSpan2 = document.createElement('span')
+ const newSpan3 = document.createElement('span')
+ const avatar = document.createElement('img')
+ const boticon = document.createElement('img')
-async function createPost(username,text,time,specialtext,postid,isbot,reply_id,add_on_top) {
- if(!specialtext)specialtext=""
- const newDiv = document.createElement("div");
- const newP = document.createElement("p");
- const newA = document.createElement("a");
- const newSpan2 = document.createElement("span");
- const newSpan3 = document.createElement("span");
- const avatar = document.createElement("img");
- const boticon = document.createElement("img");
+ const replyDiv = document.createElement('div')
+ const replyA = document.createElement('a')
+ const replyAvatar = document.createElement('img')
+ const replySpan = document.createElement('span')
+ const replyBr = document.createElement('br')
- const replyDiv = document.createElement("div");
- const replyA = document.createElement("a");
- const replyAvatar = document.createElement("img");
- const replySpan = document.createElement("span");
- const replyBr = document.createElement("br");
+ boticon.src = '/images/bot.png'
+ boticon.height = 25
+ boticon.width = 25
+ boticon.classList.add('boticon')
- boticon.src = "/images/bot.png"
- boticon.height = 25
- boticon.width = 25
- boticon.classList.add("boticon")
+ const newUsername = document.createTextNode(username)
+ let timedate = new Date(time)
+ time = timedate
+ time = time.toString()
+ time = time.split(' ')
+ time =
+ time[0] + ' ' + time[1] + ' ' + time[2] + ' ' + time[3] + ' ' + time[4]
+ if (
+ timedate ===
+ 'Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)'
+ )
+ time = 'unknown time'
+ const newTime = document.createTextNode(time)
+ const newSpecialText = document.createTextNode(specialtext)
+ newDiv.classList.add('post')
+ newSpan3.classList.add('specialtext')
- const newUsername = document.createTextNode(username);
- let timedate = new Date(time)
- time = timedate
- time = time.toString()
- time = time.split(" ")
- time = time[0] + " " + time[1] + " " + time[2] + " " + time[3] + " " + time[4]
- if(timedate==="Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)")time="unknown time"
- const newTime = document.createTextNode(time)
- const newSpecialText = document.createTextNode(specialtext)
- newDiv.classList.add("post");
- newSpan3.classList.add("specialtext")
+ avatar.width = 25
+ avatar.height = 25
+ avatar.classList.add('avatar')
+ avatar.src = await getavatar(username)
- avatar.width=25;
- avatar.height=25;
- avatar.classList.add("avatar")
+ newA.appendChild(avatar)
+ newA.appendChild(newUsername)
- avatar.src = await getavatar(username)
+ newA.href = `/users/${username}`
+ newSpan2.appendChild(newTime)
+ newSpan3.appendChild(newSpecialText)
- newA.appendChild(avatar)
- newA.appendChild(newUsername)
-
- newA.href = `/users/${username}`
- newSpan2.appendChild(newTime)
- newSpan3.appendChild(newSpecialText)
-
-
- newP.appendChild(newA)
- newP.appendChild(spacerTextNode())
- newP.appendChild(newSpan2)
- if(specialtext !== "")newP.appendChild(spacerTextNode())
- newP.appendChild(newSpan3)
- if(isbot===1){
+ newP.appendChild(newA)
newP.appendChild(spacerTextNode())
- newP.appendChild(boticon)
- }
- newP.appendChild(spacerTextNode())
- // |\>.|
- newP.innerHTML += `Reply to this Post `
-
- if(reply_id !== 0) {
- try {
- const reply_obj = await (await fetch(`/api/dms/getDM?id=${reply_id}`)).json()
- const reply_username = decodeURIComponent(reply_obj.dms_user_name)
- const reply_username_text = document.createTextNode(reply_username)
- let reply_text = decodeURIComponent(reply_obj.dms_text)
- const reply_channel = reply_obj.dms_receiver
- replyAvatar.width=10;
- replyAvatar.height=10;
- replyAvatar.classList.add("avatar")
- replyAvatar.src = await getavatar(reply_username)
-
- replyA.appendChild(replyAvatar)
- replyA.appendChild(reply_username_text)
- replyA.appendChild(spacerTextNode())
-
- if(typeof decrypt === "function" && encryption_keys !== "") {
- reply_text = decrypt(reply_text,{packed:encryption_keys}).msg
- }
-
- replyA.innerHTML += filterReply(reply_text.replace("\n"," ").substring(0,20))
- replyA.appendChild(replyBr)
-
- replyA.classList.add("no-link-style")
- // async function onclick(event) {
- // event.preventDefault()
-
- // }
- // replyDiv.onclick = function() {
- // reply_link_clicked(reply_channel, reply_id)
- // }
-
- replyDiv.appendChild(replyA)
-
- newDiv.appendChild(replyDiv)
-
- replyDiv.outerHTML = replyDiv.outerHTML.replace(/\>/im,` onclick="reply_link_clicked('${reply_channel}',${reply_id})" \>`)
- } catch (ignored) {
- console.log(ignored)
+ newP.appendChild(newSpan2)
+ if (specialtext !== '') newP.appendChild(spacerTextNode())
+ newP.appendChild(newSpan3)
+ if (isbot === 1) {
+ newP.appendChild(spacerTextNode())
+ newP.appendChild(boticon)
}
- }
+ newP.appendChild(spacerTextNode())
+ // |\>.|
+ newP.innerHTML += `Reply to this Post `
- if(typeof decrypt === "function" && encryption_keys !== "") {
- text = decrypt(text,{packed:encryption_keys}).msg
- }
- newDiv.appendChild(newP)
- newDiv.innerHTML += filterPost(text)
- newDiv.id = postid
- let posts_div = document.getElementById("posts")
- if(add_on_top) {
- posts_div.insertBefore(newDiv, posts_div.children[0]);
- } else {
- posts_div.appendChild(newDiv)
- }
+ if (reply_id !== 0) {
+ try {
+ const reply_obj = await (
+ await fetch(`/api/dms/getDM?id=${reply_id}`)
+ ).json()
+ const reply_username = decodeURIComponent(reply_obj.dms_user_name)
+ const reply_username_text = document.createTextNode(reply_username)
+ let reply_text = decodeURIComponent(reply_obj.dms_text)
+ const reply_channel = reply_obj.dms_receiver
+ replyAvatar.width = 10
+ replyAvatar.height = 10
+ replyAvatar.classList.add('avatar')
+ replyAvatar.src = await getavatar(reply_username)
+
+ replyA.appendChild(replyAvatar)
+ replyA.appendChild(reply_username_text)
+ replyA.appendChild(spacerTextNode())
+
+ if (typeof decrypt === 'function' && encryption_keys !== '') {
+ reply_text = decrypt(reply_text, {
+ packed: encryption_keys,
+ }).msg
+ }
+
+ replyA.innerHTML += filterReply(
+ reply_text.replace('\n', ' ').substring(0, 20)
+ )
+ replyA.appendChild(replyBr)
+
+ replyA.classList.add('no-link-style')
+ // async function onclick(event) {
+ // event.preventDefault()
+
+ // }
+ // replyDiv.onclick = function() {
+ // reply_link_clicked(reply_channel, reply_id)
+ // }
+
+ replyDiv.appendChild(replyA)
+
+ newDiv.appendChild(replyDiv)
+
+ replyDiv.outerHTML = replyDiv.outerHTML.replace(
+ /\>/im,
+ ` onclick="reply_link_clicked('${reply_channel}',${reply_id})" \>`
+ )
+ } catch (ignored) {
+ console.log(ignored)
+ }
+ }
+
+ if (typeof decrypt === 'function' && encryption_keys !== '') {
+ text = decrypt(text, { packed: encryption_keys }).msg
+ }
+ newDiv.appendChild(newP)
+ newDiv.innerHTML += filterPost(text)
+ newDiv.id = postid
+ let posts_div = document.getElementById('posts')
+ if (add_on_top) {
+ posts_div.insertBefore(newDiv, posts_div.children[0])
+ } else {
+ posts_div.appendChild(newDiv)
+ }
}
-async function main(){
- if(!user){
- user = await (await fetch("/api/getuser")).json()
+async function main() {
+ if (!user) {
+ user = await (await fetch('/api/getuser')).json()
+ username = user.username
+ if (!username) {
+ user = undefined
+ document.getElementById('noaccount').style = ''
+ document.getElementById('loading').style = 'display:none;'
+ console.log('no account')
+ return
+ }
+ }
username = user.username
- if(!username){
- user = undefined
- document.getElementById("noaccount").style=""
- document.getElementById("loading").style="display:none;"
- console.log("no account");
- return;
+ document.getElementById('username-self').innerText = username
+
+ let all_posts = await (
+ await fetch(`/api/getPersonalPosts?otherperson=${currentChannel}`)
+ ).json()
+ if (!all_posts) {
+ document.getElementById('loading').style = 'display:none;'
+ document.getElementById('scriptonly').style = ''
}
- }
- username = user.username
- document.getElementById("username-self").innerText = username
-
- let all_posts = await (await fetch(`/api/getPersonalPosts?otherperson=${currentChannel}`)).json()
- if(!all_posts){
- document.getElementById("loading").style="display:none;"
- document.getElementById("scriptonly").style = ""
- };
- document.getElementById("posts").innerHTML = ""
- if(all_posts.length <= 0) {
- document.getElementById("loading").style="display:none;"
- document.getElementById("scriptonly").style = ""
- //TODO: empty page
- return
- }
- highest_id = all_posts[0].post_id
- for(i in all_posts) {
- let item = all_posts[i]
- await createPost(decodeURIComponent(item.dms_user_name),decodeURIComponent(item.dms_text),item.dms_time,item.dms_special_text,item.dms_id,item.dms_from_bot,item.dms_reply_id,false)
- }
-
- let links = document.getElementsByClassName("insertedlink")
- for (let i = 0; i < links.length; i++) {
- links[i].innerText = links[i].innerText.split("\/\/")[1].split("\/")[0]
- }
-
- let mentions = document.getElementsByClassName("mention")
- for (let i = 0; i < mentions.length; i++) {
- if(mentions[i]!==undefined && mentions[i].innerText === "@"+username) {
- mentions[i].classList.add("user-mention");
- mentions[i].classList.remove("mention");
- i--;
+ document.getElementById('posts').innerHTML = ''
+ if (all_posts.length <= 0) {
+ document.getElementById('loading').style = 'display:none;'
+ document.getElementById('scriptonly').style = ''
+ //TODO: empty page
+ return
+ }
+ highest_id = all_posts[0].post_id
+ for (i in all_posts) {
+ let item = all_posts[i]
+ await createPost(
+ decodeURIComponent(item.dms_user_name),
+ decodeURIComponent(item.dms_text),
+ item.dms_time,
+ item.dms_special_text,
+ item.dms_id,
+ item.dms_from_bot,
+ item.dms_reply_id,
+ false
+ )
}
- }
- document.getElementById("loading").style="display:none;"
- document.getElementById("scriptonly").style = ""
+ let links = document.getElementsByClassName('insertedlink')
+ for (let i = 0; i < links.length; i++) {
+ links[i].innerText = links[i].innerText.split('\/\/')[1].split('\/')[0]
+ }
+
+ let mentions = document.getElementsByClassName('mention')
+ for (let i = 0; i < mentions.length; i++) {
+ if (
+ mentions[i] !== undefined &&
+ mentions[i].innerText === '@' + username
+ ) {
+ mentions[i].classList.add('user-mention')
+ mentions[i].classList.remove('mention')
+ i--
+ }
+ }
+
+ document.getElementById('loading').style = 'display:none;'
+ document.getElementById('scriptonly').style = ''
}
async function reply(postid) {
- let post = await(await fetch("/api/dms/getDM?id="+postid)).json()
- let username = post.dms_user_name
- let posttext = post.dms_text
- document.getElementById("reply").style = ""
- document.getElementById("reply_username").innerText = decodeURIComponent(username)
+ let post = await (await fetch('/api/dms/getDM?id=' + postid)).json()
+ let username = post.dms_user_name
+ let posttext = post.dms_text
+ document.getElementById('reply').style = ''
+ document.getElementById('reply_username').innerText =
+ decodeURIComponent(username)
- posttext = decodeURIComponent(posttext)
+ posttext = decodeURIComponent(posttext)
- if(typeof decrypt === "function" && encryption_keys !== "") {
- posttext = decrypt(posttext,{packed:encryption_keys}).msg
- }
+ if (typeof decrypt === 'function' && encryption_keys !== '') {
+ posttext = decrypt(posttext, { packed: encryption_keys }).msg
+ }
- document.getElementById("reply_text").innerHTML = filterPost(posttext)
- reply_id = postid
+ document.getElementById('reply_text').innerHTML = filterPost(posttext)
+ reply_id = postid
}
function unreply() {
- document.getElementById("reply").style = "display:none;"
- reply_id = 0
+ document.getElementById('reply').style = 'display:none;'
+ reply_id = 0
}
var cansendNoti = false
- function askNotiPerms() {
- return Notification.requestPermission()
+function askNotiPerms() {
+ return Notification.requestPermission()
}
async function firstAsk() {
- if(Notification.permission === 'denied' || Notification.permission === 'default') {
- await askNotiPerms()
- }
+ if (
+ Notification.permission === 'denied' ||
+ Notification.permission === 'default'
+ ) {
+ await askNotiPerms()
+ }
}
async function mainNoti(user) {
-
- if(Notification.permission === 'denied' || Notification.permission === 'default') {
- await askNotiPerms()
- } else {
- if(cansendNoti) {
- let notification = new Notification('IPost', { body: "new dm from " + user , tag: "new_post"});
- notification = await notification
- notification.addEventListener("click",function(){
- notification.close()
- })
- console.log(notification);
+ if (
+ Notification.permission === 'denied' ||
+ Notification.permission === 'default'
+ ) {
+ await askNotiPerms()
+ } else {
+ if (cansendNoti) {
+ let notification = new Notification('IPost', {
+ body: 'new dm from ' + user,
+ tag: 'new_post',
+ })
+ notification = await notification
+ notification.addEventListener('click', function () {
+ notification.close()
+ })
+ console.log(notification)
+ }
}
- }
}
-document.addEventListener("visibilitychange", function() {
- //cansendNoti = document.visibilityState !== 'visible'
- if (document.visibilityState === 'visible') {
- cansendNoti = false
- } else {
- cansendNoti = true
- }
-});
+document.addEventListener('visibilitychange', function () {
+ //cansendNoti = document.visibilityState !== 'visible'
+ if (document.visibilityState === 'visible') {
+ cansendNoti = false
+ } else {
+ cansendNoti = true
+ }
+})
function switchChannel(channelname) {
- sessionStorage.setItem("lastdm", channelname);
- currentChannel = channelname
+ sessionStorage.setItem('lastdm', channelname)
+ currentChannel = channelname
- if(localStorage.getItem(currentChannel+"enc_key")!==null) {
- encryption_keys = localStorage.getItem(currentChannel+"enc_key")
- } else {
- encryption_keys = ""
- }
+ if (localStorage.getItem(currentChannel + 'enc_key') !== null) {
+ encryption_keys = localStorage.getItem(currentChannel + 'enc_key')
+ } else {
+ encryption_keys = ''
+ }
- try {
- socket.send(JSON.stringify({"id":"switchChannel","data":channelname}))
- } catch(err) {
- console.error(err)
- }
+ try {
+ socket.send(JSON.stringify({ id: 'switchChannel', data: channelname }))
+ } catch (err) {
+ console.error(err)
+ }
}
function removeDuplicates(a) {
- let prims = {"boolean":{}, "number":{}, "string":{}}, objs = [];
+ let prims = { boolean: {}, number: {}, string: {} },
+ objs = []
- return a.filter(function(item) {
- let type = typeof item;
- if(type in prims)
- return Object.prototype.hasOwnProperty.call(prims[type], item) ? false : (prims[type][item] = true);
- else
- return objs.indexOf(item) >= 0 ? false : objs.push(item);
- });
+ return a.filter(function (item) {
+ let type = typeof item
+ if (type in prims)
+ return Object.prototype.hasOwnProperty.call(prims[type], item)
+ ? false
+ : (prims[type][item] = true)
+ else return objs.indexOf(item) >= 0 ? false : objs.push(item)
+ })
}
-function createChannel(channelname,tab) {
- channelname = decodeURIComponent(channelname)
- let channelp = document.createElement("p")
- channelp.classList.add("channel")
- channelp.id = channelname
- let textnode = document.createTextNode(channelname)
- channelp.appendChild(textnode)
- channelp.addEventListener("click", function(){
- switchChannel(channelname)
- main()
- unreply()
- })
- tab.appendChild(channelp)
+function createChannel(channelname, tab) {
+ channelname = decodeURIComponent(channelname)
+ let channelp = document.createElement('p')
+ channelp.classList.add('channel')
+ channelp.id = channelname
+ let textnode = document.createTextNode(channelname)
+ channelp.appendChild(textnode)
+ channelp.addEventListener('click', function () {
+ switchChannel(channelname)
+ main()
+ unreply()
+ })
+ tab.appendChild(channelp)
}
async function loadChannels() {
- //
+ //
- let dms = await (await fetch("/api/dms/conversations")).json()
+ let dms = await (await fetch('/api/dms/conversations')).json()
- let channels = []
+ let channels = []
- for(let dm of dms) {
- if(dm.dms_user_name === username) {
- channels[channels.length] = dm.dms_receiver
- } else {
- channels[channels.length] = dm.dms_user_name
- }
- }
+ for (let dm of dms) {
+ if (dm.dms_user_name === username) {
+ channels[channels.length] = dm.dms_receiver
+ } else {
+ channels[channels.length] = dm.dms_user_name
+ }
+ }
- channels = removeDuplicates(channels)
+ channels = removeDuplicates(channels)
- let tab = document.getElementById("channelTab")
- tab.innerHTML = ""
- for (let i = 0; i < channels.length; i++) {
- if(channels[i]==="")continue;
- createChannel(channels[i],tab)
- }
+ let tab = document.getElementById('channelTab')
+ tab.innerHTML = ''
+ for (let i = 0; i < channels.length; i++) {
+ if (channels[i] === '') continue
+ createChannel(channels[i], tab)
+ }
}
function init() {
+ switchChannel(sessionStorage.getItem('lastdm') || 'none')
- switchChannel(sessionStorage.getItem("lastdm") || "none")
-
- setInterval(update_pid,30000)
- update_pid()
- main()
- firstAsk()
- loadChannels()
+ setInterval(update_pid, 30000)
+ update_pid()
+ main()
+ firstAsk()
+ loadChannels()
}
async function clickPress(event) {
- if (event.key === "Enter") {
- user = (await (await fetch("/api/getotheruser?user="+encodeURIComponent(document.getElementById("Username_input").value))).json())
- if(user.username === undefined) {
- alert("invalid username entered")
- return
- } else {
- if(document.getElementById(user.username) === undefined) {
- let tab = document.getElementById("channelTab")
- createChannel(encodeURIComponent(user.username),tab)
- }
- document.getElementById(user.username).click()
- document.getElementById("Username_input").value = ""
- }
- }
+ if (event.key === 'Enter') {
+ user = await (
+ await fetch(
+ '/api/getotheruser?user=' +
+ encodeURIComponent(
+ document.getElementById('Username_input').value
+ )
+ )
+ ).json()
+ if (user.username === undefined) {
+ alert('invalid username entered')
+ return
+ } else {
+ if (document.getElementById(user.username) === undefined) {
+ let tab = document.getElementById('channelTab')
+ createChannel(encodeURIComponent(user.username), tab)
+ }
+ document.getElementById(user.username).click()
+ document.getElementById('Username_input').value = ''
+ }
+ }
}
init()
diff --git a/js/extend_key.js b/js/extend_key.js
index 3cdaf65..7434f59 100644
--- a/js/extend_key.js
+++ b/js/extend_key.js
@@ -1,18 +1,82 @@
// skipqc
-var sha256=function a(b){function c(a,b){return a>>>b|a<<32-b}for(var d,e,f=Math.pow,g=f(2,32),h="length",i="",j=[],k=8*b[h],l=a.h=a.h||[],m=a.k=a.k||[],n=m[h],o={},p=2;n<64;p++)if(!o[p]){for(d=0;d<313;d+=p)o[d]=p;l[n]=f(p,.5)*g|0,m[n++]=f(p,1/3)*g|0}for(b+="\x80";b[h]%64-56;)b+="\x00";for(d=0;d>8)return;j[d>>2]|=e<<(3-d)%4*8}for(j[j[h]]=k/g|0,j[j[h]]=k,e=0;e>>3)+q[d-7]+(c(t,17)^c(t,19)^t>>>10)|0),x=(c(u,2)^c(u,13)^c(u,22))+(u&l[1]^u&l[2]^l[1]&l[2]);l=[w+x|0].concat(l),l[4]=l[4]+w|0}for(d=0;d<8;d++)l[d]=l[d]+r[d]|0}for(d=0;d<8;d++)for(e=3;e+1;e--){var y=l[d]>>8*e&255;i+=(y<16?0:"")+y.toString(16)}return i};
-
-function hash(str,salt,num) {
- if(!num && num!==0)num=1;
- if(!str)return;
- if(!salt)salt=""
- let ret = str;
- for (let i = 0; i < num; i++) {
- ret = sha256(ret+salt)
+var sha256 = function a(b) {
+ function c(a, b) {
+ return (a >>> b) | (a << (32 - b))
}
- return ret;
+ for (
+ var d,
+ e,
+ f = Math.pow,
+ g = f(2, 32),
+ h = 'length',
+ i = '',
+ j = [],
+ k = 8 * b[h],
+ l = (a.h = a.h || []),
+ m = (a.k = a.k || []),
+ n = m[h],
+ o = {},
+ p = 2;
+ n < 64;
+ p++
+ )
+ if (!o[p]) {
+ for (d = 0; d < 313; d += p) o[d] = p
+ ;(l[n] = (f(p, 0.5) * g) | 0), (m[n++] = (f(p, 1 / 3) * g) | 0)
+ }
+ for (b += '\x80'; (b[h] % 64) - 56; ) b += '\x00'
+ for (d = 0; d < b[h]; d++) {
+ if (((e = b.charCodeAt(d)), e >> 8)) return
+ j[d >> 2] |= e << (((3 - d) % 4) * 8)
+ }
+ for (j[j[h]] = (k / g) | 0, j[j[h]] = k, e = 0; e < j[h]; ) {
+ var q = j.slice(e, (e += 16)),
+ r = l
+ for (l = l.slice(0, 8), d = 0; d < 64; d++) {
+ var s = q[d - 15],
+ t = q[d - 2],
+ u = l[0],
+ v = l[4],
+ w =
+ l[7] +
+ (c(v, 6) ^ c(v, 11) ^ c(v, 25)) +
+ ((v & l[5]) ^ (~v & l[6])) +
+ m[d] +
+ (q[d] =
+ d < 16
+ ? q[d]
+ : (q[d - 16] +
+ (c(s, 7) ^ c(s, 18) ^ (s >>> 3)) +
+ q[d - 7] +
+ (c(t, 17) ^ c(t, 19) ^ (t >>> 10))) |
+ 0),
+ x =
+ (c(u, 2) ^ c(u, 13) ^ c(u, 22)) +
+ ((u & l[1]) ^ (u & l[2]) ^ (l[1] & l[2]))
+ ;(l = [(w + x) | 0].concat(l)), (l[4] = (l[4] + w) | 0)
+ }
+ for (d = 0; d < 8; d++) l[d] = (l[d] + r[d]) | 0
+ }
+ for (d = 0; d < 8; d++)
+ for (e = 3; e + 1; e--) {
+ var y = (l[d] >> (8 * e)) & 255
+ i += (y < 16 ? 0 : '') + y.toString(16)
+ }
+ return i
}
-function extend(key,len) {
+function hash(str, salt, num) {
+ if (!num && num !== 0) num = 1
+ if (!str) return
+ if (!salt) salt = ''
+ let ret = str
+ for (let i = 0; i < num; i++) {
+ ret = sha256(ret + salt)
+ }
+ return ret
+}
+
+function extend(key, len) {
let temp = []
let out = []
@@ -20,18 +84,16 @@ function extend(key,len) {
let hashes = 0
- for(let i=0;i'"]/g;
+const es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/gi
+const ca = /[&<>'"]/g
const esca = {
-'&': '&',
-'<': '<',
-'>': '>',
-"'": ''',
-'"': '"'
-};
-const pe = m => esca[m];
-
-const escape = es => replace.call(es, ca, pe);
-const htmlesc = es => replace.call(es, ca, pe);
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ "'": ''',
+ '"': '"',
+}
+const pe = (m) => esca[m]
+const escape = (es) => replace.call(es, ca, pe)
+const htmlesc = (es) => replace.call(es, ca, pe)
const unes = {
-'&': '&',
-'&': '&',
-'<': '<',
-'<': '<',
-'>': '>',
-'>': '>',
-''': "'",
-''': "'",
-'"': '"',
-'"': '"'
-};
-const cape = m => unes[m];
+ '&': '&',
+ '&': '&',
+ '<': '<',
+ '<': '<',
+ '>': '>',
+ '>': '>',
+ ''': "'",
+ ''': "'",
+ '"': '"',
+ '"': '"',
+}
+const cape = (m) => unes[m]
-const unescape = un => replace.call(un, es, cape);
+const unescape = (un) => replace.call(un, es, cape)
function escape_special(str) {
- return str.replace(/\\/g,"\\\\").replace(/`/g,"\\`");
+ return str.replace(/\\/g, '\\\\').replace(/`/g, '\\`')
}
function unescape_special(str) {
- return str.replace(/\\\\/g,"\\").replace(/\\`/,"`");
+ return str.replace(/\\\\/g, '\\').replace(/\\`/, '`')
}
diff --git a/js/httppost.js b/js/httppost.js
index 714505f..fc6df07 100644
--- a/js/httppost.js
+++ b/js/httppost.js
@@ -1 +1,7 @@
-window.post = function(url, data) {return fetch(url, {method: "POST", headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data)});}
+window.post = function (url, data) {
+ return fetch(url, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data),
+ })
+}
diff --git a/js/index.js b/js/index.js
index ab09676..cb1f227 100644
--- a/js/index.js
+++ b/js/index.js
@@ -1,12 +1,12 @@
-window.addEventListener("load",async function(){
- let data = await(await fetch("/api/getuser")).json()
- if(data["username"] !== undefined) {
- document.getElementById("HasAccount").style=""
- } else {
- document.getElementById("NoAccount").style=""
- document.getElementById("hide_user").style="display:none;"
- document.getElementById("hide_posts").style="display:none;"
- document.getElementById("hide_dms").style="display:none;"
- //document.getElementById("hide_search").style="display:none;"
- }
+window.addEventListener('load', async function () {
+ let data = await (await fetch('/api/getuser')).json()
+ if (data['username'] !== undefined) {
+ document.getElementById('HasAccount').style = ''
+ } else {
+ document.getElementById('NoAccount').style = ''
+ document.getElementById('hide_user').style = 'display:none;'
+ document.getElementById('hide_posts').style = 'display:none;'
+ document.getElementById('hide_dms').style = 'display:none;'
+ //document.getElementById("hide_search").style="display:none;"
+ }
})
diff --git a/js/login.js b/js/login.js
index 3fd05a3..f1acae3 100644
--- a/js/login.js
+++ b/js/login.js
@@ -1,21 +1,21 @@
async function login() {
- let r = (await post("/login",{
- user: document.getElementById("user").value,
- pass: document.getElementById("pass").value,
- r: REDIRECT_URL
- }))
- if(!r.url.endsWith("/user") && !r.url.endsWith(REDIRECT_URL)) {
- document.getElementById("pass").value = ""
- console.error("login failed")
- alert("Login failed, please make sure you have the right password")
- return;
+ let r = await post('/login', {
+ user: document.getElementById('user').value,
+ pass: document.getElementById('pass').value,
+ r: REDIRECT_URL,
+ })
+ if (!r.url.endsWith('/user') && !r.url.endsWith(REDIRECT_URL)) {
+ document.getElementById('pass').value = ''
+ console.error('login failed')
+ alert('Login failed, please make sure you have the right password')
+ return
}
- window.location = REDIRECT_URL || "/user"
+ window.location = REDIRECT_URL || '/user'
}
-let passfield = document.getElementById("pass")
+let passfield = document.getElementById('pass')
function passkeydown(e) {
- if(e.code === "Enter") {
+ if (e.code === 'Enter') {
login()
}
-}
\ No newline at end of file
+}
diff --git a/js/markdown.js b/js/markdown.js
index 466c835..1c39490 100644
--- a/js/markdown.js
+++ b/js/markdown.js
@@ -1,45 +1,56 @@
-const urlregex = /(([a-z]+:\/\/)(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|app|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal|tk|rocks|ga|to))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi
+const urlregex =
+ /(([a-z]+:\/\/)(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|app|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal|tk|rocks|ga|to))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi
function urlify(text) {
- return text.replace(urlregex,'$1 ')
+ return text.replace(
+ urlregex,
+ '$1 '
+ )
}
const newlregex = /(\n)/gi
function newlineify(text) {
- return text.replace(newlregex,' ')
+ return text.replace(newlregex, ' ')
}
const crossregex = /~([^~]*)~/gi
function crossout(text) {
- return text.replace(crossregex,'$1 ')
+ return text.replace(crossregex, '$1 ')
}
const italicregex = /\*([^\*]*)\*/gi
function italicify(text) {
- return text.replace(italicregex,'$1 ')
+ return text.replace(italicregex, '$1 ')
}
const boldregex = /\*\*([^\*]*)\*\*/gi
function boldify(text) {
- return text.replace(boldregex,'$1 ')
+ return text.replace(boldregex, '$1 ')
}
const mentionregex = /@([^\s]*)/gi
function filterMentions(text) {
- return text.replace(mentionregex,`$1 `)
+ return text.replace(
+ mentionregex,
+ `$1 `
+ )
}
const emojiregex = /:([^:\s]*):/gi
function emojify(text) {
- return text.replace(emojiregex," ")
+ return text.replace(
+ emojiregex,
+ " "
+ )
}
-function unemojify(text){
- text = text.replace(/\u{1F5FF}/gu,":moyai:")
- text = text.replace(/\u{1F440}/gu,":eyes:")
- return text
+function unemojify(text) {
+ text = text.replace(/\u{1F5FF}/gu, ':moyai:')
+ text = text.replace(/\u{1F440}/gu, ':eyes:')
+ return text
}
-const allregex = /(```([^```]*)```)|(\n)|(~([^~]*)~)|(\*\*([^\*]*)\*\*)|(\*([^\*]*)\*)|(@[^\s]*)|(:([^:\s]*):)/gi
+const allregex =
+ /(```([^```]*)```)|(\n)|(~([^~]*)~)|(\*\*([^\*]*)\*\*)|(\*([^\*]*)\*)|(@[^\s]*)|(:([^:\s]*):)/gi
const cdblregex = /```([^```]*)```/gi
@@ -48,29 +59,28 @@ const cdblregex = /```([^```]*)```/gi
* @param {string} text text to filter/format
* @return {string} html that represents the filtered text
*/
-function filterPost(text){
- text = unemojify(text)
- let result = htmlesc(text).replace(allregex, function (match) {
- let out = match
- if(cdblregex.test(match)) {
- let paddlen = 3
- out = out.substring(paddlen,out.length-paddlen).trim()+"\n"
- out = newlineify(out)
- return `${out}
`
- }
- out = newlineify(out)
- out = urlify(out)
- out = emojify(out)
- out = filterMentions(out)
- out = crossout(out)
- out = boldify(out)
- out = italicify(out)
+function filterPost(text) {
+ text = unemojify(text)
+ let result = htmlesc(text).replace(allregex, function (match) {
+ let out = match
+ if (cdblregex.test(match)) {
+ let paddlen = 3
+ out = out.substring(paddlen, out.length - paddlen).trim() + '\n'
+ out = newlineify(out)
+ return `${out}
`
+ }
+ out = newlineify(out)
+ out = urlify(out)
+ out = emojify(out)
+ out = filterMentions(out)
+ out = crossout(out)
+ out = boldify(out)
+ out = italicify(out)
- return out
-
- });
+ return out
+ })
- return result
+ return result
}
/**
@@ -79,12 +89,12 @@ function filterPost(text){
* @return {string} html that represents the filtered text
*/
function filterReply(text) {
- text = htmlesc(text)
- text = newlineify(text)
- text = urlify(text)
- text = crossout(text)
- text = boldify(text)
- text = italicify(text)
+ text = htmlesc(text)
+ text = newlineify(text)
+ text = urlify(text)
+ text = crossout(text)
+ text = boldify(text)
+ text = italicify(text)
- return text
+ return text
}
diff --git a/js/modal.js b/js/modal.js
index 35e46b9..315aead 100644
--- a/js/modal.js
+++ b/js/modal.js
@@ -1,28 +1,28 @@
-function createModal(text,renderAsHTML=false) {
- if(!document.getElementById("modal")) {
- const shade = document.createElement("div")
- shade.id = "modal-shade"
- const m = document.createElement("div")
- m.id = "modal"
- const close = document.createElement("button")
- close.id = "modal-close-button"
- close.innerText = "Close"
- close.onclick = function() {
- m.style.display = shade.style.display = 'none';
+function createModal(text, renderAsHTML = false) {
+ if (!document.getElementById('modal')) {
+ const shade = document.createElement('div')
+ shade.id = 'modal-shade'
+ const m = document.createElement('div')
+ m.id = 'modal'
+ const close = document.createElement('button')
+ close.id = 'modal-close-button'
+ close.innerText = 'Close'
+ close.onclick = function () {
+ m.style.display = shade.style.display = 'none'
}
- const textdiv = document.createElement("div")
- textdiv.id = "modal-text-div"
+ const textdiv = document.createElement('div')
+ textdiv.id = 'modal-text-div'
m.appendChild(textdiv)
m.appendChild(close)
- document.body.insertBefore(m,document.body.children[0])
- document.body.insertBefore(shade,document.body.children[0])
+ document.body.insertBefore(m, document.body.children[0])
+ document.body.insertBefore(shade, document.body.children[0])
}
- const currentModal = document.getElementById("modal")
- const shade = document.getElementById("modal-shade")
- if(renderAsHTML) {
- document.getElementById("modal-text-div").innerHTML = text
+ const currentModal = document.getElementById('modal')
+ const shade = document.getElementById('modal-shade')
+ if (renderAsHTML) {
+ document.getElementById('modal-text-div').innerHTML = text
} else {
- document.getElementById("modal-text-div").innerText = text
+ document.getElementById('modal-text-div').innerText = text
}
- currentModal.style.display = shade.style.display = "block"
-}
\ No newline at end of file
+ currentModal.style.display = shade.style.display = 'block'
+}
diff --git a/js/posts.js b/js/posts.js
index b704b50..3d246a2 100644
--- a/js/posts.js
+++ b/js/posts.js
@@ -1,62 +1,74 @@
-let username,reply_id=0,highest_id,currentChannel = sessionStorage.getItem("lastchannel") || "everyone"
+let username,
+ reply_id = 0,
+ highest_id,
+ currentChannel = sessionStorage.getItem('lastchannel') || 'everyone'
-const
-wss_server = "wss://ipost.rocks",
-wss_port = "443",
-wss_URI = wss_server + ":" + wss_port,
-decURIComp = decodeURIComponent
+const wss_server = 'wss://ipost.rocks',
+ wss_port = '443',
+ wss_URI = wss_server + ':' + wss_port,
+ decURIComp = decodeURIComponent
-function createElement(s){return document.createElement(s)}
-function getById(i){return document.getElementById(i)}
+function createElement(s) {
+ return document.createElement(s)
+}
+function getById(i) {
+ return document.getElementById(i)
+}
+let socket = new WebSocket(wss_URI)
+socket.addEventListener('message', async function (event) {
+ console.log('new websocket message arrived')
+ if (wss_server === event.origin) {
+ let data = event.data
+ let ds = JSON.parse(data)
+ let message = ds.message
+ let item = ds.data
+ let username = decURIComp(item.post_user_name)
+ if (
+ message === 'new_post' &&
+ decURIComp(item.post_receiver_name) === currentChannel
+ ) {
+ await createPost(
+ username,
+ decURIComp(item.post_text),
+ item.post_time,
+ item.post_special_text,
+ item.post_id || highest_id + 1,
+ item.post_from_bot,
+ item.post_reply_id,
+ true,
+ item.user_avatar,
+ item.files[0],
+ item.files[1],
+ item.files[2],
+ item.files[3],
+ item.files[4]
+ )
+ console.log('created new post')
+ if (user['username'] !== username) mainNoti(username)
-let socket = new WebSocket(wss_URI);
-socket.addEventListener("message", async function (event) {
- console.log("new websocket message arrived");
- if(wss_server === event.origin) {
- let data = event.data;
- let ds = JSON.parse(data)
- let message = ds.message
- let item = ds.data
- let username = decURIComp(item.post_user_name)
- if(message === "new_post" && decURIComp(item.post_receiver_name) === currentChannel) {
- await createPost(
- username,
- decURIComp(item.post_text),
- item.post_time,
- item.post_special_text,
- item.post_id || (highest_id+1),
- item.post_from_bot,
- item.post_reply_id,
- true,
- item.user_avatar,
- item.files[0],
- item.files[1],
- item.files[2],
- item.files[3],
- item.files[4]
- )
- console.log("created new post");
- if(user["username"] !== username)mainNoti(username)
-
- let highest_known_posts = await (await fetch(`/api/getPostsLowerThan?id=${highest_id+28}&channel=${currentChannel}`)).json()
- for (let i = 0; i < highest_known_posts.length; i++) {
- if(getById(highest_known_posts[i].post_id) === undefined) {
- main()
- return;
+ let highest_known_posts = await (
+ await fetch(
+ `/api/getPostsLowerThan?id=${highest_id + 28}&channel=${currentChannel}`
+ )
+ ).json()
+ for (let i = 0; i < highest_known_posts.length; i++) {
+ if (getById(highest_known_posts[i].post_id) === undefined) {
+ main()
+ return
+ }
+ }
+ highest_id++
+ } else {
+ console.warn('unknown message')
}
- }
- highest_id++;
} else {
- console.warn("unknown message")
+ console.warn('unknown ws origin')
}
- } else {
- console.warn("unknown ws origin")
- }
})
-socket.addEventListener("open",()=> {
- switchChannel(currentChannel)
+socket.addEventListener('open', () => {
+ switchChannel(currentChannel)
})
var cd = true //inversed "cooldown"
@@ -67,504 +79,551 @@ let last_called_postMsg = Date.now()
Tell the api to create a new post with the given information
previously called "postMessage"
*/
- function postMsg() {
- if((Date.now() - last_called_postMsg) < 100) {
- createModal("slow down there")
- debugger;
- return;
- }
- last_called_postMsg = Date.now()
- let msg = getById("post-text").value
- let len = msg.length
- if(len===0){
- alert("you have to enter a message!")
- return;
- };
- if(len > 1000) {
- alert(`Your message cant contain more than 1000 characters! (${len})`)
- return
- }
- if(encodeURIComponent(msg).length > 3000) {
- alert("Your message is too long! (Too many special characters)")
- return
- }
- if(cd && posting_id !== undefined) {
- cd = false
- setTimeout(function(){
- cd = true
- },400)
- let formdata = new FormData()
-
- formdata.append("message",msg)
- formdata.append("reply_id",reply_id)
- formdata.append("receiver",currentChannel)
- formdata.append("pid",posting_id)
- for(let i in files) {
- formdata.append("file_"+i,files[i])
+function postMsg() {
+ if (Date.now() - last_called_postMsg < 100) {
+ createModal('slow down there')
+ debugger
+ return
}
- files = []
- getById("filesDiv").innerHTML=""
+ last_called_postMsg = Date.now()
+ let msg = getById('post-text').value
+ let len = msg.length
+ if (len === 0) {
+ alert('you have to enter a message!')
+ return
+ }
+ if (len > 1000) {
+ alert(`Your message cant contain more than 1000 characters! (${len})`)
+ return
+ }
+ if (encodeURIComponent(msg).length > 3000) {
+ alert('Your message is too long! (Too many special characters)')
+ return
+ }
+ if (cd && posting_id !== undefined) {
+ cd = false
+ setTimeout(function () {
+ cd = true
+ }, 400)
+ let formdata = new FormData()
- fetch("/api/post", {
- method: "POST", body: formdata
- });
- posting_id = undefined
- update_pid()
- getById("post-text").value=""
- unreply()
- } else {
- alert("Please wait a tiny bit before posting again")
- }
+ formdata.append('message', msg)
+ formdata.append('reply_id', reply_id)
+ formdata.append('receiver', currentChannel)
+ formdata.append('pid', posting_id)
+ for (let i in files) {
+ formdata.append('file_' + i, files[i])
+ }
+ files = []
+ getById('filesDiv').innerHTML = ''
+
+ fetch('/api/post', {
+ method: 'POST',
+ body: formdata,
+ })
+ posting_id = undefined
+ update_pid()
+ getById('post-text').value = ''
+ unreply()
+ } else {
+ alert('Please wait a tiny bit before posting again')
+ }
}
async function update_pid() {
- let r = await (await fetch("/api/pid")).json()
- console.log("new pid info: ",r)
- if(r.error) {
- //an error occurred
- if(r.error === "you cannot access the api without being logged in") {
- //account error, go to login page
- location.replace("/")
- return
+ let r = await (await fetch('/api/pid')).json()
+ console.log('new pid info: ', r)
+ if (r.error) {
+ //an error occurred
+ if (r.error === 'you cannot access the api without being logged in') {
+ //account error, go to login page
+ location.replace('/')
+ return
+ }
+ throw new Error(r.error)
}
- throw new Error(r.error)
- }
- posting_id = r.pid
- console.log("Updated pid",posting_id)
+ posting_id = r.pid
+ console.log('Updated pid', posting_id)
}
function spacerTextNode() {
- return document.createTextNode(" | ")
+ return document.createTextNode(' | ')
}
-async function reply_link_clicked(reply_channel,reply_id) {
- console.log("clicked link")
- if(reply_channel !== currentChannel) {
- console.log("reply is in another channel")
- switchChannel(reply_channel)
- console.log("switched channel")
- await main()
- console.log("loaded new messages")
- let replied_msg = getById(reply_id)
- if(replied_msg) {
- console.log("found element")
- replied_msg.scrollIntoView()
+async function reply_link_clicked(reply_channel, reply_id) {
+ console.log('clicked link')
+ if (reply_channel !== currentChannel) {
+ console.log('reply is in another channel')
+ switchChannel(reply_channel)
+ console.log('switched channel')
+ await main()
+ console.log('loaded new messages')
+ let replied_msg = getById(reply_id)
+ if (replied_msg) {
+ console.log('found element')
+ replied_msg.scrollIntoView()
+ }
+ } else {
+ let replied_msg = getById(reply_id)
+ if (replied_msg) {
+ console.log('found element')
+ replied_msg.scrollIntoView()
+ }
}
- } else {
- let replied_msg = getById(reply_id)
- if(replied_msg) {
- console.log("found element")
- replied_msg.scrollIntoView()
- }
- }
}
const image_types = {
- "png":true,
- "jpg":true,
- "jpeg":true,
- "webp":true,
- "jfif":true
+ png: true,
+ jpg: true,
+ jpeg: true,
+ webp: true,
+ jfif: true,
}
function iconLink(name) {
- if(!name){
- //if(typeof name === 'undefined' || typeof name === "null"){
- return undefined;
- }
- console.log(name,name.lastIndexOf("\."),name.substring(name.lastIndexOf("\.")+1));
- let extension = name.substring(name.lastIndexOf("\.")+1)
- if(extension in image_types) {
- return "/user_uploads/previews/"+name;
- }
- return "/api/getFileIcon/"+extension
+ if (!name) {
+ //if(typeof name === 'undefined' || typeof name === "null"){
+ return undefined
+ }
+ console.log(
+ name,
+ name.lastIndexOf('\.'),
+ name.substring(name.lastIndexOf('\.') + 1)
+ )
+ let extension = name.substring(name.lastIndexOf('\.') + 1)
+ if (extension in image_types) {
+ return '/user_uploads/previews/' + name
+ }
+ return '/api/getFileIcon/' + extension
}
-async function createPost(username,text,time,specialtext,postid,isbot,reply_id,add_on_top,avatar_src,file0,file1,file2,file3,file4) {
- if(!specialtext)specialtext=""
- const newDiv = createElement("div");
- const newP = createElement("p");
- const newA = createElement("a");
- const newSpan2 = createElement("span");
- const newSpan3 = createElement("span");
- const avatar = createElement("img");
- const boticon = createElement("img");
+async function createPost(
+ username,
+ text,
+ time,
+ specialtext,
+ postid,
+ isbot,
+ reply_id,
+ add_on_top,
+ avatar_src,
+ file0,
+ file1,
+ file2,
+ file3,
+ file4
+) {
+ if (!specialtext) specialtext = ''
+ const newDiv = createElement('div')
+ const newP = createElement('p')
+ const newA = createElement('a')
+ const newSpan2 = createElement('span')
+ const newSpan3 = createElement('span')
+ const avatar = createElement('img')
+ const boticon = createElement('img')
- const replyDiv = createElement("div");
- const replyA = createElement("a");
- const replyAvatar = createElement("img");
- const replySpan = createElement("span");
- const replyBr = createElement("br");
+ const replyDiv = createElement('div')
+ const replyA = createElement('a')
+ const replyAvatar = createElement('img')
+ const replySpan = createElement('span')
+ const replyBr = createElement('br')
- boticon.src = "/images/bot.png"
- boticon.height = 25
- boticon.width = 25
- boticon.classList.add("boticon")
+ boticon.src = '/images/bot.png'
+ boticon.height = 25
+ boticon.width = 25
+ boticon.classList.add('boticon')
- const newUsername = document.createTextNode(username);
+ const newUsername = document.createTextNode(username)
- const newTime = document.createTextNode(new Date(time).toLocaleTimeString())
- const newSpecialText = document.createTextNode(specialtext)
- newDiv.classList.add("post");
- newSpan3.classList.add("specialtext")
+ const newTime = document.createTextNode(new Date(time).toLocaleTimeString())
+ const newSpecialText = document.createTextNode(specialtext)
+ newDiv.classList.add('post')
+ newSpan3.classList.add('specialtext')
-
- avatar.width=25;
- avatar.height=25;
- avatar.alt = "user avatar"
- avatar.classList.add("avatar")
- if(avatar_src)avatar.src = "/avatars/"+avatar_src
- else {
- avatar.src = "/images/default_avatar.png"
- }
-
- newA.appendChild(avatar)
- newA.appendChild(newUsername)
-
- newA.href = `/users/${username}`
- newSpan2.appendChild(newTime)
- newSpan3.appendChild(newSpecialText)
-
-
- newP.appendChild(newA)
- newP.appendChild(spacerTextNode())
- newP.appendChild(newSpan2)
- if(specialtext !== "")newP.appendChild(spacerTextNode())
- newP.appendChild(newSpan3)
- if(isbot === 1){
- newP.appendChild(spacerTextNode())
- newP.appendChild(boticon)
- }
- newP.appendChild(spacerTextNode())
- // |\>.|
- newP.innerHTML += `Reply to this Post `
-
- if(reply_id !== 0) {
- try {
- const reply_obj = await (await fetch(`/api/getPost?id=${reply_id}`)).json()
- const reply_username = decURIComp(reply_obj.post_user_name)
- const reply_username_text = document.createTextNode(reply_username)
- const reply_text = decURIComp(reply_obj.post_text)
- const reply_channel = reply_obj.post_receiver_name
- replyAvatar.width=10;
- replyAvatar.height=10;
- replyAvatar.classList.add("avatar")
-
- if(reply_obj.User_Avatar)replyAvatar.src = "/avatars/"+reply_obj.User_Avatar
- else {
- replyAvatar.src = "/images/default_avatar.png"
- }
-
- replyA.appendChild(replyAvatar)
- replyA.appendChild(reply_username_text)
- replyA.appendChild(spacerTextNode())
- replyA.innerHTML += filterReply(reply_text.replace("\n"," ").substring(0,20))
- replyA.appendChild(replyBr)
-
- replyA.classList.add("no-link-style")
-
- replyDiv.appendChild(replyA)
-
- newDiv.appendChild(replyDiv)
-
- replyDiv.outerHTML = replyDiv.outerHTML.replace(/\>/im,` onclick="reply_link_clicked('${reply_channel}',${reply_id})" \>`)
- } catch (ignored) {
- console.log(ignored)
+ avatar.width = 25
+ avatar.height = 25
+ avatar.alt = 'user avatar'
+ avatar.classList.add('avatar')
+ if (avatar_src) avatar.src = '/avatars/' + avatar_src
+ else {
+ avatar.src = '/images/default_avatar.png'
}
- }
- newDiv.appendChild(newP)
- newDiv.innerHTML += filterPost(text)
- newDiv.id = postid
+ newA.appendChild(avatar)
+ newA.appendChild(newUsername)
- /*
+ newA.href = `/users/${username}`
+ newSpan2.appendChild(newTime)
+ newSpan3.appendChild(newSpecialText)
+
+ newP.appendChild(newA)
+ newP.appendChild(spacerTextNode())
+ newP.appendChild(newSpan2)
+ if (specialtext !== '') newP.appendChild(spacerTextNode())
+ newP.appendChild(newSpan3)
+ if (isbot === 1) {
+ newP.appendChild(spacerTextNode())
+ newP.appendChild(boticon)
+ }
+ newP.appendChild(spacerTextNode())
+ // |\>.|
+ newP.innerHTML += `Reply to this Post `
+
+ if (reply_id !== 0) {
+ try {
+ const reply_obj = await (
+ await fetch(`/api/getPost?id=${reply_id}`)
+ ).json()
+ const reply_username = decURIComp(reply_obj.post_user_name)
+ const reply_username_text = document.createTextNode(reply_username)
+ const reply_text = decURIComp(reply_obj.post_text)
+ const reply_channel = reply_obj.post_receiver_name
+ replyAvatar.width = 10
+ replyAvatar.height = 10
+ replyAvatar.classList.add('avatar')
+
+ if (reply_obj.User_Avatar)
+ replyAvatar.src = '/avatars/' + reply_obj.User_Avatar
+ else {
+ replyAvatar.src = '/images/default_avatar.png'
+ }
+
+ replyA.appendChild(replyAvatar)
+ replyA.appendChild(reply_username_text)
+ replyA.appendChild(spacerTextNode())
+ replyA.innerHTML += filterReply(
+ reply_text.replace('\n', ' ').substring(0, 20)
+ )
+ replyA.appendChild(replyBr)
+
+ replyA.classList.add('no-link-style')
+
+ replyDiv.appendChild(replyA)
+
+ newDiv.appendChild(replyDiv)
+
+ replyDiv.outerHTML = replyDiv.outerHTML.replace(
+ /\>/im,
+ ` onclick="reply_link_clicked('${reply_channel}',${reply_id})" \>`
+ )
+ } catch (ignored) {
+ console.log(ignored)
+ }
+ }
+
+ newDiv.appendChild(newP)
+ newDiv.innerHTML += filterPost(text)
+ newDiv.id = postid
+
+ /*
FILES
*/
- const filesP = createElement("p")
- const file0_img = createElement("img")
- const file1_img = createElement("img")
- const file2_img = createElement("img")
- const file3_img = createElement("img")
- const file4_img = createElement("img")
-
- file0_img.src = iconLink(file0)
- file1_img.src = iconLink(file1)
- file2_img.src = iconLink(file2)
- file3_img.src = iconLink(file3)
- file4_img.src = iconLink(file4)
+ const filesP = createElement('p')
+ const file0_img = createElement('img')
+ const file1_img = createElement('img')
+ const file2_img = createElement('img')
+ const file3_img = createElement('img')
+ const file4_img = createElement('img')
- file0_img.width = 50
- file1_img.width = 50
- file2_img.width = 50
- file3_img.width = 50
- file4_img.width = 50
+ file0_img.src = iconLink(file0)
+ file1_img.src = iconLink(file1)
+ file2_img.src = iconLink(file2)
+ file3_img.src = iconLink(file3)
+ file4_img.src = iconLink(file4)
- file0_img.alt = "user uploaded file"
- file1_img.alt = "user uploaded file"
- file2_img.alt = "user uploaded file"
- file3_img.alt = "user uploaded file"
- file4_img.alt = "user uploaded file"
+ file0_img.width = 50
+ file1_img.width = 50
+ file2_img.width = 50
+ file3_img.width = 50
+ file4_img.width = 50
- if(file0){
- filesP.appendChild(file0_img)
+ file0_img.alt = 'user uploaded file'
+ file1_img.alt = 'user uploaded file'
+ file2_img.alt = 'user uploaded file'
+ file3_img.alt = 'user uploaded file'
+ file4_img.alt = 'user uploaded file'
- file0_img.onclick = function(event) {
- console.warn("TODO: Create Modal");
+ if (file0) {
+ filesP.appendChild(file0_img)
+
+ file0_img.onclick = function (event) {
+ console.warn('TODO: Create Modal')
+ }
}
- }
- if(file1){
- filesP.appendChild(file1_img)
+ if (file1) {
+ filesP.appendChild(file1_img)
- file1_img.onclick = function(event) {
- console.warn("TODO: Create Modal");
+ file1_img.onclick = function (event) {
+ console.warn('TODO: Create Modal')
+ }
}
- }
- if(file2){
- filesP.appendChild(file2_img)
+ if (file2) {
+ filesP.appendChild(file2_img)
- file2_img.onclick = function(event) {
- console.warn("TODO: Create Modal");
+ file2_img.onclick = function (event) {
+ console.warn('TODO: Create Modal')
+ }
}
- }
- if(file3){
- filesP.appendChild(file3_img)
+ if (file3) {
+ filesP.appendChild(file3_img)
- file3_img.onclick = function(event) {
- console.warn("TODO: Create Modal");
+ file3_img.onclick = function (event) {
+ console.warn('TODO: Create Modal')
+ }
}
- }
- if(file4){
- filesP.appendChild(file4_img)
+ if (file4) {
+ filesP.appendChild(file4_img)
- file4_img.onclick = function(event) {
- console.warn("TODO: Create Modal");
+ file4_img.onclick = function (event) {
+ console.warn('TODO: Create Modal')
+ }
}
- }
- newDiv.appendChild(filesP)
+ newDiv.appendChild(filesP)
- /*
+ /*
Adding the post to the posts list
*/
- let posts_div = getById("posts")
- if(add_on_top) {
- posts_div.insertBefore(newDiv, posts_div.children[0]);
- } else {
- posts_div.appendChild(newDiv)
- }
+ let posts_div = getById('posts')
+ if (add_on_top) {
+ posts_div.insertBefore(newDiv, posts_div.children[0])
+ } else {
+ posts_div.appendChild(newDiv)
+ }
}
-async function main(){
- if(!user){
- user = await (await fetch("/api/getuser")).json()
+async function main() {
+ if (!user) {
+ user = await (await fetch('/api/getuser')).json()
+ username = user.username
+ if (!username) {
+ user = undefined
+ getById('noaccount').style = ''
+ getById('loading').style = 'display:none;'
+ console.log('no account')
+ return
+ }
+ }
username = user.username
- if(!username){
- user = undefined
- getById("noaccount").style=""
- getById("loading").style="display:none;"
- console.log("no account");
- return;
+ getById('username-self').innerText = username
+
+ let all_posts = await (
+ await fetch(`/api/getPosts?channel=${currentChannel}`)
+ ).json()
+ if (!all_posts) return
+ getById('posts').innerHTML = ''
+
+ getById('loading').style = 'display:none;'
+ getById('scriptonly').style = ''
+
+ highest_id = all_posts[0].post_id
+ let post_promises = []
+ for (i in all_posts) {
+ let item = all_posts[i]
+ let created = createPost(
+ decURIComp(item.post_user_name),
+ decURIComp(item.post_text),
+ item.post_time,
+ item.post_special_text,
+ item.post_id,
+ item.post_from_bot,
+ item.post_reply_id,
+ false,
+ item.User_Avatar,
+ item.file_0,
+ item.file_1,
+ item.file_2,
+ item.file_3,
+ item.file_4
+ )
+ post_promises.push(created)
}
- }
- username = user.username
- getById("username-self").innerText = username
- let all_posts = await (await fetch(`/api/getPosts?channel=${currentChannel}`)).json()
- if(!all_posts)return;
- getById("posts").innerHTML = ""
+ await Promise.all(post_promises)
- getById("loading").style="display:none;"
- getById("scriptonly").style = ""
+ Array.from(getById('posts').childNodes)
+ .sort((a, b) => {
+ if (Number(a.id) > Number(b.id)) return -1
+ if (Number(a.id) < Number(b.id)) return 1
+ return 0
+ })
+ .forEach((e) => {
+ getById('posts').appendChild(e)
+ })
- highest_id = all_posts[0].post_id
- let post_promises = []
- for(i in all_posts) {
- let item = all_posts[i]
- let created = createPost(
- decURIComp(item.post_user_name),
- decURIComp(item.post_text),
- item.post_time,
- item.post_special_text,
- item.post_id,
- item.post_from_bot,
- item.post_reply_id,
- false,
- item.User_Avatar,
- item.file_0,
- item.file_1,
- item.file_2,
- item.file_3,
- item.file_4
- )
- post_promises.push(created)
- }
-
- await Promise.all(post_promises)
-
- Array.from(getById("posts").childNodes).sort((a,b) => {
- if(Number(a.id) > Number(b.id))return -1;
- if(Number(a.id) < Number(b.id))return 1;
- return 0
- }).forEach(e => {
- getById("posts").appendChild(e)
- })
-
- let links = document.getElementsByClassName("insertedlink")
- for (let i = 0; i < links.length; i++) {
- links[i].innerText = links[i].innerText.split("\/\/")[1].split("\/")[0]
- }
-
- let mentions = document.getElementsByClassName("mention")
- for (let i = 0; i < mentions.length; i++) {
- if(mentions[i] !== undefined && mentions[i].innerText === "@"+username) {
- mentions[i].classList.add("user-mention");
- mentions[i].classList.remove("mention");
- i--;
+ let links = document.getElementsByClassName('insertedlink')
+ for (let i = 0; i < links.length; i++) {
+ links[i].innerText = links[i].innerText.split('\/\/')[1].split('\/')[0]
}
- }
-
+ let mentions = document.getElementsByClassName('mention')
+ for (let i = 0; i < mentions.length; i++) {
+ if (
+ mentions[i] !== undefined &&
+ mentions[i].innerText === '@' + username
+ ) {
+ mentions[i].classList.add('user-mention')
+ mentions[i].classList.remove('mention')
+ i--
+ }
+ }
}
async function reply(postid) {
- let post = await(await fetch("/api/getPost?id="+postid)).json()
- let username = post.post_user_name
- let posttext = post.post_text
- getById("reply").style = ""
- getById("reply_username").innerText = decURIComp(username)
- getById("reply_text").innerHTML = filterPost(decURIComp(posttext))
- reply_id = postid
+ let post = await (await fetch('/api/getPost?id=' + postid)).json()
+ let username = post.post_user_name
+ let posttext = post.post_text
+ getById('reply').style = ''
+ getById('reply_username').innerText = decURIComp(username)
+ getById('reply_text').innerHTML = filterPost(decURIComp(posttext))
+ reply_id = postid
}
function unreply() {
- getById("reply").style = "display:none;"
- reply_id = 0
+ getById('reply').style = 'display:none;'
+ reply_id = 0
}
var cansendNoti = false
- function askNotiPerms() {
- return Notification.requestPermission()
+function askNotiPerms() {
+ return Notification.requestPermission()
}
async function firstAsk() {
- if(Notification.permission === 'denied' || Notification.permission === 'default') {
- await askNotiPerms()
- }
+ if (
+ Notification.permission === 'denied' ||
+ Notification.permission === 'default'
+ ) {
+ await askNotiPerms()
+ }
}
async function mainNoti(user) {
- if(Notification.permission === 'denied' || Notification.permission === 'default') {
- await askNotiPerms()
- } else {
- if(cansendNoti) {
- let notification = new Notification('IPost', { body: "new message posted from " + user , tag: "new_post"});
- notification = await notification
- notification.addEventListener("click",function(){
- notification.close()
- })
- console.log(notification);
+ if (
+ Notification.permission === 'denied' ||
+ Notification.permission === 'default'
+ ) {
+ await askNotiPerms()
+ } else {
+ if (cansendNoti) {
+ let notification = new Notification('IPost', {
+ body: 'new message posted from ' + user,
+ tag: 'new_post',
+ })
+ notification = await notification
+ notification.addEventListener('click', function () {
+ notification.close()
+ })
+ console.log(notification)
+ }
}
- }
}
-document.addEventListener("visibilitychange", function() {
- if (document.visibilityState === 'visible') {
- cansendNoti = false
- } else {
- cansendNoti = true
- }
-});
+document.addEventListener('visibilitychange', function () {
+ if (document.visibilityState === 'visible') {
+ cansendNoti = false
+ } else {
+ cansendNoti = true
+ }
+})
-if(window.location.href.includes("message=")) {
- getById("post-text").innerText = `${decURIComp(window.location.href.split("message=")[1])} `
+if (window.location.href.includes('message=')) {
+ getById('post-text').innerText =
+ `${decURIComp(window.location.href.split('message=')[1])} `
}
function switchChannel(channelname) {
- sessionStorage.setItem("lastchannel", channelname);
- currentChannel = channelname
- socket.send(JSON.stringify({"id":"switchChannel","data":channelname}))
+ sessionStorage.setItem('lastchannel', channelname)
+ currentChannel = channelname
+ socket.send(JSON.stringify({ id: 'switchChannel', data: channelname }))
}
- function loadChannels() {
- //
+function loadChannels() {
+ //
- let tab = getById("channelTab")
- tab.innerHTML = ""
- for (let i = 0; i < channels.length; i++) {
- let channelname = decURIComp(channels[i])
- if(channelname === "")continue;
- let channelp = createElement("p")
- channelp.classList.add("channel")
- let textnode = document.createTextNode(channelname)
- channelp.appendChild(textnode)
- channelp.addEventListener("click",async function(){
- switchChannel(channelname)
- main()
+ let tab = getById('channelTab')
+ tab.innerHTML = ''
+ for (let i = 0; i < channels.length; i++) {
+ let channelname = decURIComp(channels[i])
+ if (channelname === '') continue
+ let channelp = createElement('p')
+ channelp.classList.add('channel')
+ let textnode = document.createTextNode(channelname)
+ channelp.appendChild(textnode)
+ channelp.addEventListener('click', async function () {
+ switchChannel(channelname)
+ main()
- let settings = await (await fetch("/api/settings")).json() // skipqc
- console.log(settings) // skipqc
- if(settings !== "null") {
- if(settings.ACCR === false) {
- unreply()
- }
- }
- })
- tab.appendChild(channelp)
- }
+ let settings = await (await fetch('/api/settings')).json() // skipqc
+ console.log(settings) // skipqc
+ if (settings !== 'null') {
+ if (settings.ACCR === false) {
+ unreply()
+ }
+ }
+ })
+ tab.appendChild(channelp)
+ }
}
var files = []
function addFile(file) {
- if(file.size > 1_000_000) {
- alert("that file is too large, max size: 1MiB")
- console.log("file is too big: ", file.name, file.type, file.size);
- return;
- }
- if(files.length >= 5) {
- console.log("too many files already: ", files);
- return;
- }
- files[files.length]=file
- const fileimg = createElement("img")
- console.log(file.name,file.name.lastIndexOf("\."),file.name.substring(file.name.lastIndexOf("\.")+1));
- fileimg.src = "/api/getFileIcon/"+file.name.substring(file.name.lastIndexOf("\.")+1)
+ if (file.size > 1_000_000) {
+ alert('that file is too large, max size: 1MiB')
+ console.log('file is too big: ', file.name, file.type, file.size)
+ return
+ }
+ if (files.length >= 5) {
+ console.log('too many files already: ', files)
+ return
+ }
+ files[files.length] = file
+ const fileimg = createElement('img')
+ console.log(
+ file.name,
+ file.name.lastIndexOf('\.'),
+ file.name.substring(file.name.lastIndexOf('\.') + 1)
+ )
+ fileimg.src =
+ '/api/getFileIcon/' +
+ file.name.substring(file.name.lastIndexOf('\.') + 1)
- getById("filesDiv").appendChild(fileimg)
- //filesDiv
- console.log("File added: ", file.name, file.type, file.size);
+ getById('filesDiv').appendChild(fileimg)
+ //filesDiv
+ console.log('File added: ', file.name, file.type, file.size)
}
function dropHandler(ev) {
- console.log("file dropped");
+ console.log('file dropped')
- ev.preventDefault();
+ ev.preventDefault()
- if (ev.dataTransfer.items) {
- // Use DataTransferItemList interface to access the file(s)
- [...ev.dataTransfer.items].forEach((item, i) => {
- // If dropped items aren't files, reject them
- if (item.kind === 'file') {
- const file = item.getAsFile();
- addFile(file)
- }
- });
- } else {
- // Use DataTransfer interface to access the file(s)
- [...ev.dataTransfer.files].forEach((file, i) => {
- addFile(file)
- });
- }
+ if (ev.dataTransfer.items) {
+ // Use DataTransferItemList interface to access the file(s)
+ ;[...ev.dataTransfer.items].forEach((item, i) => {
+ // If dropped items aren't files, reject them
+ if (item.kind === 'file') {
+ const file = item.getAsFile()
+ addFile(file)
+ }
+ })
+ } else {
+ // Use DataTransfer interface to access the file(s)
+ ;[...ev.dataTransfer.files].forEach((file, i) => {
+ addFile(file)
+ })
+ }
}
function init() {
- setInterval(update_pid,30000)
- if(posting_id==="")update_pid()
- main()
- firstAsk()
- loadChannels()
+ setInterval(update_pid, 30000)
+ if (posting_id === '') update_pid()
+ main()
+ firstAsk()
+ loadChannels()
}
init()
diff --git a/js/register.js b/js/register.js
index 71f2bcd..01aed9d 100644
--- a/js/register.js
+++ b/js/register.js
@@ -1,37 +1,42 @@
async function register() {
- if(document.getElementById("pass").value.length < 10) {
- alert("Password has to be at least 10 characters long")
- return;
+ if (document.getElementById('pass').value.length < 10) {
+ alert('Password has to be at least 10 characters long')
+ return
}
- if(document.getElementById("user").value.length > 25) {
- alert("Username is too long!")
- return;
+ if (document.getElementById('user').value.length > 25) {
+ alert('Username is too long!')
+ return
}
- if(document.getElementById("user").value.search("@") !== -1) {
+ if (document.getElementById('user').value.search('@') !== -1) {
alert("User cannot contain '@' character!")
- return;
+ return
}
- let r = (await post("/register",{
- user: document.getElementById("user").value,
- pass: document.getElementById("pass").value,
- r: REDIRECT_URL
- }))
- if(!r.url.endsWith("/user?success=true") && !r.url.endsWith(REDIRECT_URL)) {
- if(r.url.endsWith("already_exists")) {
- alert("An account with that name already exists! Did you mean to login?")
+ let r = await post('/register', {
+ user: document.getElementById('user').value,
+ pass: document.getElementById('pass').value,
+ r: REDIRECT_URL,
+ })
+ if (
+ !r.url.endsWith('/user?success=true') &&
+ !r.url.endsWith(REDIRECT_URL)
+ ) {
+ if (r.url.endsWith('already_exists')) {
+ alert(
+ 'An account with that name already exists! Did you mean to login?'
+ )
return
}
//fallback
- document.getElementById("pass").value = ""
- console.error("registration failed")
- alert("Registration failed")
- return;
+ document.getElementById('pass').value = ''
+ console.error('registration failed')
+ alert('Registration failed')
+ return
}
- window.location = REDIRECT_URL || "/user"
+ window.location = REDIRECT_URL || '/user'
}
function passkeydown(e) {
- if(e.code === "Enter") {
+ if (e.code === 'Enter') {
register()
}
-}
\ No newline at end of file
+}
diff --git a/js/search.js b/js/search.js
index ada5a6c..9038ff3 100644
--- a/js/search.js
+++ b/js/search.js
@@ -1,10 +1,11 @@
const valuetoText = {
- "user":"Username",
- "post":"Post"
+ user: 'Username',
+ post: 'Post',
}
function changed() {
- document.getElementById("selector").placeholder = valuetoText[document.getElementById("type").value];
+ document.getElementById('selector').placeholder =
+ valuetoText[document.getElementById('type').value]
}
async function getJSON(url) {
@@ -12,69 +13,83 @@ async function getJSON(url) {
}
async function submit() {
- const type = document.getElementById("type").value
- const selector = document.getElementById("selector").value
- document.getElementById("output").innerHTML=""
- const res = await getJSON(`/api/search?type=${type}&selector=${selector}`)
- //document.getElementById("output").innerHTML = res
- console.log(res);
- for (let i = 0; i < res.length; i++) {
- let obj = res[i]
- if(type === "user") {
- createPost(decodeURIComponent(obj.User_Name || ""),decodeURIComponent(obj.User_Bio || "wow such empty"),0)
- } else {
- createPost(decodeURIComponent(obj.post_user_name),decodeURIComponent(obj.post_text),obj.post_time,obj.post_special_text,obj.post_id)
+ const type = document.getElementById('type').value
+ const selector = document.getElementById('selector').value
+ document.getElementById('output').innerHTML = ''
+ const res = await getJSON(`/api/search?type=${type}&selector=${selector}`)
+ //document.getElementById("output").innerHTML = res
+ console.log(res)
+ for (let i = 0; i < res.length; i++) {
+ let obj = res[i]
+ if (type === 'user') {
+ createPost(
+ decodeURIComponent(obj.User_Name || ''),
+ decodeURIComponent(obj.User_Bio || 'wow such empty'),
+ 0
+ )
+ } else {
+ createPost(
+ decodeURIComponent(obj.post_user_name),
+ decodeURIComponent(obj.post_text),
+ obj.post_time,
+ obj.post_special_text,
+ obj.post_id
+ )
+ }
}
- }
}
function keydown(event) {
- if (event.key === "Enter") {
- event.preventDefault()
- submit()
- }
+ if (event.key === 'Enter') {
+ event.preventDefault()
+ submit()
+ }
}
function spacerTextNode() {
- return document.createTextNode(" | ")
+ return document.createTextNode(' | ')
}
-function createPost(username,text,time,specialtext,postid) {
- if(!specialtext)specialtext=""
- const newDiv = document.createElement("div");
- const newP = document.createElement("p");
- const newA = document.createElement("a");
- const newSpan2 = document.createElement("span");
- const newSpan3 = document.createElement("span");
+function createPost(username, text, time, specialtext, postid) {
+ if (!specialtext) specialtext = ''
+ const newDiv = document.createElement('div')
+ const newP = document.createElement('p')
+ const newA = document.createElement('a')
+ const newSpan2 = document.createElement('span')
+ const newSpan3 = document.createElement('span')
- const newUsername = document.createTextNode(username);
- let timedate = new Date(time)
- time = timedate
- time = time.toString()
- time = time.split(" ")
- time = time[0] + " " + time[1] + " " + time[2] + " " + time[3] + " " + time[4]
- if(timedate==="Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)")time=""
- const newTime = document.createTextNode(time)
- const newSpecialText = document.createTextNode(specialtext)
+ const newUsername = document.createTextNode(username)
+ let timedate = new Date(time)
+ time = timedate
+ time = time.toString()
+ time = time.split(' ')
+ time =
+ time[0] + ' ' + time[1] + ' ' + time[2] + ' ' + time[3] + ' ' + time[4]
+ if (
+ timedate ===
+ 'Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)'
+ )
+ time = ''
+ const newTime = document.createTextNode(time)
+ const newSpecialText = document.createTextNode(specialtext)
- newDiv.classList.add("result");
- newSpan3.classList.add("specialtext")
+ newDiv.classList.add('result')
+ newSpan3.classList.add('specialtext')
- newA.appendChild(newUsername)
+ newA.appendChild(newUsername)
- newA.href = `/users/${username}`
- newSpan2.appendChild(newTime)
- newSpan3.appendChild(newSpecialText)
+ newA.href = `/users/${username}`
+ newSpan2.appendChild(newTime)
+ newSpan3.appendChild(newSpecialText)
+ newP.appendChild(newA)
+ if (time !== '') newP.appendChild(spacerTextNode())
+ newP.appendChild(newSpan2)
+ if (specialtext !== '' && time !== '') newP.appendChild(spacerTextNode())
+ newP.appendChild(newSpan3)
- newP.appendChild(newA)
- if(time !== "")newP.appendChild(spacerTextNode())
- newP.appendChild(newSpan2)
- if(specialtext !== "" && time !== "")newP.appendChild(spacerTextNode())
- newP.appendChild(newSpan3)
-
- newDiv.appendChild(newP)
- newDiv.innerHTML += filterPost(text) // skipqc
- newDiv.id = postid
- document.getElementById("output").appendChild(newDiv)
+ newDiv.appendChild(newP)
+ newDiv.innerHTML += filterPost(text) // skipqc
+ newDiv.id = postid
+ document.getElementById('output').appendChild(newDiv)
}
diff --git a/js/settings.js b/js/settings.js
index 11ff1c1..05b0931 100644
--- a/js/settings.js
+++ b/js/settings.js
@@ -1,138 +1,158 @@
function completeHandler(event) {
- console.log("completed upload");
- console.log(event.target.responseText);
- setuser() // skipqc
+ console.log('completed upload')
+ console.log(event.target.responseText)
+ setuser() // skipqc
}
function errorHandler(event) {
- console.log("error during upload");
- console.log(event.target.responseText);
+ console.log('error during upload')
+ console.log(event.target.responseText)
}
function progressHandler(event) {
- console.log("progressing upload");
- console.log("Uploaded " + event.loaded + " bytes of " + event.total);
- console.log(event.target.responseText);
+ console.log('progressing upload')
+ console.log('Uploaded ' + event.loaded + ' bytes of ' + event.total)
+ console.log(event.target.responseText)
}
-/**
-* upload avatar to the server
-* @return {undefined} no return value
-*/
+/**
+ * upload avatar to the server
+ * @return {undefined} no return value
+ */
function uploadFile() {
- const file = document.getElementById("avatarUpl").files[0];
- console.log(file);
- const formdata = new FormData();
- formdata.append("avatar", file);
- const ajax = new XMLHttpRequest();
- ajax.upload.addEventListener("progress", progressHandler, false);
- ajax.addEventListener("load", completeHandler, false);
- ajax.addEventListener("error", errorHandler, false);
- ajax.addEventListener("abort", errorHandler, false);
- ajax.open("POST", "/api/setavatar");
- ajax.send(formdata);
+ const file = document.getElementById('avatarUpl').files[0]
+ console.log(file)
+ const formdata = new FormData()
+ formdata.append('avatar', file)
+ const ajax = new XMLHttpRequest()
+ ajax.upload.addEventListener('progress', progressHandler, false)
+ ajax.addEventListener('load', completeHandler, false)
+ ajax.addEventListener('error', errorHandler, false)
+ ajax.addEventListener('abort', errorHandler, false)
+ ajax.open('POST', '/api/setavatar')
+ ajax.send(formdata)
- document.getElementById("avatarUplButton").style = "display:none;";
+ document.getElementById('avatarUplButton').style = 'display:none;'
}
function logout() {
- location.assign('/logout')
+ location.assign('/logout')
}
async function setuser() {
- let user = await (await fetch("/api/getuser")).json();
- let username
- let bio
- let avatar
- username = user["username"];
- bio = user["bio"]
- avatar = user["avatar"]
- if(user["error"])username=user["error"];
- if(user["error"])bio=user["error"];
- if(!bio)bio="wow such empty"
- if(avatar) {
- avatar = "/avatars/"+avatar
- } else {
- avatar = "/images/default_avatar.png"
- }
- document.getElementById("user").innerText = `User: ${username}`;
- document.getElementById("bio").placeholder = decodeURIComponent(bio);
- document.getElementById("avatarimg").src = avatar;
- document.getElementById("avatarUpl").addEventListener("change", function(){
- document.getElementById("avatarUplButton").style = "";
- })
- document.getElementById("avatarUplButton").addEventListener("click",uploadFile);
+ let user = await (await fetch('/api/getuser')).json()
+ let username
+ let bio
+ let avatar
+ username = user['username']
+ bio = user['bio']
+ avatar = user['avatar']
+ if (user['error']) username = user['error']
+ if (user['error']) bio = user['error']
+ if (!bio) bio = 'wow such empty'
+ if (avatar) {
+ avatar = '/avatars/' + avatar
+ } else {
+ avatar = '/images/default_avatar.png'
+ }
+ document.getElementById('user').innerText = `User: ${username}`
+ document.getElementById('bio').placeholder = decodeURIComponent(bio)
+ document.getElementById('avatarimg').src = avatar
+ document
+ .getElementById('avatarUpl')
+ .addEventListener('change', function () {
+ document.getElementById('avatarUplButton').style = ''
+ })
+ document
+ .getElementById('avatarUplButton')
+ .addEventListener('click', uploadFile)
}
-/**
-* sets user bio
-* @param {string} str - bio to set
-* @return {promise} api response
-*/
+/**
+ * sets user bio
+ * @param {string} str - bio to set
+ * @return {promise} api response
+ */
function sendBio(str) {
- if(document.getElementById("bio").placeholder !== str && str !== "") {
- document.getElementById("bio").placeholder = str
- return post("/api/setBio",{"Bio":str}) // skipqc
- }
- return ""
+ if (document.getElementById('bio').placeholder !== str && str !== '') {
+ document.getElementById('bio').placeholder = str
+ return post('/api/setBio', { Bio: str }) // skipqc
+ }
+ return ''
}
async function bioChanger() {
- document.getElementById("bio").disabled = !document.getElementById("bio").disabled
- document.getElementById("changeBio").innerText = (document.getElementById("bio").disabled && "Change Bio") || "Submit"
- if(document.getElementById("bio").disabled) {
- let response = await sendBio(document.getElementById("bio").value)
- console.log(response);
- document.getElementById("userstyle").innerHTML = '::placeholder {color: white;} #bio {border: 0px solid black; color:white;}'
- }
- else
- {
- document.getElementById("userstyle").innerHTML = '::placeholder {color: white;} #bio {border: 2px solid gray; color:white;}'
- }
+ document.getElementById('bio').disabled =
+ !document.getElementById('bio').disabled
+ document.getElementById('changeBio').innerText =
+ (document.getElementById('bio').disabled && 'Change Bio') || 'Submit'
+ if (document.getElementById('bio').disabled) {
+ let response = await sendBio(document.getElementById('bio').value)
+ console.log(response)
+ document.getElementById('userstyle').innerHTML =
+ '::placeholder {color: white;} #bio {border: 0px solid black; color:white;}'
+ } else {
+ document.getElementById('userstyle').innerHTML =
+ '::placeholder {color: white;} #bio {border: 2px solid gray; color:white;}'
+ }
}
-
async function changePW() {
- if(window.confirm("Are you sure that you want to change your Password?")){
- let re = await (await post("/api/changePW",{"currentPW":document.getElementById("currentPW_pw").value,"newPW":document.getElementById("newPW").value})).json() // skipqc
- document.getElementById("response_pw").innerText = re["error"] || re["success"]
- document.getElementById("response_pw").style="color:green"
- if(re["error"]) {
- document.getElementById("response_pw").style="color:red"
- }
- document.getElementById("currentPW").value = ""
- document.getElementById("newPW").value = ""
+ if (window.confirm('Are you sure that you want to change your Password?')) {
+ let re = await (
+ await post('/api/changePW', {
+ currentPW: document.getElementById('currentPW_pw').value,
+ newPW: document.getElementById('newPW').value,
+ })
+ ).json() // skipqc
+ document.getElementById('response_pw').innerText =
+ re['error'] || re['success']
+ document.getElementById('response_pw').style = 'color:green'
+ if (re['error']) {
+ document.getElementById('response_pw').style = 'color:red'
+ }
+ document.getElementById('currentPW').value = ''
+ document.getElementById('newPW').value = ''
- setuser()
- }
+ setuser()
+ }
}
async function changeUsername() {
- if(window.confirm("Are you sure that you want to change your Username?")){
- // skipqc
- let re = await (await post("/api/changeUsername",{"currentPW":document.getElementById("currentPW_us").value.toString(),"newUsername":document.getElementById("newUsername").value})).json()
- document.getElementById("response_us").innerText = re["error"] || re["success"]
- document.getElementById("response_us").style="color:green"
- if(re["error"]) {
- document.getElementById("response_us").style="color:red"
+ if (window.confirm('Are you sure that you want to change your Username?')) {
+ // skipqc
+ let re = await (
+ await post('/api/changeUsername', {
+ currentPW: document
+ .getElementById('currentPW_us')
+ .value.toString(),
+ newUsername: document.getElementById('newUsername').value,
+ })
+ ).json()
+ document.getElementById('response_us').innerText =
+ re['error'] || re['success']
+ document.getElementById('response_us').style = 'color:green'
+ if (re['error']) {
+ document.getElementById('response_us').style = 'color:red'
+ }
+ document.getElementById('currentPW').value = ''
+ document.getElementById('newUsername').value = ''
+ setuser()
}
- document.getElementById("currentPW").value = ""
- document.getElementById("newUsername").value = ""
- setuser()
- }
}
-
async function setAllowCCR() {
- const ACCR = document.getElementById("ACCR_checkbox").checked
- const settingname = "ACCR" //Allow Cross-Channel reply (see #22 )
+ const ACCR = document.getElementById('ACCR_checkbox').checked
+ const settingname = 'ACCR' //Allow Cross-Channel reply (see #22 )
- let r = await(await post("/api/settings",{setting: settingname, value: ACCR})).json() // skipqc
+ let r = await (
+ await post('/api/settings', { setting: settingname, value: ACCR })
+ ).json() // skipqc
- if(r.status === "error") {
- alert("Couldn't change setting")
- console.log(r.code)
- } else if(r.status === "success") {
- //changed setting
- }
-}
\ No newline at end of file
+ if (r.status === 'error') {
+ alert("Couldn't change setting")
+ console.log(r.code)
+ } else if (r.status === 'success') {
+ //changed setting
+ }
+}
diff --git a/js/user.js b/js/user.js
index 977e30a..39676a2 100644
--- a/js/user.js
+++ b/js/user.js
@@ -1,53 +1,54 @@
function getCookie(cname) {
- let name = cname + "=";
- let decodedCookie = decodeURIComponent(document.cookie);
- let ca = decodedCookie.split(';');
- for(let i = 0; i =21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.1.0"
- }
- },
- "node_modules/@img/sharp-darwin-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz",
- "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.1.0"
- }
- },
- "node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz",
- "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "darwin"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz",
- "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "darwin"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz",
- "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==",
- "cpu": [
- "arm"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz",
- "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-ppc64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz",
- "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==",
- "cpu": [
- "ppc64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz",
- "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==",
- "cpu": [
- "s390x"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz",
- "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz",
- "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz",
- "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-linux-arm": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz",
- "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==",
- "cpu": [
- "arm"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.1.0"
- }
- },
- "node_modules/@img/sharp-linux-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz",
- "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.1.0"
- }
- },
- "node_modules/@img/sharp-linux-s390x": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz",
- "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==",
- "cpu": [
- "s390x"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.1.0"
- }
- },
- "node_modules/@img/sharp-linux-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz",
- "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.1.0"
- }
- },
- "node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz",
- "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.1.0"
- }
- },
- "node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz",
- "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.1.0"
- }
- },
- "node_modules/@img/sharp-wasm32": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz",
- "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==",
- "cpu": [
- "wasm32"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/runtime": "^1.4.0"
- },
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-ia32": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz",
- "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==",
- "cpu": [
- "ia32"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz",
- "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
- "dependencies": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "node_modules/accepts": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
- "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
- "license": "MIT",
- "dependencies": {
- "mime-types": "^3.0.0",
- "negotiator": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/accepts/node_modules/negotiator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
- "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/async": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
- "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
- },
- "node_modules/aws-ssl-profiles": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
- "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
- "license": "MIT",
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "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/body-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
- "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
- "license": "MIT",
- "dependencies": {
- "bytes": "^3.1.2",
- "content-type": "^1.0.5",
- "debug": "^4.4.0",
- "http-errors": "^2.0.0",
- "iconv-lite": "^0.6.3",
- "on-finished": "^2.4.1",
- "qs": "^6.14.0",
- "raw-body": "^3.0.0",
- "type-is": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/body-parser/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/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/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
- "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-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dependencies": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/clean-css": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
- "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
- "license": "MIT",
- "dependencies": {
- "source-map": "~0.6.0"
- },
- "engines": {
- "node": ">= 10.0"
- }
- },
- "node_modules/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
- "engines": {
- "node": ">=12.5.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compression": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz",
- "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "compressible": "~2.0.18",
- "debug": "2.6.9",
- "negotiator": "~0.6.4",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.2.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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/content-disposition": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
- "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
- "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-parser": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
- "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
- "license": "MIT",
- "dependencies": {
- "cookie": "0.7.2",
- "cookie-signature": "1.0.6"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/cookie-parser/node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "license": "MIT"
- },
- "node_modules/cookie-signature": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
- "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
- "license": "MIT",
- "engines": {
- "node": ">=6.6.0"
- }
- },
- "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/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/denque": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
- "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
- "engines": {
- "node": ">=0.10"
- }
- },
- "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/detect-libc": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
- "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "node_modules/ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
- "license": "Apache-2.0",
- "dependencies": {
- "jake": "^10.8.5"
- },
- "bin": {
- "ejs": "bin/cli.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/entities": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
- "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "license": "MIT"
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/express": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
- "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
- "license": "MIT",
- "dependencies": {
- "accepts": "^2.0.0",
- "body-parser": "^2.2.0",
- "content-disposition": "^1.0.0",
- "content-type": "^1.0.5",
- "cookie": "^0.7.1",
- "cookie-signature": "^1.2.1",
- "debug": "^4.4.0",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "etag": "^1.8.1",
- "finalhandler": "^2.1.0",
- "fresh": "^2.0.0",
- "http-errors": "^2.0.0",
- "merge-descriptors": "^2.0.0",
- "mime-types": "^3.0.0",
- "on-finished": "^2.4.1",
- "once": "^1.4.0",
- "parseurl": "^1.3.3",
- "proxy-addr": "^2.0.7",
- "qs": "^6.14.0",
- "range-parser": "^1.2.1",
- "router": "^2.2.0",
- "send": "^1.1.0",
- "serve-static": "^2.2.0",
- "statuses": "^2.0.1",
- "type-is": "^2.0.1",
- "vary": "^1.1.2"
- },
- "engines": {
- "node": ">= 18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/express-fileupload": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.1.tgz",
- "integrity": "sha512-LsYG1ALXEB7vlmjuSw8ABeOctMp8a31aUC5ZF55zuz7O2jLFnmJYrCv10py357ky48aEoBQ/9bVXgFynjvaPmA==",
- "license": "MIT",
- "dependencies": {
- "busboy": "^1.6.0"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/express-useragent": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/express-useragent/-/express-useragent-1.0.15.tgz",
- "integrity": "sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg==",
- "engines": {
- "node": ">=4.5"
- }
- },
- "node_modules/express/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/express/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "dependencies": {
- "minimatch": "^5.0.1"
- }
- },
- "node_modules/filelist/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/filelist/node_modules/minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/finalhandler": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
- "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.0",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "on-finished": "^2.4.1",
- "parseurl": "^1.3.3",
- "statuses": "^2.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/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": "2.0.0",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
- "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.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/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/generate-function": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
- "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
- "dependencies": {
- "is-property": "^1.0.2"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "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/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hcaptcha": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/hcaptcha/-/hcaptcha-0.2.0.tgz",
- "integrity": "sha512-x25z3RoEa9oqfyuQsgk2olc+LCNVDAJaGKUP1qFhpAybB6qjqOf4qB2y1E3LJpXDvM229JWEywc6iWnzWvGjNw==",
- "license": "MIT"
- },
- "node_modules/html-minifier-terser": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
- "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
- "dependencies": {
- "camel-case": "^4.1.2",
- "clean-css": "~5.3.2",
- "commander": "^10.0.0",
- "entities": "^4.4.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.15.1"
- },
- "bin": {
- "html-minifier-terser": "cli.js"
- },
- "engines": {
- "node": "^14.13.1 || >=16.0.0"
- }
- },
- "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/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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==",
- "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-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
- },
- "node_modules/is-promise": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
- "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
- "license": "MIT"
- },
- "node_modules/is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
- },
- "node_modules/jake": {
- "version": "10.8.5",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
- "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
- "dependencies": {
- "async": "^3.2.3",
- "chalk": "^4.0.2",
- "filelist": "^1.0.1",
- "minimatch": "^3.0.4"
- },
- "bin": {
- "jake": "bin/cli.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/lru-cache": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
- "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==",
- "license": "ISC",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/lru.min": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
- "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
- "license": "MIT",
- "engines": {
- "bun": ">=1.0.0",
- "deno": ">=1.30.0",
- "node": ">=8.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wellwelwel"
- }
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/media-typer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
- "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
- "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mime-db": {
- "version": "1.54.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
- "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
- "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
- "license": "MIT",
- "dependencies": {
- "mime-db": "^1.54.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/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/mysql2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.0.tgz",
- "integrity": "sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==",
- "license": "MIT",
- "dependencies": {
- "aws-ssl-profiles": "^1.1.1",
- "denque": "^2.1.0",
- "generate-function": "^2.3.1",
- "iconv-lite": "^0.6.3",
- "long": "^5.2.1",
- "lru.min": "^1.0.0",
- "named-placeholders": "^1.1.3",
- "seq-queue": "^0.0.5",
- "sqlstring": "^2.3.2"
- },
- "engines": {
- "node": ">= 8.0"
- }
- },
- "node_modules/mysql2/node_modules/long": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
- "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
- },
- "node_modules/mysql2/node_modules/sqlstring": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
- "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/named-placeholders": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
- "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
- "dependencies": {
- "lru-cache": "^7.14.1"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/named-placeholders/node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/negotiator": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
- "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dependencies": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "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/param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "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": "8.2.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
- "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
- "license": "MIT",
- "engines": {
- "node": ">=16"
- }
- },
- "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/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
- "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.6.3",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/readline-sync": {
- "version": "1.4.10",
- "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
- "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/router": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
- "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.0",
- "depd": "^2.0.0",
- "is-promise": "^4.0.0",
- "parseurl": "^1.3.3",
- "path-to-regexp": "^8.0.0"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/router/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/router/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/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"
+ "name": "ipost",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "ipost",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "body-parser": "^2.2",
+ "clean-css": "^5.3",
+ "compression": "^1.8",
+ "cookie-parser": "^1.4",
+ "cookie-signature": "^1.2.2",
+ "ejs": "^3.1",
+ "express": "^5.1",
+ "express-fileupload": "^1.5",
+ "express-useragent": "^1.0",
+ "hcaptcha": "^0.2",
+ "html-minifier-terser": "^7.2.0",
+ "lru-cache": "^11.1",
+ "mysql2": "^3.14",
+ "sharp": "^0.34",
+ "swagger-autogen": "^2.23",
+ "uglify-js": "^3.19",
+ "unsafe_encrypt": "^1.0.4",
+ "ws": "^8.18"
+ },
+ "devDependencies": {
+ "@hcaptcha/types": "^1.0.3",
+ "husky": "^9.1.7",
+ "lint-staged": "^15.5.1",
+ "prettier": "^3.5"
+ }
},
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "node_modules/@emnapi/runtime": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
+ "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
},
- {
- "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.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
- "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.5",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "etag": "^1.8.1",
- "fresh": "^2.0.0",
- "http-errors": "^2.0.0",
- "mime-types": "^3.0.1",
- "ms": "^2.1.3",
- "on-finished": "^2.4.1",
- "range-parser": "^1.2.1",
- "statuses": "^2.0.1"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/send/node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/seq-queue": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
- "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
- },
- "node_modules/serve-static": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
- "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
- "license": "MIT",
- "dependencies": {
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "parseurl": "^1.3.3",
- "send": "^1.2.0"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/sharp": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz",
- "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==",
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "color": "^4.2.3",
- "detect-libc": "^2.0.3",
- "semver": "^7.7.1"
- },
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.34.1",
- "@img/sharp-darwin-x64": "0.34.1",
- "@img/sharp-libvips-darwin-arm64": "1.1.0",
- "@img/sharp-libvips-darwin-x64": "1.1.0",
- "@img/sharp-libvips-linux-arm": "1.1.0",
- "@img/sharp-libvips-linux-arm64": "1.1.0",
- "@img/sharp-libvips-linux-ppc64": "1.1.0",
- "@img/sharp-libvips-linux-s390x": "1.1.0",
- "@img/sharp-libvips-linux-x64": "1.1.0",
- "@img/sharp-libvips-linuxmusl-arm64": "1.1.0",
- "@img/sharp-libvips-linuxmusl-x64": "1.1.0",
- "@img/sharp-linux-arm": "0.34.1",
- "@img/sharp-linux-arm64": "0.34.1",
- "@img/sharp-linux-s390x": "0.34.1",
- "@img/sharp-linux-x64": "0.34.1",
- "@img/sharp-linuxmusl-arm64": "0.34.1",
- "@img/sharp-linuxmusl-x64": "0.34.1",
- "@img/sharp-wasm32": "0.34.1",
- "@img/sharp-win32-ia32": "0.34.1",
- "@img/sharp-win32-x64": "0.34.1"
- }
- },
- "node_modules/side-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3",
- "side-channel-list": "^1.0.0",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-list": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-weakmap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3",
- "side-channel-map": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
- "dependencies": {
- "is-arrayish": "^0.3.1"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/swagger-autogen": {
- "version": "2.23.7",
- "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.7.tgz",
- "integrity": "sha512-vr7uRmuV0DCxWc0wokLJAwX3GwQFJ0jwN+AWk0hKxre2EZwusnkGSGdVFd82u7fQLgwSTnbWkxUL7HXuz5LTZQ==",
- "license": "MIT",
- "dependencies": {
- "acorn": "^7.4.1",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.7",
- "json5": "^2.2.3"
- }
- },
- "node_modules/swagger-autogen/node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/terser": {
- "version": "5.16.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
- "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
- "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/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- },
- "node_modules/type-is": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
- "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
- "license": "MIT",
- "dependencies": {
- "content-type": "^1.0.5",
- "media-typer": "^1.1.0",
- "mime-types": "^3.0.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/uglify-js": {
- "version": "3.19.3",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
- "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
- "license": "BSD-2-Clause",
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/unsafe_encrypt": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unsafe_encrypt/-/unsafe_encrypt-1.0.4.tgz",
- "integrity": "sha512-n+pxzgOGVM0jslM+aQH20JMuyHXdmOKLUisA2s1XnT/vq4882iTfN+xmZCyfKbtDx/DZ4BizyL/Mw+xM9Ag58A==",
- "dependencies": {
- "readline-sync": "^1.4.10"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "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/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
+ "node_modules/@hcaptcha/types": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@hcaptcha/types/-/types-1.0.4.tgz",
+ "integrity": "sha512-4CBrdr9DFC7sYZPRvLol82UVZVne8B2skBGfMDUqPC6q9vzHMwv/cNxXW44EIa6DaFDr+EWNSnKJpHxWr7Q42Q==",
+ "dev": true,
+ "license": "MIT"
},
- "utf-8-validate": {
- "optional": true
- }
- }
- }
- },
- "dependencies": {
- "@emnapi/runtime": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
- "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
- "optional": true,
- "requires": {
- "tslib": "^2.4.0"
- }
- },
- "@hcaptcha/types": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@hcaptcha/types/-/types-1.0.4.tgz",
- "integrity": "sha512-4CBrdr9DFC7sYZPRvLol82UVZVne8B2skBGfMDUqPC6q9vzHMwv/cNxXW44EIa6DaFDr+EWNSnKJpHxWr7Q42Q==",
- "dev": true
- },
- "@img/sharp-darwin-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz",
- "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-darwin-arm64": "1.1.0"
- }
- },
- "@img/sharp-darwin-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz",
- "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-darwin-x64": "1.1.0"
- }
- },
- "@img/sharp-libvips-darwin-arm64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz",
- "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==",
- "optional": true
- },
- "@img/sharp-libvips-darwin-x64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz",
- "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==",
- "optional": true
- },
- "@img/sharp-libvips-linux-arm": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz",
- "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==",
- "optional": true
- },
- "@img/sharp-libvips-linux-arm64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz",
- "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==",
- "optional": true
- },
- "@img/sharp-libvips-linux-ppc64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz",
- "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==",
- "optional": true
- },
- "@img/sharp-libvips-linux-s390x": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz",
- "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==",
- "optional": true
- },
- "@img/sharp-libvips-linux-x64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz",
- "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==",
- "optional": true
- },
- "@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz",
- "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==",
- "optional": true
- },
- "@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz",
- "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==",
- "optional": true
- },
- "@img/sharp-linux-arm": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz",
- "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-linux-arm": "1.1.0"
- }
- },
- "@img/sharp-linux-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz",
- "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-linux-arm64": "1.1.0"
- }
- },
- "@img/sharp-linux-s390x": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz",
- "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-linux-s390x": "1.1.0"
- }
- },
- "@img/sharp-linux-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz",
- "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-linux-x64": "1.1.0"
- }
- },
- "@img/sharp-linuxmusl-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz",
- "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.1.0"
- }
- },
- "@img/sharp-linuxmusl-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz",
- "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==",
- "optional": true,
- "requires": {
- "@img/sharp-libvips-linuxmusl-x64": "1.1.0"
- }
- },
- "@img/sharp-wasm32": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz",
- "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==",
- "optional": true,
- "requires": {
- "@emnapi/runtime": "^1.4.0"
- }
- },
- "@img/sharp-win32-ia32": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz",
- "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==",
- "optional": true
- },
- "@img/sharp-win32-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz",
- "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==",
- "optional": true
- },
- "@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
- },
- "@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
- },
- "@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
- "requires": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "accepts": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
- "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
- "requires": {
- "mime-types": "^3.0.0",
- "negotiator": "^1.0.0"
- },
- "dependencies": {
- "negotiator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
- "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="
- }
- }
- },
- "acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA=="
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "async": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
- "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
- },
- "aws-ssl-profiles": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
- "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "body-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
- "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
- "requires": {
- "bytes": "^3.1.2",
- "content-type": "^1.0.5",
- "debug": "^4.4.0",
- "http-errors": "^2.0.0",
- "iconv-lite": "^0.6.3",
- "on-finished": "^2.4.1",
- "qs": "^6.14.0",
- "raw-body": "^3.0.0",
- "type-is": "^2.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "requires": {
- "ms": "^2.1.3"
- }
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz",
+ "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.1.0"
+ }
},
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- }
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "requires": {
- "streamsearch": "^1.1.0"
- }
- },
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
- },
- "call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "requires": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- }
- },
- "call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "requires": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- }
- },
- "camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "requires": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "clean-css": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
- "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
- "requires": {
- "source-map": "~0.6.0"
- }
- },
- "color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
- "requires": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "requires": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz",
- "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
- "requires": {
- "bytes": "3.1.2",
- "compressible": "~2.0.18",
- "debug": "2.6.9",
- "negotiator": "~0.6.4",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.2.1",
- "vary": "~1.1.2"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- },
- "content-disposition": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
- "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
- "requires": {
- "safe-buffer": "5.2.1"
- }
- },
- "content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
- },
- "cookie": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
- "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="
- },
- "cookie-parser": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
- "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
- "requires": {
- "cookie": "0.7.2",
- "cookie-signature": "1.0.6"
- },
- "dependencies": {
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- }
- }
- },
- "cookie-signature": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
- "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
- },
- "denque": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
- "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "detect-libc": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
- "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="
- },
- "dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "requires": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
- "requires": {
- "jake": "^10.8.5"
- }
- },
- "encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
- },
- "entities": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
- "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
- },
- "es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
- },
- "es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
- },
- "es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "requires": {
- "es-errors": "^1.3.0"
- }
- },
- "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=="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
- },
- "express": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
- "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
- "requires": {
- "accepts": "^2.0.0",
- "body-parser": "^2.2.0",
- "content-disposition": "^1.0.0",
- "content-type": "^1.0.5",
- "cookie": "^0.7.1",
- "cookie-signature": "^1.2.1",
- "debug": "^4.4.0",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "etag": "^1.8.1",
- "finalhandler": "^2.1.0",
- "fresh": "^2.0.0",
- "http-errors": "^2.0.0",
- "merge-descriptors": "^2.0.0",
- "mime-types": "^3.0.0",
- "on-finished": "^2.4.1",
- "once": "^1.4.0",
- "parseurl": "^1.3.3",
- "proxy-addr": "^2.0.7",
- "qs": "^6.14.0",
- "range-parser": "^1.2.1",
- "router": "^2.2.0",
- "send": "^1.1.0",
- "serve-static": "^2.2.0",
- "statuses": "^2.0.1",
- "type-is": "^2.0.1",
- "vary": "^1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "requires": {
- "ms": "^2.1.3"
- }
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz",
+ "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.1.0"
+ }
},
- "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/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz",
+ "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz",
+ "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz",
+ "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz",
+ "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz",
+ "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz",
+ "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz",
+ "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz",
+ "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz",
+ "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz",
+ "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz",
+ "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz",
+ "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz",
+ "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz",
+ "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz",
+ "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz",
+ "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.4.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz",
+ "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz",
+ "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+ "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.8.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
+ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "node_modules/aws-ssl-profiles": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
+ "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "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/body-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.0",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.6.3",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.0",
+ "raw-body": "^3.0.0",
+ "type-is": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "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-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+ "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz",
+ "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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/content-disposition": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-parser": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
+ "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "0.7.2",
+ "cookie-signature": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/cookie-parser/node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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/detect-libc": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.0",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express-fileupload": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.1.tgz",
+ "integrity": "sha512-LsYG1ALXEB7vlmjuSw8ABeOctMp8a31aUC5ZF55zuz7O2jLFnmJYrCv10py357ky48aEoBQ/9bVXgFynjvaPmA==",
+ "license": "MIT",
+ "dependencies": {
+ "busboy": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/express-useragent": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/express-useragent/-/express-useragent-1.0.15.tgz",
+ "integrity": "sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg==",
+ "engines": {
+ "node": ">=4.5"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
+ "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/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": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.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/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generate-function": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+ "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+ "dependencies": {
+ "is-property": "^1.0.2"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hcaptcha": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/hcaptcha/-/hcaptcha-0.2.0.tgz",
+ "integrity": "sha512-x25z3RoEa9oqfyuQsgk2olc+LCNVDAJaGKUP1qFhpAybB6qjqOf4qB2y1E3LJpXDvM229JWEywc6iWnzWvGjNw==",
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
+ "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "~5.3.2",
+ "commander": "^10.0.0",
+ "entities": "^4.4.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.15.1"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ }
+ },
+ "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/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "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-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
+ },
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jake": {
+ "version": "10.8.5",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
+ "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lint-staged": {
+ "version": "15.5.1",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.1.tgz",
+ "integrity": "sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.4.1",
+ "commander": "^13.1.0",
+ "debug": "^4.4.0",
+ "execa": "^8.0.1",
+ "lilconfig": "^3.1.3",
+ "listr2": "^8.2.5",
+ "micromatch": "^4.0.8",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.2",
+ "yaml": "^2.7.0"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/lint-staged/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/lint-staged/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lint-staged/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/listr2": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.2.tgz",
+ "integrity": "sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cli-truncate": "^4.0.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^6.1.0",
+ "rfdc": "^1.4.1",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+ "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+ "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+ "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
+ "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==",
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/lru.min": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
+ "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
+ "license": "MIT",
+ "engines": {
+ "bun": ">=1.0.0",
+ "deno": ">=1.30.0",
+ "node": ">=8.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wellwelwel"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "node_modules/mysql2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.0.tgz",
+ "integrity": "sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==",
+ "license": "MIT",
+ "dependencies": {
+ "aws-ssl-profiles": "^1.1.1",
+ "denque": "^2.1.0",
+ "generate-function": "^2.3.1",
+ "iconv-lite": "^0.6.3",
+ "long": "^5.2.1",
+ "lru.min": "^1.0.0",
+ "named-placeholders": "^1.1.3",
+ "seq-queue": "^0.0.5",
+ "sqlstring": "^2.3.2"
+ },
+ "engines": {
+ "node": ">= 8.0"
+ }
+ },
+ "node_modules/mysql2/node_modules/long": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+ "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
+ },
+ "node_modules/mysql2/node_modules/sqlstring": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+ "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/named-placeholders": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+ "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
+ "dependencies": {
+ "lru-cache": "^7.14.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/named-placeholders/node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "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/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "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-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
+ "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
+ "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "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/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
+ "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.6.3",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/readline-sync": {
+ "version": "1.4.10",
+ "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
+ "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/router/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/router/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/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.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.5",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "mime-types": "^3.0.1",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/seq-queue": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
+ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "node_modules/sharp": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz",
+ "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.3",
+ "semver": "^7.7.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.1",
+ "@img/sharp-darwin-x64": "0.34.1",
+ "@img/sharp-libvips-darwin-arm64": "1.1.0",
+ "@img/sharp-libvips-darwin-x64": "1.1.0",
+ "@img/sharp-libvips-linux-arm": "1.1.0",
+ "@img/sharp-libvips-linux-arm64": "1.1.0",
+ "@img/sharp-libvips-linux-ppc64": "1.1.0",
+ "@img/sharp-libvips-linux-s390x": "1.1.0",
+ "@img/sharp-libvips-linux-x64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0",
+ "@img/sharp-linux-arm": "0.34.1",
+ "@img/sharp-linux-arm64": "0.34.1",
+ "@img/sharp-linux-s390x": "0.34.1",
+ "@img/sharp-linux-x64": "0.34.1",
+ "@img/sharp-linuxmusl-arm64": "0.34.1",
+ "@img/sharp-linuxmusl-x64": "0.34.1",
+ "@img/sharp-wasm32": "0.34.1",
+ "@img/sharp-win32-ia32": "0.34.1",
+ "@img/sharp-win32-x64": "0.34.1"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/swagger-autogen": {
+ "version": "2.23.7",
+ "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.7.tgz",
+ "integrity": "sha512-vr7uRmuV0DCxWc0wokLJAwX3GwQFJ0jwN+AWk0hKxre2EZwusnkGSGdVFd82u7fQLgwSTnbWkxUL7HXuz5LTZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^7.4.1",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.7",
+ "json5": "^2.2.3"
+ }
+ },
+ "node_modules/swagger-autogen/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.16.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
+ "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "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/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unsafe_encrypt": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unsafe_encrypt/-/unsafe_encrypt-1.0.4.tgz",
+ "integrity": "sha512-n+pxzgOGVM0jslM+aQH20JMuyHXdmOKLUisA2s1XnT/vq4882iTfN+xmZCyfKbtDx/DZ4BizyL/Mw+xM9Ag58A==",
+ "dependencies": {
+ "readline-sync": "^1.4.10"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "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/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
+ "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
}
- }
},
- "express-fileupload": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.1.tgz",
- "integrity": "sha512-LsYG1ALXEB7vlmjuSw8ABeOctMp8a31aUC5ZF55zuz7O2jLFnmJYrCv10py357ky48aEoBQ/9bVXgFynjvaPmA==",
- "requires": {
- "busboy": "^1.6.0"
- }
- },
- "express-useragent": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/express-useragent/-/express-useragent-1.0.15.tgz",
- "integrity": "sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg=="
- },
- "filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "requires": {
- "minimatch": "^5.0.1"
- },
- "dependencies": {
+ "dependencies": {
+ "@emnapi/runtime": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
+ "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "@hcaptcha/types": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@hcaptcha/types/-/types-1.0.4.tgz",
+ "integrity": "sha512-4CBrdr9DFC7sYZPRvLol82UVZVne8B2skBGfMDUqPC6q9vzHMwv/cNxXW44EIa6DaFDr+EWNSnKJpHxWr7Q42Q==",
+ "dev": true
+ },
+ "@img/sharp-darwin-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz",
+ "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-darwin-arm64": "1.1.0"
+ }
+ },
+ "@img/sharp-darwin-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz",
+ "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-darwin-x64": "1.1.0"
+ }
+ },
+ "@img/sharp-libvips-darwin-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz",
+ "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==",
+ "optional": true
+ },
+ "@img/sharp-libvips-darwin-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz",
+ "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==",
+ "optional": true
+ },
+ "@img/sharp-libvips-linux-arm": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz",
+ "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==",
+ "optional": true
+ },
+ "@img/sharp-libvips-linux-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz",
+ "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==",
+ "optional": true
+ },
+ "@img/sharp-libvips-linux-ppc64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz",
+ "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==",
+ "optional": true
+ },
+ "@img/sharp-libvips-linux-s390x": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz",
+ "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==",
+ "optional": true
+ },
+ "@img/sharp-libvips-linux-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz",
+ "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==",
+ "optional": true
+ },
+ "@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz",
+ "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==",
+ "optional": true
+ },
+ "@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz",
+ "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==",
+ "optional": true
+ },
+ "@img/sharp-linux-arm": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz",
+ "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-linux-arm": "1.1.0"
+ }
+ },
+ "@img/sharp-linux-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz",
+ "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-linux-arm64": "1.1.0"
+ }
+ },
+ "@img/sharp-linux-s390x": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz",
+ "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-linux-s390x": "1.1.0"
+ }
+ },
+ "@img/sharp-linux-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz",
+ "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-linux-x64": "1.1.0"
+ }
+ },
+ "@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz",
+ "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0"
+ }
+ },
+ "@img/sharp-linuxmusl-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz",
+ "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==",
+ "optional": true,
+ "requires": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0"
+ }
+ },
+ "@img/sharp-wasm32": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz",
+ "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==",
+ "optional": true,
+ "requires": {
+ "@emnapi/runtime": "^1.4.0"
+ }
+ },
+ "@img/sharp-win32-ia32": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz",
+ "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==",
+ "optional": true
+ },
+ "@img/sharp-win32-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz",
+ "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==",
+ "optional": true
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
+ },
+ "@jridgewell/source-map": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+ "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "requires": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "requires": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "dependencies": {
+ "negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="
+ }
+ }
+ },
+ "acorn": {
+ "version": "8.8.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
+ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA=="
+ },
+ "ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
+ "requires": {
+ "environment": "^1.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "aws-ssl-profiles": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
+ "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "body-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
+ "requires": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.0",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.6.3",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.0",
+ "raw-body": "^3.0.0",
+ "type-is": "^2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "requires": {
+ "ms": "^2.1.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
"brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "requires": {
- "balanced-match": "^1.0.0"
- }
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.1.1"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "requires": {
+ "streamsearch": "^1.1.0"
+ }
+ },
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
+ },
+ "call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ }
+ },
+ "call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ }
+ },
+ "camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "requires": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "requires": {
+ "source-map": "~0.6.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^5.0.0"
+ }
+ },
+ "cli-truncate": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+ "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "dev": true,
+ "requires": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^7.0.0"
+ }
+ },
+ "color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "requires": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "requires": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="
+ },
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
+ "compression": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz",
+ "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
+ "requires": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "content-disposition": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
+ "requires": {
+ "safe-buffer": "5.2.1"
+ }
+ },
+ "content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
+ },
+ "cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="
+ },
+ "cookie-parser": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
+ "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
+ "requires": {
+ "cookie": "0.7.2",
+ "cookie-signature": "1.0.6"
+ },
+ "dependencies": {
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ }
+ }
+ },
+ "cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="
+ },
+ "cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
+ },
+ "denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "detect-libc": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="
+ },
+ "dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "requires": {
+ "jake": "^10.8.5"
+ }
+ },
+ "emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
+ },
+ "entities": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
+ },
+ "environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true
+ },
+ "es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
+ },
+ "es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+ },
+ "es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "requires": {
+ "es-errors": "^1.3.0"
+ }
+ },
+ "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=="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
+ },
+ "eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true
+ },
+ "execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ }
+ },
+ "express": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+ "requires": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.0",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "requires": {
+ "ms": "^2.1.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "express-fileupload": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.1.tgz",
+ "integrity": "sha512-LsYG1ALXEB7vlmjuSw8ABeOctMp8a31aUC5ZF55zuz7O2jLFnmJYrCv10py357ky48aEoBQ/9bVXgFynjvaPmA==",
+ "requires": {
+ "busboy": "^1.6.0"
+ }
+ },
+ "express-useragent": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/express-useragent/-/express-useragent-1.0.15.tgz",
+ "integrity": "sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg=="
+ },
+ "filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "requires": {
+ "minimatch": "^5.0.1"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
+ "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
+ "requires": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "requires": {
+ "ms": "^2.1.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
+ },
+ "fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+ },
+ "generate-function": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+ "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+ "requires": {
+ "is-property": "^1.0.2"
+ }
+ },
+ "get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ }
+ },
+ "get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "requires": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "requires": {
+ "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"
+ }
+ },
+ "gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
+ },
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
+ "hcaptcha": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/hcaptcha/-/hcaptcha-0.2.0.tgz",
+ "integrity": "sha512-x25z3RoEa9oqfyuQsgk2olc+LCNVDAJaGKUP1qFhpAybB6qjqOf4qB2y1E3LJpXDvM229JWEywc6iWnzWvGjNw=="
+ },
+ "html-minifier-terser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
+ "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
+ "requires": {
+ "camel-case": "^4.1.2",
+ "clean-css": "~5.3.2",
+ "commander": "^10.0.0",
+ "entities": "^4.4.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.15.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true
+ },
+ "husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "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=="
+ },
+ "is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
+ },
+ "is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "jake": {
+ "version": "10.8.5",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
+ "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
+ "requires": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+ },
+ "lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true
+ },
+ "lint-staged": {
+ "version": "15.5.1",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.1.tgz",
+ "integrity": "sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^5.4.1",
+ "commander": "^13.1.0",
+ "debug": "^4.4.0",
+ "execa": "^8.0.1",
+ "lilconfig": "^3.1.3",
+ "listr2": "^8.2.5",
+ "micromatch": "^4.0.8",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.2",
+ "yaml": "^2.7.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true
+ },
+ "commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ }
+ }
+ },
+ "listr2": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.2.tgz",
+ "integrity": "sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==",
+ "dev": true,
+ "requires": {
+ "cli-truncate": "^4.0.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^6.1.0",
+ "rfdc": "^1.4.1",
+ "wrap-ansi": "^9.0.0"
+ }
+ },
+ "log-update": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+ "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^7.0.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+ "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+ "dev": true,
+ "requires": {
+ "get-east-asian-width": "^1.0.0"
+ }
+ },
+ "slice-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+ "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ }
+ }
+ }
+ },
+ "lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "lru-cache": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
+ "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A=="
+ },
+ "lru.min": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
+ "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg=="
+ },
+ "math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
+ },
+ "media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="
+ },
+ "merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="
+ },
+ "mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "requires": {
+ "mime-db": "^1.54.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true
+ },
+ "mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true
},
"minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- }
- }
- },
- "finalhandler": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
- "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
- "requires": {
- "debug": "^4.4.0",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "on-finished": "^2.4.1",
- "parseurl": "^1.3.3",
- "statuses": "^2.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "requires": {
- "ms": "^2.1.3"
- }
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
},
"ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- }
- }
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- },
- "fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
- "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- },
- "function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
- },
- "generate-function": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
- "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
- "requires": {
- "is-property": "^1.0.2"
- }
- },
- "get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "requires": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- }
- },
- "get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "requires": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- }
- },
- "glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "requires": {
- "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"
- }
- },
- "gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
- },
- "hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "requires": {
- "function-bind": "^1.1.2"
- }
- },
- "hcaptcha": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/hcaptcha/-/hcaptcha-0.2.0.tgz",
- "integrity": "sha512-x25z3RoEa9oqfyuQsgk2olc+LCNVDAJaGKUP1qFhpAybB6qjqOf4qB2y1E3LJpXDvM229JWEywc6iWnzWvGjNw=="
- },
- "html-minifier-terser": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
- "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
- "requires": {
- "camel-case": "^4.1.2",
- "clean-css": "~5.3.2",
- "commander": "^10.0.0",
- "entities": "^4.4.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.15.1"
- }
- },
- "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==",
- "requires": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- }
- },
- "iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "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=="
- },
- "is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
- },
- "is-promise": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
- "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="
- },
- "is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
- },
- "jake": {
- "version": "10.8.5",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
- "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
- "requires": {
- "async": "^3.2.3",
- "chalk": "^4.0.2",
- "filelist": "^1.0.1",
- "minimatch": "^3.0.4"
- }
- },
- "json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
- },
- "lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "requires": {
- "tslib": "^2.0.3"
- }
- },
- "lru-cache": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
- "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A=="
- },
- "lru.min": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
- "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg=="
- },
- "math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
- },
- "media-typer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
- "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="
- },
- "merge-descriptors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
- "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="
- },
- "mime-db": {
- "version": "1.54.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
- "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="
- },
- "mime-types": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
- "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
- "requires": {
- "mime-db": "^1.54.0"
- }
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mysql2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.0.tgz",
- "integrity": "sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==",
- "requires": {
- "aws-ssl-profiles": "^1.1.1",
- "denque": "^2.1.0",
- "generate-function": "^2.3.1",
- "iconv-lite": "^0.6.3",
- "long": "^5.2.1",
- "lru.min": "^1.0.0",
- "named-placeholders": "^1.1.3",
- "seq-queue": "^0.0.5",
- "sqlstring": "^2.3.2"
- },
- "dependencies": {
- "long": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
- "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
- "sqlstring": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
- "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
- }
- }
- },
- "named-placeholders": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
- "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
- "requires": {
- "lru-cache": "^7.14.1"
- },
- "dependencies": {
- "lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="
- }
- }
- },
- "negotiator": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
- "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="
- },
- "no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "requires": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "object-inspect": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="
- },
- "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==",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "requires": {
- "wrappy": "1"
- }
- },
- "param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "requires": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "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=="
- },
- "path-to-regexp": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
- "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="
- },
- "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==",
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- }
- },
- "qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
- "requires": {
- "side-channel": "^1.1.0"
- }
- },
- "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=="
- },
- "raw-body": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
- "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.6.3",
- "unpipe": "1.0.0"
- }
- },
- "readline-sync": {
- "version": "1.4.10",
- "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
- "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="
- },
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="
- },
- "router": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
- "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
- "requires": {
- "debug": "^4.4.0",
- "depd": "^2.0.0",
- "is-promise": "^4.0.0",
- "parseurl": "^1.3.3",
- "path-to-regexp": "^8.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "requires": {
- "ms": "^2.1.3"
- }
+ "mysql2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.0.tgz",
+ "integrity": "sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==",
+ "requires": {
+ "aws-ssl-profiles": "^1.1.1",
+ "denque": "^2.1.0",
+ "generate-function": "^2.3.1",
+ "iconv-lite": "^0.6.3",
+ "long": "^5.2.1",
+ "lru.min": "^1.0.0",
+ "named-placeholders": "^1.1.3",
+ "seq-queue": "^0.0.5",
+ "sqlstring": "^2.3.2"
+ },
+ "dependencies": {
+ "long": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+ "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
+ },
+ "sqlstring": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+ "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
+ }
+ }
},
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- }
- }
- },
- "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=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="
- },
- "send": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
- "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
- "requires": {
- "debug": "^4.3.5",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "etag": "^1.8.1",
- "fresh": "^2.0.0",
- "http-errors": "^2.0.0",
- "mime-types": "^3.0.1",
- "ms": "^2.1.3",
- "on-finished": "^2.4.1",
- "range-parser": "^1.2.1",
- "statuses": "^2.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "requires": {
- "ms": "^2.1.3"
- }
+ "named-placeholders": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+ "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
+ "requires": {
+ "lru-cache": "^7.14.1"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="
+ }
+ }
},
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ "negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "requires": {
+ "path-key": "^4.0.0"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true
+ }
+ }
+ },
+ "object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="
+ },
+ "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==",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^4.0.0"
+ }
+ },
+ "param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "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=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
+ "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
+ "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+ "dev": true
+ },
+ "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==",
+ "requires": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "requires": {
+ "side-channel": "^1.1.0"
+ }
+ },
+ "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=="
+ },
+ "raw-body": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
+ "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
+ "requires": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.6.3",
+ "unpipe": "1.0.0"
+ }
+ },
+ "readline-sync": {
+ "version": "1.4.10",
+ "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
+ "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="
+ },
+ "restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "dependencies": {
+ "onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "requires": {
+ "mimic-function": "^5.0.0"
+ }
+ }
+ }
+ },
+ "rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true
+ },
+ "router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "requires": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "requires": {
+ "ms": "^2.1.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "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=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="
+ },
+ "send": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
+ "requires": {
+ "debug": "^4.3.5",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "mime-types": "^3.0.1",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "requires": {
+ "ms": "^2.1.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "seq-queue": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
+ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
+ },
+ "serve-static": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
+ "requires": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "sharp": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz",
+ "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==",
+ "requires": {
+ "@img/sharp-darwin-arm64": "0.34.1",
+ "@img/sharp-darwin-x64": "0.34.1",
+ "@img/sharp-libvips-darwin-arm64": "1.1.0",
+ "@img/sharp-libvips-darwin-x64": "1.1.0",
+ "@img/sharp-libvips-linux-arm": "1.1.0",
+ "@img/sharp-libvips-linux-arm64": "1.1.0",
+ "@img/sharp-libvips-linux-ppc64": "1.1.0",
+ "@img/sharp-libvips-linux-s390x": "1.1.0",
+ "@img/sharp-libvips-linux-x64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0",
+ "@img/sharp-linux-arm": "0.34.1",
+ "@img/sharp-linux-arm64": "0.34.1",
+ "@img/sharp-linux-s390x": "0.34.1",
+ "@img/sharp-linux-x64": "0.34.1",
+ "@img/sharp-linuxmusl-arm64": "0.34.1",
+ "@img/sharp-linuxmusl-x64": "0.34.1",
+ "@img/sharp-wasm32": "0.34.1",
+ "@img/sharp-win32-ia32": "0.34.1",
+ "@img/sharp-win32-x64": "0.34.1",
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.3",
+ "semver": "^7.7.1"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ }
+ },
+ "side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ }
+ },
+ "signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true
+ },
+ "simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "requires": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
+ },
+ "streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
+ },
+ "string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ },
+ "strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "swagger-autogen": {
+ "version": "2.23.7",
+ "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.7.tgz",
+ "integrity": "sha512-vr7uRmuV0DCxWc0wokLJAwX3GwQFJ0jwN+AWk0hKxre2EZwusnkGSGdVFd82u7fQLgwSTnbWkxUL7HXuz5LTZQ==",
+ "requires": {
+ "acorn": "^7.4.1",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.7",
+ "json5": "^2.2.3"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+ }
+ }
+ },
+ "terser": {
+ "version": "5.16.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
+ "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
+ "requires": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
+ },
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "requires": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ }
+ },
+ "uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
+ },
+ "unsafe_encrypt": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unsafe_encrypt/-/unsafe_encrypt-1.0.4.tgz",
+ "integrity": "sha512-n+pxzgOGVM0jslM+aQH20JMuyHXdmOKLUisA2s1XnT/vq4882iTfN+xmZCyfKbtDx/DZ4BizyL/Mw+xM9Ag58A==",
+ "requires": {
+ "readline-sync": "^1.4.10"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
+ "requires": {}
+ },
+ "yaml": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
+ "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+ "dev": true
}
- }
- },
- "seq-queue": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
- "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
- },
- "serve-static": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
- "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
- "requires": {
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "parseurl": "^1.3.3",
- "send": "^1.2.0"
- }
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "sharp": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz",
- "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==",
- "requires": {
- "@img/sharp-darwin-arm64": "0.34.1",
- "@img/sharp-darwin-x64": "0.34.1",
- "@img/sharp-libvips-darwin-arm64": "1.1.0",
- "@img/sharp-libvips-darwin-x64": "1.1.0",
- "@img/sharp-libvips-linux-arm": "1.1.0",
- "@img/sharp-libvips-linux-arm64": "1.1.0",
- "@img/sharp-libvips-linux-ppc64": "1.1.0",
- "@img/sharp-libvips-linux-s390x": "1.1.0",
- "@img/sharp-libvips-linux-x64": "1.1.0",
- "@img/sharp-libvips-linuxmusl-arm64": "1.1.0",
- "@img/sharp-libvips-linuxmusl-x64": "1.1.0",
- "@img/sharp-linux-arm": "0.34.1",
- "@img/sharp-linux-arm64": "0.34.1",
- "@img/sharp-linux-s390x": "0.34.1",
- "@img/sharp-linux-x64": "0.34.1",
- "@img/sharp-linuxmusl-arm64": "0.34.1",
- "@img/sharp-linuxmusl-x64": "0.34.1",
- "@img/sharp-wasm32": "0.34.1",
- "@img/sharp-win32-ia32": "0.34.1",
- "@img/sharp-win32-x64": "0.34.1",
- "color": "^4.2.3",
- "detect-libc": "^2.0.3",
- "semver": "^7.7.1"
- }
- },
- "side-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "requires": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3",
- "side-channel-list": "^1.0.0",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- }
- },
- "side-channel-list": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "requires": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3"
- }
- },
- "side-channel-map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "requires": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3"
- }
- },
- "side-channel-weakmap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "requires": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3",
- "side-channel-map": "^1.0.1"
- }
- },
- "simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
- "requires": {
- "is-arrayish": "^0.3.1"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- },
- "streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "swagger-autogen": {
- "version": "2.23.7",
- "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.7.tgz",
- "integrity": "sha512-vr7uRmuV0DCxWc0wokLJAwX3GwQFJ0jwN+AWk0hKxre2EZwusnkGSGdVFd82u7fQLgwSTnbWkxUL7HXuz5LTZQ==",
- "requires": {
- "acorn": "^7.4.1",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.7",
- "json5": "^2.2.3"
- },
- "dependencies": {
- "acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
- }
- }
- },
- "terser": {
- "version": "5.16.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
- "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
- "requires": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- }
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
- },
- "tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- },
- "type-is": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
- "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
- "requires": {
- "content-type": "^1.0.5",
- "media-typer": "^1.1.0",
- "mime-types": "^3.0.0"
- }
- },
- "uglify-js": {
- "version": "3.19.3",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
- "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
- },
- "unsafe_encrypt": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unsafe_encrypt/-/unsafe_encrypt-1.0.4.tgz",
- "integrity": "sha512-n+pxzgOGVM0jslM+aQH20JMuyHXdmOKLUisA2s1XnT/vq4882iTfN+xmZCyfKbtDx/DZ4BizyL/Mw+xM9Ag58A==",
- "requires": {
- "readline-sync": "^1.4.10"
- }
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- },
- "ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
- "requires": {}
}
- }
}
diff --git a/package.json b/package.json
index 8f26791..5418d78 100644
--- a/package.json
+++ b/package.json
@@ -1,44 +1,51 @@
{
- "dependencies": {
- "body-parser": "^2.2",
- "clean-css": "^5.3",
- "compression": "^1.8",
- "cookie-parser": "^1.4",
- "ejs": "^3.1",
- "express": "^5.1",
- "express-fileupload": "^1.5",
- "express-useragent": "^1.0",
- "hcaptcha": "^0.2",
- "html-minifier-terser": "^7.2.0",
- "lru-cache": "^11.1",
- "mysql2": "^3.14",
- "sharp": "^0.34",
- "swagger-autogen": "^2.23",
- "uglify-js": "^3.19",
- "unsafe_encrypt": "^1.0.4",
- "ws": "^8.13.0",
- "cookie-signature": "^1.2.2"
- },
- "scripts": {
- "start": "node server.js",
- "test": "node tests"
- },
- "type": "module",
- "name": "ipost",
- "description": "IPost is a revolutionary open-source chatting platform featuring an innovative design",
- "version": "1.0.0",
- "main": "server.js",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/002Hub/IPost.git"
- },
- "author": "",
- "license": "ISC",
- "bugs": {
- "url": "https://github.com/002Hub/IPost/issues"
- },
- "homepage": "https://github.com/002Hub/IPost#readme",
- "devDependencies": {
- "@hcaptcha/types": "^1.0.3"
- }
+ "dependencies": {
+ "body-parser": "^2.2",
+ "clean-css": "^5.3",
+ "compression": "^1.8",
+ "cookie-parser": "^1.4",
+ "cookie-signature": "^1.2.2",
+ "ejs": "^3.1",
+ "express": "^5.1",
+ "express-fileupload": "^1.5",
+ "express-useragent": "^1.0",
+ "hcaptcha": "^0.2",
+ "html-minifier-terser": "^7.2.0",
+ "lru-cache": "^11.1",
+ "mysql2": "^3.14",
+ "sharp": "^0.34",
+ "swagger-autogen": "^2.23",
+ "uglify-js": "^3.19",
+ "unsafe_encrypt": "^1.0.4",
+ "ws": "^8.18"
+ },
+ "scripts": {
+ "start": "node server.js",
+ "test": "node tests",
+ "prepare": "husky install"
+ },
+ "type": "module",
+ "name": "ipost",
+ "description": "IPost is a revolutionary open-source chatting platform featuring an innovative design",
+ "version": "1.0.0",
+ "main": "server.js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/002Hub/IPost.git"
+ },
+ "author": "",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/002Hub/IPost/issues"
+ },
+ "homepage": "https://github.com/002Hub/IPost#readme",
+ "devDependencies": {
+ "@hcaptcha/types": "^1.0.3",
+ "husky": "^9.1.7",
+ "lint-staged": "^15.5.1",
+ "prettier": "^3.5"
+ },
+ "lint-staged": {
+ "*.{js,css,md}": "prettier --write"
+ }
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1de795f..ced2923 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,11 +1,10 @@
-lockfileVersion: '9.0'
+lockfileVersion: "9.0"
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
-
.:
dependencies:
body-parser:
@@ -63,703 +62,1218 @@ importers:
specifier: ^8.13.0
version: 8.18.1
devDependencies:
- '@hcaptcha/types':
+ "@hcaptcha/types":
specifier: ^1.0.3
version: 1.0.4
packages:
+ "@emnapi/runtime@1.4.3":
+ resolution:
+ {
+ integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==,
+ }
- '@emnapi/runtime@1.4.3':
- resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==}
+ "@hcaptcha/types@1.0.4":
+ resolution:
+ {
+ integrity: sha512-4CBrdr9DFC7sYZPRvLol82UVZVne8B2skBGfMDUqPC6q9vzHMwv/cNxXW44EIa6DaFDr+EWNSnKJpHxWr7Q42Q==,
+ }
- '@hcaptcha/types@1.0.4':
- resolution: {integrity: sha512-4CBrdr9DFC7sYZPRvLol82UVZVne8B2skBGfMDUqPC6q9vzHMwv/cNxXW44EIa6DaFDr+EWNSnKJpHxWr7Q42Q==}
-
- '@img/sharp-darwin-arm64@0.34.1':
- resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-darwin-arm64@0.34.1":
+ resolution:
+ {
+ integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [arm64]
os: [darwin]
- '@img/sharp-darwin-x64@0.34.1':
- resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-darwin-x64@0.34.1":
+ resolution:
+ {
+ integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-darwin-arm64@1.1.0':
- resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==}
+ "@img/sharp-libvips-darwin-arm64@1.1.0":
+ resolution:
+ {
+ integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==,
+ }
cpu: [arm64]
os: [darwin]
- '@img/sharp-libvips-darwin-x64@1.1.0':
- resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==}
+ "@img/sharp-libvips-darwin-x64@1.1.0":
+ resolution:
+ {
+ integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==,
+ }
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-linux-arm64@1.1.0':
- resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==}
+ "@img/sharp-libvips-linux-arm64@1.1.0":
+ resolution:
+ {
+ integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==,
+ }
cpu: [arm64]
os: [linux]
- '@img/sharp-libvips-linux-arm@1.1.0':
- resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==}
+ "@img/sharp-libvips-linux-arm@1.1.0":
+ resolution:
+ {
+ integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==,
+ }
cpu: [arm]
os: [linux]
- '@img/sharp-libvips-linux-ppc64@1.1.0':
- resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==}
+ "@img/sharp-libvips-linux-ppc64@1.1.0":
+ resolution:
+ {
+ integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==,
+ }
cpu: [ppc64]
os: [linux]
- '@img/sharp-libvips-linux-s390x@1.1.0':
- resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==}
+ "@img/sharp-libvips-linux-s390x@1.1.0":
+ resolution:
+ {
+ integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==,
+ }
cpu: [s390x]
os: [linux]
- '@img/sharp-libvips-linux-x64@1.1.0':
- resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==}
+ "@img/sharp-libvips-linux-x64@1.1.0":
+ resolution:
+ {
+ integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==,
+ }
cpu: [x64]
os: [linux]
- '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
- resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==}
+ "@img/sharp-libvips-linuxmusl-arm64@1.1.0":
+ resolution:
+ {
+ integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==,
+ }
cpu: [arm64]
os: [linux]
- '@img/sharp-libvips-linuxmusl-x64@1.1.0':
- resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==}
+ "@img/sharp-libvips-linuxmusl-x64@1.1.0":
+ resolution:
+ {
+ integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==,
+ }
cpu: [x64]
os: [linux]
- '@img/sharp-linux-arm64@0.34.1':
- resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-linux-arm64@0.34.1":
+ resolution:
+ {
+ integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [arm64]
os: [linux]
- '@img/sharp-linux-arm@0.34.1':
- resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-linux-arm@0.34.1":
+ resolution:
+ {
+ integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [arm]
os: [linux]
- '@img/sharp-linux-s390x@0.34.1':
- resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-linux-s390x@0.34.1":
+ resolution:
+ {
+ integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [s390x]
os: [linux]
- '@img/sharp-linux-x64@0.34.1':
- resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-linux-x64@0.34.1":
+ resolution:
+ {
+ integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [x64]
os: [linux]
- '@img/sharp-linuxmusl-arm64@0.34.1':
- resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-linuxmusl-arm64@0.34.1":
+ resolution:
+ {
+ integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [arm64]
os: [linux]
- '@img/sharp-linuxmusl-x64@0.34.1':
- resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-linuxmusl-x64@0.34.1":
+ resolution:
+ {
+ integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [x64]
os: [linux]
- '@img/sharp-wasm32@0.34.1':
- resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-wasm32@0.34.1":
+ resolution:
+ {
+ integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [wasm32]
- '@img/sharp-win32-ia32@0.34.1':
- resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-win32-ia32@0.34.1":
+ resolution:
+ {
+ integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [ia32]
os: [win32]
- '@img/sharp-win32-x64@0.34.1':
- resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ "@img/sharp-win32-x64@0.34.1":
+ resolution:
+ {
+ integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
cpu: [x64]
os: [win32]
- '@jridgewell/gen-mapping@0.3.8':
- resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
- engines: {node: '>=6.0.0'}
+ "@jridgewell/gen-mapping@0.3.8":
+ resolution:
+ {
+ integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==,
+ }
+ engines: { node: ">=6.0.0" }
- '@jridgewell/resolve-uri@3.1.2':
- resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
- engines: {node: '>=6.0.0'}
+ "@jridgewell/resolve-uri@3.1.2":
+ resolution:
+ {
+ integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==,
+ }
+ engines: { node: ">=6.0.0" }
- '@jridgewell/set-array@1.2.1':
- resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
- engines: {node: '>=6.0.0'}
+ "@jridgewell/set-array@1.2.1":
+ resolution:
+ {
+ integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==,
+ }
+ engines: { node: ">=6.0.0" }
- '@jridgewell/source-map@0.3.6':
- resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+ "@jridgewell/source-map@0.3.6":
+ resolution:
+ {
+ integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==,
+ }
- '@jridgewell/sourcemap-codec@1.5.0':
- resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+ "@jridgewell/sourcemap-codec@1.5.0":
+ resolution:
+ {
+ integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==,
+ }
- '@jridgewell/trace-mapping@0.3.25':
- resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ "@jridgewell/trace-mapping@0.3.25":
+ resolution:
+ {
+ integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==,
+ }
accepts@2.0.0:
- resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==,
+ }
+ engines: { node: ">= 0.6" }
acorn@7.4.1:
- resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
- engines: {node: '>=0.4.0'}
+ resolution:
+ {
+ integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==,
+ }
+ engines: { node: ">=0.4.0" }
hasBin: true
acorn@8.14.1:
- resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
- engines: {node: '>=0.4.0'}
+ resolution:
+ {
+ integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==,
+ }
+ engines: { node: ">=0.4.0" }
hasBin: true
ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==,
+ }
+ engines: { node: ">=8" }
async@3.2.6:
- resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+ resolution:
+ {
+ integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==,
+ }
aws-ssl-profiles@1.1.2:
- resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==}
- engines: {node: '>= 6.0.0'}
+ resolution:
+ {
+ integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==,
+ }
+ engines: { node: ">= 6.0.0" }
balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ resolution:
+ {
+ integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==,
+ }
body-parser@2.2.0:
- resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
- engines: {node: '>=18'}
+ resolution:
+ {
+ integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==,
+ }
+ engines: { node: ">=18" }
brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ resolution:
+ {
+ integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==,
+ }
brace-expansion@2.0.1:
- resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ resolution:
+ {
+ integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==,
+ }
buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ resolution:
+ {
+ integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==,
+ }
busboy@1.6.0:
- resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
- engines: {node: '>=10.16.0'}
+ resolution:
+ {
+ integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==,
+ }
+ engines: { node: ">=10.16.0" }
bytes@3.1.2:
- resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==,
+ }
+ engines: { node: ">= 0.8" }
call-bind-apply-helpers@1.0.2:
- resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==,
+ }
+ engines: { node: ">= 0.4" }
call-bound@1.0.4:
- resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==,
+ }
+ engines: { node: ">= 0.4" }
camel-case@4.1.2:
- resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+ resolution:
+ {
+ integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==,
+ }
chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==,
+ }
+ engines: { node: ">=10" }
clean-css@5.3.3:
- resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
- engines: {node: '>= 10.0'}
+ resolution:
+ {
+ integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==,
+ }
+ engines: { node: ">= 10.0" }
color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
+ resolution:
+ {
+ integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==,
+ }
+ engines: { node: ">=7.0.0" }
color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ resolution:
+ {
+ integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==,
+ }
color-string@1.9.1:
- resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ resolution:
+ {
+ integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==,
+ }
color@4.2.3:
- resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
- engines: {node: '>=12.5.0'}
+ resolution:
+ {
+ integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==,
+ }
+ engines: { node: ">=12.5.0" }
commander@10.0.1:
- resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
- engines: {node: '>=14'}
+ resolution:
+ {
+ integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==,
+ }
+ engines: { node: ">=14" }
commander@2.20.3:
- resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ resolution:
+ {
+ integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==,
+ }
compressible@2.0.18:
- resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==,
+ }
+ engines: { node: ">= 0.6" }
compression@1.8.0:
- resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==}
- engines: {node: '>= 0.8.0'}
+ resolution:
+ {
+ integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==,
+ }
+ engines: { node: ">= 0.8.0" }
concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ resolution:
+ {
+ integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==,
+ }
content-disposition@1.0.0:
- resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==,
+ }
+ engines: { node: ">= 0.6" }
content-type@1.0.5:
- resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==,
+ }
+ engines: { node: ">= 0.6" }
cookie-parser@1.4.7:
- resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==}
- engines: {node: '>= 0.8.0'}
+ resolution:
+ {
+ integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==,
+ }
+ engines: { node: ">= 0.8.0" }
cookie-signature@1.0.6:
- resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+ resolution:
+ {
+ integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==,
+ }
cookie-signature@1.2.2:
- resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
- engines: {node: '>=6.6.0'}
+ resolution:
+ {
+ integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==,
+ }
+ engines: { node: ">=6.6.0" }
cookie@0.7.2:
- resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==,
+ }
+ engines: { node: ">= 0.6" }
debug@2.6.9:
- resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ resolution:
+ {
+ integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==,
+ }
peerDependencies:
- supports-color: '*'
+ supports-color: "*"
peerDependenciesMeta:
supports-color:
optional: true
debug@4.4.0:
- resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
- engines: {node: '>=6.0'}
+ resolution:
+ {
+ integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==,
+ }
+ engines: { node: ">=6.0" }
peerDependencies:
- supports-color: '*'
+ supports-color: "*"
peerDependenciesMeta:
supports-color:
optional: true
deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==,
+ }
+ engines: { node: ">=0.10.0" }
denque@2.1.0:
- resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
- engines: {node: '>=0.10'}
+ resolution:
+ {
+ integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==,
+ }
+ engines: { node: ">=0.10" }
depd@2.0.0:
- resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==,
+ }
+ engines: { node: ">= 0.8" }
detect-libc@2.0.4:
- resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==,
+ }
+ engines: { node: ">=8" }
dot-case@3.0.4:
- resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ resolution:
+ {
+ integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==,
+ }
dunder-proto@1.0.1:
- resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==,
+ }
+ engines: { node: ">= 0.4" }
ee-first@1.1.1:
- resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ resolution:
+ {
+ integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==,
+ }
ejs@3.1.10:
- resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==,
+ }
+ engines: { node: ">=0.10.0" }
hasBin: true
encodeurl@2.0.0:
- resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==,
+ }
+ engines: { node: ">= 0.8" }
entities@4.5.0:
- resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
- engines: {node: '>=0.12'}
+ resolution:
+ {
+ integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==,
+ }
+ engines: { node: ">=0.12" }
es-define-property@1.0.1:
- resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==,
+ }
+ engines: { node: ">= 0.4" }
es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==,
+ }
+ engines: { node: ">= 0.4" }
es-object-atoms@1.1.1:
- resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==,
+ }
+ engines: { node: ">= 0.4" }
escape-html@1.0.3:
- resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+ resolution:
+ {
+ integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==,
+ }
etag@1.8.1:
- resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==,
+ }
+ engines: { node: ">= 0.6" }
express-fileupload@1.5.1:
- resolution: {integrity: sha512-LsYG1ALXEB7vlmjuSw8ABeOctMp8a31aUC5ZF55zuz7O2jLFnmJYrCv10py357ky48aEoBQ/9bVXgFynjvaPmA==}
- engines: {node: '>=12.0.0'}
+ resolution:
+ {
+ integrity: sha512-LsYG1ALXEB7vlmjuSw8ABeOctMp8a31aUC5ZF55zuz7O2jLFnmJYrCv10py357ky48aEoBQ/9bVXgFynjvaPmA==,
+ }
+ engines: { node: ">=12.0.0" }
express-useragent@1.0.15:
- resolution: {integrity: sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg==}
- engines: {node: '>=4.5'}
+ resolution:
+ {
+ integrity: sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg==,
+ }
+ engines: { node: ">=4.5" }
express@5.1.0:
- resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
- engines: {node: '>= 18'}
+ resolution:
+ {
+ integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==,
+ }
+ engines: { node: ">= 18" }
filelist@1.0.4:
- resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+ resolution:
+ {
+ integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==,
+ }
finalhandler@2.1.0:
- resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==,
+ }
+ engines: { node: ">= 0.8" }
forwarded@0.2.0:
- resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==,
+ }
+ engines: { node: ">= 0.6" }
fresh@2.0.0:
- resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==,
+ }
+ engines: { node: ">= 0.8" }
fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ resolution:
+ {
+ integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==,
+ }
function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ resolution:
+ {
+ integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==,
+ }
generate-function@2.3.1:
- resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
+ resolution:
+ {
+ integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==,
+ }
get-intrinsic@1.3.0:
- resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==,
+ }
+ engines: { node: ">= 0.4" }
get-proto@1.0.1:
- resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==,
+ }
+ engines: { node: ">= 0.4" }
glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ resolution:
+ {
+ integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==,
+ }
deprecated: Glob versions prior to v9 are no longer supported
gopd@1.2.0:
- resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==,
+ }
+ engines: { node: ">= 0.4" }
has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==,
+ }
+ engines: { node: ">=8" }
has-symbols@1.1.0:
- resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==,
+ }
+ engines: { node: ">= 0.4" }
hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==,
+ }
+ engines: { node: ">= 0.4" }
hcaptcha@0.2.0:
- resolution: {integrity: sha512-x25z3RoEa9oqfyuQsgk2olc+LCNVDAJaGKUP1qFhpAybB6qjqOf4qB2y1E3LJpXDvM229JWEywc6iWnzWvGjNw==}
+ resolution:
+ {
+ integrity: sha512-x25z3RoEa9oqfyuQsgk2olc+LCNVDAJaGKUP1qFhpAybB6qjqOf4qB2y1E3LJpXDvM229JWEywc6iWnzWvGjNw==,
+ }
html-minifier-terser@7.2.0:
- resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==}
- engines: {node: ^14.13.1 || >=16.0.0}
+ resolution:
+ {
+ integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==,
+ }
+ engines: { node: ^14.13.1 || >=16.0.0 }
hasBin: true
http-errors@2.0.0:
- resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==,
+ }
+ engines: { node: ">= 0.8" }
iconv-lite@0.6.3:
- resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==,
+ }
+ engines: { node: ">=0.10.0" }
inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ resolution:
+ {
+ 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.
inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ resolution:
+ {
+ integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==,
+ }
ipaddr.js@1.9.1:
- resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
- engines: {node: '>= 0.10'}
+ resolution:
+ {
+ integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==,
+ }
+ engines: { node: ">= 0.10" }
is-arrayish@0.3.2:
- resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+ resolution:
+ {
+ integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==,
+ }
is-promise@4.0.0:
- resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+ resolution:
+ {
+ integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==,
+ }
is-property@1.0.2:
- resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
+ resolution:
+ {
+ integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==,
+ }
jake@10.9.2:
- resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==,
+ }
+ engines: { node: ">=10" }
hasBin: true
json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
+ resolution:
+ {
+ integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==,
+ }
+ engines: { node: ">=6" }
hasBin: true
long@5.3.2:
- resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+ resolution:
+ {
+ integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==,
+ }
lower-case@2.0.2:
- resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+ resolution:
+ {
+ integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==,
+ }
lru-cache@11.1.0:
- resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==}
- engines: {node: 20 || >=22}
+ resolution:
+ {
+ integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==,
+ }
+ engines: { node: 20 || >=22 }
lru-cache@7.18.3:
- resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
- engines: {node: '>=12'}
+ resolution:
+ {
+ integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==,
+ }
+ engines: { node: ">=12" }
lru.min@1.1.2:
- resolution: {integrity: sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==}
- engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'}
+ resolution:
+ {
+ integrity: sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==,
+ }
+ engines: { bun: ">=1.0.0", deno: ">=1.30.0", node: ">=8.0.0" }
math-intrinsics@1.1.0:
- resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==,
+ }
+ engines: { node: ">= 0.4" }
media-typer@1.1.0:
- resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==,
+ }
+ engines: { node: ">= 0.8" }
merge-descriptors@2.0.0:
- resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
- engines: {node: '>=18'}
+ resolution:
+ {
+ integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==,
+ }
+ engines: { node: ">=18" }
mime-db@1.54.0:
- resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==,
+ }
+ engines: { node: ">= 0.6" }
mime-types@3.0.1:
- resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==,
+ }
+ engines: { node: ">= 0.6" }
minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ resolution:
+ {
+ integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==,
+ }
minimatch@5.1.6:
- resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==,
+ }
+ engines: { node: ">=10" }
ms@2.0.0:
- resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ resolution:
+ {
+ integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==,
+ }
ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ resolution:
+ {
+ integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==,
+ }
mysql2@3.14.0:
- resolution: {integrity: sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==}
- engines: {node: '>= 8.0'}
+ resolution:
+ {
+ integrity: sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==,
+ }
+ engines: { node: ">= 8.0" }
named-placeholders@1.1.3:
- resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==}
- engines: {node: '>=12.0.0'}
+ resolution:
+ {
+ integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==,
+ }
+ engines: { node: ">=12.0.0" }
negotiator@0.6.4:
- resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==,
+ }
+ engines: { node: ">= 0.6" }
negotiator@1.0.0:
- resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==,
+ }
+ engines: { node: ">= 0.6" }
no-case@3.0.4:
- resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+ resolution:
+ {
+ integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==,
+ }
object-inspect@1.13.4:
- resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==,
+ }
+ engines: { node: ">= 0.4" }
on-finished@2.4.1:
- resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==,
+ }
+ engines: { node: ">= 0.8" }
on-headers@1.0.2:
- resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==,
+ }
+ engines: { node: ">= 0.8" }
once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ resolution:
+ {
+ integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==,
+ }
param-case@3.0.4:
- resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+ resolution:
+ {
+ integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==,
+ }
parseurl@1.3.3:
- resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==,
+ }
+ engines: { node: ">= 0.8" }
pascal-case@3.1.2:
- resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ resolution:
+ {
+ integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==,
+ }
path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==,
+ }
+ engines: { node: ">=0.10.0" }
path-to-regexp@8.2.0:
- resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
- engines: {node: '>=16'}
+ resolution:
+ {
+ integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==,
+ }
+ engines: { node: ">=16" }
proxy-addr@2.0.7:
- resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
- engines: {node: '>= 0.10'}
+ resolution:
+ {
+ integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==,
+ }
+ engines: { node: ">= 0.10" }
qs@6.14.0:
- resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
- engines: {node: '>=0.6'}
+ resolution:
+ {
+ integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==,
+ }
+ engines: { node: ">=0.6" }
range-parser@1.2.1:
- resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==,
+ }
+ engines: { node: ">= 0.6" }
raw-body@3.0.0:
- resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==,
+ }
+ engines: { node: ">= 0.8" }
readline-sync@1.4.10:
- resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==}
- engines: {node: '>= 0.8.0'}
+ resolution:
+ {
+ integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==,
+ }
+ engines: { node: ">= 0.8.0" }
relateurl@0.2.7:
- resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
- engines: {node: '>= 0.10'}
+ resolution:
+ {
+ integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==,
+ }
+ engines: { node: ">= 0.10" }
router@2.2.0:
- resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
- engines: {node: '>= 18'}
+ resolution:
+ {
+ integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==,
+ }
+ engines: { node: ">= 18" }
safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ resolution:
+ {
+ integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==,
+ }
safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ resolution:
+ {
+ integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==,
+ }
semver@7.7.1:
- resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==,
+ }
+ engines: { node: ">=10" }
hasBin: true
send@1.2.0:
- resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
- engines: {node: '>= 18'}
+ resolution:
+ {
+ integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==,
+ }
+ engines: { node: ">= 18" }
seq-queue@0.0.5:
- resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==}
+ resolution:
+ {
+ integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==,
+ }
serve-static@2.2.0:
- resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
- engines: {node: '>= 18'}
+ resolution:
+ {
+ integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==,
+ }
+ engines: { node: ">= 18" }
setprototypeof@1.2.0:
- resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ resolution:
+ {
+ integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==,
+ }
sharp@0.34.1:
- resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ resolution:
+ {
+ integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==,
+ }
+ engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 }
side-channel-list@1.0.0:
- resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==,
+ }
+ engines: { node: ">= 0.4" }
side-channel-map@1.0.1:
- resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==,
+ }
+ engines: { node: ">= 0.4" }
side-channel-weakmap@1.0.2:
- resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==,
+ }
+ engines: { node: ">= 0.4" }
side-channel@1.1.0:
- resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==,
+ }
+ engines: { node: ">= 0.4" }
simple-swizzle@0.2.2:
- resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+ resolution:
+ {
+ integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==,
+ }
source-map-support@0.5.21:
- resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ resolution:
+ {
+ integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==,
+ }
source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==,
+ }
+ engines: { node: ">=0.10.0" }
sqlstring@2.3.3:
- resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==,
+ }
+ engines: { node: ">= 0.6" }
statuses@2.0.1:
- resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==,
+ }
+ engines: { node: ">= 0.8" }
streamsearch@1.1.0:
- resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
- engines: {node: '>=10.0.0'}
+ resolution:
+ {
+ integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==,
+ }
+ engines: { node: ">=10.0.0" }
supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==,
+ }
+ engines: { node: ">=8" }
swagger-autogen@2.23.7:
- resolution: {integrity: sha512-vr7uRmuV0DCxWc0wokLJAwX3GwQFJ0jwN+AWk0hKxre2EZwusnkGSGdVFd82u7fQLgwSTnbWkxUL7HXuz5LTZQ==}
+ resolution:
+ {
+ integrity: sha512-vr7uRmuV0DCxWc0wokLJAwX3GwQFJ0jwN+AWk0hKxre2EZwusnkGSGdVFd82u7fQLgwSTnbWkxUL7HXuz5LTZQ==,
+ }
terser@5.39.0:
- resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==,
+ }
+ engines: { node: ">=10" }
hasBin: true
toidentifier@1.0.1:
- resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
- engines: {node: '>=0.6'}
+ resolution:
+ {
+ integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==,
+ }
+ engines: { node: ">=0.6" }
tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ resolution:
+ {
+ integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==,
+ }
type-is@2.0.1:
- resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
- engines: {node: '>= 0.6'}
+ resolution:
+ {
+ integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==,
+ }
+ engines: { node: ">= 0.6" }
uglify-js@3.19.3:
- resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
- engines: {node: '>=0.8.0'}
+ resolution:
+ {
+ integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==,
+ }
+ engines: { node: ">=0.8.0" }
hasBin: true
unpipe@1.0.0:
- resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==,
+ }
+ engines: { node: ">= 0.8" }
unsafe_encrypt@1.0.4:
- resolution: {integrity: sha512-n+pxzgOGVM0jslM+aQH20JMuyHXdmOKLUisA2s1XnT/vq4882iTfN+xmZCyfKbtDx/DZ4BizyL/Mw+xM9Ag58A==}
+ resolution:
+ {
+ integrity: sha512-n+pxzgOGVM0jslM+aQH20JMuyHXdmOKLUisA2s1XnT/vq4882iTfN+xmZCyfKbtDx/DZ4BizyL/Mw+xM9Ag58A==,
+ }
vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
+ resolution:
+ {
+ integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==,
+ }
+ engines: { node: ">= 0.8" }
wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ resolution:
+ {
+ integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==,
+ }
ws@8.18.1:
- resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==}
- engines: {node: '>=10.0.0'}
+ resolution:
+ {
+ integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==,
+ }
+ engines: { node: ">=10.0.0" }
peerDependencies:
bufferutil: ^4.0.1
- utf-8-validate: '>=5.0.2'
+ utf-8-validate: ">=5.0.2"
peerDependenciesMeta:
bufferutil:
optional: true
@@ -767,113 +1281,112 @@ packages:
optional: true
snapshots:
-
- '@emnapi/runtime@1.4.3':
+ "@emnapi/runtime@1.4.3":
dependencies:
tslib: 2.8.1
optional: true
- '@hcaptcha/types@1.0.4': {}
+ "@hcaptcha/types@1.0.4": {}
- '@img/sharp-darwin-arm64@0.34.1':
+ "@img/sharp-darwin-arm64@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.1.0
+ "@img/sharp-libvips-darwin-arm64": 1.1.0
optional: true
- '@img/sharp-darwin-x64@0.34.1':
+ "@img/sharp-darwin-x64@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.1.0
+ "@img/sharp-libvips-darwin-x64": 1.1.0
optional: true
- '@img/sharp-libvips-darwin-arm64@1.1.0':
+ "@img/sharp-libvips-darwin-arm64@1.1.0":
optional: true
- '@img/sharp-libvips-darwin-x64@1.1.0':
+ "@img/sharp-libvips-darwin-x64@1.1.0":
optional: true
- '@img/sharp-libvips-linux-arm64@1.1.0':
+ "@img/sharp-libvips-linux-arm64@1.1.0":
optional: true
- '@img/sharp-libvips-linux-arm@1.1.0':
+ "@img/sharp-libvips-linux-arm@1.1.0":
optional: true
- '@img/sharp-libvips-linux-ppc64@1.1.0':
+ "@img/sharp-libvips-linux-ppc64@1.1.0":
optional: true
- '@img/sharp-libvips-linux-s390x@1.1.0':
+ "@img/sharp-libvips-linux-s390x@1.1.0":
optional: true
- '@img/sharp-libvips-linux-x64@1.1.0':
+ "@img/sharp-libvips-linux-x64@1.1.0":
optional: true
- '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
+ "@img/sharp-libvips-linuxmusl-arm64@1.1.0":
optional: true
- '@img/sharp-libvips-linuxmusl-x64@1.1.0':
+ "@img/sharp-libvips-linuxmusl-x64@1.1.0":
optional: true
- '@img/sharp-linux-arm64@0.34.1':
+ "@img/sharp-linux-arm64@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.1.0
+ "@img/sharp-libvips-linux-arm64": 1.1.0
optional: true
- '@img/sharp-linux-arm@0.34.1':
+ "@img/sharp-linux-arm@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.1.0
+ "@img/sharp-libvips-linux-arm": 1.1.0
optional: true
- '@img/sharp-linux-s390x@0.34.1':
+ "@img/sharp-linux-s390x@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.1.0
+ "@img/sharp-libvips-linux-s390x": 1.1.0
optional: true
- '@img/sharp-linux-x64@0.34.1':
+ "@img/sharp-linux-x64@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.1.0
+ "@img/sharp-libvips-linux-x64": 1.1.0
optional: true
- '@img/sharp-linuxmusl-arm64@0.34.1':
+ "@img/sharp-linuxmusl-arm64@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
+ "@img/sharp-libvips-linuxmusl-arm64": 1.1.0
optional: true
- '@img/sharp-linuxmusl-x64@0.34.1':
+ "@img/sharp-linuxmusl-x64@0.34.1":
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.1.0
+ "@img/sharp-libvips-linuxmusl-x64": 1.1.0
optional: true
- '@img/sharp-wasm32@0.34.1':
+ "@img/sharp-wasm32@0.34.1":
dependencies:
- '@emnapi/runtime': 1.4.3
+ "@emnapi/runtime": 1.4.3
optional: true
- '@img/sharp-win32-ia32@0.34.1':
+ "@img/sharp-win32-ia32@0.34.1":
optional: true
- '@img/sharp-win32-x64@0.34.1':
+ "@img/sharp-win32-x64@0.34.1":
optional: true
- '@jridgewell/gen-mapping@0.3.8':
+ "@jridgewell/gen-mapping@0.3.8":
dependencies:
- '@jridgewell/set-array': 1.2.1
- '@jridgewell/sourcemap-codec': 1.5.0
- '@jridgewell/trace-mapping': 0.3.25
+ "@jridgewell/set-array": 1.2.1
+ "@jridgewell/sourcemap-codec": 1.5.0
+ "@jridgewell/trace-mapping": 0.3.25
- '@jridgewell/resolve-uri@3.1.2': {}
+ "@jridgewell/resolve-uri@3.1.2": {}
- '@jridgewell/set-array@1.2.1': {}
+ "@jridgewell/set-array@1.2.1": {}
- '@jridgewell/source-map@0.3.6':
+ "@jridgewell/source-map@0.3.6":
dependencies:
- '@jridgewell/gen-mapping': 0.3.8
- '@jridgewell/trace-mapping': 0.3.25
+ "@jridgewell/gen-mapping": 0.3.8
+ "@jridgewell/trace-mapping": 0.3.25
- '@jridgewell/sourcemap-codec@1.5.0': {}
+ "@jridgewell/sourcemap-codec@1.5.0": {}
- '@jridgewell/trace-mapping@0.3.25':
+ "@jridgewell/trace-mapping@0.3.25":
dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.0
+ "@jridgewell/resolve-uri": 3.1.2
+ "@jridgewell/sourcemap-codec": 1.5.0
accepts@2.0.0:
dependencies:
@@ -1365,26 +1878,26 @@ snapshots:
detect-libc: 2.0.4
semver: 7.7.1
optionalDependencies:
- '@img/sharp-darwin-arm64': 0.34.1
- '@img/sharp-darwin-x64': 0.34.1
- '@img/sharp-libvips-darwin-arm64': 1.1.0
- '@img/sharp-libvips-darwin-x64': 1.1.0
- '@img/sharp-libvips-linux-arm': 1.1.0
- '@img/sharp-libvips-linux-arm64': 1.1.0
- '@img/sharp-libvips-linux-ppc64': 1.1.0
- '@img/sharp-libvips-linux-s390x': 1.1.0
- '@img/sharp-libvips-linux-x64': 1.1.0
- '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
- '@img/sharp-libvips-linuxmusl-x64': 1.1.0
- '@img/sharp-linux-arm': 0.34.1
- '@img/sharp-linux-arm64': 0.34.1
- '@img/sharp-linux-s390x': 0.34.1
- '@img/sharp-linux-x64': 0.34.1
- '@img/sharp-linuxmusl-arm64': 0.34.1
- '@img/sharp-linuxmusl-x64': 0.34.1
- '@img/sharp-wasm32': 0.34.1
- '@img/sharp-win32-ia32': 0.34.1
- '@img/sharp-win32-x64': 0.34.1
+ "@img/sharp-darwin-arm64": 0.34.1
+ "@img/sharp-darwin-x64": 0.34.1
+ "@img/sharp-libvips-darwin-arm64": 1.1.0
+ "@img/sharp-libvips-darwin-x64": 1.1.0
+ "@img/sharp-libvips-linux-arm": 1.1.0
+ "@img/sharp-libvips-linux-arm64": 1.1.0
+ "@img/sharp-libvips-linux-ppc64": 1.1.0
+ "@img/sharp-libvips-linux-s390x": 1.1.0
+ "@img/sharp-libvips-linux-x64": 1.1.0
+ "@img/sharp-libvips-linuxmusl-arm64": 1.1.0
+ "@img/sharp-libvips-linuxmusl-x64": 1.1.0
+ "@img/sharp-linux-arm": 0.34.1
+ "@img/sharp-linux-arm64": 0.34.1
+ "@img/sharp-linux-s390x": 0.34.1
+ "@img/sharp-linux-x64": 0.34.1
+ "@img/sharp-linuxmusl-arm64": 0.34.1
+ "@img/sharp-linuxmusl-x64": 0.34.1
+ "@img/sharp-wasm32": 0.34.1
+ "@img/sharp-win32-ia32": 0.34.1
+ "@img/sharp-win32-x64": 0.34.1
side-channel-list@1.0.0:
dependencies:
@@ -1444,7 +1957,7 @@ snapshots:
terser@5.39.0:
dependencies:
- '@jridgewell/source-map': 0.3.6
+ "@jridgewell/source-map": 0.3.6
acorn: 8.14.1
commander: 2.20.3
source-map-support: 0.5.21
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index e6654d6..0e7f067 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,2 +1,2 @@
onlyBuiltDependencies:
- - sharp
+ - sharp
diff --git a/routes/api/all.js b/routes/api/all.js
index 84a6453..0d87764 100644
--- a/routes/api/all.js
+++ b/routes/api/all.js
@@ -1,122 +1,148 @@
-import fs from "fs";
-import { SHA256 } from "../../extra_modules/SHA.js";
-import { unsign } from "../../extra_modules/unsign.js";
-const config = JSON.parse(fs.readFileSync("server_config.json"));
-const HASHES_DB = config.cookies.server_hashes;
-const HASHES_COOKIE = config.cookies.client_hashes;
-const HASHES_DIFF = HASHES_DB - HASHES_COOKIE;
+import fs from 'fs'
+import { SHA256 } from '../../extra_modules/SHA.js'
+import { unsign } from '../../extra_modules/unsign.js'
+const config = JSON.parse(fs.readFileSync('server_config.json'))
+const HASHES_DB = config.cookies.server_hashes
+const HASHES_COOKIE = config.cookies.client_hashes
+const HASHES_DIFF = HASHES_DB - HASHES_COOKIE
export const setup = function (router, con, server) {
- router.use("/*path", (req, res, next) => {
- res.set("Access-Control-Allow-Origin", "*"); //we'll allow it for now
- let unsigned;
+ router.use('/*path', (req, res, next) => {
+ res.set('Access-Control-Allow-Origin', '*') //we'll allow it for now
+ let unsigned
- req.body = req.body || {};
+ req.body = req.body || {}
- if (typeof req.get("ipost-auth-token") === "string") {
+ if (typeof req.get('ipost-auth-token') === 'string') {
try {
- req.body.auth = JSON.parse(req.get("ipost-auth-token"))
+ req.body.auth = JSON.parse(req.get('ipost-auth-token'))
} catch (err) {
- console.log("error parsing header", err)
+ console.log('error parsing header', err)
}
}
- if (req.body.auth !== undefined && req.originalUrl !== "/redeemauthcode") {
- if (typeof req.body.auth === "string") {
+ if (
+ req.body.auth !== undefined &&
+ req.originalUrl !== '/redeemauthcode'
+ ) {
+ if (typeof req.body.auth === 'string') {
try {
req.body.auth = JSON.parse(req.body.auth)
} catch (err) {
- console.log("error parsing", err)
+ console.log('error parsing', err)
}
- } else
- if (
- typeof req.body.auth !== "object" ||
- typeof req.body.auth.secret !== "string" ||
- typeof req.body.auth.appid !== "number" ||
- typeof req.body.auth.auth_token !== "string" ||
- req.body.auth.secret.length !== 200 ||
- req.body.auth.auth_token.length !== 200 ||
- Buffer.from(req.body.auth.secret, "base64").length !== 150
- ) {
- res.status(420).send("invalid authentication object")
- return;
- } else {
- //secret : string(200 chars)
- //appid : number
- //auth_token: string(200 chars)
- let sql = "select User_ID,User_Name,User_Bio,User_Avatar,User_Settings from ipost.auth_tokens inner join ipost.application on auth_token_isfrom_application_id=application_id inner join ipost.users on auth_token_u_id=User_ID where auth_token=? and application_secret=? and application_id=?"
- con.query(sql, [SHA256(req.body.auth.auth_token, req.body.auth.appid, HASHES_DB), SHA256(req.body.auth.secret, req.body.auth.appid, HASHES_DB), req.body.auth.appid], (err, result) => {
- if (err) throw err;
+ } else if (
+ typeof req.body.auth !== 'object' ||
+ typeof req.body.auth.secret !== 'string' ||
+ typeof req.body.auth.appid !== 'number' ||
+ typeof req.body.auth.auth_token !== 'string' ||
+ req.body.auth.secret.length !== 200 ||
+ req.body.auth.auth_token.length !== 200 ||
+ Buffer.from(req.body.auth.secret, 'base64').length !== 150
+ ) {
+ res.status(420).send('invalid authentication object')
+ return
+ } else {
+ //secret : string(200 chars)
+ //appid : number
+ //auth_token: string(200 chars)
+ let sql =
+ 'select User_ID,User_Name,User_Bio,User_Avatar,User_Settings from ipost.auth_tokens inner join ipost.application on auth_token_isfrom_application_id=application_id inner join ipost.users on auth_token_u_id=User_ID where auth_token=? and application_secret=? and application_id=?'
+ con.query(
+ sql,
+ [
+ SHA256(
+ req.body.auth.auth_token,
+ req.body.auth.appid,
+ HASHES_DB
+ ),
+ SHA256(
+ req.body.auth.secret,
+ req.body.auth.appid,
+ HASHES_DB
+ ),
+ req.body.auth.appid,
+ ],
+ (err, result) => {
+ if (err) throw err
if (result.length !== 1) {
- res.status(420).send("invalid authentication object (or server error?)")
- return;
+ res.status(420).send(
+ 'invalid authentication object (or server error?)'
+ )
+ return
}
- res.locals.userid = result[0].User_ID;
- res.locals.username = result[0].User_Name;
- res.locals.bio = result[0].User_Bio || "";
- res.locals.avatar = result[0].User_Avatar || "";
- res.locals.settings = result[0].User_Settings || {};
+ res.locals.userid = result[0].User_ID
+ res.locals.username = result[0].User_Name
+ res.locals.bio = result[0].User_Bio || ''
+ res.locals.avatar = result[0].User_Avatar || ''
+ res.locals.settings = result[0].User_Settings || {}
- res.locals.isbot = true; //only apps/bots use auth tokens
+ res.locals.isbot = true //only apps/bots use auth tokens
next()
- })
- return;
- }
+ }
+ )
+ return
+ }
} else {
if (!req.cookies.AUTH_COOKIE) {
next()
return
}
- unsigned = unsign(req.cookies.AUTH_COOKIE, req, res);
+ unsigned = unsign(req.cookies.AUTH_COOKIE, req, res)
if (!unsigned) {
next()
return
}
}
- let sql = `select User_ID,User_Name,User_Bio,User_Avatar,User_Settings from ipost.users where User_Name=? and User_PW=?;`;
- let values = unsigned.split(" ");
- values[1] = SHA256(values[1], values[0], HASHES_DIFF);
- res.locals.bio = "";
- res.locals.avatar = "";
- res.locals.settings = {};
+ let sql = `select User_ID,User_Name,User_Bio,User_Avatar,User_Settings from ipost.users where User_Name=? and User_PW=?;`
+ let values = unsigned.split(' ')
+ values[1] = SHA256(values[1], values[0], HASHES_DIFF)
+ res.locals.bio = ''
+ res.locals.avatar = ''
+ res.locals.settings = {}
con.query(sql, values, function (err, result) {
- if (err)
- throw err;
- if (result[0] && result[0].User_Name && result[0].User_Name === values[0]) {
-
- res.locals.userid = result[0].User_ID;
- res.locals.username = result[0].User_Name;
- res.locals.bio = result[0].User_Bio || "";
- res.locals.avatar = result[0].User_Avatar || "";
- res.locals.settings = result[0].User_Settings || {};
-
+ if (err) throw err
+ if (
+ result[0] &&
+ result[0].User_Name &&
+ result[0].User_Name === values[0]
+ ) {
+ res.locals.userid = result[0].User_ID
+ res.locals.username = result[0].User_Name
+ res.locals.bio = result[0].User_Bio || ''
+ res.locals.avatar = result[0].User_Avatar || ''
+ res.locals.settings = result[0].User_Settings || {}
}
next()
- });
- });
+ })
+ })
- router.use("/api/*path", (req, res, next) => {
- res.set("Access-Control-Allow-Origin", "*"); //we'll allow it for now
- if (config["allow_getotheruser_without_cookie"] && req.originalUrl.split("\?")[0] === "/api/getotheruser") {
- next();
- return;
+ router.use('/api/*path', (req, res, next) => {
+ res.set('Access-Control-Allow-Origin', '*') //we'll allow it for now
+ if (
+ config['allow_getotheruser_without_cookie'] &&
+ req.originalUrl.split('\?')[0] === '/api/getotheruser'
+ ) {
+ next()
+ return
}
- if (!server.increaseAPICall(req, res)) return;
+ if (!server.increaseAPICall(req, res)) return
if (res.locals.username !== undefined) {
- next();
- }
- else {
- res.status(402);
- res.json({ "error": "you cannot access the api without being logged in" });
+ next()
+ } else {
+ res.status(402)
+ res.json({
+ error: 'you cannot access the api without being logged in',
+ })
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
-};
+ })
+}
export default {
- setup
-};
+ setup,
+}
diff --git a/routes/api/dms/PersonalMessages.js b/routes/api/dms/PersonalMessages.js
index be2a92f..d8d4858 100644
--- a/routes/api/dms/PersonalMessages.js
+++ b/routes/api/dms/PersonalMessages.js
@@ -1,71 +1,94 @@
//const web_version = require("unsafe_encrypt").web_version
-import { web_version } from "unsafe_encrypt";
+import { web_version } from 'unsafe_encrypt'
export const setup = function (router, con, server) {
- router.get("/api/getPersonalPosts", function (req, res) {
- res.set("Access-Control-Allow-Origin", "");
- let otherperson = encodeURIComponent(req.query.otherperson || "");
- if (typeof otherperson !== "string" || otherperson.length > 100 || otherperson === "") {
- res.status(410).json({ "error": "invalid otherperson given" });
- return;
+ router.get('/api/getPersonalPosts', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '')
+ let otherperson = encodeURIComponent(req.query.otherperson || '')
+ if (
+ typeof otherperson !== 'string' ||
+ otherperson.length > 100 ||
+ otherperson === ''
+ ) {
+ res.status(410).json({ error: 'invalid otherperson given' })
+ return
}
const columns = [
- "dms_user_name", "dms_text", "dms_time", "dms_special_text", "dms_id", "dms_from_bot", "dms_reply_id"
- ];
+ 'dms_user_name',
+ 'dms_text',
+ 'dms_time',
+ 'dms_special_text',
+ 'dms_id',
+ 'dms_from_bot',
+ 'dms_reply_id',
+ ]
//dms_user_name = sender
//dms_receiver = receiver
//if (sender == current and receiver == other) or (receiver == current and sender == other)
- let sql = `select ${columns.join(",")} from ipost.dms where ((dms_receiver = ? and dms_user_name = ?) or (dms_receiver = ? and dms_user_name = ?)) order by dms_id desc limit 50;`;
- con.query(sql, [otherperson, encodeURIComponent(res.locals.username), encodeURIComponent(res.locals.username), otherperson], function (err, result) {
- if (err)
- throw err;
- res.json(result);
- });
+ let sql = `select ${columns.join(',')} from ipost.dms where ((dms_receiver = ? and dms_user_name = ?) or (dms_receiver = ? and dms_user_name = ?)) order by dms_id desc limit 50;`
+ con.query(
+ sql,
+ [
+ otherperson,
+ encodeURIComponent(res.locals.username),
+ encodeURIComponent(res.locals.username),
+ otherperson,
+ ],
+ function (err, result) {
+ if (err) throw err
+ res.json(result)
+ }
+ )
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
- router.get("/api/dms/conversations", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- let uriencusername = encodeURIComponent(res.locals.username);
- let sql = `select dms_user_name, dms_receiver from ipost.dms where ((dms_receiver = ?) or (dms_user_name = ?)) group by dms_receiver,dms_user_name;`;
- con.query(sql, [uriencusername, uriencusername], function (err, result) {
- if (err)
- throw err;
- res.json(result);
- });
+ })
+ router.get('/api/dms/conversations', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ let uriencusername = encodeURIComponent(res.locals.username)
+ let sql = `select dms_user_name, dms_receiver from ipost.dms where ((dms_receiver = ?) or (dms_user_name = ?)) group by dms_receiver,dms_user_name;`
+ con.query(
+ sql,
+ [uriencusername, uriencusername],
+ function (err, result) {
+ if (err) throw err
+ res.json(result)
+ }
+ )
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
- router.get("/api/dms/encrypt.js", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- res.send(web_version());
+ })
+ router.get('/api/dms/encrypt.js', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ res.send(web_version())
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
+ })
//
- router.get("/api/dms/getDM", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- let arg = req.query.id;
- let uriencusername = encodeURIComponent(res.locals.username);
- let sql = `select dms_user_name,dms_text,dms_time,dms_special_text,dms_id,dms_from_bot,dms_reply_id,dms_receiver from ipost.dms where dms_id=? and (dms_user_name=? or dms_receiver=?);`;
- con.query(sql, [arg, uriencusername, uriencusername], function (err, result) {
- if (err)
- throw err;
- if (result[0]) {
- res.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
- res.json(result[0]);
+ router.get('/api/dms/getDM', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ let arg = req.query.id
+ let uriencusername = encodeURIComponent(res.locals.username)
+ let sql = `select dms_user_name,dms_text,dms_time,dms_special_text,dms_id,dms_from_bot,dms_reply_id,dms_receiver from ipost.dms where dms_id=? and (dms_user_name=? or dms_receiver=?);`
+ con.query(
+ sql,
+ [arg, uriencusername, uriencusername],
+ function (err, result) {
+ if (err) throw err
+ if (result[0]) {
+ res.set('Cache-Control', 'public, max-age=2592000') //cache it for one month-ish
+ res.json(result[0])
+ } else {
+ res.json({ error: 'there is no such dm!' })
+ }
}
- else {
- res.json({ "error": "there is no such dm!" });
- }
- });
+ )
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
-};
+ })
+}
export default {
- setup
-};
+ setup,
+}
diff --git a/routes/api/dms/post.js b/routes/api/dms/post.js
index 76f5d31..5a05410 100644
--- a/routes/api/dms/post.js
+++ b/routes/api/dms/post.js
@@ -1,104 +1,116 @@
-import xor from "../../../extra_modules/xor.js";
+import xor from '../../../extra_modules/xor.js'
export const setup = function (router, con, server) {
- const PIDS = {}; //[pid]: true/"already_used"
+ const PIDS = {} //[pid]: true/"already_used"
- function createPID(){
- let pid = server.genstring(10); //collision chance is low enough, but we'll check anyways
+ function createPID() {
+ let pid = server.genstring(10) //collision chance is low enough, but we'll check anyways
while (PIDS[pid] !== undefined) {
- pid = server.genstring(10);
- console.log(5, "pid collision");
+ pid = server.genstring(10)
+ console.log(5, 'pid collision')
}
- PIDS[pid] = true;
- setTimeout(function() {
- PIDS[pid] = undefined;
- }, 40000);
+ PIDS[pid] = true
+ setTimeout(function () {
+ PIDS[pid] = undefined
+ }, 40000)
return pid
}
-
- router.get("/api/dms/pid", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- res.json({ "pid": createPID() });
+ router.get('/api/dms/pid', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ res.json({ pid: createPID() })
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
- router.post("/api/dms/post", function (req, res) {
+ })
+ router.post('/api/dms/post', function (req, res) {
if (!req.body.message) {
res.status(410)
- res.json({ "error": "no message to post" });
- return;
+ res.json({ error: 'no message to post' })
+ return
}
- if ((typeof req.body.message) !== "string") {
+ if (typeof req.body.message !== 'string') {
res.status(411)
- res.json({ "error": "no message to post" });
- return;
+ res.json({ error: 'no message to post' })
+ return
}
- if ((typeof req.body.pid) !== "string") {
+ if (typeof req.body.pid !== 'string') {
res.status(412)
- res.json({ "error": "no pid given" });
- return;
+ res.json({ error: 'no pid given' })
+ return
}
if (req.body.pid.length !== 10 || PIDS[req.body.pid] !== true) {
res.status(413)
- res.json({ "error": "invalid pid given" });
- return;
+ res.json({ error: 'invalid pid given' })
+ return
}
- PIDS[req.body.pid] = "already_used";
- let reply_id;
+ PIDS[req.body.pid] = 'already_used'
+ let reply_id
if (!req.body.reply_id || req.body.reply_id < 0) {
- reply_id = 0;
+ reply_id = 0
+ } else {
+ reply_id = req.body.reply_id
}
- else {
- reply_id = req.body.reply_id;
- }
- if ((typeof reply_id) !== "number") {
+ if (typeof reply_id !== 'number') {
res.status(414)
- res.json({ "error": "no valid reply id given" });
- return;
+ res.json({ error: 'no valid reply id given' })
+ return
}
if (req.body.message.length > 1000) {
res.status(415)
- res.json({ "error": "message too long" });
- return;
+ res.json({ error: 'message too long' })
+ return
}
- req.body.message = encodeURIComponent(req.body.message.trim());
+ req.body.message = encodeURIComponent(req.body.message.trim())
if (req.body.message.length > 3000) {
res.status(416)
- res.json({ "error": "message too long" }); //check again after URI encoding it
- return;
+ res.json({ error: 'message too long' }) //check again after URI encoding it
+ return
}
- req.body.receiver = encodeURIComponent(req.body.receiver || "");
- if (req.body.receiver === "" || req.body.receiver === encodeURIComponent(res.locals.username) || req.body.receiver.length > 100) {
- res.status(417).json({ "error": "invalid receiver given" });
- return;
+ req.body.receiver = encodeURIComponent(req.body.receiver || '')
+ if (
+ req.body.receiver === '' ||
+ req.body.receiver === encodeURIComponent(res.locals.username) ||
+ req.body.receiver.length > 100
+ ) {
+ res.status(417).json({ error: 'invalid receiver given' })
+ return
}
- let otherperson = req.body.receiver;
+ let otherperson = req.body.receiver
if (!req.body.message) {
res.status(418)
- res.json({ "error": "no message to post" });
- return;
+ res.json({ error: 'no message to post' })
+ return
}
- let sql = `insert into ipost.dms (dms_user_name,dms_text,dms_time,dms_receiver,dms_from_bot,dms_reply_id) values (?,?,?,?,?,?);`;
- let values = [encodeURIComponent(res.locals.username), req.body.message, Date.now(), otherperson, res.locals.isbot, reply_id];
+ let sql = `insert into ipost.dms (dms_user_name,dms_text,dms_time,dms_receiver,dms_from_bot,dms_reply_id) values (?,?,?,?,?,?);`
+ let values = [
+ encodeURIComponent(res.locals.username),
+ req.body.message,
+ Date.now(),
+ otherperson,
+ res.locals.isbot,
+ reply_id,
+ ]
con.query(sql, values, function (err, result) {
if (err) {
res.status(500)
- res.json({"error":"there's been an internal error"})
+ res.json({ error: "there's been an internal error" })
console.error(err)
- return;
+ return
}
- res.json({ "success": "successfully posted dm" });
- console.log(5, `posted new dm by ${res.locals.username} to ${otherperson} : ${xor(encodeURIComponent(res.locals.username), otherperson)}`);
- });
+ res.json({ success: 'successfully posted dm' })
+ console.log(
+ 5,
+ `posted new dm by ${res.locals.username} to ${otherperson} : ${xor(encodeURIComponent(res.locals.username), otherperson)}`
+ )
+ })
//TODO: bring dms up-to-date with normal posts
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
+ })
return createPID
-};
+}
export default {
- setup
-};
+ setup,
+}
diff --git a/routes/api/getFileIcon.js b/routes/api/getFileIcon.js
index 34b0602..bb628fe 100644
--- a/routes/api/getFileIcon.js
+++ b/routes/api/getFileIcon.js
@@ -1,12 +1,12 @@
-import sharp from "sharp"
-async function addTextOnImage(text,buf) {
+import sharp from 'sharp'
+async function addTextOnImage(text, buf) {
try {
let img = await sharp(buf)
const metadata = await img.metadata()
- const width = metadata.width;
- const height = metadata.height;
+ const width = metadata.width
+ const height = metadata.height
const svgImage = `
@@ -15,34 +15,39 @@ async function addTextOnImage(text,buf) {
${text}
- `;
+ `
return await img
.composite([
- {
- input: Buffer.from(svgImage),
- top: 0,
- left: 0,
- },
- ]).webp({effort:6}).toBuffer()
+ {
+ input: Buffer.from(svgImage),
+ top: 0,
+ left: 0,
+ },
+ ])
+ .webp({ effort: 6 })
+ .toBuffer()
} catch (error) {
- console.log(error);
+ console.log(error)
}
}
export const setup = function (router, con, server) {
- router.get("/api/getFileIcon/:icon",async function(req,res){
+ router.get('/api/getFileIcon/:icon', async function (req, res) {
let path = req.params.icon
- if(path.length > 4) {
- res.status(410).json({"error":"file ending is too long"})
- return;
+ if (path.length > 4) {
+ res.status(410).json({ error: 'file ending is too long' })
+ return
}
- addTextOnImage(path,await sharp("./images/empty_file.png").toBuffer()).then(buf => {
- res.set("content-type","image/png")
+ addTextOnImage(
+ path,
+ await sharp('./images/empty_file.png').toBuffer()
+ ).then((buf) => {
+ res.set('content-type', 'image/png')
res.send(buf)
})
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
})
-}
\ No newline at end of file
+}
diff --git a/routes/api/getPosts.js b/routes/api/getPosts.js
index 8ed8bc2..a868446 100644
--- a/routes/api/getPosts.js
+++ b/routes/api/getPosts.js
@@ -1,65 +1,67 @@
export const setup = function (router, con, server) {
- router.get("/api/getPosts", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
+ router.get('/api/getPosts', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
if (req.query.channel !== undefined) {
- let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,User_Avatar,file_0,file_1,file_2,file_3,file_4 from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_receiver_name = ? group by post_id order by post_id desc limit 30;`;
- con.query(sql, [encodeURIComponent(req.query.channel)], function (err, result) {
- if (err)
- throw err;
- res.json(result);
- });
- }
- else { //fallback
- let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where (post_receiver_name is null or post_receiver_name = 'everyone') group by post_id order by post_id desc limit 30;`;
+ let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,User_Avatar,file_0,file_1,file_2,file_3,file_4 from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_receiver_name = ? group by post_id order by post_id desc limit 30;`
+ con.query(
+ sql,
+ [encodeURIComponent(req.query.channel)],
+ function (err, result) {
+ if (err) throw err
+ res.json(result)
+ }
+ )
+ } else {
+ //fallback
+ let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where (post_receiver_name is null or post_receiver_name = 'everyone') group by post_id order by post_id desc limit 30;`
con.query(sql, [], function (err, result) {
- if (err)
- throw err;
- res.json(result);
- });
+ if (err) throw err
+ res.json(result)
+ })
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
- router.get("/api/getPostsLowerThan", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
+ })
+ router.get('/api/getPostsLowerThan', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
if (req.query.channel !== undefined) {
- let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where ((post_receiver_name = ?) and (post_id < ?)) group by post_id order by post_id desc limit 30;`;
- con.query(sql, [encodeURIComponent(req.query.channel), req.query.id], function (err, result) {
- if (err)
- throw err;
- res.json(result);
- });
- }
- else { //fallback
- let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where ((post_receiver_name is null or post_receiver_name = 'everyone') and (post_id < ?)) group by post_id order by post_id desc limit 30;`;
+ let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where ((post_receiver_name = ?) and (post_id < ?)) group by post_id order by post_id desc limit 30;`
+ con.query(
+ sql,
+ [encodeURIComponent(req.query.channel), req.query.id],
+ function (err, result) {
+ if (err) throw err
+ res.json(result)
+ }
+ )
+ } else {
+ //fallback
+ let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where ((post_receiver_name is null or post_receiver_name = 'everyone') and (post_id < ?)) group by post_id order by post_id desc limit 30;`
con.query(sql, [req.query.id], function (err, result) {
- if (err)
- throw err;
- res.json(result);
- });
+ if (err) throw err
+ res.json(result)
+ })
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
- router.get("/api/getPost", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- let arg = req.query.id;
- let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,post_receiver_name,User_Avatar,file_0,file_1,file_2,file_3,file_4 from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_id=?;`;
+ })
+ router.get('/api/getPost', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ let arg = req.query.id
+ let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,post_receiver_name,User_Avatar,file_0,file_1,file_2,file_3,file_4 from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_id=?;`
con.query(sql, [arg], function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- res.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
- res.json(result[0]);
+ res.set('Cache-Control', 'public, max-age=2592000') //cache it for one month-ish
+ res.json(result[0])
+ } else {
+ res.json({ error: 'there is no such post!' })
}
- else {
- res.json({ "error": "there is no such post!" });
- }
- });
+ })
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
-}
\ No newline at end of file
+ })
+}
diff --git a/routes/api/options.js b/routes/api/options.js
index 96f40b7..a6094fe 100644
--- a/routes/api/options.js
+++ b/routes/api/options.js
@@ -1,18 +1,18 @@
function allowAllTraffic(router, str, type) {
- router.options(str, function (req, res, next) {
- res.set("Access-Control-Allow-Origin", "test.ipost.rocks"); //we'll allow it for now
- res.set("Access-Control-Allow-Methods", type || "GET");
- res.set("Access-Control-Allow-Headers", "Content-Type");
- res.status(200).send("");
- });
+ router.options(str, function (req, res, next) {
+ res.set('Access-Control-Allow-Origin', 'test.ipost.rocks') //we'll allow it for now
+ res.set('Access-Control-Allow-Methods', type || 'GET')
+ res.set('Access-Control-Allow-Headers', 'Content-Type')
+ res.status(200).send('')
+ })
}
function setup(router, con, server) {
- allowAllTraffic(router, "/api/pid");
- allowAllTraffic(router, "/api/post", "POST");
- allowAllTraffic(router, "/api/getotheruser");
- allowAllTraffic(router, "/api/getPost");
- allowAllTraffic(router, "/api/getPostsLowerThan");
- allowAllTraffic(router, "/api/settings");
- allowAllTraffic(router, "/api/settings", "POST");
+ allowAllTraffic(router, '/api/pid')
+ allowAllTraffic(router, '/api/post', 'POST')
+ allowAllTraffic(router, '/api/getotheruser')
+ allowAllTraffic(router, '/api/getPost')
+ allowAllTraffic(router, '/api/getPostsLowerThan')
+ allowAllTraffic(router, '/api/settings')
+ allowAllTraffic(router, '/api/settings', 'POST')
}
-export { setup };
+export { setup }
diff --git a/routes/api/post.js b/routes/api/post.js
index d9cda39..0d383db 100644
--- a/routes/api/post.js
+++ b/routes/api/post.js
@@ -1,218 +1,261 @@
-import sharp from "sharp";
-import {writeFile} from "fs";
+import sharp from 'sharp'
+import { writeFile } from 'fs'
const image_types = {
- "png":true,
- "jpg":true,
- "jpeg":true,
- "webp":true,
- "jfif":true
+ png: true,
+ jpg: true,
+ jpeg: true,
+ webp: true,
+ jfif: true,
}
export const setup = function (router, con, server) {
- const PIDS = {}; //[pid]: true/"already_used"
+ const PIDS = {} //[pid]: true/"already_used"
function isNotNull(a) {
- return typeof a !== "undefined" && a !== null
+ return typeof a !== 'undefined' && a !== null
}
- function createPID(){
- let pid = server.genstring(10); //collision chance is low enough, but we'll check anyways
+ function createPID() {
+ let pid = server.genstring(10) //collision chance is low enough, but we'll check anyways
while (PIDS[pid] !== undefined) {
- pid = server.genstring(10);
- console.log(5, "pid collision");
+ pid = server.genstring(10)
+ console.log(5, 'pid collision')
}
- PIDS[pid] = true;
- setTimeout(function() {
- PIDS[pid] = undefined;
- }, 40000);
+ PIDS[pid] = true
+ setTimeout(function () {
+ PIDS[pid] = undefined
+ }, 40000)
return pid
}
- router.get("/api/pid", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- res.json({ "pid": createPID() });
+ router.get('/api/pid', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ res.json({ pid: createPID() })
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
+ })
function validateMessage(message) {
if (!message) {
throw {
statusCode: 410,
- message: "no message to post"
+ message: 'no message to post',
}
}
- if ((typeof message) !== "string") {
+ if (typeof message !== 'string') {
throw {
statusCode: 411,
- message: "no message to post"
+ message: 'no message to post',
}
}
if (message.length > 1000) {
throw {
statusCode: 416,
- message: "message too long"
+ message: 'message too long',
}
}
- message = encodeURIComponent(message.trim());
+ message = encodeURIComponent(message.trim())
if (message.length > 3000) {
throw {
statusCode: 417,
- message: "message too long"
+ message: 'message too long',
}
}
if (!message) {
throw {
statusCode: 418,
- message: "no message to post"
+ message: 'no message to post',
}
} //backup check
return message
}
function validatePID(pid) {
- if (!pid || typeof pid !== "string") {
+ if (!pid || typeof pid !== 'string') {
throw {
statusCode: 412,
- message: "no pid given"
+ message: 'no pid given',
}
}
- if (pid.length !== 10 || PIDS[pid]!==true) {
+ if (pid.length !== 10 || PIDS[pid] !== true) {
throw {
statusCode: 413,
- message: "invalid pid given"
+ message: 'invalid pid given',
}
}
- PIDS[pid] = "already_used";
+ PIDS[pid] = 'already_used'
}
function validateReplyID(rid) {
- let reply_id;
+ let reply_id
if (!rid || rid < 0) {
reply_id = 0
}
- if(typeof rid === "string" && rid !== "") {
- reply_id = parseInt(rid,10)
- if(isNaN(reply_id)) {
+ if (typeof rid === 'string' && rid !== '') {
+ reply_id = parseInt(rid, 10)
+ if (isNaN(reply_id)) {
throw {
statusCode: 414,
- message: "no valid reply id given"
+ message: 'no valid reply id given',
}
}
}
- if (typeof reply_id !== "number") {
+ if (typeof reply_id !== 'number') {
throw {
statusCode: 415,
- message: "no valid reply id given"
+ message: 'no valid reply id given',
} //backup case
}
return reply_id
}
function validateReceiver(rec) {
- let receiver = encodeURIComponent(rec || "");
- if (receiver === "")
- receiver = "everyone";
+ let receiver = encodeURIComponent(rec || '')
+ if (receiver === '') receiver = 'everyone'
return receiver
}
- router.post("/api/post", async (req, res) => {
+ router.post('/api/post', async (req, res) => {
try {
- let message = validateMessage(req.body.message);
- validatePID(req.body.pid);
- let reply_id = validateReplyID(req.body.reply_id);
- let receiver = validateReceiver(req.body.receiver);
+ let message = validateMessage(req.body.message)
+ validatePID(req.body.pid)
+ let reply_id = validateReplyID(req.body.reply_id)
+ let receiver = validateReceiver(req.body.receiver)
- let __dirname = server.dirname
- const file_names = ["","","","",""]
- if(isNotNull(req.files)) {
- for(let file_index=0;file_index<5;file_index++) {
- if(isNotNull(req.files[`file_${file_index}`])) {
- let file = req.files[`file_${file_index}`]
- const file_id = server.genstring(20)
- const file_name = `${file_id}/${(file.name.substring(0,25)).replace(/\.[^/.]+$/, "")}`
- let extension = file.name.substring(file.name.lastIndexOf("\.")+1)
- file_names[file_index]=`${file_name}${(extension in image_types && ".webp") || extension}`
- server.ensureExists(`${__dirname}/user_uploads/${file_id}`,undefined,async (err)=>{
- if(err) {
+ let __dirname = server.dirname
+ const file_names = ['', '', '', '', '']
+ if (isNotNull(req.files)) {
+ for (let file_index = 0; file_index < 5; file_index++) {
+ if (isNotNull(req.files[`file_${file_index}`])) {
+ let file = req.files[`file_${file_index}`]
+ const file_id = server.genstring(20)
+ const file_name = `${file_id}/${file.name.substring(0, 25).replace(/\.[^/.]+$/, '')}`
+ let extension = file.name.substring(
+ file.name.lastIndexOf('\.') + 1
+ )
+ file_names[file_index] =
+ `${file_name}${(extension in image_types && '.webp') || extension}`
+ server.ensureExists(
+ `${__dirname}/user_uploads/${file_id}`,
+ undefined,
+ async (err) => {
+ if (err) {
+ console.error(err)
+ return
+ }
+ if (extension in image_types) {
+ writeFile(
+ `${__dirname}/user_uploads/${file_name}.webp`,
+ await sharp(file.data)
+ .webp({ mixed: true, effort: 6 })
+ .toBuffer(),
+ (err2) => {
+ if (err2) console.error(err2)
+ }
+ )
+ server.ensureExists(
+ `${__dirname}/user_uploads/previews/${file_id}`,
+ undefined,
+ async (error) => {
+ if (error) {
+ console.error(error)
+ return
+ }
+ writeFile(
+ `${__dirname}/user_uploads/previews/${file_name}.webp`,
+ await sharp(file.data)
+ .resize(100, 100, {
+ fit: 'inside',
+ })
+ .webp({
+ mixed: true,
+ effort: 6,
+ })
+ .toBuffer(),
+ (error2) => {
+ if (error2)
+ console.error(error2)
+ }
+ )
+ }
+ )
+ } else {
+ file.mv(
+ `${__dirname}/user_uploads/${file_name}.${extension}`,
+ (err2) => {
+ if (err2) console.error(err2)
+ }
+ )
+ }
+ }
+ )
+ }
+ }
+ }
+
+ let sql = `START TRANSACTION;INSERT INTO ipost.posts (post_user_name,post_text,post_time,post_receiver_name,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4) VALUES (?,?,?,?,?,?,?,?,?,?,?);SELECT LAST_INSERT_ID() as ID;COMMIT;`
+ let values = [
+ encodeURIComponent(res.locals.username),
+ message,
+ Date.now(),
+ receiver,
+ res.locals.isbot,
+ reply_id,
+ ...file_names,
+ ]
+ con.query(sql, values, function (err, result) {
+ if (err) {
+ res.status(500)
+ res.json({ error: "there's been an interal error" })
console.error(err)
- return;
- }
- if(extension in image_types) {
- writeFile(`${__dirname}/user_uploads/${file_name}.webp`,await sharp(file.data).webp({mixed:true,effort:6}).toBuffer(),(err2)=>{
- if(err2)console.error(err2)
- })
- server.ensureExists(`${__dirname}/user_uploads/previews/${file_id}`,undefined,async (error) => {
- if(error) {
- console.error(error)
- return;
- }
- writeFile(`${__dirname}/user_uploads/previews/${file_name}.webp`,await sharp(file.data).resize(100,100,{fit: "inside"}).webp({mixed:true,effort:6}).toBuffer(),(error2)=>{
- if(error2)console.error(error2)
- })
- })
- } else {
- file.mv(`${__dirname}/user_uploads/${file_name}.${extension}`,(err2)=>{
- if(err2)console.error(err2)
- })
- }
+ return
+ }
+ let post_obj = {
+ post_user_name: encodeURIComponent(res.locals.username),
+ post_text: req.body.message,
+ post_time: Date.now(),
+ post_special_text: '',
+ post_receiver_name: req.body.receiver,
+ post_from_bot: res.locals.isbot,
+ post_reply_id: reply_id,
+ user_avatar: res.locals.avatar,
+ files: file_names,
+ post_id: result[0].ID,
+ }
+ let message = {
+ message: 'new_post',
+ data: post_obj,
+ }
+ let messagestr = JSON.stringify(message)
+ //console.log(5,server.wss.clients); /* DEBUG: Log websocket clients */
+ server.wss.clients.forEach(function (ws) {
+ //console.log(5,ws); /* DEBUG: Log websocket clients */
+ ws.send(messagestr)
})
- }
- }
- }
-
- let sql = `START TRANSACTION;INSERT INTO ipost.posts (post_user_name,post_text,post_time,post_receiver_name,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4) VALUES (?,?,?,?,?,?,?,?,?,?,?);SELECT LAST_INSERT_ID() as ID;COMMIT;`;
- let values = [encodeURIComponent(res.locals.username), message, Date.now(), receiver, res.locals.isbot, reply_id,...file_names];
- con.query(sql, values, function (err, result) {
- if (err){
- res.status(500)
- res.json({"error":"there's been an interal error"})
- console.error(err)
- return;
- }
- let post_obj = {
- post_user_name: encodeURIComponent(res.locals.username),
- post_text: req.body.message,
- post_time: Date.now(),
- post_special_text: "",
- post_receiver_name: req.body.receiver,
- post_from_bot: res.locals.isbot,
- post_reply_id: reply_id,
- user_avatar: res.locals.avatar,
- files: file_names,
- post_id: result[0].ID
- };
- let message = {
- message: "new_post",
- data: post_obj
- };
- let messagestr = JSON.stringify(message);
- //console.log(5,server.wss.clients); /* DEBUG: Log websocket clients */
- server.wss.clients.forEach(function(ws) {
- //console.log(5,ws); /* DEBUG: Log websocket clients */
- ws.send(messagestr);
- });
- res.json({ "success": "successfully posted message" });
- console.log(5, `posted new message by ${res.locals.username} : ${req.body.message}`);
- });
+ res.json({ success: 'successfully posted message' })
+ console.log(
+ 5,
+ `posted new message by ${res.locals.username} : ${req.body.message}`
+ )
+ })
} catch (error) {
- if(error.statusCode) {
+ if (error.statusCode) {
res.status(error.statusCode)
- res.json({ "error": error.message, "status": error.statusCode });
+ res.json({ error: error.message, status: error.statusCode })
} else {
- console.error("some error: ", error)
+ console.error('some error: ', error)
res.status(500)
- res.json({"error":"internal server error", "status": 500})
+ res.json({ error: 'internal server error', status: 500 })
}
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
+ })
return createPID
-};
+}
export default {
- setup
-};
+ setup,
+}
diff --git a/routes/api/search.js b/routes/api/search.js
index f8e1125..aac239e 100644
--- a/routes/api/search.js
+++ b/routes/api/search.js
@@ -1,42 +1,44 @@
export const setup = function (router, con, server) {
- router.get("/api/search", function (req, res) {
- res.set("Access-Control-Allow-Origin", "");
- let type = req.query.type;
- let arg = encodeURIComponent(req.query.selector);
- if (type === "user") {
- let sql = `select User_Name,User_Bio,User_Avatar from ipost.users where User_Name like ? limit 10;`;
+ router.get('/api/search', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '')
+ let type = req.query.type
+ let arg = encodeURIComponent(req.query.selector)
+ if (type === 'user') {
+ let sql = `select User_Name,User_Bio,User_Avatar from ipost.users where User_Name like ? limit 10;`
con.query(sql, [`%${arg}%`], function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- result["message"] = "search has been deprecated as of 11/30/2022"
- res.json(result);
+ result['message'] =
+ 'search has been deprecated as of 11/30/2022'
+ res.json(result)
+ } else {
+ res.json({ error: 'there is no such user!' })
}
- else {
- res.json({ "error": "there is no such user!" });
- }
- });
- }
- else if (type === "post") {
- let sql = `select post_user_name,post_text,post_time,post_special_text,post_id from ipost.posts where post_text like ? and (post_receiver_name is null or post_receiver_name = 'everyone') order by post_id desc limit 20;`;
+ })
+ } else if (type === 'post') {
+ let sql = `select post_user_name,post_text,post_time,post_special_text,post_id from ipost.posts where post_text like ? and (post_receiver_name is null or post_receiver_name = 'everyone') order by post_id desc limit 20;`
con.query(sql, [`%${arg}%`], function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- result["message"] = "search has been deprecated as of 11/30/2022"
- res.json(result);
+ result['message'] =
+ 'search has been deprecated as of 11/30/2022'
+ res.json(result)
+ } else {
+ res.json({
+ error: 'there is no such post!',
+ message: 'search has been deprecated as of 11/30/2022',
+ })
}
- else {
- res.json({ "error": "there is no such post!", "message": "search has been deprecated as of 11/30/2022"});
- }
- });
- }
- else {
- res.json({ "error": "invalid type passed along, expected `user` or `post`", "message": "search has been deprecated as of 11/30/2022"});
+ })
+ } else {
+ res.json({
+ error: 'invalid type passed along, expected `user` or `post`',
+ message: 'search has been deprecated as of 11/30/2022',
+ })
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
-}
\ No newline at end of file
+ })
+}
diff --git a/routes/api/settingshandler.js b/routes/api/settingshandler.js
index 6b816f7..74a74b3 100644
--- a/routes/api/settingshandler.js
+++ b/routes/api/settingshandler.js
@@ -1,60 +1,71 @@
const allowed_settings = {
- "ACCR": ["boolean"]
-};
+ ACCR: ['boolean'],
+}
export const setup = function (router, con, server) {
- router.get("/api/settings", function (req, res) {
- res.json(res.locals.settings);
+ router.get('/api/settings', function (req, res) {
+ res.json(res.locals.settings)
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
- router.post("/api/settings", function (req, res) {
+ })
+ router.post('/api/settings', function (req, res) {
if (!req.body.setting) {
res.status(410)
- res.json({ "error": "no setting to change" });
- return;
+ res.json({ error: 'no setting to change' })
+ return
}
- if ((typeof req.body.setting) !== "string") {
+ if (typeof req.body.setting !== 'string') {
res.status(411)
- res.json({ "error": "no setting to change" });
- return;
+ res.json({ error: 'no setting to change' })
+ return
}
- let types = allowed_settings[req.body.setting];
- let allowed = false;
- let got = typeof req.body.value;
+ let types = allowed_settings[req.body.setting]
+ let allowed = false
+ let got = typeof req.body.value
for (let index = 0; index < types.length; index++) {
if (types[index] === got) {
- allowed = true;
- break;
+ allowed = true
+ break
}
}
if (!allowed) {
- console.log(5, "incorrect type given, received, expected", typeof req.body.value, allowed_settings[req.body.setting]);
+ console.log(
+ 5,
+ 'incorrect type given, received, expected',
+ typeof req.body.value,
+ allowed_settings[req.body.setting]
+ )
res.status(412)
- res.json({ "error": "no new setting value given" });
- return;
+ res.json({ error: 'no new setting value given' })
+ return
}
- let setting_to_change = req.body.setting;
- let setting_new_value = req.body.value;
- res.locals.settings[setting_to_change] = setting_new_value;
- console.log(5, "changing settings", setting_to_change, setting_new_value, res.locals.settings);
- let sql = "update ipost.users set User_Settings=? where User_Name=?";
- let values = [JSON.stringify(res.locals.settings), res.locals.username];
+ let setting_to_change = req.body.setting
+ let setting_new_value = req.body.value
+ res.locals.settings[setting_to_change] = setting_new_value
+ console.log(
+ 5,
+ 'changing settings',
+ setting_to_change,
+ setting_new_value,
+ res.locals.settings
+ )
+ let sql = 'update ipost.users set User_Settings=? where User_Name=?'
+ let values = [JSON.stringify(res.locals.settings), res.locals.username]
con.query(sql, values, function (err, result) {
if (err) {
res.status(500)
- res.json({ "status": "error", "code": err });
- return;
+ res.json({ status: 'error', code: err })
+ return
}
- res.json({ "status": "success" });
- });
+ res.json({ status: 'success' })
+ })
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
- });
-};
+ })
+}
export default {
- setup
-};
+ setup,
+}
diff --git a/routes/api/userRoutes.js b/routes/api/userRoutes.js
index aecf761..6a54d11 100644
--- a/routes/api/userRoutes.js
+++ b/routes/api/userRoutes.js
@@ -1,234 +1,293 @@
-import sharp from "sharp"
-import { ensureExists } from "../../extra_modules/ensureExists.js"
-import {SHA256} from "../../extra_modules/SHA.js";
-import getIP from "../../extra_modules/getip.js";
-import {getunsigned} from "../../extra_modules/unsign.js";
+import sharp from 'sharp'
+import { ensureExists } from '../../extra_modules/ensureExists.js'
+import { SHA256 } from '../../extra_modules/SHA.js'
+import getIP from '../../extra_modules/getip.js'
+import { getunsigned } from '../../extra_modules/unsign.js'
export const setup = function (router, con, server) {
const config = server.config
- const HASHES_DB = config.cookies.server_hashes;
- const HASHES_COOKIE = config.cookies.client_hashes;
- const HASHES_DIFF = HASHES_DB - HASHES_COOKIE;
- router.post("/api/setavatar", function (req, res) {
- res.set("Access-Control-Allow-Origin", "");
+ const HASHES_DB = config.cookies.server_hashes
+ const HASHES_COOKIE = config.cookies.client_hashes
+ const HASHES_DIFF = HASHES_DB - HASHES_COOKIE
+ const __dirname = server.dirname
+
+ router.post('/api/setavatar', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '')
if (!req.files || Object.keys(req.files).length === 0) {
- return res.status(410).send('No files were uploaded. (req.files)');
+ return res.status(410).send('No files were uploaded. (req.files)')
}
- let avatar = req.files.avatar;
+ let avatar = req.files.avatar
if (!avatar) {
- return res.status(411).send('No files were uploaded. (req.files.)');
+ return res.status(411).send('No files were uploaded. (req.files.)')
}
- const avatars = __dirname + '/avatars/';
+ const avatars = __dirname + '/avatars/'
ensureExists(avatars, function (err) {
if (err) {
- return res.status(500).json({ "error": "there's been an internal server error." });
+ return res
+ .status(500)
+ .json({ error: "there's been an internal server error." })
}
if (res.locals.avatar) {
try {
- unlinkSync(avatars + res.locals.avatar);
- } catch(ignored){}
+ unlinkSync(avatars + res.locals.avatar)
+ } catch (ignored) {}
}
- let filename = genstring(95) + ".webp";
- while (existsSync(avatars + "/" + filename) || filename === ".webp") { //generate new filename until it's unique
- filename = genstring(95) + ".webp";
+ let filename = genstring(95) + '.webp'
+ while (
+ existsSync(avatars + '/' + filename) ||
+ filename === '.webp'
+ ) {
+ //generate new filename until it's unique
+ filename = genstring(95) + '.webp'
}
- sharp(avatar.data).resize({ //resize avatar to 100x100 and convert it to a webp, then store it
- width: 100,
- height: 100
- }).webp({
- effort: 6,
- mixed: true
- }).toBuffer().then(function(data){
- writeFileSync(avatars + filename,data)
- let sql = `update ipost.users set User_Avatar=? where User_Name=?`;
- con.query(sql, [filename, encodeURIComponent(res.locals.username)], function (err) {
- if (err)
- throw err;
- res.json({ "success": "updated avatar" });
- });
- })
- });
+ sharp(avatar.data)
+ .resize({
+ //resize avatar to 100x100 and convert it to a webp, then store it
+ width: 100,
+ height: 100,
+ })
+ .webp({
+ effort: 6,
+ mixed: true,
+ })
+ .toBuffer()
+ .then(function (data) {
+ writeFileSync(avatars + filename, data)
+ let sql = `update ipost.users set User_Avatar=? where User_Name=?`
+ con.query(
+ sql,
+ [filename, encodeURIComponent(res.locals.username)],
+ function (err) {
+ if (err) throw err
+ res.json({ success: 'updated avatar' })
+ }
+ )
+ })
+ })
/* #swagger.security = [{
- "appTokenAuthHeader": []
- }] */
- });
- router.get("/api/getuser", function (_req, res) {
- res.json({ "username": res.locals.username, "bio": res.locals.bio, "avatar": res.locals.avatar, "userid": res.locals.userid });
+ "appTokenAuthHeader": []
+ }] */
+ })
+ router.get('/api/getuser', function (_req, res) {
+ res.json({
+ username: res.locals.username,
+ bio: res.locals.bio,
+ avatar: res.locals.avatar,
+ userid: res.locals.userid,
+ })
/* #swagger.security = [{
- "appTokenAuthHeader": []
- }] */
- });
- router.get("/api/getalluserinformation", function (req, res) {
- res.set("Access-Control-Allow-Origin", ""); //we don't want that here
- let unsigned = getunsigned(req, res); //has to be asking for it via the cookie
- if (!unsigned)
- return;
- unsigned = decodeURIComponent(unsigned);
- let sql = `select * from ipost.users where User_Name=? and User_PW=?;`;
- let values = unsigned.split(" ");
- values[1] = SHA256(values[1], values[0], HASHES_DIFF);
+ "appTokenAuthHeader": []
+ }] */
+ })
+ router.get('/api/getalluserinformation', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '') //we don't want that here
+ let unsigned = getunsigned(req, res) //has to be asking for it via the cookie
+ if (!unsigned) return
+ unsigned = decodeURIComponent(unsigned)
+ let sql = `select * from ipost.users where User_Name=? and User_PW=?;`
+ let values = unsigned.split(' ')
+ values[1] = SHA256(values[1], values[0], HASHES_DIFF)
con.query(sql, values, function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- res.status(200);
- res.json(result[0]);
+ res.status(200)
+ res.json(result[0])
+ } else {
+ res.status(402)
+ res.json({
+ error: 'you cannot access the api without being logged in',
+ })
}
- else {
- res.status(402);
- res.json({ "error": "you cannot access the api without being logged in" });
- }
- });
+ })
/* #swagger.security = [{
- "appTokenAuthHeader": []
- }] */
- });
- router.get("/api/getotheruser", function (req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- let username = req.query.user;
- let sql = `select User_Name,User_Bio,User_Avatar from ipost.users where User_Name=?;`;
+ "appTokenAuthHeader": []
+ }] */
+ })
+ router.get('/api/getotheruser', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ let username = req.query.user
+ let sql = `select User_Name,User_Bio,User_Avatar from ipost.users where User_Name=?;`
con.query(sql, [username], function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- res.json({ "username": username, "bio": result[0].User_Bio, "avatar": result[0].User_Avatar, "publicKey": result[0].User_PublicKey });
+ res.json({
+ username: username,
+ bio: result[0].User_Bio,
+ avatar: result[0].User_Avatar,
+ publicKey: result[0].User_PublicKey,
+ })
+ } else {
+ res.json({ error: 'there is no such user!' })
}
- else {
- res.json({ "error": "there is no such user!" });
- }
- });
- });
- router.post("/api/setBio", function (req, res) {
- res.set("Access-Control-Allow-Origin", "");
- let bio = req.body.Bio;
+ })
+ })
+ router.post('/api/setBio', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '')
+ let bio = req.body.Bio
if (!bio) {
- res.status(410);
- res.json({ "error": "no bio set!" });
- return;
+ res.status(410)
+ res.json({ error: 'no bio set!' })
+ return
}
- bio = encodeURIComponent(bio);
+ bio = encodeURIComponent(bio)
if (bio.length > 100) {
- res.status(411);
- res.json({ "error": "the bio is too long!" });
- return;
+ res.status(411)
+ res.json({ error: 'the bio is too long!' })
+ return
}
- let sql = `update ipost.users set User_Bio=? where User_Name=?`;
- con.query(sql, [bio, encodeURIComponent(res.locals.username)], function (err) {
- if (err)
- throw err;
- res.json({ "success": "updated bio" });
- });
+ let sql = `update ipost.users set User_Bio=? where User_Name=?`
+ con.query(
+ sql,
+ [bio, encodeURIComponent(res.locals.username)],
+ function (err) {
+ if (err) throw err
+ res.json({ success: 'updated bio' })
+ }
+ )
/* #swagger.security = [{
- "appTokenAuthHeader": []
- }] */
- });
- router.post("/api/changePW", (req, res) => {
- res.set("Access-Control-Allow-Origin", "");
- if ((typeof req.body.newPW) !== "string") {
- res.json({ "error": "incorrect password" });
- return;
+ "appTokenAuthHeader": []
+ }] */
+ })
+ router.post('/api/changePW', (req, res) => {
+ res.set('Access-Control-Allow-Origin', '')
+ if (typeof req.body.newPW !== 'string') {
+ res.json({ error: 'incorrect password' })
+ return
}
- if ((typeof req.body.currentPW) !== "string") {
- res.json({ "error": "incorrect password" });
- return;
+ if (typeof req.body.currentPW !== 'string') {
+ res.json({ error: 'incorrect password' })
+ return
}
if (req.body.newPW.length < 10) {
- res.status(410);
- res.json({ "error": "password is too short" });
- return;
+ res.status(410)
+ res.json({ error: 'password is too short' })
+ return
}
- let hashed_pw = SHA256(req.body.currentPW, res.locals.username, HASHES_DB);
- let hashed_new_pw = SHA256(req.body.newPW, res.locals.username, HASHES_DB);
- let sql = `select * from ipost.users where User_Name=? and User_PW=?;`;
- let values = [res.locals.username, hashed_pw];
+ let hashed_pw = SHA256(
+ req.body.currentPW,
+ res.locals.username,
+ HASHES_DB
+ )
+ let hashed_new_pw = SHA256(
+ req.body.newPW,
+ res.locals.username,
+ HASHES_DB
+ )
+ let sql = `select * from ipost.users where User_Name=? and User_PW=?;`
+ let values = [res.locals.username, hashed_pw]
con.query(sql, values, function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- let sql = `update ipost.users set User_PW=? where User_Name=? and User_PW=?;`;
- let values = [hashed_new_pw, res.locals.username, hashed_pw];
+ let sql = `update ipost.users set User_PW=? where User_Name=? and User_PW=?;`
+ let values = [hashed_new_pw, res.locals.username, hashed_pw]
con.query(sql, values, (err2) => {
- if (err2)
- throw err2;
- let ip = getIP(req);
+ if (err2) throw err2
+ let ip = getIP(req)
let setTo = `${res.locals.username} ${SHA256(req.body.newPW, res.locals.username, HASHES_COOKIE)}`
- let cookiesigned = signature.sign(setTo, cookiesecret + ip);
- res.cookie('AUTH_COOKIE', cookiesigned, { maxAge: Math.pow(10, 10), httpOnly: true, secure: true });
- res.json({ "success": "successfully changed password" });
- });
+ let cookiesigned = signature.sign(setTo, cookiesecret + ip)
+ res.cookie('AUTH_COOKIE', cookiesigned, {
+ maxAge: Math.pow(10, 10),
+ httpOnly: true,
+ secure: true,
+ })
+ res.json({ success: 'successfully changed password' })
+ })
+ } else {
+ res.json({ error: 'invalid password' })
}
- else {
- res.json({ "error": "invalid password" });
- }
- });
+ })
/* #swagger.security = [{
- "appTokenAuthHeader": []
- }] */
- });
- router.post("/api/changeUsername", function (req, res) {
- res.set("Access-Control-Allow-Origin", "");
- if ((typeof req.body.newUsername) !== "string") {
- res.status(410);
- res.json({ "error": "incorrect username" });
- return;
+ "appTokenAuthHeader": []
+ }] */
+ })
+ router.post('/api/changeUsername', function (req, res) {
+ res.set('Access-Control-Allow-Origin', '')
+ if (typeof req.body.newUsername !== 'string') {
+ res.status(410)
+ res.json({ error: 'incorrect username' })
+ return
}
- if ((typeof req.body.currentPW) !== "string") {
- res.status(411);
- res.json({ "error": "incorrect password" });
- return;
+ if (typeof req.body.currentPW !== 'string') {
+ res.status(411)
+ res.json({ error: 'incorrect password' })
+ return
}
if (req.body.newUsername.length > 100) {
- res.status(412);
- res.json({ "error": "username is too long" });
- return;
+ res.status(412)
+ res.json({ error: 'username is too long' })
+ return
}
if (req.body.newUsername === res.locals.username) {
- res.status(413);
- res.json({ "error": "username can't be the current one" });
- return;
+ res.status(413)
+ res.json({ error: "username can't be the current one" })
+ return
}
- let hashed_pw = SHA256(req.body.currentPW, res.locals.username, HASHES_DB);
- let hashed_new_pw = SHA256(req.body.currentPW, req.body.newUsername, HASHES_DB);
- let sql = `select * from ipost.users where User_Name=? and User_PW=?;`; //check if pw is correct
- let values = [res.locals.username,hashed_pw];
+ let hashed_pw = SHA256(
+ req.body.currentPW,
+ res.locals.username,
+ HASHES_DB
+ )
+ let hashed_new_pw = SHA256(
+ req.body.currentPW,
+ req.body.newUsername,
+ HASHES_DB
+ )
+ let sql = `select * from ipost.users where User_Name=? and User_PW=?;` //check if pw is correct
+ let values = [res.locals.username, hashed_pw]
con.query(sql, values, function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- let sql = `select * from ipost.users where User_Name=?;`; //check if newUsername isn't already used
- let values = [req.body.newUsername];
+ let sql = `select * from ipost.users where User_Name=?;` //check if newUsername isn't already used
+ let values = [req.body.newUsername]
con.query(sql, values, function (err, result) {
- if (err)
- throw err;
+ if (err) throw err
if (result[0]) {
- res.json({ "error": "user with that username already exists" });
- return;
+ res.json({
+ error: 'user with that username already exists',
+ })
+ return
}
- let sql = `update ipost.users set User_PW=?,User_Name=? where User_Name=? and User_PW=?;`; //change username in users
- let values = [hashed_new_pw, req.body.newUsername, res.locals.username, hashed_pw];
+ let sql = `update ipost.users set User_PW=?,User_Name=? where User_Name=? and User_PW=?;` //change username in users
+ let values = [
+ hashed_new_pw,
+ req.body.newUsername,
+ res.locals.username,
+ hashed_pw,
+ ]
con.query(sql, values, function (err) {
- if (err)
- throw err;
- let ip = getIP(req);
+ if (err) throw err
+ let ip = getIP(req)
let setTo = `${req.body.newUsername} ${SHA256(req.body.currentPW, req.body.newUsername, HASHES_COOKIE)}`
- let cookiesigned = signature.sign(setTo, cookiesecret + ip);
- res.cookie('AUTH_COOKIE', cookiesigned, { maxAge: Math.pow(10, 10), httpOnly: true, secure: true });
+ let cookiesigned = signature.sign(
+ setTo,
+ cookiesecret + ip
+ )
+ res.cookie('AUTH_COOKIE', cookiesigned, {
+ maxAge: Math.pow(10, 10),
+ httpOnly: true,
+ secure: true,
+ })
//updated username in the users table, but not yet on posts
//TODO: update username on dms
- let sql = `update ipost.posts set post_user_name=? where post_user_name=?;`; //change username of every past post sent
- let values = [req.body.newUsername, res.locals.username, hashed_pw];
+ let sql = `update ipost.posts set post_user_name=? where post_user_name=?;` //change username of every past post sent
+ let values = [
+ req.body.newUsername,
+ res.locals.username,
+ hashed_pw,
+ ]
con.query(sql, values, () => {
- res.json({ "success": "successfully changed username" }); //done
- });
- });
- });
+ res.json({
+ success: 'successfully changed username',
+ }) //done
+ })
+ })
+ })
+ } else {
+ res.json({ error: 'invalid password' })
}
- else {
- res.json({ "error": "invalid password" });
- }
- });
+ })
/* #swagger.security = [{
- "appTokenAuthHeader": []
- }] */
- });
-}
\ No newline at end of file
+ "appTokenAuthHeader": []
+ }] */
+ })
+}
diff --git a/routes/authorize.js b/routes/authorize.js
index 3445ccf..a986831 100644
--- a/routes/authorize.js
+++ b/routes/authorize.js
@@ -1,59 +1,72 @@
-import {randomBytes} from "crypto"
-import {SHA256} from "../extra_modules/SHA.js";
-import {unsign} from "../extra_modules/unsign.js";
+import { randomBytes } from 'crypto'
+import { SHA256 } from '../extra_modules/SHA.js'
+import { unsign } from '../extra_modules/unsign.js'
export const setup = function (router, con, server) {
const temp_code_to_token = {}
- router.post("/authorize",async (req,res) => {
- if (!unsign(req.cookies.AUTH_COOKIE, req, res)){
+ router.post('/authorize', async (req, res) => {
+ if (!unsign(req.cookies.AUTH_COOKIE, req, res)) {
return
}
- let data = await server.hcaptcha.verify(req.body["h-captcha-response"])
-
- if(data.success) {
+ let data = await server.hcaptcha.verify(req.body['h-captcha-response'])
+ if (data.success) {
let appid = req.body.application_id
- if(typeof appid === "string") {
+ if (typeof appid === 'string') {
appid = Number(appid)
}
- if(typeof appid === "number") {
+ if (typeof appid === 'number') {
+ const token = randomBytes(150).toString('base64')
- const token = randomBytes(150).toString("base64")
-
- let tokencode;
- while(tokencode===undefined || temp_code_to_token[tokencode]!==undefined) {
- tokencode = randomBytes(15).toString("base64").replaceAll("/","f").replaceAll("+","A") //"/" and "+" may break some apps
+ let tokencode
+ while (
+ tokencode === undefined ||
+ temp_code_to_token[tokencode] !== undefined
+ ) {
+ tokencode = randomBytes(15)
+ .toString('base64')
+ .replaceAll('/', 'f')
+ .replaceAll('+', 'A') //"/" and "+" may break some apps
}
- temp_code_to_token[tokencode]={
- "userid":res.locals.userid,
- "appid":appid,
- "token":token
+ temp_code_to_token[tokencode] = {
+ userid: res.locals.userid,
+ appid: appid,
+ token: token,
}
- setTimeout(() => {
- let data = temp_code_to_token[tokencode]
- if(data !== undefined && data.token===token && data.appid === appid && data.userid === res.locals.userid) {
- temp_code_to_token[tokencode]=undefined
- }
- }, 1000*60*5);
+ setTimeout(
+ () => {
+ let data = temp_code_to_token[tokencode]
+ if (
+ data !== undefined &&
+ data.token === token &&
+ data.appid === appid &&
+ data.userid === res.locals.userid
+ ) {
+ temp_code_to_token[tokencode] = undefined
+ }
+ },
+ 1000 * 60 * 5
+ )
- const sql = "SELECT application_auth_url FROM ipost.application where application_id=?"
+ const sql =
+ 'SELECT application_auth_url FROM ipost.application where application_id=?'
- con.query(sql,[appid],(err,result) => {
- if(err || result.length !== 1) {
+ con.query(sql, [appid], (err, result) => {
+ if (err || result.length !== 1) {
console.err(err)
res.redirect(`/authorize?id=${req.body.application_id}`)
return
}
- let extra = ""
- if(req.body.application_extra !== "") {
- extra = "&extra="+String(req.body.application_extra)
+ let extra = ''
+ if (req.body.application_extra !== '') {
+ extra = '&extra=' + String(req.body.application_extra)
}
- res.redirect(`${result[0].application_auth_url}?code=${tokencode}${extra}`)
+ res.redirect(
+ `${result[0].application_auth_url}?code=${tokencode}${extra}`
+ )
})
-
-
return
}
}
@@ -65,71 +78,79 @@ export const setup = function (router, con, server) {
}] */
})
- router.post("/redeemauthcode", (req,res) => {
-
- if(temp_code_to_token[req.body.authcode]===undefined) {
+ router.post('/redeemauthcode', (req, res) => {
+ if (temp_code_to_token[req.body.authcode] === undefined) {
res.status(400)
- res.json({"status":400,"message":"invalid code given"})
+ res.json({ status: 400, message: 'invalid code given' })
return
}
- if(typeof req.body.auth === "string") {
- try{
+ if (typeof req.body.auth === 'string') {
+ try {
req.body.auth = JSON.parse(req.body.auth)
- } catch(err) {
- console.log("error parsing",err)
+ } catch (err) {
+ console.log('error parsing', err)
}
}
- if(
- typeof req.body.auth !== "object" ||
- typeof req.body.auth.secret !== "string" ||
- typeof req.body.auth.appid !== "number" ||
- req.body.auth.secret.length !== 200 ||
- Buffer.from(req.body.auth.secret,"base64").length !== 150 ||
+ if (
+ typeof req.body.auth !== 'object' ||
+ typeof req.body.auth.secret !== 'string' ||
+ typeof req.body.auth.appid !== 'number' ||
+ req.body.auth.secret.length !== 200 ||
+ Buffer.from(req.body.auth.secret, 'base64').length !== 150 ||
req.body.auth.appid !== temp_code_to_token[req.body.authcode].appid
) {
//console.log(1,req.body.auth,temp_code_to_token[req.body.authcode].appid)
- res.status(420).send("invalid authentication object")
- return;
+ res.status(420).send('invalid authentication object')
+ return
}
const appid = req.body.auth.appid
- const checksecret = SHA256(req.body.auth.secret,appid,10000)
+ const checksecret = SHA256(req.body.auth.secret, appid, 10000)
- const checksql = "SELECT application_id from ipost.application where application_secret=? and application_id=?"
- const checkvalues = [checksecret,appid]
+ const checksql =
+ 'SELECT application_id from ipost.application where application_secret=? and application_id=?'
+ const checkvalues = [checksecret, appid]
- con.query(checksql,checkvalues,(error,result_object) => {
-
- if(error || result_object[0]===undefined || result_object[0].application_id!==appid) {
+ con.query(checksql, checkvalues, (error, result_object) => {
+ if (
+ error ||
+ result_object[0] === undefined ||
+ result_object[0].application_id !== appid
+ ) {
res.status(400)
- res.json({"status":400,"message":"invalid code given"})
+ res.json({ status: 400, message: 'invalid code given' })
return
}
let data = temp_code_to_token[req.body.authcode]
temp_code_to_token[req.body.authcode] = undefined
+ const sql =
+ 'INSERT INTO `ipost`.`auth_tokens`(`auth_token`,`auth_token_u_id`,`auth_token_isfrom_application_id`) VALUES(?,?,?);'
- const sql = "INSERT INTO `ipost`.`auth_tokens`(`auth_token`,`auth_token_u_id`,`auth_token_isfrom_application_id`) VALUES(?,?,?);"
-
- const values = [SHA256(data.token,appid,10000),data.userid,data.appid] //token,id,appid
- con.query(sql,values,(err,result) => {
- if(err) {
- res.json({"status":500,"message":"error redeeming code"})
+ const values = [
+ SHA256(data.token, appid, 10000),
+ data.userid,
+ data.appid,
+ ] //token,id,appid
+ con.query(sql, values, (err, result) => {
+ if (err) {
+ res.json({ status: 500, message: 'error redeeming code' })
console.err(err)
} else {
- res.json({"status":200,"message":"successfully redeemed code","token":data.token})
+ res.json({
+ status: 200,
+ message: 'successfully redeemed code',
+ token: data.token,
+ })
}
})
})
-
-
-
})
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
-}
\ No newline at end of file
+}
diff --git a/routes/logout.js b/routes/logout.js
index c00d47f..99d751e 100644
--- a/routes/logout.js
+++ b/routes/logout.js
@@ -1,10 +1,13 @@
export const setup = function (router, con, server) {
-
const increaseUSERCall = server.increaseUSERCall
- router.get("/logout", function (req, res) {
- if (!increaseUSERCall(req, res))return;
- res.cookie("AUTH_COOKIE", "", { maxAge: 0, httpOnly: true, secure: true });
- res.redirect("/");
- });
-}
\ No newline at end of file
+ router.get('/logout', function (req, res) {
+ if (!increaseUSERCall(req, res)) return
+ res.cookie('AUTH_COOKIE', '', {
+ maxAge: 0,
+ httpOnly: true,
+ secure: true,
+ })
+ res.redirect('/')
+ })
+}
diff --git a/routes/serve_static_files.js b/routes/serve_static_files.js
index bd33eed..09917b7 100644
--- a/routes/serve_static_files.js
+++ b/routes/serve_static_files.js
@@ -1,74 +1,73 @@
-import {existsSync} from "fs"
+import { existsSync } from 'fs'
export const setup = function (router, con, server) {
const increaseUSERCall = server.increaseUSERCall
const __dirname = server.dirname
- const dir = __dirname + "/"
-
- router.get("/users/:user", function (req, res) {
- if (!increaseUSERCall(req, res))
- return;
- res.sendFile(dir + "views/otheruser.html");
- });
- router.get("/css/:file", (request, response) => {
- if (!increaseUSERCall(request, response))
- return;
+ const dir = __dirname + '/'
+
+ router.get('/users/:user', function (req, res) {
+ if (!increaseUSERCall(req, res)) return
+ res.sendFile(dir + 'views/otheruser.html')
+ })
+ router.get('/css/:file', (request, response) => {
+ if (!increaseUSERCall(request, response)) return
if (existsSync(`${__dirname}/css/${request.params.file}`)) {
- response.sendFile(`${__dirname}/css/${request.params.file}`);
+ response.sendFile(`${__dirname}/css/${request.params.file}`)
+ } else {
+ response.status(404).send('no file with that name found')
}
- else {
- response.status(404).send("no file with that name found");
- }
- return;
- });
- router.get("/js/:file", (request, response) => {
- if (!increaseUSERCall(request, response))
- return;
+ return
+ })
+ router.get('/js/:file', (request, response) => {
+ if (!increaseUSERCall(request, response)) return
if (existsSync(`${__dirname}/js/${request.params.file}`)) {
- response.sendFile(`${__dirname}/js/${request.params.file}`);
+ response.sendFile(`${__dirname}/js/${request.params.file}`)
+ } else {
+ response.status(404).send('no file with that name found')
}
- else {
- response.status(404).send("no file with that name found");
- }
- return;
- });
- router.get("/images/:file", (request, response) => {
- if (!increaseUSERCall(request, response))
- return;
+ return
+ })
+ router.get('/images/:file', (request, response) => {
+ if (!increaseUSERCall(request, response)) return
if (existsSync(`${__dirname}/images/${request.params.file}`)) {
- response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
- response.sendFile(`${__dirname}/images/${request.params.file}`);
+ response.set('Cache-Control', 'public, max-age=2592000') //cache it for one month-ish
+ response.sendFile(`${__dirname}/images/${request.params.file}`)
+ } else if (
+ existsSync(
+ `${__dirname}/images/${request.params.file.toLowerCase()}`
+ )
+ ) {
+ response.set('Cache-Control', 'public, max-age=2592000') //cache it for one month-ish
+ response.sendFile(
+ `${__dirname}/images/${request.params.file.toLowerCase()}`
+ )
+ } else {
+ response.status(404).send('no file with that name found')
}
- else if(existsSync(`${__dirname}/images/${request.params.file.toLowerCase()}`)){
- response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
- response.sendFile(`${__dirname}/images/${request.params.file.toLowerCase()}`);
- }
- else {
- response.status(404).send("no file with that name found");
- }
- return;
- });
-
- router.get("/user_uploads/:file", (request, response) => {
- if (!increaseUSERCall(request, response))
- return;
+ return
+ })
+
+ router.get('/user_uploads/:file', (request, response) => {
+ if (!increaseUSERCall(request, response)) return
if (existsSync(`${__dirname}/user_uploads/${request.params.file}`)) {
- response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
- response.sendFile(`${__dirname}/user_uploads/${request.params.file}`);
+ response.set('Cache-Control', 'public, max-age=2592000') //cache it for one month-ish
+ response.sendFile(
+ `${__dirname}/user_uploads/${request.params.file}`
+ )
+ } else {
+ response.status(404).send('no file with that name found')
}
- else {
- response.status(404).send("no file with that name found");
- }
- return;
- });
-
- router.get("/avatars/:avatar", (request, response) => {
- if (!increaseUSERCall(request, response))
- return;
- response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
+ return
+ })
+
+ router.get('/avatars/:avatar', (request, response) => {
+ if (!increaseUSERCall(request, response)) return
+ response.set('Cache-Control', 'public, max-age=2592000') //cache it for one month-ish
if (existsSync(`${__dirname}/avatars/${request.params.avatar}`)) {
- return response.sendFile(`${__dirname}/avatars/${request.params.avatar}`);
+ return response.sendFile(
+ `${__dirname}/avatars/${request.params.avatar}`
+ )
}
- response.status(404).send("No avatar with that name found");
- });
-}
\ No newline at end of file
+ response.status(404).send('No avatar with that name found')
+ })
+}
diff --git a/routes/setup_all_routes.js b/routes/setup_all_routes.js
index e7634bf..9f0ea8c 100644
--- a/routes/setup_all_routes.js
+++ b/routes/setup_all_routes.js
@@ -1,29 +1,28 @@
-import { setup as optionssetup } from "./api/options.js";
-import { setup as allsetup } from "./api/all.js";
-import { setup as settingshandlersetup } from "./api/settingshandler.js";
-import { setup as postsetup } from "./api/post.js";
-import { setup as dmsPersonalMessagessetup } from "./api/dms/PersonalMessages.js";
-import { setup as dmspostsetup } from "./api/dms/post.js";
-import { setup as fileiconsetup } from "./api/getFileIcon.js";
-import { setup as searchsetup } from "./api/search.js";
-import { setup as getpostssetup } from "./api/getPosts.js";
-import { setup as userroutessetup } from "./api/userRoutes.js";
-import { setup as servefilessetup} from "./serve_static_files.js"
-import { setup as userfilessetup} from "./userfiles.js"
-import { setup as userauthsetup} from "./user_auth.js"
-import { setup as applicationsetup} from "./authorize.js"
-import { setup as logoutsetup} from "./logout.js"
-
+import { setup as optionssetup } from './api/options.js'
+import { setup as allsetup } from './api/all.js'
+import { setup as settingshandlersetup } from './api/settingshandler.js'
+import { setup as postsetup } from './api/post.js'
+import { setup as dmsPersonalMessagessetup } from './api/dms/PersonalMessages.js'
+import { setup as dmspostsetup } from './api/dms/post.js'
+import { setup as fileiconsetup } from './api/getFileIcon.js'
+import { setup as searchsetup } from './api/search.js'
+import { setup as getpostssetup } from './api/getPosts.js'
+import { setup as userroutessetup } from './api/userRoutes.js'
+import { setup as servefilessetup } from './serve_static_files.js'
+import { setup as userfilessetup } from './userfiles.js'
+import { setup as userauthsetup } from './user_auth.js'
+import { setup as applicationsetup } from './authorize.js'
+import { setup as logoutsetup } from './logout.js'
export const setup = function (router, con, server) {
- const setuproute = handler => handler(router,con,server)
+ const setuproute = (handler) => handler(router, con, server)
setuproute(optionssetup)
setuproute(allsetup)
setuproute(settingshandlersetup)
- const get_pid = setuproute(postsetup);
+ const get_pid = setuproute(postsetup)
setuproute(dmsPersonalMessagessetup)
- const get_dmpid = setuproute(dmspostsetup);
+ const get_dmpid = setuproute(dmspostsetup)
setuproute(fileiconsetup)
setuproute(searchsetup)
setuproute(getpostssetup)
@@ -36,8 +35,8 @@ export const setup = function (router, con, server) {
}
server.global_page_variables = global_page_variables
setuproute(userfilessetup) //needs getPID and getDMPID
-
+
setuproute(userauthsetup) //login & register
setuproute(applicationsetup)
-}
\ No newline at end of file
+}
diff --git a/routes/user_auth.js b/routes/user_auth.js
index 6838082..65581b2 100644
--- a/routes/user_auth.js
+++ b/routes/user_auth.js
@@ -1,172 +1,200 @@
-import {SHA256} from "../extra_modules/SHA.js";
-import * as signature from "cookie-signature";
-import getIP from "../extra_modules/getip.js";
-import {readFileSync} from "fs"
+import { SHA256 } from '../extra_modules/SHA.js'
+import * as signature from 'cookie-signature'
+import getIP from '../extra_modules/getip.js'
+import { readFileSync } from 'fs'
-const cookiesecret = readFileSync("cookiesecret.txt").toString();
+const cookiesecret = readFileSync('cookiesecret.txt').toString()
export const setup = function (router, con, server) {
const config = server.config
const DID_I_FINALLY_ADD_HTTPS = server.DID_I_FINALLY_ADD_HTTPS
const increaseAPICall = server.increaseAPICall
- const HASHES_DB = config.cookies.server_hashes;
- const HASHES_COOKIE = config.cookies.client_hashes;
- const HASHES_DIFF = HASHES_DB - HASHES_COOKIE;
+ const HASHES_DB = config.cookies.server_hashes
+ const HASHES_COOKIE = config.cookies.client_hashes
+ const HASHES_DIFF = HASHES_DB - HASHES_COOKIE
- router.post("/register", function (req, res) {
- for (let i = 0; i < 10; i++) { //don't want people spam registering
- if (!increaseAPICall(req, res))
- return;
+ router.post('/register', function (req, res) {
+ for (let i = 0; i < 10; i++) {
+ //don't want people spam registering
+ if (!increaseAPICall(req, res)) return
}
- res.status(200);
- if ((typeof req.body.user) !== "string") {
- res.status(416);
- res.json({ "error": "incorrect username" });
- return;
+ res.status(200)
+ if (typeof req.body.user !== 'string') {
+ res.status(416)
+ res.json({ error: 'incorrect username' })
+ return
}
- if ((typeof req.body.pass) !== "string") {
- res.status(417);
- res.json({ "error": "incorrect password" });
- return;
+ if (typeof req.body.pass !== 'string') {
+ res.status(417)
+ res.json({ error: 'incorrect password' })
+ return
}
- let username = req.body.user.toString();
- username = username.replace(/\s/gi, "");
- let password = req.body.pass.toString();
+ let username = req.body.user.toString()
+ username = username.replace(/\s/gi, '')
+ let password = req.body.pass.toString()
if (!username) {
- res.status(410);
- res.redirect("/register?success=false&reason=username");
- return;
+ res.status(410)
+ res.redirect('/register?success=false&reason=username')
+ return
}
- if (username === "") {
- res.status(411);
- res.redirect("/register?success=false&reason=username");
- return;
+ if (username === '') {
+ res.status(411)
+ res.redirect('/register?success=false&reason=username')
+ return
}
if (password.length < 10) {
- res.status(412);
- res.send("password is too short");
- return;
+ res.status(412)
+ res.send('password is too short')
+ return
}
if (username.length > 25) {
- res.status(413);
- res.send("username is too long");
- return;
+ res.status(413)
+ res.send('username is too long')
+ return
}
- if (username.search("@") !== -1) {
- res.status(414);
- res.send("username can't contain @-characters");
- return;
+ if (username.search('@') !== -1) {
+ res.status(414)
+ res.send("username can't contain @-characters")
+ return
}
if (!password) {
- res.status(415);
- res.redirect("/register?success=false&reason=password");
- return;
+ res.status(415)
+ res.redirect('/register?success=false&reason=password')
+ return
}
- let userexistssql = `SELECT User_Name from ipost.users where User_Name = ?`;
- con.query(userexistssql, [encodeURIComponent(username)], function (_error, result) {
- if (result && result[0] && result[0].User_Name) {
- res.status(418);
- res.redirect("/register?success=false&reason=already_exists");
- return;
- }
- let less_hashed_pw = SHA256(password, username, HASHES_DIFF);
- let hashed_pw = SHA256(less_hashed_pw, username, HASHES_COOKIE);
- let ip = getIP(req);
- let setTo = `${username} ${SHA256(password, username, HASHES_COOKIE)}`
- let cookiesigned = signature.sign(setTo, cookiesecret + ip);
- ip = SHA256(ip, setTo, HASHES_DB);
- const default_settings = {};
- let values = [encodeURIComponent(username), hashed_pw, Date.now(), ip, ip, JSON.stringify(default_settings)];
- let sql = `INSERT INTO ipost.users (User_Name, User_PW, User_CreationStamp, User_CreationIP, User_LastIP, User_Settings) VALUES (?, ?, ?, ?, ?, ?);`;
- con.query(sql, values, function (err) {
- if (err)
- throw err;
- res.cookie('AUTH_COOKIE', cookiesigned, { maxAge: Math.pow(10, 10), httpOnly: true, secure: DID_I_FINALLY_ADD_HTTPS });
- if(req.body.r !== undefined) {
- res.redirect(decodeURIComponent(req.body.r))
- } else {
- res.redirect("/user");
+ let userexistssql = `SELECT User_Name from ipost.users where User_Name = ?`
+ con.query(
+ userexistssql,
+ [encodeURIComponent(username)],
+ function (_error, result) {
+ if (result && result[0] && result[0].User_Name) {
+ res.status(418)
+ res.redirect(
+ '/register?success=false&reason=already_exists'
+ )
+ return
}
- });
- });
- });
- router.post("/login", function (req, res) {
- if (!increaseAPICall(req, res))
- return;
- if ((typeof req.body.user) !== "string") {
- res.status(416);
- res.json({ "error": "incorrect username" });
- return;
+ let less_hashed_pw = SHA256(password, username, HASHES_DIFF)
+ let hashed_pw = SHA256(less_hashed_pw, username, HASHES_COOKIE)
+ let ip = getIP(req)
+ let setTo = `${username} ${SHA256(password, username, HASHES_COOKIE)}`
+ let cookiesigned = signature.sign(setTo, cookiesecret + ip)
+ ip = SHA256(ip, setTo, HASHES_DB)
+ const default_settings = {}
+ let values = [
+ encodeURIComponent(username),
+ hashed_pw,
+ Date.now(),
+ ip,
+ ip,
+ JSON.stringify(default_settings),
+ ]
+ let sql = `INSERT INTO ipost.users (User_Name, User_PW, User_CreationStamp, User_CreationIP, User_LastIP, User_Settings) VALUES (?, ?, ?, ?, ?, ?);`
+ con.query(sql, values, function (err) {
+ if (err) throw err
+ res.cookie('AUTH_COOKIE', cookiesigned, {
+ maxAge: Math.pow(10, 10),
+ httpOnly: true,
+ secure: DID_I_FINALLY_ADD_HTTPS,
+ })
+ if (req.body.r !== undefined) {
+ res.redirect(decodeURIComponent(req.body.r))
+ } else {
+ res.redirect('/user')
+ }
+ })
+ }
+ )
+ })
+ router.post('/login', function (req, res) {
+ if (!increaseAPICall(req, res)) return
+ if (typeof req.body.user !== 'string') {
+ res.status(416)
+ res.json({ error: 'incorrect username' })
+ return
}
- if ((typeof req.body.pass) !== "string") {
- res.status(417);
- res.json({ "error": "incorrect password" });
- return;
+ if (typeof req.body.pass !== 'string') {
+ res.status(417)
+ res.json({ error: 'incorrect password' })
+ return
}
if (!req.body.user) {
- res.status(410);
- res.send("no username given");
- return;
+ res.status(410)
+ res.send('no username given')
+ return
}
if (!req.body.pass) {
- res.status(411);
- res.send("no password given");
- return;
+ res.status(411)
+ res.send('no password given')
+ return
}
- let username = req.body.user.toString();
- username = username.replace(" ", "");
- let password = req.body.pass.toString();
+ let username = req.body.user.toString()
+ username = username.replace(' ', '')
+ let password = req.body.pass.toString()
if (!username) {
- res.status(412);
- res.send("no username given");
- return;
+ res.status(412)
+ res.send('no username given')
+ return
}
if (username.length > 25) {
- res.status(413);
- res.send("username is too long");
- return;
+ res.status(413)
+ res.send('username is too long')
+ return
}
if (password.length < 10) {
- res.status(414);
- res.send("password is too short");
- return;
+ res.status(414)
+ res.send('password is too short')
+ return
}
if (!password) {
- res.status(415);
- res.send("no password given");
- return;
+ res.status(415)
+ res.send('no password given')
+ return
}
- const no_ip_lock = username.endsWith("@unsafe")
- username = username.replace("@unsafe","")
+ const no_ip_lock = username.endsWith('@unsafe')
+ username = username.replace('@unsafe', '')
- let less_hashed_pw = SHA256(password, username, HASHES_DIFF);
- let hashed_pw = SHA256(less_hashed_pw, username, HASHES_COOKIE);
- let userexistssql = `SELECT * from ipost.users where User_Name = ? and User_PW = ?;`;
- con.query(userexistssql, [encodeURIComponent(username), hashed_pw], function (_error, result) {
- if (result && result[0]) {
- let ip = getIP(req);
- let setTo = `${username} ${SHA256(password, username, HASHES_COOKIE)}`
- let cookiesigned = signature.sign(setTo, cookiesecret + (!no_ip_lock ? ip : ""));
- res.cookie('AUTH_COOKIE', cookiesigned, { maxAge: Math.pow(10, 10), httpOnly: true, secure: DID_I_FINALLY_ADD_HTTPS });
- ip = SHA256(ip, setTo, HASHES_DB);
- if (result[0].User_LastIP !== ip) {
- let sql = `update ipost.users set User_LastIP = ? where User_Name = ?;`;
- con.query(sql, [ip, encodeURIComponent(username)], function (error) {
- if (error)
- throw error;
- });
- }
- if(req.body.r !== undefined) {
- res.redirect(decodeURIComponent(req.body.r))
+ let less_hashed_pw = SHA256(password, username, HASHES_DIFF)
+ let hashed_pw = SHA256(less_hashed_pw, username, HASHES_COOKIE)
+ let userexistssql = `SELECT * from ipost.users where User_Name = ? and User_PW = ?;`
+ con.query(
+ userexistssql,
+ [encodeURIComponent(username), hashed_pw],
+ function (_error, result) {
+ if (result && result[0]) {
+ let ip = getIP(req)
+ let setTo = `${username} ${SHA256(password, username, HASHES_COOKIE)}`
+ let cookiesigned = signature.sign(
+ setTo,
+ cookiesecret + (!no_ip_lock ? ip : '')
+ )
+ res.cookie('AUTH_COOKIE', cookiesigned, {
+ maxAge: Math.pow(10, 10),
+ httpOnly: true,
+ secure: DID_I_FINALLY_ADD_HTTPS,
+ })
+ ip = SHA256(ip, setTo, HASHES_DB)
+ if (result[0].User_LastIP !== ip) {
+ let sql = `update ipost.users set User_LastIP = ? where User_Name = ?;`
+ con.query(
+ sql,
+ [ip, encodeURIComponent(username)],
+ function (error) {
+ if (error) throw error
+ }
+ )
+ }
+ if (req.body.r !== undefined) {
+ res.redirect(decodeURIComponent(req.body.r))
+ } else {
+ res.redirect('/user')
+ }
} else {
- res.redirect("/user");
+ console.log(5, 'login failed, username: ', username)
+ res.redirect('/login?success=false?reason=noUser')
}
}
- else {
- console.log(5,"login failed, username: ", username);
- res.redirect("/login?success=false?reason=noUser");
- }
- });
- });
-}
\ No newline at end of file
+ )
+ })
+}
diff --git a/routes/userfiles.js b/routes/userfiles.js
index e0a6fbc..1e1155a 100644
--- a/routes/userfiles.js
+++ b/routes/userfiles.js
@@ -1,15 +1,14 @@
-import ejs from "ejs"
-import { LRUCache as LRU } from "lru-cache"
-import { minify as min_js } from "uglify-js"
-import Clean from 'clean-css';
-import Minifier from 'html-minifier-terser';
-import { web_version } from "unsafe_encrypt";
-import { existsSync, readFileSync, readFile } from "fs"
+import ejs from 'ejs'
+import { LRUCache as LRU } from 'lru-cache'
+import { minify as min_js } from 'uglify-js'
+import Clean from 'clean-css'
+import Minifier from 'html-minifier-terser'
+import { web_version } from 'unsafe_encrypt'
+import { existsSync, readFileSync, readFile } from 'fs'
export const setup = function (router, con, server) {
-
const increaseUSERCall = server.increaseUSERCall
- const dir = server.dirname + "/"
+ const dir = server.dirname + '/'
ejs.cache = new LRU({ max: 20 })
@@ -22,47 +21,47 @@ export const setup = function (router, con, server) {
ttl: 1000 * 60,
allowStale: true,
updateAgeOnGet: true,
- updateAgeOnHas: true
+ updateAgeOnHas: true,
})
function load_var(filePath) {
if (load_var_cache.has(filePath)) {
- return load_var_cache.get(filePath);
+ return load_var_cache.get(filePath)
}
if (!existsSync(filePath)) {
- console.log(1, 'Tried loading non-existent file', filePath);
- load_var_cache.set(filePath, '');
- return '';
+ console.log(1, 'Tried loading non-existent file', filePath)
+ load_var_cache.set(filePath, '')
+ return ''
}
- let output = readFileSync(filePath);
+ let output = readFileSync(filePath)
if (filePath.endsWith('.js')) {
- output = min_js(output.toString()).code;
+ output = min_js(output.toString()).code
} else if (filePath.endsWith('.css')) {
- const { styles } = new Clean({}).minify(output.toString());
- output = styles;
+ const { styles } = new Clean({}).minify(output.toString())
+ output = styles
}
- load_var_cache.set(filePath, output);
- return output;
+ load_var_cache.set(filePath, output)
+ return output
}
function get_channels() {
return new Promise(function (resolve, reject) {
- let sql = `select post_receiver_name from ipost.posts where post_is_private = '0' group by post_receiver_name;`;
+ let sql = `select post_receiver_name from ipost.posts where post_is_private = '0' group by post_receiver_name;`
con.query(sql, [], function (err, result) {
if (err) reject(err)
let out = []
for (let channel of result) {
- if (channel.post_receiver_name === "") continue;
+ if (channel.post_receiver_name === '') continue
out[out.length] = channel.post_receiver_name
}
resolve(out)
- });
+ })
})
}
@@ -78,52 +77,55 @@ export const setup = function (router, con, server) {
res(appId_Cache.get(appid) || {})
return
}
- con.query("SELECT * FROM ipost.application WHERE application_id=?", [appid], (err, result) => {
- if (err) {
- console.error(err)
- rej({})
- return
+ con.query(
+ 'SELECT * FROM ipost.application WHERE application_id=?',
+ [appid],
+ (err, result) => {
+ if (err) {
+ console.error(err)
+ rej({})
+ return
+ }
+ appId_Cache.set(appid, result[0])
+ res(result[0] || {})
}
- appId_Cache.set(appid, result[0])
- res(result[0] || {})
- })
+ )
})
}
let global_page_variables = {
- globalcss: load_var("./css/global.css"),
- httppostjs: load_var("./js/httppost.js"),
- navbar: load_var("./extra_modules/navbar.html"),
- markdownjs: load_var("./js/markdown.js"),
- htmlescapejs: load_var("./js/htmlescape.js"),
- warnmessagejs: load_var("./js/warn_message.js"),
+ globalcss: load_var('./css/global.css'),
+ httppostjs: load_var('./js/httppost.js'),
+ navbar: load_var('./extra_modules/navbar.html'),
+ markdownjs: load_var('./js/markdown.js'),
+ htmlescapejs: load_var('./js/htmlescape.js'),
+ warnmessagejs: load_var('./js/warn_message.js'),
loadfile: load_var,
getChannels: get_channels,
encryptJS: min_js(web_version().toString()).code,
cookiebanner: ``,
getPID: server.global_page_variables.getPID,
getDMPID: server.global_page_variables.getDMPID,
- unauthorized_description: "Chat now by creating an account on IPost",
+ unauthorized_description: 'Chat now by creating an account on IPost',
hcaptcha_sitekey: server.hcaptcha.sitekey,
- getAppWithId: getAppWithId
+ getAppWithId: getAppWithId,
}
-
-
async function handleUserFiles(request, response, overrideurl) {
- if (!increaseUSERCall(request, response)) return;
- if (typeof overrideurl !== "string") overrideurl = undefined;
+ if (!increaseUSERCall(request, response)) return
+ if (typeof overrideurl !== 'string') overrideurl = undefined
- let originalUrl = overrideurl
- || request.params.file
- || request.originalUrl.split("?").shift(); //backup in case anything goes wrong
+ let originalUrl =
+ overrideurl ||
+ request.params.file ||
+ request.originalUrl.split('?').shift() //backup in case anything goes wrong
- let path = ""
- if (existsSync(dir + "views/" + originalUrl)) {
- path = dir + "views/" + originalUrl
+ let path = ''
+ if (existsSync(dir + 'views/' + originalUrl)) {
+ path = dir + 'views/' + originalUrl
//send .txt files as plaintext to help browsers interpret it correctly
- if (originalUrl.endsWith(".txt")) {
- response.set('Content-Type', 'text/plain');
+ if (originalUrl.endsWith('.txt')) {
+ response.set('Content-Type', 'text/plain')
readFile(path, (err, data) => {
if (err) return
response.send(data)
@@ -131,90 +133,109 @@ export const setup = function (router, con, server) {
return
}
}
- if (existsSync(dir + "views/" + originalUrl + "index.html")) {
- path = dir + "views/" + originalUrl + "index.html"
+ if (existsSync(dir + 'views/' + originalUrl + 'index.html')) {
+ path = dir + 'views/' + originalUrl + 'index.html'
}
- if (existsSync(dir + "views/" + originalUrl + ".html")) {
- path = dir + "views/" + originalUrl + ".html"
+ if (existsSync(dir + 'views/' + originalUrl + '.html')) {
+ path = dir + 'views/' + originalUrl + '.html'
}
- if (existsSync(dir + "views" + originalUrl + ".html")) {
- path = dir + "views" + originalUrl + ".html"
+ if (existsSync(dir + 'views' + originalUrl + '.html')) {
+ path = dir + 'views' + originalUrl + '.html'
}
- if (path !== "" && originalUrl !== "favicon.ico" && originalUrl !== "api_documentation" && originalUrl !== "api_documentation.html") {
+ if (
+ path !== '' &&
+ originalUrl !== 'favicon.ico' &&
+ originalUrl !== 'api_documentation' &&
+ originalUrl !== 'api_documentation.html'
+ ) {
console.log(originalUrl)
- global_page_variables.user = { "username": response.locals.username, "bio": response.locals.bio, "avatar": response.locals.avatar }
- global_page_variables.query = request.query
- if (originalUrl === "authorize") {
- global_page_variables.application = await getAppWithId(request.query.id)
+ global_page_variables.user = {
+ username: response.locals.username,
+ bio: response.locals.bio,
+ avatar: response.locals.avatar,
}
- ejs.renderFile(path, global_page_variables, { async: true }, async function (err, str) {
- str = await str
- err = await err
- if (err) {
- console.log(1, err)
- response.status(500)
- response.send("error")
- //TODO: make error page
- return
- }
- try {
- str = await Minifier.minify(str, {
- removeComments: true,
- removeCommentsFromCDATA: true,
- removeCDATASectionsFromCDATA: true,
- collapseWhitespace: true,
- collapseBooleanAttributes: true,
- removeAttributeQuotes: true,
- removeRedundantAttributes: true,
- useShortDoctype: true,
- removeEmptyAttributes: true
- })
- } catch (ignored) {
- console.log(2, "error minifying", originalUrl);
- }
+ global_page_variables.query = request.query
+ if (originalUrl === 'authorize') {
+ global_page_variables.application = await getAppWithId(
+ request.query.id
+ )
+ }
+ ejs.renderFile(
+ path,
+ global_page_variables,
+ { async: true },
+ async function (err, str) {
+ str = await str
+ err = await err
+ if (err) {
+ console.log(1, err)
+ response.status(500)
+ response.send('error')
+ //TODO: make error page
+ return
+ }
+ try {
+ str = await Minifier.minify(str, {
+ removeComments: true,
+ removeCommentsFromCDATA: true,
+ removeCDATASectionsFromCDATA: true,
+ collapseWhitespace: true,
+ collapseBooleanAttributes: true,
+ removeAttributeQuotes: true,
+ removeRedundantAttributes: true,
+ useShortDoctype: true,
+ removeEmptyAttributes: true,
+ })
+ } catch (ignored) {
+ console.log(2, 'error minifying', originalUrl)
+ }
- try {
- response.send(str)
- } catch (err) {
- console.error(err)
+ try {
+ response.send(str)
+ } catch (err) {
+ console.error(err)
+ }
}
- })
- return;
+ )
+ return
}
- if (originalUrl === "api_documentation" || originalUrl === "api_documentation.html") {
- response.set('Cache-Control', 'public, max-age=2592000');
+ if (
+ originalUrl === 'api_documentation' ||
+ originalUrl === 'api_documentation.html'
+ ) {
+ response.set('Cache-Control', 'public, max-age=2592000')
response.set('Content-Type', 'text/html')
- response.send(load_var("./views/api_documentation.html"))
+ response.send(load_var('./views/api_documentation.html'))
return
}
- if (originalUrl === "favicon.ico") {
- response.set('Cache-Control', 'public, max-age=2592000');
- response.sendFile(dir + "/views/favicon.ico")
+ if (originalUrl === 'favicon.ico') {
+ response.set('Cache-Control', 'public, max-age=2592000')
+ response.sendFile(dir + '/views/favicon.ico')
return
}
- console.log(5, "no file found", originalUrl);
+ console.log(5, 'no file found', originalUrl)
try {
- response.status(404).send("No file with that name found");
+ response.status(404).send('No file with that name found')
} catch (err) {
console.error(err)
}
}
/**
- * Handle default URI as /index (interpreted redirect: "localhost" -> "localhost/index" )
- */
- router.get("/", (req, res) => {
- req.params.file = "index"
- handleUserFiles(req, res, "/index")
- });
+ * Handle default URI as /index (interpreted redirect: "localhost" -> "localhost/index" )
+ */
+ router.get('/', (req, res) => {
+ req.params.file = 'index'
+ handleUserFiles(req, res, '/index')
+ })
- router.get("/:file", handleUserFiles);
- router.get("/:folder/:file", (req, res) => {
- req.params.file = req.params.folder + "/" + req.params.file
+ router.get('/:file', handleUserFiles)
+ router.get('/:folder/:file', (req, res) => {
+ req.params.file = req.params.folder + '/' + req.params.file
handleUserFiles(req, res)
- });
-}
\ No newline at end of file
+ })
+}
diff --git a/server.js b/server.js
index ed1cb86..e9233c7 100644
--- a/server.js
+++ b/server.js
@@ -1,21 +1,21 @@
-import http from "http";
-import express,{Router} from "express";
-import useragent from "express-useragent";
-import fileUpload from "express-fileupload";
-import * as bodyParser from "body-parser";
-import cookieParser from "cookie-parser";
-import * as mysql from "mysql2";
-import * as ws from "ws";
-import getIP from "./extra_modules/getip.js";
-import {unsign} from "./extra_modules/unsign.js";
-import { readFileSync, appendFile } from "fs";
-import { format } from "util";
-import { setup as SETUP_ROUTES} from "./routes/setup_all_routes.js"
-import { verify as verifyHCaptcha_int } from "hcaptcha"
+import http from 'http'
+import express, { Router } from 'express'
+import useragent from 'express-useragent'
+import fileUpload from 'express-fileupload'
+import * as bodyParser from 'body-parser'
+import cookieParser from 'cookie-parser'
+import * as mysql from 'mysql2'
+import * as ws from 'ws'
+import getIP from './extra_modules/getip.js'
+import { unsign } from './extra_modules/unsign.js'
+import { readFileSync, appendFile } from 'fs'
+import { format } from 'util'
+import { setup as SETUP_ROUTES } from './routes/setup_all_routes.js'
+import { verify as verifyHCaptcha_int } from 'hcaptcha'
-import { ensureExists } from "./extra_modules/ensureExists.js"
+import { ensureExists } from './extra_modules/ensureExists.js'
-import * as compress from "compression"
+import * as compress from 'compression'
const compression = compress.default
import { fileURLToPath } from 'url'
@@ -23,9 +23,9 @@ import { dirname } from 'path'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
-const config = JSON.parse(readFileSync("server_config.json"));
-const time = Date.now();
-const original_log = console.log;
+const config = JSON.parse(readFileSync('server_config.json'))
+const time = Date.now()
+const original_log = console.log
/**
* custom logging function
* @param {number} level importance level if information
@@ -33,41 +33,48 @@ const original_log = console.log;
* @return {undefined} returns nothing
*/
function log_info(level, ...info) {
- let text = info;
+ let text = info
if (text === undefined || text.length === 0) {
- text = level;
- level = 5;
+ text = level
+ level = 5
}
- if (config["logs"] && config["logs"]["level"] && config["logs"]["level"] >= level) {
- let tolog = `[INFO] [${Date.now()}] : ${format(text)} \n`;
- original_log(tolog); //still has some nicer colors
+ if (
+ config['logs'] &&
+ config['logs']['level'] &&
+ config['logs']['level'] >= level
+ ) {
+ let tolog = `[INFO] [${Date.now()}] : ${format(text)} \n`
+ original_log(tolog) //still has some nicer colors
ensureExists(__dirname + '/logs/', function (err) {
if (err) {
- process.stderr.write(tolog); //just write it to stderr
- }
- else {
- appendFile(__dirname + "/logs/" + time, tolog, function (err) {
+ process.stderr.write(tolog) //just write it to stderr
+ } else {
+ appendFile(__dirname + '/logs/' + time, tolog, function (err) {
if (err) {
- process.stderr.write(err);
+ process.stderr.write(err)
}
- });
+ })
}
- });
+ })
}
}
//console.log = log_info;
-
const hcaptcha_secret = config.hcaptcha_secret
// wrapper for the HCaptcha verify function
function verifyHCaptcha(token) {
- return verifyHCaptcha_int(hcaptcha_secret,token,undefined,config.hcaptcha_sitekey)
+ return verifyHCaptcha_int(
+ hcaptcha_secret,
+ token,
+ undefined,
+ config.hcaptcha_sitekey
+ )
}
-const WebSocket = ws.WebSocketServer;
+const WebSocket = ws.WebSocketServer
-const router = Router();
-const app = express();
+const router = Router()
+const app = express()
const con = mysql.createPool({
connectionLimit: config.mysql.connections,
host: config.mysql.host,
@@ -75,8 +82,8 @@ const con = mysql.createPool({
password: readFileSync(config.mysql.password_file).toString(),
multipleStatements: true,
supportBigNumbers: true,
-});
-const cookiesecret = readFileSync("cookiesecret.txt").toString();
+})
+const cookiesecret = readFileSync('cookiesecret.txt').toString()
/**
* custom, bad random number generator
@@ -85,194 +92,203 @@ const cookiesecret = readFileSync("cookiesecret.txt").toString();
*/
class RNG {
constructor(seed) {
- if (!seed)
- seed = Date.now();
- this.seed = seed;
+ if (!seed) seed = Date.now()
+ this.seed = seed
this.random = function (min, max) {
- if (!min)
- min = 0;
+ if (!min) min = 0
if (!max) {
- max = min;
- min = 0;
+ max = min
+ min = 0
}
- this.seed += Math.log(Math.abs(Math.sin(this.seed)) * 100);
- return Math.abs(Math.sin(this.seed)) * max + min;
- };
+ this.seed += Math.log(Math.abs(Math.sin(this.seed)) * 100)
+ return Math.abs(Math.sin(this.seed)) * max + min
+ }
this.rand = function (min, max) {
- return Math.floor(this.random(min, max));
- };
+ return Math.floor(this.random(min, max))
+ }
}
}
-const rand = new RNG();
-const genstring_characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-const genstring_charactersLength = genstring_characters.length;
+const rand = new RNG()
+const genstring_characters =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
+const genstring_charactersLength = genstring_characters.length
/**
* generates a semi-random string
* @param {number} length length of string to generate
* @return {string} semi-random string generated
*/
function genstring(length) {
- let result = "";
+ let result = ''
for (let i = 0; i < length; i++) {
- result += genstring_characters.charAt(rand.rand(genstring_charactersLength));
+ result += genstring_characters.charAt(
+ rand.rand(genstring_charactersLength)
+ )
}
- return result;
+ return result
}
-var API_CALLS = {};
-var API_CALLS_ACCOUNT = {};
-var USER_CALLS = {};
-var SESSIONS = {};
-var REVERSE_SESSIONS = {};
-var INDIVIDUAL_CALLS = {};
+var API_CALLS = {}
+var API_CALLS_ACCOUNT = {}
+var USER_CALLS = {}
+var SESSIONS = {}
+var REVERSE_SESSIONS = {}
+var INDIVIDUAL_CALLS = {}
/**
* clears current api call list (per IP)
* @return {undefined} returns nothing
*/
function clear_api_calls() {
- API_CALLS = {};
+ API_CALLS = {}
}
/**
* clears current api account call list (per account)
* @return {undefined} returns nothing
*/
function clear_account_api_calls() {
- API_CALLS_ACCOUNT = {};
+ API_CALLS_ACCOUNT = {}
}
/**
* clears current user file call list (per IP)
* @return {undefined} returns nothing
*/
function clear_user_calls() {
- USER_CALLS = {};
+ USER_CALLS = {}
}
-setInterval(clear_api_calls, config.rate_limits.api.reset_time);
-setInterval(clear_account_api_calls, config.rate_limits.api.reset_time);
-setInterval(clear_user_calls, config.rate_limits.user.reset_time);
+setInterval(clear_api_calls, config.rate_limits.api.reset_time)
+setInterval(clear_account_api_calls, config.rate_limits.api.reset_time)
+setInterval(clear_user_calls, config.rate_limits.user.reset_time)
function increaseIndividualCall(url, req) {
- let conf = config["rate_limits"]["individual"][url];
+ let conf = config['rate_limits']['individual'][url]
if (!conf) {
//if(!url.startsWith("/avatars/")) //ignore avatars /* DEBUG: inidividual ratelimiters */
- //console.log(5, "url not in individual ratelimiter", url); /* DEBUG: inidividual ratelimiters */
- return true;
+ //console.log(5, "url not in individual ratelimiter", url); /* DEBUG: inidividual ratelimiters */
+ return true
}
- if (!conf["enabled"])
- return true;
- let ip = getIP(req);
- if (INDIVIDUAL_CALLS[ip] === undefined)
- INDIVIDUAL_CALLS[ip] = {};
- if (INDIVIDUAL_CALLS[ip][url] === undefined)
- INDIVIDUAL_CALLS[ip][url] = 0;
+ if (!conf['enabled']) return true
+ let ip = getIP(req)
+ if (INDIVIDUAL_CALLS[ip] === undefined) INDIVIDUAL_CALLS[ip] = {}
+ if (INDIVIDUAL_CALLS[ip][url] === undefined) INDIVIDUAL_CALLS[ip][url] = 0
if (INDIVIDUAL_CALLS[ip][url] === 0) {
setTimeout(function () {
- INDIVIDUAL_CALLS[ip][url] = 0;
- }, conf["reset_time"]);
+ INDIVIDUAL_CALLS[ip][url] = 0
+ }, conf['reset_time'])
}
- INDIVIDUAL_CALLS[ip][url]++;
- if (INDIVIDUAL_CALLS[ip][url] >= conf["max"]) {
- console.log(3, "ratelimiting someone on", url, INDIVIDUAL_CALLS[ip][url], conf["max"],ip);
- return false;
+ INDIVIDUAL_CALLS[ip][url]++
+ if (INDIVIDUAL_CALLS[ip][url] >= conf['max']) {
+ console.log(
+ 3,
+ 'ratelimiting someone on',
+ url,
+ INDIVIDUAL_CALLS[ip][url],
+ conf['max'],
+ ip
+ )
+ return false
}
- return true;
+ return true
}
function increaseAccountAPICall(req, res) {
- let cookie = req.cookies.AUTH_COOKIE;
+ let cookie = req.cookies.AUTH_COOKIE
if (!cookie) {
- return true;
+ return true
}
- let unsigned = unsign(cookie, req, res);
+ let unsigned = unsign(cookie, req, res)
if (!unsigned) {
- return true; //if there's no account, why not just ignore it
+ return true //if there's no account, why not just ignore it
}
- unsigned = decodeURIComponent(unsigned);
- if (!unsigned)
- return false;
- let values = unsigned.split(" ");
- let username = values[0];
+ unsigned = decodeURIComponent(unsigned)
+ if (!unsigned) return false
+ let values = unsigned.split(' ')
+ let username = values[0]
if (API_CALLS_ACCOUNT[username] === undefined)
- API_CALLS_ACCOUNT[username] = 0;
+ API_CALLS_ACCOUNT[username] = 0
if (API_CALLS_ACCOUNT[username] >= config.rate_limits.api.max_per_account) {
- res.status(429);
- res.send("You are sending way too many api calls!");
- return false;
+ res.status(429)
+ res.send('You are sending way too many api calls!')
+ return false
}
- return true;
+ return true
}
function increaseAPICall(req, res, next) {
- let ip = getIP(req);
- if (API_CALLS[ip] === undefined)
- API_CALLS[ip] = 0;
+ let ip = getIP(req)
+ if (API_CALLS[ip] === undefined) API_CALLS[ip] = 0
if (API_CALLS[ip] >= config.rate_limits.api.max_without_session) {
- if (REVERSE_SESSIONS[ip] && req.cookies.session !== REVERSE_SESSIONS[ip]) { //expected a session, but didn't get one
- res.status(429);
- res.send("You are sending way too many api calls!");
- return;
+ if (
+ REVERSE_SESSIONS[ip] &&
+ req.cookies.session !== REVERSE_SESSIONS[ip]
+ ) {
+ //expected a session, but didn't get one
+ res.status(429)
+ res.send('You are sending way too many api calls!')
+ return
}
if (!req.cookies.session) {
- let session;
+ let session
do {
- session = genstring(300);
- } while (SESSIONS[session] !== undefined);
- SESSIONS[session] = ip;
- REVERSE_SESSIONS[ip] = session;
+ session = genstring(300)
+ } while (SESSIONS[session] !== undefined)
+ SESSIONS[session] = ip
+ REVERSE_SESSIONS[ip] = session
setTimeout(function () {
- SESSIONS[session] = undefined;
- REVERSE_SESSIONS[ip] = undefined;
- }, 50000);
- res.cookie('session', session, { maxAge: 100000, httpOnly: true, secure: true });
- console.log(3, "sending session to " + ip);
+ SESSIONS[session] = undefined
+ REVERSE_SESSIONS[ip] = undefined
+ }, 50000)
+ res.cookie('session', session, {
+ maxAge: 100000,
+ httpOnly: true,
+ secure: true,
+ })
+ console.log(3, 'sending session to ' + ip)
}
}
if (API_CALLS[ip] >= config.rate_limits.api.max_with_session) {
- res.status(429);
- res.send("You are sending too many api calls!");
- console.log(3, "rate limiting " + ip);
- return false;
+ res.status(429)
+ res.send('You are sending too many api calls!')
+ console.log(3, 'rate limiting ' + ip)
+ return false
}
- API_CALLS[ip]++;
- if (!increaseAccountAPICall(req, res))
- return false; //can't forget account-based ratelimits
- if (next)
- next();
- return true;
+ API_CALLS[ip]++
+ if (!increaseAccountAPICall(req, res)) return false //can't forget account-based ratelimits
+ if (next) next()
+ return true
}
function increaseUSERCall(req, res, next) {
- let ip = getIP(req);
- if (USER_CALLS[ip] === undefined)
- USER_CALLS[ip] = 0;
+ let ip = getIP(req)
+ if (USER_CALLS[ip] === undefined) USER_CALLS[ip] = 0
if (USER_CALLS[ip] >= config.rate_limits.user.max) {
- res.status(429);
- res.send("You are sending too many requests!");
- console.log(2, "rate limiting " + ip);
- return false;
+ res.status(429)
+ res.send('You are sending too many requests!')
+ console.log(2, 'rate limiting ' + ip)
+ return false
}
- USER_CALLS[ip]++;
- if (next)
- next();
- return true;
+ USER_CALLS[ip]++
+ if (next) next()
+ return true
}
-console.log(5, "loading routes");
-app.use(useragent.express());
-app.use(fileUpload({
- limits: {
- files: 5,
- fileSize: 1_000_000
- }
-}));
+console.log(5, 'loading routes')
+app.use(useragent.express())
+app.use(
+ fileUpload({
+ limits: {
+ files: 5,
+ fileSize: 1_000_000,
+ },
+ })
+)
app.use((_req, res, next) => {
- res.set("x-powered-by", "ipost");
- res.set("X-Frame-Options","DENY");
- res.set("X-XSS-Protection","1; mode=block");
- res.set("X-Content-Type-Options","nosniff");
- res.set("Referrer-Policy","no-referrer");
+ res.set('x-powered-by', 'ipost')
+ res.set('X-Frame-Options', 'DENY')
+ res.set('X-XSS-Protection', '1; mode=block')
+ res.set('X-Content-Type-Options', 'nosniff')
+ res.set('Referrer-Policy', 'no-referrer')
next()
})
-app.use(bodyParser.default.json({ limit: "100mb" }));
-app.use(bodyParser.default.urlencoded({ limit: "100mb", extended: true }));
-app.use(cookieParser(cookiesecret));
+app.use(bodyParser.default.json({ limit: '100mb' }))
+app.use(bodyParser.default.urlencoded({ limit: '100mb', extended: true }))
+app.use(cookieParser(cookiesecret))
app.use(compression())
let blocked_headers = [
'HTTP_VIA',
@@ -289,43 +305,42 @@ let blocked_headers = [
'FORWARDED',
'CLIENT_IP',
'FORWARDED_FOR_IP',
- 'HTTP_PROXY_CONNECTION'
-];
+ 'HTTP_PROXY_CONNECTION',
+]
if (!config.disallow_proxies_by_headers) {
- blocked_headers = [];
+ blocked_headers = []
}
app.use(function (_req, res, next) {
- res.set("X-XSS-Protection", "1; mode=block");
- next();
-});
+ res.set('X-XSS-Protection', '1; mode=block')
+ next()
+})
-app.use("/*path", function (req, res, next) {
+app.use('/*path', function (req, res, next) {
for (let i = 0; i < blocked_headers.length; i++) {
if (req.header(blocked_headers[i]) !== undefined) {
- res.json({ "error": "we don't allow proxies on our website." });
- return;
+ res.json({ error: "we don't allow proxies on our website." })
+ return
}
}
- let fullurl = req.baseUrl + req.path;
- if (fullurl !== "/") {
- fullurl = fullurl.substring(0, fullurl.length - 1);
+ let fullurl = req.baseUrl + req.path
+ if (fullurl !== '/') {
+ fullurl = fullurl.substring(0, fullurl.length - 1)
}
if (!increaseIndividualCall(fullurl, req)) {
- res.status(429);
- res.json({ "error": "you are sending too many requests!" });
- return;
+ res.status(429)
+ res.json({ error: 'you are sending too many requests!' })
+ return
}
- next();
-});
-console.log(5, "finished loading user routes, starting with api routes");
-
+ next()
+})
+console.log(5, 'finished loading user routes, starting with api routes')
/*
START /API/*
*/
-var wss;
+var wss
var commonfunctions = {
increaseAPICall,
increaseUSERCall,
@@ -334,41 +349,39 @@ var commonfunctions = {
wss,
genstring,
ensureExists,
- "dirname": __dirname,
+ dirname: __dirname,
config,
hcaptcha: {
- "verify":verifyHCaptcha,
- "sitekey":config.hcaptcha_sitekey
- }
-};
+ verify: verifyHCaptcha,
+ sitekey: config.hcaptcha_sitekey,
+ },
+}
-SETUP_ROUTES(router,con,commonfunctions)
+SETUP_ROUTES(router, con, commonfunctions)
-
-router.get("/api/getChannels", function (_req, res) {
- res.set("Access-Control-Allow-Origin", "*");
- let sql = `select post_receiver_name from ipost.posts where post_is_private = '0' group by post_receiver_name;`;
+router.get('/api/getChannels', function (_req, res) {
+ res.set('Access-Control-Allow-Origin', '*')
+ let sql = `select post_receiver_name from ipost.posts where post_is_private = '0' group by post_receiver_name;`
con.query(sql, [], function (err, result) {
- if (err)
- throw err;
- res.json(result);
- });
+ if (err) throw err
+ res.json(result)
+ })
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
-});
+})
/*
END /API/*
*/
-console.log(5, "finished loading routes");
-app.use(router);
-const httpServer = http.createServer(app);
-httpServer.listen(config["ports"]["http"], function () {
- console.log(5, "HTTP Server is listening");
-});
+console.log(5, 'finished loading routes')
+app.use(router)
+const httpServer = http.createServer(app)
+httpServer.listen(config['ports']['http'], function () {
+ console.log(5, 'HTTP Server is listening')
+})
wss = new WebSocket({
server: httpServer,
@@ -376,27 +389,27 @@ wss = new WebSocket({
zlibDeflateOptions: {
chunkSize: 1024,
memLevel: 7,
- level: 3
+ level: 3,
},
zlibInflateOptions: {
- chunkSize: 10 * 1024
+ chunkSize: 10 * 1024,
},
clientNoContextTakeover: true,
serverNoContextTakeover: true,
serverMaxWindowBits: 10,
concurrencyLimit: 10,
- threshold: 1024 * 16
- }
-});
-wss.on("connection", function connection(ws) {
- ws.channel = "everyone";
- console.log(5,"new connection");
- ws.on("message", function incoming(message) {
- message = JSON.parse(message);
- if (message.id === "switchChannel") {
- ws.channel = decodeURIComponent(message.data);
+ threshold: 1024 * 16,
+ },
+})
+wss.on('connection', function connection(ws) {
+ ws.channel = 'everyone'
+ console.log(5, 'new connection')
+ ws.on('message', function incoming(message) {
+ message = JSON.parse(message)
+ if (message.id === 'switchChannel') {
+ ws.channel = decodeURIComponent(message.data)
}
- });
-});
-commonfunctions.wss = wss;
-console.log(5, "starting up all services");
+ })
+})
+commonfunctions.wss = wss
+console.log(5, 'starting up all services')
diff --git a/server_config.json b/server_config.json
index d18812e..9b39356 100644
--- a/server_config.json
+++ b/server_config.json
@@ -1,168 +1,168 @@
{
- "allow_getotheruser_without_cookie": true,
- "preferred_ip_header": "x-real-ip",
- "only_prefer_when_ip": "::ffff:127.0.0.1",
- "mysql": {
- "connections":1000,
- "host":"db",
- "user":"ipost",
- "password_file":"mysql_password.txt"
- },
- "cookies": {
- "server_hashes": 10000,
- "client_hashes": 10
- },
- "rate_limits": {
- "api": {
- "reset_time": 40000,
- "max_without_session": 30,
- "max_with_session": 120,
- "max_per_account": 200
+ "allow_getotheruser_without_cookie": true,
+ "preferred_ip_header": "x-real-ip",
+ "only_prefer_when_ip": "::ffff:127.0.0.1",
+ "mysql": {
+ "connections": 1000,
+ "host": "db",
+ "user": "ipost",
+ "password_file": "mysql_password.txt"
},
- "user": {
- "reset_time": 30000,
- "max": 60
+ "cookies": {
+ "server_hashes": 10000,
+ "client_hashes": 10
},
- "individual": {
- "/" : {
- "enabled": true,
- "max": 4,
- "reset_time": 10000
- },
- "/favicon.ico": {
- "enabled": true,
- "max": 5,
- "reset_time": 5000
- },
- "/js/warn_message.js" : {
- "enabled": true,
- "max": 10,
- "reset_time": 5000
- },
- "/js/addnavbar.js" : {
- "enabled": true,
- "max": 10,
- "reset_time": 5000
- },
- "/css/style.css" : {
- "enabled": true,
- "max": 5,
- "reset_time": 5000
- },
- "/css/logon.css" : {
- "enabled": true,
- "max": 10,
- "reset_time": 5000
- },
- "/css/global.css" : {
- "enabled": true,
- "max": 10,
- "reset_time": 5000
- },
- "/api/getuser" : {
- "enabled": true,
- "max": 10,
- "reset_time": 10000
- },
- "/api/getotheruser" : {
- "enabled": true,
- "max": 60,
- "reset_time": 10000
- },
- "/login" : {
- "enabled": true,
- "max": 6,
- "reset_time": 10000
- },
- "/settings" : {
- "enabled": true,
- "max": 4,
- "reset_time": 5000
- },
- "/images/default_avatar.png" : {
- "enabled": true,
- "max": 20,
- "reset_time": 10000
- },
- "/images/bot.png" : {
- "enabled": true,
- "max": 10,
- "reset_time": 10000
- },
- "/images/settings_min.png" : {
- "enabled": true,
- "max": 10,
- "reset_time": 10000
- },
- "/js/markdown.js" : {
- "enabled": true,
- "max": 5,
- "reset_time": 10000
- },
- "/posts" : {
- "enabled": true,
- "max": 5,
- "reset_time": 10000
- },
- "/js/httppost.js" : {
- "enabled": true,
- "max": 10,
- "reset_time": 10000
- },
- "/js/htmlescape.js" : {
- "enabled": true,
- "max": 10,
- "reset_time": 10000
- },
- "/api/getPosts" : {
- "enabled": true,
- "max": 10,
- "reset_time": 20000
- },
- "/api/setBio": {
- "enabled": true,
- "max": 3,
- "reset_time": 20000
- },
- "/api/setavatar": {
- "enabled": true,
- "max": 6,
- "reset_time": 120000
- },
- "/api/getPost": {
- "enabled": true,
- "max": 40,
- "reset_time": 30000
- },
- "/api/pid": {
- "enabled": true,
- "max": 30,
- "reset_time": 30000
- },
- "api/getChannels": {
- "enabled": true,
- "max": 10,
- "reset_time": 20000
- },
- "api/getPostsLowerThan": {
- "enabled": true,
- "max": 20,
- "reset_time": 10000
- }
- }
- },
- "logs": {
- "level": 5
- },
- "ssl": {
- "privateKey": "/etc/letsencrypt/live/ipost.rocks-0002/privkey.pem",
- "certificate" : "/etc/letsencrypt/live/ipost.rocks-0002/fullchain.pem"
- },
- "ports": {
- "http": 80,
- "https": 443
- },
- "disallow_proxies_by_headers": true,
- "hcaptcha_secret": "0x0000000000000000000000000000000000000000",
- "hcaptcha_sitekey": "10000000-ffff-ffff-ffff-000000000001"
+ "rate_limits": {
+ "api": {
+ "reset_time": 40000,
+ "max_without_session": 30,
+ "max_with_session": 120,
+ "max_per_account": 200
+ },
+ "user": {
+ "reset_time": 30000,
+ "max": 60
+ },
+ "individual": {
+ "/": {
+ "enabled": true,
+ "max": 4,
+ "reset_time": 10000
+ },
+ "/favicon.ico": {
+ "enabled": true,
+ "max": 5,
+ "reset_time": 5000
+ },
+ "/js/warn_message.js": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 5000
+ },
+ "/js/addnavbar.js": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 5000
+ },
+ "/css/style.css": {
+ "enabled": true,
+ "max": 5,
+ "reset_time": 5000
+ },
+ "/css/logon.css": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 5000
+ },
+ "/css/global.css": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 5000
+ },
+ "/api/getuser": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 10000
+ },
+ "/api/getotheruser": {
+ "enabled": true,
+ "max": 60,
+ "reset_time": 10000
+ },
+ "/login": {
+ "enabled": true,
+ "max": 6,
+ "reset_time": 10000
+ },
+ "/settings": {
+ "enabled": true,
+ "max": 4,
+ "reset_time": 5000
+ },
+ "/images/default_avatar.png": {
+ "enabled": true,
+ "max": 20,
+ "reset_time": 10000
+ },
+ "/images/bot.png": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 10000
+ },
+ "/images/settings_min.png": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 10000
+ },
+ "/js/markdown.js": {
+ "enabled": true,
+ "max": 5,
+ "reset_time": 10000
+ },
+ "/posts": {
+ "enabled": true,
+ "max": 5,
+ "reset_time": 10000
+ },
+ "/js/httppost.js": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 10000
+ },
+ "/js/htmlescape.js": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 10000
+ },
+ "/api/getPosts": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 20000
+ },
+ "/api/setBio": {
+ "enabled": true,
+ "max": 3,
+ "reset_time": 20000
+ },
+ "/api/setavatar": {
+ "enabled": true,
+ "max": 6,
+ "reset_time": 120000
+ },
+ "/api/getPost": {
+ "enabled": true,
+ "max": 40,
+ "reset_time": 30000
+ },
+ "/api/pid": {
+ "enabled": true,
+ "max": 30,
+ "reset_time": 30000
+ },
+ "api/getChannels": {
+ "enabled": true,
+ "max": 10,
+ "reset_time": 20000
+ },
+ "api/getPostsLowerThan": {
+ "enabled": true,
+ "max": 20,
+ "reset_time": 10000
+ }
+ }
+ },
+ "logs": {
+ "level": 5
+ },
+ "ssl": {
+ "privateKey": "/etc/letsencrypt/live/ipost.rocks-0002/privkey.pem",
+ "certificate": "/etc/letsencrypt/live/ipost.rocks-0002/fullchain.pem"
+ },
+ "ports": {
+ "http": 80,
+ "https": 443
+ },
+ "disallow_proxies_by_headers": true,
+ "hcaptcha_secret": "0x0000000000000000000000000000000000000000",
+ "hcaptcha_sitekey": "10000000-ffff-ffff-ffff-000000000001"
}
diff --git a/swagger.cjs b/swagger.cjs
index 138b3ce..22704e7 100644
--- a/swagger.cjs
+++ b/swagger.cjs
@@ -1,78 +1,79 @@
-const fs = require('fs');
-const swaggerAutogen = require('swagger-autogen')();
+const fs = require('fs')
+const swaggerAutogen = require('swagger-autogen')()
const doc = {
- info: {
- title: 'IPost API',
- description: 'the official IPost.rocks API documentation',
- },
- host: 'ipost.rocks',
- schemes: ['https'],
- securityDefinitions: {
- appTokenAuthHeader: {
- type: 'apiKey',
- in: 'header', // can be 'header', 'query' or 'cookie'
- name: 'ipost-auth-token', // name of the header, query parameter or cookie
- description: 'authenticate using the authentication object in the header'
- }
- }
-};
-
-const outputFile = './swagger-api.json';
-const tempFile = './swagger-output.json';
-const endpointsFiles = ['./server.js'];
-
-function pushdirectory(currentpath) {
- fs.readdirSync(currentpath, {
- withFileTypes: true
- }).forEach(dirent => {
- if (dirent.isFile()) {
- endpointsFiles.push(currentpath + dirent.name);
- } else {
- pushdirectory(currentpath + dirent.name + "/");
- }
- });
+ info: {
+ title: 'IPost API',
+ description: 'the official IPost.rocks API documentation',
+ },
+ host: 'ipost.rocks',
+ schemes: ['https'],
+ securityDefinitions: {
+ appTokenAuthHeader: {
+ type: 'apiKey',
+ in: 'header', // can be 'header', 'query' or 'cookie'
+ name: 'ipost-auth-token', // name of the header, query parameter or cookie
+ description:
+ 'authenticate using the authentication object in the header',
+ },
+ },
}
-pushdirectory("./routes/");
+const outputFile = './swagger-api.json'
+const tempFile = './swagger-output.json'
+const endpointsFiles = ['./server.js']
-swaggerAutogen(tempFile, endpointsFiles, doc);
+function pushdirectory(currentpath) {
+ fs.readdirSync(currentpath, {
+ withFileTypes: true,
+ }).forEach((dirent) => {
+ if (dirent.isFile()) {
+ endpointsFiles.push(currentpath + dirent.name)
+ } else {
+ pushdirectory(currentpath + dirent.name + '/')
+ }
+ })
+}
+
+pushdirectory('./routes/')
+
+swaggerAutogen(tempFile, endpointsFiles, doc)
/*
Replace some error codes with own error codes, as described in error_codes.txt
*/
const to_replace = {
- "401": "login error (invalid cookie)",
- "402": "login error (bad cookie)",
- "403": "login error (no cookie)",
-
- "410": "argument/data error",
- "411": "argument/data error",
- "412": "argument/data error",
- "413": "argument/data error",
- "414": "argument/data error",
- "415": "argument/data error",
- "416": "argument/data error",
- "417": "argument/data error",
- "418": "argument/data error",
- "419": "argument/data error",
- "420": "invalid authetication object",
-
+ 401: 'login error (invalid cookie)',
+ 402: 'login error (bad cookie)',
+ 403: 'login error (no cookie)',
+
+ 410: 'argument/data error',
+ 411: 'argument/data error',
+ 412: 'argument/data error',
+ 413: 'argument/data error',
+ 414: 'argument/data error',
+ 415: 'argument/data error',
+ 416: 'argument/data error',
+ 417: 'argument/data error',
+ 418: 'argument/data error',
+ 419: 'argument/data error',
+ 420: 'invalid authetication object',
}
-let file = JSON.parse(fs.readFileSync(tempFile, 'utf8'));
+let file = JSON.parse(fs.readFileSync(tempFile, 'utf8'))
for (let path in file.paths) {
- for (let method in file.paths[path]) {
- for (let response in file.paths[path][method].responses) {
- if (to_replace[response]) {
- file.paths[path][method].responses[response].description = to_replace[response];
- }
+ for (let method in file.paths[path]) {
+ for (let response in file.paths[path][method].responses) {
+ if (to_replace[response]) {
+ file.paths[path][method].responses[response].description =
+ to_replace[response]
+ }
+ }
}
- }
}
-file = JSON.stringify(file);
+file = JSON.stringify(file)
console.log(file)
-fs.writeFileSync(outputFile, file);
-fs.rmSync(tempFile);
\ No newline at end of file
+fs.writeFileSync(outputFile, file)
+fs.rmSync(tempFile)
diff --git a/tests/index.js b/tests/index.js
index faa1cec..e5c001b 100644
--- a/tests/index.js
+++ b/tests/index.js
@@ -1 +1 @@
-//TODO: add some useful test cases
\ No newline at end of file
+//TODO: add some useful test cases