├── .editorconfig ├── .gitignore ├── docker-compose.yaml ├── package.json ├── prompts.md ├── src ├── country-mapping.ts ├── db.ts ├── index.ts ├── link-definitions.ts └── middleware.ts ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = tab 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | 14 | [*yml] 15 | indent_style = space 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node modules 2 | node_modules/ 3 | 4 | # Build output 5 | dist/ 6 | 7 | # Environment variables 8 | .env 9 | 10 | # IDE/Editor specific files 11 | .vscode/ 12 | 13 | .yarn-error.log 14 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | # Use postgres/example user/password credentials 2 | version: '3.1' 3 | 4 | services: 5 | db: 6 | image: postgres 7 | restart: always 8 | environment: 9 | POSTGRES_PASSWORD: example 10 | ports: 11 | - 5432:5432 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "link-redirection", 3 | "version": "1.0.0", 4 | "description": "The link redirection service generated by ChatGPT-4", 5 | "main": "index.js", 6 | "author": "Marko + ChatGPT-4", 7 | "license": "MIT", 8 | "private": true, 9 | "scripts": { 10 | "build": "tsc", 11 | "start": "node dist/index.js", 12 | "local": "yarn ts-node src/index.ts" 13 | }, 14 | "dependencies": { 15 | "@types/geoip-lite": "^1.4.1", 16 | "express": "^4.18.2", 17 | "geoip-lite": "^1.4.7", 18 | "pg": "^8.10.0", 19 | "treblle": "^1.3.0", 20 | "ts-node": "^10.9.1" 21 | }, 22 | "devDependencies": { 23 | "@types/express": "^4.17.17", 24 | "@types/node": "^18.15.5", 25 | "@types/pg": "^8.6.6", 26 | "typescript": "^5.0.2" 27 | } 28 | } -------------------------------------------------------------------------------- /prompts.md: -------------------------------------------------------------------------------- 1 | Please act as a backend developer proficient in nodejs and typescript. 2 | 3 | I am making a link redirection service in nodejs using typescript and express. Here I will describe the requirements. 4 | 5 | The goal of the service is to redirect short links (slugs) to specific amazon product pages. Each slug will be associated with more than one amazon page URL: 6 | 7 | - One default URL for the US amazon store 8 | - Multiple additional URLs for country or region specific amazon stores. 9 | 10 | Here is the example format of the link: 11 | https://example.com/:slug 12 | 13 | All the slugs that are supported by our service will be hard-coded in a separate file called "link-definitions.ts". 14 | 15 | When our service gets a request, it will try to find one of the link definitions based on the slug. If we have defined a link for that slug, we should find the country of that request based on the IP, and using one of the NPM packages that can do this mapping. 16 | 17 | Once we have the country, we will inspect the link definition and if we have this country in the definition, we will redirect the user to the link associated with that country. 18 | 19 | In addition to the link definitions for each slug, we will have one fallback link definition that will be used in case we receive a request for a slug we don't recognize. This fallback link definition will have it's own mapping for each country and destination amazon URL. 20 | 21 | In case that we do not have the amazon URL for a country, we should take the user to the URL for the US amazon store. All link definitions must have a link for amazon. 22 | 23 | In addition to the country mapping each link definition will have one or more tags associated with it. Tags are represented as a list of strings. 24 | 25 | Apart from redirecting the user, the goal of the service is to log every link click in a Postgres database. For each link click we want to save one record in a table with the following information: 26 | 27 | - original slug in the request 28 | - original country of the request 29 | - tags of the found link definition 30 | - resolved amazon URL 31 | - videoId of the YouTube video that generated this link click 32 | 33 | The videoId will be added to the clicked link by YouTube in the form of a query param called "v". For example, if one of our short links is used in a YouTube video description like this: 34 | 35 | https://example.com/my-slug 36 | 37 | Then YouTube will actually take the user to the following url: 38 | 39 | https://example.com/my-slug?v=some-video-id 40 | 41 | Our goal is to extract that videoId if present, and save it in the Postgres database. 42 | 43 | The above are the basic requirements, please ask any clarifying questions before we get started with working on this project. 44 | 45 | --- 46 | 47 | 1. Please recommend a package, optimize for low memory usage 48 | 2. Assume I have a database, but I need to write the code to connect to it. 49 | 3. Let's call the table link_clicks, and based on the above requirements, please suggest the column names. Make sure to include a timestamp of each link click. 50 | 4. As far as error handling goes, in general if we receive a link click, even if we can't find the ideal URL for the given country or slug, we should always redirect the user to at least the fallback amazon page. 51 | 52 | --- 53 | 54 | Before we continue what would be a good .gitignore file for this project? 55 | 56 | --- 57 | 58 | Ok, let's continue I had to make a short break :) 59 | 60 | --- 61 | 62 | Can you continue from the beginning of src/index.ts 63 | 64 | --- 65 | 66 | Before we continue, let's address the following: I will provide you with a list of country codes that I would like to support with this service. However, some of those countries do not have their own amazon store. So we should create a mapping for each of the country codes that I will provide to a country code that actually has an amazon store. For each country that doesn't have it's own store, we should choose the amazon store in the same geographic region. And then let's make sure to use this mapping in the endpoint. 67 | 68 | Here is a list of the country codes that I would like to support: 69 | 70 | US 71 | IN 72 | DE 73 | BR 74 | RU 75 | GB 76 | PL 77 | CA 78 | TR 79 | IT 80 | ES 81 | ID 82 | UA 83 | VN 84 | FR 85 | JP 86 | PH 87 | NL 88 | AU 89 | RO 90 | MX 91 | PT 92 | SE 93 | TH 94 | MY 95 | CZ 96 | PK 97 | BD 98 | MA 99 | SG 100 | AR 101 | 102 | --- 103 | 104 | Do you know which countries have amazon stores? 105 | 106 | --- 107 | 108 | Can you use this list of known countries with amazon stores to update the mapping so that countries that do not have their own amazon stores are mapped to the ones that do that are in the same geographic region? 109 | 110 | --- 111 | 112 | Ok, can you show me how to use this mapping in the endpoint? 113 | 114 | --- 115 | 116 | Ok, let's. continue with saving this info in postgres 117 | 118 | --- 119 | 120 | continue from src/index.ts 121 | 122 | --- 123 | 124 | how can I query this table in psql? 125 | 126 | -------------------------------------------------------------------------------- /src/country-mapping.ts: -------------------------------------------------------------------------------- 1 | export const countryMapping: { [countryCode: string]: string } = { 2 | US: 'US', 3 | IN: 'IN', 4 | DE: 'DE', 5 | BR: 'BR', 6 | RU: 'DE', 7 | GB: 'GB', 8 | PL: 'PL', 9 | CA: 'CA', 10 | TR: 'TR', 11 | IT: 'IT', 12 | ES: 'ES', 13 | ID: 'SG', 14 | UA: 'DE', 15 | VN: 'SG', 16 | FR: 'FR', 17 | JP: 'JP', 18 | PH: 'SG', 19 | NL: 'NL', 20 | AU: 'AU', 21 | RO: 'DE', 22 | MX: 'MX', 23 | PT: 'ES', 24 | SE: 'SE', 25 | TH: 'SG', 26 | MY: 'SG', 27 | CZ: 'DE', 28 | PK: 'IN', 29 | BD: 'IN', 30 | MA: 'FR', 31 | SG: 'SG', 32 | AR: 'BR', 33 | }; 34 | -------------------------------------------------------------------------------- /src/db.ts: -------------------------------------------------------------------------------- 1 | import { Pool, QueryResult } from 'pg'; 2 | 3 | const pool = new Pool({ 4 | connectionString: process.env.DATABASE_URL, 5 | }); 6 | 7 | // Add the following function below the pool initialization 8 | async function createTableIfNotExists(): Promise { 9 | const query = ` 10 | CREATE TABLE IF NOT EXISTS link_clicks ( 11 | id SERIAL PRIMARY KEY, 12 | slug VARCHAR(255) NOT NULL, 13 | country VARCHAR(2) NOT NULL, 14 | tags TEXT[] NOT NULL, 15 | resolved_url TEXT NOT NULL, 16 | video_id VARCHAR(255), 17 | created_at TIMESTAMP NOT NULL DEFAULT NOW() 18 | ); 19 | `; 20 | 21 | return pool.query(query); 22 | } 23 | 24 | // Call the function to create the table if it doesn't exist 25 | createTableIfNotExists().catch((err) => { 26 | console.error('Error creating table:', err); 27 | }); 28 | 29 | export async function logLinkClick( 30 | slug: string, 31 | country: string, 32 | tags: string[], 33 | resolvedUrl: string, 34 | videoId?: string 35 | ): Promise { 36 | const query = ` 37 | INSERT INTO link_clicks (slug, country, tags, resolved_url, video_id) 38 | VALUES ($1, $2, $3, $4, $5); 39 | `; 40 | 41 | const values = [slug, country, tags, resolvedUrl, videoId]; 42 | 43 | try { 44 | await pool.query(query, values); 45 | } catch (err) { 46 | console.error('Error inserting link click:', err); 47 | } 48 | } 49 | 50 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import express, { Request } from 'express'; 2 | import { extractRequestInfo } from './middleware'; 3 | import { linkDefinitions, fallbackDefinition, LinkDefinition } from './link-definitions'; 4 | import { countryMapping } from './country-mapping'; 5 | import { logLinkClick } from './db'; 6 | import { useTreblle } from 'treblle'; 7 | 8 | const app = express(); 9 | 10 | useTreblle(app, { 11 | apiKey: process.env.TREBLLE_API_KEY, 12 | projectId: process.env.TREBLLE_PROJECT_ID, 13 | }) 14 | 15 | const port = process.env.PORT || 3000; 16 | 17 | // Add custom properties to the Request object 18 | declare global { 19 | namespace Express { 20 | interface Request { 21 | country: string; 22 | videoId?: string; 23 | } 24 | } 25 | } 26 | 27 | app.use(extractRequestInfo); 28 | 29 | app.get('/:slug', async (req: Request, res) => { 30 | const { slug } = req.params; 31 | const { country, videoId } = req; 32 | 33 | // Find the link definition 34 | const linkDefinition: LinkDefinition = 35 | linkDefinitions.find((def) => def.slug === slug) || fallbackDefinition; 36 | 37 | // Map the user's country to the appropriate Amazon store country 38 | const amazonCountry = countryMapping[country] || 'US'; 39 | 40 | // Find the appropriate URL for the mapped Amazon store country or the default URL 41 | const redirectUrl = linkDefinition.links[amazonCountry] || linkDefinition.links['DEFAULT']; 42 | 43 | // Log the link click to the Postgres database 44 | await logLinkClick(slug, country, linkDefinition.tags, redirectUrl, videoId); 45 | 46 | res.redirect(redirectUrl); 47 | }); 48 | 49 | app.listen(port, () => { 50 | console.log(`Server started on port ${port}`); 51 | }); 52 | -------------------------------------------------------------------------------- /src/link-definitions.ts: -------------------------------------------------------------------------------- 1 | export interface LinkDefinition { 2 | slug: string; 3 | tags: string[]; 4 | links: { 5 | DEFAULT: string; 6 | [country: string]: string; 7 | }; 8 | } 9 | 10 | export const linkDefinitions: LinkDefinition[] = [ 11 | { 12 | slug: 'backpack', 13 | tags: ['backpack'], 14 | links: { 15 | DEFAULT: 'https://amzn.to/3BDjjqG' 16 | }, 17 | }, 18 | { 19 | slug: 'vissles-keyboard', 20 | tags: ['keyboard'], 21 | links: { 22 | DEFAULT: 'https://amzn.to/3cNiYJB' 23 | } 24 | }, 25 | { 26 | slug: 'michals-keyboard', 27 | tags: ['keyboard'], 28 | links: { 29 | DEFAULT: 'https://amzn.to/3xGschW', 30 | DE: 'https://amzn.to/432Z0PN' 31 | } 32 | }, 33 | { 34 | slug: 'mx-master-3s', 35 | tags: ['mouse'], 36 | links: { 37 | DEFAULT: 'https://amzn.to/3zZZBF9', 38 | DE: 'https://amzn.to/3NW0vuH' 39 | } 40 | }, 41 | { 42 | slug: 'michals-mouse', 43 | tags: ['mouse'], 44 | links: { 45 | DEFAULT: 'https://amzn.to/3BXGHAI', 46 | DE: 'https://amzn.to/42nnlQ8' 47 | 48 | } 49 | }, 50 | { 51 | slug: 'cleaning-tool', 52 | tags: ['cleaning'], 53 | links: { 54 | DEFAULT: 'https://amzn.to/3CZZVpV', 55 | DE: 'https://amzn.to/3HWvdjq' 56 | } 57 | }, 58 | { 59 | slug: 'earbuds', 60 | tags: ['earbuds'], 61 | links: { 62 | DEFAULT: 'https://amzn.to/3RYEVUx', 63 | DE: 'https://amzn.to/44SR59s' 64 | } 65 | }, 66 | { 67 | slug: 'lofree', 68 | tags: ['keyboard'], 69 | links: { 70 | DEFAULT: 'https://amzn.to/3W0OBkI', 71 | 72 | } 73 | }, 74 | { 75 | slug: 'floating-plant', 76 | tags: ['plant', 'desk-accessory'], 77 | links: { 78 | DEFAULT: 'https://amzn.to/3gXzU1S', 79 | DE: 'https://amzn.to/3LM1wTm' 80 | } 81 | }, 82 | { 83 | slug: 'productivity-mouse', 84 | tags: ['mouse'], 85 | links: { 86 | DEFAULT: 'https://amzn.to/3OJEEoD', 87 | DE: 'https://amzn.to/3LTRmAf' 88 | } 89 | }, 90 | { 91 | slug: 'headphones', 92 | tags: ['headphones'], 93 | links: { 94 | DEFAULT: 'https://amzn.to/3IGTP0X', 95 | DE: 'https://amzn.to/42qHTam' 96 | } 97 | }, 98 | { 99 | slug: 'productivity-keyboard', 100 | tags: ['keyboard'], 101 | links: { 102 | DEFAULT: 'https://amzn.to/3Hw7k2B', 103 | DE: 'https://amzn.to/42F1ByQ' 104 | } 105 | }, 106 | { 107 | slug: 'led-matrix-clock', 108 | tags: ['clock', 'bluetooth-speaker', 'desk-accessory'], 109 | links: { 110 | DEFAULT: 'https://amzn.to/3zIKwHO', 111 | DE: 'https://amzn.to/3W0xqAb' 112 | } 113 | }, 114 | { 115 | slug: 'github', 116 | tags: ['github'], 117 | links: { 118 | DEFAULT: 'https://github.com/Markonis' 119 | } 120 | }, 121 | { 122 | slug: 'one-menu', 123 | tags: ['one-menu'], 124 | links: { 125 | DEFAULT: 'https://withmarko.com/one-menu' 126 | } 127 | }, 128 | { 129 | slug: 'typing-game', 130 | tags: ['game', 'project'], 131 | links: { 132 | DEFAULT: 'https://type.withmarko.com' 133 | } 134 | }, 135 | { 136 | slug: 'boox', 137 | tags: ['tablet'], 138 | links: { 139 | DEFAULT: 'https://shop.boox.com/?ref=gisG1RQxpV9suI' 140 | } 141 | }, 142 | { 143 | slug: 'pdf-element', 144 | tags: ['sponsored', 'software'], 145 | links: { 146 | DEFAULT: 'https://bit.ly/3KO53zQ' 147 | } 148 | }, 149 | { 150 | slug: 'pdf-element-mobile', 151 | tags: ['sponsored', 'software'], 152 | links: { 153 | DEFAULT: 'https://bit.ly/40hrnrp' 154 | } 155 | }, 156 | { 157 | slug: 'microphone', 158 | tags: ['microphone'], 159 | links: { 160 | DE: 'https://amzn.to/3WHWRqH', 161 | DEFAULT: 'https://amzn.to/43gl0qL' 162 | } 163 | }, 164 | { 165 | slug: 'audio-interface', 166 | tags: ['audio'], 167 | links: { 168 | DE: 'https://amzn.to/42yxMjn', 169 | DEFAULT: 'https://amzn.to/43DDKAo' 170 | } 171 | }, 172 | { 173 | slug: 'cloud-lifter', 174 | tags: ['audio'], 175 | links: { 176 | DE: 'https://amzn.to/3qhPaex', 177 | DEFAULT: 'https://amzn.to/3oIkRgI' 178 | } 179 | }, 180 | { 181 | slug: 'main-camera', 182 | tags: ['camera'], 183 | links: { 184 | DE: 'https://amzn.to/43xjn7I', 185 | DEFAULT: 'https://amzn.to/43dr6bk' 186 | } 187 | }, 188 | { 189 | slug: 'main-lens', 190 | tags: ['lens'], 191 | links: { 192 | DE: 'https://amzn.to/3qoFVJK', 193 | DEFAULT: 'https://amzn.to/3WIW08Y' 194 | } 195 | }, 196 | { 197 | slug: 'phone', 198 | tags: ['phone'], 199 | links: { 200 | DE: 'https://amzn.to/3MDy4iQ', 201 | DEFAULT: 'https://amzn.to/3C8eIO0' 202 | } 203 | }, 204 | ]; 205 | 206 | export const fallbackDefinition: LinkDefinition = { 207 | slug: 'fallback', 208 | tags: ['fallback'], 209 | links: { 210 | DEFAULT: 'https://www.amazon.com', 211 | }, 212 | }; 213 | -------------------------------------------------------------------------------- /src/middleware.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response, NextFunction } from 'express'; 2 | import geoip from 'geoip-lite'; 3 | 4 | export const extractRequestInfo = (req: Request, res: Response, next: NextFunction) => { 5 | // Extract IP address 6 | const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || ''; 7 | const ipString = typeof ip === 'string' ? ip.split(', ')[0] : ip[0]; 8 | 9 | // Extract country 10 | const geo = geoip.lookup(ipString); 11 | req.country = geo ? geo.country : 'US'; 12 | 13 | if (req.query.debug) { 14 | console.log(`${req.url} ${ip} ${req.country}`); 15 | } 16 | 17 | // Extract video ID 18 | const videoId = req.query.v; 19 | if (videoId && typeof videoId === 'string') { 20 | req.videoId = videoId; 21 | } 22 | 23 | next(); 24 | }; 25 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "outDir": "./dist", 6 | "strict": true, 7 | "esModuleInterop": true 8 | }, 9 | "include": [ 10 | "src/**/*.ts" 11 | ], 12 | "exclude": [ 13 | "node_modules" 14 | ] 15 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@jridgewell/resolve-uri@^3.0.3": 13 | version "3.1.0" 14 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 15 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 16 | 17 | "@jridgewell/sourcemap-codec@^1.4.10": 18 | version "1.4.14" 19 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 20 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 21 | 22 | "@jridgewell/trace-mapping@0.3.9": 23 | version "0.3.9" 24 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 25 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 26 | dependencies: 27 | "@jridgewell/resolve-uri" "^3.0.3" 28 | "@jridgewell/sourcemap-codec" "^1.4.10" 29 | 30 | "@tsconfig/node10@^1.0.7": 31 | version "1.0.9" 32 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 33 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 34 | 35 | "@tsconfig/node12@^1.0.7": 36 | version "1.0.11" 37 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 38 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 39 | 40 | "@tsconfig/node14@^1.0.0": 41 | version "1.0.3" 42 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 43 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 44 | 45 | "@tsconfig/node16@^1.0.2": 46 | version "1.0.3" 47 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 48 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 49 | 50 | "@types/body-parser@*": 51 | version "1.19.2" 52 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 53 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 54 | dependencies: 55 | "@types/connect" "*" 56 | "@types/node" "*" 57 | 58 | "@types/connect@*": 59 | version "3.4.35" 60 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 61 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 62 | dependencies: 63 | "@types/node" "*" 64 | 65 | "@types/express-serve-static-core@^4.17.33": 66 | version "4.17.33" 67 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" 68 | integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== 69 | dependencies: 70 | "@types/node" "*" 71 | "@types/qs" "*" 72 | "@types/range-parser" "*" 73 | 74 | "@types/express@^4.17.17": 75 | version "4.17.17" 76 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" 77 | integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== 78 | dependencies: 79 | "@types/body-parser" "*" 80 | "@types/express-serve-static-core" "^4.17.33" 81 | "@types/qs" "*" 82 | "@types/serve-static" "*" 83 | 84 | "@types/geoip-lite@^1.4.1": 85 | version "1.4.1" 86 | resolved "https://registry.yarnpkg.com/@types/geoip-lite/-/geoip-lite-1.4.1.tgz#2c0d787fb14b2463b244baca1f3b9023fba3c49b" 87 | integrity sha512-qHH5eF3rL1wwqpzdsgMdgskfdWXxxQvJb9POJ66NK7/1l3QXsqHLpIheh9OmhtqZ2CF7AmN0sA2R4PgW8JSm7w== 88 | 89 | "@types/mime@*": 90 | version "3.0.1" 91 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" 92 | integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== 93 | 94 | "@types/node@*", "@types/node@^18.15.5": 95 | version "18.15.5" 96 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.5.tgz#3af577099a99c61479149b716183e70b5239324a" 97 | integrity sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew== 98 | 99 | "@types/pg@^8.6.6": 100 | version "8.6.6" 101 | resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.6.tgz#21cdf873a3e345a6e78f394677e3b3b1b543cb80" 102 | integrity sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw== 103 | dependencies: 104 | "@types/node" "*" 105 | pg-protocol "*" 106 | pg-types "^2.2.0" 107 | 108 | "@types/qs@*": 109 | version "6.9.7" 110 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 111 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 112 | 113 | "@types/range-parser@*": 114 | version "1.2.4" 115 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 116 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 117 | 118 | "@types/serve-static@*": 119 | version "1.15.1" 120 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" 121 | integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== 122 | dependencies: 123 | "@types/mime" "*" 124 | "@types/node" "*" 125 | 126 | accepts@~1.3.8: 127 | version "1.3.8" 128 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 129 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 130 | dependencies: 131 | mime-types "~2.1.34" 132 | negotiator "0.6.3" 133 | 134 | acorn-walk@^8.1.1: 135 | version "8.2.0" 136 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 137 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 138 | 139 | acorn@^8.4.1: 140 | version "8.8.2" 141 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" 142 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 143 | 144 | ansi-styles@^4.1.0: 145 | version "4.3.0" 146 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 147 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 148 | dependencies: 149 | color-convert "^2.0.1" 150 | 151 | arg@^4.1.0: 152 | version "4.1.3" 153 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 154 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 155 | 156 | array-flatten@1.1.1: 157 | version "1.1.1" 158 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 159 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 160 | 161 | "async@2.1 - 2.6.4": 162 | version "2.6.4" 163 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" 164 | integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== 165 | dependencies: 166 | lodash "^4.17.14" 167 | 168 | balanced-match@^1.0.0: 169 | version "1.0.2" 170 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 171 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 172 | 173 | body-parser@1.20.1: 174 | version "1.20.1" 175 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 176 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 177 | dependencies: 178 | bytes "3.1.2" 179 | content-type "~1.0.4" 180 | debug "2.6.9" 181 | depd "2.0.0" 182 | destroy "1.2.0" 183 | http-errors "2.0.0" 184 | iconv-lite "0.4.24" 185 | on-finished "2.4.1" 186 | qs "6.11.0" 187 | raw-body "2.5.1" 188 | type-is "~1.6.18" 189 | unpipe "1.0.0" 190 | 191 | brace-expansion@^1.1.7: 192 | version "1.1.11" 193 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 194 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 195 | dependencies: 196 | balanced-match "^1.0.0" 197 | concat-map "0.0.1" 198 | 199 | buffer-crc32@~0.2.3: 200 | version "0.2.13" 201 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 202 | integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== 203 | 204 | buffer-writer@2.0.0: 205 | version "2.0.0" 206 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" 207 | integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== 208 | 209 | bytes@3.1.2: 210 | version "3.1.2" 211 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 212 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 213 | 214 | call-bind@^1.0.0: 215 | version "1.0.2" 216 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 217 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 218 | dependencies: 219 | function-bind "^1.1.1" 220 | get-intrinsic "^1.0.2" 221 | 222 | "chalk@4.1 - 4.1.2": 223 | version "4.1.2" 224 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 225 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 226 | dependencies: 227 | ansi-styles "^4.1.0" 228 | supports-color "^7.1.0" 229 | 230 | color-convert@^2.0.1: 231 | version "2.0.1" 232 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 233 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 234 | dependencies: 235 | color-name "~1.1.4" 236 | 237 | color-name@~1.1.4: 238 | version "1.1.4" 239 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 240 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 241 | 242 | concat-map@0.0.1: 243 | version "0.0.1" 244 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 245 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 246 | 247 | content-disposition@0.5.4: 248 | version "0.5.4" 249 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 250 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 251 | dependencies: 252 | safe-buffer "5.2.1" 253 | 254 | content-type@~1.0.4: 255 | version "1.0.5" 256 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 257 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 258 | 259 | cookie-signature@1.0.6: 260 | version "1.0.6" 261 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 262 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 263 | 264 | cookie@0.5.0: 265 | version "0.5.0" 266 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 267 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 268 | 269 | create-require@^1.1.0: 270 | version "1.1.1" 271 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 272 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 273 | 274 | debug@2.6.9: 275 | version "2.6.9" 276 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 277 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 278 | dependencies: 279 | ms "2.0.0" 280 | 281 | depd@2.0.0: 282 | version "2.0.0" 283 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 284 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 285 | 286 | destroy@1.2.0: 287 | version "1.2.0" 288 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 289 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 290 | 291 | diff@^4.0.1: 292 | version "4.0.2" 293 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 294 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 295 | 296 | ee-first@1.1.1: 297 | version "1.1.1" 298 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 299 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 300 | 301 | encodeurl@~1.0.2: 302 | version "1.0.2" 303 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 304 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 305 | 306 | escape-html@~1.0.3: 307 | version "1.0.3" 308 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 309 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 310 | 311 | etag@~1.8.1: 312 | version "1.8.1" 313 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 314 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 315 | 316 | express@^4.18.2: 317 | version "4.18.2" 318 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 319 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 320 | dependencies: 321 | accepts "~1.3.8" 322 | array-flatten "1.1.1" 323 | body-parser "1.20.1" 324 | content-disposition "0.5.4" 325 | content-type "~1.0.4" 326 | cookie "0.5.0" 327 | cookie-signature "1.0.6" 328 | debug "2.6.9" 329 | depd "2.0.0" 330 | encodeurl "~1.0.2" 331 | escape-html "~1.0.3" 332 | etag "~1.8.1" 333 | finalhandler "1.2.0" 334 | fresh "0.5.2" 335 | http-errors "2.0.0" 336 | merge-descriptors "1.0.1" 337 | methods "~1.1.2" 338 | on-finished "2.4.1" 339 | parseurl "~1.3.3" 340 | path-to-regexp "0.1.7" 341 | proxy-addr "~2.0.7" 342 | qs "6.11.0" 343 | range-parser "~1.2.1" 344 | safe-buffer "5.2.1" 345 | send "0.18.0" 346 | serve-static "1.15.0" 347 | setprototypeof "1.2.0" 348 | statuses "2.0.1" 349 | type-is "~1.6.18" 350 | utils-merge "1.0.1" 351 | vary "~1.1.2" 352 | 353 | fd-slicer@~1.1.0: 354 | version "1.1.0" 355 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 356 | integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== 357 | dependencies: 358 | pend "~1.2.0" 359 | 360 | finalhandler@1.2.0: 361 | version "1.2.0" 362 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 363 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 364 | dependencies: 365 | debug "2.6.9" 366 | encodeurl "~1.0.2" 367 | escape-html "~1.0.3" 368 | on-finished "2.4.1" 369 | parseurl "~1.3.3" 370 | statuses "2.0.1" 371 | unpipe "~1.0.0" 372 | 373 | finalhandler@~1.1.2: 374 | version "1.1.2" 375 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 376 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 377 | dependencies: 378 | debug "2.6.9" 379 | encodeurl "~1.0.2" 380 | escape-html "~1.0.3" 381 | on-finished "~2.3.0" 382 | parseurl "~1.3.3" 383 | statuses "~1.5.0" 384 | unpipe "~1.0.0" 385 | 386 | forwarded@0.2.0: 387 | version "0.2.0" 388 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 389 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 390 | 391 | fresh@0.5.2: 392 | version "0.5.2" 393 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 394 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 395 | 396 | fs.realpath@^1.0.0: 397 | version "1.0.0" 398 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 399 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 400 | 401 | function-bind@^1.1.1: 402 | version "1.1.1" 403 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 404 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 405 | 406 | geoip-lite@^1.4.7: 407 | version "1.4.7" 408 | resolved "https://registry.yarnpkg.com/geoip-lite/-/geoip-lite-1.4.7.tgz#0142051023e3a2fb12bd539c5d627dcaff69af74" 409 | integrity sha512-JQHntlH7B/nR6Ec8ZJTuKsSdRNrR+snrfBNy0y0wVYWyVVi/MoDlXyv7P3wmozdlyshta6rXfbtK7qu/9lvEog== 410 | dependencies: 411 | async "2.1 - 2.6.4" 412 | chalk "4.1 - 4.1.2" 413 | iconv-lite "0.4.13 - 0.6.3" 414 | ip-address "5.8.9 - 5.9.4" 415 | lazy "1.0.11" 416 | rimraf "2.5.2 - 2.7.1" 417 | yauzl "2.9.2 - 2.10.0" 418 | 419 | get-intrinsic@^1.0.2: 420 | version "1.2.0" 421 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" 422 | integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== 423 | dependencies: 424 | function-bind "^1.1.1" 425 | has "^1.0.3" 426 | has-symbols "^1.0.3" 427 | 428 | glob@^7.1.3: 429 | version "7.2.3" 430 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 431 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 432 | dependencies: 433 | fs.realpath "^1.0.0" 434 | inflight "^1.0.4" 435 | inherits "2" 436 | minimatch "^3.1.1" 437 | once "^1.3.0" 438 | path-is-absolute "^1.0.0" 439 | 440 | has-flag@^4.0.0: 441 | version "4.0.0" 442 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 443 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 444 | 445 | has-symbols@^1.0.3: 446 | version "1.0.3" 447 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 448 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 449 | 450 | has@^1.0.3: 451 | version "1.0.3" 452 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 453 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 454 | dependencies: 455 | function-bind "^1.1.1" 456 | 457 | http-errors@2.0.0: 458 | version "2.0.0" 459 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 460 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 461 | dependencies: 462 | depd "2.0.0" 463 | inherits "2.0.4" 464 | setprototypeof "1.2.0" 465 | statuses "2.0.1" 466 | toidentifier "1.0.1" 467 | 468 | "iconv-lite@0.4.13 - 0.6.3": 469 | version "0.6.3" 470 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 471 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 472 | dependencies: 473 | safer-buffer ">= 2.1.2 < 3.0.0" 474 | 475 | iconv-lite@0.4.24: 476 | version "0.4.24" 477 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 478 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 479 | dependencies: 480 | safer-buffer ">= 2.1.2 < 3" 481 | 482 | inflight@^1.0.4: 483 | version "1.0.6" 484 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 485 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 486 | dependencies: 487 | once "^1.3.0" 488 | wrappy "1" 489 | 490 | inherits@2, inherits@2.0.4: 491 | version "2.0.4" 492 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 493 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 494 | 495 | "ip-address@5.8.9 - 5.9.4": 496 | version "5.9.4" 497 | resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-5.9.4.tgz#4660ac261ad61bd397a860a007f7e98e4eaee386" 498 | integrity sha512-dHkI3/YNJq4b/qQaz+c8LuarD3pY24JqZWfjB8aZx1gtpc2MDILu9L9jpZe1sHpzo/yWFweQVn+U//FhazUxmw== 499 | dependencies: 500 | jsbn "1.1.0" 501 | lodash "^4.17.15" 502 | sprintf-js "1.1.2" 503 | 504 | ipaddr.js@1.9.1: 505 | version "1.9.1" 506 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 507 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 508 | 509 | jsbn@1.1.0: 510 | version "1.1.0" 511 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" 512 | integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== 513 | 514 | lazy@1.0.11: 515 | version "1.0.11" 516 | resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" 517 | integrity sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== 518 | 519 | lodash@^4.17.14, lodash@^4.17.15: 520 | version "4.17.21" 521 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 522 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 523 | 524 | make-error@^1.1.1: 525 | version "1.3.6" 526 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 527 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 528 | 529 | media-typer@0.3.0: 530 | version "0.3.0" 531 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 532 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 533 | 534 | merge-descriptors@1.0.1: 535 | version "1.0.1" 536 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 537 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 538 | 539 | methods@~1.1.2: 540 | version "1.1.2" 541 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 542 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 543 | 544 | mime-db@1.52.0: 545 | version "1.52.0" 546 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 547 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 548 | 549 | mime-types@~2.1.24, mime-types@~2.1.34: 550 | version "2.1.35" 551 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 552 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 553 | dependencies: 554 | mime-db "1.52.0" 555 | 556 | mime@1.6.0: 557 | version "1.6.0" 558 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 559 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 560 | 561 | minimatch@^3.1.1: 562 | version "3.1.2" 563 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 564 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 565 | dependencies: 566 | brace-expansion "^1.1.7" 567 | 568 | ms@2.0.0: 569 | version "2.0.0" 570 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 571 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 572 | 573 | ms@2.1.3: 574 | version "2.1.3" 575 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 576 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 577 | 578 | negotiator@0.6.3: 579 | version "0.6.3" 580 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 581 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 582 | 583 | node-fetch@^2.6.1: 584 | version "2.6.9" 585 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" 586 | integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== 587 | dependencies: 588 | whatwg-url "^5.0.0" 589 | 590 | object-inspect@^1.9.0: 591 | version "1.12.3" 592 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 593 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 594 | 595 | on-finished@2.4.1: 596 | version "2.4.1" 597 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 598 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 599 | dependencies: 600 | ee-first "1.1.1" 601 | 602 | on-finished@~2.3.0: 603 | version "2.3.0" 604 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 605 | integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== 606 | dependencies: 607 | ee-first "1.1.1" 608 | 609 | once@^1.3.0: 610 | version "1.4.0" 611 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 612 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 613 | dependencies: 614 | wrappy "1" 615 | 616 | packet-reader@1.0.0: 617 | version "1.0.0" 618 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" 619 | integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== 620 | 621 | parseurl@~1.3.3: 622 | version "1.3.3" 623 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 624 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 625 | 626 | path-is-absolute@^1.0.0: 627 | version "1.0.1" 628 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 629 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 630 | 631 | path-to-regexp@0.1.7: 632 | version "0.1.7" 633 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 634 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 635 | 636 | pend@~1.2.0: 637 | version "1.2.0" 638 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 639 | integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== 640 | 641 | pg-connection-string@^2.5.0: 642 | version "2.5.0" 643 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" 644 | integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== 645 | 646 | pg-int8@1.0.1: 647 | version "1.0.1" 648 | resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" 649 | integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== 650 | 651 | pg-pool@^3.6.0: 652 | version "3.6.0" 653 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.0.tgz#3190df3e4747a0d23e5e9e8045bcd99bda0a712e" 654 | integrity sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ== 655 | 656 | pg-protocol@*, pg-protocol@^1.6.0: 657 | version "1.6.0" 658 | resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" 659 | integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== 660 | 661 | pg-types@^2.1.0, pg-types@^2.2.0: 662 | version "2.2.0" 663 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" 664 | integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== 665 | dependencies: 666 | pg-int8 "1.0.1" 667 | postgres-array "~2.0.0" 668 | postgres-bytea "~1.0.0" 669 | postgres-date "~1.0.4" 670 | postgres-interval "^1.1.0" 671 | 672 | pg@^8.10.0: 673 | version "8.10.0" 674 | resolved "https://registry.yarnpkg.com/pg/-/pg-8.10.0.tgz#5b8379c9b4a36451d110fc8cd98fc325fe62ad24" 675 | integrity sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ== 676 | dependencies: 677 | buffer-writer "2.0.0" 678 | packet-reader "1.0.0" 679 | pg-connection-string "^2.5.0" 680 | pg-pool "^3.6.0" 681 | pg-protocol "^1.6.0" 682 | pg-types "^2.1.0" 683 | pgpass "1.x" 684 | 685 | pgpass@1.x: 686 | version "1.0.5" 687 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" 688 | integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== 689 | dependencies: 690 | split2 "^4.1.0" 691 | 692 | postgres-array@~2.0.0: 693 | version "2.0.0" 694 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" 695 | integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== 696 | 697 | postgres-bytea@~1.0.0: 698 | version "1.0.0" 699 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 700 | integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== 701 | 702 | postgres-date@~1.0.4: 703 | version "1.0.7" 704 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" 705 | integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== 706 | 707 | postgres-interval@^1.1.0: 708 | version "1.2.0" 709 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" 710 | integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== 711 | dependencies: 712 | xtend "^4.0.0" 713 | 714 | proxy-addr@~2.0.7: 715 | version "2.0.7" 716 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 717 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 718 | dependencies: 719 | forwarded "0.2.0" 720 | ipaddr.js "1.9.1" 721 | 722 | qs@6.11.0: 723 | version "6.11.0" 724 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 725 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 726 | dependencies: 727 | side-channel "^1.0.4" 728 | 729 | range-parser@~1.2.1: 730 | version "1.2.1" 731 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 732 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 733 | 734 | raw-body@2.5.1: 735 | version "2.5.1" 736 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 737 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 738 | dependencies: 739 | bytes "3.1.2" 740 | http-errors "2.0.0" 741 | iconv-lite "0.4.24" 742 | unpipe "1.0.0" 743 | 744 | "rimraf@2.5.2 - 2.7.1": 745 | version "2.7.1" 746 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 747 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 748 | dependencies: 749 | glob "^7.1.3" 750 | 751 | safe-buffer@5.2.1: 752 | version "5.2.1" 753 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 754 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 755 | 756 | "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": 757 | version "2.1.2" 758 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 759 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 760 | 761 | send@0.18.0: 762 | version "0.18.0" 763 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 764 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 765 | dependencies: 766 | debug "2.6.9" 767 | depd "2.0.0" 768 | destroy "1.2.0" 769 | encodeurl "~1.0.2" 770 | escape-html "~1.0.3" 771 | etag "~1.8.1" 772 | fresh "0.5.2" 773 | http-errors "2.0.0" 774 | mime "1.6.0" 775 | ms "2.1.3" 776 | on-finished "2.4.1" 777 | range-parser "~1.2.1" 778 | statuses "2.0.1" 779 | 780 | serve-static@1.15.0: 781 | version "1.15.0" 782 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 783 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 784 | dependencies: 785 | encodeurl "~1.0.2" 786 | escape-html "~1.0.3" 787 | parseurl "~1.3.3" 788 | send "0.18.0" 789 | 790 | setprototypeof@1.2.0: 791 | version "1.2.0" 792 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 793 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 794 | 795 | side-channel@^1.0.4: 796 | version "1.0.4" 797 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 798 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 799 | dependencies: 800 | call-bind "^1.0.0" 801 | get-intrinsic "^1.0.2" 802 | object-inspect "^1.9.0" 803 | 804 | split2@^4.1.0: 805 | version "4.1.0" 806 | resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" 807 | integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== 808 | 809 | sprintf-js@1.1.2: 810 | version "1.1.2" 811 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" 812 | integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== 813 | 814 | stack-trace@0.0.10: 815 | version "0.0.10" 816 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 817 | integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== 818 | 819 | statuses@2.0.1: 820 | version "2.0.1" 821 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 822 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 823 | 824 | statuses@~1.5.0: 825 | version "1.5.0" 826 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 827 | integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== 828 | 829 | supports-color@^7.1.0: 830 | version "7.2.0" 831 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 832 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 833 | dependencies: 834 | has-flag "^4.0.0" 835 | 836 | toidentifier@1.0.1: 837 | version "1.0.1" 838 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 839 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 840 | 841 | tr46@~0.0.3: 842 | version "0.0.3" 843 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 844 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 845 | 846 | treblle@^1.3.0: 847 | version "1.3.0" 848 | resolved "https://registry.yarnpkg.com/treblle/-/treblle-1.3.0.tgz#177c812c63d574d2728a1cb253b26b0766d0b492" 849 | integrity sha512-6ccpJeuojCdNGQAa+TDF1ZU2K4oYYx674TlwQSWkejP/rCug2eAfdbAl7sxN48X8WYypxN2G0NdYtFL3nJzDCA== 850 | dependencies: 851 | finalhandler "~1.1.2" 852 | node-fetch "^2.6.1" 853 | stack-trace "0.0.10" 854 | 855 | ts-node@^10.9.1: 856 | version "10.9.1" 857 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 858 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 859 | dependencies: 860 | "@cspotcode/source-map-support" "^0.8.0" 861 | "@tsconfig/node10" "^1.0.7" 862 | "@tsconfig/node12" "^1.0.7" 863 | "@tsconfig/node14" "^1.0.0" 864 | "@tsconfig/node16" "^1.0.2" 865 | acorn "^8.4.1" 866 | acorn-walk "^8.1.1" 867 | arg "^4.1.0" 868 | create-require "^1.1.0" 869 | diff "^4.0.1" 870 | make-error "^1.1.1" 871 | v8-compile-cache-lib "^3.0.1" 872 | yn "3.1.1" 873 | 874 | type-is@~1.6.18: 875 | version "1.6.18" 876 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 877 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 878 | dependencies: 879 | media-typer "0.3.0" 880 | mime-types "~2.1.24" 881 | 882 | typescript@^5.0.2: 883 | version "5.0.2" 884 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.2.tgz#891e1a90c5189d8506af64b9ef929fca99ba1ee5" 885 | integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw== 886 | 887 | unpipe@1.0.0, unpipe@~1.0.0: 888 | version "1.0.0" 889 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 890 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 891 | 892 | utils-merge@1.0.1: 893 | version "1.0.1" 894 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 895 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 896 | 897 | v8-compile-cache-lib@^3.0.1: 898 | version "3.0.1" 899 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 900 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 901 | 902 | vary@~1.1.2: 903 | version "1.1.2" 904 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 905 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 906 | 907 | webidl-conversions@^3.0.0: 908 | version "3.0.1" 909 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 910 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 911 | 912 | whatwg-url@^5.0.0: 913 | version "5.0.0" 914 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 915 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 916 | dependencies: 917 | tr46 "~0.0.3" 918 | webidl-conversions "^3.0.0" 919 | 920 | wrappy@1: 921 | version "1.0.2" 922 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 923 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 924 | 925 | xtend@^4.0.0: 926 | version "4.0.2" 927 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 928 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 929 | 930 | "yauzl@2.9.2 - 2.10.0": 931 | version "2.10.0" 932 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 933 | integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== 934 | dependencies: 935 | buffer-crc32 "~0.2.3" 936 | fd-slicer "~1.1.0" 937 | 938 | yn@3.1.1: 939 | version "3.1.1" 940 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 941 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 942 | --------------------------------------------------------------------------------