├── .editorconfig ├── .env.example ├── .gitattributes ├── .github ├── FUNDING.yml └── workflows │ └── build.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .travis.yml ├── .whitesource ├── LICENSE ├── README.md ├── _.config.yml ├── _config.yml ├── package.json ├── renovate.json ├── src ├── api │ ├── controllers │ │ ├── orders.ts │ │ ├── products.ts │ │ └── user.ts │ ├── middleware │ │ └── check-auth.ts │ ├── models │ │ ├── order.ts │ │ ├── product.ts │ │ └── user.ts │ └── routes │ │ ├── orders.ts │ │ ├── products.ts │ │ └── user.ts ├── app.ts ├── server.ts └── settings.ts ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_style = tab 8 | indent_size = 4 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [{*.json,*.yml}] 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | JWT_KEY=secret 2 | ROOT=http://localhost 3 | PORT=3000 4 | ATLAS_URL=mongodb+srv://scriptex:PASSWORD@node-rest-api-example-agqm6.mongodb.net/test`; 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ## GITATTRIBUTES FOR WEB PROJECTS 2 | # 3 | # These settings are for any web project. 4 | # 5 | # Details per file setting: 6 | # text These files should be normalized (i.e. convert CRLF to LF). 7 | # binary These files are binary and should be left untouched. 8 | # 9 | # Note that binary is a macro for -text -diff. 10 | ###################################################################### 11 | 12 | ## AUTO-DETECT 13 | ## Handle line endings automatically for files detected as 14 | ## text and leave all files detected as binary untouched. 15 | ## This will handle all files NOT defined below. 16 | * text=auto 17 | 18 | ## SOURCE CODE 19 | *.bat text eol=crlf 20 | *.coffee text 21 | *.css text 22 | *.htm text 23 | *.html text 24 | *.inc text 25 | *.ini text 26 | *.js text 27 | *.json text 28 | *.jsx text 29 | *.less text 30 | *.od text 31 | *.onlydata text 32 | *.php text 33 | *.pl text 34 | *.py text 35 | *.rb text 36 | *.sass text 37 | *.scm text 38 | *.scss text 39 | *.sh text eol=lf 40 | *.sql text 41 | *.styl text 42 | *.tag text 43 | *.ts text 44 | *.tsx text 45 | *.xml text 46 | *.xhtml text 47 | 48 | ## DOCKER 49 | *.dockerignore text 50 | Dockerfile text 51 | 52 | ## DOCUMENTATION 53 | *.markdown text 54 | *.md text 55 | *.mdwn text 56 | *.mdown text 57 | *.mkd text 58 | *.mkdn text 59 | *.mdtxt text 60 | *.mdtext text 61 | *.txt text 62 | AUTHORS text 63 | CHANGELOG text 64 | CHANGES text 65 | CONTRIBUTING text 66 | COPYING text 67 | copyright text 68 | *COPYRIGHT* text 69 | INSTALL text 70 | license text 71 | LICENSE text 72 | NEWS text 73 | readme text 74 | *README* text 75 | TODO text 76 | 77 | ## TEMPLATES 78 | *.dot text 79 | *.ejs text 80 | *.haml text 81 | *.handlebars text 82 | *.hbs text 83 | *.hbt text 84 | *.jade text 85 | *.latte text 86 | *.mustache text 87 | *.njk text 88 | *.phtml text 89 | *.tmpl text 90 | *.tpl text 91 | *.twig text 92 | 93 | ## LINTERS 94 | .csslintrc text 95 | .eslintrc text 96 | .htmlhintrc text 97 | .jscsrc text 98 | .jshintrc text 99 | .jshintignore text 100 | .stylelintrc text 101 | 102 | ## CONFIGS 103 | *.bowerrc text 104 | *.cnf text 105 | *.conf text 106 | *.config text 107 | .browserslistrc text 108 | .editorconfig text 109 | .gitattributes text 110 | .gitconfig text 111 | .htaccess text 112 | *.npmignore text 113 | *.yaml text 114 | *.yml text 115 | browserslist text 116 | Makefile text 117 | makefile text 118 | 119 | ## HEROKU 120 | Procfile text 121 | .slugignore text 122 | 123 | ## GRAPHICS 124 | *.ai binary 125 | *.bmp binary 126 | *.eps binary 127 | *.gif binary 128 | *.ico binary 129 | *.jng binary 130 | *.jp2 binary 131 | *.jpg binary 132 | *.jpeg binary 133 | *.jpx binary 134 | *.jxr binary 135 | *.pdf binary 136 | *.png binary 137 | *.psb binary 138 | *.psd binary 139 | *.svg text 140 | *.svgz binary 141 | *.tif binary 142 | *.tiff binary 143 | *.wbmp binary 144 | *.webp binary 145 | 146 | ## AUDIO 147 | *.kar binary 148 | *.m4a binary 149 | *.mid binary 150 | *.midi binary 151 | *.mp3 binary 152 | *.ogg binary 153 | *.ra binary 154 | 155 | ## VIDEO 156 | *.3gpp binary 157 | *.3gp binary 158 | *.as binary 159 | *.asf binary 160 | *.asx binary 161 | *.fla binary 162 | *.flv binary 163 | *.m4v binary 164 | *.mng binary 165 | *.mov binary 166 | *.mp4 binary 167 | *.mpeg binary 168 | *.mpg binary 169 | *.ogv binary 170 | *.swc binary 171 | *.swf binary 172 | *.webm binary 173 | 174 | ## ARCHIVES 175 | *.7z binary 176 | *.gz binary 177 | *.jar binary 178 | *.rar binary 179 | *.tar binary 180 | *.zip binary 181 | 182 | ## FONTS 183 | *.ttf binary 184 | *.eot binary 185 | *.otf binary 186 | *.woff binary 187 | *.woff2 binary 188 | 189 | ## EXECUTABLES 190 | *.exe binary 191 | *.pyc binary 192 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [scriptex] 4 | patreon: atanas 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: scriptex 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: scriptex 10 | issuehunt: scriptex 11 | otechie: # Replace with a single Otechie username 12 | custom: ['paypal.me/scriptex', 'revolut.me/scriptex'] 13 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | node-version: [lts/*] 12 | 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Use Node.js ${{ matrix.node-version }} 16 | uses: actions/setup-node@v4 17 | with: 18 | node-version: ${{ matrix.node-version }} 19 | - run: yarn 20 | - run: yarn build 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Dependency directory 9 | node_modules/ 10 | 11 | # Misc 12 | .DS_Store 13 | .DS_Store? 14 | ._* 15 | .Spotlight-V100 16 | .Trashes 17 | ehthumbs.db 18 | Thumbs.db 19 | 20 | # Uploads directory 21 | uploads 22 | 23 | # Build directory 24 | dist 25 | 26 | # Environment variables 27 | .env 28 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "tabWidth": 4, 4 | "useTabs": true, 5 | "semi": true, 6 | "singleQuote": true, 7 | "jsxSingleQuote": false, 8 | "trailingComma": "none", 9 | "bracketSpacing": true, 10 | "jsxBracketSameLine": false, 11 | "arrowParens": "avoid", 12 | "proseWrap": "preserve" 13 | } 14 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | node_js: 4 | - 'lts/*' 5 | install: 6 | - yarn 7 | script: 8 | - yarn build 9 | -------------------------------------------------------------------------------- /.whitesource: -------------------------------------------------------------------------------- 1 | { 2 | "generalSettings": { 3 | "shouldScanRepo": true 4 | }, 5 | "checkRunSettings": { 6 | "vulnerableCheckRunConclusionLevel": "success" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-Present Atanas Atanasov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Travis CI](https://travis-ci.com/scriptex/node-rest-api.svg?branch=master)](https://travis-ci.com/scriptex/node-rest-api) 2 | [![Github Build](https://github.com/scriptex/node-rest-api/workflows/Build/badge.svg)](https://github.com/scriptex/node-rest-api/actions?query=workflow%3ABuild) 3 | [![Codacy Badge](https://app.codacy.com/project/badge/Grade/34d3d75710534dc6a38c3584a1dcd068)](https://www.codacy.com/gh/scriptex/node-rest-api/dashboard?utm_source=github.com&utm_medium=referral&utm_content=scriptex/node-rest-api&utm_campaign=Badge_Grade) 4 | [![Codebeat Badge](https://codebeat.co/badges/d765a4c8-2c0e-44f2-89c3-fa364fdc14e6)](https://codebeat.co/projects/github-com-scriptex-node-rest-api-master) 5 | [![CodeFactor Badge](https://www.codefactor.io/repository/github/scriptex/node-rest-api/badge)](https://www.codefactor.io/repository/github/scriptex/node-rest-api) 6 | [![DeepScan grade](https://deepscan.io/api/teams/3574/projects/5257/branches/40799/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=3574&pid=5257&bid=40799) 7 | [![Analytics](https://ga-beacon-361907.ew.r.appspot.com/UA-83446952-1/github.com/scriptex/node-rest-api/README.md?pixel)](https://github.com/scriptex/node-rest-api/) 8 | 9 | # Store REST API using NodeJS, Express and MongoDB 10 | 11 | This is a Typescript port of the awesome REST API tutorial which can be found here: https://github.com/academind/node-restful-api-tutorial/tree/13-controllers/. 12 | 13 | ## Visitor stats 14 | 15 | ![GitHub stars](https://img.shields.io/github/stars/scriptex/node-rest-api?style=social) 16 | ![GitHub forks](https://img.shields.io/github/forks/scriptex/node-rest-api?style=social) 17 | ![GitHub watchers](https://img.shields.io/github/watchers/scriptex/node-rest-api?style=social) 18 | ![GitHub followers](https://img.shields.io/github/followers/scriptex?style=social) 19 | 20 | ## Code stats 21 | 22 | ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/scriptex/node-rest-api) 23 | ![GitHub repo size](https://img.shields.io/github/repo-size/scriptex/node-rest-api?style=plastic) 24 | ![GitHub language count](https://img.shields.io/github/languages/count/scriptex/node-rest-api?style=plastic) 25 | ![GitHub top language](https://img.shields.io/github/languages/top/scriptex/node-rest-api?style=plastic) 26 | ![GitHub last commit](https://img.shields.io/github/last-commit/scriptex/node-rest-api?style=plastic) 27 | 28 | ## Usage 29 | 30 | Create a `.env` file using the `.env.example` file and add your [Mongo Atlas](https://www.mongodb.com/cloud/atlas) admin password: 31 | 32 | ```sh 33 | ATLAS_PWD= 34 | JWT_KEY=secret 35 | ROOT=http://localhost 36 | PORT=3000 37 | ``` 38 | 39 | ## Install dependencies 40 | 41 | ```sh 42 | npm i 43 | 44 | # or 45 | 46 | yarn 47 | ``` 48 | 49 | ## Run in development mode 50 | 51 | ```sh 52 | npm start 53 | 54 | # or 55 | 56 | yarn start 57 | ``` 58 | 59 | ## Build for production 60 | 61 | ```sh 62 | npm run build 63 | 64 | # or 65 | 66 | yarn build 67 | ``` 68 | 69 | ## LICENSE 70 | 71 | MIT 72 | 73 | --- 74 | 75 |
76 | Connect with me: 77 |
78 | 79 |
80 | 81 |
82 | 83 | 84 | 85 |   86 | 87 | 88 | 89 |   90 | 91 | 92 | 93 |   94 | 95 | 96 | 97 |   98 | 99 | 100 | 101 |   102 | 103 | 104 | 105 |   106 | 107 | 108 | 109 |   110 | 111 | 112 | 113 |   114 | 115 | 116 | 117 |   118 | 119 | 120 | 121 |   122 | 123 | 124 | 125 |   126 | 127 | 128 | 129 |
130 | 131 | --- 132 | 133 |
134 | Support and sponsor my work: 135 |
136 |
137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 |
166 | -------------------------------------------------------------------------------- /_.config.yml: -------------------------------------------------------------------------------- 1 | plugins: 2 | - jekyll-relative-links 3 | relative_links: 4 | enabled: true 5 | collections: true 6 | include: 7 | - CONTRIBUTING.md 8 | - README.md 9 | - LICENSE.md 10 | - COPYING.md 11 | - CODE_OF_CONDUCT.md 12 | - CONTRIBUTING.md 13 | - ISSUE_TEMPLATE.md 14 | - PULL_REQUEST_TEMPLATE.md 15 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-rest-api", 3 | "version": "1.0.0", 4 | "description": "Build a shop REST API using NodeJS, Express and MongoDB", 5 | "keywords": [ 6 | "API", 7 | "REST", 8 | "REST API", 9 | "Node API", 10 | "Node REST API", 11 | "API Example", 12 | "REST API Example", 13 | "Node REST API Example" 14 | ], 15 | "homepage": "https://atanas.info/projects/node-rest-api.html", 16 | "bugs": { 17 | "url": "https://github.com/scriptex/node-rest-api/issues", 18 | "email": "hi@atanas.info" 19 | }, 20 | "license": "MIT", 21 | "author": "Atanas Atanasov (https://atanas.info)", 22 | "funding": "https://github.com/sponsors/scriptex", 23 | "main": "server.js", 24 | "scripts": { 25 | "start": "ts-node ./src/server.ts", 26 | "build": "tsc" 27 | }, 28 | "dependencies": { 29 | "bcrypt": "6.0.0", 30 | "body-parser": "2.2.0", 31 | "cors": "2.8.5", 32 | "dotenv": "16.5.0", 33 | "express": "5.1.0", 34 | "jsonwebtoken": "9.0.2", 35 | "mongoose": "8.15.1", 36 | "morgan": "1.10.0", 37 | "multer": "2.0.1" 38 | }, 39 | "devDependencies": { 40 | "@types/cors": "2.8.18", 41 | "@types/express": "5.0.2", 42 | "@types/express-serve-static-core": "5.0.6", 43 | "@types/multer": "1.4.12", 44 | "@types/node": "22.15.29", 45 | "ts-node": "10.9.2", 46 | "typescript": "5.8.3" 47 | }, 48 | "private": true 49 | } 50 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base", 4 | ":automergePatch", 5 | ":automergeMinor", 6 | ":automergeBranch", 7 | ":disableDependencyDashboard", 8 | "group:allNonMajor" 9 | ], 10 | "travis": { 11 | "enabled": true 12 | }, 13 | "assignees": ["@scriptex"], 14 | "labels": ["dependencies"], 15 | "rebaseWhen": "conflicted", 16 | "vulnerabilityAlerts": { 17 | "labels": ["security"], 18 | "assignees": ["@scriptex"] 19 | }, 20 | "major": { 21 | "automerge": false 22 | }, 23 | "schedule": ["* * 4,18 * *"] 24 | } 25 | -------------------------------------------------------------------------------- /src/api/controllers/orders.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as mongoose from 'mongoose'; 5 | 6 | /** 7 | * Order model 8 | */ 9 | import Order from '../models/order'; 10 | 11 | /** 12 | * Product model 13 | */ 14 | import Product from '../models/product'; 15 | import { ROOT, PORT } from '../../settings'; 16 | 17 | const url: string = `${ROOT}:${PORT}/orders/`; 18 | 19 | /** 20 | * Get all orders 21 | */ 22 | export const all = (_, res): void => { 23 | Order.find() 24 | .select('product quantity _id') 25 | .populate('product', 'name') 26 | .exec() 27 | .then(docs => { 28 | res.status(200).json({ 29 | count: docs.length, 30 | orders: docs.map((doc: any) => { 31 | return { 32 | _id: doc._id, 33 | product: doc.product, 34 | quantity: doc.quantity, 35 | request: { 36 | type: 'GET', 37 | url: url + doc._id 38 | } 39 | }; 40 | }) 41 | }); 42 | }) 43 | .catch(error => { 44 | res.status(500).json({ error }); 45 | }); 46 | }; 47 | 48 | export const create = ({ body }, res) => { 49 | const { productId, quantity } = body; 50 | 51 | Product.findById(productId) 52 | .then(product => { 53 | if (!product) { 54 | return res.status(404).json({ 55 | message: 'Product not found' 56 | }); 57 | } 58 | 59 | const order = new Order({ 60 | _id: new mongoose.Types.ObjectId(), 61 | quantity: quantity, 62 | product: productId 63 | }); 64 | 65 | return order.save(); 66 | }) 67 | .then(({ _id, product, quantity }) => { 68 | res.status(201).json({ 69 | message: 'Order stored', 70 | createdOrder: { 71 | _id, 72 | product, 73 | quantity 74 | }, 75 | request: { 76 | type: 'GET', 77 | url: url + _id 78 | } 79 | }); 80 | }) 81 | .catch(error => { 82 | res.status(500).json({ error }); 83 | }); 84 | }; 85 | 86 | export const get = (req, res) => { 87 | Order.findById(req.params.orderId) 88 | .populate('product') 89 | .exec() 90 | .then(order => { 91 | if (!order) { 92 | return res.status(404).json({ 93 | message: 'Order not found' 94 | }); 95 | } 96 | 97 | res.status(200).json({ 98 | order, 99 | request: { 100 | url, 101 | type: 'GET' 102 | } 103 | }); 104 | }) 105 | .catch(error => { 106 | res.status(500).json({ error }); 107 | }); 108 | }; 109 | 110 | export const remove = (req, res) => { 111 | Order.findByIdAndDelete({ _id: req.params.orderId }) 112 | .exec() 113 | .then(_ => { 114 | res.status(200).json({ 115 | message: 'Order deleted', 116 | request: { 117 | url, 118 | type: 'POST', 119 | body: { 120 | productId: 'ID', 121 | quantity: 'Number' 122 | } 123 | } 124 | }); 125 | }) 126 | .catch(error => { 127 | res.status(500).json({ error }); 128 | }); 129 | }; 130 | -------------------------------------------------------------------------------- /src/api/controllers/products.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as mongoose from 'mongoose'; 5 | 6 | /** 7 | * Product model 8 | */ 9 | import Product from '../models/product'; 10 | import { ROOT, PORT } from '../../settings'; 11 | 12 | const url = `${ROOT}:${PORT}/products/`; 13 | 14 | /** 15 | * List all products 16 | */ 17 | export const all = (_, res) => { 18 | Product.find() 19 | .select('name price _id productImage') 20 | .exec() 21 | .then(docs => { 22 | const response = { 23 | count: docs.length, 24 | products: docs.map((doc: any) => { 25 | return { 26 | name: doc.name, 27 | price: doc.price, 28 | productImage: doc.productImage, 29 | _id: doc._id, 30 | request: { 31 | type: 'GET', 32 | url: url + doc._id 33 | } 34 | }; 35 | }) 36 | }; 37 | 38 | res.status(200).json(response); 39 | }) 40 | .catch(error => { 41 | res.status(500).json({ error }); 42 | }); 43 | }; 44 | 45 | /** 46 | * Create a product 47 | */ 48 | export const create = (req, res) => { 49 | const product = new Product({ 50 | _id: new mongoose.Types.ObjectId(), 51 | name: req.body.name, 52 | price: req.body.price, 53 | productImage: req.file.path 54 | }); 55 | 56 | product 57 | .save() 58 | .then((result: any) => { 59 | res.status(201).json({ 60 | message: 'Created product successfully', 61 | createdProduct: { 62 | name: result.name, 63 | price: result.price, 64 | _id: result._id, 65 | request: { 66 | type: 'GET', 67 | url: url + result._id 68 | } 69 | } 70 | }); 71 | }) 72 | .catch(error => { 73 | res.status(500).json({ error }); 74 | }); 75 | }; 76 | 77 | /** 78 | * Get a single product 79 | */ 80 | export const get = (req, res) => { 81 | const id = req.params.productId; 82 | 83 | Product.findById(id) 84 | .select('name price _id productImage') 85 | .exec() 86 | .then(doc => { 87 | if (doc) { 88 | res.status(200).json({ 89 | product: doc, 90 | request: { 91 | url, 92 | type: 'GET' 93 | } 94 | }); 95 | } else { 96 | res.status(404).json({ 97 | message: 'No valid entry found for provided ID' 98 | }); 99 | } 100 | }) 101 | .catch(error => { 102 | res.status(500).json({ error }); 103 | }); 104 | }; 105 | 106 | /** 107 | * Update a product 108 | */ 109 | export const update = (req, res) => { 110 | const _id = req.params.productId; 111 | const $set = {}; 112 | 113 | for (const ops of req.body) { 114 | $set[ops.propName] = ops.value; 115 | } 116 | 117 | Product.updateOne({ _id }, { $set }) 118 | .exec() 119 | .then(_ => { 120 | res.status(200).json({ 121 | message: 'Product updated', 122 | request: { 123 | type: 'GET', 124 | url: url + _id 125 | } 126 | }); 127 | }) 128 | .catch(error => { 129 | res.status(500).json({ error }); 130 | }); 131 | }; 132 | 133 | /** 134 | * Remove a product 135 | */ 136 | export const remove = (req, res) => { 137 | const _id = req.params.productId; 138 | 139 | Product.findOneAndDelete({ _id }) 140 | .exec() 141 | .then(_ => { 142 | res.status(200).json({ 143 | message: 'Product deleted', 144 | request: { 145 | url: url, 146 | type: 'POST', 147 | body: { name: 'String', price: 'Number' } 148 | } 149 | }); 150 | }) 151 | .catch(error => { 152 | res.status(500).json({ error }); 153 | }); 154 | }; 155 | -------------------------------------------------------------------------------- /src/api/controllers/user.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import { sign } from 'jsonwebtoken'; 5 | import * as bcrypt from 'bcrypt'; 6 | import * as mongoose from 'mongoose'; 7 | 8 | /** 9 | * User model 10 | */ 11 | import User from '../models/user'; 12 | import { JWT_KEY } from '../../settings'; 13 | 14 | /** 15 | * Sign the user up 16 | */ 17 | export const signUp = ({ body }, res) => { 18 | const { email, password } = body; 19 | 20 | User.find({ email }) 21 | .exec() 22 | .then(user => { 23 | if (user.length >= 1) { 24 | return res.status(409).json({ 25 | message: 'Mail exists' 26 | }); 27 | } else { 28 | bcrypt.hash(password, 10, (error, hash) => { 29 | if (error) { 30 | return res.status(500).json({ 31 | error 32 | }); 33 | } else { 34 | const user = new User({ 35 | _id: new mongoose.Types.ObjectId(), 36 | email, 37 | password: hash 38 | }); 39 | 40 | user.save() 41 | .then(_ => { 42 | res.status(201).json({ 43 | message: 'User created' 44 | }); 45 | }) 46 | .catch(error => { 47 | res.status(500).json({ error }); 48 | }); 49 | } 50 | }); 51 | } 52 | }); 53 | }; 54 | 55 | /** 56 | * Log the user in 57 | */ 58 | export const login = ({ body }, res) => { 59 | const { email, password } = body; 60 | 61 | User.find({ email }) 62 | .exec() 63 | .then((user: any) => { 64 | if (user.length < 1) { 65 | return res.status(401).json({ 66 | message: 'Auth failed' 67 | }); 68 | } 69 | 70 | bcrypt.compare(password, user[0].password, (err, result) => { 71 | if (err) { 72 | return res.status(401).json({ 73 | message: 'Auth failed' 74 | }); 75 | } 76 | 77 | if (result) { 78 | const token = sign( 79 | { 80 | email: user[0].email, 81 | userId: user[0]._id 82 | }, 83 | JWT_KEY, 84 | { 85 | expiresIn: '1h' 86 | } 87 | ); 88 | 89 | return res.status(200).json({ 90 | message: 'Auth successful', 91 | token 92 | }); 93 | } 94 | 95 | res.status(401).json({ 96 | message: 'Auth failed' 97 | }); 98 | }); 99 | }) 100 | .catch(error => { 101 | res.status(500).json({ error }); 102 | }); 103 | }; 104 | 105 | /** 106 | * Remove the user 107 | */ 108 | export const remove = (req, res) => { 109 | User.findByIdAndDelete({ _id: req.params.userId }) 110 | .exec() 111 | .then(result => { 112 | res.status(200).json({ 113 | message: 'User deleted' 114 | }); 115 | }) 116 | .catch(error => { 117 | res.status(500).json({ error }); 118 | }); 119 | }; 120 | -------------------------------------------------------------------------------- /src/api/middleware/check-auth.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import { verify } from 'jsonwebtoken'; 5 | 6 | /** 7 | * Internal dependencies 8 | */ 9 | import { JWT_KEY } from '../../settings'; 10 | 11 | /** 12 | * Manage authentication using 13 | * JSON Web Token 14 | */ 15 | export default (req, res, next) => { 16 | try { 17 | const token = req.headers.authorization.split(' ')[1]; 18 | 19 | req.userData = verify(token, JWT_KEY); 20 | 21 | next(); 22 | } catch (error) { 23 | return res.status(401).json({ message: 'Auth failed', error }); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/api/models/order.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as mongoose from 'mongoose'; 5 | 6 | /** 7 | * Create the order schema 8 | */ 9 | const order: mongoose.Schema = new mongoose.Schema({ 10 | _id: mongoose.Schema.Types.ObjectId, 11 | product: { 12 | type: mongoose.Schema.Types.ObjectId, 13 | ref: 'Product', 14 | required: true 15 | }, 16 | quantity: { 17 | type: Number, 18 | default: 1 19 | } 20 | }); 21 | 22 | /** 23 | * Export the model 24 | */ 25 | export default mongoose.model('Order', order); 26 | -------------------------------------------------------------------------------- /src/api/models/product.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as mongoose from 'mongoose'; 5 | 6 | /** 7 | * Create the product schema 8 | */ 9 | const product: mongoose.Schema = new mongoose.Schema({ 10 | _id: mongoose.Schema.Types.ObjectId, 11 | name: { 12 | type: String, 13 | required: true 14 | }, 15 | price: { 16 | type: Number, 17 | required: true 18 | }, 19 | productImage: { 20 | type: String, 21 | required: true 22 | } 23 | }); 24 | 25 | /** 26 | * Export the model 27 | */ 28 | export default mongoose.model('Product', product); 29 | -------------------------------------------------------------------------------- /src/api/models/user.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as mongoose from 'mongoose'; 5 | 6 | /** 7 | * Email regex 8 | */ 9 | // prettier-ignore 10 | const emailRe: RegExp = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/; 11 | 12 | /** 13 | * Create the user schema 14 | */ 15 | const user: mongoose.Schema = new mongoose.Schema({ 16 | _id: mongoose.Schema.Types.ObjectId, 17 | email: { 18 | type: String, 19 | required: true, 20 | unique: true, 21 | match: emailRe 22 | }, 23 | password: { 24 | type: String, 25 | required: true 26 | } 27 | }); 28 | 29 | /** 30 | * Export the model 31 | */ 32 | export default mongoose.model('User', user); 33 | -------------------------------------------------------------------------------- /src/api/routes/orders.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as express from 'express'; 5 | 6 | /** 7 | * Internal dependencies 8 | */ 9 | import checkAuth from '../middleware/check-auth'; 10 | import { all, create, get, remove } from '../controllers/orders'; 11 | 12 | const router: express.Router = express.Router(); 13 | 14 | /** 15 | * Get all orders 16 | */ 17 | router.get('/', checkAuth, all); 18 | 19 | /** 20 | * Create an order 21 | */ 22 | router.post('/', checkAuth, create); 23 | 24 | /** 25 | * Get an order 26 | */ 27 | router.get('/:orderId', checkAuth, get); 28 | 29 | /** 30 | * Remove an order 31 | */ 32 | router.delete('/:orderId', checkAuth, remove); 33 | 34 | /** 35 | * Export the configuration 36 | */ 37 | export default router; 38 | -------------------------------------------------------------------------------- /src/api/routes/products.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as multer from 'multer'; 5 | import * as express from 'express'; 6 | 7 | /** 8 | * Internal dependencies 9 | */ 10 | import checkAuth from '../middleware/check-auth'; 11 | import { all, create, get, update, remove } from '../controllers/products'; 12 | 13 | const router: express.Router = express.Router(); 14 | 15 | /** 16 | * Setup file upload 17 | */ 18 | const storage: multer.StorageEngine = multer.diskStorage({ 19 | destination( 20 | req: express.Request, 21 | file: Express.Multer.File, 22 | cb: (error: Error | null, destination: string) => void 23 | ) { 24 | cb(null, './uploads/'); 25 | }, 26 | filename(req: express.Request, file: Express.Multer.File, cb: (error: Error | null, filename: string) => void) { 27 | cb(null, new Date().toISOString() + file.originalname); 28 | } 29 | }); 30 | 31 | /** 32 | * Setup file upload filters 33 | * Basically accept only JPG and PNG files 34 | */ 35 | const fileFilter = (_, file: Express.Multer.File, cb: (error: Error | null, save: boolean) => void): void => { 36 | if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') { 37 | cb(null, true); 38 | } else { 39 | cb(null, false); 40 | } 41 | }; 42 | 43 | /** 44 | * Create the file uploader 45 | */ 46 | const upload: any = multer({ 47 | storage, 48 | fileFilter: fileFilter as any, 49 | limits: { 50 | fileSize: 1024 * 1024 * 5 51 | } 52 | }); 53 | 54 | /** 55 | * Get all products 56 | */ 57 | router.get('/', all); 58 | 59 | /** 60 | * Create a product 61 | */ 62 | router.post('/', checkAuth, upload.single('productImage'), create); 63 | 64 | /** 65 | * Get a single product 66 | */ 67 | router.get('/:productId', get); 68 | 69 | /** 70 | * Update a product 71 | */ 72 | router.patch('/:productId', checkAuth, update); 73 | 74 | /** 75 | * Remove a product 76 | */ 77 | router.delete('/:productId', checkAuth, remove); 78 | 79 | /** 80 | * Export the configuration 81 | */ 82 | export default router; 83 | -------------------------------------------------------------------------------- /src/api/routes/user.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as express from 'express'; 5 | 6 | /** 7 | * Internal dependencies 8 | */ 9 | import checkAuth from '../middleware/check-auth'; 10 | import { login, signUp, remove } from '../controllers/user'; 11 | 12 | const router: express.Router = express.Router(); 13 | 14 | /** 15 | * Log the user in 16 | */ 17 | router.post('/login', login); 18 | 19 | /** 20 | * Sign the user up 21 | */ 22 | router.post('/signup', signUp); 23 | 24 | /** 25 | * Remove the user 26 | */ 27 | router.delete('/:userId', checkAuth, remove); 28 | 29 | /** 30 | * Export the configuration 31 | */ 32 | export default router; 33 | -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import cors from 'cors'; 5 | import * as morgan from 'morgan'; 6 | import * as express from 'express'; 7 | import * as mongoose from 'mongoose'; 8 | import * as bodyParser from 'body-parser'; 9 | 10 | /** 11 | * Internal dependencies: routes 12 | */ 13 | import userRoutes from './api/routes/user'; 14 | import orderRoutes from './api/routes/orders'; 15 | import productRoutes from './api/routes/products'; 16 | 17 | import { ATLAS_URL } from './settings'; 18 | 19 | /** 20 | * Create the application 21 | */ 22 | const app: express.Application = express(); 23 | 24 | interface ErrorWithStatus extends Error { 25 | status?: number; 26 | } 27 | 28 | /** 29 | * Connect to the database 30 | */ 31 | mongoose.connect(ATLAS_URL || ''); 32 | 33 | /** 34 | * Add middlewares 35 | */ 36 | app.use(morgan('dev')); 37 | app.use('/uploads', express.static('uploads')); 38 | app.use(bodyParser.urlencoded({ extended: false })); 39 | app.use(bodyParser.json()); 40 | 41 | const whitelist = ['http://localhost:3000']; 42 | const corsOptions = { 43 | origin(origin: string | undefined, callback: (error: Error | null, value: boolean) => unknown) { 44 | if (origin && whitelist.indexOf(origin) !== -1) { 45 | callback(null, true); 46 | } else { 47 | callback(null, false); 48 | } 49 | }, 50 | methods: ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS'], 51 | optionsSuccessStatus: 200, 52 | credentials: true, 53 | allowedHeaders: [ 54 | 'Content-Type', 55 | 'Authorization', 56 | 'X-Requested-With', 57 | 'device-remember-token', 58 | 'Access-Control-Allow-Origin', 59 | 'Origin', 60 | 'Accept' 61 | ] 62 | }; 63 | 64 | /** 65 | * Setup CORS 66 | */ 67 | app.use(cors(corsOptions)); 68 | 69 | /** 70 | * Setup routes 71 | */ 72 | app.use('/user', userRoutes); 73 | app.use('/orders', orderRoutes); 74 | app.use('/products', productRoutes); 75 | 76 | /** 77 | * Error handling: 404 78 | */ 79 | app.use((req: express.Request, res: express.Response, next: express.NextFunction) => { 80 | const error: ErrorWithStatus = new Error('Not found'); 81 | 82 | error.status = 404; 83 | 84 | next(error); 85 | }); 86 | 87 | /** 88 | * Error handling: 500 89 | */ 90 | app.use((error: ErrorWithStatus, req: express.Request, res: express.Response, next: express.NextFunction) => { 91 | res.status(error.status || 500); 92 | res.json({ 93 | error: { 94 | message: error.message 95 | } 96 | }); 97 | }); 98 | 99 | export default app; 100 | -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * External dependencies 3 | */ 4 | import * as http from 'http'; 5 | 6 | /** 7 | * Internal dependencies 8 | */ 9 | import app from './app'; 10 | import { PORT } from './settings'; 11 | 12 | /** 13 | * Settings 14 | */ 15 | const server = http.createServer(app); 16 | 17 | /** 18 | * Run the server 19 | */ 20 | server.listen(PORT); 21 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | declare function require(name: string): any; 2 | 3 | const dotenv = require('dotenv'); 4 | 5 | dotenv.config(); 6 | 7 | export const ROOT: string | void = process.env.ROOT; 8 | export const PORT: string | void = process.env.PORT; 9 | export const JWT_KEY: string | void = process.env.JWT_KEY; 10 | export const ATLAS_URL: string | void = process.env.ATLAS_URL; 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": false, 4 | "allowSyntheticDefaultImports": true, 5 | "alwaysStrict": true, 6 | "baseUrl": "./src", 7 | "checkJs": false, 8 | "declaration": true, 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "importHelpers": false, 13 | "isolatedModules": true, 14 | "jsx": "react", 15 | "lib": ["DOM", "ESNext"], 16 | "module": "CommonJS", 17 | "moduleResolution": "Node", 18 | "noEmit": false, 19 | "noEmitHelpers": false, 20 | "noEmitOnError": true, 21 | "noFallthroughCasesInSwitch": true, 22 | "noImplicitAny": false, 23 | "noImplicitReturns": true, 24 | "noImplicitThis": true, 25 | "noStrictGenericChecks": false, 26 | "outDir": "./dist", 27 | "pretty": true, 28 | "removeComments": false, 29 | "skipLibCheck": true, 30 | "sourceMap": true, 31 | "strict": true, 32 | "strictBindCallApply": true, 33 | "strictFunctionTypes": true, 34 | "strictPropertyInitialization": true, 35 | "strictNullChecks": true, 36 | "target": "ES6" 37 | }, 38 | "include": ["src/**/*.ts"], 39 | "exclude": ["node_modules"] 40 | } 41 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@jridgewell/resolve-uri@^3.0.3": 13 | version "3.1.2" 14 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 15 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 16 | 17 | "@jridgewell/sourcemap-codec@^1.4.10": 18 | version "1.5.0" 19 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 20 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 21 | 22 | "@jridgewell/trace-mapping@0.3.9": 23 | version "0.3.9" 24 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 25 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 26 | dependencies: 27 | "@jridgewell/resolve-uri" "^3.0.3" 28 | "@jridgewell/sourcemap-codec" "^1.4.10" 29 | 30 | "@mongodb-js/saslprep@^1.1.9": 31 | version "1.1.9" 32 | resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz#e974bab8eca9faa88677d4ea4da8d09a52069004" 33 | integrity sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw== 34 | dependencies: 35 | sparse-bitfield "^3.0.3" 36 | 37 | "@tsconfig/node10@^1.0.7": 38 | version "1.0.11" 39 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" 40 | integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== 41 | 42 | "@tsconfig/node12@^1.0.7": 43 | version "1.0.11" 44 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 45 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 46 | 47 | "@tsconfig/node14@^1.0.0": 48 | version "1.0.3" 49 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 50 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 51 | 52 | "@tsconfig/node16@^1.0.2": 53 | version "1.0.4" 54 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" 55 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 56 | 57 | "@types/body-parser@*": 58 | version "1.19.5" 59 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" 60 | integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== 61 | dependencies: 62 | "@types/connect" "*" 63 | "@types/node" "*" 64 | 65 | "@types/connect@*": 66 | version "3.4.38" 67 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" 68 | integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== 69 | dependencies: 70 | "@types/node" "*" 71 | 72 | "@types/cors@2.8.18": 73 | version "2.8.18" 74 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.18.tgz#101e033b3ca06695f3d73c587cd7f9eb348135d1" 75 | integrity sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA== 76 | dependencies: 77 | "@types/node" "*" 78 | 79 | "@types/express-serve-static-core@5.0.6": 80 | version "5.0.6" 81 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" 82 | integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== 83 | dependencies: 84 | "@types/node" "*" 85 | "@types/qs" "*" 86 | "@types/range-parser" "*" 87 | "@types/send" "*" 88 | 89 | "@types/express-serve-static-core@^5.0.0": 90 | version "5.0.0" 91 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" 92 | integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== 93 | dependencies: 94 | "@types/node" "*" 95 | "@types/qs" "*" 96 | "@types/range-parser" "*" 97 | "@types/send" "*" 98 | 99 | "@types/express@*": 100 | version "5.0.0" 101 | resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" 102 | integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== 103 | dependencies: 104 | "@types/body-parser" "*" 105 | "@types/express-serve-static-core" "^5.0.0" 106 | "@types/qs" "*" 107 | "@types/serve-static" "*" 108 | 109 | "@types/express@5.0.2": 110 | version "5.0.2" 111 | resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.2.tgz#7be9e337a5745d6b43ef5b0c352dad94a7f0c256" 112 | integrity sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g== 113 | dependencies: 114 | "@types/body-parser" "*" 115 | "@types/express-serve-static-core" "^5.0.0" 116 | "@types/serve-static" "*" 117 | 118 | "@types/http-errors@*": 119 | version "2.0.4" 120 | resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" 121 | integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== 122 | 123 | "@types/mime@^1": 124 | version "1.3.5" 125 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" 126 | integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== 127 | 128 | "@types/multer@1.4.12": 129 | version "1.4.12" 130 | resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" 131 | integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== 132 | dependencies: 133 | "@types/express" "*" 134 | 135 | "@types/node@*": 136 | version "22.7.2" 137 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.2.tgz#80ed66c0a5025ffa037587fd69a816f29b54e4c7" 138 | integrity sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA== 139 | dependencies: 140 | undici-types "~6.19.2" 141 | 142 | "@types/node@22.15.29": 143 | version "22.15.29" 144 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.29.tgz#c75999124a8224a3f79dd8b6ccfb37d74098f678" 145 | integrity sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ== 146 | dependencies: 147 | undici-types "~6.21.0" 148 | 149 | "@types/qs@*": 150 | version "6.9.16" 151 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" 152 | integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== 153 | 154 | "@types/range-parser@*": 155 | version "1.2.7" 156 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" 157 | integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== 158 | 159 | "@types/send@*": 160 | version "0.17.4" 161 | resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" 162 | integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== 163 | dependencies: 164 | "@types/mime" "^1" 165 | "@types/node" "*" 166 | 167 | "@types/serve-static@*": 168 | version "1.15.7" 169 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" 170 | integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== 171 | dependencies: 172 | "@types/http-errors" "*" 173 | "@types/node" "*" 174 | "@types/send" "*" 175 | 176 | "@types/webidl-conversions@*": 177 | version "7.0.3" 178 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" 179 | integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== 180 | 181 | "@types/whatwg-url@^11.0.2": 182 | version "11.0.5" 183 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz#aaa2546e60f0c99209ca13360c32c78caf2c409f" 184 | integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== 185 | dependencies: 186 | "@types/webidl-conversions" "*" 187 | 188 | accepts@^2.0.0: 189 | version "2.0.0" 190 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" 191 | integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== 192 | dependencies: 193 | mime-types "^3.0.0" 194 | negotiator "^1.0.0" 195 | 196 | acorn-walk@^8.1.1: 197 | version "8.3.4" 198 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" 199 | integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== 200 | dependencies: 201 | acorn "^8.11.0" 202 | 203 | acorn@^8.11.0, acorn@^8.4.1: 204 | version "8.12.1" 205 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" 206 | integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== 207 | 208 | append-field@^1.0.0: 209 | version "1.0.0" 210 | resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" 211 | integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== 212 | 213 | arg@^4.1.0: 214 | version "4.1.3" 215 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 216 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 217 | 218 | basic-auth@~2.0.1: 219 | version "2.0.1" 220 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 221 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 222 | dependencies: 223 | safe-buffer "5.1.2" 224 | 225 | bcrypt@6.0.0: 226 | version "6.0.0" 227 | resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-6.0.0.tgz#86643fddde9bcd0ad91400b063003fa4b0312835" 228 | integrity sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg== 229 | dependencies: 230 | node-addon-api "^8.3.0" 231 | node-gyp-build "^4.8.4" 232 | 233 | body-parser@2.2.0, body-parser@^2.2.0: 234 | version "2.2.0" 235 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" 236 | integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== 237 | dependencies: 238 | bytes "^3.1.2" 239 | content-type "^1.0.5" 240 | debug "^4.4.0" 241 | http-errors "^2.0.0" 242 | iconv-lite "^0.6.3" 243 | on-finished "^2.4.1" 244 | qs "^6.14.0" 245 | raw-body "^3.0.0" 246 | type-is "^2.0.0" 247 | 248 | bson@^6.10.3: 249 | version "6.10.3" 250 | resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.3.tgz#5f9a463af6b83e264bedd08b236d1356a30eda47" 251 | integrity sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ== 252 | 253 | buffer-equal-constant-time@1.0.1: 254 | version "1.0.1" 255 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 256 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 257 | 258 | buffer-from@^1.0.0: 259 | version "1.1.2" 260 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 261 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 262 | 263 | busboy@^1.6.0: 264 | version "1.6.0" 265 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" 266 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 267 | dependencies: 268 | streamsearch "^1.1.0" 269 | 270 | bytes@3.1.2, bytes@^3.1.2: 271 | version "3.1.2" 272 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 273 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 274 | 275 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 276 | version "1.0.2" 277 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 278 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 279 | dependencies: 280 | es-errors "^1.3.0" 281 | function-bind "^1.1.2" 282 | 283 | call-bound@^1.0.2: 284 | version "1.0.4" 285 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" 286 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 287 | dependencies: 288 | call-bind-apply-helpers "^1.0.2" 289 | get-intrinsic "^1.3.0" 290 | 291 | concat-stream@^2.0.0: 292 | version "2.0.0" 293 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" 294 | integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== 295 | dependencies: 296 | buffer-from "^1.0.0" 297 | inherits "^2.0.3" 298 | readable-stream "^3.0.2" 299 | typedarray "^0.0.6" 300 | 301 | content-disposition@^1.0.0: 302 | version "1.0.0" 303 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" 304 | integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== 305 | dependencies: 306 | safe-buffer "5.2.1" 307 | 308 | content-type@^1.0.5: 309 | version "1.0.5" 310 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 311 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 312 | 313 | cookie-signature@^1.2.1: 314 | version "1.2.2" 315 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" 316 | integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== 317 | 318 | cookie@^0.7.1: 319 | version "0.7.2" 320 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" 321 | integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== 322 | 323 | cors@2.8.5: 324 | version "2.8.5" 325 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 326 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 327 | dependencies: 328 | object-assign "^4" 329 | vary "^1" 330 | 331 | create-require@^1.1.0: 332 | version "1.1.1" 333 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 334 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 335 | 336 | debug@2.6.9: 337 | version "2.6.9" 338 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 339 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 340 | dependencies: 341 | ms "2.0.0" 342 | 343 | debug@4.x: 344 | version "4.3.7" 345 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" 346 | integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== 347 | dependencies: 348 | ms "^2.1.3" 349 | 350 | debug@^4.3.5, debug@^4.4.0: 351 | version "4.4.0" 352 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 353 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 354 | dependencies: 355 | ms "^2.1.3" 356 | 357 | depd@2.0.0, depd@^2.0.0, depd@~2.0.0: 358 | version "2.0.0" 359 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 360 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 361 | 362 | diff@^4.0.1: 363 | version "4.0.2" 364 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 365 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 366 | 367 | dotenv@16.5.0: 368 | version "16.5.0" 369 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" 370 | integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== 371 | 372 | dunder-proto@^1.0.1: 373 | version "1.0.1" 374 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 375 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 376 | dependencies: 377 | call-bind-apply-helpers "^1.0.1" 378 | es-errors "^1.3.0" 379 | gopd "^1.2.0" 380 | 381 | ecdsa-sig-formatter@1.0.11: 382 | version "1.0.11" 383 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 384 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 385 | dependencies: 386 | safe-buffer "^5.0.1" 387 | 388 | ee-first@1.1.1: 389 | version "1.1.1" 390 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 391 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 392 | 393 | encodeurl@^2.0.0: 394 | version "2.0.0" 395 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" 396 | integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== 397 | 398 | es-define-property@^1.0.1: 399 | version "1.0.1" 400 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 401 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 402 | 403 | es-errors@^1.3.0: 404 | version "1.3.0" 405 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 406 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 407 | 408 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 409 | version "1.1.1" 410 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 411 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 412 | dependencies: 413 | es-errors "^1.3.0" 414 | 415 | escape-html@^1.0.3: 416 | version "1.0.3" 417 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 418 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 419 | 420 | etag@^1.8.1: 421 | version "1.8.1" 422 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 423 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 424 | 425 | express@5.1.0: 426 | version "5.1.0" 427 | resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" 428 | integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== 429 | dependencies: 430 | accepts "^2.0.0" 431 | body-parser "^2.2.0" 432 | content-disposition "^1.0.0" 433 | content-type "^1.0.5" 434 | cookie "^0.7.1" 435 | cookie-signature "^1.2.1" 436 | debug "^4.4.0" 437 | encodeurl "^2.0.0" 438 | escape-html "^1.0.3" 439 | etag "^1.8.1" 440 | finalhandler "^2.1.0" 441 | fresh "^2.0.0" 442 | http-errors "^2.0.0" 443 | merge-descriptors "^2.0.0" 444 | mime-types "^3.0.0" 445 | on-finished "^2.4.1" 446 | once "^1.4.0" 447 | parseurl "^1.3.3" 448 | proxy-addr "^2.0.7" 449 | qs "^6.14.0" 450 | range-parser "^1.2.1" 451 | router "^2.2.0" 452 | send "^1.1.0" 453 | serve-static "^2.2.0" 454 | statuses "^2.0.1" 455 | type-is "^2.0.1" 456 | vary "^1.1.2" 457 | 458 | finalhandler@^2.1.0: 459 | version "2.1.0" 460 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" 461 | integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== 462 | dependencies: 463 | debug "^4.4.0" 464 | encodeurl "^2.0.0" 465 | escape-html "^1.0.3" 466 | on-finished "^2.4.1" 467 | parseurl "^1.3.3" 468 | statuses "^2.0.1" 469 | 470 | forwarded@0.2.0: 471 | version "0.2.0" 472 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 473 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 474 | 475 | fresh@^2.0.0: 476 | version "2.0.0" 477 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" 478 | integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== 479 | 480 | function-bind@^1.1.2: 481 | version "1.1.2" 482 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 483 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 484 | 485 | get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: 486 | version "1.3.0" 487 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 488 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 489 | dependencies: 490 | call-bind-apply-helpers "^1.0.2" 491 | es-define-property "^1.0.1" 492 | es-errors "^1.3.0" 493 | es-object-atoms "^1.1.1" 494 | function-bind "^1.1.2" 495 | get-proto "^1.0.1" 496 | gopd "^1.2.0" 497 | has-symbols "^1.1.0" 498 | hasown "^2.0.2" 499 | math-intrinsics "^1.1.0" 500 | 501 | get-proto@^1.0.1: 502 | version "1.0.1" 503 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 504 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 505 | dependencies: 506 | dunder-proto "^1.0.1" 507 | es-object-atoms "^1.0.0" 508 | 509 | gopd@^1.2.0: 510 | version "1.2.0" 511 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 512 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 513 | 514 | has-symbols@^1.1.0: 515 | version "1.1.0" 516 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 517 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 518 | 519 | hasown@^2.0.2: 520 | version "2.0.2" 521 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 522 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 523 | dependencies: 524 | function-bind "^1.1.2" 525 | 526 | http-errors@2.0.0, http-errors@^2.0.0: 527 | version "2.0.0" 528 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 529 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 530 | dependencies: 531 | depd "2.0.0" 532 | inherits "2.0.4" 533 | setprototypeof "1.2.0" 534 | statuses "2.0.1" 535 | toidentifier "1.0.1" 536 | 537 | iconv-lite@0.6.3, iconv-lite@^0.6.3: 538 | version "0.6.3" 539 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 540 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 541 | dependencies: 542 | safer-buffer ">= 2.1.2 < 3.0.0" 543 | 544 | inherits@2.0.4, inherits@^2.0.3: 545 | version "2.0.4" 546 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 547 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 548 | 549 | ipaddr.js@1.9.1: 550 | version "1.9.1" 551 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 552 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 553 | 554 | is-promise@^4.0.0: 555 | version "4.0.0" 556 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" 557 | integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== 558 | 559 | jsonwebtoken@9.0.2: 560 | version "9.0.2" 561 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" 562 | integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== 563 | dependencies: 564 | jws "^3.2.2" 565 | lodash.includes "^4.3.0" 566 | lodash.isboolean "^3.0.3" 567 | lodash.isinteger "^4.0.4" 568 | lodash.isnumber "^3.0.3" 569 | lodash.isplainobject "^4.0.6" 570 | lodash.isstring "^4.0.1" 571 | lodash.once "^4.0.0" 572 | ms "^2.1.1" 573 | semver "^7.5.4" 574 | 575 | jwa@^1.4.1: 576 | version "1.4.1" 577 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 578 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 579 | dependencies: 580 | buffer-equal-constant-time "1.0.1" 581 | ecdsa-sig-formatter "1.0.11" 582 | safe-buffer "^5.0.1" 583 | 584 | jws@^3.2.2: 585 | version "3.2.2" 586 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 587 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 588 | dependencies: 589 | jwa "^1.4.1" 590 | safe-buffer "^5.0.1" 591 | 592 | kareem@2.6.3: 593 | version "2.6.3" 594 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" 595 | integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== 596 | 597 | lodash.includes@^4.3.0: 598 | version "4.3.0" 599 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 600 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== 601 | 602 | lodash.isboolean@^3.0.3: 603 | version "3.0.3" 604 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 605 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== 606 | 607 | lodash.isinteger@^4.0.4: 608 | version "4.0.4" 609 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 610 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== 611 | 612 | lodash.isnumber@^3.0.3: 613 | version "3.0.3" 614 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 615 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== 616 | 617 | lodash.isplainobject@^4.0.6: 618 | version "4.0.6" 619 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 620 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 621 | 622 | lodash.isstring@^4.0.1: 623 | version "4.0.1" 624 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 625 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== 626 | 627 | lodash.once@^4.0.0: 628 | version "4.1.1" 629 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 630 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== 631 | 632 | make-error@^1.1.1: 633 | version "1.3.6" 634 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 635 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 636 | 637 | math-intrinsics@^1.1.0: 638 | version "1.1.0" 639 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 640 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 641 | 642 | media-typer@0.3.0: 643 | version "0.3.0" 644 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 645 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 646 | 647 | media-typer@^1.1.0: 648 | version "1.1.0" 649 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" 650 | integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== 651 | 652 | memory-pager@^1.0.2: 653 | version "1.5.0" 654 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 655 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 656 | 657 | merge-descriptors@^2.0.0: 658 | version "2.0.0" 659 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" 660 | integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== 661 | 662 | mime-db@1.52.0: 663 | version "1.52.0" 664 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 665 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 666 | 667 | mime-db@^1.54.0: 668 | version "1.54.0" 669 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" 670 | integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== 671 | 672 | mime-types@^3.0.0, mime-types@^3.0.1: 673 | version "3.0.1" 674 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" 675 | integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== 676 | dependencies: 677 | mime-db "^1.54.0" 678 | 679 | mime-types@~2.1.24: 680 | version "2.1.35" 681 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 682 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 683 | dependencies: 684 | mime-db "1.52.0" 685 | 686 | minimist@^1.2.6: 687 | version "1.2.8" 688 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 689 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 690 | 691 | mkdirp@^0.5.6: 692 | version "0.5.6" 693 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 694 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 695 | dependencies: 696 | minimist "^1.2.6" 697 | 698 | mongodb-connection-string-url@^3.0.0: 699 | version "3.0.1" 700 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz#c13e6ac284ae401752ebafdb8cd7f16c6723b141" 701 | integrity sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg== 702 | dependencies: 703 | "@types/whatwg-url" "^11.0.2" 704 | whatwg-url "^13.0.0" 705 | 706 | mongodb@~6.16.0: 707 | version "6.16.0" 708 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.16.0.tgz#2a7a1986ec151d9c738fc8ce4cf4324c3f728a2f" 709 | integrity sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw== 710 | dependencies: 711 | "@mongodb-js/saslprep" "^1.1.9" 712 | bson "^6.10.3" 713 | mongodb-connection-string-url "^3.0.0" 714 | 715 | mongoose@8.15.1: 716 | version "8.15.1" 717 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.15.1.tgz#d0c5224a01ea8a8f96f5fd5f8557675a054d0a6f" 718 | integrity sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw== 719 | dependencies: 720 | bson "^6.10.3" 721 | kareem "2.6.3" 722 | mongodb "~6.16.0" 723 | mpath "0.9.0" 724 | mquery "5.0.0" 725 | ms "2.1.3" 726 | sift "17.1.3" 727 | 728 | morgan@1.10.0: 729 | version "1.10.0" 730 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" 731 | integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== 732 | dependencies: 733 | basic-auth "~2.0.1" 734 | debug "2.6.9" 735 | depd "~2.0.0" 736 | on-finished "~2.3.0" 737 | on-headers "~1.0.2" 738 | 739 | mpath@0.9.0: 740 | version "0.9.0" 741 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" 742 | integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== 743 | 744 | mquery@5.0.0: 745 | version "5.0.0" 746 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" 747 | integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== 748 | dependencies: 749 | debug "4.x" 750 | 751 | ms@2.0.0: 752 | version "2.0.0" 753 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 754 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 755 | 756 | ms@2.1.3, ms@^2.1.1, ms@^2.1.3: 757 | version "2.1.3" 758 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 759 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 760 | 761 | multer@2.0.1: 762 | version "2.0.1" 763 | resolved "https://registry.yarnpkg.com/multer/-/multer-2.0.1.tgz#3ed335ed2b96240e3df9e23780c91cfcf5d29202" 764 | integrity sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ== 765 | dependencies: 766 | append-field "^1.0.0" 767 | busboy "^1.6.0" 768 | concat-stream "^2.0.0" 769 | mkdirp "^0.5.6" 770 | object-assign "^4.1.1" 771 | type-is "^1.6.18" 772 | xtend "^4.0.2" 773 | 774 | negotiator@^1.0.0: 775 | version "1.0.0" 776 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" 777 | integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== 778 | 779 | node-addon-api@^8.3.0: 780 | version "8.3.1" 781 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.3.1.tgz#53bc8a4f8dbde3de787b9828059da94ba9fd4eed" 782 | integrity sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA== 783 | 784 | node-gyp-build@^4.8.4: 785 | version "4.8.4" 786 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" 787 | integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== 788 | 789 | object-assign@^4, object-assign@^4.1.1: 790 | version "4.1.1" 791 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 792 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 793 | 794 | object-inspect@^1.13.3: 795 | version "1.13.4" 796 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 797 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 798 | 799 | on-finished@^2.4.1: 800 | version "2.4.1" 801 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 802 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 803 | dependencies: 804 | ee-first "1.1.1" 805 | 806 | on-finished@~2.3.0: 807 | version "2.3.0" 808 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 809 | integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== 810 | dependencies: 811 | ee-first "1.1.1" 812 | 813 | on-headers@~1.0.2: 814 | version "1.0.2" 815 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 816 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 817 | 818 | once@^1.4.0: 819 | version "1.4.0" 820 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 821 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 822 | dependencies: 823 | wrappy "1" 824 | 825 | parseurl@^1.3.3: 826 | version "1.3.3" 827 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 828 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 829 | 830 | path-to-regexp@^8.0.0: 831 | version "8.2.0" 832 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" 833 | integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== 834 | 835 | proxy-addr@^2.0.7: 836 | version "2.0.7" 837 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 838 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 839 | dependencies: 840 | forwarded "0.2.0" 841 | ipaddr.js "1.9.1" 842 | 843 | punycode@^2.3.0: 844 | version "2.3.1" 845 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 846 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 847 | 848 | qs@^6.14.0: 849 | version "6.14.0" 850 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" 851 | integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== 852 | dependencies: 853 | side-channel "^1.1.0" 854 | 855 | range-parser@^1.2.1: 856 | version "1.2.1" 857 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 858 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 859 | 860 | raw-body@^3.0.0: 861 | version "3.0.0" 862 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" 863 | integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== 864 | dependencies: 865 | bytes "3.1.2" 866 | http-errors "2.0.0" 867 | iconv-lite "0.6.3" 868 | unpipe "1.0.0" 869 | 870 | readable-stream@^3.0.2: 871 | version "3.6.2" 872 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" 873 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 874 | dependencies: 875 | inherits "^2.0.3" 876 | string_decoder "^1.1.1" 877 | util-deprecate "^1.0.1" 878 | 879 | router@^2.2.0: 880 | version "2.2.0" 881 | resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" 882 | integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== 883 | dependencies: 884 | debug "^4.4.0" 885 | depd "^2.0.0" 886 | is-promise "^4.0.0" 887 | parseurl "^1.3.3" 888 | path-to-regexp "^8.0.0" 889 | 890 | safe-buffer@5.1.2: 891 | version "5.1.2" 892 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 893 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 894 | 895 | safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: 896 | version "5.2.1" 897 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 898 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 899 | 900 | "safer-buffer@>= 2.1.2 < 3.0.0": 901 | version "2.1.2" 902 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 903 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 904 | 905 | semver@^7.5.4: 906 | version "7.6.3" 907 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 908 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 909 | 910 | send@^1.1.0, send@^1.2.0: 911 | version "1.2.0" 912 | resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" 913 | integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== 914 | dependencies: 915 | debug "^4.3.5" 916 | encodeurl "^2.0.0" 917 | escape-html "^1.0.3" 918 | etag "^1.8.1" 919 | fresh "^2.0.0" 920 | http-errors "^2.0.0" 921 | mime-types "^3.0.1" 922 | ms "^2.1.3" 923 | on-finished "^2.4.1" 924 | range-parser "^1.2.1" 925 | statuses "^2.0.1" 926 | 927 | serve-static@^2.2.0: 928 | version "2.2.0" 929 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" 930 | integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== 931 | dependencies: 932 | encodeurl "^2.0.0" 933 | escape-html "^1.0.3" 934 | parseurl "^1.3.3" 935 | send "^1.2.0" 936 | 937 | setprototypeof@1.2.0: 938 | version "1.2.0" 939 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 940 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 941 | 942 | side-channel-list@^1.0.0: 943 | version "1.0.0" 944 | resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" 945 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 946 | dependencies: 947 | es-errors "^1.3.0" 948 | object-inspect "^1.13.3" 949 | 950 | side-channel-map@^1.0.1: 951 | version "1.0.1" 952 | resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" 953 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 954 | dependencies: 955 | call-bound "^1.0.2" 956 | es-errors "^1.3.0" 957 | get-intrinsic "^1.2.5" 958 | object-inspect "^1.13.3" 959 | 960 | side-channel-weakmap@^1.0.2: 961 | version "1.0.2" 962 | resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" 963 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 964 | dependencies: 965 | call-bound "^1.0.2" 966 | es-errors "^1.3.0" 967 | get-intrinsic "^1.2.5" 968 | object-inspect "^1.13.3" 969 | side-channel-map "^1.0.1" 970 | 971 | side-channel@^1.1.0: 972 | version "1.1.0" 973 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" 974 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 975 | dependencies: 976 | es-errors "^1.3.0" 977 | object-inspect "^1.13.3" 978 | side-channel-list "^1.0.0" 979 | side-channel-map "^1.0.1" 980 | side-channel-weakmap "^1.0.2" 981 | 982 | sift@17.1.3: 983 | version "17.1.3" 984 | resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" 985 | integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== 986 | 987 | sparse-bitfield@^3.0.3: 988 | version "3.0.3" 989 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 990 | integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== 991 | dependencies: 992 | memory-pager "^1.0.2" 993 | 994 | statuses@2.0.1, statuses@^2.0.1: 995 | version "2.0.1" 996 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 997 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 998 | 999 | streamsearch@^1.1.0: 1000 | version "1.1.0" 1001 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" 1002 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 1003 | 1004 | string_decoder@^1.1.1: 1005 | version "1.3.0" 1006 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1007 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1008 | dependencies: 1009 | safe-buffer "~5.2.0" 1010 | 1011 | toidentifier@1.0.1: 1012 | version "1.0.1" 1013 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1014 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1015 | 1016 | tr46@^4.1.1: 1017 | version "4.1.1" 1018 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" 1019 | integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== 1020 | dependencies: 1021 | punycode "^2.3.0" 1022 | 1023 | ts-node@10.9.2: 1024 | version "10.9.2" 1025 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" 1026 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 1027 | dependencies: 1028 | "@cspotcode/source-map-support" "^0.8.0" 1029 | "@tsconfig/node10" "^1.0.7" 1030 | "@tsconfig/node12" "^1.0.7" 1031 | "@tsconfig/node14" "^1.0.0" 1032 | "@tsconfig/node16" "^1.0.2" 1033 | acorn "^8.4.1" 1034 | acorn-walk "^8.1.1" 1035 | arg "^4.1.0" 1036 | create-require "^1.1.0" 1037 | diff "^4.0.1" 1038 | make-error "^1.1.1" 1039 | v8-compile-cache-lib "^3.0.1" 1040 | yn "3.1.1" 1041 | 1042 | type-is@^1.6.18: 1043 | version "1.6.18" 1044 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1045 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1046 | dependencies: 1047 | media-typer "0.3.0" 1048 | mime-types "~2.1.24" 1049 | 1050 | type-is@^2.0.0, type-is@^2.0.1: 1051 | version "2.0.1" 1052 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" 1053 | integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== 1054 | dependencies: 1055 | content-type "^1.0.5" 1056 | media-typer "^1.1.0" 1057 | mime-types "^3.0.0" 1058 | 1059 | typedarray@^0.0.6: 1060 | version "0.0.6" 1061 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1062 | integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== 1063 | 1064 | typescript@5.8.3: 1065 | version "5.8.3" 1066 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" 1067 | integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== 1068 | 1069 | undici-types@~6.19.2: 1070 | version "6.19.8" 1071 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" 1072 | integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== 1073 | 1074 | undici-types@~6.21.0: 1075 | version "6.21.0" 1076 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" 1077 | integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== 1078 | 1079 | unpipe@1.0.0: 1080 | version "1.0.0" 1081 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1082 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1083 | 1084 | util-deprecate@^1.0.1: 1085 | version "1.0.2" 1086 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1087 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1088 | 1089 | v8-compile-cache-lib@^3.0.1: 1090 | version "3.0.1" 1091 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1092 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1093 | 1094 | vary@^1, vary@^1.1.2: 1095 | version "1.1.2" 1096 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1097 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 1098 | 1099 | webidl-conversions@^7.0.0: 1100 | version "7.0.0" 1101 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 1102 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 1103 | 1104 | whatwg-url@^13.0.0: 1105 | version "13.0.0" 1106 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" 1107 | integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== 1108 | dependencies: 1109 | tr46 "^4.1.1" 1110 | webidl-conversions "^7.0.0" 1111 | 1112 | wrappy@1: 1113 | version "1.0.2" 1114 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1115 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1116 | 1117 | xtend@^4.0.2: 1118 | version "4.0.2" 1119 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1120 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1121 | 1122 | yn@3.1.1: 1123 | version "3.1.1" 1124 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1125 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1126 | --------------------------------------------------------------------------------