├── .env.example ├── .gitignore ├── compose.yaml ├── docs ├── components.yml └── swagger-def.js ├── drizzle.config.js ├── drizzle ├── migrate.js └── migrations │ ├── 0000_lowly_scorpion.sql │ └── meta │ ├── 0000_snapshot.json │ └── _journal.json ├── ecosystem.config.json ├── index.js ├── package-lock.json └── src ├── app.js ├── config ├── config.js ├── logger.js ├── passport.js └── tokens.js ├── controllers ├── auth.controller.js ├── index.js └── user.controller.js ├── db ├── index.js ├── schema.js ├── tokens.schema.js └── users.schema.js ├── middlewares ├── auth.middleware.js ├── error.middleware.js ├── morgan.middleware.js └── validate.middleware.js ├── routes ├── auth.route.js ├── index.js └── user.route.js ├── services ├── index.js ├── token.service.js └── user.service.js └── utils └── api-error.js /.env.example: -------------------------------------------------------------------------------- 1 | # Port number 2 | PORT=3000 3 | API_HOST=http://localhost:3000 4 | 5 | # Database Credentials 6 | POSTGRESQL_HOST= 7 | POSTGRESQL_PORT= 8 | POSTGRESQL_DB_NAME= 9 | POSTGRESQL_USER= 10 | POSTGRESQL_PASSWORD= 11 | 12 | # JWT 13 | JWT_SECRET= 14 | JWT_ACCESS_EXPIRATION_MINUTES=30 15 | JWT_REFRESH_EXPIRATION_DAYS=30 16 | JWT_RESET_PASSWORD_EXPIRATION_MINUTES=10 17 | JWT_VERIFY_EMAIL_EXPIRATION_MINUTES=10 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | # turbo 133 | .turbo -------------------------------------------------------------------------------- /compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | postgres: 5 | image: postgres 6 | restart: unless-stopped 7 | container_name: node-auth-postgres 8 | environment: 9 | POSTGRES_DB: ${POSTGRESQL_DB_NAME} 10 | POSTGRES_USER: ${POSTGRESQL_USER} 11 | POSTGRES_PASSWORD: ${POSTGRESQL_PASSWORD} 12 | ports: 13 | - 5432:5432 14 | -------------------------------------------------------------------------------- /docs/components.yml: -------------------------------------------------------------------------------- 1 | components: 2 | schemas: 3 | User: 4 | type: object 5 | properties: 6 | id: 7 | type: string 8 | username: 9 | type: string 10 | email: 11 | type: string 12 | format: email 13 | firstName: 14 | type: string 15 | lastName: 16 | type: string 17 | address: 18 | type: string 19 | phone: 20 | type: string 21 | image: 22 | type: string 23 | createdAt: 24 | type: string 25 | format: date-time 26 | updatedAt: 27 | type: string 28 | format: date-time 29 | example: 30 | id: bb85787c-cfa9-431a-ae63-29878e2f9141 31 | username: test 32 | email: test@test.com 33 | firstName: test 34 | lastName: test 35 | address: some place 36 | phone: +91 00000000 37 | image: some image link 38 | createdAt: 2024-05-2T16:18:04.793Z 39 | updatedAt: 2024-05-2T16:18:04.793Z 40 | 41 | Token: 42 | type: object 43 | properties: 44 | token: 45 | type: string 46 | expires: 47 | type: string 48 | format: date-time 49 | example: 50 | token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YzcxYWQ0Zi05MDY5LTRkNTEtOTI4Ni1mM2FkYTQzNzI5MTAiLCJpYXQiOjE3MTQ3MzE0NTcsImV4cCI6MTcxNDczMzI1NywidHlwZSI6ImFjY2VzcyJ9.ZygGnanFeO-96I7RAV6HLMm5vGlfSxm1BKr4Ag-FwH8 51 | expires: 2024-05-2T16:18:04.793Z 52 | 53 | AuthTokens: 54 | type: object 55 | properties: 56 | access: 57 | $ref: "#/components/schemas/Token" 58 | refresh: 59 | $ref: "#/components/schemas/Token" 60 | 61 | Error: 62 | type: object 63 | properties: 64 | code: 65 | type: number 66 | message: 67 | type: string 68 | 69 | responses: 70 | DuplicateError: 71 | description: ${key} ${value} already exists. Please try again using different value 72 | content: 73 | application/json: 74 | schema: 75 | $ref: "#/components/schemas/Error" 76 | example: 77 | code: 400 78 | message: ${key} ${value} already exists. Please try again using different value 79 | Unauthorized: 80 | description: Unauthorized 81 | content: 82 | application/json: 83 | schema: 84 | $ref: "#/components/schemas/Error" 85 | example: 86 | code: 401 87 | message: Please authenticate 88 | NotFound: 89 | description: Not found 90 | content: 91 | application/json: 92 | schema: 93 | $ref: "#/components/schemas/Error" 94 | example: 95 | code: 404 96 | message: Not found 97 | 98 | securitySchemes: 99 | bearerAuth: 100 | type: http 101 | scheme: bearer 102 | bearerFormat: JWT 103 | -------------------------------------------------------------------------------- /docs/swagger-def.js: -------------------------------------------------------------------------------- 1 | // !NODE: --experimental-json-modules 2 | // import packageData from "../package.json" with { type: "json" }; 3 | import fs from "node:fs"; 4 | import env from "../src/config/config.js"; 5 | 6 | const packageData = JSON.parse(fs.readFileSync("./package.json")); 7 | 8 | const swaggerDef = { 9 | openapi: "3.1.0", 10 | info: { 11 | title: "node-express-drizzle API documentation", 12 | version: packageData.version, 13 | }, 14 | servers: [ 15 | { 16 | url: `${env.apiHost}/api`, 17 | }, 18 | ], 19 | }; 20 | 21 | export default swaggerDef; 22 | -------------------------------------------------------------------------------- /drizzle.config.js: -------------------------------------------------------------------------------- 1 | import "dotenv/config"; 2 | 3 | export default { 4 | schema: "src/db/schema.js", 5 | out: "drizzle/migrations", 6 | driver: "pg", 7 | dbCredentials: { 8 | host: process.env.POSTGRESQL_HOST, 9 | port: +(process.env.POSTGRESQL_PORT || "5432"), 10 | database: process.env.POSTGRESQL_DB_NAME, 11 | user: process.env.POSTGRESQL_USER, 12 | password: process.env.POSTGRESQL_PASSWORD, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /drizzle/migrate.js: -------------------------------------------------------------------------------- 1 | import "dotenv/config"; 2 | import { drizzle } from "drizzle-orm/postgres-js"; 3 | import { migrate } from "drizzle-orm/postgres-js/migrator"; 4 | import postgres from "postgres"; 5 | 6 | async function main() { 7 | const client = postgres({ 8 | max: 1, 9 | host: process.env.POSTGRESQL_HOST, 10 | port: +(process.env.POSTGRESQL_PORT || "5432"), 11 | database: process.env.POSTGRESQL_DB_NAME, 12 | user: process.env.POSTGRESQL_USER, 13 | password: process.env.POSTGRESQL_PASSWORD, 14 | }); 15 | 16 | const db = drizzle(client); 17 | 18 | await migrate(db, { migrationsFolder: "./drizzle/migrations" }); 19 | await client.end(); 20 | } 21 | 22 | main(); 23 | -------------------------------------------------------------------------------- /drizzle/migrations/0000_lowly_scorpion.sql: -------------------------------------------------------------------------------- 1 | DO $$ BEGIN 2 | CREATE TYPE "token_types" AS ENUM('refresh', 'resetPassword'); 3 | EXCEPTION 4 | WHEN duplicate_object THEN null; 5 | END $$; 6 | --> statement-breakpoint 7 | CREATE TABLE IF NOT EXISTS "users" ( 8 | "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, 9 | "username" text NOT NULL, 10 | "email" text NOT NULL, 11 | "password" text NOT NULL, 12 | "first_name" text, 13 | "last_name" text, 14 | "address" text, 15 | "phone" text, 16 | "image" text, 17 | "created_at" timestamp DEFAULT now() NOT NULL, 18 | "updated_at" timestamp DEFAULT now() NOT NULL, 19 | CONSTRAINT "users_username_unique" UNIQUE("username"), 20 | CONSTRAINT "users_email_unique" UNIQUE("email") 21 | ); 22 | --> statement-breakpoint 23 | CREATE TABLE IF NOT EXISTS "tokens" ( 24 | "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, 25 | "user_id" uuid NOT NULL, 26 | "token" text NOT NULL, 27 | "type" "token_types" NOT NULL, 28 | "expires" timestamp NOT NULL, 29 | "created_at" timestamp DEFAULT now() NOT NULL 30 | ); 31 | --> statement-breakpoint 32 | DO $$ BEGIN 33 | ALTER TABLE "tokens" ADD CONSTRAINT "tokens_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action; 34 | EXCEPTION 35 | WHEN duplicate_object THEN null; 36 | END $$; 37 | -------------------------------------------------------------------------------- /drizzle/migrations/meta/0000_snapshot.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "c1ab315a-ea99-4fd5-a405-f7f4a8eef9a3", 3 | "prevId": "00000000-0000-0000-0000-000000000000", 4 | "version": "5", 5 | "dialect": "pg", 6 | "tables": { 7 | "users": { 8 | "name": "users", 9 | "schema": "", 10 | "columns": { 11 | "id": { 12 | "name": "id", 13 | "type": "uuid", 14 | "primaryKey": true, 15 | "notNull": true, 16 | "default": "gen_random_uuid()" 17 | }, 18 | "username": { 19 | "name": "username", 20 | "type": "text", 21 | "primaryKey": false, 22 | "notNull": true 23 | }, 24 | "email": { 25 | "name": "email", 26 | "type": "text", 27 | "primaryKey": false, 28 | "notNull": true 29 | }, 30 | "password": { 31 | "name": "password", 32 | "type": "text", 33 | "primaryKey": false, 34 | "notNull": true 35 | }, 36 | "first_name": { 37 | "name": "first_name", 38 | "type": "text", 39 | "primaryKey": false, 40 | "notNull": false 41 | }, 42 | "last_name": { 43 | "name": "last_name", 44 | "type": "text", 45 | "primaryKey": false, 46 | "notNull": false 47 | }, 48 | "address": { 49 | "name": "address", 50 | "type": "text", 51 | "primaryKey": false, 52 | "notNull": false 53 | }, 54 | "phone": { 55 | "name": "phone", 56 | "type": "text", 57 | "primaryKey": false, 58 | "notNull": false 59 | }, 60 | "image": { 61 | "name": "image", 62 | "type": "text", 63 | "primaryKey": false, 64 | "notNull": false 65 | }, 66 | "created_at": { 67 | "name": "created_at", 68 | "type": "timestamp", 69 | "primaryKey": false, 70 | "notNull": true, 71 | "default": "now()" 72 | }, 73 | "updated_at": { 74 | "name": "updated_at", 75 | "type": "timestamp", 76 | "primaryKey": false, 77 | "notNull": true, 78 | "default": "now()" 79 | } 80 | }, 81 | "indexes": {}, 82 | "foreignKeys": {}, 83 | "compositePrimaryKeys": {}, 84 | "uniqueConstraints": { 85 | "users_username_unique": { 86 | "name": "users_username_unique", 87 | "nullsNotDistinct": false, 88 | "columns": [ 89 | "username" 90 | ] 91 | }, 92 | "users_email_unique": { 93 | "name": "users_email_unique", 94 | "nullsNotDistinct": false, 95 | "columns": [ 96 | "email" 97 | ] 98 | } 99 | } 100 | }, 101 | "tokens": { 102 | "name": "tokens", 103 | "schema": "", 104 | "columns": { 105 | "id": { 106 | "name": "id", 107 | "type": "uuid", 108 | "primaryKey": true, 109 | "notNull": true, 110 | "default": "gen_random_uuid()" 111 | }, 112 | "user_id": { 113 | "name": "user_id", 114 | "type": "uuid", 115 | "primaryKey": false, 116 | "notNull": true 117 | }, 118 | "token": { 119 | "name": "token", 120 | "type": "text", 121 | "primaryKey": false, 122 | "notNull": true 123 | }, 124 | "type": { 125 | "name": "type", 126 | "type": "token_types", 127 | "primaryKey": false, 128 | "notNull": true 129 | }, 130 | "expires": { 131 | "name": "expires", 132 | "type": "timestamp", 133 | "primaryKey": false, 134 | "notNull": true 135 | }, 136 | "created_at": { 137 | "name": "created_at", 138 | "type": "timestamp", 139 | "primaryKey": false, 140 | "notNull": true, 141 | "default": "now()" 142 | } 143 | }, 144 | "indexes": {}, 145 | "foreignKeys": { 146 | "tokens_user_id_users_id_fk": { 147 | "name": "tokens_user_id_users_id_fk", 148 | "tableFrom": "tokens", 149 | "tableTo": "users", 150 | "columnsFrom": [ 151 | "user_id" 152 | ], 153 | "columnsTo": [ 154 | "id" 155 | ], 156 | "onDelete": "cascade", 157 | "onUpdate": "no action" 158 | } 159 | }, 160 | "compositePrimaryKeys": {}, 161 | "uniqueConstraints": {} 162 | } 163 | }, 164 | "enums": { 165 | "token_types": { 166 | "name": "token_types", 167 | "values": { 168 | "refresh": "refresh", 169 | "resetPassword": "resetPassword" 170 | } 171 | } 172 | }, 173 | "schemas": {}, 174 | "_meta": { 175 | "columns": {}, 176 | "schemas": {}, 177 | "tables": {} 178 | } 179 | } -------------------------------------------------------------------------------- /drizzle/migrations/meta/_journal.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "5", 3 | "dialect": "pg", 4 | "entries": [ 5 | { 6 | "idx": 0, 7 | "version": "5", 8 | "when": 1714731308024, 9 | "tag": "0000_lowly_scorpion", 10 | "breakpoints": true 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /ecosystem.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "apps": [ 3 | { 4 | "name": "app", 5 | "script": "index.js", 6 | "instances": 1, 7 | "autorestart": true, 8 | "watch": false, 9 | "time": true, 10 | "env": { 11 | "NODE_ENV": "production" 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { sql } from "drizzle-orm"; 2 | 3 | import app from "./src/app.js"; 4 | import env from "./src/config/config.js"; 5 | import logger from "./src/config/logger.js"; 6 | import { db } from "./src/db/index.js"; 7 | 8 | // start the server 9 | const server = app.listen(env.port, () => { 10 | logger.info(`Listening to port ${env.port}`); 11 | }); 12 | 13 | // check database connection 14 | try { 15 | const res = await db 16 | .execute(sql`select 1 as connection`) 17 | .then((res) => res[0]); 18 | if (!res.connection) { 19 | throw new Error("Not connected to database"); 20 | } 21 | logger.info("Connected to database"); 22 | } catch (err) { 23 | logger.error("Failed to connect to database:", err); 24 | server.close(); 25 | } 26 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-express-drizzle", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "node-express-drizzle", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "bcrypt": "^5.1.1", 12 | "body-parser": "^1.20.2", 13 | "compression": "^1.7.4", 14 | "cors": "^2.8.5", 15 | "dayjs": "^1.11.11", 16 | "dotenv": "^16.4.5", 17 | "drizzle-orm": "^0.30.10", 18 | "drizzle-zod": "^0.5.1", 19 | "express": "^4.19.2", 20 | "helmet": "^7.1.0", 21 | "http-status": "^1.7.4", 22 | "jsonwebtoken": "^9.0.2", 23 | "morgan": "^1.10.0", 24 | "passport": "^0.7.0", 25 | "passport-jwt": "^4.0.1", 26 | "postgres": "^3.4.4", 27 | "swagger-jsdoc": "^6.2.8", 28 | "swagger-ui-express": "^5.0.0", 29 | "winston": "^3.13.0", 30 | "winston-daily-rotate-file": "^5.0.0", 31 | "zod": "^3.23.5" 32 | }, 33 | "devDependencies": { 34 | "drizzle-kit": "^0.20.17", 35 | "nodemon": "^3.1.0" 36 | } 37 | }, 38 | "client": { 39 | "version": "1.0.0", 40 | "extraneous": true 41 | }, 42 | "node_modules/@apidevtools/json-schema-ref-parser": { 43 | "version": "9.1.2", 44 | "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", 45 | "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", 46 | "dependencies": { 47 | "@jsdevtools/ono": "^7.1.3", 48 | "@types/json-schema": "^7.0.6", 49 | "call-me-maybe": "^1.0.1", 50 | "js-yaml": "^4.1.0" 51 | } 52 | }, 53 | "node_modules/@apidevtools/openapi-schemas": { 54 | "version": "2.1.0", 55 | "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", 56 | "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", 57 | "engines": { 58 | "node": ">=10" 59 | } 60 | }, 61 | "node_modules/@apidevtools/swagger-methods": { 62 | "version": "3.0.2", 63 | "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", 64 | "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" 65 | }, 66 | "node_modules/@apidevtools/swagger-parser": { 67 | "version": "10.0.3", 68 | "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", 69 | "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", 70 | "dependencies": { 71 | "@apidevtools/json-schema-ref-parser": "^9.0.6", 72 | "@apidevtools/openapi-schemas": "^2.0.4", 73 | "@apidevtools/swagger-methods": "^3.0.2", 74 | "@jsdevtools/ono": "^7.1.3", 75 | "call-me-maybe": "^1.0.1", 76 | "z-schema": "^5.0.1" 77 | }, 78 | "peerDependencies": { 79 | "openapi-types": ">=7" 80 | } 81 | }, 82 | "node_modules/@colors/colors": { 83 | "version": "1.6.0", 84 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", 85 | "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", 86 | "engines": { 87 | "node": ">=0.1.90" 88 | } 89 | }, 90 | "node_modules/@dabh/diagnostics": { 91 | "version": "2.0.3", 92 | "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", 93 | "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", 94 | "dependencies": { 95 | "colorspace": "1.1.x", 96 | "enabled": "2.0.x", 97 | "kuler": "^2.0.0" 98 | } 99 | }, 100 | "node_modules/@esbuild-kit/core-utils": { 101 | "version": "3.3.2", 102 | "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", 103 | "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", 104 | "dev": true, 105 | "dependencies": { 106 | "esbuild": "~0.18.20", 107 | "source-map-support": "^0.5.21" 108 | } 109 | }, 110 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { 111 | "version": "0.18.20", 112 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 113 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 114 | "cpu": [ 115 | "arm" 116 | ], 117 | "dev": true, 118 | "optional": true, 119 | "os": [ 120 | "android" 121 | ], 122 | "engines": { 123 | "node": ">=12" 124 | } 125 | }, 126 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { 127 | "version": "0.18.20", 128 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 129 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 130 | "cpu": [ 131 | "arm64" 132 | ], 133 | "dev": true, 134 | "optional": true, 135 | "os": [ 136 | "android" 137 | ], 138 | "engines": { 139 | "node": ">=12" 140 | } 141 | }, 142 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { 143 | "version": "0.18.20", 144 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 145 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 146 | "cpu": [ 147 | "x64" 148 | ], 149 | "dev": true, 150 | "optional": true, 151 | "os": [ 152 | "android" 153 | ], 154 | "engines": { 155 | "node": ">=12" 156 | } 157 | }, 158 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { 159 | "version": "0.18.20", 160 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", 161 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 162 | "cpu": [ 163 | "arm64" 164 | ], 165 | "dev": true, 166 | "optional": true, 167 | "os": [ 168 | "darwin" 169 | ], 170 | "engines": { 171 | "node": ">=12" 172 | } 173 | }, 174 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { 175 | "version": "0.18.20", 176 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 177 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 178 | "cpu": [ 179 | "x64" 180 | ], 181 | "dev": true, 182 | "optional": true, 183 | "os": [ 184 | "darwin" 185 | ], 186 | "engines": { 187 | "node": ">=12" 188 | } 189 | }, 190 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { 191 | "version": "0.18.20", 192 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 193 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 194 | "cpu": [ 195 | "arm64" 196 | ], 197 | "dev": true, 198 | "optional": true, 199 | "os": [ 200 | "freebsd" 201 | ], 202 | "engines": { 203 | "node": ">=12" 204 | } 205 | }, 206 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { 207 | "version": "0.18.20", 208 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 209 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 210 | "cpu": [ 211 | "x64" 212 | ], 213 | "dev": true, 214 | "optional": true, 215 | "os": [ 216 | "freebsd" 217 | ], 218 | "engines": { 219 | "node": ">=12" 220 | } 221 | }, 222 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { 223 | "version": "0.18.20", 224 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 225 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 226 | "cpu": [ 227 | "arm" 228 | ], 229 | "dev": true, 230 | "optional": true, 231 | "os": [ 232 | "linux" 233 | ], 234 | "engines": { 235 | "node": ">=12" 236 | } 237 | }, 238 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { 239 | "version": "0.18.20", 240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 241 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 242 | "cpu": [ 243 | "arm64" 244 | ], 245 | "dev": true, 246 | "optional": true, 247 | "os": [ 248 | "linux" 249 | ], 250 | "engines": { 251 | "node": ">=12" 252 | } 253 | }, 254 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { 255 | "version": "0.18.20", 256 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 257 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 258 | "cpu": [ 259 | "ia32" 260 | ], 261 | "dev": true, 262 | "optional": true, 263 | "os": [ 264 | "linux" 265 | ], 266 | "engines": { 267 | "node": ">=12" 268 | } 269 | }, 270 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { 271 | "version": "0.18.20", 272 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 273 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 274 | "cpu": [ 275 | "loong64" 276 | ], 277 | "dev": true, 278 | "optional": true, 279 | "os": [ 280 | "linux" 281 | ], 282 | "engines": { 283 | "node": ">=12" 284 | } 285 | }, 286 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { 287 | "version": "0.18.20", 288 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 289 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 290 | "cpu": [ 291 | "mips64el" 292 | ], 293 | "dev": true, 294 | "optional": true, 295 | "os": [ 296 | "linux" 297 | ], 298 | "engines": { 299 | "node": ">=12" 300 | } 301 | }, 302 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { 303 | "version": "0.18.20", 304 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 305 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 306 | "cpu": [ 307 | "ppc64" 308 | ], 309 | "dev": true, 310 | "optional": true, 311 | "os": [ 312 | "linux" 313 | ], 314 | "engines": { 315 | "node": ">=12" 316 | } 317 | }, 318 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { 319 | "version": "0.18.20", 320 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 321 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 322 | "cpu": [ 323 | "riscv64" 324 | ], 325 | "dev": true, 326 | "optional": true, 327 | "os": [ 328 | "linux" 329 | ], 330 | "engines": { 331 | "node": ">=12" 332 | } 333 | }, 334 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { 335 | "version": "0.18.20", 336 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 337 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 338 | "cpu": [ 339 | "s390x" 340 | ], 341 | "dev": true, 342 | "optional": true, 343 | "os": [ 344 | "linux" 345 | ], 346 | "engines": { 347 | "node": ">=12" 348 | } 349 | }, 350 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { 351 | "version": "0.18.20", 352 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 353 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 354 | "cpu": [ 355 | "x64" 356 | ], 357 | "dev": true, 358 | "optional": true, 359 | "os": [ 360 | "linux" 361 | ], 362 | "engines": { 363 | "node": ">=12" 364 | } 365 | }, 366 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { 367 | "version": "0.18.20", 368 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 369 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 370 | "cpu": [ 371 | "x64" 372 | ], 373 | "dev": true, 374 | "optional": true, 375 | "os": [ 376 | "netbsd" 377 | ], 378 | "engines": { 379 | "node": ">=12" 380 | } 381 | }, 382 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { 383 | "version": "0.18.20", 384 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 385 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 386 | "cpu": [ 387 | "x64" 388 | ], 389 | "dev": true, 390 | "optional": true, 391 | "os": [ 392 | "openbsd" 393 | ], 394 | "engines": { 395 | "node": ">=12" 396 | } 397 | }, 398 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { 399 | "version": "0.18.20", 400 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 401 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 402 | "cpu": [ 403 | "x64" 404 | ], 405 | "dev": true, 406 | "optional": true, 407 | "os": [ 408 | "sunos" 409 | ], 410 | "engines": { 411 | "node": ">=12" 412 | } 413 | }, 414 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { 415 | "version": "0.18.20", 416 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 417 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 418 | "cpu": [ 419 | "arm64" 420 | ], 421 | "dev": true, 422 | "optional": true, 423 | "os": [ 424 | "win32" 425 | ], 426 | "engines": { 427 | "node": ">=12" 428 | } 429 | }, 430 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { 431 | "version": "0.18.20", 432 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 433 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 434 | "cpu": [ 435 | "ia32" 436 | ], 437 | "dev": true, 438 | "optional": true, 439 | "os": [ 440 | "win32" 441 | ], 442 | "engines": { 443 | "node": ">=12" 444 | } 445 | }, 446 | "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { 447 | "version": "0.18.20", 448 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 449 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 450 | "cpu": [ 451 | "x64" 452 | ], 453 | "dev": true, 454 | "optional": true, 455 | "os": [ 456 | "win32" 457 | ], 458 | "engines": { 459 | "node": ">=12" 460 | } 461 | }, 462 | "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { 463 | "version": "0.18.20", 464 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 465 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 466 | "dev": true, 467 | "hasInstallScript": true, 468 | "bin": { 469 | "esbuild": "bin/esbuild" 470 | }, 471 | "engines": { 472 | "node": ">=12" 473 | }, 474 | "optionalDependencies": { 475 | "@esbuild/android-arm": "0.18.20", 476 | "@esbuild/android-arm64": "0.18.20", 477 | "@esbuild/android-x64": "0.18.20", 478 | "@esbuild/darwin-arm64": "0.18.20", 479 | "@esbuild/darwin-x64": "0.18.20", 480 | "@esbuild/freebsd-arm64": "0.18.20", 481 | "@esbuild/freebsd-x64": "0.18.20", 482 | "@esbuild/linux-arm": "0.18.20", 483 | "@esbuild/linux-arm64": "0.18.20", 484 | "@esbuild/linux-ia32": "0.18.20", 485 | "@esbuild/linux-loong64": "0.18.20", 486 | "@esbuild/linux-mips64el": "0.18.20", 487 | "@esbuild/linux-ppc64": "0.18.20", 488 | "@esbuild/linux-riscv64": "0.18.20", 489 | "@esbuild/linux-s390x": "0.18.20", 490 | "@esbuild/linux-x64": "0.18.20", 491 | "@esbuild/netbsd-x64": "0.18.20", 492 | "@esbuild/openbsd-x64": "0.18.20", 493 | "@esbuild/sunos-x64": "0.18.20", 494 | "@esbuild/win32-arm64": "0.18.20", 495 | "@esbuild/win32-ia32": "0.18.20", 496 | "@esbuild/win32-x64": "0.18.20" 497 | } 498 | }, 499 | "node_modules/@esbuild-kit/esm-loader": { 500 | "version": "2.6.5", 501 | "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", 502 | "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", 503 | "dev": true, 504 | "dependencies": { 505 | "@esbuild-kit/core-utils": "^3.3.2", 506 | "get-tsconfig": "^4.7.0" 507 | } 508 | }, 509 | "node_modules/@esbuild/aix-ppc64": { 510 | "version": "0.19.12", 511 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", 512 | "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", 513 | "cpu": [ 514 | "ppc64" 515 | ], 516 | "dev": true, 517 | "optional": true, 518 | "os": [ 519 | "aix" 520 | ], 521 | "engines": { 522 | "node": ">=12" 523 | } 524 | }, 525 | "node_modules/@esbuild/android-arm": { 526 | "version": "0.19.12", 527 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", 528 | "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", 529 | "cpu": [ 530 | "arm" 531 | ], 532 | "dev": true, 533 | "optional": true, 534 | "os": [ 535 | "android" 536 | ], 537 | "engines": { 538 | "node": ">=12" 539 | } 540 | }, 541 | "node_modules/@esbuild/android-arm64": { 542 | "version": "0.19.12", 543 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", 544 | "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", 545 | "cpu": [ 546 | "arm64" 547 | ], 548 | "dev": true, 549 | "optional": true, 550 | "os": [ 551 | "android" 552 | ], 553 | "engines": { 554 | "node": ">=12" 555 | } 556 | }, 557 | "node_modules/@esbuild/android-x64": { 558 | "version": "0.19.12", 559 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", 560 | "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", 561 | "cpu": [ 562 | "x64" 563 | ], 564 | "dev": true, 565 | "optional": true, 566 | "os": [ 567 | "android" 568 | ], 569 | "engines": { 570 | "node": ">=12" 571 | } 572 | }, 573 | "node_modules/@esbuild/darwin-arm64": { 574 | "version": "0.19.12", 575 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", 576 | "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", 577 | "cpu": [ 578 | "arm64" 579 | ], 580 | "dev": true, 581 | "optional": true, 582 | "os": [ 583 | "darwin" 584 | ], 585 | "engines": { 586 | "node": ">=12" 587 | } 588 | }, 589 | "node_modules/@esbuild/darwin-x64": { 590 | "version": "0.19.12", 591 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", 592 | "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", 593 | "cpu": [ 594 | "x64" 595 | ], 596 | "dev": true, 597 | "optional": true, 598 | "os": [ 599 | "darwin" 600 | ], 601 | "engines": { 602 | "node": ">=12" 603 | } 604 | }, 605 | "node_modules/@esbuild/freebsd-arm64": { 606 | "version": "0.19.12", 607 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", 608 | "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", 609 | "cpu": [ 610 | "arm64" 611 | ], 612 | "dev": true, 613 | "optional": true, 614 | "os": [ 615 | "freebsd" 616 | ], 617 | "engines": { 618 | "node": ">=12" 619 | } 620 | }, 621 | "node_modules/@esbuild/freebsd-x64": { 622 | "version": "0.19.12", 623 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", 624 | "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", 625 | "cpu": [ 626 | "x64" 627 | ], 628 | "dev": true, 629 | "optional": true, 630 | "os": [ 631 | "freebsd" 632 | ], 633 | "engines": { 634 | "node": ">=12" 635 | } 636 | }, 637 | "node_modules/@esbuild/linux-arm": { 638 | "version": "0.19.12", 639 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", 640 | "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", 641 | "cpu": [ 642 | "arm" 643 | ], 644 | "dev": true, 645 | "optional": true, 646 | "os": [ 647 | "linux" 648 | ], 649 | "engines": { 650 | "node": ">=12" 651 | } 652 | }, 653 | "node_modules/@esbuild/linux-arm64": { 654 | "version": "0.19.12", 655 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", 656 | "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", 657 | "cpu": [ 658 | "arm64" 659 | ], 660 | "dev": true, 661 | "optional": true, 662 | "os": [ 663 | "linux" 664 | ], 665 | "engines": { 666 | "node": ">=12" 667 | } 668 | }, 669 | "node_modules/@esbuild/linux-ia32": { 670 | "version": "0.19.12", 671 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", 672 | "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", 673 | "cpu": [ 674 | "ia32" 675 | ], 676 | "dev": true, 677 | "optional": true, 678 | "os": [ 679 | "linux" 680 | ], 681 | "engines": { 682 | "node": ">=12" 683 | } 684 | }, 685 | "node_modules/@esbuild/linux-loong64": { 686 | "version": "0.19.12", 687 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", 688 | "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", 689 | "cpu": [ 690 | "loong64" 691 | ], 692 | "dev": true, 693 | "optional": true, 694 | "os": [ 695 | "linux" 696 | ], 697 | "engines": { 698 | "node": ">=12" 699 | } 700 | }, 701 | "node_modules/@esbuild/linux-mips64el": { 702 | "version": "0.19.12", 703 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", 704 | "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", 705 | "cpu": [ 706 | "mips64el" 707 | ], 708 | "dev": true, 709 | "optional": true, 710 | "os": [ 711 | "linux" 712 | ], 713 | "engines": { 714 | "node": ">=12" 715 | } 716 | }, 717 | "node_modules/@esbuild/linux-ppc64": { 718 | "version": "0.19.12", 719 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", 720 | "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", 721 | "cpu": [ 722 | "ppc64" 723 | ], 724 | "dev": true, 725 | "optional": true, 726 | "os": [ 727 | "linux" 728 | ], 729 | "engines": { 730 | "node": ">=12" 731 | } 732 | }, 733 | "node_modules/@esbuild/linux-riscv64": { 734 | "version": "0.19.12", 735 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", 736 | "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", 737 | "cpu": [ 738 | "riscv64" 739 | ], 740 | "dev": true, 741 | "optional": true, 742 | "os": [ 743 | "linux" 744 | ], 745 | "engines": { 746 | "node": ">=12" 747 | } 748 | }, 749 | "node_modules/@esbuild/linux-s390x": { 750 | "version": "0.19.12", 751 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", 752 | "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", 753 | "cpu": [ 754 | "s390x" 755 | ], 756 | "dev": true, 757 | "optional": true, 758 | "os": [ 759 | "linux" 760 | ], 761 | "engines": { 762 | "node": ">=12" 763 | } 764 | }, 765 | "node_modules/@esbuild/linux-x64": { 766 | "version": "0.19.12", 767 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", 768 | "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", 769 | "cpu": [ 770 | "x64" 771 | ], 772 | "dev": true, 773 | "optional": true, 774 | "os": [ 775 | "linux" 776 | ], 777 | "engines": { 778 | "node": ">=12" 779 | } 780 | }, 781 | "node_modules/@esbuild/netbsd-x64": { 782 | "version": "0.19.12", 783 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", 784 | "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", 785 | "cpu": [ 786 | "x64" 787 | ], 788 | "dev": true, 789 | "optional": true, 790 | "os": [ 791 | "netbsd" 792 | ], 793 | "engines": { 794 | "node": ">=12" 795 | } 796 | }, 797 | "node_modules/@esbuild/openbsd-x64": { 798 | "version": "0.19.12", 799 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", 800 | "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", 801 | "cpu": [ 802 | "x64" 803 | ], 804 | "dev": true, 805 | "optional": true, 806 | "os": [ 807 | "openbsd" 808 | ], 809 | "engines": { 810 | "node": ">=12" 811 | } 812 | }, 813 | "node_modules/@esbuild/sunos-x64": { 814 | "version": "0.19.12", 815 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", 816 | "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", 817 | "cpu": [ 818 | "x64" 819 | ], 820 | "dev": true, 821 | "optional": true, 822 | "os": [ 823 | "sunos" 824 | ], 825 | "engines": { 826 | "node": ">=12" 827 | } 828 | }, 829 | "node_modules/@esbuild/win32-arm64": { 830 | "version": "0.19.12", 831 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", 832 | "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", 833 | "cpu": [ 834 | "arm64" 835 | ], 836 | "dev": true, 837 | "optional": true, 838 | "os": [ 839 | "win32" 840 | ], 841 | "engines": { 842 | "node": ">=12" 843 | } 844 | }, 845 | "node_modules/@esbuild/win32-ia32": { 846 | "version": "0.19.12", 847 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", 848 | "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", 849 | "cpu": [ 850 | "ia32" 851 | ], 852 | "dev": true, 853 | "optional": true, 854 | "os": [ 855 | "win32" 856 | ], 857 | "engines": { 858 | "node": ">=12" 859 | } 860 | }, 861 | "node_modules/@esbuild/win32-x64": { 862 | "version": "0.19.12", 863 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", 864 | "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", 865 | "cpu": [ 866 | "x64" 867 | ], 868 | "dev": true, 869 | "optional": true, 870 | "os": [ 871 | "win32" 872 | ], 873 | "engines": { 874 | "node": ">=12" 875 | } 876 | }, 877 | "node_modules/@hono/node-server": { 878 | "version": "1.11.1", 879 | "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.11.1.tgz", 880 | "integrity": "sha512-GW1Iomhmm1o4Z+X57xGby8A35Cu9UZLL7pSMdqDBkD99U5cywff8F+8hLk5aBTzNubnsFAvWQ/fZjNwPsEn9lA==", 881 | "dev": true, 882 | "engines": { 883 | "node": ">=18.14.1" 884 | } 885 | }, 886 | "node_modules/@hono/zod-validator": { 887 | "version": "0.2.1", 888 | "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.2.1.tgz", 889 | "integrity": "sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==", 890 | "dev": true, 891 | "peerDependencies": { 892 | "hono": ">=3.9.0", 893 | "zod": "^3.19.1" 894 | } 895 | }, 896 | "node_modules/@jsdevtools/ono": { 897 | "version": "7.1.3", 898 | "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", 899 | "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" 900 | }, 901 | "node_modules/@mapbox/node-pre-gyp": { 902 | "version": "1.0.11", 903 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", 904 | "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", 905 | "dependencies": { 906 | "detect-libc": "^2.0.0", 907 | "https-proxy-agent": "^5.0.0", 908 | "make-dir": "^3.1.0", 909 | "node-fetch": "^2.6.7", 910 | "nopt": "^5.0.0", 911 | "npmlog": "^5.0.1", 912 | "rimraf": "^3.0.2", 913 | "semver": "^7.3.5", 914 | "tar": "^6.1.11" 915 | }, 916 | "bin": { 917 | "node-pre-gyp": "bin/node-pre-gyp" 918 | } 919 | }, 920 | "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { 921 | "version": "5.0.0", 922 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 923 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 924 | "dependencies": { 925 | "abbrev": "1" 926 | }, 927 | "bin": { 928 | "nopt": "bin/nopt.js" 929 | }, 930 | "engines": { 931 | "node": ">=6" 932 | } 933 | }, 934 | "node_modules/@types/json-schema": { 935 | "version": "7.0.15", 936 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 937 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" 938 | }, 939 | "node_modules/@types/triple-beam": { 940 | "version": "1.3.5", 941 | "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", 942 | "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" 943 | }, 944 | "node_modules/abbrev": { 945 | "version": "1.1.1", 946 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 947 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 948 | }, 949 | "node_modules/accepts": { 950 | "version": "1.3.8", 951 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 952 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 953 | "dependencies": { 954 | "mime-types": "~2.1.34", 955 | "negotiator": "0.6.3" 956 | }, 957 | "engines": { 958 | "node": ">= 0.6" 959 | } 960 | }, 961 | "node_modules/agent-base": { 962 | "version": "6.0.2", 963 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 964 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 965 | "dependencies": { 966 | "debug": "4" 967 | }, 968 | "engines": { 969 | "node": ">= 6.0.0" 970 | } 971 | }, 972 | "node_modules/agent-base/node_modules/debug": { 973 | "version": "4.3.4", 974 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 975 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 976 | "dependencies": { 977 | "ms": "2.1.2" 978 | }, 979 | "engines": { 980 | "node": ">=6.0" 981 | }, 982 | "peerDependenciesMeta": { 983 | "supports-color": { 984 | "optional": true 985 | } 986 | } 987 | }, 988 | "node_modules/agent-base/node_modules/ms": { 989 | "version": "2.1.2", 990 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 991 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 992 | }, 993 | "node_modules/ansi-regex": { 994 | "version": "5.0.1", 995 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 996 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 997 | "engines": { 998 | "node": ">=8" 999 | } 1000 | }, 1001 | "node_modules/anymatch": { 1002 | "version": "3.1.3", 1003 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1004 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1005 | "dev": true, 1006 | "dependencies": { 1007 | "normalize-path": "^3.0.0", 1008 | "picomatch": "^2.0.4" 1009 | }, 1010 | "engines": { 1011 | "node": ">= 8" 1012 | } 1013 | }, 1014 | "node_modules/aproba": { 1015 | "version": "2.0.0", 1016 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 1017 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" 1018 | }, 1019 | "node_modules/are-we-there-yet": { 1020 | "version": "2.0.0", 1021 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", 1022 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", 1023 | "dependencies": { 1024 | "delegates": "^1.0.0", 1025 | "readable-stream": "^3.6.0" 1026 | }, 1027 | "engines": { 1028 | "node": ">=10" 1029 | } 1030 | }, 1031 | "node_modules/argparse": { 1032 | "version": "2.0.1", 1033 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1034 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 1035 | }, 1036 | "node_modules/array-flatten": { 1037 | "version": "1.1.1", 1038 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1039 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1040 | }, 1041 | "node_modules/async": { 1042 | "version": "3.2.5", 1043 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", 1044 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" 1045 | }, 1046 | "node_modules/balanced-match": { 1047 | "version": "1.0.2", 1048 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1049 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1050 | }, 1051 | "node_modules/basic-auth": { 1052 | "version": "2.0.1", 1053 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 1054 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 1055 | "dependencies": { 1056 | "safe-buffer": "5.1.2" 1057 | }, 1058 | "engines": { 1059 | "node": ">= 0.8" 1060 | } 1061 | }, 1062 | "node_modules/basic-auth/node_modules/safe-buffer": { 1063 | "version": "5.1.2", 1064 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1065 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1066 | }, 1067 | "node_modules/bcrypt": { 1068 | "version": "5.1.1", 1069 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", 1070 | "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", 1071 | "hasInstallScript": true, 1072 | "dependencies": { 1073 | "@mapbox/node-pre-gyp": "^1.0.11", 1074 | "node-addon-api": "^5.0.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">= 10.0.0" 1078 | } 1079 | }, 1080 | "node_modules/binary-extensions": { 1081 | "version": "2.3.0", 1082 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1083 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1084 | "dev": true, 1085 | "engines": { 1086 | "node": ">=8" 1087 | }, 1088 | "funding": { 1089 | "url": "https://github.com/sponsors/sindresorhus" 1090 | } 1091 | }, 1092 | "node_modules/body-parser": { 1093 | "version": "1.20.2", 1094 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 1095 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 1096 | "dependencies": { 1097 | "bytes": "3.1.2", 1098 | "content-type": "~1.0.5", 1099 | "debug": "2.6.9", 1100 | "depd": "2.0.0", 1101 | "destroy": "1.2.0", 1102 | "http-errors": "2.0.0", 1103 | "iconv-lite": "0.4.24", 1104 | "on-finished": "2.4.1", 1105 | "qs": "6.11.0", 1106 | "raw-body": "2.5.2", 1107 | "type-is": "~1.6.18", 1108 | "unpipe": "1.0.0" 1109 | }, 1110 | "engines": { 1111 | "node": ">= 0.8", 1112 | "npm": "1.2.8000 || >= 1.4.16" 1113 | } 1114 | }, 1115 | "node_modules/brace-expansion": { 1116 | "version": "1.1.11", 1117 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1118 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1119 | "dependencies": { 1120 | "balanced-match": "^1.0.0", 1121 | "concat-map": "0.0.1" 1122 | } 1123 | }, 1124 | "node_modules/braces": { 1125 | "version": "3.0.2", 1126 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1127 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1128 | "dev": true, 1129 | "dependencies": { 1130 | "fill-range": "^7.0.1" 1131 | }, 1132 | "engines": { 1133 | "node": ">=8" 1134 | } 1135 | }, 1136 | "node_modules/buffer-equal-constant-time": { 1137 | "version": "1.0.1", 1138 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 1139 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 1140 | }, 1141 | "node_modules/buffer-from": { 1142 | "version": "1.1.2", 1143 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1144 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1145 | "dev": true 1146 | }, 1147 | "node_modules/bytes": { 1148 | "version": "3.1.2", 1149 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1150 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 1151 | "engines": { 1152 | "node": ">= 0.8" 1153 | } 1154 | }, 1155 | "node_modules/call-bind": { 1156 | "version": "1.0.7", 1157 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 1158 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 1159 | "dependencies": { 1160 | "es-define-property": "^1.0.0", 1161 | "es-errors": "^1.3.0", 1162 | "function-bind": "^1.1.2", 1163 | "get-intrinsic": "^1.2.4", 1164 | "set-function-length": "^1.2.1" 1165 | }, 1166 | "engines": { 1167 | "node": ">= 0.4" 1168 | }, 1169 | "funding": { 1170 | "url": "https://github.com/sponsors/ljharb" 1171 | } 1172 | }, 1173 | "node_modules/call-me-maybe": { 1174 | "version": "1.0.2", 1175 | "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", 1176 | "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" 1177 | }, 1178 | "node_modules/camelcase": { 1179 | "version": "7.0.1", 1180 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", 1181 | "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", 1182 | "dev": true, 1183 | "engines": { 1184 | "node": ">=14.16" 1185 | }, 1186 | "funding": { 1187 | "url": "https://github.com/sponsors/sindresorhus" 1188 | } 1189 | }, 1190 | "node_modules/chalk": { 1191 | "version": "5.3.0", 1192 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", 1193 | "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", 1194 | "dev": true, 1195 | "engines": { 1196 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 1197 | }, 1198 | "funding": { 1199 | "url": "https://github.com/chalk/chalk?sponsor=1" 1200 | } 1201 | }, 1202 | "node_modules/chokidar": { 1203 | "version": "3.6.0", 1204 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 1205 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "anymatch": "~3.1.2", 1209 | "braces": "~3.0.2", 1210 | "glob-parent": "~5.1.2", 1211 | "is-binary-path": "~2.1.0", 1212 | "is-glob": "~4.0.1", 1213 | "normalize-path": "~3.0.0", 1214 | "readdirp": "~3.6.0" 1215 | }, 1216 | "engines": { 1217 | "node": ">= 8.10.0" 1218 | }, 1219 | "funding": { 1220 | "url": "https://paulmillr.com/funding/" 1221 | }, 1222 | "optionalDependencies": { 1223 | "fsevents": "~2.3.2" 1224 | } 1225 | }, 1226 | "node_modules/chownr": { 1227 | "version": "2.0.0", 1228 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 1229 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 1230 | "engines": { 1231 | "node": ">=10" 1232 | } 1233 | }, 1234 | "node_modules/cli-color": { 1235 | "version": "2.0.4", 1236 | "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", 1237 | "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", 1238 | "dev": true, 1239 | "dependencies": { 1240 | "d": "^1.0.1", 1241 | "es5-ext": "^0.10.64", 1242 | "es6-iterator": "^2.0.3", 1243 | "memoizee": "^0.4.15", 1244 | "timers-ext": "^0.1.7" 1245 | }, 1246 | "engines": { 1247 | "node": ">=0.10" 1248 | } 1249 | }, 1250 | "node_modules/color": { 1251 | "version": "3.2.1", 1252 | "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", 1253 | "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", 1254 | "dependencies": { 1255 | "color-convert": "^1.9.3", 1256 | "color-string": "^1.6.0" 1257 | } 1258 | }, 1259 | "node_modules/color-convert": { 1260 | "version": "1.9.3", 1261 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1262 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1263 | "dependencies": { 1264 | "color-name": "1.1.3" 1265 | } 1266 | }, 1267 | "node_modules/color-name": { 1268 | "version": "1.1.3", 1269 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1270 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 1271 | }, 1272 | "node_modules/color-string": { 1273 | "version": "1.9.1", 1274 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 1275 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1276 | "dependencies": { 1277 | "color-name": "^1.0.0", 1278 | "simple-swizzle": "^0.2.2" 1279 | } 1280 | }, 1281 | "node_modules/color-support": { 1282 | "version": "1.1.3", 1283 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 1284 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 1285 | "bin": { 1286 | "color-support": "bin.js" 1287 | } 1288 | }, 1289 | "node_modules/colorspace": { 1290 | "version": "1.1.4", 1291 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", 1292 | "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", 1293 | "dependencies": { 1294 | "color": "^3.1.3", 1295 | "text-hex": "1.0.x" 1296 | } 1297 | }, 1298 | "node_modules/commander": { 1299 | "version": "9.5.0", 1300 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 1301 | "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", 1302 | "devOptional": true, 1303 | "engines": { 1304 | "node": "^12.20.0 || >=14" 1305 | } 1306 | }, 1307 | "node_modules/compressible": { 1308 | "version": "2.0.18", 1309 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 1310 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", 1311 | "dependencies": { 1312 | "mime-db": ">= 1.43.0 < 2" 1313 | }, 1314 | "engines": { 1315 | "node": ">= 0.6" 1316 | } 1317 | }, 1318 | "node_modules/compression": { 1319 | "version": "1.7.4", 1320 | "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", 1321 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", 1322 | "dependencies": { 1323 | "accepts": "~1.3.5", 1324 | "bytes": "3.0.0", 1325 | "compressible": "~2.0.16", 1326 | "debug": "2.6.9", 1327 | "on-headers": "~1.0.2", 1328 | "safe-buffer": "5.1.2", 1329 | "vary": "~1.1.2" 1330 | }, 1331 | "engines": { 1332 | "node": ">= 0.8.0" 1333 | } 1334 | }, 1335 | "node_modules/compression/node_modules/bytes": { 1336 | "version": "3.0.0", 1337 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 1338 | "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", 1339 | "engines": { 1340 | "node": ">= 0.8" 1341 | } 1342 | }, 1343 | "node_modules/compression/node_modules/safe-buffer": { 1344 | "version": "5.1.2", 1345 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1346 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1347 | }, 1348 | "node_modules/concat-map": { 1349 | "version": "0.0.1", 1350 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1351 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 1352 | }, 1353 | "node_modules/console-control-strings": { 1354 | "version": "1.1.0", 1355 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 1356 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" 1357 | }, 1358 | "node_modules/content-disposition": { 1359 | "version": "0.5.4", 1360 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1361 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1362 | "dependencies": { 1363 | "safe-buffer": "5.2.1" 1364 | }, 1365 | "engines": { 1366 | "node": ">= 0.6" 1367 | } 1368 | }, 1369 | "node_modules/content-type": { 1370 | "version": "1.0.5", 1371 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 1372 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 1373 | "engines": { 1374 | "node": ">= 0.6" 1375 | } 1376 | }, 1377 | "node_modules/cookie": { 1378 | "version": "0.6.0", 1379 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 1380 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 1381 | "engines": { 1382 | "node": ">= 0.6" 1383 | } 1384 | }, 1385 | "node_modules/cookie-signature": { 1386 | "version": "1.0.6", 1387 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1388 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 1389 | }, 1390 | "node_modules/copy-anything": { 1391 | "version": "3.0.5", 1392 | "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", 1393 | "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", 1394 | "dev": true, 1395 | "dependencies": { 1396 | "is-what": "^4.1.8" 1397 | }, 1398 | "engines": { 1399 | "node": ">=12.13" 1400 | }, 1401 | "funding": { 1402 | "url": "https://github.com/sponsors/mesqueeb" 1403 | } 1404 | }, 1405 | "node_modules/cors": { 1406 | "version": "2.8.5", 1407 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1408 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1409 | "dependencies": { 1410 | "object-assign": "^4", 1411 | "vary": "^1" 1412 | }, 1413 | "engines": { 1414 | "node": ">= 0.10" 1415 | } 1416 | }, 1417 | "node_modules/d": { 1418 | "version": "1.0.2", 1419 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 1420 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 1421 | "dev": true, 1422 | "dependencies": { 1423 | "es5-ext": "^0.10.64", 1424 | "type": "^2.7.2" 1425 | }, 1426 | "engines": { 1427 | "node": ">=0.12" 1428 | } 1429 | }, 1430 | "node_modules/dayjs": { 1431 | "version": "1.11.11", 1432 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", 1433 | "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" 1434 | }, 1435 | "node_modules/debug": { 1436 | "version": "2.6.9", 1437 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1438 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1439 | "dependencies": { 1440 | "ms": "2.0.0" 1441 | } 1442 | }, 1443 | "node_modules/define-data-property": { 1444 | "version": "1.1.4", 1445 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 1446 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 1447 | "dependencies": { 1448 | "es-define-property": "^1.0.0", 1449 | "es-errors": "^1.3.0", 1450 | "gopd": "^1.0.1" 1451 | }, 1452 | "engines": { 1453 | "node": ">= 0.4" 1454 | }, 1455 | "funding": { 1456 | "url": "https://github.com/sponsors/ljharb" 1457 | } 1458 | }, 1459 | "node_modules/delegates": { 1460 | "version": "1.0.0", 1461 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 1462 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 1463 | }, 1464 | "node_modules/depd": { 1465 | "version": "2.0.0", 1466 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1467 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 1468 | "engines": { 1469 | "node": ">= 0.8" 1470 | } 1471 | }, 1472 | "node_modules/destroy": { 1473 | "version": "1.2.0", 1474 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1475 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 1476 | "engines": { 1477 | "node": ">= 0.8", 1478 | "npm": "1.2.8000 || >= 1.4.16" 1479 | } 1480 | }, 1481 | "node_modules/detect-libc": { 1482 | "version": "2.0.3", 1483 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 1484 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 1485 | "engines": { 1486 | "node": ">=8" 1487 | } 1488 | }, 1489 | "node_modules/difflib": { 1490 | "version": "0.2.4", 1491 | "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", 1492 | "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", 1493 | "dev": true, 1494 | "dependencies": { 1495 | "heap": ">= 0.2.0" 1496 | }, 1497 | "engines": { 1498 | "node": "*" 1499 | } 1500 | }, 1501 | "node_modules/doctrine": { 1502 | "version": "3.0.0", 1503 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1504 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1505 | "dependencies": { 1506 | "esutils": "^2.0.2" 1507 | }, 1508 | "engines": { 1509 | "node": ">=6.0.0" 1510 | } 1511 | }, 1512 | "node_modules/dotenv": { 1513 | "version": "16.4.5", 1514 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 1515 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 1516 | "engines": { 1517 | "node": ">=12" 1518 | }, 1519 | "funding": { 1520 | "url": "https://dotenvx.com" 1521 | } 1522 | }, 1523 | "node_modules/dreamopt": { 1524 | "version": "0.8.0", 1525 | "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", 1526 | "integrity": "sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==", 1527 | "dev": true, 1528 | "dependencies": { 1529 | "wordwrap": ">=0.0.2" 1530 | }, 1531 | "engines": { 1532 | "node": ">=0.4.0" 1533 | } 1534 | }, 1535 | "node_modules/drizzle-kit": { 1536 | "version": "0.20.17", 1537 | "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.20.17.tgz", 1538 | "integrity": "sha512-mLVDS4nXmO09wFVlzGrdshWnAL+U9eQGC5zRs6hTN6Q9arwQGWU2XnZ17I8BM8Quau8CQRx3Ms6VPgRWJFVp7Q==", 1539 | "dev": true, 1540 | "dependencies": { 1541 | "@esbuild-kit/esm-loader": "^2.5.5", 1542 | "@hono/node-server": "^1.9.0", 1543 | "@hono/zod-validator": "^0.2.0", 1544 | "camelcase": "^7.0.1", 1545 | "chalk": "^5.2.0", 1546 | "commander": "^9.4.1", 1547 | "env-paths": "^3.0.0", 1548 | "esbuild": "^0.19.7", 1549 | "esbuild-register": "^3.5.0", 1550 | "glob": "^8.1.0", 1551 | "hanji": "^0.0.5", 1552 | "hono": "^4.1.4", 1553 | "json-diff": "0.9.0", 1554 | "minimatch": "^7.4.3", 1555 | "semver": "^7.5.4", 1556 | "superjson": "^2.2.1", 1557 | "zod": "^3.20.2" 1558 | }, 1559 | "bin": { 1560 | "drizzle-kit": "bin.cjs" 1561 | } 1562 | }, 1563 | "node_modules/drizzle-kit/node_modules/brace-expansion": { 1564 | "version": "2.0.1", 1565 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1566 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1567 | "dev": true, 1568 | "dependencies": { 1569 | "balanced-match": "^1.0.0" 1570 | } 1571 | }, 1572 | "node_modules/drizzle-kit/node_modules/minimatch": { 1573 | "version": "7.4.6", 1574 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", 1575 | "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", 1576 | "dev": true, 1577 | "dependencies": { 1578 | "brace-expansion": "^2.0.1" 1579 | }, 1580 | "engines": { 1581 | "node": ">=10" 1582 | }, 1583 | "funding": { 1584 | "url": "https://github.com/sponsors/isaacs" 1585 | } 1586 | }, 1587 | "node_modules/drizzle-orm": { 1588 | "version": "0.30.10", 1589 | "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.10.tgz", 1590 | "integrity": "sha512-IRy/QmMWw9lAQHpwbUh1b8fcn27S/a9zMIzqea1WNOxK9/4EB8gIo+FZWLiPXzl2n9ixGSv8BhsLZiOppWEwBw==", 1591 | "peerDependencies": { 1592 | "@aws-sdk/client-rds-data": ">=3", 1593 | "@cloudflare/workers-types": ">=3", 1594 | "@electric-sql/pglite": ">=0.1.1", 1595 | "@libsql/client": "*", 1596 | "@neondatabase/serverless": ">=0.1", 1597 | "@op-engineering/op-sqlite": ">=2", 1598 | "@opentelemetry/api": "^1.4.1", 1599 | "@planetscale/database": ">=1", 1600 | "@types/better-sqlite3": "*", 1601 | "@types/pg": "*", 1602 | "@types/react": ">=18", 1603 | "@types/sql.js": "*", 1604 | "@vercel/postgres": ">=0.8.0", 1605 | "@xata.io/client": "*", 1606 | "better-sqlite3": ">=7", 1607 | "bun-types": "*", 1608 | "expo-sqlite": ">=13.2.0", 1609 | "knex": "*", 1610 | "kysely": "*", 1611 | "mysql2": ">=2", 1612 | "pg": ">=8", 1613 | "postgres": ">=3", 1614 | "react": ">=18", 1615 | "sql.js": ">=1", 1616 | "sqlite3": ">=5" 1617 | }, 1618 | "peerDependenciesMeta": { 1619 | "@aws-sdk/client-rds-data": { 1620 | "optional": true 1621 | }, 1622 | "@cloudflare/workers-types": { 1623 | "optional": true 1624 | }, 1625 | "@electric-sql/pglite": { 1626 | "optional": true 1627 | }, 1628 | "@libsql/client": { 1629 | "optional": true 1630 | }, 1631 | "@neondatabase/serverless": { 1632 | "optional": true 1633 | }, 1634 | "@op-engineering/op-sqlite": { 1635 | "optional": true 1636 | }, 1637 | "@opentelemetry/api": { 1638 | "optional": true 1639 | }, 1640 | "@planetscale/database": { 1641 | "optional": true 1642 | }, 1643 | "@types/better-sqlite3": { 1644 | "optional": true 1645 | }, 1646 | "@types/pg": { 1647 | "optional": true 1648 | }, 1649 | "@types/react": { 1650 | "optional": true 1651 | }, 1652 | "@types/sql.js": { 1653 | "optional": true 1654 | }, 1655 | "@vercel/postgres": { 1656 | "optional": true 1657 | }, 1658 | "@xata.io/client": { 1659 | "optional": true 1660 | }, 1661 | "better-sqlite3": { 1662 | "optional": true 1663 | }, 1664 | "bun-types": { 1665 | "optional": true 1666 | }, 1667 | "expo-sqlite": { 1668 | "optional": true 1669 | }, 1670 | "knex": { 1671 | "optional": true 1672 | }, 1673 | "kysely": { 1674 | "optional": true 1675 | }, 1676 | "mysql2": { 1677 | "optional": true 1678 | }, 1679 | "pg": { 1680 | "optional": true 1681 | }, 1682 | "postgres": { 1683 | "optional": true 1684 | }, 1685 | "react": { 1686 | "optional": true 1687 | }, 1688 | "sql.js": { 1689 | "optional": true 1690 | }, 1691 | "sqlite3": { 1692 | "optional": true 1693 | } 1694 | } 1695 | }, 1696 | "node_modules/drizzle-zod": { 1697 | "version": "0.5.1", 1698 | "resolved": "https://registry.npmjs.org/drizzle-zod/-/drizzle-zod-0.5.1.tgz", 1699 | "integrity": "sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==", 1700 | "peerDependencies": { 1701 | "drizzle-orm": ">=0.23.13", 1702 | "zod": "*" 1703 | } 1704 | }, 1705 | "node_modules/ecdsa-sig-formatter": { 1706 | "version": "1.0.11", 1707 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1708 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1709 | "dependencies": { 1710 | "safe-buffer": "^5.0.1" 1711 | } 1712 | }, 1713 | "node_modules/ee-first": { 1714 | "version": "1.1.1", 1715 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1716 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1717 | }, 1718 | "node_modules/emoji-regex": { 1719 | "version": "8.0.0", 1720 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1721 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1722 | }, 1723 | "node_modules/enabled": { 1724 | "version": "2.0.0", 1725 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", 1726 | "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" 1727 | }, 1728 | "node_modules/encodeurl": { 1729 | "version": "1.0.2", 1730 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1731 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1732 | "engines": { 1733 | "node": ">= 0.8" 1734 | } 1735 | }, 1736 | "node_modules/env-paths": { 1737 | "version": "3.0.0", 1738 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", 1739 | "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", 1740 | "dev": true, 1741 | "engines": { 1742 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1743 | }, 1744 | "funding": { 1745 | "url": "https://github.com/sponsors/sindresorhus" 1746 | } 1747 | }, 1748 | "node_modules/es-define-property": { 1749 | "version": "1.0.0", 1750 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 1751 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 1752 | "dependencies": { 1753 | "get-intrinsic": "^1.2.4" 1754 | }, 1755 | "engines": { 1756 | "node": ">= 0.4" 1757 | } 1758 | }, 1759 | "node_modules/es-errors": { 1760 | "version": "1.3.0", 1761 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 1762 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 1763 | "engines": { 1764 | "node": ">= 0.4" 1765 | } 1766 | }, 1767 | "node_modules/es5-ext": { 1768 | "version": "0.10.64", 1769 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", 1770 | "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", 1771 | "dev": true, 1772 | "hasInstallScript": true, 1773 | "dependencies": { 1774 | "es6-iterator": "^2.0.3", 1775 | "es6-symbol": "^3.1.3", 1776 | "esniff": "^2.0.1", 1777 | "next-tick": "^1.1.0" 1778 | }, 1779 | "engines": { 1780 | "node": ">=0.10" 1781 | } 1782 | }, 1783 | "node_modules/es6-iterator": { 1784 | "version": "2.0.3", 1785 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 1786 | "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", 1787 | "dev": true, 1788 | "dependencies": { 1789 | "d": "1", 1790 | "es5-ext": "^0.10.35", 1791 | "es6-symbol": "^3.1.1" 1792 | } 1793 | }, 1794 | "node_modules/es6-symbol": { 1795 | "version": "3.1.4", 1796 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", 1797 | "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", 1798 | "dev": true, 1799 | "dependencies": { 1800 | "d": "^1.0.2", 1801 | "ext": "^1.7.0" 1802 | }, 1803 | "engines": { 1804 | "node": ">=0.12" 1805 | } 1806 | }, 1807 | "node_modules/es6-weak-map": { 1808 | "version": "2.0.3", 1809 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", 1810 | "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", 1811 | "dev": true, 1812 | "dependencies": { 1813 | "d": "1", 1814 | "es5-ext": "^0.10.46", 1815 | "es6-iterator": "^2.0.3", 1816 | "es6-symbol": "^3.1.1" 1817 | } 1818 | }, 1819 | "node_modules/esbuild": { 1820 | "version": "0.19.12", 1821 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", 1822 | "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", 1823 | "dev": true, 1824 | "hasInstallScript": true, 1825 | "bin": { 1826 | "esbuild": "bin/esbuild" 1827 | }, 1828 | "engines": { 1829 | "node": ">=12" 1830 | }, 1831 | "optionalDependencies": { 1832 | "@esbuild/aix-ppc64": "0.19.12", 1833 | "@esbuild/android-arm": "0.19.12", 1834 | "@esbuild/android-arm64": "0.19.12", 1835 | "@esbuild/android-x64": "0.19.12", 1836 | "@esbuild/darwin-arm64": "0.19.12", 1837 | "@esbuild/darwin-x64": "0.19.12", 1838 | "@esbuild/freebsd-arm64": "0.19.12", 1839 | "@esbuild/freebsd-x64": "0.19.12", 1840 | "@esbuild/linux-arm": "0.19.12", 1841 | "@esbuild/linux-arm64": "0.19.12", 1842 | "@esbuild/linux-ia32": "0.19.12", 1843 | "@esbuild/linux-loong64": "0.19.12", 1844 | "@esbuild/linux-mips64el": "0.19.12", 1845 | "@esbuild/linux-ppc64": "0.19.12", 1846 | "@esbuild/linux-riscv64": "0.19.12", 1847 | "@esbuild/linux-s390x": "0.19.12", 1848 | "@esbuild/linux-x64": "0.19.12", 1849 | "@esbuild/netbsd-x64": "0.19.12", 1850 | "@esbuild/openbsd-x64": "0.19.12", 1851 | "@esbuild/sunos-x64": "0.19.12", 1852 | "@esbuild/win32-arm64": "0.19.12", 1853 | "@esbuild/win32-ia32": "0.19.12", 1854 | "@esbuild/win32-x64": "0.19.12" 1855 | } 1856 | }, 1857 | "node_modules/esbuild-register": { 1858 | "version": "3.5.0", 1859 | "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", 1860 | "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", 1861 | "dev": true, 1862 | "dependencies": { 1863 | "debug": "^4.3.4" 1864 | }, 1865 | "peerDependencies": { 1866 | "esbuild": ">=0.12 <1" 1867 | } 1868 | }, 1869 | "node_modules/esbuild-register/node_modules/debug": { 1870 | "version": "4.3.4", 1871 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1872 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1873 | "dev": true, 1874 | "dependencies": { 1875 | "ms": "2.1.2" 1876 | }, 1877 | "engines": { 1878 | "node": ">=6.0" 1879 | }, 1880 | "peerDependenciesMeta": { 1881 | "supports-color": { 1882 | "optional": true 1883 | } 1884 | } 1885 | }, 1886 | "node_modules/esbuild-register/node_modules/ms": { 1887 | "version": "2.1.2", 1888 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1889 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1890 | "dev": true 1891 | }, 1892 | "node_modules/escape-html": { 1893 | "version": "1.0.3", 1894 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1895 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1896 | }, 1897 | "node_modules/esniff": { 1898 | "version": "2.0.1", 1899 | "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", 1900 | "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", 1901 | "dev": true, 1902 | "dependencies": { 1903 | "d": "^1.0.1", 1904 | "es5-ext": "^0.10.62", 1905 | "event-emitter": "^0.3.5", 1906 | "type": "^2.7.2" 1907 | }, 1908 | "engines": { 1909 | "node": ">=0.10" 1910 | } 1911 | }, 1912 | "node_modules/esutils": { 1913 | "version": "2.0.3", 1914 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1915 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1916 | "engines": { 1917 | "node": ">=0.10.0" 1918 | } 1919 | }, 1920 | "node_modules/etag": { 1921 | "version": "1.8.1", 1922 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1923 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 1924 | "engines": { 1925 | "node": ">= 0.6" 1926 | } 1927 | }, 1928 | "node_modules/event-emitter": { 1929 | "version": "0.3.5", 1930 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 1931 | "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", 1932 | "dev": true, 1933 | "dependencies": { 1934 | "d": "1", 1935 | "es5-ext": "~0.10.14" 1936 | } 1937 | }, 1938 | "node_modules/express": { 1939 | "version": "4.19.2", 1940 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 1941 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 1942 | "dependencies": { 1943 | "accepts": "~1.3.8", 1944 | "array-flatten": "1.1.1", 1945 | "body-parser": "1.20.2", 1946 | "content-disposition": "0.5.4", 1947 | "content-type": "~1.0.4", 1948 | "cookie": "0.6.0", 1949 | "cookie-signature": "1.0.6", 1950 | "debug": "2.6.9", 1951 | "depd": "2.0.0", 1952 | "encodeurl": "~1.0.2", 1953 | "escape-html": "~1.0.3", 1954 | "etag": "~1.8.1", 1955 | "finalhandler": "1.2.0", 1956 | "fresh": "0.5.2", 1957 | "http-errors": "2.0.0", 1958 | "merge-descriptors": "1.0.1", 1959 | "methods": "~1.1.2", 1960 | "on-finished": "2.4.1", 1961 | "parseurl": "~1.3.3", 1962 | "path-to-regexp": "0.1.7", 1963 | "proxy-addr": "~2.0.7", 1964 | "qs": "6.11.0", 1965 | "range-parser": "~1.2.1", 1966 | "safe-buffer": "5.2.1", 1967 | "send": "0.18.0", 1968 | "serve-static": "1.15.0", 1969 | "setprototypeof": "1.2.0", 1970 | "statuses": "2.0.1", 1971 | "type-is": "~1.6.18", 1972 | "utils-merge": "1.0.1", 1973 | "vary": "~1.1.2" 1974 | }, 1975 | "engines": { 1976 | "node": ">= 0.10.0" 1977 | } 1978 | }, 1979 | "node_modules/ext": { 1980 | "version": "1.7.0", 1981 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", 1982 | "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", 1983 | "dev": true, 1984 | "dependencies": { 1985 | "type": "^2.7.2" 1986 | } 1987 | }, 1988 | "node_modules/fecha": { 1989 | "version": "4.2.3", 1990 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", 1991 | "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" 1992 | }, 1993 | "node_modules/file-stream-rotator": { 1994 | "version": "0.6.1", 1995 | "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", 1996 | "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", 1997 | "dependencies": { 1998 | "moment": "^2.29.1" 1999 | } 2000 | }, 2001 | "node_modules/fill-range": { 2002 | "version": "7.0.1", 2003 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2004 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2005 | "dev": true, 2006 | "dependencies": { 2007 | "to-regex-range": "^5.0.1" 2008 | }, 2009 | "engines": { 2010 | "node": ">=8" 2011 | } 2012 | }, 2013 | "node_modules/finalhandler": { 2014 | "version": "1.2.0", 2015 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 2016 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 2017 | "dependencies": { 2018 | "debug": "2.6.9", 2019 | "encodeurl": "~1.0.2", 2020 | "escape-html": "~1.0.3", 2021 | "on-finished": "2.4.1", 2022 | "parseurl": "~1.3.3", 2023 | "statuses": "2.0.1", 2024 | "unpipe": "~1.0.0" 2025 | }, 2026 | "engines": { 2027 | "node": ">= 0.8" 2028 | } 2029 | }, 2030 | "node_modules/fn.name": { 2031 | "version": "1.1.0", 2032 | "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", 2033 | "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" 2034 | }, 2035 | "node_modules/forwarded": { 2036 | "version": "0.2.0", 2037 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 2038 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 2039 | "engines": { 2040 | "node": ">= 0.6" 2041 | } 2042 | }, 2043 | "node_modules/fresh": { 2044 | "version": "0.5.2", 2045 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 2046 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 2047 | "engines": { 2048 | "node": ">= 0.6" 2049 | } 2050 | }, 2051 | "node_modules/fs-minipass": { 2052 | "version": "2.1.0", 2053 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 2054 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 2055 | "dependencies": { 2056 | "minipass": "^3.0.0" 2057 | }, 2058 | "engines": { 2059 | "node": ">= 8" 2060 | } 2061 | }, 2062 | "node_modules/fs-minipass/node_modules/minipass": { 2063 | "version": "3.3.6", 2064 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 2065 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 2066 | "dependencies": { 2067 | "yallist": "^4.0.0" 2068 | }, 2069 | "engines": { 2070 | "node": ">=8" 2071 | } 2072 | }, 2073 | "node_modules/fs.realpath": { 2074 | "version": "1.0.0", 2075 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2076 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 2077 | }, 2078 | "node_modules/fsevents": { 2079 | "version": "2.3.3", 2080 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2081 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2082 | "dev": true, 2083 | "hasInstallScript": true, 2084 | "optional": true, 2085 | "os": [ 2086 | "darwin" 2087 | ], 2088 | "engines": { 2089 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2090 | } 2091 | }, 2092 | "node_modules/function-bind": { 2093 | "version": "1.1.2", 2094 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2095 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 2096 | "funding": { 2097 | "url": "https://github.com/sponsors/ljharb" 2098 | } 2099 | }, 2100 | "node_modules/gauge": { 2101 | "version": "3.0.2", 2102 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", 2103 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", 2104 | "dependencies": { 2105 | "aproba": "^1.0.3 || ^2.0.0", 2106 | "color-support": "^1.1.2", 2107 | "console-control-strings": "^1.0.0", 2108 | "has-unicode": "^2.0.1", 2109 | "object-assign": "^4.1.1", 2110 | "signal-exit": "^3.0.0", 2111 | "string-width": "^4.2.3", 2112 | "strip-ansi": "^6.0.1", 2113 | "wide-align": "^1.1.2" 2114 | }, 2115 | "engines": { 2116 | "node": ">=10" 2117 | } 2118 | }, 2119 | "node_modules/get-intrinsic": { 2120 | "version": "1.2.4", 2121 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 2122 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 2123 | "dependencies": { 2124 | "es-errors": "^1.3.0", 2125 | "function-bind": "^1.1.2", 2126 | "has-proto": "^1.0.1", 2127 | "has-symbols": "^1.0.3", 2128 | "hasown": "^2.0.0" 2129 | }, 2130 | "engines": { 2131 | "node": ">= 0.4" 2132 | }, 2133 | "funding": { 2134 | "url": "https://github.com/sponsors/ljharb" 2135 | } 2136 | }, 2137 | "node_modules/get-tsconfig": { 2138 | "version": "4.7.3", 2139 | "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", 2140 | "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", 2141 | "dev": true, 2142 | "dependencies": { 2143 | "resolve-pkg-maps": "^1.0.0" 2144 | }, 2145 | "funding": { 2146 | "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 2147 | } 2148 | }, 2149 | "node_modules/glob": { 2150 | "version": "8.1.0", 2151 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 2152 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 2153 | "dev": true, 2154 | "dependencies": { 2155 | "fs.realpath": "^1.0.0", 2156 | "inflight": "^1.0.4", 2157 | "inherits": "2", 2158 | "minimatch": "^5.0.1", 2159 | "once": "^1.3.0" 2160 | }, 2161 | "engines": { 2162 | "node": ">=12" 2163 | }, 2164 | "funding": { 2165 | "url": "https://github.com/sponsors/isaacs" 2166 | } 2167 | }, 2168 | "node_modules/glob-parent": { 2169 | "version": "5.1.2", 2170 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2171 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2172 | "dev": true, 2173 | "dependencies": { 2174 | "is-glob": "^4.0.1" 2175 | }, 2176 | "engines": { 2177 | "node": ">= 6" 2178 | } 2179 | }, 2180 | "node_modules/glob/node_modules/brace-expansion": { 2181 | "version": "2.0.1", 2182 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2183 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2184 | "dev": true, 2185 | "dependencies": { 2186 | "balanced-match": "^1.0.0" 2187 | } 2188 | }, 2189 | "node_modules/glob/node_modules/minimatch": { 2190 | "version": "5.1.6", 2191 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 2192 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 2193 | "dev": true, 2194 | "dependencies": { 2195 | "brace-expansion": "^2.0.1" 2196 | }, 2197 | "engines": { 2198 | "node": ">=10" 2199 | } 2200 | }, 2201 | "node_modules/gopd": { 2202 | "version": "1.0.1", 2203 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 2204 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 2205 | "dependencies": { 2206 | "get-intrinsic": "^1.1.3" 2207 | }, 2208 | "funding": { 2209 | "url": "https://github.com/sponsors/ljharb" 2210 | } 2211 | }, 2212 | "node_modules/hanji": { 2213 | "version": "0.0.5", 2214 | "resolved": "https://registry.npmjs.org/hanji/-/hanji-0.0.5.tgz", 2215 | "integrity": "sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==", 2216 | "dev": true, 2217 | "dependencies": { 2218 | "lodash.throttle": "^4.1.1", 2219 | "sisteransi": "^1.0.5" 2220 | } 2221 | }, 2222 | "node_modules/has-flag": { 2223 | "version": "3.0.0", 2224 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2225 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2226 | "dev": true, 2227 | "engines": { 2228 | "node": ">=4" 2229 | } 2230 | }, 2231 | "node_modules/has-property-descriptors": { 2232 | "version": "1.0.2", 2233 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 2234 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 2235 | "dependencies": { 2236 | "es-define-property": "^1.0.0" 2237 | }, 2238 | "funding": { 2239 | "url": "https://github.com/sponsors/ljharb" 2240 | } 2241 | }, 2242 | "node_modules/has-proto": { 2243 | "version": "1.0.3", 2244 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 2245 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 2246 | "engines": { 2247 | "node": ">= 0.4" 2248 | }, 2249 | "funding": { 2250 | "url": "https://github.com/sponsors/ljharb" 2251 | } 2252 | }, 2253 | "node_modules/has-symbols": { 2254 | "version": "1.0.3", 2255 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2256 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 2257 | "engines": { 2258 | "node": ">= 0.4" 2259 | }, 2260 | "funding": { 2261 | "url": "https://github.com/sponsors/ljharb" 2262 | } 2263 | }, 2264 | "node_modules/has-unicode": { 2265 | "version": "2.0.1", 2266 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 2267 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" 2268 | }, 2269 | "node_modules/hasown": { 2270 | "version": "2.0.2", 2271 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2272 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2273 | "dependencies": { 2274 | "function-bind": "^1.1.2" 2275 | }, 2276 | "engines": { 2277 | "node": ">= 0.4" 2278 | } 2279 | }, 2280 | "node_modules/heap": { 2281 | "version": "0.2.7", 2282 | "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", 2283 | "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", 2284 | "dev": true 2285 | }, 2286 | "node_modules/helmet": { 2287 | "version": "7.1.0", 2288 | "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", 2289 | "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", 2290 | "engines": { 2291 | "node": ">=16.0.0" 2292 | } 2293 | }, 2294 | "node_modules/hono": { 2295 | "version": "4.2.9", 2296 | "resolved": "https://registry.npmjs.org/hono/-/hono-4.2.9.tgz", 2297 | "integrity": "sha512-59FAv52UxDWUt/NlC0NzrRCjeVCThUnVlqlrKYm+k80XujBu6uJwBIa5gACKKZWobjA0MJ6Vds0I3URKf383Cw==", 2298 | "dev": true, 2299 | "engines": { 2300 | "node": ">=16.0.0" 2301 | } 2302 | }, 2303 | "node_modules/http-errors": { 2304 | "version": "2.0.0", 2305 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 2306 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 2307 | "dependencies": { 2308 | "depd": "2.0.0", 2309 | "inherits": "2.0.4", 2310 | "setprototypeof": "1.2.0", 2311 | "statuses": "2.0.1", 2312 | "toidentifier": "1.0.1" 2313 | }, 2314 | "engines": { 2315 | "node": ">= 0.8" 2316 | } 2317 | }, 2318 | "node_modules/http-status": { 2319 | "version": "1.7.4", 2320 | "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.7.4.tgz", 2321 | "integrity": "sha512-c2qSwNtTlHVYAhMj9JpGdyo0No/+DiKXCJ9pHtZ2Yf3QmPnBIytKSRT7BuyIiQ7icXLynavGmxUqkOjSrAuMuA==", 2322 | "engines": { 2323 | "node": ">= 0.4.0" 2324 | } 2325 | }, 2326 | "node_modules/https-proxy-agent": { 2327 | "version": "5.0.1", 2328 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 2329 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 2330 | "dependencies": { 2331 | "agent-base": "6", 2332 | "debug": "4" 2333 | }, 2334 | "engines": { 2335 | "node": ">= 6" 2336 | } 2337 | }, 2338 | "node_modules/https-proxy-agent/node_modules/debug": { 2339 | "version": "4.3.4", 2340 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2341 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2342 | "dependencies": { 2343 | "ms": "2.1.2" 2344 | }, 2345 | "engines": { 2346 | "node": ">=6.0" 2347 | }, 2348 | "peerDependenciesMeta": { 2349 | "supports-color": { 2350 | "optional": true 2351 | } 2352 | } 2353 | }, 2354 | "node_modules/https-proxy-agent/node_modules/ms": { 2355 | "version": "2.1.2", 2356 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2357 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2358 | }, 2359 | "node_modules/iconv-lite": { 2360 | "version": "0.4.24", 2361 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2362 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2363 | "dependencies": { 2364 | "safer-buffer": ">= 2.1.2 < 3" 2365 | }, 2366 | "engines": { 2367 | "node": ">=0.10.0" 2368 | } 2369 | }, 2370 | "node_modules/ignore-by-default": { 2371 | "version": "1.0.1", 2372 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 2373 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 2374 | "dev": true 2375 | }, 2376 | "node_modules/inflight": { 2377 | "version": "1.0.6", 2378 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2379 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2380 | "dependencies": { 2381 | "once": "^1.3.0", 2382 | "wrappy": "1" 2383 | } 2384 | }, 2385 | "node_modules/inherits": { 2386 | "version": "2.0.4", 2387 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2388 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2389 | }, 2390 | "node_modules/ipaddr.js": { 2391 | "version": "1.9.1", 2392 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 2393 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 2394 | "engines": { 2395 | "node": ">= 0.10" 2396 | } 2397 | }, 2398 | "node_modules/is-arrayish": { 2399 | "version": "0.3.2", 2400 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 2401 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 2402 | }, 2403 | "node_modules/is-binary-path": { 2404 | "version": "2.1.0", 2405 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2406 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2407 | "dev": true, 2408 | "dependencies": { 2409 | "binary-extensions": "^2.0.0" 2410 | }, 2411 | "engines": { 2412 | "node": ">=8" 2413 | } 2414 | }, 2415 | "node_modules/is-extglob": { 2416 | "version": "2.1.1", 2417 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2418 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2419 | "dev": true, 2420 | "engines": { 2421 | "node": ">=0.10.0" 2422 | } 2423 | }, 2424 | "node_modules/is-fullwidth-code-point": { 2425 | "version": "3.0.0", 2426 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2427 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2428 | "engines": { 2429 | "node": ">=8" 2430 | } 2431 | }, 2432 | "node_modules/is-glob": { 2433 | "version": "4.0.3", 2434 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2435 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2436 | "dev": true, 2437 | "dependencies": { 2438 | "is-extglob": "^2.1.1" 2439 | }, 2440 | "engines": { 2441 | "node": ">=0.10.0" 2442 | } 2443 | }, 2444 | "node_modules/is-number": { 2445 | "version": "7.0.0", 2446 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2447 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2448 | "dev": true, 2449 | "engines": { 2450 | "node": ">=0.12.0" 2451 | } 2452 | }, 2453 | "node_modules/is-promise": { 2454 | "version": "2.2.2", 2455 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 2456 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", 2457 | "dev": true 2458 | }, 2459 | "node_modules/is-stream": { 2460 | "version": "2.0.1", 2461 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 2462 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 2463 | "engines": { 2464 | "node": ">=8" 2465 | }, 2466 | "funding": { 2467 | "url": "https://github.com/sponsors/sindresorhus" 2468 | } 2469 | }, 2470 | "node_modules/is-what": { 2471 | "version": "4.1.16", 2472 | "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", 2473 | "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", 2474 | "dev": true, 2475 | "engines": { 2476 | "node": ">=12.13" 2477 | }, 2478 | "funding": { 2479 | "url": "https://github.com/sponsors/mesqueeb" 2480 | } 2481 | }, 2482 | "node_modules/js-yaml": { 2483 | "version": "4.1.0", 2484 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2485 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2486 | "dependencies": { 2487 | "argparse": "^2.0.1" 2488 | }, 2489 | "bin": { 2490 | "js-yaml": "bin/js-yaml.js" 2491 | } 2492 | }, 2493 | "node_modules/json-diff": { 2494 | "version": "0.9.0", 2495 | "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.9.0.tgz", 2496 | "integrity": "sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==", 2497 | "dev": true, 2498 | "dependencies": { 2499 | "cli-color": "^2.0.0", 2500 | "difflib": "~0.2.1", 2501 | "dreamopt": "~0.8.0" 2502 | }, 2503 | "bin": { 2504 | "json-diff": "bin/json-diff.js" 2505 | }, 2506 | "engines": { 2507 | "node": "*" 2508 | } 2509 | }, 2510 | "node_modules/jsonwebtoken": { 2511 | "version": "9.0.2", 2512 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 2513 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 2514 | "dependencies": { 2515 | "jws": "^3.2.2", 2516 | "lodash.includes": "^4.3.0", 2517 | "lodash.isboolean": "^3.0.3", 2518 | "lodash.isinteger": "^4.0.4", 2519 | "lodash.isnumber": "^3.0.3", 2520 | "lodash.isplainobject": "^4.0.6", 2521 | "lodash.isstring": "^4.0.1", 2522 | "lodash.once": "^4.0.0", 2523 | "ms": "^2.1.1", 2524 | "semver": "^7.5.4" 2525 | }, 2526 | "engines": { 2527 | "node": ">=12", 2528 | "npm": ">=6" 2529 | } 2530 | }, 2531 | "node_modules/jsonwebtoken/node_modules/ms": { 2532 | "version": "2.1.3", 2533 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2534 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2535 | }, 2536 | "node_modules/jwa": { 2537 | "version": "1.4.1", 2538 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 2539 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 2540 | "dependencies": { 2541 | "buffer-equal-constant-time": "1.0.1", 2542 | "ecdsa-sig-formatter": "1.0.11", 2543 | "safe-buffer": "^5.0.1" 2544 | } 2545 | }, 2546 | "node_modules/jws": { 2547 | "version": "3.2.2", 2548 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 2549 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 2550 | "dependencies": { 2551 | "jwa": "^1.4.1", 2552 | "safe-buffer": "^5.0.1" 2553 | } 2554 | }, 2555 | "node_modules/kuler": { 2556 | "version": "2.0.0", 2557 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", 2558 | "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" 2559 | }, 2560 | "node_modules/lodash.get": { 2561 | "version": "4.4.2", 2562 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 2563 | "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" 2564 | }, 2565 | "node_modules/lodash.includes": { 2566 | "version": "4.3.0", 2567 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2568 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 2569 | }, 2570 | "node_modules/lodash.isboolean": { 2571 | "version": "3.0.3", 2572 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2573 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 2574 | }, 2575 | "node_modules/lodash.isequal": { 2576 | "version": "4.5.0", 2577 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 2578 | "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" 2579 | }, 2580 | "node_modules/lodash.isinteger": { 2581 | "version": "4.0.4", 2582 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2583 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 2584 | }, 2585 | "node_modules/lodash.isnumber": { 2586 | "version": "3.0.3", 2587 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2588 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 2589 | }, 2590 | "node_modules/lodash.isplainobject": { 2591 | "version": "4.0.6", 2592 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2593 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 2594 | }, 2595 | "node_modules/lodash.isstring": { 2596 | "version": "4.0.1", 2597 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2598 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 2599 | }, 2600 | "node_modules/lodash.mergewith": { 2601 | "version": "4.6.2", 2602 | "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", 2603 | "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" 2604 | }, 2605 | "node_modules/lodash.once": { 2606 | "version": "4.1.1", 2607 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2608 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 2609 | }, 2610 | "node_modules/lodash.throttle": { 2611 | "version": "4.1.1", 2612 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 2613 | "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", 2614 | "dev": true 2615 | }, 2616 | "node_modules/logform": { 2617 | "version": "2.6.0", 2618 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", 2619 | "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", 2620 | "dependencies": { 2621 | "@colors/colors": "1.6.0", 2622 | "@types/triple-beam": "^1.3.2", 2623 | "fecha": "^4.2.0", 2624 | "ms": "^2.1.1", 2625 | "safe-stable-stringify": "^2.3.1", 2626 | "triple-beam": "^1.3.0" 2627 | }, 2628 | "engines": { 2629 | "node": ">= 12.0.0" 2630 | } 2631 | }, 2632 | "node_modules/logform/node_modules/ms": { 2633 | "version": "2.1.3", 2634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2635 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2636 | }, 2637 | "node_modules/lru-cache": { 2638 | "version": "6.0.0", 2639 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2640 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2641 | "dependencies": { 2642 | "yallist": "^4.0.0" 2643 | }, 2644 | "engines": { 2645 | "node": ">=10" 2646 | } 2647 | }, 2648 | "node_modules/lru-queue": { 2649 | "version": "0.1.0", 2650 | "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", 2651 | "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", 2652 | "dev": true, 2653 | "dependencies": { 2654 | "es5-ext": "~0.10.2" 2655 | } 2656 | }, 2657 | "node_modules/make-dir": { 2658 | "version": "3.1.0", 2659 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2660 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2661 | "dependencies": { 2662 | "semver": "^6.0.0" 2663 | }, 2664 | "engines": { 2665 | "node": ">=8" 2666 | }, 2667 | "funding": { 2668 | "url": "https://github.com/sponsors/sindresorhus" 2669 | } 2670 | }, 2671 | "node_modules/make-dir/node_modules/semver": { 2672 | "version": "6.3.1", 2673 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2674 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2675 | "bin": { 2676 | "semver": "bin/semver.js" 2677 | } 2678 | }, 2679 | "node_modules/media-typer": { 2680 | "version": "0.3.0", 2681 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2682 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 2683 | "engines": { 2684 | "node": ">= 0.6" 2685 | } 2686 | }, 2687 | "node_modules/memoizee": { 2688 | "version": "0.4.15", 2689 | "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", 2690 | "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", 2691 | "dev": true, 2692 | "dependencies": { 2693 | "d": "^1.0.1", 2694 | "es5-ext": "^0.10.53", 2695 | "es6-weak-map": "^2.0.3", 2696 | "event-emitter": "^0.3.5", 2697 | "is-promise": "^2.2.2", 2698 | "lru-queue": "^0.1.0", 2699 | "next-tick": "^1.1.0", 2700 | "timers-ext": "^0.1.7" 2701 | } 2702 | }, 2703 | "node_modules/merge-descriptors": { 2704 | "version": "1.0.1", 2705 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2706 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 2707 | }, 2708 | "node_modules/methods": { 2709 | "version": "1.1.2", 2710 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2711 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 2712 | "engines": { 2713 | "node": ">= 0.6" 2714 | } 2715 | }, 2716 | "node_modules/mime": { 2717 | "version": "1.6.0", 2718 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2719 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 2720 | "bin": { 2721 | "mime": "cli.js" 2722 | }, 2723 | "engines": { 2724 | "node": ">=4" 2725 | } 2726 | }, 2727 | "node_modules/mime-db": { 2728 | "version": "1.52.0", 2729 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2730 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2731 | "engines": { 2732 | "node": ">= 0.6" 2733 | } 2734 | }, 2735 | "node_modules/mime-types": { 2736 | "version": "2.1.35", 2737 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2738 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2739 | "dependencies": { 2740 | "mime-db": "1.52.0" 2741 | }, 2742 | "engines": { 2743 | "node": ">= 0.6" 2744 | } 2745 | }, 2746 | "node_modules/minimatch": { 2747 | "version": "3.1.2", 2748 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2749 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2750 | "dependencies": { 2751 | "brace-expansion": "^1.1.7" 2752 | }, 2753 | "engines": { 2754 | "node": "*" 2755 | } 2756 | }, 2757 | "node_modules/minipass": { 2758 | "version": "5.0.0", 2759 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 2760 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 2761 | "engines": { 2762 | "node": ">=8" 2763 | } 2764 | }, 2765 | "node_modules/minizlib": { 2766 | "version": "2.1.2", 2767 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 2768 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 2769 | "dependencies": { 2770 | "minipass": "^3.0.0", 2771 | "yallist": "^4.0.0" 2772 | }, 2773 | "engines": { 2774 | "node": ">= 8" 2775 | } 2776 | }, 2777 | "node_modules/minizlib/node_modules/minipass": { 2778 | "version": "3.3.6", 2779 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 2780 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 2781 | "dependencies": { 2782 | "yallist": "^4.0.0" 2783 | }, 2784 | "engines": { 2785 | "node": ">=8" 2786 | } 2787 | }, 2788 | "node_modules/mkdirp": { 2789 | "version": "1.0.4", 2790 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2791 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2792 | "bin": { 2793 | "mkdirp": "bin/cmd.js" 2794 | }, 2795 | "engines": { 2796 | "node": ">=10" 2797 | } 2798 | }, 2799 | "node_modules/moment": { 2800 | "version": "2.30.1", 2801 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", 2802 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 2803 | "engines": { 2804 | "node": "*" 2805 | } 2806 | }, 2807 | "node_modules/morgan": { 2808 | "version": "1.10.0", 2809 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", 2810 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", 2811 | "dependencies": { 2812 | "basic-auth": "~2.0.1", 2813 | "debug": "2.6.9", 2814 | "depd": "~2.0.0", 2815 | "on-finished": "~2.3.0", 2816 | "on-headers": "~1.0.2" 2817 | }, 2818 | "engines": { 2819 | "node": ">= 0.8.0" 2820 | } 2821 | }, 2822 | "node_modules/morgan/node_modules/on-finished": { 2823 | "version": "2.3.0", 2824 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2825 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 2826 | "dependencies": { 2827 | "ee-first": "1.1.1" 2828 | }, 2829 | "engines": { 2830 | "node": ">= 0.8" 2831 | } 2832 | }, 2833 | "node_modules/ms": { 2834 | "version": "2.0.0", 2835 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2836 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 2837 | }, 2838 | "node_modules/negotiator": { 2839 | "version": "0.6.3", 2840 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2841 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 2842 | "engines": { 2843 | "node": ">= 0.6" 2844 | } 2845 | }, 2846 | "node_modules/next-tick": { 2847 | "version": "1.1.0", 2848 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", 2849 | "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", 2850 | "dev": true 2851 | }, 2852 | "node_modules/node-addon-api": { 2853 | "version": "5.1.0", 2854 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", 2855 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" 2856 | }, 2857 | "node_modules/node-fetch": { 2858 | "version": "2.7.0", 2859 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 2860 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 2861 | "dependencies": { 2862 | "whatwg-url": "^5.0.0" 2863 | }, 2864 | "engines": { 2865 | "node": "4.x || >=6.0.0" 2866 | }, 2867 | "peerDependencies": { 2868 | "encoding": "^0.1.0" 2869 | }, 2870 | "peerDependenciesMeta": { 2871 | "encoding": { 2872 | "optional": true 2873 | } 2874 | } 2875 | }, 2876 | "node_modules/nodemon": { 2877 | "version": "3.1.0", 2878 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", 2879 | "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", 2880 | "dev": true, 2881 | "dependencies": { 2882 | "chokidar": "^3.5.2", 2883 | "debug": "^4", 2884 | "ignore-by-default": "^1.0.1", 2885 | "minimatch": "^3.1.2", 2886 | "pstree.remy": "^1.1.8", 2887 | "semver": "^7.5.3", 2888 | "simple-update-notifier": "^2.0.0", 2889 | "supports-color": "^5.5.0", 2890 | "touch": "^3.1.0", 2891 | "undefsafe": "^2.0.5" 2892 | }, 2893 | "bin": { 2894 | "nodemon": "bin/nodemon.js" 2895 | }, 2896 | "engines": { 2897 | "node": ">=10" 2898 | }, 2899 | "funding": { 2900 | "type": "opencollective", 2901 | "url": "https://opencollective.com/nodemon" 2902 | } 2903 | }, 2904 | "node_modules/nodemon/node_modules/debug": { 2905 | "version": "4.3.4", 2906 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2907 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2908 | "dev": true, 2909 | "dependencies": { 2910 | "ms": "2.1.2" 2911 | }, 2912 | "engines": { 2913 | "node": ">=6.0" 2914 | }, 2915 | "peerDependenciesMeta": { 2916 | "supports-color": { 2917 | "optional": true 2918 | } 2919 | } 2920 | }, 2921 | "node_modules/nodemon/node_modules/ms": { 2922 | "version": "2.1.2", 2923 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2924 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2925 | "dev": true 2926 | }, 2927 | "node_modules/nopt": { 2928 | "version": "1.0.10", 2929 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 2930 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 2931 | "dev": true, 2932 | "dependencies": { 2933 | "abbrev": "1" 2934 | }, 2935 | "bin": { 2936 | "nopt": "bin/nopt.js" 2937 | }, 2938 | "engines": { 2939 | "node": "*" 2940 | } 2941 | }, 2942 | "node_modules/normalize-path": { 2943 | "version": "3.0.0", 2944 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2945 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2946 | "dev": true, 2947 | "engines": { 2948 | "node": ">=0.10.0" 2949 | } 2950 | }, 2951 | "node_modules/npmlog": { 2952 | "version": "5.0.1", 2953 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", 2954 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", 2955 | "dependencies": { 2956 | "are-we-there-yet": "^2.0.0", 2957 | "console-control-strings": "^1.1.0", 2958 | "gauge": "^3.0.0", 2959 | "set-blocking": "^2.0.0" 2960 | } 2961 | }, 2962 | "node_modules/object-assign": { 2963 | "version": "4.1.1", 2964 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2965 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2966 | "engines": { 2967 | "node": ">=0.10.0" 2968 | } 2969 | }, 2970 | "node_modules/object-hash": { 2971 | "version": "3.0.0", 2972 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2973 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 2974 | "engines": { 2975 | "node": ">= 6" 2976 | } 2977 | }, 2978 | "node_modules/object-inspect": { 2979 | "version": "1.13.1", 2980 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 2981 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 2982 | "funding": { 2983 | "url": "https://github.com/sponsors/ljharb" 2984 | } 2985 | }, 2986 | "node_modules/on-finished": { 2987 | "version": "2.4.1", 2988 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2989 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2990 | "dependencies": { 2991 | "ee-first": "1.1.1" 2992 | }, 2993 | "engines": { 2994 | "node": ">= 0.8" 2995 | } 2996 | }, 2997 | "node_modules/on-headers": { 2998 | "version": "1.0.2", 2999 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 3000 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 3001 | "engines": { 3002 | "node": ">= 0.8" 3003 | } 3004 | }, 3005 | "node_modules/once": { 3006 | "version": "1.4.0", 3007 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3008 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 3009 | "dependencies": { 3010 | "wrappy": "1" 3011 | } 3012 | }, 3013 | "node_modules/one-time": { 3014 | "version": "1.0.0", 3015 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", 3016 | "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", 3017 | "dependencies": { 3018 | "fn.name": "1.x.x" 3019 | } 3020 | }, 3021 | "node_modules/openapi-types": { 3022 | "version": "12.1.3", 3023 | "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", 3024 | "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", 3025 | "peer": true 3026 | }, 3027 | "node_modules/parseurl": { 3028 | "version": "1.3.3", 3029 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 3030 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 3031 | "engines": { 3032 | "node": ">= 0.8" 3033 | } 3034 | }, 3035 | "node_modules/passport": { 3036 | "version": "0.7.0", 3037 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", 3038 | "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", 3039 | "dependencies": { 3040 | "passport-strategy": "1.x.x", 3041 | "pause": "0.0.1", 3042 | "utils-merge": "^1.0.1" 3043 | }, 3044 | "engines": { 3045 | "node": ">= 0.4.0" 3046 | }, 3047 | "funding": { 3048 | "type": "github", 3049 | "url": "https://github.com/sponsors/jaredhanson" 3050 | } 3051 | }, 3052 | "node_modules/passport-jwt": { 3053 | "version": "4.0.1", 3054 | "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", 3055 | "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", 3056 | "dependencies": { 3057 | "jsonwebtoken": "^9.0.0", 3058 | "passport-strategy": "^1.0.0" 3059 | } 3060 | }, 3061 | "node_modules/passport-strategy": { 3062 | "version": "1.0.0", 3063 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 3064 | "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", 3065 | "engines": { 3066 | "node": ">= 0.4.0" 3067 | } 3068 | }, 3069 | "node_modules/path-is-absolute": { 3070 | "version": "1.0.1", 3071 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3072 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 3073 | "engines": { 3074 | "node": ">=0.10.0" 3075 | } 3076 | }, 3077 | "node_modules/path-to-regexp": { 3078 | "version": "0.1.7", 3079 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 3080 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 3081 | }, 3082 | "node_modules/pause": { 3083 | "version": "0.0.1", 3084 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", 3085 | "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" 3086 | }, 3087 | "node_modules/picomatch": { 3088 | "version": "2.3.1", 3089 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3090 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3091 | "dev": true, 3092 | "engines": { 3093 | "node": ">=8.6" 3094 | }, 3095 | "funding": { 3096 | "url": "https://github.com/sponsors/jonschlinkert" 3097 | } 3098 | }, 3099 | "node_modules/postgres": { 3100 | "version": "3.4.4", 3101 | "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.4.tgz", 3102 | "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==", 3103 | "engines": { 3104 | "node": ">=12" 3105 | }, 3106 | "funding": { 3107 | "type": "individual", 3108 | "url": "https://github.com/sponsors/porsager" 3109 | } 3110 | }, 3111 | "node_modules/proxy-addr": { 3112 | "version": "2.0.7", 3113 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 3114 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 3115 | "dependencies": { 3116 | "forwarded": "0.2.0", 3117 | "ipaddr.js": "1.9.1" 3118 | }, 3119 | "engines": { 3120 | "node": ">= 0.10" 3121 | } 3122 | }, 3123 | "node_modules/pstree.remy": { 3124 | "version": "1.1.8", 3125 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 3126 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 3127 | "dev": true 3128 | }, 3129 | "node_modules/qs": { 3130 | "version": "6.11.0", 3131 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 3132 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 3133 | "dependencies": { 3134 | "side-channel": "^1.0.4" 3135 | }, 3136 | "engines": { 3137 | "node": ">=0.6" 3138 | }, 3139 | "funding": { 3140 | "url": "https://github.com/sponsors/ljharb" 3141 | } 3142 | }, 3143 | "node_modules/range-parser": { 3144 | "version": "1.2.1", 3145 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 3146 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 3147 | "engines": { 3148 | "node": ">= 0.6" 3149 | } 3150 | }, 3151 | "node_modules/raw-body": { 3152 | "version": "2.5.2", 3153 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 3154 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 3155 | "dependencies": { 3156 | "bytes": "3.1.2", 3157 | "http-errors": "2.0.0", 3158 | "iconv-lite": "0.4.24", 3159 | "unpipe": "1.0.0" 3160 | }, 3161 | "engines": { 3162 | "node": ">= 0.8" 3163 | } 3164 | }, 3165 | "node_modules/readable-stream": { 3166 | "version": "3.6.2", 3167 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 3168 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 3169 | "dependencies": { 3170 | "inherits": "^2.0.3", 3171 | "string_decoder": "^1.1.1", 3172 | "util-deprecate": "^1.0.1" 3173 | }, 3174 | "engines": { 3175 | "node": ">= 6" 3176 | } 3177 | }, 3178 | "node_modules/readdirp": { 3179 | "version": "3.6.0", 3180 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 3181 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 3182 | "dev": true, 3183 | "dependencies": { 3184 | "picomatch": "^2.2.1" 3185 | }, 3186 | "engines": { 3187 | "node": ">=8.10.0" 3188 | } 3189 | }, 3190 | "node_modules/resolve-pkg-maps": { 3191 | "version": "1.0.0", 3192 | "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 3193 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 3194 | "dev": true, 3195 | "funding": { 3196 | "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 3197 | } 3198 | }, 3199 | "node_modules/rimraf": { 3200 | "version": "3.0.2", 3201 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3202 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3203 | "dependencies": { 3204 | "glob": "^7.1.3" 3205 | }, 3206 | "bin": { 3207 | "rimraf": "bin.js" 3208 | }, 3209 | "funding": { 3210 | "url": "https://github.com/sponsors/isaacs" 3211 | } 3212 | }, 3213 | "node_modules/rimraf/node_modules/glob": { 3214 | "version": "7.2.3", 3215 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 3216 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 3217 | "dependencies": { 3218 | "fs.realpath": "^1.0.0", 3219 | "inflight": "^1.0.4", 3220 | "inherits": "2", 3221 | "minimatch": "^3.1.1", 3222 | "once": "^1.3.0", 3223 | "path-is-absolute": "^1.0.0" 3224 | }, 3225 | "engines": { 3226 | "node": "*" 3227 | }, 3228 | "funding": { 3229 | "url": "https://github.com/sponsors/isaacs" 3230 | } 3231 | }, 3232 | "node_modules/safe-buffer": { 3233 | "version": "5.2.1", 3234 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3235 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 3236 | "funding": [ 3237 | { 3238 | "type": "github", 3239 | "url": "https://github.com/sponsors/feross" 3240 | }, 3241 | { 3242 | "type": "patreon", 3243 | "url": "https://www.patreon.com/feross" 3244 | }, 3245 | { 3246 | "type": "consulting", 3247 | "url": "https://feross.org/support" 3248 | } 3249 | ] 3250 | }, 3251 | "node_modules/safe-stable-stringify": { 3252 | "version": "2.4.3", 3253 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", 3254 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", 3255 | "engines": { 3256 | "node": ">=10" 3257 | } 3258 | }, 3259 | "node_modules/safer-buffer": { 3260 | "version": "2.1.2", 3261 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3262 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 3263 | }, 3264 | "node_modules/semver": { 3265 | "version": "7.6.0", 3266 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 3267 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 3268 | "dependencies": { 3269 | "lru-cache": "^6.0.0" 3270 | }, 3271 | "bin": { 3272 | "semver": "bin/semver.js" 3273 | }, 3274 | "engines": { 3275 | "node": ">=10" 3276 | } 3277 | }, 3278 | "node_modules/send": { 3279 | "version": "0.18.0", 3280 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 3281 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 3282 | "dependencies": { 3283 | "debug": "2.6.9", 3284 | "depd": "2.0.0", 3285 | "destroy": "1.2.0", 3286 | "encodeurl": "~1.0.2", 3287 | "escape-html": "~1.0.3", 3288 | "etag": "~1.8.1", 3289 | "fresh": "0.5.2", 3290 | "http-errors": "2.0.0", 3291 | "mime": "1.6.0", 3292 | "ms": "2.1.3", 3293 | "on-finished": "2.4.1", 3294 | "range-parser": "~1.2.1", 3295 | "statuses": "2.0.1" 3296 | }, 3297 | "engines": { 3298 | "node": ">= 0.8.0" 3299 | } 3300 | }, 3301 | "node_modules/send/node_modules/ms": { 3302 | "version": "2.1.3", 3303 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3304 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 3305 | }, 3306 | "node_modules/serve-static": { 3307 | "version": "1.15.0", 3308 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 3309 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 3310 | "dependencies": { 3311 | "encodeurl": "~1.0.2", 3312 | "escape-html": "~1.0.3", 3313 | "parseurl": "~1.3.3", 3314 | "send": "0.18.0" 3315 | }, 3316 | "engines": { 3317 | "node": ">= 0.8.0" 3318 | } 3319 | }, 3320 | "node_modules/set-blocking": { 3321 | "version": "2.0.0", 3322 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 3323 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 3324 | }, 3325 | "node_modules/set-function-length": { 3326 | "version": "1.2.2", 3327 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 3328 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 3329 | "dependencies": { 3330 | "define-data-property": "^1.1.4", 3331 | "es-errors": "^1.3.0", 3332 | "function-bind": "^1.1.2", 3333 | "get-intrinsic": "^1.2.4", 3334 | "gopd": "^1.0.1", 3335 | "has-property-descriptors": "^1.0.2" 3336 | }, 3337 | "engines": { 3338 | "node": ">= 0.4" 3339 | } 3340 | }, 3341 | "node_modules/setprototypeof": { 3342 | "version": "1.2.0", 3343 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 3344 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 3345 | }, 3346 | "node_modules/side-channel": { 3347 | "version": "1.0.6", 3348 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 3349 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 3350 | "dependencies": { 3351 | "call-bind": "^1.0.7", 3352 | "es-errors": "^1.3.0", 3353 | "get-intrinsic": "^1.2.4", 3354 | "object-inspect": "^1.13.1" 3355 | }, 3356 | "engines": { 3357 | "node": ">= 0.4" 3358 | }, 3359 | "funding": { 3360 | "url": "https://github.com/sponsors/ljharb" 3361 | } 3362 | }, 3363 | "node_modules/signal-exit": { 3364 | "version": "3.0.7", 3365 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3366 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 3367 | }, 3368 | "node_modules/simple-swizzle": { 3369 | "version": "0.2.2", 3370 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 3371 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 3372 | "dependencies": { 3373 | "is-arrayish": "^0.3.1" 3374 | } 3375 | }, 3376 | "node_modules/simple-update-notifier": { 3377 | "version": "2.0.0", 3378 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 3379 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 3380 | "dev": true, 3381 | "dependencies": { 3382 | "semver": "^7.5.3" 3383 | }, 3384 | "engines": { 3385 | "node": ">=10" 3386 | } 3387 | }, 3388 | "node_modules/sisteransi": { 3389 | "version": "1.0.5", 3390 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 3391 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 3392 | "dev": true 3393 | }, 3394 | "node_modules/source-map": { 3395 | "version": "0.6.1", 3396 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3397 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3398 | "dev": true, 3399 | "engines": { 3400 | "node": ">=0.10.0" 3401 | } 3402 | }, 3403 | "node_modules/source-map-support": { 3404 | "version": "0.5.21", 3405 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 3406 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 3407 | "dev": true, 3408 | "dependencies": { 3409 | "buffer-from": "^1.0.0", 3410 | "source-map": "^0.6.0" 3411 | } 3412 | }, 3413 | "node_modules/stack-trace": { 3414 | "version": "0.0.10", 3415 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 3416 | "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", 3417 | "engines": { 3418 | "node": "*" 3419 | } 3420 | }, 3421 | "node_modules/statuses": { 3422 | "version": "2.0.1", 3423 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 3424 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 3425 | "engines": { 3426 | "node": ">= 0.8" 3427 | } 3428 | }, 3429 | "node_modules/string_decoder": { 3430 | "version": "1.3.0", 3431 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3432 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3433 | "dependencies": { 3434 | "safe-buffer": "~5.2.0" 3435 | } 3436 | }, 3437 | "node_modules/string-width": { 3438 | "version": "4.2.3", 3439 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3440 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3441 | "dependencies": { 3442 | "emoji-regex": "^8.0.0", 3443 | "is-fullwidth-code-point": "^3.0.0", 3444 | "strip-ansi": "^6.0.1" 3445 | }, 3446 | "engines": { 3447 | "node": ">=8" 3448 | } 3449 | }, 3450 | "node_modules/strip-ansi": { 3451 | "version": "6.0.1", 3452 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3453 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3454 | "dependencies": { 3455 | "ansi-regex": "^5.0.1" 3456 | }, 3457 | "engines": { 3458 | "node": ">=8" 3459 | } 3460 | }, 3461 | "node_modules/superjson": { 3462 | "version": "2.2.1", 3463 | "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", 3464 | "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", 3465 | "dev": true, 3466 | "dependencies": { 3467 | "copy-anything": "^3.0.2" 3468 | }, 3469 | "engines": { 3470 | "node": ">=16" 3471 | } 3472 | }, 3473 | "node_modules/supports-color": { 3474 | "version": "5.5.0", 3475 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3476 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3477 | "dev": true, 3478 | "dependencies": { 3479 | "has-flag": "^3.0.0" 3480 | }, 3481 | "engines": { 3482 | "node": ">=4" 3483 | } 3484 | }, 3485 | "node_modules/swagger-jsdoc": { 3486 | "version": "6.2.8", 3487 | "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", 3488 | "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", 3489 | "dependencies": { 3490 | "commander": "6.2.0", 3491 | "doctrine": "3.0.0", 3492 | "glob": "7.1.6", 3493 | "lodash.mergewith": "^4.6.2", 3494 | "swagger-parser": "^10.0.3", 3495 | "yaml": "2.0.0-1" 3496 | }, 3497 | "bin": { 3498 | "swagger-jsdoc": "bin/swagger-jsdoc.js" 3499 | }, 3500 | "engines": { 3501 | "node": ">=12.0.0" 3502 | } 3503 | }, 3504 | "node_modules/swagger-jsdoc/node_modules/commander": { 3505 | "version": "6.2.0", 3506 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", 3507 | "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", 3508 | "engines": { 3509 | "node": ">= 6" 3510 | } 3511 | }, 3512 | "node_modules/swagger-jsdoc/node_modules/glob": { 3513 | "version": "7.1.6", 3514 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 3515 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 3516 | "dependencies": { 3517 | "fs.realpath": "^1.0.0", 3518 | "inflight": "^1.0.4", 3519 | "inherits": "2", 3520 | "minimatch": "^3.0.4", 3521 | "once": "^1.3.0", 3522 | "path-is-absolute": "^1.0.0" 3523 | }, 3524 | "engines": { 3525 | "node": "*" 3526 | }, 3527 | "funding": { 3528 | "url": "https://github.com/sponsors/isaacs" 3529 | } 3530 | }, 3531 | "node_modules/swagger-parser": { 3532 | "version": "10.0.3", 3533 | "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", 3534 | "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", 3535 | "dependencies": { 3536 | "@apidevtools/swagger-parser": "10.0.3" 3537 | }, 3538 | "engines": { 3539 | "node": ">=10" 3540 | } 3541 | }, 3542 | "node_modules/swagger-ui-dist": { 3543 | "version": "5.17.2", 3544 | "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.2.tgz", 3545 | "integrity": "sha512-V/NqUw6QoTrjSpctp2oLQvxrl3vW29UsUtZyq7B1CF0v870KOFbYGDQw8rpKaKm0JxTwHpWnW1SN9YuKZdiCyw==" 3546 | }, 3547 | "node_modules/swagger-ui-express": { 3548 | "version": "5.0.0", 3549 | "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", 3550 | "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", 3551 | "dependencies": { 3552 | "swagger-ui-dist": ">=5.0.0" 3553 | }, 3554 | "engines": { 3555 | "node": ">= v0.10.32" 3556 | }, 3557 | "peerDependencies": { 3558 | "express": ">=4.0.0 || >=5.0.0-beta" 3559 | } 3560 | }, 3561 | "node_modules/tar": { 3562 | "version": "6.2.1", 3563 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 3564 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 3565 | "dependencies": { 3566 | "chownr": "^2.0.0", 3567 | "fs-minipass": "^2.0.0", 3568 | "minipass": "^5.0.0", 3569 | "minizlib": "^2.1.1", 3570 | "mkdirp": "^1.0.3", 3571 | "yallist": "^4.0.0" 3572 | }, 3573 | "engines": { 3574 | "node": ">=10" 3575 | } 3576 | }, 3577 | "node_modules/text-hex": { 3578 | "version": "1.0.0", 3579 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 3580 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 3581 | }, 3582 | "node_modules/timers-ext": { 3583 | "version": "0.1.7", 3584 | "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", 3585 | "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", 3586 | "dev": true, 3587 | "dependencies": { 3588 | "es5-ext": "~0.10.46", 3589 | "next-tick": "1" 3590 | } 3591 | }, 3592 | "node_modules/to-regex-range": { 3593 | "version": "5.0.1", 3594 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3595 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3596 | "dev": true, 3597 | "dependencies": { 3598 | "is-number": "^7.0.0" 3599 | }, 3600 | "engines": { 3601 | "node": ">=8.0" 3602 | } 3603 | }, 3604 | "node_modules/toidentifier": { 3605 | "version": "1.0.1", 3606 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 3607 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 3608 | "engines": { 3609 | "node": ">=0.6" 3610 | } 3611 | }, 3612 | "node_modules/touch": { 3613 | "version": "3.1.0", 3614 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 3615 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 3616 | "dev": true, 3617 | "dependencies": { 3618 | "nopt": "~1.0.10" 3619 | }, 3620 | "bin": { 3621 | "nodetouch": "bin/nodetouch.js" 3622 | } 3623 | }, 3624 | "node_modules/tr46": { 3625 | "version": "0.0.3", 3626 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3627 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 3628 | }, 3629 | "node_modules/triple-beam": { 3630 | "version": "1.4.1", 3631 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", 3632 | "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", 3633 | "engines": { 3634 | "node": ">= 14.0.0" 3635 | } 3636 | }, 3637 | "node_modules/type": { 3638 | "version": "2.7.2", 3639 | "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", 3640 | "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", 3641 | "dev": true 3642 | }, 3643 | "node_modules/type-is": { 3644 | "version": "1.6.18", 3645 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3646 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3647 | "dependencies": { 3648 | "media-typer": "0.3.0", 3649 | "mime-types": "~2.1.24" 3650 | }, 3651 | "engines": { 3652 | "node": ">= 0.6" 3653 | } 3654 | }, 3655 | "node_modules/undefsafe": { 3656 | "version": "2.0.5", 3657 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 3658 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 3659 | "dev": true 3660 | }, 3661 | "node_modules/unpipe": { 3662 | "version": "1.0.0", 3663 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3664 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 3665 | "engines": { 3666 | "node": ">= 0.8" 3667 | } 3668 | }, 3669 | "node_modules/util-deprecate": { 3670 | "version": "1.0.2", 3671 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3672 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 3673 | }, 3674 | "node_modules/utils-merge": { 3675 | "version": "1.0.1", 3676 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3677 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 3678 | "engines": { 3679 | "node": ">= 0.4.0" 3680 | } 3681 | }, 3682 | "node_modules/validator": { 3683 | "version": "13.11.0", 3684 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", 3685 | "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", 3686 | "engines": { 3687 | "node": ">= 0.10" 3688 | } 3689 | }, 3690 | "node_modules/vary": { 3691 | "version": "1.1.2", 3692 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3693 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 3694 | "engines": { 3695 | "node": ">= 0.8" 3696 | } 3697 | }, 3698 | "node_modules/webidl-conversions": { 3699 | "version": "3.0.1", 3700 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3701 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 3702 | }, 3703 | "node_modules/whatwg-url": { 3704 | "version": "5.0.0", 3705 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3706 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 3707 | "dependencies": { 3708 | "tr46": "~0.0.3", 3709 | "webidl-conversions": "^3.0.0" 3710 | } 3711 | }, 3712 | "node_modules/wide-align": { 3713 | "version": "1.1.5", 3714 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 3715 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 3716 | "dependencies": { 3717 | "string-width": "^1.0.2 || 2 || 3 || 4" 3718 | } 3719 | }, 3720 | "node_modules/winston": { 3721 | "version": "3.13.0", 3722 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", 3723 | "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", 3724 | "dependencies": { 3725 | "@colors/colors": "^1.6.0", 3726 | "@dabh/diagnostics": "^2.0.2", 3727 | "async": "^3.2.3", 3728 | "is-stream": "^2.0.0", 3729 | "logform": "^2.4.0", 3730 | "one-time": "^1.0.0", 3731 | "readable-stream": "^3.4.0", 3732 | "safe-stable-stringify": "^2.3.1", 3733 | "stack-trace": "0.0.x", 3734 | "triple-beam": "^1.3.0", 3735 | "winston-transport": "^4.7.0" 3736 | }, 3737 | "engines": { 3738 | "node": ">= 12.0.0" 3739 | } 3740 | }, 3741 | "node_modules/winston-daily-rotate-file": { 3742 | "version": "5.0.0", 3743 | "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-5.0.0.tgz", 3744 | "integrity": "sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==", 3745 | "dependencies": { 3746 | "file-stream-rotator": "^0.6.1", 3747 | "object-hash": "^3.0.0", 3748 | "triple-beam": "^1.4.1", 3749 | "winston-transport": "^4.7.0" 3750 | }, 3751 | "engines": { 3752 | "node": ">=8" 3753 | }, 3754 | "peerDependencies": { 3755 | "winston": "^3" 3756 | } 3757 | }, 3758 | "node_modules/winston-transport": { 3759 | "version": "4.7.0", 3760 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", 3761 | "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", 3762 | "dependencies": { 3763 | "logform": "^2.3.2", 3764 | "readable-stream": "^3.6.0", 3765 | "triple-beam": "^1.3.0" 3766 | }, 3767 | "engines": { 3768 | "node": ">= 12.0.0" 3769 | } 3770 | }, 3771 | "node_modules/wordwrap": { 3772 | "version": "1.0.0", 3773 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 3774 | "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", 3775 | "dev": true 3776 | }, 3777 | "node_modules/wrappy": { 3778 | "version": "1.0.2", 3779 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3780 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 3781 | }, 3782 | "node_modules/yallist": { 3783 | "version": "4.0.0", 3784 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3785 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 3786 | }, 3787 | "node_modules/yaml": { 3788 | "version": "2.0.0-1", 3789 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", 3790 | "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", 3791 | "engines": { 3792 | "node": ">= 6" 3793 | } 3794 | }, 3795 | "node_modules/z-schema": { 3796 | "version": "5.0.5", 3797 | "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", 3798 | "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", 3799 | "dependencies": { 3800 | "lodash.get": "^4.4.2", 3801 | "lodash.isequal": "^4.5.0", 3802 | "validator": "^13.7.0" 3803 | }, 3804 | "bin": { 3805 | "z-schema": "bin/z-schema" 3806 | }, 3807 | "engines": { 3808 | "node": ">=8.0.0" 3809 | }, 3810 | "optionalDependencies": { 3811 | "commander": "^9.4.1" 3812 | } 3813 | }, 3814 | "node_modules/zod": { 3815 | "version": "3.23.5", 3816 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.5.tgz", 3817 | "integrity": "sha512-fkwiq0VIQTksNNA131rDOsVJcns0pfVUjHzLrNBiF/O/Xxb5lQyEXkhZWcJ7npWsYlvs+h0jFWXXy4X46Em1JA==", 3818 | "funding": { 3819 | "url": "https://github.com/sponsors/colinhacks" 3820 | } 3821 | }, 3822 | "server": { 3823 | "version": "1.0.0", 3824 | "extraneous": true, 3825 | "dependencies": { 3826 | "bcrypt": "^5.1.1", 3827 | "body-parser": "^1.20.2", 3828 | "compression": "^1.7.4", 3829 | "cors": "^2.8.5", 3830 | "dayjs": "^1.11.11", 3831 | "dotenv": "^16.4.5", 3832 | "drizzle-orm": "^0.30.10", 3833 | "drizzle-zod": "^0.5.1", 3834 | "express": "^4.19.2", 3835 | "helmet": "^7.1.0", 3836 | "http-status": "^1.7.4", 3837 | "jsonwebtoken": "^9.0.2", 3838 | "morgan": "^1.10.0", 3839 | "passport": "^0.7.0", 3840 | "passport-jwt": "^4.0.1", 3841 | "postgres": "^3.4.4", 3842 | "winston": "^3.13.0", 3843 | "winston-daily-rotate-file": "^5.0.0", 3844 | "zod": "^3.23.5" 3845 | }, 3846 | "devDependencies": { 3847 | "drizzle-kit": "^0.20.17", 3848 | "nodemon": "^3.1.0" 3849 | } 3850 | } 3851 | } 3852 | } 3853 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import helmet from "helmet"; 3 | import bodyParser from "body-parser"; 4 | import compression from "compression"; 5 | import cors from "cors"; 6 | import passport from "passport"; 7 | import swaggerJsdoc from "swagger-jsdoc"; 8 | import swaggerUi from "swagger-ui-express"; 9 | 10 | import routes from "./routes/index.js"; 11 | import swaggerDefinition from "../docs/swagger-def.js"; 12 | import * as errorMiddleware from "./middlewares/error.middleware.js"; 13 | import { morganMiddleware } from "./middlewares/morgan.middleware.js"; 14 | import { jwtStrategy } from "./config/passport.js"; 15 | 16 | const app = express(); 17 | 18 | // request logging. 19 | app.use(morganMiddleware); 20 | 21 | // set security HTTP headers 22 | app.use(helmet()); 23 | 24 | // parse body params and attache them to req.body 25 | app.use(bodyParser.json()); 26 | app.use(bodyParser.urlencoded({ extended: true })); 27 | 28 | // compress all responses 29 | app.use(compression()); 30 | 31 | // secure apps by setting various HTTP headers 32 | app.use(helmet()); 33 | 34 | // enable cors 35 | app.use(cors()); 36 | 37 | // jwt authentication 38 | app.use(passport.initialize()); 39 | passport.use("jwt", jwtStrategy); 40 | 41 | // api routes 42 | app.use("/api", routes); 43 | 44 | // api-docs 45 | const specs = swaggerJsdoc({ 46 | swaggerDefinition, 47 | apis: ["docs/*.yml", "src/routes/*.js"], 48 | }); 49 | app.use("/api-docs", swaggerUi.serve); 50 | app.get("/api-docs", swaggerUi.setup(specs, { explorer: true })); 51 | 52 | // if error is not an instanceOf APIError, convert it. 53 | app.use(errorMiddleware.converter); 54 | 55 | // catch 404 and forward 56 | app.use(errorMiddleware.notFound); 57 | 58 | // error handler, send stacktrace only during development/local env 59 | app.use(errorMiddleware.handler); 60 | 61 | export default app; 62 | -------------------------------------------------------------------------------- /src/config/config.js: -------------------------------------------------------------------------------- 1 | import "dotenv/config.js"; 2 | import z from "zod"; 3 | 4 | import logger from "./logger.js"; 5 | 6 | const EnvVariables = z.object({ 7 | PORT: z.preprocess((a) => +a, z.number().optional().default(5000)), 8 | POSTGRESQL_HOST: z.string(), 9 | POSTGRESQL_PORT: z.preprocess((a) => +a, z.number().optional().default(5432)), 10 | POSTGRESQL_DB_NAME: z.string(), 11 | POSTGRESQL_USER: z.string(), 12 | POSTGRESQL_PASSWORD: z.string(), 13 | JWT_SECRET: z.string(), 14 | JWT_ACCESS_EXPIRATION_MINUTES: z.preprocess((a) => +a, z.number().default(30)), 15 | JWT_REFRESH_EXPIRATION_DAYS: z.preprocess((a) => +a, z.number().default(30)), 16 | JWT_RESET_PASSWORD_EXPIRATION_MINUTES: z.preprocess((a) => +a, z.number().default(10)), 17 | JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: z.preprocess((a) => +a, z.number().default(10)), 18 | }); 19 | 20 | let envVars; 21 | 22 | try { 23 | envVars = EnvVariables.parse(process.env); 24 | } catch (error) { 25 | logger.error(`Env validation error: ${error}`); 26 | process.exit(1); 27 | } 28 | 29 | const env = { 30 | nodeEnv: process.env.NODE_ENV, 31 | apiHost: process.env.API_HOST, 32 | port: envVars.PORT, 33 | db: { 34 | host: envVars.POSTGRESQL_HOST, 35 | port: envVars.POSTGRESQL_PORT, 36 | database: envVars.POSTGRESQL_DB_NAME, 37 | user: envVars.POSTGRESQL_USER, 38 | password: envVars.POSTGRESQL_PASSWORD, 39 | }, 40 | jwt: { 41 | secret: envVars.JWT_SECRET, 42 | accessExpirationMinutes: envVars.JWT_ACCESS_EXPIRATION_MINUTES, 43 | refreshExpirationDays: envVars.JWT_REFRESH_EXPIRATION_DAYS, 44 | resetPasswordExpirationMinutes: 45 | envVars.JWT_RESET_PASSWORD_EXPIRATION_MINUTES, 46 | verifyEmailExpirationMinutes: envVars.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES, 47 | }, 48 | }; 49 | 50 | export default env; 51 | -------------------------------------------------------------------------------- /src/config/logger.js: -------------------------------------------------------------------------------- 1 | import { format, transports, createLogger } from "winston"; 2 | import "winston-daily-rotate-file"; 3 | 4 | const { combine, json, colorize, simple } = format; 5 | 6 | const fileRotateTransport = new transports.DailyRotateFile({ 7 | filename: "logs/combined-%DATE%.log", 8 | datePattern: "YYYY-MM-DD", 9 | maxFiles: "14d", 10 | }); 11 | 12 | const logger = createLogger({ 13 | level: "silly", 14 | format: json(), 15 | transports: [ 16 | fileRotateTransport, 17 | new transports.File({ 18 | filename: "logs/error.log", 19 | level: "error", 20 | }), 21 | ], 22 | }); 23 | 24 | if (process.env.NODE_ENV !== "production") { 25 | logger.add( 26 | new transports.Console({ 27 | format: combine(colorize(), simple()), 28 | }) 29 | ); 30 | } 31 | 32 | export default logger; 33 | -------------------------------------------------------------------------------- /src/config/passport.js: -------------------------------------------------------------------------------- 1 | import { Strategy, ExtractJwt } from "passport-jwt"; 2 | import { eq } from "drizzle-orm"; 3 | 4 | import env from "./config.js"; 5 | import { TOKEN_TYPES } from "./tokens.js"; 6 | import { users } from "../db/schema.js"; 7 | import { db } from "../db/index.js"; 8 | 9 | const jwtOptions = { 10 | secretOrKey: env.jwt.secret, 11 | jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), 12 | }; 13 | 14 | async function jwtVerify(payload, done) { 15 | try { 16 | if (payload.type !== TOKEN_TYPES.ACCESS) { 17 | throw new Error("Invalid token type"); 18 | } 19 | const user = await db.query.users.findFirst({ 20 | where: eq(users.id, payload.sub), 21 | }); 22 | if (!user) { 23 | return done(null, false); 24 | } 25 | done(null, user); 26 | } catch (error) { 27 | done(error, false); 28 | } 29 | } 30 | 31 | export const jwtStrategy = new Strategy(jwtOptions, jwtVerify); 32 | -------------------------------------------------------------------------------- /src/config/tokens.js: -------------------------------------------------------------------------------- 1 | export const TOKEN_TYPES = { 2 | ACCESS: "access", 3 | REFRESH: "refresh", 4 | RESET_PASSWORD: "resetPassword", 5 | }; 6 | -------------------------------------------------------------------------------- /src/controllers/auth.controller.js: -------------------------------------------------------------------------------- 1 | import bcrypt from "bcrypt"; 2 | import httpStatus from "http-status"; 3 | 4 | import { tokenService, userService } from "../services/index.js"; 5 | import ApiError from "../utils/api-error.js"; 6 | import { TOKEN_TYPES } from "../config/tokens.js"; 7 | 8 | export async function register(req, res, next) { 9 | try { 10 | const user = await userService.createUser(req.body); 11 | const tokens = await tokenService.generateAuthTokens(user); 12 | res.status(httpStatus.CREATED).send({ user, tokens }); 13 | } catch (error) { 14 | next(error); 15 | } 16 | } 17 | 18 | export async function login(req, res, next) { 19 | try { 20 | const user = await userService.getUserByUsernameOrEmail( 21 | req.body.usernameOrEmail 22 | ); 23 | if (!user) { 24 | throw new ApiError(httpStatus.UNAUTHORIZED, "User not found"); 25 | } 26 | const compare = await bcrypt.compare(req.body.password, user.password); 27 | if (!compare) { 28 | throw new ApiError(httpStatus.UNAUTHORIZED, "username/email and password didn't match"); 29 | } 30 | const tokens = await tokenService.generateAuthTokens(user); 31 | delete user.password; 32 | return res.json({ user, tokens }); 33 | } catch (error) { 34 | next(error); 35 | } 36 | } 37 | 38 | export async function logout(req, res, next) { 39 | try { 40 | const token = await tokenService.findToken( 41 | req.body.refreshToken, 42 | TOKEN_TYPES.REFRESH 43 | ); 44 | if (!token) { 45 | throw new ApiError(httpStatus.BAD_REQUEST, "token not found"); 46 | } 47 | await tokenService.deleteToken(token.id); 48 | res.status(httpStatus.NO_CONTENT).send(); 49 | } catch (error) { 50 | next(error); 51 | } 52 | } 53 | 54 | 55 | export async function refreshTokens(req, res, next) { 56 | try { 57 | const tokens = await tokenService.refreshAuth(req.body.refreshToken); 58 | return res.json({ tokens }); 59 | } catch (error) { 60 | next(error); 61 | } 62 | } 63 | 64 | export async function forgotPassword(req, res, next) { 65 | try { 66 | const user = await userService.getUserByUsernameOrEmail( 67 | req.body.usernameOrEmail 68 | ); 69 | if (!user) { 70 | throw new ApiError(httpStatus.UNAUTHORIZED, "User not found"); 71 | } 72 | const resetPasswordToken = await tokenService.generateResetPasswordToken( 73 | user.email 74 | ); 75 | // ? mail the resetPasswordToken 76 | console.log("===========resetPasswordToken=========="); 77 | console.log(resetPasswordToken); 78 | console.log("===========resetPasswordToken=========="); 79 | 80 | // !NOTE: change the logic and send the resetPasswordToken in email instead in response 81 | res 82 | .status(httpStatus.METHOD_NOT_ALLOWED) 83 | .send({ 84 | message: 85 | "not a real server error", 86 | description: "copy the resetPasswordToken from server console or use UNSAFE_RESET_PASSWORD_TOKEN", 87 | UNSAFE_RESET_PASSWORD_TOKEN: resetPasswordToken, 88 | }); 89 | } catch (error) { 90 | next(error); 91 | } 92 | } 93 | 94 | export async function resetPassword(req, res, next) { 95 | try { 96 | const resetPasswordTokenDoc = await tokenService.verifyToken(req.body.token, TOKEN_TYPES.RESET_PASSWORD); 97 | console.log(resetPasswordTokenDoc); 98 | const user = await userService.getUserById(resetPasswordTokenDoc.userId); 99 | if (!user) { 100 | throw new ApiError(httpStatus.UNAUTHORIZED, 'Password reset failed'); 101 | } 102 | await userService.updateUserById(user.id, { password: req.body.password }); 103 | await tokenService.deleteMany(user.id, TOKEN_TYPES.RESET_PASSWORD); 104 | 105 | res.status(httpStatus.NO_CONTENT).send(); 106 | } catch (error) { 107 | next(error); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/controllers/index.js: -------------------------------------------------------------------------------- 1 | export * as authController from "./auth.controller.js"; 2 | export * as userController from "./user.controller.js"; 3 | -------------------------------------------------------------------------------- /src/controllers/user.controller.js: -------------------------------------------------------------------------------- 1 | import { userService } from "../services/index.js"; 2 | 3 | export async function getUserProfile(req, res) { 4 | const result = await userService.getUserById(req.user.id); 5 | res.send(result); 6 | } 7 | -------------------------------------------------------------------------------- /src/db/index.js: -------------------------------------------------------------------------------- 1 | import { drizzle } from "drizzle-orm/postgres-js"; 2 | import postgres from "postgres"; 3 | 4 | import env from "../config/config.js"; 5 | import logger from "../config/logger.js"; 6 | import * as schema from "./schema.js"; 7 | 8 | const postgresClient = postgres({ 9 | host: env.db.host, 10 | port: env.db.port, 11 | user: env.db.user, 12 | password: env.db.password, 13 | database: env.db.database, 14 | }); 15 | 16 | export const db = drizzle(postgresClient, { 17 | schema, 18 | logger: { 19 | logQuery(query, params) { 20 | if (env.nodeEnv !== "production") { 21 | const message = query + (params.length ? ` -- params: ${params}` : ""); 22 | logger.info(message); 23 | } 24 | }, 25 | }, 26 | }); 27 | -------------------------------------------------------------------------------- /src/db/schema.js: -------------------------------------------------------------------------------- 1 | export * from "./users.schema.js"; 2 | export * from "./tokens.schema.js"; 3 | -------------------------------------------------------------------------------- /src/db/tokens.schema.js: -------------------------------------------------------------------------------- 1 | import { sql } from "drizzle-orm"; 2 | import { text, timestamp, pgTable, uuid, pgEnum } from "drizzle-orm/pg-core"; 3 | import { createInsertSchema } from "drizzle-zod"; 4 | import { z } from "zod"; 5 | 6 | import { users } from "./users.schema.js"; 7 | import { TOKEN_TYPES } from "../config/tokens.js"; 8 | 9 | export const tokenTypes = pgEnum("token_types", [ 10 | TOKEN_TYPES.REFRESH, 11 | TOKEN_TYPES.RESET_PASSWORD, 12 | ]); 13 | 14 | export const tokens = pgTable("tokens", { 15 | id: uuid("id") 16 | .primaryKey() 17 | .default(sql`gen_random_uuid()`), 18 | userId: uuid("user_id") 19 | .notNull() 20 | .references(() => users.id, { onDelete: "cascade" }), 21 | token: text("token").notNull(), 22 | type: tokenTypes("type").notNull(), 23 | expires: timestamp("expires").notNull(), 24 | createdAt: timestamp("created_at").notNull().defaultNow(), 25 | }); 26 | 27 | export const insertTokenSchema = z.object({ body: createInsertSchema(tokens) }); 28 | 29 | export const refreshTokenSchema = z.object({ 30 | body: z.object({ 31 | refreshToken: z.string(), 32 | }), 33 | }); 34 | 35 | export const logoutTokenSchema = refreshTokenSchema; 36 | -------------------------------------------------------------------------------- /src/db/users.schema.js: -------------------------------------------------------------------------------- 1 | import { sql } from "drizzle-orm"; 2 | import { text, timestamp, pgTable, uuid } from "drizzle-orm/pg-core"; 3 | import { createInsertSchema } from "drizzle-zod"; 4 | import { z } from "zod"; 5 | 6 | export const users = pgTable("users", { 7 | id: uuid("id") 8 | .primaryKey() 9 | .default(sql`gen_random_uuid()`), 10 | username: text("username").notNull().unique(), 11 | email: text("email").notNull().unique(), 12 | password: text("password").notNull(), 13 | firstName: text("first_name"), 14 | lastName: text("last_name"), 15 | address: text("address"), 16 | phone: text("phone"), 17 | image: text("image"), 18 | createdAt: timestamp("created_at").notNull().defaultNow(), 19 | updatedAt: timestamp("updated_at") 20 | .notNull() 21 | .defaultNow() 22 | .$onUpdateFn(() => new Date()), 23 | }); 24 | 25 | const validPassword = z 26 | .string() 27 | .min(6, "Password must have 6 characters") 28 | .refine( 29 | (value) => /[-._!"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+/.test(value), 30 | "Password must contain atleast one special character" 31 | ) 32 | .refine( 33 | (value) => /[A-Z]/.test(value), 34 | "Password must contain at least one uppercase letter" 35 | ) 36 | .refine( 37 | (value) => /[0-9]/.test(value), 38 | "Password must contain at least one number" 39 | ) 40 | .refine( 41 | (value) => /[a-z]/.test(value), 42 | "Password must contain at least one lowercase letter" 43 | ); 44 | 45 | export const insertUserSchema = z.object({ 46 | body: createInsertSchema(users, { 47 | email: (schema) => schema.email.email(), 48 | password: validPassword, 49 | }), 50 | }); 51 | 52 | export const loginUserSchema = z.object({ 53 | body: z.object({ 54 | usernameOrEmail: z.string(), 55 | password: z.string(), 56 | }), 57 | }); 58 | 59 | export const forgotPasswordSchema = z.object({ 60 | body: z.object({ 61 | usernameOrEmail: z.string(), 62 | }), 63 | }); 64 | 65 | export const resetPasswordSchema = z.object({ 66 | body: z.object({ 67 | token: z.string(), 68 | password: validPassword, 69 | }), 70 | }); 71 | -------------------------------------------------------------------------------- /src/middlewares/auth.middleware.js: -------------------------------------------------------------------------------- 1 | import passport from "passport"; 2 | import httpStatus from "http-status"; 3 | 4 | import ApiError from "../utils/api-error.js"; 5 | 6 | export function authMiddleware(req, res, next) { 7 | const authenticateOption = { session: false }; 8 | 9 | passport.authenticate("jwt", authenticateOption, (err, user, info) => { 10 | if (err || info || !user) { 11 | next( 12 | new ApiError(httpStatus.UNAUTHORIZED, err || info || "no user found") 13 | ); 14 | } 15 | req.user = user; 16 | 17 | next(); 18 | })(req, res, next); 19 | } 20 | -------------------------------------------------------------------------------- /src/middlewares/error.middleware.js: -------------------------------------------------------------------------------- 1 | import httpStatus from "http-status"; 2 | 3 | import APIError from "../utils/api-error.js"; 4 | import env from "../config/config.js"; 5 | import logger from "../config/logger.js"; 6 | import ApiError from "../utils/api-error.js"; 7 | 8 | /** 9 | * Error handler. Send stacktrace only during local 10 | * @public 11 | */ 12 | export const handler = (err, req, res, next) => { 13 | let { statusCode, message } = err; 14 | 15 | const response = { 16 | code: statusCode, 17 | message, 18 | ...(env.nodeEnv !== "production" && { stack: err.stack }), 19 | }; 20 | 21 | if (env.nodeEnv !== "production") { 22 | logger.log( 23 | statusCode === httpStatus.NOT_FOUND ? "silly" : "error", 24 | "Error handler error log:", 25 | err 26 | ); 27 | } 28 | 29 | res.status(statusCode).send(response); 30 | }; 31 | 32 | /** 33 | * If error is not an instanceOf APIError, convert it. 34 | * @public 35 | */ 36 | export const converter = (error, req, res, next) => { 37 | // !NOTE: error instanceof PostgresError not working PostgresError is not exported from postgres package 38 | if (error.constructor.name === "PostgresError") { 39 | if (error.routine === "_bt_check_unique") { 40 | const [key, value] = error.detail 41 | .match(/\(([^)]+)\)/g) 42 | .map((x) => x.replace(/[()]/g, "")); 43 | const message = `${key} ${value} already exists. Please try again using different value`; 44 | throw new ApiError(httpStatus.BAD_REQUEST, message, false, error.stack); 45 | } 46 | const message = error.message || httpStatus[statusCode]; 47 | throw new ApiError( 48 | httpStatus.INTERNAL_SERVER_ERROR, 49 | message, 50 | false, 51 | error.stack 52 | ); 53 | } 54 | 55 | if (!(error instanceof ApiError)) { 56 | const statusCode = error.statusCode 57 | ? httpStatus.BAD_REQUEST 58 | : httpStatus.INTERNAL_SERVER_ERROR; 59 | const message = error.message || httpStatus[statusCode]; 60 | throw new ApiError(statusCode, message, false, error.stack); 61 | } 62 | 63 | next(error); 64 | }; 65 | 66 | /** 67 | * Catch 404 and forward to error handler 68 | * @public 69 | */ 70 | export const notFound = (req, res, next) => { 71 | const error = new APIError(httpStatus.NOT_FOUND, "Not found"); 72 | next(error); 73 | }; 74 | -------------------------------------------------------------------------------- /src/middlewares/morgan.middleware.js: -------------------------------------------------------------------------------- 1 | import morgan from "morgan"; 2 | 3 | import logger from "../config/logger.js"; 4 | 5 | export const morganMiddleware = morgan( 6 | ":method :url :status :res[content-length] - :response-time ms", 7 | { 8 | stream: { 9 | // Configure Morgan to use our custom logger with the http severity 10 | write: (message) => logger.http(message.trim()), 11 | }, 12 | } 13 | ); 14 | -------------------------------------------------------------------------------- /src/middlewares/validate.middleware.js: -------------------------------------------------------------------------------- 1 | import httpStatus from "http-status"; 2 | 3 | export function validateMiddleware(schema) { 4 | return async function validate(req, res, next) { 5 | try { 6 | const data = await schema.parseAsync({ 7 | body: req.body, 8 | query: req.query, 9 | params: req.params, 10 | }); 11 | req.body = data.body; 12 | req.query = data.query; 13 | req.params = data.params; 14 | return next(); 15 | } catch (error) { 16 | return res.status(httpStatus.BAD_REQUEST).json(error); 17 | } 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /src/routes/auth.route.js: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | 3 | import { authController } from "../controllers/index.js"; 4 | import { validateMiddleware } from "../middlewares/validate.middleware.js"; 5 | import { 6 | forgotPasswordSchema, 7 | insertUserSchema, 8 | loginUserSchema, 9 | logoutTokenSchema, 10 | refreshTokenSchema, 11 | resetPasswordSchema, 12 | } from "../db/schema.js"; 13 | 14 | /** 15 | * @swagger 16 | * tags: 17 | * name: Auth 18 | * description: Authentication 19 | */ 20 | const authRoutes = Router(); 21 | 22 | /** 23 | * @swagger 24 | * /auth/register: 25 | * post: 26 | * summary: Register as user 27 | * tags: [Auth] 28 | * requestBody: 29 | * required: true 30 | * content: 31 | * application/json: 32 | * schema: 33 | * type: object 34 | * required: 35 | * - username 36 | * - email 37 | * - password 38 | * properties: 39 | * username: 40 | * type: string 41 | * description: must be unique 42 | * email: 43 | * type: string 44 | * format: email 45 | * description: must be unique 46 | * password: 47 | * type: string 48 | * format: password 49 | * minLength: 6 50 | * description: At least one number, one special character, one Uppercase and one lowercase 51 | * firstName: 52 | * type: string 53 | * lastName: 54 | * type: string 55 | * address: 56 | * type: string 57 | * phone: 58 | * type: string 59 | * image: 60 | * type: string 61 | * example: 62 | * username: test 63 | * email: test@test.com 64 | * password: P@ssword123 65 | * firstName: test 66 | * lastName: test 67 | * responses: 68 | * "201": 69 | * description: Created 70 | * content: 71 | * application/json: 72 | * schema: 73 | * type: object 74 | * properties: 75 | * user: 76 | * $ref: '#/components/schemas/User' 77 | * tokens: 78 | * $ref: '#/components/schemas/AuthTokens' 79 | * "400": 80 | * $ref: '#/components/responses/DuplicateError' 81 | */ 82 | authRoutes 83 | .route("/register") 84 | .post(validateMiddleware(insertUserSchema), authController.register); 85 | 86 | /** 87 | * @swagger 88 | * /auth/login: 89 | * post: 90 | * summary: Login 91 | * tags: [Auth] 92 | * requestBody: 93 | * required: true 94 | * content: 95 | * application/json: 96 | * schema: 97 | * type: object 98 | * required: 99 | * - usernameOrEmail 100 | * - password 101 | * properties: 102 | * usernameOrEmail: 103 | * type: string 104 | * format: email | string 105 | * password: 106 | * type: string 107 | * format: password 108 | * example: 109 | * usernameOrEmail: test 110 | * password: P@ssword123 111 | * responses: 112 | * "200": 113 | * description: OK 114 | * content: 115 | * application/json: 116 | * schema: 117 | * type: object 118 | * properties: 119 | * user: 120 | * $ref: '#/components/schemas/User' 121 | * tokens: 122 | * $ref: '#/components/schemas/AuthTokens' 123 | * "401": 124 | * description: Invalid email or password 125 | * content: 126 | * application/json: 127 | * schema: 128 | * $ref: '#/components/schemas/Error' 129 | * example: 130 | * code: 401 131 | * message: username/email and password didn't match 132 | */ 133 | authRoutes 134 | .route("/login") 135 | .post(validateMiddleware(loginUserSchema), authController.login); 136 | 137 | /** 138 | * @swagger 139 | * /auth/logout: 140 | * post: 141 | * summary: Logout 142 | * tags: [Auth] 143 | * requestBody: 144 | * required: true 145 | * content: 146 | * application/json: 147 | * schema: 148 | * type: object 149 | * required: 150 | * - refreshToken 151 | * properties: 152 | * refreshToken: 153 | * type: string 154 | * example: 155 | * refreshToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YzcxYWQ0Zi05MDY5LTRkNTEtOTI4Ni1mM2FkYTQzNzI5MTAiLCJpYXQiOjE3MTQ3MzE0NTcsImV4cCI6MTcxNDczMzI1NywidHlwZSI6ImFjY2VzcyJ9.ZygGnanFeO-96I7RAV6HLMm5vGlfSxm1BKr4Ag-FwH8 156 | * responses: 157 | * "204": 158 | * description: No content 159 | * "404": 160 | * $ref: '#/components/responses/NotFound' 161 | */ 162 | authRoutes 163 | .route("/logout") 164 | .post(validateMiddleware(logoutTokenSchema), authController.logout); 165 | 166 | /** 167 | * @swagger 168 | * /auth/refresh-tokens: 169 | * post: 170 | * summary: Refresh auth tokens 171 | * tags: [Auth] 172 | * requestBody: 173 | * required: true 174 | * content: 175 | * application/json: 176 | * schema: 177 | * type: object 178 | * required: 179 | * - refreshToken 180 | * properties: 181 | * refreshToken: 182 | * type: string 183 | * example: 184 | * refreshToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YzcxYWQ0Zi05MDY5LTRkNTEtOTI4Ni1mM2FkYTQzNzI5MTAiLCJpYXQiOjE3MTQ3MzE0NTcsImV4cCI6MTcxNDczMzI1NywidHlwZSI6ImFjY2VzcyJ9.ZygGnanFeO-96I7RAV6HLMm5vGlfSxm1BKr4Ag-FwH8 185 | * responses: 186 | * "200": 187 | * description: OK 188 | * content: 189 | * application/json: 190 | * schema: 191 | * $ref: '#/components/schemas/AuthTokens' 192 | * "401": 193 | * $ref: '#/components/responses/Unauthorized' 194 | */ 195 | authRoutes 196 | .route("/refresh-tokens") 197 | .post(validateMiddleware(refreshTokenSchema), authController.refreshTokens); 198 | 199 | /** 200 | * @swagger 201 | * /auth/forgot-password: 202 | * post: 203 | * summary: Forgot password 204 | * description: An email will be sent to reset password. 205 | * tags: [Auth] 206 | * requestBody: 207 | * required: true 208 | * content: 209 | * application/json: 210 | * schema: 211 | * type: object 212 | * required: 213 | * - usernameOrEmail 214 | * properties: 215 | * usernameOrEmail: 216 | * type: string 217 | * format: email | username 218 | * example: 219 | * usernameOrEmail: test 220 | * responses: 221 | * "204": 222 | * description: No content 223 | * "404": 224 | * $ref: '#/components/responses/NotFound' 225 | */ 226 | authRoutes 227 | .route("/forgot-password") 228 | .post( 229 | validateMiddleware(forgotPasswordSchema), 230 | authController.forgotPassword 231 | ); 232 | 233 | /** 234 | * @swagger 235 | * /auth/reset-password: 236 | * post: 237 | * summary: Reset password 238 | * tags: [Auth] 239 | * requestBody: 240 | * required: true 241 | * content: 242 | * application/json: 243 | * schema: 244 | * type: object 245 | * required: 246 | * - token 247 | * - password 248 | * properties: 249 | * token: 250 | * type: string 251 | * password: 252 | * type: string 253 | * format: password 254 | * minLength: 6 255 | * description: At least one number, one special character, one Uppercase and one lowercase 256 | * example: 257 | * token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YzcxYWQ0Zi05MDY5LTRkNTEtOTI4Ni1mM2FkYTQzNzI5MTAiLCJpYXQiOjE3MTQ3MzE0NTcsImV4cCI6MTcxNDczMzI1NywidHlwZSI6ImFjY2VzcyJ9.ZygGnanFeO-96I7RAV6HLMm5vGlfSxm1BKr4Ag-FwH8 258 | * password: P@ssword123 259 | * responses: 260 | * "204": 261 | * description: No content 262 | * "401": 263 | * description: Password reset failed 264 | * content: 265 | * application/json: 266 | * schema: 267 | * $ref: '#/components/schemas/Error' 268 | * example: 269 | * code: 401 270 | * message: Password reset failed 271 | */ 272 | authRoutes 273 | .route("/reset-password") 274 | .post(validateMiddleware(resetPasswordSchema), authController.resetPassword); 275 | 276 | export { authRoutes }; 277 | -------------------------------------------------------------------------------- /src/routes/index.js: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | 3 | import { userRoutes } from "./user.route.js"; 4 | import { authRoutes } from "./auth.route.js"; 5 | import { authMiddleware } from "../middlewares/auth.middleware.js"; 6 | 7 | const router = Router(); 8 | 9 | // auth routes 10 | router.use("/auth", authRoutes); 11 | 12 | // user routes 13 | router.use("/users", authMiddleware, userRoutes); 14 | 15 | export default router; 16 | -------------------------------------------------------------------------------- /src/routes/user.route.js: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | 3 | import { userController } from "../controllers/index.js"; 4 | import { authMiddleware } from "../middlewares/auth.middleware.js"; 5 | 6 | /** 7 | * @swagger 8 | * tags: 9 | * name: User 10 | * description: User 11 | */ 12 | const userRoutes = Router(); 13 | 14 | /** 15 | * @swagger 16 | * /users/profile: 17 | * get: 18 | * summary: Get a user 19 | * description: Logged in users can fetch only their own user information. 20 | * tags: [User] 21 | * security: 22 | * - bearerAuth: [] 23 | * responses: 24 | * "200": 25 | * description: OK 26 | * content: 27 | * application/json: 28 | * schema: 29 | * $ref: '#/components/schemas/User' 30 | * "404": 31 | * $ref: '#/components/responses/NotFound' 32 | */ 33 | userRoutes.route("/profile").get(userController.getUserProfile); 34 | 35 | export { userRoutes }; 36 | -------------------------------------------------------------------------------- /src/services/index.js: -------------------------------------------------------------------------------- 1 | export * as userService from "./user.service.js"; 2 | export * as tokenService from "./token.service.js"; 3 | -------------------------------------------------------------------------------- /src/services/token.service.js: -------------------------------------------------------------------------------- 1 | import jwt from "jsonwebtoken"; 2 | import dayjs from "dayjs"; 3 | import httpStatus from "http-status"; 4 | import { and, eq } from "drizzle-orm"; 5 | 6 | import env from "../config/config.js"; 7 | import * as userService from "./user.service.js"; 8 | import ApiError from "../utils/api-error.js"; 9 | import { TOKEN_TYPES } from "../config/tokens.js"; 10 | import { tokens, users, insertTokenSchema } from "../db/schema.js"; 11 | import { db } from "../db/index.js"; 12 | 13 | /** 14 | * Generate token 15 | * @param {ObjectId} userId 16 | * @param {dayjs.Dayjs} expires 17 | * @param {string} type 18 | * @param {string} [secret] 19 | * @returns {string} 20 | */ 21 | export function generateToken(userId, expires, type, secret = env.jwt.secret) { 22 | const payload = { 23 | sub: userId, 24 | iat: dayjs(new Date()).unix(), 25 | exp: expires.unix(), 26 | type, 27 | }; 28 | return jwt.sign(payload, secret); 29 | } 30 | 31 | /** 32 | * Save a token 33 | * @param {insertTokenSchema} data 34 | * @returns {Promise} 35 | */ 36 | export function saveToken(data) { 37 | return db.insert(tokens).values(data).returning(); 38 | } 39 | 40 | /** 41 | * Verify token and return token doc (or throw an error if it is not valid) 42 | * @param {string} token 43 | * @param {string} type 44 | * @returns {Promise} 45 | */ 46 | export async function verifyToken(token, type) { 47 | const payload = jwt.verify(token, env.jwt.secret); 48 | console.log(payload); 49 | const tokenDoc = await db.query.tokens.findFirst({ 50 | where: and( 51 | eq(tokens.userId, payload.sub), 52 | eq(tokens.token, token), 53 | eq(tokens.type, type) 54 | ), 55 | }); 56 | if (!tokenDoc) { 57 | throw new Error("Token not found"); 58 | } 59 | return tokenDoc; 60 | } 61 | 62 | /** 63 | * Generate auth tokens 64 | * @param {users} user 65 | * @returns {Promise} 66 | */ 67 | export async function generateAuthTokens(user) { 68 | const accessTokenExpires = dayjs().add(env.jwt.accessExpirationMinutes, "m"); 69 | console.log("generateAuthTokens", user); 70 | const accessToken = generateToken( 71 | user.id, 72 | accessTokenExpires, 73 | TOKEN_TYPES.ACCESS 74 | ); 75 | 76 | const refreshTokenExpires = dayjs().add(env.jwt.refreshExpirationDays, "d"); 77 | const refreshToken = generateToken( 78 | user.id, 79 | refreshTokenExpires, 80 | TOKEN_TYPES.REFRESH 81 | ); 82 | await saveToken({ 83 | token: refreshToken, 84 | userId: user.id, 85 | expires: refreshTokenExpires, 86 | type: TOKEN_TYPES.REFRESH, 87 | }); 88 | 89 | return { 90 | access: { 91 | token: accessToken, 92 | expires: accessTokenExpires.toDate(), 93 | }, 94 | refresh: { 95 | token: refreshToken, 96 | expires: refreshTokenExpires.toDate(), 97 | }, 98 | }; 99 | } 100 | 101 | /** 102 | * Generate reset password token 103 | * @param {string} usernameOrEmail 104 | * @returns {Promise} 105 | */ 106 | export async function generateResetPasswordToken(usernameOrEmail) { 107 | const user = await userService.getUserByUsernameOrEmail(usernameOrEmail); 108 | if (!user) { 109 | throw new ApiError(httpStatus.NOT_FOUND, "No users"); 110 | } 111 | const expires = dayjs().add(env.jwt.resetPasswordExpirationMinutes, "m"); 112 | const resetPasswordToken = generateToken( 113 | user.id, 114 | expires, 115 | TOKEN_TYPES.RESET_PASSWORD 116 | ); 117 | await saveToken({ 118 | token: resetPasswordToken, 119 | userId: user.id, 120 | expires, 121 | type: TOKEN_TYPES.RESET_PASSWORD, 122 | }); 123 | return resetPasswordToken; 124 | } 125 | 126 | /** 127 | * Refresh auth tokens 128 | * @param {string} refreshToken 129 | * @returns {Promise} 130 | */ 131 | export async function refreshAuth(refreshToken) { 132 | try { 133 | const refreshTokenDoc = await verifyToken( 134 | refreshToken, 135 | TOKEN_TYPES.REFRESH 136 | ); 137 | const user = await userService.getUserById(refreshTokenDoc.userId); 138 | if (!user) { 139 | throw new Error(); 140 | } 141 | await deleteToken(refreshTokenDoc.id); 142 | return generateAuthTokens(user); 143 | } catch (error) { 144 | throw new ApiError(httpStatus.UNAUTHORIZED, "Please authenticate"); 145 | } 146 | } 147 | 148 | /** 149 | * find token 150 | * @param {string} userId 151 | * @param {string} token 152 | * @param {string} type 153 | * @returns {Promise} 154 | */ 155 | export async function findToken(token, type) { 156 | return db 157 | .delete(tokens) 158 | .where(and(eq(tokens.token, token)), eq(tokens.type, type)); 159 | } 160 | 161 | /** 162 | * delete token 163 | * @param {users} user 164 | * @returns {Promise} 165 | */ 166 | export async function deleteToken(id) { 167 | return db.delete(tokens).where(eq(tokens.id, id)); 168 | } 169 | 170 | /** 171 | * delete token 172 | * @param {string} userId 173 | * @param {string} type 174 | * @returns {Promise} 175 | */ 176 | export async function deleteMany(userId, type) { 177 | return db 178 | .delete(tokens) 179 | .where(and(eq(tokens.userId, userId), eq(tokens.type, type))); 180 | } 181 | -------------------------------------------------------------------------------- /src/services/user.service.js: -------------------------------------------------------------------------------- 1 | import bcrypt from "bcrypt"; 2 | import { eq, or } from "drizzle-orm"; 3 | 4 | import { db } from "../db/index.js"; 5 | import { users } from "../db/schema.js"; 6 | 7 | /** 8 | * Create a user 9 | * @param {Object} data 10 | * @returns {Promise} 11 | */ 12 | export async function createUser(data) { 13 | // !NOTE: hashing password in the orm events like mongoose and sequelize will be great but currently drizzle orm doesn't support events 14 | data.password = await bcrypt.hash(data.password, 10); 15 | return db 16 | .insert(users) 17 | .values(data) 18 | .returning({ id: users.id, username: users.username, email: users.email }) 19 | .then((res) => res[0]); 20 | } 21 | 22 | /** 23 | * Create a user 24 | * @param {string} usernameOrEmail 25 | * @returns {Promise} 26 | */ 27 | export function getUserByUsernameOrEmail(usernameOrEmail) { 28 | return db.query.users.findFirst({ 29 | where: or( 30 | eq(users.email, usernameOrEmail), 31 | eq(users.username, usernameOrEmail) 32 | ), 33 | }); 34 | } 35 | 36 | /** 37 | * Get user by id 38 | * @param {ObjectId} id 39 | * @returns {Promise} 40 | */ 41 | export function getUserById(id) { 42 | return db.query.users.findFirst({ where: eq(users.id, id) }).then((res) => { 43 | delete res.password; 44 | return res; 45 | }); 46 | } 47 | 48 | /** 49 | * Get user by id 50 | * @param {string} id 51 | * @param {Object} data 52 | * @returns {Promise} 53 | */ 54 | export async function updateUserById(id, data) { 55 | if (data.password) { 56 | // !NOTE: hashing password in the orm events like mongoose and sequelize will be great but currently drizzle orm doesn't support events 57 | data.password = await bcrypt.hash(data.password, 10); 58 | } 59 | return db.update(users).set(data).where(eq(users.id, id)); 60 | } 61 | -------------------------------------------------------------------------------- /src/utils/api-error.js: -------------------------------------------------------------------------------- 1 | class ApiError extends Error { 2 | constructor(statusCode, message, isOperational = true, stack = "") { 3 | super(message); 4 | this.statusCode = statusCode; 5 | this.isOperational = isOperational; 6 | if (stack) { 7 | this.stack = stack; 8 | } else { 9 | Error.captureStackTrace(this, this.constructor); 10 | } 11 | } 12 | } 13 | 14 | export default ApiError; 15 | --------------------------------------------------------------------------------