├── .gitignore ├── .npmignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.MD ├── README.md ├── README.npm.md ├── lib ├── baseModel.ts ├── commands │ ├── migrations.ts │ └── utils.ts ├── constants.ts ├── decorators.ts ├── exceptions │ ├── connectionNotFound.ts │ ├── index.ts │ ├── modelNotFound.ts │ └── repoError.ts ├── helpers.ts ├── index.ts ├── interfaces.ts ├── module.ts ├── options.ts ├── queryBuilders │ ├── custom.ts │ └── softDelete.ts ├── repositories │ ├── contract.ts │ └── database.ts └── service.ts ├── package-lock.json ├── package.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # IDE 5 | /.idea 6 | /.awcache 7 | /.vscode 8 | 9 | # misc 10 | npm-debug.log 11 | .DS_Store 12 | 13 | # tests 14 | /test 15 | /coverage 16 | /.nyc_output 17 | 18 | # dist 19 | dist -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # source 2 | lib 3 | tests 4 | index.ts 5 | package-lock.json 6 | tslint.json 7 | tsconfig.json 8 | .prettierrc 9 | 10 | # github 11 | cover.png 12 | .github 13 | CONTRIBUTING.MD 14 | 15 | # misc 16 | .commitlintrc.json 17 | .release-it.json 18 | .eslintignore 19 | .eslintrc.js -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at vinayaksarawagi25@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, please first discuss the change you wish to make via issue, 4 | email, or any other method with the owners of this repository before making a change. 5 | 6 | Please note we have a code of conduct, please follow it in all your interactions with the project. 7 | 8 | ## Pull Request Process 9 | 10 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a 11 | build. 12 | 2. Update the README.md with details of changes to the interface, this includes new environment 13 | variables, exposed ports, useful file locations and container parameters. 14 | 3. You may merge the Pull Request in once you have the sign-off of two other developers, or if you 15 | do not have permission to do that, you may request the second reviewer to merge it for you. 16 | 17 | ## Code of Conduct 18 | 19 | ### Our Pledge 20 | 21 | In the interest of fostering an open and welcoming environment, we as 22 | contributors and maintainers pledge to making participation in our project and 23 | our community a harassment-free experience for everyone, regardless of age, body 24 | size, disability, ethnicity, gender identity and expression, level of experience, 25 | nationality, personal appearance, race, religion, or sexual identity and 26 | orientation. 27 | 28 | ### Our Standards 29 | 30 | Examples of behavior that contributes to creating a positive environment 31 | include: 32 | 33 | * Using welcoming and inclusive language 34 | * Being respectful of differing viewpoints and experiences 35 | * Gracefully accepting constructive criticism 36 | * Focusing on what is best for the community 37 | * Showing empathy towards other community members 38 | 39 | Examples of unacceptable behavior by participants include: 40 | 41 | * The use of sexualized language or imagery and unwelcome sexual attention or 42 | advances 43 | * Trolling, insulting/derogatory comments, and personal or political attacks 44 | * Public or private harassment 45 | * Publishing others' private information, such as a physical or electronic 46 | address, without explicit permission 47 | * Other conduct which could reasonably be considered inappropriate in a 48 | professional setting 49 | 50 | ### Our Responsibilities 51 | 52 | Project maintainers are responsible for clarifying the standards of acceptable 53 | behavior and are expected to take appropriate and fair corrective action in 54 | response to any instances of unacceptable behavior. 55 | 56 | Project maintainers have the right and responsibility to remove, edit, or 57 | reject comments, commits, code, wiki edits, issues, and other contributions 58 | that are not aligned to this Code of Conduct, or to ban temporarily or 59 | permanently any contributor for other behaviors that they deem inappropriate, 60 | threatening, offensive, or harmful. 61 | 62 | ### Scope 63 | 64 | This Code of Conduct applies both within project spaces and in public spaces 65 | when an individual is representing the project or its community. Examples of 66 | representing a project or community include using an official project e-mail 67 | address, posting via an official social media account, or acting as an appointed 68 | representative at an online or offline event. Representation of a project may be 69 | further defined and clarified by project maintainers. 70 | 71 | ### Enforcement 72 | 73 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 74 | reported by contacting the project team at [INSERT EMAIL ADDRESS]. All 75 | complaints will be reviewed and investigated and will result in a response that 76 | is deemed necessary and appropriate to the circumstances. The project team is 77 | obligated to maintain confidentiality with regard to the reporter of an incident. 78 | Further details of specific enforcement policies may be posted separately. 79 | 80 | Project maintainers who do not follow or enforce the Code of Conduct in good 81 | faith may face temporary or permanent repercussions as determined by other 82 | members of the project's leadership. 83 | 84 | ### Attribution 85 | 86 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 87 | available at [http://contributor-covenant.org/version/1/4][version] 88 | 89 | [homepage]: http://contributor-covenant.org 90 | [version]: http://contributor-covenant.org/version/1/4/ 91 | -------------------------------------------------------------------------------- /LICENSE.MD: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright © 2020 [SquareBoat](https://squareboat.com) 4 | 5 | > Permission is hereby granted, free of charge, to any person obtaining a copy 6 | > of this software and associated documentation files (the "Software"), to deal 7 | > in the Software without restriction, including without limitation the rights 8 | > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | > copies of the Software, and to permit persons to whom the Software is 10 | > furnished to do so, subject to the following conditions: 11 | > 12 | > The above copyright notice and this permission notice shall be included in 13 | > all copies or substantial portions of the Software. 14 | > 15 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | > THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | Almost every application nowadays, requires a database to persist data. We have integrated [`ObjectionJS`](https://vincit.github.io/objection.js/) as our supported ORM. 4 | 5 | `ObjectionJS` provides very clean and fluent APIs to build and run complex queries at ease. We have worked in the past with many ORMs, but `ObjectionJS` stood out, it is relatively young but more mature in terms of its offerings. 6 | 7 | **Why we ❤️ ObjectionJS**: 8 | 9 | - ✅ Very clean and mature Query Builder 10 | - ✅ Fluent Relational Queries 11 | - ✅ Official Typescript Support 12 | - ✅ Clean Migrations and Seeders using [`KnexJS`](http://knexjs.org/) 13 | - ✅ Support for Hooks 14 | - ✅ Powerful model entity relation operations 15 | - ✅ Easy to use Transactions 16 | 17 | **What we have added on top of it?**: 18 | 19 | - ✅ Setting up project is now much easier than ever 20 | - ✅ Custom `BaseModel` having performant functions 21 | - ✅ In-built `DatabaseRepository` to help you maintain data store functions smartly 22 | - ✅ Beautiful console commands to manage migrations 23 | - ✅ Custom `QueryBuilder` with some much needed methods 24 | - ✅ Utilise multiple connections in repositories smartly. 25 | - ✅ Clean Transaction API using Repositories 26 | 27 | ## Documentation 28 | 29 | To read the complete documentation, [click here](https://squareboat.com/open-source/nestjs-boilerplate/database/introduction/). 30 | 31 | ## Contributing 32 | 33 | To know about contributing to this package, read the guidelines [here](./CONTRIBUTING.md) 34 | 35 | ## About Us 36 | 37 | We are a bunch of dreamers, designers, and futurists. We are high on collaboration, low on ego, and take our happy hours seriously. We'd love to hear more about your product. Let's talk and turn your great ideas into something even greater! We have something in store for everyone. [☎️ 📧 Connect with us!](https://squareboat.com/contact) 38 | 39 | ## License 40 | 41 | The MIT License. Please see License File for more information. Copyright © 2020 SquareBoat. 42 | 43 | Made with ❤️ by [Squareboat](https://squareboat.com) 44 | -------------------------------------------------------------------------------- /README.npm.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | Almost every application nowadays, requires a database to persist data. We have integrated [`ObjectionJS`](https://vincit.github.io/objection.js/) as our supported ORM. 4 | 5 | `ObjectionJS` provides very clean and fluent APIs to build and run complex queries at ease. We have worked in the past with many ORMs, but `ObjectionJS` stood out, it is relatively young but more mature in terms of its offerings. 6 | 7 | **Why we ❤️ ObjectionJS**: 8 | 9 | - ✅ Very clean and mature Query Builder 10 | - ✅ Fluent Relational Queries 11 | - ✅ Official Typescript Support 12 | - ✅ Clean Migrations and Seeders using [`KnexJS`](http://knexjs.org/) 13 | - ✅ Support for Hooks 14 | - ✅ Powerful model entity relation operations 15 | - ✅ Easy to use Transactions 16 | 17 | **What we have added on top of it?**: 18 | 19 | - ✅ Setting up project is now much easier than ever 20 | - ✅ Custom `BaseModel` having performant functions 21 | - ✅ In-built `DatabaseRepository` to help you maintain data store functions smartly 22 | - ✅ Beautiful console commands to manage migrations 23 | - ✅ Custom `QueryBuilder` with some much needed methods 24 | - ✅ Utilise multiple connections in repositories smartly. 25 | - ✅ Clean Transaction API using Repositories 26 | 27 | ## Documentation 28 | 29 | To read the complete documentation, [click here](https://squareboat.com/open-source/nestjs-boilerplate/database/introduction/). 30 | 31 | ## Contributing 32 | 33 | To know about contributing to this package, read the guidelines [here](./CONTRIBUTING.md) 34 | 35 | ## About Us 36 | 37 | We are a bunch of dreamers, designers, and futurists. We are high on collaboration, low on ego, and take our happy hours seriously. We'd love to hear more about your product. Let's talk and turn your great ideas into something even greater! We have something in store for everyone. [☎️ 📧 Connect with us!](https://squareboat.com/contact) 38 | 39 | ## License 40 | 41 | The MIT License. Please see License File for more information. Copyright © 2020 SquareBoat. 42 | 43 | Made with ❤️ by [Squareboat](https://squareboat.com) 44 | -------------------------------------------------------------------------------- /lib/baseModel.ts: -------------------------------------------------------------------------------- 1 | import { Model } from "objection"; 2 | import { LoadRelOptions, LoadRelSchema } from "./interfaces"; 3 | import { CustomQueryBuilder } from "./queryBuilders/custom"; 4 | import { SoftDeleteQueryBuilder } from "./queryBuilders/softDelete"; 5 | 6 | export class BaseModel extends Model { 7 | readonly id?: number | string; 8 | readonly deletedAt?: Date; 9 | 10 | /** 11 | * Specifies the connection to be used by the model. 12 | */ 13 | static connection: string; 14 | 15 | /** 16 | * Specifies if the model supports soft delete feature. 17 | */ 18 | static softDelete: boolean = false; 19 | 20 | QueryBuilderType!: CustomQueryBuilder | SoftDeleteQueryBuilder; 21 | 22 | static get QueryBuilder() { 23 | if (this.softDelete) return SoftDeleteQueryBuilder; 24 | 25 | return CustomQueryBuilder; 26 | } 27 | 28 | static useLimitInFirst = true; 29 | 30 | async $forceLoad( 31 | expression: LoadRelSchema, 32 | options?: LoadRelOptions 33 | ): Promise { 34 | await this.$fetchGraph(expression, { 35 | ...(options || {}), 36 | skipFetched: false, 37 | }); 38 | } 39 | 40 | async $load( 41 | expression: LoadRelSchema, 42 | options?: LoadRelOptions 43 | ): Promise { 44 | await this.$fetchGraph(expression, { 45 | skipFetched: true, 46 | ...(options || {}), 47 | }); 48 | 49 | return; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /lib/commands/migrations.ts: -------------------------------------------------------------------------------- 1 | import { Inject, Injectable } from "@nestjs/common"; 2 | import * as pc from "picocolors"; 3 | import { Command, ConsoleIO } from "@squareboat/nest-console"; 4 | import { ObjectionService } from "../service"; 5 | import { SquareboatNestObjection } from "../constants"; 6 | import { DatabaseOptions } from "../options"; 7 | 8 | @Injectable() 9 | export class DbOperationsCommand { 10 | constructor( 11 | @Inject(SquareboatNestObjection.databaseOptions) 12 | private options: DatabaseOptions 13 | ) {} 14 | 15 | @Command("migrate:status {--connection==}", { 16 | desc: "Command to show the status of all migrations", 17 | }) 18 | async migrateStatus(_cli: ConsoleIO): Promise { 19 | const conn = _cli.option("connection") || this.options.default; 20 | const knex = ObjectionService.connection(conn); 21 | const connConfig = this.options.connections[conn]; 22 | 23 | const [completed, pending]: Record[][] = 24 | await knex.migrate.list(connConfig.migrations); 25 | const statusList = []; 26 | 27 | for (const migration of completed) { 28 | statusList.push({ migration: migration.name, status: pc.green("Y") }); 29 | } 30 | 31 | for (const migration of pending) { 32 | statusList.push({ migration: migration.file, status: pc.red("N") }); 33 | } 34 | 35 | _cli.table(statusList); 36 | } 37 | 38 | @Command("migrate {--connection==}", { 39 | desc: "Command to run the pending migrations", 40 | }) 41 | async migrationUp(_cli: ConsoleIO): Promise { 42 | const conn = _cli.option("connection") || this.options.default; 43 | const knex = ObjectionService.connection(conn); 44 | const connConfig = this.options.connections[conn]; 45 | 46 | const [batch, migrations]: [number, string[]] = await knex.migrate.latest( 47 | connConfig.migrations 48 | ); 49 | 50 | if (migrations.length === 0) { 51 | _cli.info("No migrations to run"); 52 | return; 53 | } 54 | 55 | _cli.info(`Batch Number: ${batch}`); 56 | for (const migration of migrations) { 57 | _cli.success(migration); 58 | } 59 | } 60 | 61 | @Command("migrate:rollback {--connection==}", { 62 | desc: "Command to rollback the previous batch of migrations", 63 | }) 64 | async migrateRollback(_cli: ConsoleIO) { 65 | const conn = _cli.option("connection") || this.options.default; 66 | const knex = ObjectionService.connection(conn); 67 | const connConfig = this.options.connections[conn]; 68 | 69 | const [batch, migrations]: [number, string[]] = await knex.migrate.rollback( 70 | connConfig.migrations 71 | ); 72 | 73 | if (migrations.length === 0) { 74 | _cli.info("No migrations to rollback. Already at the base migration"); 75 | return; 76 | } 77 | 78 | _cli.info(`Reverted Batch: ${batch}`); 79 | for (const migration of migrations) { 80 | _cli.success(migration); 81 | } 82 | } 83 | 84 | @Command("migrate:reset {--connection==}", { 85 | desc: "Command to reset the migration", 86 | }) 87 | async migrateReset(_cli: ConsoleIO) { 88 | const conn = _cli.option("connection") || this.options.default; 89 | const knex = ObjectionService.connection(conn); 90 | const connConfig = this.options.connections[conn]; 91 | 92 | const confirm = await _cli.confirm( 93 | "Are you sure you want to reset your database? This action is irreversible." 94 | ); 95 | 96 | if (!confirm) { 97 | _cli.info("Thank you! Exiting..."); 98 | return; 99 | } 100 | 101 | const password = await _cli.password( 102 | "Please enter the password of the database to proceed" 103 | ); 104 | 105 | // if (connConfig.connection && typeof connConfig.connection != "string") { 106 | // if ( 107 | // connConfig.connection?["password"] && 108 | // password !== connConfig.connection?['password'] 109 | // ) { 110 | // _cli.error(" Wrong Password. Exiting... "); 111 | // return; 112 | // } 113 | // } 114 | 115 | const [, migrations]: [number, string[]] = await knex.migrate.down( 116 | connConfig.migrations 117 | ); 118 | 119 | if (migrations.length === 0) { 120 | _cli.info("No migrations to rollback. Already at the base migration"); 121 | return; 122 | } 123 | 124 | _cli.info("Rollback of following migrations are done:"); 125 | for (const migration of migrations) { 126 | _cli.success(migration); 127 | } 128 | } 129 | 130 | @Command("make:migration {name} {--connection=}", { 131 | desc: "Command to create a new migration", 132 | }) 133 | async makeMigration(_cli: ConsoleIO) { 134 | const name = _cli.argument("name"); 135 | const conn = _cli.option("connection") || this.options.default; 136 | const knex = ObjectionService.connection(conn); 137 | const connConfig = this.options.connections[conn]; 138 | 139 | const res = await knex.migrate.make(name, { 140 | directory: connConfig?.migrations?.directory, 141 | extension: "js", 142 | }); 143 | 144 | const paths = res.split("/"); 145 | _cli.success(paths[paths.length - 1]); 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /lib/commands/utils.ts: -------------------------------------------------------------------------------- 1 | import { Inject, Injectable } from '@nestjs/common'; 2 | import { Command, ConsoleIO } from '@squareboat/nest-console'; 3 | import { SquareboatNestObjection } from '../constants'; 4 | import { DatabaseOptions } from '../options'; 5 | import { ObjectionService } from '../service'; 6 | 7 | @Injectable() 8 | export class DatabaseUtilitiesCommand { 9 | constructor( 10 | @Inject(SquareboatNestObjection.databaseOptions) 11 | private options: DatabaseOptions, 12 | ) {} 13 | 14 | @Command('db:column-info {tableName} {--connection==}') 15 | async listColumnInfo(_cli: ConsoleIO): Promise { 16 | const conn = _cli.option('connection') || this.options.default; 17 | const knex = ObjectionService.connection(conn); 18 | const tableName = _cli.argument('tableName'); 19 | 20 | const columnInfo = await knex.table(tableName).columnInfo(); 21 | 22 | const arr = []; 23 | for (const column in columnInfo) { 24 | arr.push({ 25 | column, 26 | ...columnInfo[column], 27 | }); 28 | } 29 | 30 | _cli.table(arr); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/constants.ts: -------------------------------------------------------------------------------- 1 | export class SquareboatNestObjection { 2 | static dbConnection = '@squareboat/nestjs-objection/db_connection'; 3 | static databaseOptions = '@squareboat/nestjs-objection/db_options'; 4 | } 5 | -------------------------------------------------------------------------------- /lib/decorators.ts: -------------------------------------------------------------------------------- 1 | import { GenericFunction } from "./interfaces"; 2 | import { BaseModel } from "./baseModel"; 3 | 4 | export function InjectModel(model: any): GenericFunction { 5 | if (!(model.prototype instanceof BaseModel)) { 6 | throw new Error( 7 | `Instance of ${BaseModel.name} expected, ${typeof model} passed!` 8 | ); 9 | } 10 | 11 | return function (target: GenericFunction, key: string | symbol) { 12 | Object.assign(target, { 13 | [key]: model, 14 | }); 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /lib/exceptions/connectionNotFound.ts: -------------------------------------------------------------------------------- 1 | export class ConnectionNotFound extends Error { 2 | constructor(conName: string) { 3 | super( 4 | `${conName} not found! Please make sure you are passing correct connection name! Or alternatively, check if you have initialised ObjectionModule`, 5 | ); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/exceptions/index.ts: -------------------------------------------------------------------------------- 1 | export * from './connectionNotFound'; 2 | export * from './modelNotFound'; 3 | -------------------------------------------------------------------------------- /lib/exceptions/modelNotFound.ts: -------------------------------------------------------------------------------- 1 | import { HttpException } from '@nestjs/common'; 2 | 3 | export class ModelNotFound extends HttpException { 4 | constructor(modelName: string) { 5 | super(`${modelName} not found`, 404); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/exceptions/repoError.ts: -------------------------------------------------------------------------------- 1 | export class RepositoryError extends Error { 2 | constructor(msg: string) { 3 | super(msg); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lib/helpers.ts: -------------------------------------------------------------------------------- 1 | export function pick( 2 | obj: Record, 3 | props: string | string[], 4 | ): Record { 5 | const newObj = {} as Record; 6 | if (typeof props === 'string' && obj.hasOwnProperty(props)) { 7 | newObj[props] = obj[props]; 8 | } 9 | 10 | if (Array.isArray(props)) { 11 | for (const prop of props) { 12 | if (obj.hasOwnProperty(prop)) { 13 | newObj[prop] = obj[prop]; 14 | } 15 | } 16 | } 17 | 18 | return newObj; 19 | } 20 | -------------------------------------------------------------------------------- /lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./baseModel"; 2 | export * from "./decorators"; 3 | export * from "./queryBuilders/custom"; 4 | export * from "./queryBuilders/softDelete"; 5 | export * from "./repositories/contract"; 6 | export * from "./repositories/database"; 7 | export * from "./module"; 8 | export * from "./constants"; 9 | export * from "./interfaces"; 10 | export * from "./options"; 11 | export * from "./service"; 12 | export * from "./exceptions"; 13 | -------------------------------------------------------------------------------- /lib/interfaces.ts: -------------------------------------------------------------------------------- 1 | import { FetchGraphOptions } from "objection"; 2 | 3 | export type GenericFunction = (...args: any[]) => any; 4 | export type GenericClass = Record; 5 | export type Keys = keyof T; 6 | 7 | export type ModelKeys = { 8 | [P in keyof T]?: any; 9 | }; 10 | 11 | export interface Pagination { 12 | data: T[]; 13 | pagination?: { 14 | currentPage: number; 15 | totalPages: number; 16 | perPage: number; 17 | total: number; 18 | }; 19 | } 20 | 21 | export interface SortableSchema { 22 | sort?: string; 23 | } 24 | 25 | export interface NestedLoadRelSchema { 26 | $recursive?: boolean | number; 27 | $relation?: string; 28 | $modify?: string[]; 29 | [key: string]: 30 | | boolean 31 | | number 32 | | string 33 | | string[] 34 | | NestedLoadRelSchema 35 | | undefined; 36 | } 37 | 38 | export interface LoadRelSchema { 39 | [key: string]: boolean | NestedLoadRelSchema; 40 | } 41 | 42 | export type LoadRelOptions = FetchGraphOptions; 43 | -------------------------------------------------------------------------------- /lib/module.ts: -------------------------------------------------------------------------------- 1 | import { DynamicModule, Module, Provider, Type } from '@nestjs/common'; 2 | import { SquareboatNestObjection } from './constants'; 3 | import { 4 | DatabaseAsyncOptions, 5 | DatabaseAsyncOptionsFactory, 6 | DatabaseOptions, 7 | } from './options'; 8 | import { ObjectionService } from './service'; 9 | import { DbOperationsCommand } from './commands/migrations'; 10 | import { DatabaseUtilitiesCommand } from './commands/utils'; 11 | 12 | @Module({ 13 | imports: [], 14 | controllers: [], 15 | providers: [], 16 | }) 17 | export class ObjectionModule { 18 | /** 19 | * Register options 20 | * @param options 21 | */ 22 | static register(options: DatabaseOptions): DynamicModule { 23 | return { 24 | global: options.isGlobal || false, 25 | module: ObjectionModule, 26 | imports: [], 27 | providers: [ 28 | ObjectionService, 29 | DbOperationsCommand, 30 | DatabaseUtilitiesCommand, 31 | { provide: SquareboatNestObjection.databaseOptions, useValue: options }, 32 | ], 33 | exports: [], 34 | }; 35 | } 36 | 37 | /** 38 | * Register Async Options 39 | */ 40 | static registerAsync(options: DatabaseAsyncOptions): DynamicModule { 41 | return { 42 | global: options.isGlobal || false, 43 | module: ObjectionModule, 44 | imports: [], 45 | providers: [ 46 | this.createOptionsProvider(options), 47 | ObjectionService, 48 | DbOperationsCommand, 49 | DatabaseUtilitiesCommand, 50 | ], 51 | exports: [], 52 | }; 53 | } 54 | 55 | private static createOptionsProvider( 56 | options: DatabaseAsyncOptions, 57 | ): Provider { 58 | if (options.useFactory) { 59 | return { 60 | provide: SquareboatNestObjection.databaseOptions, 61 | useFactory: options.useFactory, 62 | inject: options.inject || [], 63 | }; 64 | } 65 | 66 | const inject = [ 67 | (options.useClass || options.useExisting) as Type, 68 | ]; 69 | 70 | return { 71 | provide: SquareboatNestObjection.databaseOptions, 72 | useFactory: async (optionsFactory: DatabaseAsyncOptionsFactory) => 73 | await optionsFactory.createOptions(), 74 | inject, 75 | }; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /lib/options.ts: -------------------------------------------------------------------------------- 1 | import { ModuleMetadata, Type } from '@nestjs/common'; 2 | import { Knex } from 'knex'; 3 | 4 | export interface DbConnectionOptions extends Knex.Config { 5 | validateQuery?: string; 6 | } 7 | 8 | export interface DatabaseOptions { 9 | isGlobal?: boolean; 10 | default: string; 11 | connections: Record; 12 | } 13 | 14 | export interface DatabaseAsyncOptions extends Pick { 15 | name?: string; 16 | isGlobal: boolean; 17 | useExisting?: Type; 18 | useClass?: Type; 19 | useFactory?: (...args: any[]) => Promise | DatabaseOptions; 20 | inject?: any[]; 21 | } 22 | 23 | export interface DatabaseAsyncOptionsFactory { 24 | createOptions(): Promise | DatabaseOptions; 25 | } 26 | -------------------------------------------------------------------------------- /lib/queryBuilders/custom.ts: -------------------------------------------------------------------------------- 1 | import { 2 | QueryBuilder, 3 | Model, 4 | Page, 5 | OrderByDirection, 6 | PrimitiveValue, 7 | Expression, 8 | } from "objection"; 9 | import { GenericFunction, Pagination } from "../interfaces"; 10 | 11 | export class CustomQueryBuilder extends QueryBuilder< 12 | M, 13 | R 14 | > { 15 | ArrayQueryBuilderType!: CustomQueryBuilder; 16 | SingleQueryBuilderType!: CustomQueryBuilder; 17 | NumberQueryBuilderType!: CustomQueryBuilder; 18 | PageQueryBuilderType!: CustomQueryBuilder>; 19 | 20 | async paginate(page: number, perPage: number): Promise> { 21 | page = +page ? +page : 1; 22 | perPage = +perPage ? +perPage : 15; 23 | 24 | const result = await this.page(page - 1, perPage); 25 | return { 26 | pagination: { 27 | currentPage: page, 28 | totalPages: Math.ceil(result.total / perPage), 29 | perPage, 30 | total: result.total, 31 | }, 32 | data: result.results as unknown as T[], 33 | }; 34 | } 35 | 36 | async allPages(): Promise> { 37 | return { data: (await this) as unknown as T[] }; 38 | } 39 | 40 | async onlyCount() { 41 | const result = (await this.count({ c: "*" })) as unknown as { c: number }[]; 42 | return +result[0].c; 43 | } 44 | 45 | async exists() { 46 | const result = await this.onlyCount(); 47 | return !!result; 48 | } 49 | 50 | async chunk(cb: GenericFunction, size: number): Promise { 51 | let offset = 0; 52 | let hasMore = true; 53 | while (!!!offset || hasMore) { 54 | const query = structuredClone(this); 55 | const records = (await query 56 | .offset(offset) 57 | .limit(size)) as unknown as M[]; 58 | hasMore = !(records.length > 0); 59 | if (!hasMore) return; 60 | await cb(records); 61 | offset += size; 62 | } 63 | } 64 | 65 | cOrderBy(expressions: string): this { 66 | const orders = (expressions || "").split("|"); 67 | for (const order of orders) { 68 | const [column, direction] = order.split(":"); 69 | if (!column) continue; 70 | this.orderBy(column, (direction || "ASC") as OrderByDirection); 71 | } 72 | 73 | return this; 74 | } 75 | 76 | when( 77 | condition: any, 78 | truthyCb: (query: CustomQueryBuilder, condition: any) => this, 79 | falsyCb?: (query: CustomQueryBuilder, condition: any) => this 80 | ): this { 81 | if (condition) { 82 | return truthyCb(this, condition); 83 | } else if (falsyCb) { 84 | return falsyCb(this, condition); 85 | } else { 86 | return this; 87 | } 88 | } 89 | 90 | safeWhereIn(col: string, expr: Expression): this { 91 | if (!Array.isArray(expr)) return this; 92 | if (Array.isArray(expr) && expr.length < 1) return this; 93 | 94 | return this.whereIn(col, expr); 95 | } 96 | 97 | safeWhereNotIn(col: string, expr: Expression): this { 98 | if (!Array.isArray(expr)) return this; 99 | if (Array.isArray(expr) && expr.length < 1) return this; 100 | 101 | return this.whereNotIn(col, expr); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /lib/queryBuilders/softDelete.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ForClassMethod, 3 | Model, 4 | ModelClass, 5 | Page, 6 | PartialModelObject, 7 | QueryBuilder, 8 | } from "objection"; 9 | import { CustomQueryBuilder } from "./custom"; 10 | 11 | export class SoftDeleteQueryBuilder< 12 | M extends Model, 13 | R = M[] 14 | > extends CustomQueryBuilder { 15 | static forClass: ForClassMethod = (modelClass) => { 16 | const qb = QueryBuilder.forClass.call(this, modelClass); 17 | qb.onBuild((builder) => { 18 | const tableName = builder.tableRefFor(modelClass as any); 19 | if (!builder.context().withArchived) { 20 | builder.whereNull(`${tableName}.deleted_at`); 21 | } 22 | }); 23 | return qb as any; 24 | }; 25 | 26 | withArchived() { 27 | this.context().withArchived = true; 28 | return this; 29 | } 30 | 31 | softDelete() { 32 | return this.patch({ 33 | deletedAt: new Date(), 34 | } as unknown as PartialModelObject); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/repositories/contract.ts: -------------------------------------------------------------------------------- 1 | import { Knex as KnexType } from "knex"; 2 | import { BaseModel } from "../baseModel"; 3 | import { ModelKeys } from "../interfaces"; 4 | 5 | export interface RepositoryContract { 6 | model: any; 7 | knexConnection: KnexType | null; 8 | trx: KnexType.Transaction | null; 9 | currentforUpdate: Record | null; 10 | 11 | bindCon(conName?: string): RepositoryContract; 12 | 13 | /** 14 | * Get all rows 15 | */ 16 | all(inputs?: T): Promise; 17 | 18 | /** 19 | * Get first instance with the matching criterias 20 | * @param inputs 21 | * @param error 22 | */ 23 | firstWhere(inputs: ModelKeys, error?: boolean): Promise; 24 | 25 | /** 26 | * Get all instances with the matching criterias 27 | * @param inputs 28 | * @param error 29 | */ 30 | getWhere(inputs: ModelKeys, error?: boolean): Promise; 31 | 32 | /** 33 | * Create a new model with given inputs 34 | * @param inputs 35 | */ 36 | create(inputs: ModelKeys): Promise; 37 | 38 | /** 39 | * Update or Create model with given condition and values 40 | * @param conditions 41 | * @param values 42 | */ 43 | createOrUpdate( 44 | conditions: ModelKeys, 45 | values: ModelKeys 46 | ): Promise; 47 | 48 | /** 49 | * First or Create model with given condition and values 50 | * 51 | * @param conditions 52 | * @param values 53 | */ 54 | firstOrNew(conditions: ModelKeys, values: ModelKeys): Promise; 55 | 56 | /** 57 | * Update the given model with values 58 | * @param model 59 | * @param setValues 60 | */ 61 | update(model: T, setValues: ModelKeys): Promise; 62 | 63 | /** 64 | * Update all models where condition is matched 65 | * @param column 66 | * @param value 67 | * @param setValues 68 | */ 69 | updateWhere( 70 | where: ModelKeys, 71 | setValues: ModelKeys 72 | ): Promise; 73 | 74 | /** 75 | * Check if any model exists where condition is matched 76 | * @param params 77 | */ 78 | exists(params: ModelKeys): Promise; 79 | 80 | /** 81 | * Get count of rows matching a criteria 82 | * @param params 83 | */ 84 | count(params: ModelKeys): Promise; 85 | 86 | /** 87 | * Refresh a model 88 | * 89 | * @param model 90 | */ 91 | refresh(model: T): Promise; 92 | 93 | /** 94 | * Delete a model 95 | * 96 | * @param model 97 | */ 98 | delete(model: T): Promise; 99 | 100 | /** 101 | * Delete documents where query is matched. 102 | * 103 | * @param params 104 | */ 105 | deleteWhere(params: ModelKeys): Promise; 106 | 107 | /** 108 | * Relate ids to a model 109 | * @param model 110 | * @param relation 111 | * @param payload 112 | */ 113 | attach( 114 | model: T, 115 | relation: string, 116 | payload: number | string | Array | Record 117 | ): Promise; 118 | 119 | /** 120 | * Sync relation with a model 121 | * @param model 122 | * @param relation 123 | * @param payload 124 | */ 125 | sync(model: T, relation: string, payload: any[]): Promise; 126 | 127 | /** 128 | * Fetch a chunk and run callback 129 | */ 130 | chunk( 131 | where: ModelKeys, 132 | size: number, 133 | cb: (models: T[]) => void 134 | ): Promise; 135 | 136 | /** 137 | * Throws model not found exception. 138 | * 139 | * @throws ModelNotFoundException 140 | */ 141 | raiseError(): void; 142 | 143 | /** 144 | * Returns new Query Builder Instance 145 | */ 146 | query(): any; 147 | 148 | /** 149 | * Update rows where condition is matched and return modified rows 150 | * @param where 151 | * @param setValues 152 | * @param returnOne Set this true when you want only the first object to be returned 153 | */ 154 | updateAndReturn( 155 | where: ModelKeys, 156 | setValues: ModelKeys, 157 | returnOne?: boolean 158 | ): Promise; 159 | 160 | /** 161 | * Bulk insert new models with given inputs 162 | * @param inputs 163 | */ 164 | bulkInsert(inputs: ModelKeys[]): Promise; 165 | 166 | /** 167 | * Starts a new transaction on the database 168 | * @param options Knex.TransactionConfig 169 | */ 170 | startTrx( 171 | options?: KnexType.TransactionConfig 172 | ): Promise>; 173 | 174 | /** 175 | * Binds passed trx instance to the repo 176 | * @param trx 177 | */ 178 | bindTrx(trx: KnexType.Transaction): RepositoryContract; 179 | 180 | /** 181 | * @returns trx instance 182 | */ 183 | getTrx(): KnexType.Transaction | null; 184 | 185 | /** 186 | * Commits the transaction 187 | */ 188 | commitTrx(): Promise; 189 | 190 | /** 191 | * Rollbacks the transaction 192 | */ 193 | rollbackTrx(): Promise; 194 | 195 | forUpdate(): this; 196 | } 197 | -------------------------------------------------------------------------------- /lib/repositories/database.ts: -------------------------------------------------------------------------------- 1 | import { RepositoryContract } from "./contract"; 2 | import { BaseModel } from "../baseModel"; 3 | import { ModelKeys } from "../interfaces"; 4 | import { Expression } from "objection"; 5 | import { PrimitiveValue } from "objection"; 6 | import { ObjectionService } from "../service"; 7 | import knex, { Knex, Knex as KnexType } from "knex"; 8 | import { ModelNotFound } from "../exceptions"; 9 | import { RepositoryError } from "../exceptions/repoError"; 10 | import { CustomQueryBuilder } from "../queryBuilders/custom"; 11 | 12 | export class DatabaseRepository 13 | implements RepositoryContract 14 | { 15 | model: any; 16 | knexConnection: KnexType | null = null; 17 | trx: Knex.Transaction | null = null; 18 | currentforUpdate: Record | null = null; 19 | 20 | public bindCon(conName?: string): RepositoryContract { 21 | const newRepository = new (( 22 | this.constructor 23 | ))() as RepositoryContract; 24 | 25 | const connection = ObjectionService.connection( 26 | conName || this.model.connection 27 | ); 28 | newRepository.knexConnection = connection; 29 | 30 | return newRepository; 31 | } 32 | 33 | setModel(model: BaseModel): this { 34 | this.model = model; 35 | return this; 36 | } 37 | 38 | /** 39 | * Get all rows 40 | */ 41 | async all(): Promise { 42 | const query = this.query(); 43 | 44 | if (this.currentforUpdate) { 45 | query.forUpdate(); 46 | this.clearForUpdate(); 47 | } 48 | 49 | return query as unknown as Promise; 50 | } 51 | 52 | /** 53 | * Get first instance with the matching criterias 54 | * @param inputs 55 | * @param error 56 | */ 57 | async firstWhere(inputs: ModelKeys, error = true): Promise { 58 | // inputs = inputs || {}; 59 | const query = this.query(); 60 | 61 | if (this.currentforUpdate) { 62 | query.forUpdate(); 63 | this.clearForUpdate(); 64 | } 65 | 66 | const model = await query.findOne(inputs); 67 | if (error && !model) this.raiseError(); 68 | 69 | return model; 70 | } 71 | 72 | /** 73 | * Get all instances with the matching criterias 74 | * @param inputs 75 | * @param error 76 | */ 77 | async getWhere(inputs: ModelKeys, error = true): Promise { 78 | const query = this.query(); 79 | 80 | if (this.currentforUpdate) { 81 | query.forUpdate(); 82 | this.clearForUpdate(); 83 | } 84 | 85 | for (const key in inputs) { 86 | Array.isArray(inputs[key] as unknown as any) 87 | ? query.whereIn( 88 | key, 89 | inputs[key] as unknown as Expression[] 90 | ) 91 | : query.where(key, inputs[key] as unknown as string); 92 | } 93 | const models = await query; 94 | if (error && models.length == 0) this.raiseError(); 95 | 96 | return models; 97 | } 98 | 99 | /** 100 | * Create a new model with given inputs 101 | * @param inputs 102 | */ 103 | async create(inputs: ModelKeys): Promise { 104 | return this.query().insert(inputs).returning("*") as unknown as T; 105 | } 106 | 107 | /** 108 | * Update or Create model with given condition and values 109 | * @param conditions 110 | * @param values 111 | */ 112 | async createOrUpdate( 113 | conditions: ModelKeys, 114 | values: ModelKeys 115 | ): Promise { 116 | const model = await this.firstWhere(conditions, false); 117 | if (!model) { 118 | return this.create({ ...conditions, ...values }); 119 | } 120 | 121 | await this.update(model, values); 122 | return await this.firstWhere(conditions, false); 123 | } 124 | 125 | /** 126 | * First or Create model with given condition and values 127 | * 128 | * @param conditions 129 | * @param values 130 | */ 131 | async firstOrNew(conditions: ModelKeys, values: ModelKeys): Promise { 132 | const model = await this.firstWhere(conditions, false); 133 | if (model) return model; 134 | return await this.create({ ...conditions, ...values }); 135 | } 136 | 137 | /** 138 | * Update the given model with values 139 | * @param model 140 | * @param setValues 141 | */ 142 | async update( 143 | model: ModelKeys, 144 | setValues: ModelKeys 145 | ): Promise { 146 | const query = this.query(); 147 | query.findById(model?.id).patch(setValues); 148 | return await query; 149 | } 150 | 151 | /** 152 | * Update all models where condition is matched 153 | * @param where 154 | * @param setValues 155 | */ 156 | async updateWhere( 157 | where: ModelKeys, 158 | setValues: ModelKeys 159 | ): Promise { 160 | const query = this.query(); 161 | query.where(where).patch(setValues); 162 | return query; 163 | } 164 | 165 | /** 166 | * Check if any model exists where condition is matched 167 | * @param params 168 | */ 169 | async exists(params: ModelKeys): Promise { 170 | const query = this.query(); 171 | query.where(params); 172 | return !!(await query.onlyCount()); 173 | } 174 | 175 | /** 176 | * Get count of rows matching a criteria 177 | * @param params 178 | */ 179 | async count(params: ModelKeys): Promise { 180 | const query = this.query(); 181 | query.where(params); 182 | return await query.onlyCount(); 183 | } 184 | 185 | /** 186 | * Delete a model 187 | * 188 | * @param model 189 | */ 190 | async delete(model: ModelKeys | number): Promise { 191 | return !!+(await this.query().deleteById( 192 | typeof model != "object" ? model : model["id"] 193 | )); 194 | } 195 | 196 | /** 197 | * Delete documents where query is matched. 198 | * 199 | * @param inputs T 200 | */ 201 | async deleteWhere(inputs: ModelKeys): Promise { 202 | const query = this.query(); 203 | 204 | for (const key in inputs) { 205 | Array.isArray(inputs[key]) 206 | ? query.whereIn(key, inputs[key] as unknown as any[]) 207 | : query.where(key, inputs[key] as unknown as any); 208 | } 209 | return !!+(await query.delete()); 210 | } 211 | 212 | /** 213 | * Refresh a model 214 | * 215 | * @param model 216 | */ 217 | async refresh(model: ModelKeys): Promise { 218 | return model ? await this.query().findById(model["id"]) : undefined; 219 | } 220 | 221 | /** 222 | * Relate ids to a model 223 | * @param model 224 | * @param relation 225 | * @param payload 226 | */ 227 | async attach( 228 | model: ModelKeys, 229 | relation: string, 230 | payload: number | string | Array | Record 231 | ): Promise { 232 | await model.$relatedQuery(relation).relate(payload); 233 | return; 234 | } 235 | 236 | /** 237 | * Sync relation with a model 238 | * @param model 239 | * @param relation 240 | * @param payload 241 | */ 242 | async sync( 243 | model: ModelKeys, 244 | relation: string, 245 | payload: any[] 246 | ): Promise { 247 | await model.$relatedQuery(relation).unrelate(); 248 | if (Array.isArray(payload) && payload.length > 0) { 249 | await model.$relatedQuery(relation).relate(payload); 250 | } 251 | return; 252 | } 253 | 254 | /** 255 | * Fetch a chunk and run callback 256 | */ 257 | async chunk( 258 | where: ModelKeys, 259 | size: number, 260 | cb: (models: T[]) => void 261 | ): Promise { 262 | const query = this.query(); 263 | query.where(where); 264 | await query.chunk(cb, size); 265 | return; 266 | } 267 | 268 | /** 269 | * Throws model not found exception. 270 | * 271 | * @throws ModelNotFoundException 272 | */ 273 | raiseError(): void { 274 | throw new ModelNotFound(this.getEntityName()); 275 | } 276 | 277 | /** 278 | * Returns new Query Builder Instance 279 | */ 280 | query(): CustomQueryBuilder { 281 | if (!this.knexConnection) { 282 | this.knexConnection = ObjectionService.connection(this.model.connection); 283 | } 284 | return this.model.query(this.trx || this.knexConnection); 285 | } 286 | 287 | getEntityName(): string { 288 | return this.model.name; 289 | } 290 | 291 | /** 292 | * Update rows where condition is matched and return modified rows 293 | * @param where 294 | * @param setValues 295 | * @param returnOne Set this true when you want only the first object to be returned 296 | */ 297 | async updateAndReturn( 298 | where: ModelKeys, 299 | setValues: ModelKeys 300 | ): Promise { 301 | const query = this.query(); 302 | const records = await query.where(where).patch(setValues).returning("*"); 303 | if (records.length == 1) return records[0]; 304 | return records; 305 | } 306 | 307 | /** 308 | * Bulk insert new models with given inputs, 309 | * currently only works in mysql. 310 | * @param inputs 311 | */ 312 | async bulkInsert(inputs: ModelKeys[]): Promise { 313 | return this.query().insert(inputs).returning("*") as unknown as T[]; 314 | } 315 | 316 | async startTrx( 317 | options?: Knex.TransactionConfig 318 | ): Promise> { 319 | const newRepository = new (( 320 | this.constructor 321 | ))() as RepositoryContract; 322 | 323 | if (!this.knexConnection) { 324 | newRepository.knexConnection = ObjectionService.connection( 325 | this.model.connection 326 | ); 327 | } 328 | 329 | if (newRepository.knexConnection) { 330 | newRepository.trx = await newRepository.knexConnection.transaction( 331 | options || {} 332 | ); 333 | } 334 | 335 | return newRepository; 336 | } 337 | 338 | bindTrx(trx: Knex.Transaction): RepositoryContract { 339 | const newRepository = new (( 340 | this.constructor 341 | ))() as RepositoryContract; 342 | 343 | if (!this.knexConnection) { 344 | newRepository.knexConnection = ObjectionService.connection( 345 | this.model.connection 346 | ); 347 | } 348 | newRepository.trx = trx; 349 | 350 | return newRepository; 351 | } 352 | 353 | getTrx(): Knex.Transaction | null { 354 | return this.trx; 355 | } 356 | 357 | /** 358 | * Commits the transaction 359 | */ 360 | async commitTrx(): Promise { 361 | if (!this.trx) { 362 | throw new RepositoryError( 363 | "Commit method being run on null. No Transaction started!" 364 | ); 365 | } 366 | 367 | await this.trx.commit(); 368 | } 369 | 370 | /** 371 | * Rollbacks the transaction 372 | */ 373 | async rollbackTrx(): Promise { 374 | if (!this.trx) { 375 | throw new RepositoryError( 376 | "Commit method being run on null. No Transaction started!" 377 | ); 378 | } 379 | 380 | await this.trx.rollback(); 381 | } 382 | 383 | forUpdate(options?: Record): this { 384 | this.currentforUpdate = options || {}; 385 | return this; 386 | } 387 | 388 | private clearForUpdate(): this { 389 | this.currentforUpdate = null; 390 | return this; 391 | } 392 | } 393 | -------------------------------------------------------------------------------- /lib/service.ts: -------------------------------------------------------------------------------- 1 | import { Inject, Injectable, Logger, OnModuleInit } from "@nestjs/common"; 2 | import { SquareboatNestObjection } from "./constants"; 3 | import { DatabaseOptions, DbConnectionOptions } from "./options"; 4 | import Knex, { Knex as KnexType } from "knex"; 5 | import { ConnectionNotFound } from "./exceptions"; 6 | import { BaseModel } from "./baseModel"; 7 | 8 | @Injectable() 9 | export class ObjectionService implements OnModuleInit { 10 | static config: DatabaseOptions; 11 | static dbConnections: Record; 12 | 13 | constructor( 14 | @Inject(SquareboatNestObjection.databaseOptions) config: DatabaseOptions 15 | ) { 16 | const defaultConnection = config.connections[config.default]; 17 | ObjectionService.config = config; 18 | ObjectionService.dbConnections = {}; 19 | BaseModel.knex(Knex(defaultConnection)); 20 | for (const conName in config.connections) { 21 | const { validateQuery, ...knexConfig } = config.connections[conName]; 22 | ObjectionService.dbConnections[conName] = Knex(knexConfig); 23 | } 24 | } 25 | 26 | async onModuleInit() { 27 | for (const connName in ObjectionService.dbConnections) { 28 | console.debug( 29 | `[@squareboat/nestjs-objection] '${connName}' validating connection...` 30 | ); 31 | const connection = ObjectionService.dbConnections[connName]; 32 | const dbOptions = ObjectionService.getOptions(connName); 33 | 34 | try { 35 | await connection.raw(dbOptions.validateQuery || "select 1+1 as result"); 36 | console.debug( 37 | `[@squareboat/nestjs-objection] '${connName}' connection validated...` 38 | ); 39 | } catch (_e) { 40 | const e = _e as Error; 41 | console.error( 42 | `[@squareboat/nestjs-objection] '${connName}' connection failed, REASON: ${e.message}` 43 | ); 44 | } 45 | } 46 | } 47 | 48 | static getOptions(conName?: string): DbConnectionOptions { 49 | // check if conName is a valid connection name 50 | conName = conName || ObjectionService.config.default; 51 | 52 | const isConNameValid = Object.keys( 53 | ObjectionService.config.connections 54 | ).includes(conName); 55 | 56 | if (conName && !isConNameValid) { 57 | throw new ConnectionNotFound(conName); 58 | } 59 | 60 | return ObjectionService.config.connections[conName]; 61 | } 62 | 63 | static connection(conName?: string): KnexType { 64 | // check if conName is a valid connection name 65 | conName = conName || ObjectionService.config.default; 66 | 67 | const isConNameValid = Object.keys( 68 | ObjectionService.config.connections 69 | ).includes(conName); 70 | 71 | if (conName && !isConNameValid) { 72 | throw new ConnectionNotFound(conName); 73 | } 74 | 75 | return ObjectionService.dbConnections[conName]; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@squareboat/nestjs-objection", 3 | "version": "0.3.6", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@squareboat/nestjs-objection", 9 | "version": "0.3.6", 10 | "license": "MIT", 11 | "dependencies": { 12 | "knex": "^2.1.0", 13 | "objection": "^3.1.3" 14 | }, 15 | "devDependencies": { 16 | "@nestjs/common": "^9.0.3", 17 | "@nestjs/core": "^9.0.3", 18 | "@types/node": "^18.0.5", 19 | "nodemon": "^3.0.1", 20 | "ts-node": "^10.9.1", 21 | "typescript": "^4.7.4" 22 | }, 23 | "peerDependencies": { 24 | "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", 25 | "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", 26 | "@squareboat/nest-console": "^1.1.4", 27 | "reflect-metadata": "^0.1.13" 28 | } 29 | }, 30 | "node_modules/@colors/colors": { 31 | "version": "1.5.0", 32 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", 33 | "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", 34 | "optional": true, 35 | "peer": true, 36 | "engines": { 37 | "node": ">=0.1.90" 38 | } 39 | }, 40 | "node_modules/@cspotcode/source-map-support": { 41 | "version": "0.8.1", 42 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 43 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 44 | "dev": true, 45 | "dependencies": { 46 | "@jridgewell/trace-mapping": "0.3.9" 47 | }, 48 | "engines": { 49 | "node": ">=12" 50 | } 51 | }, 52 | "node_modules/@jridgewell/resolve-uri": { 53 | "version": "3.1.1", 54 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 55 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 56 | "dev": true, 57 | "engines": { 58 | "node": ">=6.0.0" 59 | } 60 | }, 61 | "node_modules/@jridgewell/sourcemap-codec": { 62 | "version": "1.4.15", 63 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 64 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 65 | "dev": true 66 | }, 67 | "node_modules/@jridgewell/trace-mapping": { 68 | "version": "0.3.9", 69 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 70 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 71 | "dev": true, 72 | "dependencies": { 73 | "@jridgewell/resolve-uri": "^3.0.3", 74 | "@jridgewell/sourcemap-codec": "^1.4.10" 75 | } 76 | }, 77 | "node_modules/@lukeed/csprng": { 78 | "version": "1.0.1", 79 | "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.0.1.tgz", 80 | "integrity": "sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==", 81 | "engines": { 82 | "node": ">=8" 83 | } 84 | }, 85 | "node_modules/@nestjs/common": { 86 | "version": "9.3.9", 87 | "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.3.9.tgz", 88 | "integrity": "sha512-GshTD9Xz+wD2em6NyzU4NXw5IXMUmapgDgD+iuj6XL0258hvDwODmNk37mBBnZvTZlqER+krvIUKnS34etqF/A==", 89 | "dependencies": { 90 | "iterare": "1.2.1", 91 | "tslib": "2.5.0", 92 | "uid": "2.0.1" 93 | }, 94 | "funding": { 95 | "type": "opencollective", 96 | "url": "https://opencollective.com/nest" 97 | }, 98 | "peerDependencies": { 99 | "cache-manager": "<=5", 100 | "class-transformer": "*", 101 | "class-validator": "*", 102 | "reflect-metadata": "^0.1.12", 103 | "rxjs": "^7.1.0" 104 | }, 105 | "peerDependenciesMeta": { 106 | "cache-manager": { 107 | "optional": true 108 | }, 109 | "class-transformer": { 110 | "optional": true 111 | }, 112 | "class-validator": { 113 | "optional": true 114 | } 115 | } 116 | }, 117 | "node_modules/@nestjs/core": { 118 | "version": "9.3.9", 119 | "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.9.tgz", 120 | "integrity": "sha512-9g1A1G9eirLXEpH21rc6dKb08zHc2+adhCRz8NW39hbejcsxxD72FApJzt4QBQAKvu862ixt/tdpStnFT7lOSw==", 121 | "hasInstallScript": true, 122 | "dependencies": { 123 | "@nuxtjs/opencollective": "0.3.2", 124 | "fast-safe-stringify": "2.1.1", 125 | "iterare": "1.2.1", 126 | "path-to-regexp": "3.2.0", 127 | "tslib": "2.5.0", 128 | "uid": "2.0.1" 129 | }, 130 | "funding": { 131 | "type": "opencollective", 132 | "url": "https://opencollective.com/nest" 133 | }, 134 | "peerDependencies": { 135 | "@nestjs/common": "^9.0.0", 136 | "@nestjs/microservices": "^9.0.0", 137 | "@nestjs/platform-express": "^9.0.0", 138 | "@nestjs/websockets": "^9.0.0", 139 | "reflect-metadata": "^0.1.12", 140 | "rxjs": "^7.1.0" 141 | }, 142 | "peerDependenciesMeta": { 143 | "@nestjs/microservices": { 144 | "optional": true 145 | }, 146 | "@nestjs/platform-express": { 147 | "optional": true 148 | }, 149 | "@nestjs/websockets": { 150 | "optional": true 151 | } 152 | } 153 | }, 154 | "node_modules/@nuxtjs/opencollective": { 155 | "version": "0.3.2", 156 | "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", 157 | "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", 158 | "dependencies": { 159 | "chalk": "^4.1.0", 160 | "consola": "^2.15.0", 161 | "node-fetch": "^2.6.1" 162 | }, 163 | "bin": { 164 | "opencollective": "bin/opencollective.js" 165 | }, 166 | "engines": { 167 | "node": ">=8.0.0", 168 | "npm": ">=5.0.0" 169 | } 170 | }, 171 | "node_modules/@squareboat/nest-console": { 172 | "version": "1.1.4", 173 | "resolved": "https://registry.npmjs.org/@squareboat/nest-console/-/nest-console-1.1.4.tgz", 174 | "integrity": "sha512-ENcE1Q6UyUF+B2ca9o956/yErRuVAaw+iw+/LMwtaoY42IzyQC6s4K7lLrRf9YCez2T9rg9jZxKt33NNLpahrw==", 175 | "hasInstallScript": true, 176 | "peer": true, 177 | "dependencies": { 178 | "app-root-path": "^3.1.0", 179 | "cli-table3": "^0.6.3", 180 | "inquirer": "^8.0.0", 181 | "ora": "^5.4.1", 182 | "picocolors": "^1.0.0", 183 | "yargs-parser": "^21.1.1" 184 | }, 185 | "peerDependencies": { 186 | "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", 187 | "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", 188 | "reflect-metadata": "^0.1.13" 189 | } 190 | }, 191 | "node_modules/@tsconfig/node10": { 192 | "version": "1.0.9", 193 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 194 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 195 | "dev": true 196 | }, 197 | "node_modules/@tsconfig/node12": { 198 | "version": "1.0.11", 199 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 200 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 201 | "dev": true 202 | }, 203 | "node_modules/@tsconfig/node14": { 204 | "version": "1.0.3", 205 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 206 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 207 | "dev": true 208 | }, 209 | "node_modules/@tsconfig/node16": { 210 | "version": "1.0.4", 211 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 212 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 213 | "dev": true 214 | }, 215 | "node_modules/@types/node": { 216 | "version": "18.14.0", 217 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", 218 | "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", 219 | "dev": true 220 | }, 221 | "node_modules/abbrev": { 222 | "version": "1.1.1", 223 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 224 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 225 | "dev": true 226 | }, 227 | "node_modules/acorn": { 228 | "version": "8.10.0", 229 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 230 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 231 | "dev": true, 232 | "bin": { 233 | "acorn": "bin/acorn" 234 | }, 235 | "engines": { 236 | "node": ">=0.4.0" 237 | } 238 | }, 239 | "node_modules/acorn-walk": { 240 | "version": "8.2.0", 241 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 242 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 243 | "dev": true, 244 | "engines": { 245 | "node": ">=0.4.0" 246 | } 247 | }, 248 | "node_modules/ajv": { 249 | "version": "8.12.0", 250 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", 251 | "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", 252 | "dependencies": { 253 | "fast-deep-equal": "^3.1.1", 254 | "json-schema-traverse": "^1.0.0", 255 | "require-from-string": "^2.0.2", 256 | "uri-js": "^4.2.2" 257 | }, 258 | "funding": { 259 | "type": "github", 260 | "url": "https://github.com/sponsors/epoberezkin" 261 | } 262 | }, 263 | "node_modules/ajv-formats": { 264 | "version": "2.1.1", 265 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 266 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 267 | "dependencies": { 268 | "ajv": "^8.0.0" 269 | }, 270 | "peerDependencies": { 271 | "ajv": "^8.0.0" 272 | }, 273 | "peerDependenciesMeta": { 274 | "ajv": { 275 | "optional": true 276 | } 277 | } 278 | }, 279 | "node_modules/ansi-escapes": { 280 | "version": "4.3.2", 281 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 282 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 283 | "peer": true, 284 | "dependencies": { 285 | "type-fest": "^0.21.3" 286 | }, 287 | "engines": { 288 | "node": ">=8" 289 | }, 290 | "funding": { 291 | "url": "https://github.com/sponsors/sindresorhus" 292 | } 293 | }, 294 | "node_modules/ansi-regex": { 295 | "version": "5.0.1", 296 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 297 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 298 | "peer": true, 299 | "engines": { 300 | "node": ">=8" 301 | } 302 | }, 303 | "node_modules/ansi-styles": { 304 | "version": "4.3.0", 305 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 306 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 307 | "dependencies": { 308 | "color-convert": "^2.0.1" 309 | }, 310 | "engines": { 311 | "node": ">=8" 312 | }, 313 | "funding": { 314 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 315 | } 316 | }, 317 | "node_modules/anymatch": { 318 | "version": "3.1.3", 319 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 320 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 321 | "dev": true, 322 | "dependencies": { 323 | "normalize-path": "^3.0.0", 324 | "picomatch": "^2.0.4" 325 | }, 326 | "engines": { 327 | "node": ">= 8" 328 | } 329 | }, 330 | "node_modules/app-root-path": { 331 | "version": "3.1.0", 332 | "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", 333 | "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", 334 | "peer": true, 335 | "engines": { 336 | "node": ">= 6.0.0" 337 | } 338 | }, 339 | "node_modules/arg": { 340 | "version": "4.1.3", 341 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 342 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 343 | "dev": true 344 | }, 345 | "node_modules/balanced-match": { 346 | "version": "1.0.2", 347 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 348 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 349 | "dev": true 350 | }, 351 | "node_modules/base64-js": { 352 | "version": "1.5.1", 353 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 354 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 355 | "funding": [ 356 | { 357 | "type": "github", 358 | "url": "https://github.com/sponsors/feross" 359 | }, 360 | { 361 | "type": "patreon", 362 | "url": "https://www.patreon.com/feross" 363 | }, 364 | { 365 | "type": "consulting", 366 | "url": "https://feross.org/support" 367 | } 368 | ], 369 | "peer": true 370 | }, 371 | "node_modules/binary-extensions": { 372 | "version": "2.2.0", 373 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 374 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 375 | "dev": true, 376 | "engines": { 377 | "node": ">=8" 378 | } 379 | }, 380 | "node_modules/bl": { 381 | "version": "4.1.0", 382 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 383 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 384 | "peer": true, 385 | "dependencies": { 386 | "buffer": "^5.5.0", 387 | "inherits": "^2.0.4", 388 | "readable-stream": "^3.4.0" 389 | } 390 | }, 391 | "node_modules/brace-expansion": { 392 | "version": "1.1.11", 393 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 394 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 395 | "dev": true, 396 | "dependencies": { 397 | "balanced-match": "^1.0.0", 398 | "concat-map": "0.0.1" 399 | } 400 | }, 401 | "node_modules/braces": { 402 | "version": "3.0.2", 403 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 404 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 405 | "dev": true, 406 | "dependencies": { 407 | "fill-range": "^7.0.1" 408 | }, 409 | "engines": { 410 | "node": ">=8" 411 | } 412 | }, 413 | "node_modules/buffer": { 414 | "version": "5.7.1", 415 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 416 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 417 | "funding": [ 418 | { 419 | "type": "github", 420 | "url": "https://github.com/sponsors/feross" 421 | }, 422 | { 423 | "type": "patreon", 424 | "url": "https://www.patreon.com/feross" 425 | }, 426 | { 427 | "type": "consulting", 428 | "url": "https://feross.org/support" 429 | } 430 | ], 431 | "peer": true, 432 | "dependencies": { 433 | "base64-js": "^1.3.1", 434 | "ieee754": "^1.1.13" 435 | } 436 | }, 437 | "node_modules/chalk": { 438 | "version": "4.1.2", 439 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 440 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 441 | "dependencies": { 442 | "ansi-styles": "^4.1.0", 443 | "supports-color": "^7.1.0" 444 | }, 445 | "engines": { 446 | "node": ">=10" 447 | }, 448 | "funding": { 449 | "url": "https://github.com/chalk/chalk?sponsor=1" 450 | } 451 | }, 452 | "node_modules/chardet": { 453 | "version": "0.7.0", 454 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 455 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 456 | "peer": true 457 | }, 458 | "node_modules/chokidar": { 459 | "version": "3.5.3", 460 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 461 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 462 | "dev": true, 463 | "funding": [ 464 | { 465 | "type": "individual", 466 | "url": "https://paulmillr.com/funding/" 467 | } 468 | ], 469 | "dependencies": { 470 | "anymatch": "~3.1.2", 471 | "braces": "~3.0.2", 472 | "glob-parent": "~5.1.2", 473 | "is-binary-path": "~2.1.0", 474 | "is-glob": "~4.0.1", 475 | "normalize-path": "~3.0.0", 476 | "readdirp": "~3.6.0" 477 | }, 478 | "engines": { 479 | "node": ">= 8.10.0" 480 | }, 481 | "optionalDependencies": { 482 | "fsevents": "~2.3.2" 483 | } 484 | }, 485 | "node_modules/cli-cursor": { 486 | "version": "3.1.0", 487 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 488 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 489 | "peer": true, 490 | "dependencies": { 491 | "restore-cursor": "^3.1.0" 492 | }, 493 | "engines": { 494 | "node": ">=8" 495 | } 496 | }, 497 | "node_modules/cli-spinners": { 498 | "version": "2.7.0", 499 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", 500 | "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", 501 | "peer": true, 502 | "engines": { 503 | "node": ">=6" 504 | }, 505 | "funding": { 506 | "url": "https://github.com/sponsors/sindresorhus" 507 | } 508 | }, 509 | "node_modules/cli-table3": { 510 | "version": "0.6.3", 511 | "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", 512 | "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", 513 | "peer": true, 514 | "dependencies": { 515 | "string-width": "^4.2.0" 516 | }, 517 | "engines": { 518 | "node": "10.* || >= 12.*" 519 | }, 520 | "optionalDependencies": { 521 | "@colors/colors": "1.5.0" 522 | } 523 | }, 524 | "node_modules/cli-width": { 525 | "version": "3.0.0", 526 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 527 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 528 | "peer": true, 529 | "engines": { 530 | "node": ">= 10" 531 | } 532 | }, 533 | "node_modules/clone": { 534 | "version": "1.0.4", 535 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 536 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", 537 | "peer": true, 538 | "engines": { 539 | "node": ">=0.8" 540 | } 541 | }, 542 | "node_modules/color-convert": { 543 | "version": "2.0.1", 544 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 545 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 546 | "dependencies": { 547 | "color-name": "~1.1.4" 548 | }, 549 | "engines": { 550 | "node": ">=7.0.0" 551 | } 552 | }, 553 | "node_modules/color-name": { 554 | "version": "1.1.4", 555 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 556 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 557 | }, 558 | "node_modules/colorette": { 559 | "version": "2.0.19", 560 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", 561 | "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" 562 | }, 563 | "node_modules/commander": { 564 | "version": "9.5.0", 565 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 566 | "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", 567 | "engines": { 568 | "node": "^12.20.0 || >=14" 569 | } 570 | }, 571 | "node_modules/concat-map": { 572 | "version": "0.0.1", 573 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 574 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 575 | "dev": true 576 | }, 577 | "node_modules/consola": { 578 | "version": "2.15.3", 579 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", 580 | "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" 581 | }, 582 | "node_modules/create-require": { 583 | "version": "1.1.1", 584 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 585 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 586 | "dev": true 587 | }, 588 | "node_modules/db-errors": { 589 | "version": "0.2.3", 590 | "resolved": "https://registry.npmjs.org/db-errors/-/db-errors-0.2.3.tgz", 591 | "integrity": "sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng==" 592 | }, 593 | "node_modules/debug": { 594 | "version": "4.3.4", 595 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 596 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 597 | "dependencies": { 598 | "ms": "2.1.2" 599 | }, 600 | "engines": { 601 | "node": ">=6.0" 602 | }, 603 | "peerDependenciesMeta": { 604 | "supports-color": { 605 | "optional": true 606 | } 607 | } 608 | }, 609 | "node_modules/defaults": { 610 | "version": "1.0.4", 611 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", 612 | "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 613 | "peer": true, 614 | "dependencies": { 615 | "clone": "^1.0.2" 616 | }, 617 | "funding": { 618 | "url": "https://github.com/sponsors/sindresorhus" 619 | } 620 | }, 621 | "node_modules/diff": { 622 | "version": "4.0.2", 623 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 624 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 625 | "dev": true, 626 | "engines": { 627 | "node": ">=0.3.1" 628 | } 629 | }, 630 | "node_modules/emoji-regex": { 631 | "version": "8.0.0", 632 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 633 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 634 | "peer": true 635 | }, 636 | "node_modules/escalade": { 637 | "version": "3.1.1", 638 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 639 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 640 | "engines": { 641 | "node": ">=6" 642 | } 643 | }, 644 | "node_modules/escape-string-regexp": { 645 | "version": "1.0.5", 646 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 647 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 648 | "peer": true, 649 | "engines": { 650 | "node": ">=0.8.0" 651 | } 652 | }, 653 | "node_modules/esm": { 654 | "version": "3.2.25", 655 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", 656 | "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", 657 | "engines": { 658 | "node": ">=6" 659 | } 660 | }, 661 | "node_modules/external-editor": { 662 | "version": "3.1.0", 663 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 664 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 665 | "peer": true, 666 | "dependencies": { 667 | "chardet": "^0.7.0", 668 | "iconv-lite": "^0.4.24", 669 | "tmp": "^0.0.33" 670 | }, 671 | "engines": { 672 | "node": ">=4" 673 | } 674 | }, 675 | "node_modules/fast-deep-equal": { 676 | "version": "3.1.3", 677 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 678 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 679 | }, 680 | "node_modules/fast-safe-stringify": { 681 | "version": "2.1.1", 682 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 683 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" 684 | }, 685 | "node_modules/figures": { 686 | "version": "3.2.0", 687 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 688 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 689 | "peer": true, 690 | "dependencies": { 691 | "escape-string-regexp": "^1.0.5" 692 | }, 693 | "engines": { 694 | "node": ">=8" 695 | }, 696 | "funding": { 697 | "url": "https://github.com/sponsors/sindresorhus" 698 | } 699 | }, 700 | "node_modules/fill-range": { 701 | "version": "7.0.1", 702 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 703 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 704 | "dev": true, 705 | "dependencies": { 706 | "to-regex-range": "^5.0.1" 707 | }, 708 | "engines": { 709 | "node": ">=8" 710 | } 711 | }, 712 | "node_modules/fsevents": { 713 | "version": "2.3.2", 714 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 715 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 716 | "dev": true, 717 | "hasInstallScript": true, 718 | "optional": true, 719 | "os": [ 720 | "darwin" 721 | ], 722 | "engines": { 723 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 724 | } 725 | }, 726 | "node_modules/function-bind": { 727 | "version": "1.1.1", 728 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 729 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 730 | }, 731 | "node_modules/get-package-type": { 732 | "version": "0.1.0", 733 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 734 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 735 | "engines": { 736 | "node": ">=8.0.0" 737 | } 738 | }, 739 | "node_modules/getopts": { 740 | "version": "2.3.0", 741 | "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", 742 | "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" 743 | }, 744 | "node_modules/glob-parent": { 745 | "version": "5.1.2", 746 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 747 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 748 | "dev": true, 749 | "dependencies": { 750 | "is-glob": "^4.0.1" 751 | }, 752 | "engines": { 753 | "node": ">= 6" 754 | } 755 | }, 756 | "node_modules/has": { 757 | "version": "1.0.3", 758 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 759 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 760 | "dependencies": { 761 | "function-bind": "^1.1.1" 762 | }, 763 | "engines": { 764 | "node": ">= 0.4.0" 765 | } 766 | }, 767 | "node_modules/has-flag": { 768 | "version": "4.0.0", 769 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 770 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 771 | "engines": { 772 | "node": ">=8" 773 | } 774 | }, 775 | "node_modules/iconv-lite": { 776 | "version": "0.4.24", 777 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 778 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 779 | "peer": true, 780 | "dependencies": { 781 | "safer-buffer": ">= 2.1.2 < 3" 782 | }, 783 | "engines": { 784 | "node": ">=0.10.0" 785 | } 786 | }, 787 | "node_modules/ieee754": { 788 | "version": "1.2.1", 789 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 790 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 791 | "funding": [ 792 | { 793 | "type": "github", 794 | "url": "https://github.com/sponsors/feross" 795 | }, 796 | { 797 | "type": "patreon", 798 | "url": "https://www.patreon.com/feross" 799 | }, 800 | { 801 | "type": "consulting", 802 | "url": "https://feross.org/support" 803 | } 804 | ], 805 | "peer": true 806 | }, 807 | "node_modules/ignore-by-default": { 808 | "version": "1.0.1", 809 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 810 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 811 | "dev": true 812 | }, 813 | "node_modules/inherits": { 814 | "version": "2.0.4", 815 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 816 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 817 | "peer": true 818 | }, 819 | "node_modules/inquirer": { 820 | "version": "8.2.5", 821 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", 822 | "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", 823 | "peer": true, 824 | "dependencies": { 825 | "ansi-escapes": "^4.2.1", 826 | "chalk": "^4.1.1", 827 | "cli-cursor": "^3.1.0", 828 | "cli-width": "^3.0.0", 829 | "external-editor": "^3.0.3", 830 | "figures": "^3.0.0", 831 | "lodash": "^4.17.21", 832 | "mute-stream": "0.0.8", 833 | "ora": "^5.4.1", 834 | "run-async": "^2.4.0", 835 | "rxjs": "^7.5.5", 836 | "string-width": "^4.1.0", 837 | "strip-ansi": "^6.0.0", 838 | "through": "^2.3.6", 839 | "wrap-ansi": "^7.0.0" 840 | }, 841 | "engines": { 842 | "node": ">=12.0.0" 843 | } 844 | }, 845 | "node_modules/interpret": { 846 | "version": "2.2.0", 847 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", 848 | "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", 849 | "engines": { 850 | "node": ">= 0.10" 851 | } 852 | }, 853 | "node_modules/is-binary-path": { 854 | "version": "2.1.0", 855 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 856 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 857 | "dev": true, 858 | "dependencies": { 859 | "binary-extensions": "^2.0.0" 860 | }, 861 | "engines": { 862 | "node": ">=8" 863 | } 864 | }, 865 | "node_modules/is-core-module": { 866 | "version": "2.11.0", 867 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 868 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 869 | "dependencies": { 870 | "has": "^1.0.3" 871 | }, 872 | "funding": { 873 | "url": "https://github.com/sponsors/ljharb" 874 | } 875 | }, 876 | "node_modules/is-extglob": { 877 | "version": "2.1.1", 878 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 879 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 880 | "dev": true, 881 | "engines": { 882 | "node": ">=0.10.0" 883 | } 884 | }, 885 | "node_modules/is-fullwidth-code-point": { 886 | "version": "3.0.0", 887 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 888 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 889 | "peer": true, 890 | "engines": { 891 | "node": ">=8" 892 | } 893 | }, 894 | "node_modules/is-glob": { 895 | "version": "4.0.3", 896 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 897 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 898 | "dev": true, 899 | "dependencies": { 900 | "is-extglob": "^2.1.1" 901 | }, 902 | "engines": { 903 | "node": ">=0.10.0" 904 | } 905 | }, 906 | "node_modules/is-interactive": { 907 | "version": "1.0.0", 908 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 909 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 910 | "peer": true, 911 | "engines": { 912 | "node": ">=8" 913 | } 914 | }, 915 | "node_modules/is-number": { 916 | "version": "7.0.0", 917 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 918 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 919 | "dev": true, 920 | "engines": { 921 | "node": ">=0.12.0" 922 | } 923 | }, 924 | "node_modules/is-unicode-supported": { 925 | "version": "0.1.0", 926 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 927 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 928 | "peer": true, 929 | "engines": { 930 | "node": ">=10" 931 | }, 932 | "funding": { 933 | "url": "https://github.com/sponsors/sindresorhus" 934 | } 935 | }, 936 | "node_modules/iterare": { 937 | "version": "1.2.1", 938 | "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", 939 | "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", 940 | "engines": { 941 | "node": ">=6" 942 | } 943 | }, 944 | "node_modules/json-schema-traverse": { 945 | "version": "1.0.0", 946 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 947 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 948 | }, 949 | "node_modules/knex": { 950 | "version": "2.4.2", 951 | "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz", 952 | "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==", 953 | "dependencies": { 954 | "colorette": "2.0.19", 955 | "commander": "^9.1.0", 956 | "debug": "4.3.4", 957 | "escalade": "^3.1.1", 958 | "esm": "^3.2.25", 959 | "get-package-type": "^0.1.0", 960 | "getopts": "2.3.0", 961 | "interpret": "^2.2.0", 962 | "lodash": "^4.17.21", 963 | "pg-connection-string": "2.5.0", 964 | "rechoir": "^0.8.0", 965 | "resolve-from": "^5.0.0", 966 | "tarn": "^3.0.2", 967 | "tildify": "2.0.0" 968 | }, 969 | "bin": { 970 | "knex": "bin/cli.js" 971 | }, 972 | "engines": { 973 | "node": ">=12" 974 | }, 975 | "peerDependenciesMeta": { 976 | "better-sqlite3": { 977 | "optional": true 978 | }, 979 | "mysql": { 980 | "optional": true 981 | }, 982 | "mysql2": { 983 | "optional": true 984 | }, 985 | "pg": { 986 | "optional": true 987 | }, 988 | "pg-native": { 989 | "optional": true 990 | }, 991 | "sqlite3": { 992 | "optional": true 993 | }, 994 | "tedious": { 995 | "optional": true 996 | } 997 | } 998 | }, 999 | "node_modules/lodash": { 1000 | "version": "4.17.21", 1001 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1002 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1003 | }, 1004 | "node_modules/log-symbols": { 1005 | "version": "4.1.0", 1006 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1007 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1008 | "peer": true, 1009 | "dependencies": { 1010 | "chalk": "^4.1.0", 1011 | "is-unicode-supported": "^0.1.0" 1012 | }, 1013 | "engines": { 1014 | "node": ">=10" 1015 | }, 1016 | "funding": { 1017 | "url": "https://github.com/sponsors/sindresorhus" 1018 | } 1019 | }, 1020 | "node_modules/lru-cache": { 1021 | "version": "6.0.0", 1022 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1023 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1024 | "dev": true, 1025 | "dependencies": { 1026 | "yallist": "^4.0.0" 1027 | }, 1028 | "engines": { 1029 | "node": ">=10" 1030 | } 1031 | }, 1032 | "node_modules/make-error": { 1033 | "version": "1.3.6", 1034 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1035 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1036 | "dev": true 1037 | }, 1038 | "node_modules/mimic-fn": { 1039 | "version": "2.1.0", 1040 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1041 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1042 | "peer": true, 1043 | "engines": { 1044 | "node": ">=6" 1045 | } 1046 | }, 1047 | "node_modules/minimatch": { 1048 | "version": "3.1.2", 1049 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1050 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1051 | "dev": true, 1052 | "dependencies": { 1053 | "brace-expansion": "^1.1.7" 1054 | }, 1055 | "engines": { 1056 | "node": "*" 1057 | } 1058 | }, 1059 | "node_modules/ms": { 1060 | "version": "2.1.2", 1061 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1062 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1063 | }, 1064 | "node_modules/mute-stream": { 1065 | "version": "0.0.8", 1066 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1067 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1068 | "peer": true 1069 | }, 1070 | "node_modules/node-fetch": { 1071 | "version": "2.6.9", 1072 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", 1073 | "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", 1074 | "dependencies": { 1075 | "whatwg-url": "^5.0.0" 1076 | }, 1077 | "engines": { 1078 | "node": "4.x || >=6.0.0" 1079 | }, 1080 | "peerDependencies": { 1081 | "encoding": "^0.1.0" 1082 | }, 1083 | "peerDependenciesMeta": { 1084 | "encoding": { 1085 | "optional": true 1086 | } 1087 | } 1088 | }, 1089 | "node_modules/nodemon": { 1090 | "version": "3.0.1", 1091 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", 1092 | "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", 1093 | "dev": true, 1094 | "dependencies": { 1095 | "chokidar": "^3.5.2", 1096 | "debug": "^3.2.7", 1097 | "ignore-by-default": "^1.0.1", 1098 | "minimatch": "^3.1.2", 1099 | "pstree.remy": "^1.1.8", 1100 | "semver": "^7.5.3", 1101 | "simple-update-notifier": "^2.0.0", 1102 | "supports-color": "^5.5.0", 1103 | "touch": "^3.1.0", 1104 | "undefsafe": "^2.0.5" 1105 | }, 1106 | "bin": { 1107 | "nodemon": "bin/nodemon.js" 1108 | }, 1109 | "engines": { 1110 | "node": ">=10" 1111 | }, 1112 | "funding": { 1113 | "type": "opencollective", 1114 | "url": "https://opencollective.com/nodemon" 1115 | } 1116 | }, 1117 | "node_modules/nodemon/node_modules/debug": { 1118 | "version": "3.2.7", 1119 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1120 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1121 | "dev": true, 1122 | "dependencies": { 1123 | "ms": "^2.1.1" 1124 | } 1125 | }, 1126 | "node_modules/nodemon/node_modules/has-flag": { 1127 | "version": "3.0.0", 1128 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1129 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1130 | "dev": true, 1131 | "engines": { 1132 | "node": ">=4" 1133 | } 1134 | }, 1135 | "node_modules/nodemon/node_modules/supports-color": { 1136 | "version": "5.5.0", 1137 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1138 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1139 | "dev": true, 1140 | "dependencies": { 1141 | "has-flag": "^3.0.0" 1142 | }, 1143 | "engines": { 1144 | "node": ">=4" 1145 | } 1146 | }, 1147 | "node_modules/nopt": { 1148 | "version": "1.0.10", 1149 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1150 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1151 | "dev": true, 1152 | "dependencies": { 1153 | "abbrev": "1" 1154 | }, 1155 | "bin": { 1156 | "nopt": "bin/nopt.js" 1157 | }, 1158 | "engines": { 1159 | "node": "*" 1160 | } 1161 | }, 1162 | "node_modules/normalize-path": { 1163 | "version": "3.0.0", 1164 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1165 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1166 | "dev": true, 1167 | "engines": { 1168 | "node": ">=0.10.0" 1169 | } 1170 | }, 1171 | "node_modules/objection": { 1172 | "version": "3.1.3", 1173 | "resolved": "https://registry.npmjs.org/objection/-/objection-3.1.3.tgz", 1174 | "integrity": "sha512-X4DH8/xKBS34bwWOSLAPyceg0JgLhLiUuz+cEEyDA8iDFoT1UM9UbtwBpwHV11hYskAKxOgVlNHeveFQiOPDXA==", 1175 | "dependencies": { 1176 | "ajv": "^8.12.0", 1177 | "ajv-formats": "^2.1.1", 1178 | "db-errors": "^0.2.3" 1179 | }, 1180 | "engines": { 1181 | "node": ">=14.0.0" 1182 | }, 1183 | "peerDependencies": { 1184 | "knex": ">=1.0.1" 1185 | } 1186 | }, 1187 | "node_modules/onetime": { 1188 | "version": "5.1.2", 1189 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1190 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1191 | "peer": true, 1192 | "dependencies": { 1193 | "mimic-fn": "^2.1.0" 1194 | }, 1195 | "engines": { 1196 | "node": ">=6" 1197 | }, 1198 | "funding": { 1199 | "url": "https://github.com/sponsors/sindresorhus" 1200 | } 1201 | }, 1202 | "node_modules/ora": { 1203 | "version": "5.4.1", 1204 | "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", 1205 | "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", 1206 | "peer": true, 1207 | "dependencies": { 1208 | "bl": "^4.1.0", 1209 | "chalk": "^4.1.0", 1210 | "cli-cursor": "^3.1.0", 1211 | "cli-spinners": "^2.5.0", 1212 | "is-interactive": "^1.0.0", 1213 | "is-unicode-supported": "^0.1.0", 1214 | "log-symbols": "^4.1.0", 1215 | "strip-ansi": "^6.0.0", 1216 | "wcwidth": "^1.0.1" 1217 | }, 1218 | "engines": { 1219 | "node": ">=10" 1220 | }, 1221 | "funding": { 1222 | "url": "https://github.com/sponsors/sindresorhus" 1223 | } 1224 | }, 1225 | "node_modules/os-tmpdir": { 1226 | "version": "1.0.2", 1227 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1228 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 1229 | "peer": true, 1230 | "engines": { 1231 | "node": ">=0.10.0" 1232 | } 1233 | }, 1234 | "node_modules/path-parse": { 1235 | "version": "1.0.7", 1236 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1237 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1238 | }, 1239 | "node_modules/path-to-regexp": { 1240 | "version": "3.2.0", 1241 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", 1242 | "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" 1243 | }, 1244 | "node_modules/pg-connection-string": { 1245 | "version": "2.5.0", 1246 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 1247 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 1248 | }, 1249 | "node_modules/picocolors": { 1250 | "version": "1.0.0", 1251 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1252 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1253 | "peer": true 1254 | }, 1255 | "node_modules/picomatch": { 1256 | "version": "2.3.1", 1257 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1258 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1259 | "dev": true, 1260 | "engines": { 1261 | "node": ">=8.6" 1262 | }, 1263 | "funding": { 1264 | "url": "https://github.com/sponsors/jonschlinkert" 1265 | } 1266 | }, 1267 | "node_modules/pstree.remy": { 1268 | "version": "1.1.8", 1269 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1270 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1271 | "dev": true 1272 | }, 1273 | "node_modules/punycode": { 1274 | "version": "2.3.1", 1275 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1276 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1277 | "engines": { 1278 | "node": ">=6" 1279 | } 1280 | }, 1281 | "node_modules/readable-stream": { 1282 | "version": "3.6.0", 1283 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1284 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1285 | "peer": true, 1286 | "dependencies": { 1287 | "inherits": "^2.0.3", 1288 | "string_decoder": "^1.1.1", 1289 | "util-deprecate": "^1.0.1" 1290 | }, 1291 | "engines": { 1292 | "node": ">= 6" 1293 | } 1294 | }, 1295 | "node_modules/readdirp": { 1296 | "version": "3.6.0", 1297 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1298 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1299 | "dev": true, 1300 | "dependencies": { 1301 | "picomatch": "^2.2.1" 1302 | }, 1303 | "engines": { 1304 | "node": ">=8.10.0" 1305 | } 1306 | }, 1307 | "node_modules/rechoir": { 1308 | "version": "0.8.0", 1309 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", 1310 | "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", 1311 | "dependencies": { 1312 | "resolve": "^1.20.0" 1313 | }, 1314 | "engines": { 1315 | "node": ">= 10.13.0" 1316 | } 1317 | }, 1318 | "node_modules/reflect-metadata": { 1319 | "version": "0.1.13", 1320 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 1321 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", 1322 | "peer": true 1323 | }, 1324 | "node_modules/require-from-string": { 1325 | "version": "2.0.2", 1326 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1327 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1328 | "engines": { 1329 | "node": ">=0.10.0" 1330 | } 1331 | }, 1332 | "node_modules/resolve": { 1333 | "version": "1.22.1", 1334 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1335 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1336 | "dependencies": { 1337 | "is-core-module": "^2.9.0", 1338 | "path-parse": "^1.0.7", 1339 | "supports-preserve-symlinks-flag": "^1.0.0" 1340 | }, 1341 | "bin": { 1342 | "resolve": "bin/resolve" 1343 | }, 1344 | "funding": { 1345 | "url": "https://github.com/sponsors/ljharb" 1346 | } 1347 | }, 1348 | "node_modules/resolve-from": { 1349 | "version": "5.0.0", 1350 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1351 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 1352 | "engines": { 1353 | "node": ">=8" 1354 | } 1355 | }, 1356 | "node_modules/restore-cursor": { 1357 | "version": "3.1.0", 1358 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1359 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1360 | "peer": true, 1361 | "dependencies": { 1362 | "onetime": "^5.1.0", 1363 | "signal-exit": "^3.0.2" 1364 | }, 1365 | "engines": { 1366 | "node": ">=8" 1367 | } 1368 | }, 1369 | "node_modules/run-async": { 1370 | "version": "2.4.1", 1371 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1372 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1373 | "peer": true, 1374 | "engines": { 1375 | "node": ">=0.12.0" 1376 | } 1377 | }, 1378 | "node_modules/rxjs": { 1379 | "version": "7.8.0", 1380 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", 1381 | "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", 1382 | "peer": true, 1383 | "dependencies": { 1384 | "tslib": "^2.1.0" 1385 | } 1386 | }, 1387 | "node_modules/safe-buffer": { 1388 | "version": "5.2.1", 1389 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1390 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1391 | "funding": [ 1392 | { 1393 | "type": "github", 1394 | "url": "https://github.com/sponsors/feross" 1395 | }, 1396 | { 1397 | "type": "patreon", 1398 | "url": "https://www.patreon.com/feross" 1399 | }, 1400 | { 1401 | "type": "consulting", 1402 | "url": "https://feross.org/support" 1403 | } 1404 | ], 1405 | "peer": true 1406 | }, 1407 | "node_modules/safer-buffer": { 1408 | "version": "2.1.2", 1409 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1410 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1411 | "peer": true 1412 | }, 1413 | "node_modules/semver": { 1414 | "version": "7.5.4", 1415 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1416 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1417 | "dev": true, 1418 | "dependencies": { 1419 | "lru-cache": "^6.0.0" 1420 | }, 1421 | "bin": { 1422 | "semver": "bin/semver.js" 1423 | }, 1424 | "engines": { 1425 | "node": ">=10" 1426 | } 1427 | }, 1428 | "node_modules/signal-exit": { 1429 | "version": "3.0.7", 1430 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1431 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1432 | "peer": true 1433 | }, 1434 | "node_modules/simple-update-notifier": { 1435 | "version": "2.0.0", 1436 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 1437 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 1438 | "dev": true, 1439 | "dependencies": { 1440 | "semver": "^7.5.3" 1441 | }, 1442 | "engines": { 1443 | "node": ">=10" 1444 | } 1445 | }, 1446 | "node_modules/string_decoder": { 1447 | "version": "1.3.0", 1448 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1449 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1450 | "peer": true, 1451 | "dependencies": { 1452 | "safe-buffer": "~5.2.0" 1453 | } 1454 | }, 1455 | "node_modules/string-width": { 1456 | "version": "4.2.3", 1457 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1458 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1459 | "peer": true, 1460 | "dependencies": { 1461 | "emoji-regex": "^8.0.0", 1462 | "is-fullwidth-code-point": "^3.0.0", 1463 | "strip-ansi": "^6.0.1" 1464 | }, 1465 | "engines": { 1466 | "node": ">=8" 1467 | } 1468 | }, 1469 | "node_modules/strip-ansi": { 1470 | "version": "6.0.1", 1471 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1472 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1473 | "peer": true, 1474 | "dependencies": { 1475 | "ansi-regex": "^5.0.1" 1476 | }, 1477 | "engines": { 1478 | "node": ">=8" 1479 | } 1480 | }, 1481 | "node_modules/supports-color": { 1482 | "version": "7.2.0", 1483 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1484 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1485 | "dependencies": { 1486 | "has-flag": "^4.0.0" 1487 | }, 1488 | "engines": { 1489 | "node": ">=8" 1490 | } 1491 | }, 1492 | "node_modules/supports-preserve-symlinks-flag": { 1493 | "version": "1.0.0", 1494 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1495 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1496 | "engines": { 1497 | "node": ">= 0.4" 1498 | }, 1499 | "funding": { 1500 | "url": "https://github.com/sponsors/ljharb" 1501 | } 1502 | }, 1503 | "node_modules/tarn": { 1504 | "version": "3.0.2", 1505 | "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", 1506 | "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", 1507 | "engines": { 1508 | "node": ">=8.0.0" 1509 | } 1510 | }, 1511 | "node_modules/through": { 1512 | "version": "2.3.8", 1513 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1514 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1515 | "peer": true 1516 | }, 1517 | "node_modules/tildify": { 1518 | "version": "2.0.0", 1519 | "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", 1520 | "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", 1521 | "engines": { 1522 | "node": ">=8" 1523 | } 1524 | }, 1525 | "node_modules/tmp": { 1526 | "version": "0.0.33", 1527 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1528 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1529 | "peer": true, 1530 | "dependencies": { 1531 | "os-tmpdir": "~1.0.2" 1532 | }, 1533 | "engines": { 1534 | "node": ">=0.6.0" 1535 | } 1536 | }, 1537 | "node_modules/to-regex-range": { 1538 | "version": "5.0.1", 1539 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1540 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1541 | "dev": true, 1542 | "dependencies": { 1543 | "is-number": "^7.0.0" 1544 | }, 1545 | "engines": { 1546 | "node": ">=8.0" 1547 | } 1548 | }, 1549 | "node_modules/touch": { 1550 | "version": "3.1.0", 1551 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1552 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1553 | "dev": true, 1554 | "dependencies": { 1555 | "nopt": "~1.0.10" 1556 | }, 1557 | "bin": { 1558 | "nodetouch": "bin/nodetouch.js" 1559 | } 1560 | }, 1561 | "node_modules/tr46": { 1562 | "version": "0.0.3", 1563 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1564 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 1565 | }, 1566 | "node_modules/ts-node": { 1567 | "version": "10.9.1", 1568 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 1569 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 1570 | "dev": true, 1571 | "dependencies": { 1572 | "@cspotcode/source-map-support": "^0.8.0", 1573 | "@tsconfig/node10": "^1.0.7", 1574 | "@tsconfig/node12": "^1.0.7", 1575 | "@tsconfig/node14": "^1.0.0", 1576 | "@tsconfig/node16": "^1.0.2", 1577 | "acorn": "^8.4.1", 1578 | "acorn-walk": "^8.1.1", 1579 | "arg": "^4.1.0", 1580 | "create-require": "^1.1.0", 1581 | "diff": "^4.0.1", 1582 | "make-error": "^1.1.1", 1583 | "v8-compile-cache-lib": "^3.0.1", 1584 | "yn": "3.1.1" 1585 | }, 1586 | "bin": { 1587 | "ts-node": "dist/bin.js", 1588 | "ts-node-cwd": "dist/bin-cwd.js", 1589 | "ts-node-esm": "dist/bin-esm.js", 1590 | "ts-node-script": "dist/bin-script.js", 1591 | "ts-node-transpile-only": "dist/bin-transpile.js", 1592 | "ts-script": "dist/bin-script-deprecated.js" 1593 | }, 1594 | "peerDependencies": { 1595 | "@swc/core": ">=1.2.50", 1596 | "@swc/wasm": ">=1.2.50", 1597 | "@types/node": "*", 1598 | "typescript": ">=2.7" 1599 | }, 1600 | "peerDependenciesMeta": { 1601 | "@swc/core": { 1602 | "optional": true 1603 | }, 1604 | "@swc/wasm": { 1605 | "optional": true 1606 | } 1607 | } 1608 | }, 1609 | "node_modules/tslib": { 1610 | "version": "2.5.0", 1611 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 1612 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" 1613 | }, 1614 | "node_modules/type-fest": { 1615 | "version": "0.21.3", 1616 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1617 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 1618 | "peer": true, 1619 | "engines": { 1620 | "node": ">=10" 1621 | }, 1622 | "funding": { 1623 | "url": "https://github.com/sponsors/sindresorhus" 1624 | } 1625 | }, 1626 | "node_modules/typescript": { 1627 | "version": "4.9.5", 1628 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1629 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1630 | "dev": true, 1631 | "bin": { 1632 | "tsc": "bin/tsc", 1633 | "tsserver": "bin/tsserver" 1634 | }, 1635 | "engines": { 1636 | "node": ">=4.2.0" 1637 | } 1638 | }, 1639 | "node_modules/uid": { 1640 | "version": "2.0.1", 1641 | "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.1.tgz", 1642 | "integrity": "sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==", 1643 | "dependencies": { 1644 | "@lukeed/csprng": "^1.0.0" 1645 | }, 1646 | "engines": { 1647 | "node": ">=8" 1648 | } 1649 | }, 1650 | "node_modules/undefsafe": { 1651 | "version": "2.0.5", 1652 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1653 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1654 | "dev": true 1655 | }, 1656 | "node_modules/uri-js": { 1657 | "version": "4.4.1", 1658 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1659 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1660 | "dependencies": { 1661 | "punycode": "^2.1.0" 1662 | } 1663 | }, 1664 | "node_modules/util-deprecate": { 1665 | "version": "1.0.2", 1666 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1667 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1668 | "peer": true 1669 | }, 1670 | "node_modules/v8-compile-cache-lib": { 1671 | "version": "3.0.1", 1672 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1673 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1674 | "dev": true 1675 | }, 1676 | "node_modules/wcwidth": { 1677 | "version": "1.0.1", 1678 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1679 | "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 1680 | "peer": true, 1681 | "dependencies": { 1682 | "defaults": "^1.0.3" 1683 | } 1684 | }, 1685 | "node_modules/webidl-conversions": { 1686 | "version": "3.0.1", 1687 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1688 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 1689 | }, 1690 | "node_modules/whatwg-url": { 1691 | "version": "5.0.0", 1692 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1693 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1694 | "dependencies": { 1695 | "tr46": "~0.0.3", 1696 | "webidl-conversions": "^3.0.0" 1697 | } 1698 | }, 1699 | "node_modules/wrap-ansi": { 1700 | "version": "7.0.0", 1701 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1702 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1703 | "peer": true, 1704 | "dependencies": { 1705 | "ansi-styles": "^4.0.0", 1706 | "string-width": "^4.1.0", 1707 | "strip-ansi": "^6.0.0" 1708 | }, 1709 | "engines": { 1710 | "node": ">=10" 1711 | }, 1712 | "funding": { 1713 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1714 | } 1715 | }, 1716 | "node_modules/yallist": { 1717 | "version": "4.0.0", 1718 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1719 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1720 | "dev": true 1721 | }, 1722 | "node_modules/yargs-parser": { 1723 | "version": "21.1.1", 1724 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1725 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1726 | "peer": true, 1727 | "engines": { 1728 | "node": ">=12" 1729 | } 1730 | }, 1731 | "node_modules/yn": { 1732 | "version": "3.1.1", 1733 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1734 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1735 | "dev": true, 1736 | "engines": { 1737 | "node": ">=6" 1738 | } 1739 | } 1740 | }, 1741 | "dependencies": { 1742 | "@colors/colors": { 1743 | "version": "1.5.0", 1744 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", 1745 | "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", 1746 | "optional": true, 1747 | "peer": true 1748 | }, 1749 | "@cspotcode/source-map-support": { 1750 | "version": "0.8.1", 1751 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 1752 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 1753 | "dev": true, 1754 | "requires": { 1755 | "@jridgewell/trace-mapping": "0.3.9" 1756 | } 1757 | }, 1758 | "@jridgewell/resolve-uri": { 1759 | "version": "3.1.1", 1760 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 1761 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 1762 | "dev": true 1763 | }, 1764 | "@jridgewell/sourcemap-codec": { 1765 | "version": "1.4.15", 1766 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 1767 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 1768 | "dev": true 1769 | }, 1770 | "@jridgewell/trace-mapping": { 1771 | "version": "0.3.9", 1772 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1773 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1774 | "dev": true, 1775 | "requires": { 1776 | "@jridgewell/resolve-uri": "^3.0.3", 1777 | "@jridgewell/sourcemap-codec": "^1.4.10" 1778 | } 1779 | }, 1780 | "@lukeed/csprng": { 1781 | "version": "1.0.1", 1782 | "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.0.1.tgz", 1783 | "integrity": "sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==" 1784 | }, 1785 | "@nestjs/common": { 1786 | "version": "9.3.9", 1787 | "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.3.9.tgz", 1788 | "integrity": "sha512-GshTD9Xz+wD2em6NyzU4NXw5IXMUmapgDgD+iuj6XL0258hvDwODmNk37mBBnZvTZlqER+krvIUKnS34etqF/A==", 1789 | "requires": { 1790 | "iterare": "1.2.1", 1791 | "tslib": "2.5.0", 1792 | "uid": "2.0.1" 1793 | } 1794 | }, 1795 | "@nestjs/core": { 1796 | "version": "9.3.9", 1797 | "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.9.tgz", 1798 | "integrity": "sha512-9g1A1G9eirLXEpH21rc6dKb08zHc2+adhCRz8NW39hbejcsxxD72FApJzt4QBQAKvu862ixt/tdpStnFT7lOSw==", 1799 | "requires": { 1800 | "@nuxtjs/opencollective": "0.3.2", 1801 | "fast-safe-stringify": "2.1.1", 1802 | "iterare": "1.2.1", 1803 | "path-to-regexp": "3.2.0", 1804 | "tslib": "2.5.0", 1805 | "uid": "2.0.1" 1806 | } 1807 | }, 1808 | "@nuxtjs/opencollective": { 1809 | "version": "0.3.2", 1810 | "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", 1811 | "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", 1812 | "requires": { 1813 | "chalk": "^4.1.0", 1814 | "consola": "^2.15.0", 1815 | "node-fetch": "^2.6.1" 1816 | } 1817 | }, 1818 | "@squareboat/nest-console": { 1819 | "version": "1.1.4", 1820 | "resolved": "https://registry.npmjs.org/@squareboat/nest-console/-/nest-console-1.1.4.tgz", 1821 | "integrity": "sha512-ENcE1Q6UyUF+B2ca9o956/yErRuVAaw+iw+/LMwtaoY42IzyQC6s4K7lLrRf9YCez2T9rg9jZxKt33NNLpahrw==", 1822 | "peer": true, 1823 | "requires": { 1824 | "app-root-path": "^3.1.0", 1825 | "cli-table3": "^0.6.3", 1826 | "inquirer": "^8.0.0", 1827 | "ora": "^5.4.1", 1828 | "picocolors": "^1.0.0", 1829 | "yargs-parser": "^21.1.1" 1830 | } 1831 | }, 1832 | "@tsconfig/node10": { 1833 | "version": "1.0.9", 1834 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 1835 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 1836 | "dev": true 1837 | }, 1838 | "@tsconfig/node12": { 1839 | "version": "1.0.11", 1840 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 1841 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 1842 | "dev": true 1843 | }, 1844 | "@tsconfig/node14": { 1845 | "version": "1.0.3", 1846 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 1847 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 1848 | "dev": true 1849 | }, 1850 | "@tsconfig/node16": { 1851 | "version": "1.0.4", 1852 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 1853 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 1854 | "dev": true 1855 | }, 1856 | "@types/node": { 1857 | "version": "18.14.0", 1858 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", 1859 | "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", 1860 | "dev": true 1861 | }, 1862 | "abbrev": { 1863 | "version": "1.1.1", 1864 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1865 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1866 | "dev": true 1867 | }, 1868 | "acorn": { 1869 | "version": "8.10.0", 1870 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 1871 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 1872 | "dev": true 1873 | }, 1874 | "acorn-walk": { 1875 | "version": "8.2.0", 1876 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 1877 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 1878 | "dev": true 1879 | }, 1880 | "ajv": { 1881 | "version": "8.12.0", 1882 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", 1883 | "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", 1884 | "requires": { 1885 | "fast-deep-equal": "^3.1.1", 1886 | "json-schema-traverse": "^1.0.0", 1887 | "require-from-string": "^2.0.2", 1888 | "uri-js": "^4.2.2" 1889 | } 1890 | }, 1891 | "ajv-formats": { 1892 | "version": "2.1.1", 1893 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 1894 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 1895 | "requires": { 1896 | "ajv": "^8.0.0" 1897 | } 1898 | }, 1899 | "ansi-escapes": { 1900 | "version": "4.3.2", 1901 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1902 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1903 | "peer": true, 1904 | "requires": { 1905 | "type-fest": "^0.21.3" 1906 | } 1907 | }, 1908 | "ansi-regex": { 1909 | "version": "5.0.1", 1910 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1911 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1912 | "peer": true 1913 | }, 1914 | "ansi-styles": { 1915 | "version": "4.3.0", 1916 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1917 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1918 | "requires": { 1919 | "color-convert": "^2.0.1" 1920 | } 1921 | }, 1922 | "anymatch": { 1923 | "version": "3.1.3", 1924 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1925 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1926 | "dev": true, 1927 | "requires": { 1928 | "normalize-path": "^3.0.0", 1929 | "picomatch": "^2.0.4" 1930 | } 1931 | }, 1932 | "app-root-path": { 1933 | "version": "3.1.0", 1934 | "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", 1935 | "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", 1936 | "peer": true 1937 | }, 1938 | "arg": { 1939 | "version": "4.1.3", 1940 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 1941 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 1942 | "dev": true 1943 | }, 1944 | "balanced-match": { 1945 | "version": "1.0.2", 1946 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1947 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1948 | "dev": true 1949 | }, 1950 | "base64-js": { 1951 | "version": "1.5.1", 1952 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1953 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1954 | "peer": true 1955 | }, 1956 | "binary-extensions": { 1957 | "version": "2.2.0", 1958 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1959 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1960 | "dev": true 1961 | }, 1962 | "bl": { 1963 | "version": "4.1.0", 1964 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 1965 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 1966 | "peer": true, 1967 | "requires": { 1968 | "buffer": "^5.5.0", 1969 | "inherits": "^2.0.4", 1970 | "readable-stream": "^3.4.0" 1971 | } 1972 | }, 1973 | "brace-expansion": { 1974 | "version": "1.1.11", 1975 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1976 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1977 | "dev": true, 1978 | "requires": { 1979 | "balanced-match": "^1.0.0", 1980 | "concat-map": "0.0.1" 1981 | } 1982 | }, 1983 | "braces": { 1984 | "version": "3.0.2", 1985 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1986 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1987 | "dev": true, 1988 | "requires": { 1989 | "fill-range": "^7.0.1" 1990 | } 1991 | }, 1992 | "buffer": { 1993 | "version": "5.7.1", 1994 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 1995 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 1996 | "peer": true, 1997 | "requires": { 1998 | "base64-js": "^1.3.1", 1999 | "ieee754": "^1.1.13" 2000 | } 2001 | }, 2002 | "chalk": { 2003 | "version": "4.1.2", 2004 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2005 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 2006 | "requires": { 2007 | "ansi-styles": "^4.1.0", 2008 | "supports-color": "^7.1.0" 2009 | } 2010 | }, 2011 | "chardet": { 2012 | "version": "0.7.0", 2013 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 2014 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 2015 | "peer": true 2016 | }, 2017 | "chokidar": { 2018 | "version": "3.5.3", 2019 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2020 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2021 | "dev": true, 2022 | "requires": { 2023 | "anymatch": "~3.1.2", 2024 | "braces": "~3.0.2", 2025 | "fsevents": "~2.3.2", 2026 | "glob-parent": "~5.1.2", 2027 | "is-binary-path": "~2.1.0", 2028 | "is-glob": "~4.0.1", 2029 | "normalize-path": "~3.0.0", 2030 | "readdirp": "~3.6.0" 2031 | } 2032 | }, 2033 | "cli-cursor": { 2034 | "version": "3.1.0", 2035 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 2036 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 2037 | "peer": true, 2038 | "requires": { 2039 | "restore-cursor": "^3.1.0" 2040 | } 2041 | }, 2042 | "cli-spinners": { 2043 | "version": "2.7.0", 2044 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", 2045 | "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", 2046 | "peer": true 2047 | }, 2048 | "cli-table3": { 2049 | "version": "0.6.3", 2050 | "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", 2051 | "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", 2052 | "peer": true, 2053 | "requires": { 2054 | "@colors/colors": "1.5.0", 2055 | "string-width": "^4.2.0" 2056 | } 2057 | }, 2058 | "cli-width": { 2059 | "version": "3.0.0", 2060 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 2061 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 2062 | "peer": true 2063 | }, 2064 | "clone": { 2065 | "version": "1.0.4", 2066 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 2067 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", 2068 | "peer": true 2069 | }, 2070 | "color-convert": { 2071 | "version": "2.0.1", 2072 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2073 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2074 | "requires": { 2075 | "color-name": "~1.1.4" 2076 | } 2077 | }, 2078 | "color-name": { 2079 | "version": "1.1.4", 2080 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2081 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 2082 | }, 2083 | "colorette": { 2084 | "version": "2.0.19", 2085 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", 2086 | "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" 2087 | }, 2088 | "commander": { 2089 | "version": "9.5.0", 2090 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 2091 | "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" 2092 | }, 2093 | "concat-map": { 2094 | "version": "0.0.1", 2095 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2096 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2097 | "dev": true 2098 | }, 2099 | "consola": { 2100 | "version": "2.15.3", 2101 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", 2102 | "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" 2103 | }, 2104 | "create-require": { 2105 | "version": "1.1.1", 2106 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 2107 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 2108 | "dev": true 2109 | }, 2110 | "db-errors": { 2111 | "version": "0.2.3", 2112 | "resolved": "https://registry.npmjs.org/db-errors/-/db-errors-0.2.3.tgz", 2113 | "integrity": "sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng==" 2114 | }, 2115 | "debug": { 2116 | "version": "4.3.4", 2117 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2118 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2119 | "requires": { 2120 | "ms": "2.1.2" 2121 | } 2122 | }, 2123 | "defaults": { 2124 | "version": "1.0.4", 2125 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", 2126 | "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 2127 | "peer": true, 2128 | "requires": { 2129 | "clone": "^1.0.2" 2130 | } 2131 | }, 2132 | "diff": { 2133 | "version": "4.0.2", 2134 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 2135 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 2136 | "dev": true 2137 | }, 2138 | "emoji-regex": { 2139 | "version": "8.0.0", 2140 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2141 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2142 | "peer": true 2143 | }, 2144 | "escalade": { 2145 | "version": "3.1.1", 2146 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2147 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 2148 | }, 2149 | "escape-string-regexp": { 2150 | "version": "1.0.5", 2151 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2152 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2153 | "peer": true 2154 | }, 2155 | "esm": { 2156 | "version": "3.2.25", 2157 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", 2158 | "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" 2159 | }, 2160 | "external-editor": { 2161 | "version": "3.1.0", 2162 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 2163 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 2164 | "peer": true, 2165 | "requires": { 2166 | "chardet": "^0.7.0", 2167 | "iconv-lite": "^0.4.24", 2168 | "tmp": "^0.0.33" 2169 | } 2170 | }, 2171 | "fast-deep-equal": { 2172 | "version": "3.1.3", 2173 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2174 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 2175 | }, 2176 | "fast-safe-stringify": { 2177 | "version": "2.1.1", 2178 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 2179 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" 2180 | }, 2181 | "figures": { 2182 | "version": "3.2.0", 2183 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 2184 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 2185 | "peer": true, 2186 | "requires": { 2187 | "escape-string-regexp": "^1.0.5" 2188 | } 2189 | }, 2190 | "fill-range": { 2191 | "version": "7.0.1", 2192 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2193 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2194 | "dev": true, 2195 | "requires": { 2196 | "to-regex-range": "^5.0.1" 2197 | } 2198 | }, 2199 | "fsevents": { 2200 | "version": "2.3.2", 2201 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2202 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2203 | "dev": true, 2204 | "optional": true 2205 | }, 2206 | "function-bind": { 2207 | "version": "1.1.1", 2208 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2209 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 2210 | }, 2211 | "get-package-type": { 2212 | "version": "0.1.0", 2213 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 2214 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" 2215 | }, 2216 | "getopts": { 2217 | "version": "2.3.0", 2218 | "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", 2219 | "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" 2220 | }, 2221 | "glob-parent": { 2222 | "version": "5.1.2", 2223 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2224 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2225 | "dev": true, 2226 | "requires": { 2227 | "is-glob": "^4.0.1" 2228 | } 2229 | }, 2230 | "has": { 2231 | "version": "1.0.3", 2232 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2233 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2234 | "requires": { 2235 | "function-bind": "^1.1.1" 2236 | } 2237 | }, 2238 | "has-flag": { 2239 | "version": "4.0.0", 2240 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2241 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 2242 | }, 2243 | "iconv-lite": { 2244 | "version": "0.4.24", 2245 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2246 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2247 | "peer": true, 2248 | "requires": { 2249 | "safer-buffer": ">= 2.1.2 < 3" 2250 | } 2251 | }, 2252 | "ieee754": { 2253 | "version": "1.2.1", 2254 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 2255 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 2256 | "peer": true 2257 | }, 2258 | "ignore-by-default": { 2259 | "version": "1.0.1", 2260 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 2261 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 2262 | "dev": true 2263 | }, 2264 | "inherits": { 2265 | "version": "2.0.4", 2266 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2267 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2268 | "peer": true 2269 | }, 2270 | "inquirer": { 2271 | "version": "8.2.5", 2272 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", 2273 | "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", 2274 | "peer": true, 2275 | "requires": { 2276 | "ansi-escapes": "^4.2.1", 2277 | "chalk": "^4.1.1", 2278 | "cli-cursor": "^3.1.0", 2279 | "cli-width": "^3.0.0", 2280 | "external-editor": "^3.0.3", 2281 | "figures": "^3.0.0", 2282 | "lodash": "^4.17.21", 2283 | "mute-stream": "0.0.8", 2284 | "ora": "^5.4.1", 2285 | "run-async": "^2.4.0", 2286 | "rxjs": "^7.5.5", 2287 | "string-width": "^4.1.0", 2288 | "strip-ansi": "^6.0.0", 2289 | "through": "^2.3.6", 2290 | "wrap-ansi": "^7.0.0" 2291 | } 2292 | }, 2293 | "interpret": { 2294 | "version": "2.2.0", 2295 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", 2296 | "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" 2297 | }, 2298 | "is-binary-path": { 2299 | "version": "2.1.0", 2300 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2301 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2302 | "dev": true, 2303 | "requires": { 2304 | "binary-extensions": "^2.0.0" 2305 | } 2306 | }, 2307 | "is-core-module": { 2308 | "version": "2.11.0", 2309 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2310 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2311 | "requires": { 2312 | "has": "^1.0.3" 2313 | } 2314 | }, 2315 | "is-extglob": { 2316 | "version": "2.1.1", 2317 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2318 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2319 | "dev": true 2320 | }, 2321 | "is-fullwidth-code-point": { 2322 | "version": "3.0.0", 2323 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2324 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2325 | "peer": true 2326 | }, 2327 | "is-glob": { 2328 | "version": "4.0.3", 2329 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2330 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2331 | "dev": true, 2332 | "requires": { 2333 | "is-extglob": "^2.1.1" 2334 | } 2335 | }, 2336 | "is-interactive": { 2337 | "version": "1.0.0", 2338 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 2339 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 2340 | "peer": true 2341 | }, 2342 | "is-number": { 2343 | "version": "7.0.0", 2344 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2345 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2346 | "dev": true 2347 | }, 2348 | "is-unicode-supported": { 2349 | "version": "0.1.0", 2350 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 2351 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 2352 | "peer": true 2353 | }, 2354 | "iterare": { 2355 | "version": "1.2.1", 2356 | "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", 2357 | "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" 2358 | }, 2359 | "json-schema-traverse": { 2360 | "version": "1.0.0", 2361 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2362 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 2363 | }, 2364 | "knex": { 2365 | "version": "2.4.2", 2366 | "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz", 2367 | "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==", 2368 | "requires": { 2369 | "colorette": "2.0.19", 2370 | "commander": "^9.1.0", 2371 | "debug": "4.3.4", 2372 | "escalade": "^3.1.1", 2373 | "esm": "^3.2.25", 2374 | "get-package-type": "^0.1.0", 2375 | "getopts": "2.3.0", 2376 | "interpret": "^2.2.0", 2377 | "lodash": "^4.17.21", 2378 | "pg-connection-string": "2.5.0", 2379 | "rechoir": "^0.8.0", 2380 | "resolve-from": "^5.0.0", 2381 | "tarn": "^3.0.2", 2382 | "tildify": "2.0.0" 2383 | } 2384 | }, 2385 | "lodash": { 2386 | "version": "4.17.21", 2387 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2388 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 2389 | }, 2390 | "log-symbols": { 2391 | "version": "4.1.0", 2392 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2393 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2394 | "peer": true, 2395 | "requires": { 2396 | "chalk": "^4.1.0", 2397 | "is-unicode-supported": "^0.1.0" 2398 | } 2399 | }, 2400 | "lru-cache": { 2401 | "version": "6.0.0", 2402 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2403 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2404 | "dev": true, 2405 | "requires": { 2406 | "yallist": "^4.0.0" 2407 | } 2408 | }, 2409 | "make-error": { 2410 | "version": "1.3.6", 2411 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2412 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 2413 | "dev": true 2414 | }, 2415 | "mimic-fn": { 2416 | "version": "2.1.0", 2417 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2418 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2419 | "peer": true 2420 | }, 2421 | "minimatch": { 2422 | "version": "3.1.2", 2423 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2424 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2425 | "dev": true, 2426 | "requires": { 2427 | "brace-expansion": "^1.1.7" 2428 | } 2429 | }, 2430 | "ms": { 2431 | "version": "2.1.2", 2432 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2433 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2434 | }, 2435 | "mute-stream": { 2436 | "version": "0.0.8", 2437 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 2438 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 2439 | "peer": true 2440 | }, 2441 | "node-fetch": { 2442 | "version": "2.6.9", 2443 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", 2444 | "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", 2445 | "requires": { 2446 | "whatwg-url": "^5.0.0" 2447 | } 2448 | }, 2449 | "nodemon": { 2450 | "version": "3.0.1", 2451 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", 2452 | "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", 2453 | "dev": true, 2454 | "requires": { 2455 | "chokidar": "^3.5.2", 2456 | "debug": "^3.2.7", 2457 | "ignore-by-default": "^1.0.1", 2458 | "minimatch": "^3.1.2", 2459 | "pstree.remy": "^1.1.8", 2460 | "semver": "^7.5.3", 2461 | "simple-update-notifier": "^2.0.0", 2462 | "supports-color": "^5.5.0", 2463 | "touch": "^3.1.0", 2464 | "undefsafe": "^2.0.5" 2465 | }, 2466 | "dependencies": { 2467 | "debug": { 2468 | "version": "3.2.7", 2469 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 2470 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 2471 | "dev": true, 2472 | "requires": { 2473 | "ms": "^2.1.1" 2474 | } 2475 | }, 2476 | "has-flag": { 2477 | "version": "3.0.0", 2478 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2479 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2480 | "dev": true 2481 | }, 2482 | "supports-color": { 2483 | "version": "5.5.0", 2484 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2485 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2486 | "dev": true, 2487 | "requires": { 2488 | "has-flag": "^3.0.0" 2489 | } 2490 | } 2491 | } 2492 | }, 2493 | "nopt": { 2494 | "version": "1.0.10", 2495 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 2496 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 2497 | "dev": true, 2498 | "requires": { 2499 | "abbrev": "1" 2500 | } 2501 | }, 2502 | "normalize-path": { 2503 | "version": "3.0.0", 2504 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2505 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2506 | "dev": true 2507 | }, 2508 | "objection": { 2509 | "version": "3.1.3", 2510 | "resolved": "https://registry.npmjs.org/objection/-/objection-3.1.3.tgz", 2511 | "integrity": "sha512-X4DH8/xKBS34bwWOSLAPyceg0JgLhLiUuz+cEEyDA8iDFoT1UM9UbtwBpwHV11hYskAKxOgVlNHeveFQiOPDXA==", 2512 | "requires": { 2513 | "ajv": "^8.12.0", 2514 | "ajv-formats": "^2.1.1", 2515 | "db-errors": "^0.2.3" 2516 | } 2517 | }, 2518 | "onetime": { 2519 | "version": "5.1.2", 2520 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2521 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2522 | "peer": true, 2523 | "requires": { 2524 | "mimic-fn": "^2.1.0" 2525 | } 2526 | }, 2527 | "ora": { 2528 | "version": "5.4.1", 2529 | "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", 2530 | "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", 2531 | "peer": true, 2532 | "requires": { 2533 | "bl": "^4.1.0", 2534 | "chalk": "^4.1.0", 2535 | "cli-cursor": "^3.1.0", 2536 | "cli-spinners": "^2.5.0", 2537 | "is-interactive": "^1.0.0", 2538 | "is-unicode-supported": "^0.1.0", 2539 | "log-symbols": "^4.1.0", 2540 | "strip-ansi": "^6.0.0", 2541 | "wcwidth": "^1.0.1" 2542 | } 2543 | }, 2544 | "os-tmpdir": { 2545 | "version": "1.0.2", 2546 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2547 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 2548 | "peer": true 2549 | }, 2550 | "path-parse": { 2551 | "version": "1.0.7", 2552 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2553 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 2554 | }, 2555 | "path-to-regexp": { 2556 | "version": "3.2.0", 2557 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", 2558 | "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" 2559 | }, 2560 | "pg-connection-string": { 2561 | "version": "2.5.0", 2562 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 2563 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 2564 | }, 2565 | "picocolors": { 2566 | "version": "1.0.0", 2567 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2568 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2569 | "peer": true 2570 | }, 2571 | "picomatch": { 2572 | "version": "2.3.1", 2573 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2574 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2575 | "dev": true 2576 | }, 2577 | "pstree.remy": { 2578 | "version": "1.1.8", 2579 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 2580 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 2581 | "dev": true 2582 | }, 2583 | "punycode": { 2584 | "version": "2.3.1", 2585 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2586 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" 2587 | }, 2588 | "readable-stream": { 2589 | "version": "3.6.0", 2590 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2591 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2592 | "peer": true, 2593 | "requires": { 2594 | "inherits": "^2.0.3", 2595 | "string_decoder": "^1.1.1", 2596 | "util-deprecate": "^1.0.1" 2597 | } 2598 | }, 2599 | "readdirp": { 2600 | "version": "3.6.0", 2601 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2602 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2603 | "dev": true, 2604 | "requires": { 2605 | "picomatch": "^2.2.1" 2606 | } 2607 | }, 2608 | "rechoir": { 2609 | "version": "0.8.0", 2610 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", 2611 | "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", 2612 | "requires": { 2613 | "resolve": "^1.20.0" 2614 | } 2615 | }, 2616 | "reflect-metadata": { 2617 | "version": "0.1.13", 2618 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 2619 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", 2620 | "peer": true 2621 | }, 2622 | "require-from-string": { 2623 | "version": "2.0.2", 2624 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2625 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" 2626 | }, 2627 | "resolve": { 2628 | "version": "1.22.1", 2629 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 2630 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 2631 | "requires": { 2632 | "is-core-module": "^2.9.0", 2633 | "path-parse": "^1.0.7", 2634 | "supports-preserve-symlinks-flag": "^1.0.0" 2635 | } 2636 | }, 2637 | "resolve-from": { 2638 | "version": "5.0.0", 2639 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2640 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" 2641 | }, 2642 | "restore-cursor": { 2643 | "version": "3.1.0", 2644 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 2645 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2646 | "peer": true, 2647 | "requires": { 2648 | "onetime": "^5.1.0", 2649 | "signal-exit": "^3.0.2" 2650 | } 2651 | }, 2652 | "run-async": { 2653 | "version": "2.4.1", 2654 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 2655 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 2656 | "peer": true 2657 | }, 2658 | "rxjs": { 2659 | "version": "7.8.0", 2660 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", 2661 | "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", 2662 | "peer": true, 2663 | "requires": { 2664 | "tslib": "^2.1.0" 2665 | } 2666 | }, 2667 | "safe-buffer": { 2668 | "version": "5.2.1", 2669 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2670 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2671 | "peer": true 2672 | }, 2673 | "safer-buffer": { 2674 | "version": "2.1.2", 2675 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2676 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2677 | "peer": true 2678 | }, 2679 | "semver": { 2680 | "version": "7.5.4", 2681 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2682 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2683 | "dev": true, 2684 | "requires": { 2685 | "lru-cache": "^6.0.0" 2686 | } 2687 | }, 2688 | "signal-exit": { 2689 | "version": "3.0.7", 2690 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2691 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2692 | "peer": true 2693 | }, 2694 | "simple-update-notifier": { 2695 | "version": "2.0.0", 2696 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 2697 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 2698 | "dev": true, 2699 | "requires": { 2700 | "semver": "^7.5.3" 2701 | } 2702 | }, 2703 | "string_decoder": { 2704 | "version": "1.3.0", 2705 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2706 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2707 | "peer": true, 2708 | "requires": { 2709 | "safe-buffer": "~5.2.0" 2710 | } 2711 | }, 2712 | "string-width": { 2713 | "version": "4.2.3", 2714 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2715 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2716 | "peer": true, 2717 | "requires": { 2718 | "emoji-regex": "^8.0.0", 2719 | "is-fullwidth-code-point": "^3.0.0", 2720 | "strip-ansi": "^6.0.1" 2721 | } 2722 | }, 2723 | "strip-ansi": { 2724 | "version": "6.0.1", 2725 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2726 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2727 | "peer": true, 2728 | "requires": { 2729 | "ansi-regex": "^5.0.1" 2730 | } 2731 | }, 2732 | "supports-color": { 2733 | "version": "7.2.0", 2734 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2735 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2736 | "requires": { 2737 | "has-flag": "^4.0.0" 2738 | } 2739 | }, 2740 | "supports-preserve-symlinks-flag": { 2741 | "version": "1.0.0", 2742 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2743 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 2744 | }, 2745 | "tarn": { 2746 | "version": "3.0.2", 2747 | "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", 2748 | "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==" 2749 | }, 2750 | "through": { 2751 | "version": "2.3.8", 2752 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2753 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 2754 | "peer": true 2755 | }, 2756 | "tildify": { 2757 | "version": "2.0.0", 2758 | "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", 2759 | "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" 2760 | }, 2761 | "tmp": { 2762 | "version": "0.0.33", 2763 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2764 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2765 | "peer": true, 2766 | "requires": { 2767 | "os-tmpdir": "~1.0.2" 2768 | } 2769 | }, 2770 | "to-regex-range": { 2771 | "version": "5.0.1", 2772 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2773 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2774 | "dev": true, 2775 | "requires": { 2776 | "is-number": "^7.0.0" 2777 | } 2778 | }, 2779 | "touch": { 2780 | "version": "3.1.0", 2781 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 2782 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 2783 | "dev": true, 2784 | "requires": { 2785 | "nopt": "~1.0.10" 2786 | } 2787 | }, 2788 | "tr46": { 2789 | "version": "0.0.3", 2790 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2791 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2792 | }, 2793 | "ts-node": { 2794 | "version": "10.9.1", 2795 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 2796 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 2797 | "dev": true, 2798 | "requires": { 2799 | "@cspotcode/source-map-support": "^0.8.0", 2800 | "@tsconfig/node10": "^1.0.7", 2801 | "@tsconfig/node12": "^1.0.7", 2802 | "@tsconfig/node14": "^1.0.0", 2803 | "@tsconfig/node16": "^1.0.2", 2804 | "acorn": "^8.4.1", 2805 | "acorn-walk": "^8.1.1", 2806 | "arg": "^4.1.0", 2807 | "create-require": "^1.1.0", 2808 | "diff": "^4.0.1", 2809 | "make-error": "^1.1.1", 2810 | "v8-compile-cache-lib": "^3.0.1", 2811 | "yn": "3.1.1" 2812 | } 2813 | }, 2814 | "tslib": { 2815 | "version": "2.5.0", 2816 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 2817 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" 2818 | }, 2819 | "type-fest": { 2820 | "version": "0.21.3", 2821 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 2822 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 2823 | "peer": true 2824 | }, 2825 | "typescript": { 2826 | "version": "4.9.5", 2827 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 2828 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 2829 | "dev": true 2830 | }, 2831 | "uid": { 2832 | "version": "2.0.1", 2833 | "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.1.tgz", 2834 | "integrity": "sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==", 2835 | "requires": { 2836 | "@lukeed/csprng": "^1.0.0" 2837 | } 2838 | }, 2839 | "undefsafe": { 2840 | "version": "2.0.5", 2841 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 2842 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 2843 | "dev": true 2844 | }, 2845 | "uri-js": { 2846 | "version": "4.4.1", 2847 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2848 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2849 | "requires": { 2850 | "punycode": "^2.1.0" 2851 | } 2852 | }, 2853 | "util-deprecate": { 2854 | "version": "1.0.2", 2855 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2856 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2857 | "peer": true 2858 | }, 2859 | "v8-compile-cache-lib": { 2860 | "version": "3.0.1", 2861 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2862 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2863 | "dev": true 2864 | }, 2865 | "wcwidth": { 2866 | "version": "1.0.1", 2867 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 2868 | "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 2869 | "peer": true, 2870 | "requires": { 2871 | "defaults": "^1.0.3" 2872 | } 2873 | }, 2874 | "webidl-conversions": { 2875 | "version": "3.0.1", 2876 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2877 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2878 | }, 2879 | "whatwg-url": { 2880 | "version": "5.0.0", 2881 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2882 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2883 | "requires": { 2884 | "tr46": "~0.0.3", 2885 | "webidl-conversions": "^3.0.0" 2886 | } 2887 | }, 2888 | "wrap-ansi": { 2889 | "version": "7.0.0", 2890 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2891 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2892 | "peer": true, 2893 | "requires": { 2894 | "ansi-styles": "^4.0.0", 2895 | "string-width": "^4.1.0", 2896 | "strip-ansi": "^6.0.0" 2897 | } 2898 | }, 2899 | "yallist": { 2900 | "version": "4.0.0", 2901 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2902 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2903 | "dev": true 2904 | }, 2905 | "yargs-parser": { 2906 | "version": "21.1.1", 2907 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2908 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2909 | "peer": true 2910 | }, 2911 | "yn": { 2912 | "version": "3.1.1", 2913 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2914 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2915 | "dev": true 2916 | } 2917 | } 2918 | } 2919 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@squareboat/nestjs-objection", 3 | "version": "0.3.8", 4 | "description": "The objection database package for your NestJS Applications", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "keywords": [ 8 | "nestjs", 9 | "nestjs-objection", 10 | "nestjs-database", 11 | "nestjs-mysql", 12 | "nestjs-postgres", 13 | "nestjs-knex" 14 | ], 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/squareboat/nestjs-objection.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/squareboat/nestjs-objection/issues" 21 | }, 22 | "homepage": "https://squareboat.com/open-source/database/", 23 | "author": "Vinayak Sarawagi ", 24 | "private": false, 25 | "license": "MIT", 26 | "scripts": { 27 | "build": "rm -rf dist && tsc -p tsconfig.json", 28 | "format": "prettier --write \"**/*.ts\"", 29 | "lint": "eslint 'lib/**/*.ts' --fix", 30 | "prepublish:npm": "npm run build", 31 | "publish:npm": "npm publish --access public", 32 | "prepublish:next": "npm run build", 33 | "publish:next": "npm publish --access public --tag next", 34 | "test:e2e": "jest --config ./tests/jest-e2e.json --runInBand", 35 | "test:e2e:dev": "jest --config ./tests/jest-e2e.json --runInBand --watch" 36 | }, 37 | "devDependencies": { 38 | "@nestjs/common": "^9.0.3", 39 | "@nestjs/core": "^9.0.3", 40 | "@types/node": "^18.0.5", 41 | "nodemon": "^3.0.1", 42 | "ts-node": "^10.9.1", 43 | "typescript": "^4.7.4" 44 | }, 45 | "peerDependencies": { 46 | "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", 47 | "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", 48 | "@squareboat/nest-console": "^1.1.4", 49 | "reflect-metadata": "^0.1.13" 50 | }, 51 | "dependencies": { 52 | "knex": "^2.1.0", 53 | "objection": "^3.1.3" 54 | } 55 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "strict": true, 6 | "removeComments": true, 7 | "noLib": false, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es6", 11 | "sourceMap": false, 12 | "outDir": "./dist", 13 | "rootDir": "./lib", 14 | "skipLibCheck": true 15 | }, 16 | "include": ["lib/**/*"], 17 | "exclude": ["node_modules", "**/*.spec.ts", "tests"] 18 | } 19 | --------------------------------------------------------------------------------