├── .gitignore ├── README.md ├── client ├── images │ ├── favicon.ico │ └── header.svg ├── index.html ├── js │ └── script.js └── style │ └── style.css └── server ├── .env.example ├── apillon-api.js ├── package-lock.json ├── package.json └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | # These are some examples of commonly ignored file patterns. 2 | # You should customize this list as applicable to your project. 3 | # Learn more about .gitignore: 4 | # https://www.atlassian.com/git/tutorials/saving-changes/gitignore 5 | 6 | .env 7 | # Node artifact files 8 | node_modules/ 9 | dist/ 10 | 11 | # Compiled Java class files 12 | *.class 13 | 14 | # Compiled Python bytecode 15 | *.py[cod] 16 | 17 | # Log files 18 | *.log 19 | 20 | # Package files 21 | *.jar 22 | 23 | # Maven 24 | target/ 25 | dist/ 26 | 27 | # JetBrains IDE 28 | .idea/ 29 | 30 | # Unit test reports 31 | TEST*.xml 32 | 33 | # Generated by MacOS 34 | .DS_Store 35 | 36 | # Generated by Windows 37 | Thumbs.db 38 | 39 | # Applications 40 | *.app 41 | *.exe 42 | *.war 43 | 44 | # Large media files 45 | *.mp4 46 | *.tiff 47 | *.avi 48 | *.flv 49 | *.mov 50 | *.wmv 51 | 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apillon OAuth Demo 2 | 3 | This project demonstrates how to implement OAuth authentication using the Apillon API. The client-side JavaScript code opens an OAuth window for the user to authenticate, and the server-side code generates an OAuth session, as well verifies the user's login. 4 | 5 | ### Client 6 | 7 | The client-side code is located in client/js/script.js. It contains the following key functions: 8 | 9 | - `getAuthToken()`: This function sends a GET request to the server to retrieve a session token. 10 | - `openOAuthPopup()`: This function opens a new window where the user can authenticate with Apillon. It uses the session token obtained from getAuthToken(). 11 | - `verifyUserLogin(oauthAuthToken)`: This function sends a POST request to the server to verify the user's login. It is called when the OAuth window sends a message indicating that the user has been verified. If the verification is successful, this function returns the user's account email address on Apillon, which can be further used in your own application. 12 | 13 | The client-side code also adds an event listener for the 'message' event. This event is triggered when the OAuth window sends a message to the main window. If the message's origin is 'apillon.io' and the message data indicates that the user has been verified, the OAuth window is closed and `verifyUserLogin()` is called with the user's OAuth token. 14 | 15 | ### Server 16 | 17 | The server-side code is located in server/server.js. It sets up an Express.js server with two routes: 18 | 19 | - `/session-token`: This route handles GET requests by sending a GET request to the Apillon API to retrieve a session token. The token is then sent back to the client. 20 | - `/verify-login:` This route handles POST requests by sending a request to the Apillon API to verify the user's login. The response from the Apillon API is then sent back to the client. The received token from the OAuth needs to be sent as a body parameter to this method, such that it can be verified through the Apillon API. 21 | 22 | ### Running the Server 23 | To start the server, navigate to the `server` directory and then run the following commands: 24 | - `npm install` 25 | - `npm start` 26 | 27 | This will start the server on port 3000. -------------------------------------------------------------------------------- /client/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Apillon/oauth-demo/6c6a3b549ad7b21d06d6a695d1c22b2c7f5cccf7/client/images/favicon.ico -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Apillon OAuth Demo 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 |

23 | A matter of minutes. And zero developing costs. Want to build your 24 | own NFT collection? 25 |

26 | 27 | Build with Apillon 28 | 29 |
30 |
31 | 32 |
33 |
34 |
35 |
36 |
37 | 40 |

41 |
42 |
43 |
44 | 45 | -------------------------------------------------------------------------------- /client/js/script.js: -------------------------------------------------------------------------------- 1 | let oAuthWindow; 2 | 3 | const getAuthToken = async () => { 4 | const response = await fetch('http://localhost:3000/session-token', { 5 | method: 'GET' 6 | }); 7 | const { data } = await response.json(); 8 | return data.sessionToken; 9 | } 10 | 11 | async function openOAuthPopup() { 12 | const sessionToken = await getAuthToken(); 13 | oAuthWindow = window.open( 14 | `https://oauth.apillon.io/?embedded=1&token=${sessionToken}`, 15 | 'Apillon OAuth Form', 16 | `height=${900} width=${450} resizable=no` 17 | ); 18 | } 19 | 20 | window.addEventListener('message', async event => { 21 | if (!event.origin?.includes('apillon.io')) return; 22 | if (!event.data.verified) { 23 | throw new Error('Invalid verification'); 24 | } 25 | // Close OAuth popup window 26 | oAuthWindow?.close(); 27 | 28 | verifyUserLogin(event.data.authToken); 29 | }, false); 30 | 31 | async function verifyUserLogin(oAuthToken) { 32 | const response = await fetch(`http://localhost:3000/verify-login`, { 33 | method: 'POST', 34 | body: JSON.stringify({ token: oAuthToken }), 35 | headers: new Headers({ 'Content-Type': 'application/json' }) 36 | }); 37 | const { data } = await response.json(); 38 | // Handle user email data response here 39 | console.log({ email: data.email }); 40 | document.getElementById('email').innerHTML = `Success! Email: ${data.email}`; 41 | } -------------------------------------------------------------------------------- /client/style/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #f0f2da; 3 | font-family: "IBM Plex Sans", sans-serif; 4 | font-style: normal; 5 | font-weight: 400; 6 | font-size: 12px; 7 | line-height: 1.66666; 8 | color: #141721; 9 | margin: 0; 10 | } 11 | 12 | .container { 13 | max-width: 1440px; 14 | width: 100%; 15 | padding: 32px 44px; 16 | margin: 0 auto; 17 | box-sizing: border-box; 18 | } 19 | 20 | .header { 21 | background: #141721; 22 | padding: 0px 32px; 23 | display: flex; 24 | flex-direction: row; 25 | justify-content: space-between; 26 | align-items: center; 27 | margin-bottom: 32px; 28 | } 29 | 30 | .header-r { 31 | display: inline-flex; 32 | } 33 | 34 | .box { 35 | display: flex; 36 | flex-direction: column; 37 | justify-content: space-between; 38 | overflow: hidden; 39 | } 40 | 41 | .box-content { 42 | padding: 16px 24px 24px; 43 | } 44 | 45 | .box img { 46 | height: 100%; 47 | object-fit: contain; 48 | } 49 | 50 | .box.collection { 51 | position: relative; 52 | padding: 30px; 53 | } 54 | 55 | .collection { 56 | padding: 16px; 57 | gap: 16px; 58 | } 59 | 60 | .br { 61 | border-radius: 12px; 62 | } 63 | 64 | .text-center { 65 | text-align: center; 66 | } 67 | 68 | h1 { 69 | font-weight: 700; 70 | font-size: 18px; 71 | line-height: 28px; 72 | color: #f0f2da; 73 | margin-top: 8px; 74 | margin-bottom: 8px; 75 | } 76 | 77 | button { 78 | position: relative; 79 | width: 50%; 80 | height: 40px; 81 | padding: 9px 20px; 82 | background: #78dce8; 83 | border-radius: 6px; 84 | animation-name: bounceOut; 85 | animation-duration: 50s; 86 | box-shadow: none; 87 | border: none; 88 | font-weight: 700; 89 | font-size: 13px; 90 | cursor: pointer; 91 | } 92 | 93 | button:hover { 94 | animation-name: bounceIn; 95 | animation-duration: 50s; 96 | } 97 | 98 | .builders { 99 | display: inline-block; 100 | font-weight: 700; 101 | font-size: 14px; 102 | line-height: 24px; 103 | color: #f9ff73; 104 | transition-property: all; 105 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 106 | transition-duration: 0.3s; 107 | } 108 | 109 | .builders:hover { 110 | color: #141721; 111 | background-color: #f9ff73; 112 | } 113 | 114 | @media (min-width: 767px) { 115 | .container { 116 | padding: 32px 88px; 117 | } 118 | 119 | .header-l { 120 | max-width: 404px; 121 | margin-right: 20px; 122 | } 123 | } 124 | 125 | @media (max-width: 768px) { 126 | .header { 127 | flex-wrap: wrap; 128 | justify-content: center; 129 | } 130 | 131 | .box.collection { 132 | padding-top: 60px; 133 | } 134 | } -------------------------------------------------------------------------------- /server/.env.example: -------------------------------------------------------------------------------- 1 | APILLON_API_KEY= 2 | APILLON_API_SECRET= -------------------------------------------------------------------------------- /server/apillon-api.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | require('dotenv').config() 3 | 4 | const apiKey = process.env.APILLON_API_KEY; 5 | const apiSecret = process.env.APILLON_API_SECRET; 6 | 7 | const apillonAuthAPI = axios.create({ 8 | baseURL: 'https://api.apillon.io/auth', 9 | timeout: 3000, 10 | headers: { 11 | 'Authorization': `Basic ${btoa(`${apiKey}:${apiSecret}`)}` 12 | } 13 | }); 14 | 15 | module.exports = { apillonAuthAPI }; -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apillon-oauth-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "apillon-oauth-server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^1.5.1", 13 | "dotenv": "^16.3.1", 14 | "express": "^4.18.2" 15 | } 16 | }, 17 | "node_modules/accepts": { 18 | "version": "1.3.8", 19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 20 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 21 | "dependencies": { 22 | "mime-types": "~2.1.34", 23 | "negotiator": "0.6.3" 24 | }, 25 | "engines": { 26 | "node": ">= 0.6" 27 | } 28 | }, 29 | "node_modules/array-flatten": { 30 | "version": "1.1.1", 31 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 32 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 33 | }, 34 | "node_modules/asynckit": { 35 | "version": "0.4.0", 36 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 37 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 38 | }, 39 | "node_modules/axios": { 40 | "version": "1.5.1", 41 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", 42 | "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", 43 | "dependencies": { 44 | "follow-redirects": "^1.15.0", 45 | "form-data": "^4.0.0", 46 | "proxy-from-env": "^1.1.0" 47 | } 48 | }, 49 | "node_modules/body-parser": { 50 | "version": "1.20.1", 51 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 52 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 53 | "dependencies": { 54 | "bytes": "3.1.2", 55 | "content-type": "~1.0.4", 56 | "debug": "2.6.9", 57 | "depd": "2.0.0", 58 | "destroy": "1.2.0", 59 | "http-errors": "2.0.0", 60 | "iconv-lite": "0.4.24", 61 | "on-finished": "2.4.1", 62 | "qs": "6.11.0", 63 | "raw-body": "2.5.1", 64 | "type-is": "~1.6.18", 65 | "unpipe": "1.0.0" 66 | }, 67 | "engines": { 68 | "node": ">= 0.8", 69 | "npm": "1.2.8000 || >= 1.4.16" 70 | } 71 | }, 72 | "node_modules/bytes": { 73 | "version": "3.1.2", 74 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 75 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 76 | "engines": { 77 | "node": ">= 0.8" 78 | } 79 | }, 80 | "node_modules/call-bind": { 81 | "version": "1.0.2", 82 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 83 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 84 | "dependencies": { 85 | "function-bind": "^1.1.1", 86 | "get-intrinsic": "^1.0.2" 87 | }, 88 | "funding": { 89 | "url": "https://github.com/sponsors/ljharb" 90 | } 91 | }, 92 | "node_modules/combined-stream": { 93 | "version": "1.0.8", 94 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 95 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 96 | "dependencies": { 97 | "delayed-stream": "~1.0.0" 98 | }, 99 | "engines": { 100 | "node": ">= 0.8" 101 | } 102 | }, 103 | "node_modules/content-disposition": { 104 | "version": "0.5.4", 105 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 106 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 107 | "dependencies": { 108 | "safe-buffer": "5.2.1" 109 | }, 110 | "engines": { 111 | "node": ">= 0.6" 112 | } 113 | }, 114 | "node_modules/content-type": { 115 | "version": "1.0.5", 116 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 117 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 118 | "engines": { 119 | "node": ">= 0.6" 120 | } 121 | }, 122 | "node_modules/cookie": { 123 | "version": "0.5.0", 124 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 125 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 126 | "engines": { 127 | "node": ">= 0.6" 128 | } 129 | }, 130 | "node_modules/cookie-signature": { 131 | "version": "1.0.6", 132 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 133 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 134 | }, 135 | "node_modules/debug": { 136 | "version": "2.6.9", 137 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 138 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 139 | "dependencies": { 140 | "ms": "2.0.0" 141 | } 142 | }, 143 | "node_modules/delayed-stream": { 144 | "version": "1.0.0", 145 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 146 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 147 | "engines": { 148 | "node": ">=0.4.0" 149 | } 150 | }, 151 | "node_modules/depd": { 152 | "version": "2.0.0", 153 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 154 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 155 | "engines": { 156 | "node": ">= 0.8" 157 | } 158 | }, 159 | "node_modules/destroy": { 160 | "version": "1.2.0", 161 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 162 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 163 | "engines": { 164 | "node": ">= 0.8", 165 | "npm": "1.2.8000 || >= 1.4.16" 166 | } 167 | }, 168 | "node_modules/dotenv": { 169 | "version": "16.3.1", 170 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 171 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", 172 | "engines": { 173 | "node": ">=12" 174 | }, 175 | "funding": { 176 | "url": "https://github.com/motdotla/dotenv?sponsor=1" 177 | } 178 | }, 179 | "node_modules/ee-first": { 180 | "version": "1.1.1", 181 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 182 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 183 | }, 184 | "node_modules/encodeurl": { 185 | "version": "1.0.2", 186 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 187 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 188 | "engines": { 189 | "node": ">= 0.8" 190 | } 191 | }, 192 | "node_modules/escape-html": { 193 | "version": "1.0.3", 194 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 195 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 196 | }, 197 | "node_modules/etag": { 198 | "version": "1.8.1", 199 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 200 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 201 | "engines": { 202 | "node": ">= 0.6" 203 | } 204 | }, 205 | "node_modules/express": { 206 | "version": "4.18.2", 207 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 208 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 209 | "dependencies": { 210 | "accepts": "~1.3.8", 211 | "array-flatten": "1.1.1", 212 | "body-parser": "1.20.1", 213 | "content-disposition": "0.5.4", 214 | "content-type": "~1.0.4", 215 | "cookie": "0.5.0", 216 | "cookie-signature": "1.0.6", 217 | "debug": "2.6.9", 218 | "depd": "2.0.0", 219 | "encodeurl": "~1.0.2", 220 | "escape-html": "~1.0.3", 221 | "etag": "~1.8.1", 222 | "finalhandler": "1.2.0", 223 | "fresh": "0.5.2", 224 | "http-errors": "2.0.0", 225 | "merge-descriptors": "1.0.1", 226 | "methods": "~1.1.2", 227 | "on-finished": "2.4.1", 228 | "parseurl": "~1.3.3", 229 | "path-to-regexp": "0.1.7", 230 | "proxy-addr": "~2.0.7", 231 | "qs": "6.11.0", 232 | "range-parser": "~1.2.1", 233 | "safe-buffer": "5.2.1", 234 | "send": "0.18.0", 235 | "serve-static": "1.15.0", 236 | "setprototypeof": "1.2.0", 237 | "statuses": "2.0.1", 238 | "type-is": "~1.6.18", 239 | "utils-merge": "1.0.1", 240 | "vary": "~1.1.2" 241 | }, 242 | "engines": { 243 | "node": ">= 0.10.0" 244 | } 245 | }, 246 | "node_modules/finalhandler": { 247 | "version": "1.2.0", 248 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 249 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 250 | "dependencies": { 251 | "debug": "2.6.9", 252 | "encodeurl": "~1.0.2", 253 | "escape-html": "~1.0.3", 254 | "on-finished": "2.4.1", 255 | "parseurl": "~1.3.3", 256 | "statuses": "2.0.1", 257 | "unpipe": "~1.0.0" 258 | }, 259 | "engines": { 260 | "node": ">= 0.8" 261 | } 262 | }, 263 | "node_modules/follow-redirects": { 264 | "version": "1.15.3", 265 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", 266 | "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", 267 | "funding": [ 268 | { 269 | "type": "individual", 270 | "url": "https://github.com/sponsors/RubenVerborgh" 271 | } 272 | ], 273 | "engines": { 274 | "node": ">=4.0" 275 | }, 276 | "peerDependenciesMeta": { 277 | "debug": { 278 | "optional": true 279 | } 280 | } 281 | }, 282 | "node_modules/form-data": { 283 | "version": "4.0.0", 284 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 285 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 286 | "dependencies": { 287 | "asynckit": "^0.4.0", 288 | "combined-stream": "^1.0.8", 289 | "mime-types": "^2.1.12" 290 | }, 291 | "engines": { 292 | "node": ">= 6" 293 | } 294 | }, 295 | "node_modules/forwarded": { 296 | "version": "0.2.0", 297 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 298 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 299 | "engines": { 300 | "node": ">= 0.6" 301 | } 302 | }, 303 | "node_modules/fresh": { 304 | "version": "0.5.2", 305 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 306 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 307 | "engines": { 308 | "node": ">= 0.6" 309 | } 310 | }, 311 | "node_modules/function-bind": { 312 | "version": "1.1.2", 313 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 314 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 315 | "funding": { 316 | "url": "https://github.com/sponsors/ljharb" 317 | } 318 | }, 319 | "node_modules/get-intrinsic": { 320 | "version": "1.2.1", 321 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 322 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 323 | "dependencies": { 324 | "function-bind": "^1.1.1", 325 | "has": "^1.0.3", 326 | "has-proto": "^1.0.1", 327 | "has-symbols": "^1.0.3" 328 | }, 329 | "funding": { 330 | "url": "https://github.com/sponsors/ljharb" 331 | } 332 | }, 333 | "node_modules/has": { 334 | "version": "1.0.4", 335 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", 336 | "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", 337 | "engines": { 338 | "node": ">= 0.4.0" 339 | } 340 | }, 341 | "node_modules/has-proto": { 342 | "version": "1.0.1", 343 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 344 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 345 | "engines": { 346 | "node": ">= 0.4" 347 | }, 348 | "funding": { 349 | "url": "https://github.com/sponsors/ljharb" 350 | } 351 | }, 352 | "node_modules/has-symbols": { 353 | "version": "1.0.3", 354 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 355 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 356 | "engines": { 357 | "node": ">= 0.4" 358 | }, 359 | "funding": { 360 | "url": "https://github.com/sponsors/ljharb" 361 | } 362 | }, 363 | "node_modules/http-errors": { 364 | "version": "2.0.0", 365 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 366 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 367 | "dependencies": { 368 | "depd": "2.0.0", 369 | "inherits": "2.0.4", 370 | "setprototypeof": "1.2.0", 371 | "statuses": "2.0.1", 372 | "toidentifier": "1.0.1" 373 | }, 374 | "engines": { 375 | "node": ">= 0.8" 376 | } 377 | }, 378 | "node_modules/iconv-lite": { 379 | "version": "0.4.24", 380 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 381 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 382 | "dependencies": { 383 | "safer-buffer": ">= 2.1.2 < 3" 384 | }, 385 | "engines": { 386 | "node": ">=0.10.0" 387 | } 388 | }, 389 | "node_modules/inherits": { 390 | "version": "2.0.4", 391 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 392 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 393 | }, 394 | "node_modules/ipaddr.js": { 395 | "version": "1.9.1", 396 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 397 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 398 | "engines": { 399 | "node": ">= 0.10" 400 | } 401 | }, 402 | "node_modules/media-typer": { 403 | "version": "0.3.0", 404 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 405 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 406 | "engines": { 407 | "node": ">= 0.6" 408 | } 409 | }, 410 | "node_modules/merge-descriptors": { 411 | "version": "1.0.1", 412 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 413 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 414 | }, 415 | "node_modules/methods": { 416 | "version": "1.1.2", 417 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 418 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 419 | "engines": { 420 | "node": ">= 0.6" 421 | } 422 | }, 423 | "node_modules/mime": { 424 | "version": "1.6.0", 425 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 426 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 427 | "bin": { 428 | "mime": "cli.js" 429 | }, 430 | "engines": { 431 | "node": ">=4" 432 | } 433 | }, 434 | "node_modules/mime-db": { 435 | "version": "1.52.0", 436 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 437 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 438 | "engines": { 439 | "node": ">= 0.6" 440 | } 441 | }, 442 | "node_modules/mime-types": { 443 | "version": "2.1.35", 444 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 445 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 446 | "dependencies": { 447 | "mime-db": "1.52.0" 448 | }, 449 | "engines": { 450 | "node": ">= 0.6" 451 | } 452 | }, 453 | "node_modules/ms": { 454 | "version": "2.0.0", 455 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 456 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 457 | }, 458 | "node_modules/negotiator": { 459 | "version": "0.6.3", 460 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 461 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 462 | "engines": { 463 | "node": ">= 0.6" 464 | } 465 | }, 466 | "node_modules/object-inspect": { 467 | "version": "1.13.0", 468 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", 469 | "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", 470 | "funding": { 471 | "url": "https://github.com/sponsors/ljharb" 472 | } 473 | }, 474 | "node_modules/on-finished": { 475 | "version": "2.4.1", 476 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 477 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 478 | "dependencies": { 479 | "ee-first": "1.1.1" 480 | }, 481 | "engines": { 482 | "node": ">= 0.8" 483 | } 484 | }, 485 | "node_modules/parseurl": { 486 | "version": "1.3.3", 487 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 488 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 489 | "engines": { 490 | "node": ">= 0.8" 491 | } 492 | }, 493 | "node_modules/path-to-regexp": { 494 | "version": "0.1.7", 495 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 496 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 497 | }, 498 | "node_modules/proxy-addr": { 499 | "version": "2.0.7", 500 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 501 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 502 | "dependencies": { 503 | "forwarded": "0.2.0", 504 | "ipaddr.js": "1.9.1" 505 | }, 506 | "engines": { 507 | "node": ">= 0.10" 508 | } 509 | }, 510 | "node_modules/proxy-from-env": { 511 | "version": "1.1.0", 512 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 513 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 514 | }, 515 | "node_modules/qs": { 516 | "version": "6.11.0", 517 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 518 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 519 | "dependencies": { 520 | "side-channel": "^1.0.4" 521 | }, 522 | "engines": { 523 | "node": ">=0.6" 524 | }, 525 | "funding": { 526 | "url": "https://github.com/sponsors/ljharb" 527 | } 528 | }, 529 | "node_modules/range-parser": { 530 | "version": "1.2.1", 531 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 532 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 533 | "engines": { 534 | "node": ">= 0.6" 535 | } 536 | }, 537 | "node_modules/raw-body": { 538 | "version": "2.5.1", 539 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 540 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 541 | "dependencies": { 542 | "bytes": "3.1.2", 543 | "http-errors": "2.0.0", 544 | "iconv-lite": "0.4.24", 545 | "unpipe": "1.0.0" 546 | }, 547 | "engines": { 548 | "node": ">= 0.8" 549 | } 550 | }, 551 | "node_modules/safe-buffer": { 552 | "version": "5.2.1", 553 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 554 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 555 | "funding": [ 556 | { 557 | "type": "github", 558 | "url": "https://github.com/sponsors/feross" 559 | }, 560 | { 561 | "type": "patreon", 562 | "url": "https://www.patreon.com/feross" 563 | }, 564 | { 565 | "type": "consulting", 566 | "url": "https://feross.org/support" 567 | } 568 | ] 569 | }, 570 | "node_modules/safer-buffer": { 571 | "version": "2.1.2", 572 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 573 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 574 | }, 575 | "node_modules/send": { 576 | "version": "0.18.0", 577 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 578 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 579 | "dependencies": { 580 | "debug": "2.6.9", 581 | "depd": "2.0.0", 582 | "destroy": "1.2.0", 583 | "encodeurl": "~1.0.2", 584 | "escape-html": "~1.0.3", 585 | "etag": "~1.8.1", 586 | "fresh": "0.5.2", 587 | "http-errors": "2.0.0", 588 | "mime": "1.6.0", 589 | "ms": "2.1.3", 590 | "on-finished": "2.4.1", 591 | "range-parser": "~1.2.1", 592 | "statuses": "2.0.1" 593 | }, 594 | "engines": { 595 | "node": ">= 0.8.0" 596 | } 597 | }, 598 | "node_modules/send/node_modules/ms": { 599 | "version": "2.1.3", 600 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 601 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 602 | }, 603 | "node_modules/serve-static": { 604 | "version": "1.15.0", 605 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 606 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 607 | "dependencies": { 608 | "encodeurl": "~1.0.2", 609 | "escape-html": "~1.0.3", 610 | "parseurl": "~1.3.3", 611 | "send": "0.18.0" 612 | }, 613 | "engines": { 614 | "node": ">= 0.8.0" 615 | } 616 | }, 617 | "node_modules/setprototypeof": { 618 | "version": "1.2.0", 619 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 620 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 621 | }, 622 | "node_modules/side-channel": { 623 | "version": "1.0.4", 624 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 625 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 626 | "dependencies": { 627 | "call-bind": "^1.0.0", 628 | "get-intrinsic": "^1.0.2", 629 | "object-inspect": "^1.9.0" 630 | }, 631 | "funding": { 632 | "url": "https://github.com/sponsors/ljharb" 633 | } 634 | }, 635 | "node_modules/statuses": { 636 | "version": "2.0.1", 637 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 638 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 639 | "engines": { 640 | "node": ">= 0.8" 641 | } 642 | }, 643 | "node_modules/toidentifier": { 644 | "version": "1.0.1", 645 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 646 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 647 | "engines": { 648 | "node": ">=0.6" 649 | } 650 | }, 651 | "node_modules/type-is": { 652 | "version": "1.6.18", 653 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 654 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 655 | "dependencies": { 656 | "media-typer": "0.3.0", 657 | "mime-types": "~2.1.24" 658 | }, 659 | "engines": { 660 | "node": ">= 0.6" 661 | } 662 | }, 663 | "node_modules/unpipe": { 664 | "version": "1.0.0", 665 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 666 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 667 | "engines": { 668 | "node": ">= 0.8" 669 | } 670 | }, 671 | "node_modules/utils-merge": { 672 | "version": "1.0.1", 673 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 674 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 675 | "engines": { 676 | "node": ">= 0.4.0" 677 | } 678 | }, 679 | "node_modules/vary": { 680 | "version": "1.1.2", 681 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 682 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 683 | "engines": { 684 | "node": ">= 0.8" 685 | } 686 | } 687 | }, 688 | "dependencies": { 689 | "accepts": { 690 | "version": "1.3.8", 691 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 692 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 693 | "requires": { 694 | "mime-types": "~2.1.34", 695 | "negotiator": "0.6.3" 696 | } 697 | }, 698 | "array-flatten": { 699 | "version": "1.1.1", 700 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 701 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 702 | }, 703 | "asynckit": { 704 | "version": "0.4.0", 705 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 706 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 707 | }, 708 | "axios": { 709 | "version": "1.5.1", 710 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", 711 | "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", 712 | "requires": { 713 | "follow-redirects": "^1.15.0", 714 | "form-data": "^4.0.0", 715 | "proxy-from-env": "^1.1.0" 716 | } 717 | }, 718 | "body-parser": { 719 | "version": "1.20.1", 720 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 721 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 722 | "requires": { 723 | "bytes": "3.1.2", 724 | "content-type": "~1.0.4", 725 | "debug": "2.6.9", 726 | "depd": "2.0.0", 727 | "destroy": "1.2.0", 728 | "http-errors": "2.0.0", 729 | "iconv-lite": "0.4.24", 730 | "on-finished": "2.4.1", 731 | "qs": "6.11.0", 732 | "raw-body": "2.5.1", 733 | "type-is": "~1.6.18", 734 | "unpipe": "1.0.0" 735 | } 736 | }, 737 | "bytes": { 738 | "version": "3.1.2", 739 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 740 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 741 | }, 742 | "call-bind": { 743 | "version": "1.0.2", 744 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 745 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 746 | "requires": { 747 | "function-bind": "^1.1.1", 748 | "get-intrinsic": "^1.0.2" 749 | } 750 | }, 751 | "combined-stream": { 752 | "version": "1.0.8", 753 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 754 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 755 | "requires": { 756 | "delayed-stream": "~1.0.0" 757 | } 758 | }, 759 | "content-disposition": { 760 | "version": "0.5.4", 761 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 762 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 763 | "requires": { 764 | "safe-buffer": "5.2.1" 765 | } 766 | }, 767 | "content-type": { 768 | "version": "1.0.5", 769 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 770 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 771 | }, 772 | "cookie": { 773 | "version": "0.5.0", 774 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 775 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 776 | }, 777 | "cookie-signature": { 778 | "version": "1.0.6", 779 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 780 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 781 | }, 782 | "debug": { 783 | "version": "2.6.9", 784 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 785 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 786 | "requires": { 787 | "ms": "2.0.0" 788 | } 789 | }, 790 | "delayed-stream": { 791 | "version": "1.0.0", 792 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 793 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 794 | }, 795 | "depd": { 796 | "version": "2.0.0", 797 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 798 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 799 | }, 800 | "destroy": { 801 | "version": "1.2.0", 802 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 803 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 804 | }, 805 | "dotenv": { 806 | "version": "16.3.1", 807 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 808 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" 809 | }, 810 | "ee-first": { 811 | "version": "1.1.1", 812 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 813 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 814 | }, 815 | "encodeurl": { 816 | "version": "1.0.2", 817 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 818 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 819 | }, 820 | "escape-html": { 821 | "version": "1.0.3", 822 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 823 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 824 | }, 825 | "etag": { 826 | "version": "1.8.1", 827 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 828 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 829 | }, 830 | "express": { 831 | "version": "4.18.2", 832 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 833 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 834 | "requires": { 835 | "accepts": "~1.3.8", 836 | "array-flatten": "1.1.1", 837 | "body-parser": "1.20.1", 838 | "content-disposition": "0.5.4", 839 | "content-type": "~1.0.4", 840 | "cookie": "0.5.0", 841 | "cookie-signature": "1.0.6", 842 | "debug": "2.6.9", 843 | "depd": "2.0.0", 844 | "encodeurl": "~1.0.2", 845 | "escape-html": "~1.0.3", 846 | "etag": "~1.8.1", 847 | "finalhandler": "1.2.0", 848 | "fresh": "0.5.2", 849 | "http-errors": "2.0.0", 850 | "merge-descriptors": "1.0.1", 851 | "methods": "~1.1.2", 852 | "on-finished": "2.4.1", 853 | "parseurl": "~1.3.3", 854 | "path-to-regexp": "0.1.7", 855 | "proxy-addr": "~2.0.7", 856 | "qs": "6.11.0", 857 | "range-parser": "~1.2.1", 858 | "safe-buffer": "5.2.1", 859 | "send": "0.18.0", 860 | "serve-static": "1.15.0", 861 | "setprototypeof": "1.2.0", 862 | "statuses": "2.0.1", 863 | "type-is": "~1.6.18", 864 | "utils-merge": "1.0.1", 865 | "vary": "~1.1.2" 866 | } 867 | }, 868 | "finalhandler": { 869 | "version": "1.2.0", 870 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 871 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 872 | "requires": { 873 | "debug": "2.6.9", 874 | "encodeurl": "~1.0.2", 875 | "escape-html": "~1.0.3", 876 | "on-finished": "2.4.1", 877 | "parseurl": "~1.3.3", 878 | "statuses": "2.0.1", 879 | "unpipe": "~1.0.0" 880 | } 881 | }, 882 | "follow-redirects": { 883 | "version": "1.15.3", 884 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", 885 | "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" 886 | }, 887 | "form-data": { 888 | "version": "4.0.0", 889 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 890 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 891 | "requires": { 892 | "asynckit": "^0.4.0", 893 | "combined-stream": "^1.0.8", 894 | "mime-types": "^2.1.12" 895 | } 896 | }, 897 | "forwarded": { 898 | "version": "0.2.0", 899 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 900 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 901 | }, 902 | "fresh": { 903 | "version": "0.5.2", 904 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 905 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 906 | }, 907 | "function-bind": { 908 | "version": "1.1.2", 909 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 910 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 911 | }, 912 | "get-intrinsic": { 913 | "version": "1.2.1", 914 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 915 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 916 | "requires": { 917 | "function-bind": "^1.1.1", 918 | "has": "^1.0.3", 919 | "has-proto": "^1.0.1", 920 | "has-symbols": "^1.0.3" 921 | } 922 | }, 923 | "has": { 924 | "version": "1.0.4", 925 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", 926 | "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==" 927 | }, 928 | "has-proto": { 929 | "version": "1.0.1", 930 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 931 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" 932 | }, 933 | "has-symbols": { 934 | "version": "1.0.3", 935 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 936 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 937 | }, 938 | "http-errors": { 939 | "version": "2.0.0", 940 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 941 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 942 | "requires": { 943 | "depd": "2.0.0", 944 | "inherits": "2.0.4", 945 | "setprototypeof": "1.2.0", 946 | "statuses": "2.0.1", 947 | "toidentifier": "1.0.1" 948 | } 949 | }, 950 | "iconv-lite": { 951 | "version": "0.4.24", 952 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 953 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 954 | "requires": { 955 | "safer-buffer": ">= 2.1.2 < 3" 956 | } 957 | }, 958 | "inherits": { 959 | "version": "2.0.4", 960 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 961 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 962 | }, 963 | "ipaddr.js": { 964 | "version": "1.9.1", 965 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 966 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 967 | }, 968 | "media-typer": { 969 | "version": "0.3.0", 970 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 971 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 972 | }, 973 | "merge-descriptors": { 974 | "version": "1.0.1", 975 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 976 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 977 | }, 978 | "methods": { 979 | "version": "1.1.2", 980 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 981 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 982 | }, 983 | "mime": { 984 | "version": "1.6.0", 985 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 986 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 987 | }, 988 | "mime-db": { 989 | "version": "1.52.0", 990 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 991 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 992 | }, 993 | "mime-types": { 994 | "version": "2.1.35", 995 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 996 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 997 | "requires": { 998 | "mime-db": "1.52.0" 999 | } 1000 | }, 1001 | "ms": { 1002 | "version": "2.0.0", 1003 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1004 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1005 | }, 1006 | "negotiator": { 1007 | "version": "0.6.3", 1008 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1009 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1010 | }, 1011 | "object-inspect": { 1012 | "version": "1.13.0", 1013 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", 1014 | "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==" 1015 | }, 1016 | "on-finished": { 1017 | "version": "2.4.1", 1018 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1019 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1020 | "requires": { 1021 | "ee-first": "1.1.1" 1022 | } 1023 | }, 1024 | "parseurl": { 1025 | "version": "1.3.3", 1026 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1027 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1028 | }, 1029 | "path-to-regexp": { 1030 | "version": "0.1.7", 1031 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1032 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1033 | }, 1034 | "proxy-addr": { 1035 | "version": "2.0.7", 1036 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1037 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1038 | "requires": { 1039 | "forwarded": "0.2.0", 1040 | "ipaddr.js": "1.9.1" 1041 | } 1042 | }, 1043 | "proxy-from-env": { 1044 | "version": "1.1.0", 1045 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1046 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1047 | }, 1048 | "qs": { 1049 | "version": "6.11.0", 1050 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1051 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1052 | "requires": { 1053 | "side-channel": "^1.0.4" 1054 | } 1055 | }, 1056 | "range-parser": { 1057 | "version": "1.2.1", 1058 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1059 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1060 | }, 1061 | "raw-body": { 1062 | "version": "2.5.1", 1063 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1064 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1065 | "requires": { 1066 | "bytes": "3.1.2", 1067 | "http-errors": "2.0.0", 1068 | "iconv-lite": "0.4.24", 1069 | "unpipe": "1.0.0" 1070 | } 1071 | }, 1072 | "safe-buffer": { 1073 | "version": "5.2.1", 1074 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1075 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1076 | }, 1077 | "safer-buffer": { 1078 | "version": "2.1.2", 1079 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1080 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1081 | }, 1082 | "send": { 1083 | "version": "0.18.0", 1084 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1085 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1086 | "requires": { 1087 | "debug": "2.6.9", 1088 | "depd": "2.0.0", 1089 | "destroy": "1.2.0", 1090 | "encodeurl": "~1.0.2", 1091 | "escape-html": "~1.0.3", 1092 | "etag": "~1.8.1", 1093 | "fresh": "0.5.2", 1094 | "http-errors": "2.0.0", 1095 | "mime": "1.6.0", 1096 | "ms": "2.1.3", 1097 | "on-finished": "2.4.1", 1098 | "range-parser": "~1.2.1", 1099 | "statuses": "2.0.1" 1100 | }, 1101 | "dependencies": { 1102 | "ms": { 1103 | "version": "2.1.3", 1104 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1105 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1106 | } 1107 | } 1108 | }, 1109 | "serve-static": { 1110 | "version": "1.15.0", 1111 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1112 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1113 | "requires": { 1114 | "encodeurl": "~1.0.2", 1115 | "escape-html": "~1.0.3", 1116 | "parseurl": "~1.3.3", 1117 | "send": "0.18.0" 1118 | } 1119 | }, 1120 | "setprototypeof": { 1121 | "version": "1.2.0", 1122 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1123 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1124 | }, 1125 | "side-channel": { 1126 | "version": "1.0.4", 1127 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1128 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1129 | "requires": { 1130 | "call-bind": "^1.0.0", 1131 | "get-intrinsic": "^1.0.2", 1132 | "object-inspect": "^1.9.0" 1133 | } 1134 | }, 1135 | "statuses": { 1136 | "version": "2.0.1", 1137 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1138 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1139 | }, 1140 | "toidentifier": { 1141 | "version": "1.0.1", 1142 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1143 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1144 | }, 1145 | "type-is": { 1146 | "version": "1.6.18", 1147 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1148 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1149 | "requires": { 1150 | "media-typer": "0.3.0", 1151 | "mime-types": "~2.1.24" 1152 | } 1153 | }, 1154 | "unpipe": { 1155 | "version": "1.0.0", 1156 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1157 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1158 | }, 1159 | "utils-merge": { 1160 | "version": "1.0.1", 1161 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1162 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1163 | }, 1164 | "vary": { 1165 | "version": "1.1.2", 1166 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1167 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1168 | } 1169 | } 1170 | } 1171 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apillon-oauth-server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node server.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.5.1", 14 | "dotenv": "^16.3.1", 15 | "express": "^4.18.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const { apillonAuthAPI } = require('./apillon-api'); 4 | 5 | app.use((req, res, next) => { 6 | // Replace the * value below with your own origin 7 | res.header('Access-Control-Allow-Origin', '*'); 8 | res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 9 | next(); 10 | }); 11 | app.use(express.json()) 12 | 13 | app.get('/session-token', async (req, res) => { 14 | const response = await apillonAuthAPI.get('/session-token'); 15 | res.json(response.data); 16 | }) 17 | 18 | app.post('/verify-login', async (req, res) => { 19 | const token = req.body.token; 20 | const response = await apillonAuthAPI.post(`/verify-login`, { token }); 21 | res.json(response.data); 22 | }) 23 | 24 | const port = 3000; 25 | app.listen(port, () => { 26 | console.log(`Apillon OAuth backend listening on port ${port}`); 27 | }) --------------------------------------------------------------------------------