diff --git a/.eslintignore b/.eslintignore index cfb65b3..72d4a68 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ .eslintrc.js +**/migrations/** # compiled output /dist diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 79f977a..ca8d067 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,6 +4,7 @@ A quick overview of the "why" of this PR to help reviewers If applicable, provide links to GitHub issues --> + [GitHub Issue](https://github.com/jondeaves/venom/issues/XXX) ## Description @@ -21,6 +22,10 @@ create a new one? Link to PRs or describe manual steps --> + + ## Testing diff --git a/README.md b/README.md index c36ec9f..9dc8801 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ At a minimum you need to provide the Discord bots Token (which can be found on t | LOG_LEVEL | What level of logs should be displayed in console | `error`, `warn`, `info`, `verbose`, `debug` or `silly` | | MONGODB_URI | Full connection string for MongoDB database, include db_name if user is scoped to single database | mongodb://user:password@localhost:27017/venom_db | | MONGODB_DB_NAME | The name of the database to use for this project | venom_db | +| DATABASE_URL | Full connection string for Postgres database | postgres://user:password@localhost:5432/db_name | ### Bot commands diff --git a/docs/development/environments.md b/docs/development/environments.md index 2ddb922..3104360 100644 --- a/docs/development/environments.md +++ b/docs/development/environments.md @@ -27,13 +27,17 @@ The best way to test new work is to add the test bot you created above to a diff ## MongoDB Instance -The bot uses MongoDB to store it's data, as a consequence of this you will need to have your own instance of MongoDB if you wish to run the bot yourself. If you don't want to install an instance on your own machine then we can recommend [mLab](https://mlab.com/), as this will be as close to the production version as possible. +The bot uses MongoDB to store it's data, as a consequence of this you will need to have your own instance of MongoDB if you wish to run the bot yourself. If you don't want to install an instance on your own machine then we can recommend [mLab](https://mlab.com/), as this will be as close to the production version as possible and is free. + +## Postgres Instance + +The bot uses Postgres to store more structured data, as a consequence of this you will need to have your own instance of Postgres if you wish to run the bot yourself. If you don't want to install an instance on your own machine then we can recommend [ElephantSQL](elephantsql.com), as this will be as close to the production version as possible and is free. ## Final thoughts Once the above has been completed you can then run your bot locally, ensuring you set the values in `src/.env` to match those provided throughtout the steps above. You may also wish to set the following values. -- Set `BOT_TRIGGER` to `venom test ` or something similarly unique. Ensuring you don't confuse your bot with another. +- Set `BOT_TRIGGER` to `venom test` or something similarly unique. Ensuring you don't confuse your bot with another. - Set `LOG_LEVEL` to `verbose` to see all possible log information. - Set `ENVIRONMENT` to `development`. - As mentioned above, set `DISCORD_BOT_TOKEN` to the value taken from the "Bot" tab of the Discord developer Application. diff --git a/docs/development/typeorm.md b/docs/development/typeorm.md new file mode 100644 index 0000000..2b55c34 --- /dev/null +++ b/docs/development/typeorm.md @@ -0,0 +1,33 @@ +# TypeORM + +The project uses TypeORM to interact with a Postgres database for times when more structured/related data needs to be stored and retrieved. + +For full documentation on usage refer to the [TypeORM website](https://typeorm.io/). + +## Usage + +### Entities + +> [Entity](https://typeorm.io/#/entities) is a class that maps to a database table (or collection when using MongoDB). You can create an entity by defining a new class and mark it with @Entity(): + +### Migrations + +In order to ensure databases are up-to-date and in-sync between environments we use the [TypeORM built-in migrations](https://typeorm.io/#/migrations). + +This boils down to running the command; + +```bash +yarn migrate:generate -n [name_describing_migration_or_feature] +``` + +This will automatically generate a file in the `src/migrations` folder. From here you run; + +```bash +yarn migrate +``` + +Which will actually make the changes to whatever database is defined in the `src/.env` environment file. This should be automated by the CI but at this time it must be done manually for production. Easiest way for this to happen is to have the production connection url commented out in the environment file so it can be quickly toggled on/off. + +### Seeding + +The seeding we have implemented is rudamentary but does the trick for now. It is really just a script that triggers TypeORM inserts while being able to truncate/clear data on each run. There is an initial seed file located at `src\seed\characters.ts` as a point of reference. diff --git a/ormconfig.ts b/ormconfig.ts new file mode 100644 index 0000000..ab24287 --- /dev/null +++ b/ormconfig.ts @@ -0,0 +1,17 @@ +import path from 'path'; +import { ConnectionOptions } from 'typeorm'; +import dotenv from 'dotenv'; + +dotenv.config({ path: path.resolve(__dirname, 'src/', '.env') }); + +const config: ConnectionOptions = { + type: 'postgres', + url: process.env.DATABASE_URL, + entities: [path.resolve(__dirname, 'src/**/*.entity{.ts,.js}')], + migrations: [path.resolve(__dirname, 'src/migrations/**/*.ts')], + cli: { + migrationsDir: 'src/migrations', + }, +}; + +export = config; diff --git a/package.json b/package.json index fabe915..07940a5 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,10 @@ "start": "node dist/main.js", "start:dev": "nodemon", "test": "nyc --require ts-node/register mocha src/**/*.spec.ts --reporter spec --retries 3 --require 'node_modules/reflect-metadata/Reflect.js' --exit", + "typeorm:cli": "ts-node ./node_modules/typeorm/cli -f ./ormconfig.ts", + "migrate:generate": "ts-node ./node_modules/typeorm/cli -f ./ormconfig.ts migration:generate", + "migrate": "ts-node ./node_modules/typeorm/cli -f ./ormconfig.ts migration:run", + "seed": "ts-node ./src/seed/index.ts", "lint": "lint:code", "lint:code": "eslint src/**/*.{ts,js}", "lint:markdown": "markdownlint **/*.md", @@ -30,7 +34,9 @@ "dotenv": "~8.2.0", "inversify": "~5.0.1", "mongodb": "~3.6.0", + "pg": "^8.3.0", "reflect-metadata": "~0.1.13", + "typeorm": "^0.2.25", "winston": "~3.3.3" }, "devDependencies": { @@ -39,6 +45,7 @@ "@types/chai": "^4.2.12", "@types/chai-as-promised": "^7.1.3", "@types/dotenv": "~8.2.0", + "@types/faker": "^4.1.12", "@types/mocha": "^8.0.2", "@types/mongodb": "~3.5.25", "@types/node": "~14.0.27", @@ -61,6 +68,7 @@ "eslint-plugin-promise": "^4.2.1", "eslint-plugin-react": "^7.20.6", "eslint-plugin-unicorn": "^21.0.0", + "faker": "^4.1.0", "husky": "^4.2.5", "lint-staged": "^10.2.11", "markdownlint-cli": "^0.23.2", diff --git a/src/.env.template b/src/.env.template index 47195ab..c0d5704 100644 --- a/src/.env.template +++ b/src/.env.template @@ -2,5 +2,6 @@ BOT_TRIGGER=! DISCORD_BOT_TOKEN=[replace with own token] MONGODB_URI=[mongo_connection_string] MONGODB_DB_NAME=[mongo_db_name] +DATABASE_URL=[postgres_connection_string] NODE_ENV=production LOG_LEVEL=error \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index 8d0eda4..50b28cb 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,6 +4,7 @@ import { exit } from 'process'; import container from './inversity.config'; import ConfigService from './core/services/config.service'; +import DatabaseService from './core/services/database.service'; import LoggerService from './core/services/logger.service'; import MongoService from './core/services/mongo.service'; @@ -15,13 +16,16 @@ export default class App { private _loggerService: LoggerService = container.resolve(LoggerService); - private _dbService: MongoService = container.resolve(MongoService); + private _mongoService: MongoService = container.resolve(MongoService); + + private _databaseService: DatabaseService = container.resolve(DatabaseService); private _discordClient: Discord.Client; public async init(): Promise { try { - await this._dbService.connect(); + await this._mongoService.connect(); + await this._databaseService.connect(); } catch (error) { this._loggerService.log('error', 'Cannot connect to database, exiting.', { error }); exit(1); @@ -55,7 +59,7 @@ export default class App { message.reply("looks like I haven't learned that trick yet!"); } else { try { - await command.execute(message, args, prefix, commandList, this._dbService); + await command.execute(message, args, prefix, commandList, this._mongoService, this._databaseService); } catch (error) { this._loggerService.log('error', error.message); message.reply('there was an error trying to follow that command!'); @@ -92,6 +96,7 @@ export default class App { } public exit(): void { - this._dbService.disconnect(); + this._mongoService.disconnect(); + this._databaseService.disconnect(); } } diff --git a/src/bot/commands/ICommand.ts b/src/bot/commands/ICommand.ts index 035cfc0..481c8dd 100644 --- a/src/bot/commands/ICommand.ts +++ b/src/bot/commands/ICommand.ts @@ -1,6 +1,7 @@ import Discord, { Collection } from 'discord.js'; import MongoService from '../../core/services/mongo.service'; +import DatabaseService from '../../core/services/database.service'; export default interface ICommand { name: string; @@ -12,6 +13,7 @@ export default interface ICommand { args: string[], prefix?: string, commands?: Collection, - dbService?: MongoService, + mongoService?: MongoService, + databaseService?: DatabaseService, ) => Promise; } diff --git a/src/bot/commands/character.ts b/src/bot/commands/character.ts new file mode 100644 index 0000000..5c667f1 --- /dev/null +++ b/src/bot/commands/character.ts @@ -0,0 +1,40 @@ +import Discord, { Collection } from 'discord.js'; + +import ConfigService from '../../core/services/config.service'; +import DatabaseService from '../../core/services/database.service'; +import MongoService from '../../core/services/mongo.service'; + +import container from '../../inversity.config'; + +import Character from '../../carp/character/character.entity'; + +import ICommand from './ICommand'; + +const prefix = container.resolve(ConfigService).get('BOT_TRIGGER'); + +const command: ICommand = { + name: 'character', + aliases: ['c'], + description: + 'Adds a string to the list greetings used when new users connect to server! Include `{name}` in your message to replace with the new users name.', + example: `\`${prefix}addgreeting Welcome to the club {name}\``, + async execute( + message: Discord.Message, + args: string[], + _prefix?: string, + _commands?: Collection, + _mongoService?: MongoService, + dbService?: DatabaseService, + ) { + // Just testing db stuff + const matchedChar = await dbService.manager.findOne(Character, message.author.id); + + if (!matchedChar) { + return message.reply(`Doesn't look like you have joined this campaign`); + } + + return message.reply(`Welcome back ${matchedChar.name}`); + }, +}; + +export default command; diff --git a/src/bot/commands/index.ts b/src/bot/commands/index.ts index 47916c8..b31ef14 100644 --- a/src/bot/commands/index.ts +++ b/src/bot/commands/index.ts @@ -3,5 +3,6 @@ import addgreeting from './addgreeting'; import help from './help'; import ping from './ping'; import see from './see'; +import character from './character'; -export default [help, ping, see, magicball, addgreeting]; +export default [help, ping, see, magicball, addgreeting, character]; diff --git a/src/carp/character/character.entity.ts b/src/carp/character/character.entity.ts new file mode 100644 index 0000000..18ad72d --- /dev/null +++ b/src/carp/character/character.entity.ts @@ -0,0 +1,10 @@ +import { Entity, Column, PrimaryColumn } from 'typeorm'; + +@Entity() +export default class Character { + @PrimaryColumn({ unique: true }) + uid: string; + + @Column() + name: string; +} diff --git a/src/core/services/config.service.ts b/src/core/services/config.service.ts index b9a2db2..1656eaf 100644 --- a/src/core/services/config.service.ts +++ b/src/core/services/config.service.ts @@ -24,6 +24,7 @@ export default class ConfigService { DISCORD_BOT_TOKEN: process.env.DISCORD_BOT_TOKEN, MONGODB_URI: process.env.MONGODB_URI || '', MONGODB_DB_NAME: process.env.MONGODB_DB_NAME || '', + DATABASE_URL: process.env.DATABASE_URL || '', NODE_ENV: (process.env.NODE_ENV as Environment) || 'development', LOG_LEVEL: (process.env.LOG_LEVEL as LogLevel) || 'info', }; diff --git a/src/core/services/database.service.ts b/src/core/services/database.service.ts new file mode 100644 index 0000000..cec3f72 --- /dev/null +++ b/src/core/services/database.service.ts @@ -0,0 +1,40 @@ +import { injectable } from 'inversify'; +import path from 'path'; +import { createConnection, Connection, EntityManager } from 'typeorm'; + +// eslint-disable-next-line import/no-cycle +import container from '../../inversity.config'; + +import ConfigService from './config.service'; +// eslint-disable-next-line import/no-cycle +import LoggerService from './logger.service'; + +@injectable() +export default class DatabaseService { + private _configService: ConfigService = container.resolve(ConfigService); + + private _loggerService: LoggerService = container.resolve(LoggerService); + + public _connection: Connection; + + public get manager(): EntityManager { + return this._connection.manager; + } + + public async connect(): Promise { + this._connection = await createConnection({ + type: 'postgres', + url: this._configService.get('DATABASE_URL'), + entities: [path.resolve(__dirname, '../../**/*.entity{.ts,.js}')], + synchronize: true, + }); + + this._loggerService.log('info', 'Venom is connected to Postgres'); + } + + public disconnect(): void { + if (this._connection && this._connection.isConnected) { + this._connection.close(); + } + } +} diff --git a/src/core/services/mongo.service.ts b/src/core/services/mongo.service.ts index 49fe869..3b1d60b 100644 --- a/src/core/services/mongo.service.ts +++ b/src/core/services/mongo.service.ts @@ -1,5 +1,5 @@ import { injectable } from 'inversify'; -import mongodb, { Collection, CollectionInsertOneOptions } from 'mongodb'; +import mongodb, { Collection } from 'mongodb'; // eslint-disable-next-line import/no-cycle import container from '../../inversity.config'; diff --git a/src/core/types/Config.ts b/src/core/types/Config.ts index 085c6c6..4b84192 100644 --- a/src/core/types/Config.ts +++ b/src/core/types/Config.ts @@ -6,6 +6,7 @@ export default interface Config { DISCORD_BOT_TOKEN: string; MONGODB_URI: string; MONGODB_DB_NAME: string; + DATABASE_URL: string; NODE_ENV: Environment; LOG_LEVEL: LogLevel; } diff --git a/src/inversity.config.ts b/src/inversity.config.ts index 1c50666..5eca19c 100644 --- a/src/inversity.config.ts +++ b/src/inversity.config.ts @@ -6,11 +6,14 @@ import HttpService from './core/services/http.service'; import LoggerService from './core/services/logger.service'; // eslint-disable-next-line import/no-cycle import MongoService from './core/services/mongo.service'; +// eslint-disable-next-line import/no-cycle +import DatabaseService from './core/services/database.service'; const container = new Container(); container.bind(ConfigService).toSelf(); container.bind(HttpService).toSelf(); container.bind(LoggerService).toSelf(); container.bind(MongoService).toSelf(); +container.bind(DatabaseService).toSelf(); export default container; diff --git a/src/main.ts b/src/main.ts index 2b7731a..abbd1f4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -6,6 +6,7 @@ import 'reflect-metadata'; import App from './app'; +// Load config dotenv.config({ path: path.resolve(__dirname, './', '.env') }); const app = new App(); diff --git a/src/migrations/1597437679213-basic_character.ts b/src/migrations/1597437679213-basic_character.ts new file mode 100644 index 0000000..027d427 --- /dev/null +++ b/src/migrations/1597437679213-basic_character.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class basicCharacter1597437679213 implements MigrationInterface { + name = 'basicCharacter1597437679213'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "character" ("uid" character varying NOT NULL, "name" character varying NOT NULL, CONSTRAINT "PK_1e68e7ffd5c106af49c1317e375" PRIMARY KEY ("uid"))`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "character"`); + } +} diff --git a/src/seed/characters.ts b/src/seed/characters.ts new file mode 100644 index 0000000..6969f51 --- /dev/null +++ b/src/seed/characters.ts @@ -0,0 +1,38 @@ +/* tslint:disable:no-console */ +import 'reflect-metadata'; + +import { Connection } from 'typeorm'; +// eslint-disable-next-line import/no-extraneous-dependencies +import faker from 'faker'; + +import Character from '../carp/character/character.entity'; +import { logSeedOutput } from './helpers'; + +export default async function seedCharacters(connection: Connection): Promise { + try { + // Clear our data + await connection.manager.query('TRUNCATE TABLE "character" CASCADE;'); + + const character = new Character(); + // Discord id looks to be a 16 character number, so let's fake it + character.uid = faker.random + .number({ + min: 1000000000000000, + max: 1999999999999999, + }) + .toString(); + character.name = 'Urthedak'; + + // Save data + const newCharacter = await connection.manager.save(character); + + logSeedOutput('Character', newCharacter); + + return [newCharacter]; + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + + return []; + } +} diff --git a/src/seed/helpers.ts b/src/seed/helpers.ts new file mode 100644 index 0000000..5a2bffe --- /dev/null +++ b/src/seed/helpers.ts @@ -0,0 +1,18 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable no-console */ +export function logSeedOutput(title: string, obj: any): void { + const titleStr = `${title} ${obj.id}`; + const titleCharCount = titleStr.length; + const boxWidth = 50; + const titleSpacer = (boxWidth - titleCharCount) / 2; + + console.log(`${'='.repeat(boxWidth)}`); + console.log(`${' '.repeat(titleSpacer)}${titleStr}${' '.repeat(titleSpacer)}`); + console.log(`${'='.repeat(boxWidth)}`); + console.log(obj); + console.log('\n\n'); +} +/* eslint-enable no-console */ +/* eslint-enable @typescript-eslint/no-explicit-any */ +/* eslint-enable @typescript-eslint/explicit-module-boundary-types */ diff --git a/src/seed/index.ts b/src/seed/index.ts new file mode 100644 index 0000000..e8e645e --- /dev/null +++ b/src/seed/index.ts @@ -0,0 +1,35 @@ +import 'reflect-metadata'; + +import path from 'path'; +import dotenv from 'dotenv'; + +import { createConnection } from 'typeorm'; + +import seedCharacters from './characters'; + +dotenv.config({ path: path.resolve(__dirname, '../', '.env') }); + +async function seed(): Promise { + try { + const connection = await createConnection({ + type: 'postgres', + url: process.env.DATABASE_URL, + entities: [path.resolve(__dirname, '../../**/*.entity{.ts,.js}')], + synchronize: true, + }); + + // These perform the actual seeding + const characters = await seedCharacters(connection); + + // eslint-disable-next-line no-console + console.log(characters); + + // Close things off + await connection.close(); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } +} + +seed(); diff --git a/yarn.lock b/yarn.lock index eaafbd9..694898f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -457,6 +457,11 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/faker@^4.1.12": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/faker/-/faker-4.1.12.tgz#065d37343677df1aa757c622650bd14666c42602" + integrity sha512-0MEyzJrLLs1WaOCx9ULK6FzdCSj2EuxdSP9kvuxxdBEGujZYUOZ4vkPXdgu3dhyg/pOdn7VCatelYX7k0YShlA== + "@types/json-schema@^7.0.3": version "7.0.5" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" @@ -681,6 +686,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.11.0" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -696,6 +706,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -711,6 +726,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -719,6 +739,11 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + append-transform@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" @@ -866,6 +891,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + binary-extensions@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" @@ -923,6 +953,19 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +buffer@^5.1.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -1019,6 +1062,17 @@ chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1100,6 +1154,18 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-highlight@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.4.tgz#098cb642cf17f42adc1c1145e07f960ec4d7522b" + integrity sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ== + dependencies: + chalk "^3.0.0" + highlight.js "^9.6.0" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^5.1.1" + yargs "^15.0.0" + cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -1721,6 +1787,11 @@ dotenv@*, dotenv@~8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== + dotgitignore@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/dotgitignore/-/dotgitignore-2.1.0.tgz#a4b15a4e4ef3cf383598aaf1dfa4a04bcc089b7b" @@ -1834,7 +1905,7 @@ escape-goat@^2.0.0: resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -2147,6 +2218,11 @@ extend@^3.0.0: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +faker@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" + integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2172,6 +2248,11 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41" integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== +figlet@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.0.tgz#2db4d00a584e5155a96080632db919213c3e003c" + integrity sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww== + figures@^3.1.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -2464,7 +2545,7 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.2: +glob@7.1.6, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.2: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -2551,6 +2632,13 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2591,6 +2679,11 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +highlight.js@^9.6.0: + version "9.18.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.3.tgz#a1a0a2028d5e3149e2380f8a865ee8516703d634" + integrity sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ== + hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -2627,6 +2720,11 @@ husky@^4.2.5: slash "^3.0.0" which-pm-runs "^1.0.0" +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -2690,7 +2788,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3582,6 +3680,11 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.5" +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mocha@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.1.tgz#1de1ba4e9a2c955d96b84e469d7540848223592d" @@ -3646,6 +3749,15 @@ multimap@^1.1.0: resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3968,6 +4080,11 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3975,6 +4092,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parent-require@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" + integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= + parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" @@ -4005,6 +4127,18 @@ parse-json@^5.0.0: json-parse-better-errors "^1.0.1" lines-and-columns "^1.1.6" +parse5-htmlparser2-tree-adapter@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz#e8c743d4e92194d5293ecde2b08be31e67461cbc" + integrity sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw== + dependencies: + parse5 "^5.1.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -4082,6 +4216,58 @@ pathval@^1.1.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pg-connection-string@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.3.0.tgz#c13fcb84c298d0bfa9ba12b40dd6c23d946f55d6" + integrity sha512-ukMTJXLI7/hZIwTW7hGMZJ0Lj0S2XQBCJ4Shv4y1zgQ/vqVea+FLhzywvPj0ujSuofu+yA4MYHGZPTsgjBgJ+w== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.2.1.tgz#5f4afc0f58063659aeefa952d36af49fa28b30e0" + integrity sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA== + +pg-protocol@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.2.5.tgz#28a1492cde11646ff2d2d06bdee42a3ba05f126c" + integrity sha512-1uYCckkuTfzz/FCefvavRywkowa6M5FohNMF5OjKrqo9PSR8gYc8poVmwwYQaBxhmQdBjhtP514eXy9/Us2xKg== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.3.0.tgz#941383300d38eef51ecb88a0188cec441ab64d81" + integrity sha512-jQPKWHWxbI09s/Z9aUvoTbvGgoj98AU7FDCcQ7kdejupn/TcNpx56v2gaOTzXkzOajmOEJEdi9eTh9cA2RVAjQ== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.3.0" + pg-pool "^3.2.1" + pg-protocol "^1.2.5" + pg-types "^2.1.0" + pgpass "1.x" + semver "4.3.2" + +pgpass@1.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" + integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= + dependencies: + split "^1.0.0" + picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -4147,6 +4333,28 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + +postgres-date@~1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.6.tgz#4925e8085b30c2ba1a06ac91b9a3473954a2ce2d" + integrity sha512-o2a4gxeFcox+CgB3Ig/kNHBP23PiEXHCXx7pcIIsvzoNz4qv+lKTyiSkjOXIMNUl12MO/mOYl2K6wR9X5K6Plg== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4408,7 +4616,7 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -reflect-metadata@*, reflect-metadata@~0.1.13: +reflect-metadata@*, reflect-metadata@^0.1.13, reflect-metadata@~0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== @@ -4557,7 +4765,7 @@ rxjs@^6.6.2: dependencies: tslib "^1.9.0" -safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4581,6 +4789,11 @@ saslprep@^1.0.0: dependencies: sparse-bitfield "^3.0.3" +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -4603,6 +4816,11 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" + integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= + semver@7.3.2, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" @@ -4630,6 +4848,14 @@ setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -4941,6 +5167,13 @@ stringify-package@^1.0.1: resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -5049,6 +5282,11 @@ supports-color@7.1.0, supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5103,6 +5341,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + through2@^2.0.0, through2@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -5255,6 +5507,27 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typeorm@^0.2.25: + version "0.2.25" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.25.tgz#1a33513b375b78cc7740d2405202208b918d7dde" + integrity sha512-yzQ995fyDy5wolSLK9cmjUNcmQdixaeEm2TnXB5HN++uKbs9TiR6Y7eYAHpDlAE8s9J1uniDBgytecCZVFergQ== + dependencies: + app-root-path "^3.0.0" + buffer "^5.1.0" + chalk "^2.4.2" + cli-highlight "^2.0.0" + debug "^4.1.1" + dotenv "^6.2.0" + glob "^7.1.2" + js-yaml "^3.13.1" + mkdirp "^1.0.3" + reflect-metadata "^0.1.13" + sha.js "^2.4.11" + tslib "^1.9.0" + xml2js "^0.4.17" + yargonaut "^1.1.2" + yargs "^13.2.1" + typescript@~3.9.7: version "3.9.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" @@ -5471,7 +5744,20 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xtend@~4.0.1: +xml2js@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -5486,6 +5772,15 @@ yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +yargonaut@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" + integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== + dependencies: + chalk "^1.1.1" + figlet "^1.1.1" + parent-require "^1.0.0" + yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -5528,7 +5823,7 @@ yargs-unparser@1.6.1: is-plain-obj "^1.1.0" yargs "^14.2.3" -yargs@13.3.2: +yargs@13.3.2, yargs@^13.2.1: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -5561,7 +5856,7 @@ yargs@^14.2.3: y18n "^4.0.0" yargs-parser "^15.0.1" -yargs@^15.0.2, yargs@^15.3.1: +yargs@^15.0.0, yargs@^15.0.2, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==