diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..8d962f9d1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,78 @@ +# Changelog + +### 0.9.17 (December 27, 2021) +### Fixes and Functionality: +- Add serializer `fromDb()` method to introspect selected database to drizzle-kit json shanpsot format + +--- +### 0.9.16 (December 27, 2021) +### Breaking changes: +- Delete `autoincrement` type on columns. Right now you should use `serial` type + +#### Previous serial column defining: +```typescript +public id = this.int('id').autoincrement(); +``` +#### Current serial column defining: +```typescript +public id = this.serial('id'); +``` + +- Move `notNull` from column type metadata to builder chain +#### Previous notNull defining: +```typescript +public phone = this.varchar('phone', { notNull: true }); +``` +#### Current notNull defining: +```typescript +public phone = this.varchar('phone').notNull(); +``` + +- Divide `BigInt` into 2 types -> `BigInt53` and `BigInt64` +- Divide `BigSerial` into 2 types -> `BigSerial53` and `BigSerial64` + + Due to have max value for big integers in postgres as 2^64 and javascript max value for integers is 2^53 + + If you sure, that value in this column won't be more than 2^53 you could use: + ```typescript + public bigIntField = this.bigint('test1', 'max_bytes_53'); + ``` + that will be of type `number` in typescript + + If value in this column could be more than 2^53 you could use: + ```typescript + public bigIntField = this.bigint('test1', 'max_bytes_64'); + ``` + that will be of type `bigint` in typescript +--- + +### Fixes and Functionality: +- Add `SET NULL` and `SET DEFAULT` for `ON DELETE` and `ON UPDATE` constraints + +#### Example of usage +```typescript +public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onUpdate: 'SET NULL' }); + +public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onDelete: 'SET DEFAULT' }); +``` +- Add default value for timestamp +```typescript +public createdAt = this.timestamp('created_at').defaultValue(Defaults.CURRENT_TIMESTAMP); +``` +- Add `timestamp with timezone` type +```typescript +public createdAt = this.timestamptz('created_at'); +``` +- Add migrator function to use `drizzle-kit` generated migrations +##### Provide drizzle-kit config path +```typescript +await drizzle.migrator(db).migrate('src/drizzle.config.yaml'); +``` +##### Provide object with path to folder with migrations +```typescript +await drizzle.migrator(db).migrate({ migrationFolder: 'drizzle' }); +``` +--- + +### Documentation: +- Change README documentation for all changes in current release \ No newline at end of file diff --git a/README.md b/README.md index 64d8908d5..8fd40598a 100644 --- a/README.md +++ b/README.md @@ -60,17 +60,20 @@ const db = await new DbConnector() export const rolesEnum = createEnum({ alias: 'test-enum', values: ['user', 'guest', 'admin'] }); export default class UsersTable extends AbstractTable { - public id = this.int('id').autoIncrement().primaryKey(); + public id = this.serial('id').primaryKey(); public fullName = this.text('full_name'); public phone = this.varchar('phone', { size: 256 }); public media = this.jsonb('media'); - public decimalField = this.decimal('test', { notNull: true, precision: 100, scale: 2 }); - public bigIntField = this.bigint('test1'); - public role = this.type(rolesEnum, 'name_in_table', { notNull: true }); + public decimalField = this.decimal('test', { precision: 100, scale: 2 }).notNull(); + public bigIntField = this.bigint('test1', 'max_bytes_53'); + public role = this.type(rolesEnum, 'name_in_table').notNull(); - public createdAt = this.timestamp('created_at', { notNull: true }); - public updatedAt = this.timestamp('updated_at'); + public createdAt = this.timestamp('created_at').notNull(); + + public createdAtWithTimezone = this.timestamptz('created_at_time_zone'); + + public updatedAt = this.timestamp('updated_at').defaultValue(Defaults.CURRENT_TIMESTAMP); public isArchived = this.bool('is_archived').defaultValue(false); public phoneFullNameIndex = this.index([this.phone, this.fullName]); @@ -90,12 +93,12 @@ interface CityMeta { } export default class CitiesTable extends AbstractTable { - public id = this.int('id').autoIncrement().primaryKey(); + public id = this.serial('id').primaryKey(); - public foundationDate = this.timestamp('name', { notNull: true }); + public foundationDate = this.timestamp('name').notNull(); public location = this.varchar('page', { size: 256 }); - public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, OnDelete.CASCADE); + public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onUpdate: 'CASCADE' }); public metadata = this.jsonb('metadata'); @@ -108,7 +111,7 @@ export default class CitiesTable extends AbstractTable { --- ```typescript export default class UserGroupsTable extends AbstractTable { - public id = this.int('id').autoIncrement().primaryKey(); + public id = this.serial('id').primaryKey(); public name = this.varchar('name'); public description = this.varchar('description'); @@ -123,8 +126,8 @@ export default class UserGroupsTable extends AbstractTable { #### Many to many connection between Users and User Groups ```typescript export default class UsersToUserGroupsTable extends AbstractTable { - public groupId = this.int('city_id').foreignKey(UserGroupsTable, (table) => table.id, OnDelete.CASCADE); - public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, OnDelete.CASCADE); + public groupId = this.int('city_id').foreignKey(UserGroupsTable, (table) => table.id, { onDelete: 'CASCADE' }); + public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onDelete: 'CASCADE' }); public manyToManyIndex = this.index([this.groupId, this.userId]); @@ -382,4 +385,15 @@ const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user ...userGroupWithUsers.one, users: userGroupWithUsers.many, }; +``` + +## Migrations +#### To run migrations generated by drizzle-kit you could use `Migtator` class +##### Provide drizzle-kit config path +```typescript +await drizzle.migrator(db).migrate('src/drizzle.config.yaml'); +``` +##### Provide object with path to folder with migrations +```typescript +await drizzle.migrator(db).migrate({ migrationFolder: 'drizzle' }); ``` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e69de29bb..77526d7e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -0,0 +1,2189 @@ +{ + "name": "drizzle-orm", + "version": "0.9.17", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/node": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz", + "integrity": "sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==" + }, + "@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "requires": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.10.0.tgz", + "integrity": "sha512-h6/V46o6aXpKRlarP1AiJEXuCJ7cMQdlpfMDrcllIgX3dFkLwEBTXAoNP98ZoOmqd1xvymMVRAI4e7yVvlzWEg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.10.0", + "@typescript-eslint/scope-manager": "4.10.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.10.0.tgz", + "integrity": "sha512-opX+7ai1sdWBOIoBgpVJrH5e89ra1KoLrJTz0UtWAa4IekkKmqDosk5r6xqRaNJfCXEfteW4HXQAwMdx+jjEmw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.10.0", + "@typescript-eslint/types": "4.10.0", + "@typescript-eslint/typescript-estree": "4.10.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.10.0.tgz", + "integrity": "sha512-WAPVw35P+fcnOa8DEic0tQUhoJJsgt+g6DEcz257G7vHFMwmag58EfowdVbiNcdfcV27EFR0tUBVXkDoIvfisQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.10.0", + "@typescript-eslint/visitor-keys": "4.10.0" + } + }, + "@typescript-eslint/types": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.10.0.tgz", + "integrity": "sha512-+dt5w1+Lqyd7wIPMa4XhJxUuE8+YF+vxQ6zxHyhLGHJjHiunPf0wSV8LtQwkpmAsRi1lEOoOIR30FG5S2HS33g==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.10.0.tgz", + "integrity": "sha512-mGK0YRp9TOk6ZqZ98F++bW6X5kMTzCRROJkGXH62d2azhghmq+1LNLylkGe6uGUOQzD452NOAEth5VAF6PDo5g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.10.0", + "@typescript-eslint/visitor-keys": "4.10.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.10.0.tgz", + "integrity": "sha512-hPyz5qmDMuZWFtHZkjcCpkAKHX8vdu1G3YsCLEd25ryZgnJfj6FQuJ5/O7R+dB1ueszilJmAFMtlU4CA6se3Jg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.10.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "eslint": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", + "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-airbnb": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz", + "integrity": "sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.2.0", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + } + }, + "eslint-config-airbnb-typescript": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-12.0.0.tgz", + "integrity": "sha512-TUCVru1Z09eKnVAX5i3XoNzjcCOU3nDQz2/jQGkg1jVYm+25fKClveziSl16celfCq+npU0MBPW/ZnXdGFZ9lw==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "4.4.1", + "eslint-config-airbnb": "18.2.0", + "eslint-config-airbnb-base": "14.2.0" + }, + "dependencies": { + "@typescript-eslint/parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.4.1.tgz", + "integrity": "sha512-S0fuX5lDku28Au9REYUsV+hdJpW/rNW0gWlc4SXzF/kdrRaAVX9YCxKpziH7djeWT/HFAjLZcnY7NJD8xTeUEg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.4.1", + "@typescript-eslint/types": "4.4.1", + "@typescript-eslint/typescript-estree": "4.4.1", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.4.1.tgz", + "integrity": "sha512-2oD/ZqD4Gj41UdFeWZxegH3cVEEH/Z6Bhr/XvwTtGv66737XkR4C9IqEkebCuqArqBJQSj4AgNHHiN1okzD/wQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.4.1", + "@typescript-eslint/visitor-keys": "4.4.1" + } + }, + "@typescript-eslint/types": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.4.1.tgz", + "integrity": "sha512-KNDfH2bCyax5db+KKIZT4rfA8rEk5N0EJ8P0T5AJjo5xrV26UAzaiqoJCxeaibqc0c/IvZxp7v2g3difn2Pn3w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.4.1.tgz", + "integrity": "sha512-wP/V7ScKzgSdtcY1a0pZYBoCxrCstLrgRQ2O9MmCUZDtmgxCO/TCqOTGRVwpP4/2hVfqMz/Vw1ZYrG8cVxvN3g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.4.1", + "@typescript-eslint/visitor-keys": "4.4.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.4.1.tgz", + "integrity": "sha512-H2JMWhLaJNeaylSnMSQFEhT/S/FsJbebQALmoJxMPMxLtlVAMy2uJP/Z543n9IizhjRayLSqoInehCeNW9rWcw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.4.1", + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-prefer-arrow": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz", + "integrity": "sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pg": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz", + "integrity": "sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.3.0", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz", + "integrity": "sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==" + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", + "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", + "requires": { + "split2": "^3.1.1" + } + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-node": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", + "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", + "dev": true, + "requires": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json index a81a67914..4f519d03d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-orm", - "version": "0.9.7", + "version": "0.9.17", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/builders/highLvlBuilders/abstractRequestBuilder.ts b/src/builders/highLvlBuilders/abstractRequestBuilder.ts index 2cd7ad4be..0abd39874 100644 --- a/src/builders/highLvlBuilders/abstractRequestBuilder.ts +++ b/src/builders/highLvlBuilders/abstractRequestBuilder.ts @@ -1,13 +1,13 @@ import { AbstractColumn } from '../../columns/column'; import ColumnType from '../../columns/types/columnType'; -import Session from '../../db/session'; +import { ISession } from '../../db/session'; import BaseLogger from '../../logger/abstractLogger'; import { AbstractTable } from '../../tables'; import { ExtractModel } from '../../tables/inferTypes'; export default abstract class TableRequestBuilder> { protected _table: TTable; - protected _session: Session; + protected _session: ISession; protected _mappedServiceToDb: { [name in keyof ExtractModel] : AbstractColumn; }; @@ -15,7 +15,7 @@ export default abstract class TableRequestBuilder, - session: Session, + session: ISession, mappedServiceToDb: { [name in keyof ExtractModel]: AbstractColumn; }, logger?: BaseLogger) { this._mappedServiceToDb = mappedServiceToDb; diff --git a/src/builders/highLvlBuilders/deleteRequestBuilder.ts b/src/builders/highLvlBuilders/deleteRequestBuilder.ts index deee84c81..f81ef1ac1 100644 --- a/src/builders/highLvlBuilders/deleteRequestBuilder.ts +++ b/src/builders/highLvlBuilders/deleteRequestBuilder.ts @@ -1,8 +1,7 @@ import { AbstractColumn } from '../../columns/column'; import ColumnType from '../../columns/types/columnType'; -import Session from '../../db/session'; +import { ISession } from '../../db/session'; import BuilderError, { BuilderType } from '../../errors/builderError'; -import { DatabaseDeleteError } from '../../errors/dbErrors'; import BaseLogger from '../../logger/abstractLogger'; import QueryResponseMapper from '../../mappers/responseMapper'; import { AbstractTable } from '../../tables'; @@ -17,7 +16,7 @@ export default class DeleteTRB> public constructor( table: AbstractTable, - session: Session, + session: ISession, mappedServiceToDb: { [name in keyof ExtractModel]: AbstractColumn; }, logger?: BaseLogger, ) { @@ -51,11 +50,6 @@ export default class DeleteTRB> } const result = await this._session.execute(query); - if (result.isLeft()) { - const { reason } = result.value; - throw new DatabaseDeleteError(this._table.tableName(), reason, query); - } else { - return QueryResponseMapper.map(this._mappedServiceToDb, result.value); - } + return QueryResponseMapper.map(this._mappedServiceToDb, result); }; } diff --git a/src/builders/highLvlBuilders/insertRequestBuilder.ts b/src/builders/highLvlBuilders/insertRequestBuilder.ts index 1c2b257d6..f6030a24e 100644 --- a/src/builders/highLvlBuilders/insertRequestBuilder.ts +++ b/src/builders/highLvlBuilders/insertRequestBuilder.ts @@ -1,9 +1,8 @@ import { combine, set } from '..'; import { AbstractColumn } from '../../columns/column'; import ColumnType from '../../columns/types/columnType'; -import Session from '../../db/session'; +import { ISession } from '../../db/session'; import BuilderError, { BuilderType } from '../../errors/builderError'; -import { DatabaseInsertError } from '../../errors/dbErrors'; import BaseLogger from '../../logger/abstractLogger'; import QueryResponseMapper from '../../mappers/responseMapper'; import { AbstractTable } from '../../tables'; @@ -20,7 +19,7 @@ export default class InsertTRB> public constructor( values: ExtractModel[], - session: Session, + session: ISession, mappedServiceToDb: { [name in keyof ExtractModel]: AbstractColumn; }, table: AbstractTable, logger?: BaseLogger, @@ -67,11 +66,6 @@ export default class InsertTRB> } const result = await this._session.execute(query); - if (result.isLeft()) { - const { reason } = result.value; - throw new DatabaseInsertError(this._table.tableName(), reason, query); - } else { - return QueryResponseMapper.map(this._mappedServiceToDb, result.value); - } + return QueryResponseMapper.map(this._mappedServiceToDb, result); }; } diff --git a/src/builders/highLvlBuilders/selectRequestBuilder.ts b/src/builders/highLvlBuilders/selectRequestBuilder.ts index 84f1e126e..059bc1a69 100644 --- a/src/builders/highLvlBuilders/selectRequestBuilder.ts +++ b/src/builders/highLvlBuilders/selectRequestBuilder.ts @@ -3,9 +3,8 @@ import { JoinWith, Select } from '..'; import { AbstractColumn } from '../../columns/column'; import ColumnType from '../../columns/types/columnType'; import DB from '../../db/db'; -import Session from '../../db/session'; +import { ISession } from '../../db/session'; import BuilderError, { BuilderType } from '../../errors/builderError'; -import { DatabaseSelectError } from '../../errors/dbErrors'; import BaseLogger from '../../logger/abstractLogger'; import QueryResponseMapper from '../../mappers/responseMapper'; import { AbstractTable } from '../../tables'; @@ -26,7 +25,7 @@ export default class SelectTRB> private __distinct: AbstractColumn; public constructor( - session: Session, + session: ISession, mappedServiceToDb: { [name in keyof ExtractModel]: AbstractColumn; }, props: {limit?:number, offset?:number}, table: AbstractTable, @@ -191,11 +190,6 @@ export default class SelectTRB> } const result = await this._session.execute(query); - if (result.isLeft()) { - const { reason } = result.value; - throw new DatabaseSelectError(this._table.tableName(), reason, query); - } else { - return QueryResponseMapper.map(this._mappedServiceToDb, result.value); - } + return QueryResponseMapper.map(this._mappedServiceToDb, result); }; } diff --git a/src/builders/highLvlBuilders/updateRequestBuilder.ts b/src/builders/highLvlBuilders/updateRequestBuilder.ts index 92b9ea091..3be01bd30 100644 --- a/src/builders/highLvlBuilders/updateRequestBuilder.ts +++ b/src/builders/highLvlBuilders/updateRequestBuilder.ts @@ -1,8 +1,7 @@ import { AbstractColumn } from '../../columns/column'; import ColumnType from '../../columns/types/columnType'; -import Session from '../../db/session'; +import { ISession } from '../../db/session'; import BuilderError, { BuilderType } from '../../errors/builderError'; -import { DatabaseUpdateError } from '../../errors/dbErrors'; import BaseLogger from '../../logger/abstractLogger'; import QueryResponseMapper from '../../mappers/responseMapper'; import { AbstractTable } from '../../tables'; @@ -21,7 +20,7 @@ export default class UpdateTRB> public constructor( table: AbstractTable, - session: Session, + session: ISession, mappedServiceToDb: { [name in keyof ExtractModel]: AbstractColumn; }, logger?: BaseLogger, ) { @@ -71,11 +70,6 @@ export default class UpdateTRB> this._logger.info(`Updating ${this._table.tableName()} using query:\n ${query}`); } const result = await this._session.execute(query); - if (result.isLeft()) { - const { reason } = result.value; - throw new DatabaseUpdateError(this._table.tableName(), reason, query); - } else { - return QueryResponseMapper.map(this._mappedServiceToDb, result.value); - } + return QueryResponseMapper.map(this._mappedServiceToDb, result); }; } diff --git a/src/builders/joinBuilders/builders/abstractJoinBuilder.ts b/src/builders/joinBuilders/builders/abstractJoinBuilder.ts index ab6006f6f..becbbc5ff 100644 --- a/src/builders/joinBuilders/builders/abstractJoinBuilder.ts +++ b/src/builders/joinBuilders/builders/abstractJoinBuilder.ts @@ -1,9 +1,8 @@ import { QueryResult } from 'pg'; import { AbstractColumn } from '../../../columns/column'; import ColumnType from '../../../columns/types/columnType'; -import Session from '../../../db/session'; +import { ISession } from '../../../db/session'; import BuilderError, { BuilderType } from '../../../errors/builderError'; -import { DatabaseSelectError } from '../../../errors/dbErrors'; import { AbstractTable } from '../../../tables'; import Order from '../../highLvlBuilders/order'; import Select from '../../lowLvlBuilders/selects/select'; @@ -12,7 +11,7 @@ import Join from '../join'; export default abstract class AbstractJoined, TRes> { protected _table: TTable; - protected _session: Session; + protected _session: ISession; protected _filter: Expr; protected _distinct?: AbstractColumn; protected _props: {limit?:number, offset?:number}; @@ -22,7 +21,7 @@ export default abstract class AbstractJoined, order?: Order, @@ -56,12 +55,7 @@ export default abstract class AbstractJoined): TRes; diff --git a/src/builders/joinBuilders/builders/selectWithFiveJoins.ts b/src/builders/joinBuilders/builders/selectWithFiveJoins.ts index d1d1884e5..2aca13c85 100644 --- a/src/builders/joinBuilders/builders/selectWithFiveJoins.ts +++ b/src/builders/joinBuilders/builders/selectWithFiveJoins.ts @@ -1,7 +1,7 @@ import { QueryResult } from 'pg'; import { AbstractColumn } from '../../../columns/column'; import ColumnType from '../../../columns/types/columnType'; -import Session from '../../../db/session'; +import { ISession } from '../../../db/session'; import QueryResponseMapper from '../../../mappers/responseMapper'; import { AbstractTable } from '../../../tables'; import { ExtractModel } from '../../../tables/inferTypes'; @@ -23,7 +23,7 @@ export default class SelectTRBWithFiveJoins public constructor( table: TTable, - session: Session, + session: ISession, filter: Expr, join1: Join, join2: Join, diff --git a/src/builders/joinBuilders/builders/selectWithFourJoins.ts b/src/builders/joinBuilders/builders/selectWithFourJoins.ts index a0cd4344a..2bbbddf8e 100644 --- a/src/builders/joinBuilders/builders/selectWithFourJoins.ts +++ b/src/builders/joinBuilders/builders/selectWithFourJoins.ts @@ -2,7 +2,7 @@ import { QueryResult } from 'pg'; import { AbstractColumn } from '../../../columns/column'; import ColumnType from '../../../columns/types/columnType'; import DB from '../../../db/db'; -import Session from '../../../db/session'; +import { ISession } from '../../../db/session'; import QueryResponseMapper from '../../../mappers/responseMapper'; import { AbstractTable } from '../../../tables'; import { ExtractModel } from '../../../tables/inferTypes'; @@ -25,7 +25,7 @@ export default class SelectTRBWithFourJoins public constructor( table: TTable, - session: Session, + session: ISession, filter: Expr, join1: Join, join2: Join, diff --git a/src/builders/joinBuilders/builders/selectWithJoin.ts b/src/builders/joinBuilders/builders/selectWithJoin.ts index b4358e55f..2acc01f9e 100644 --- a/src/builders/joinBuilders/builders/selectWithJoin.ts +++ b/src/builders/joinBuilders/builders/selectWithJoin.ts @@ -3,7 +3,7 @@ import { QueryResult } from 'pg'; import { AbstractColumn } from '../../../columns/column'; import ColumnType from '../../../columns/types/columnType'; import DB from '../../../db/db'; -import Session from '../../../db/session'; +import { ISession } from '../../../db/session'; import QueryResponseMapper from '../../../mappers/responseMapper'; import AbstractTable from '../../../tables/abstractTable'; import { ExtractModel } from '../../../tables/inferTypes'; @@ -21,7 +21,7 @@ export default class SelectTRBWithJoin, TTa public constructor( table: TTable, - session: Session, + session: ISession, filter: Expr, join: Join, props: {limit?:number, offset?:number}, diff --git a/src/builders/joinBuilders/builders/selectWithThreeJoins.ts b/src/builders/joinBuilders/builders/selectWithThreeJoins.ts index e0a4ef62a..4b2b042ef 100644 --- a/src/builders/joinBuilders/builders/selectWithThreeJoins.ts +++ b/src/builders/joinBuilders/builders/selectWithThreeJoins.ts @@ -3,7 +3,7 @@ import { QueryResult } from 'pg'; import { AbstractColumn } from '../../../columns/column'; import ColumnType from '../../../columns/types/columnType'; import DB from '../../../db/db'; -import Session from '../../../db/session'; +import { ISession } from '../../../db/session'; import QueryResponseMapper from '../../../mappers/responseMapper'; import AbstractTable from '../../../tables/abstractTable'; import { ExtractModel } from '../../../tables/inferTypes'; @@ -24,7 +24,7 @@ export default class SelectTRBWithThreeJoins, join2: Join, diff --git a/src/builders/joinBuilders/builders/selectWithTwoJoins.ts b/src/builders/joinBuilders/builders/selectWithTwoJoins.ts index f1a2b5f21..2885a894a 100644 --- a/src/builders/joinBuilders/builders/selectWithTwoJoins.ts +++ b/src/builders/joinBuilders/builders/selectWithTwoJoins.ts @@ -3,7 +3,7 @@ import { QueryResult } from 'pg'; import { AbstractColumn } from '../../../columns/column'; import ColumnType from '../../../columns/types/columnType'; import DB from '../../../db/db'; -import Session from '../../../db/session'; +import { ISession } from '../../../db/session'; import QueryResponseMapper from '../../../mappers/responseMapper'; import AbstractTable from '../../../tables/abstractTable'; import { ExtractModel } from '../../../tables/inferTypes'; @@ -22,7 +22,7 @@ export default class SelectTRBWithTwoJoins, public constructor( table: TTable, - session: Session, + session: ISession, filter: Expr, join1: Join, join2: Join, diff --git a/src/builders/lowLvlBuilders/create.ts b/src/builders/lowLvlBuilders/create.ts index 44feee41f..a703ab383 100644 --- a/src/builders/lowLvlBuilders/create.ts +++ b/src/builders/lowLvlBuilders/create.ts @@ -49,7 +49,7 @@ export default class Create> { } this.columnsBuilder.push(ecranate(column.getColumnName())); this.columnsBuilder.push(' '); - this.columnsBuilder.push(column.isAutoIncrement() ? 'SERIAL' : column.getColumnType().getDbName()); + this.columnsBuilder.push(column.getColumnType().getDbName()); this.columnsBuilder.push(' '); this.columnsBuilder.push(column.getDefaultValue() != null ? `DEFAULT ${column.getColumnType().insertStrategy(column.getDefaultValue())}` : ''); this.columnsBuilder.push(column.isNullableFlag ? '' : ' NOT NULL'); diff --git a/src/builders/transaction/transaction.ts b/src/builders/transaction/transaction.ts index b54a6db5a..0eefc9539 100644 --- a/src/builders/transaction/transaction.ts +++ b/src/builders/transaction/transaction.ts @@ -1,7 +1,7 @@ -import Session from '../../db/session'; +import { ISession } from '../../db/session'; export default class Transaction { - public constructor(private session: Session) { + public constructor(private session: ISession) { } public begin = async (): Promise => { diff --git a/src/columns/column.ts b/src/columns/column.ts index 9f0eb7ba5..8d1a04c13 100644 --- a/src/columns/column.ts +++ b/src/columns/column.ts @@ -1,28 +1,26 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable max-len */ /* eslint-disable max-classes-per-file */ +import { PgTime, PgTimestamp } from '.'; import DB from '../db/db'; import { AbstractTable } from '../tables'; import ColumnType from './types/columnType'; +import PgTimestamptz from './types/pgTimestamptz'; -type ExtractColumnType = - T extends ColumnType ? - TCodeType - : never; - -export enum OnDelete { - RESTRICT = 'ON DELETE RESTRICT', - CASCADE = 'ON DELETE CASCADE', +export enum Defaults { + CURRENT_TIMESTAMP = 'CURRENT_TIMESTAMP', } -export enum OnUpdate { - RESTRICT = 'ON UPDATE RESTRICT', - CASCADE = 'ON UPDATE RESTRICT', -} +type PgTimes = PgTimestamptz | PgTime | PgTimestamp; + +export type ExtractColumnType = + T extends ColumnType ? + T extends PgTimes ? TCodeType | Defaults : TCodeType + : never; // eslint-disable-next-line max-len export abstract class AbstractColumn { - public isNullableFlag: TNullable; - public autoIncrementType: TAutoIncrement; + public isNullableFlag: boolean = true; public primaryKeyName?: string; public uniqueKeyName?: string; @@ -33,17 +31,15 @@ export abstract class AbstractColumn; public constructor(parent: AbstractTable, columnName: string, - columnType: T, nullable: TNullable) { + columnType: T) { this.columnType = columnType; this.columnName = columnName; this.parentTableName = parent.tableName(); this.parent = parent; - this.isNullableFlag = nullable; } public getOnDelete = (): string | undefined => this.onDelete; @@ -58,8 +54,8 @@ export abstract class AbstractColumn>(table: { new(db: DB): ITable ;}, callback: (table: ITable) => AbstractColumn, onConstraint: { - onDelete?: 'CASCADE' | 'RESTRICT', - onUpdate?: 'CASCADE' | 'RESTRICT' + onDelete?: 'CASCADE' | 'RESTRICT' | 'SET NULL' | 'SET DEFAULT', + onUpdate?: 'CASCADE' | 'RESTRICT' | 'SET NULL' | 'SET DEFAULT' }) : AbstractColumn; @@ -68,18 +64,14 @@ export abstract class AbstractColumn; - public abstract primaryKey(): AbstractColumn; - public abstract serial(): AbstractColumn; - public unique = () => { this.uniqueKeyName = this.columnName; return this; }; - public isAutoIncrement = (): boolean => this.autoIncrementFlag; + public abstract notNull(): AbstractColumn; public getColumnName = (): string => this.columnName; @@ -94,13 +86,13 @@ export abstract class AbstractColumn extends AbstractColumn { public constructor(parent: AbstractTable, columnName: string, - columnType: T, nullable: TNullable) { - super(parent, columnName, columnType, nullable); + columnType: T) { + super(parent, columnName, columnType); } - public serial() { - this.autoIncrementFlag = true; - return this as unknown as Column; + public notNull() { + this.isNullableFlag = false; + return this as unknown as Column; } public primaryKey() { @@ -113,8 +105,8 @@ export class Column ITable, callback: (table: ITable) => Column, onConstraint?: { - onDelete?: 'CASCADE' | 'RESTRICT', - onUpdate?: 'CASCADE' | 'RESTRICT' + onDelete?: 'CASCADE' | 'RESTRICT' | 'SET NULL' | 'SET DEFAULT', + onUpdate?: 'CASCADE' | 'RESTRICT' | 'SET NULL' | 'SET DEFAULT' }, ): Column { const tableInstance = this.getParent().db.create(table); @@ -123,23 +115,18 @@ export class Column; - } } // eslint-disable-next-line max-len export class IndexedColumn extends AbstractColumn { public constructor(parent: AbstractTable, columnName: string, columnType: T, nullable: TNullable) { - super(parent, columnName, columnType, nullable); + super(parent, columnName, columnType); } - public serial() { - this.autoIncrementFlag = true; - return this as unknown as IndexedColumn; + public notNull() { + this.isNullableFlag = false; + return this as unknown as IndexedColumn; } public primaryKey() { @@ -152,8 +139,8 @@ export class IndexedColumn ITable, callback: (table: ITable) => IndexedColumn, onConstraint?: { - onDelete?: 'CASCADE' | 'RESTRICT', - onUpdate?: 'CASCADE' | 'RESTRICT' + onDelete?: 'CASCADE' | 'RESTRICT' | 'SET NULL' | 'SET DEFAULT', + onUpdate?: 'CASCADE' | 'RESTRICT' | 'SET NULL' | 'SET DEFAULT' }, ): IndexedColumn { // eslint-disable-next-line new-cap @@ -162,9 +149,4 @@ export class IndexedColumn; - } } diff --git a/src/columns/index.ts b/src/columns/index.ts index 81d1b155d..9d32e6c53 100644 --- a/src/columns/index.ts +++ b/src/columns/index.ts @@ -1,4 +1,4 @@ -export { Column } from './column'; +export { Column, ExtractColumnType, Defaults } from './column'; export { default as PgBigDecimal } from './types/pgBigDecimal'; export { default as PgBigInt } from './types/pgBigInt'; export { default as PgBoolean } from './types/pgBoolean'; diff --git a/src/columns/types/columnType.ts b/src/columns/types/columnType.ts index 89039a208..e35b75d34 100644 --- a/src/columns/types/columnType.ts +++ b/src/columns/types/columnType.ts @@ -4,5 +4,5 @@ export default abstract class ColumnType { protected abstract dbName: string; abstract getDbName(): string; abstract insertStrategy(value: TCodeType): string; - abstract selectStrategy(value: any): TCodeType; + abstract selectStrategy(value: any): TCodeType | undefined; } diff --git a/src/columns/types/pgBigDecimal.ts b/src/columns/types/pgBigDecimal.ts index 53ecb24b2..eb6de2ee2 100644 --- a/src/columns/types/pgBigDecimal.ts +++ b/src/columns/types/pgBigDecimal.ts @@ -23,7 +23,7 @@ export default class PgBigDecimal extends ColumnType { public insertStrategy = (value: number): string => `${value}`; - public selectStrategy(value: string): number { - return parseFloat(value); + public selectStrategy(value: string): number | undefined { + return value ? parseFloat(value) : undefined; } } diff --git a/src/columns/types/pgBigInt.ts b/src/columns/types/pgBigInt.ts index b5d7668cd..3d2d156cc 100644 --- a/src/columns/types/pgBigInt.ts +++ b/src/columns/types/pgBigInt.ts @@ -1,6 +1,7 @@ +// eslint-disable-next-line max-classes-per-file import ColumnType from './columnType'; -export default class PgBigInt extends ColumnType { +export default class PgBigInt53 extends ColumnType { public dbName: string; public constructor() { @@ -8,13 +9,28 @@ export default class PgBigInt extends ColumnType { this.dbName = 'BIGINT'; } - public getDbName(): string { - return this.dbName; - } + public getDbName = (): string => this.dbName; public insertStrategy = (value: number): string => `${value}`; - public selectStrategy(value: string): number { - return parseInt(value, 10); + public selectStrategy(value: string): number | undefined { + return value ? parseInt(value, 10) : undefined; + } +} + +export class PgBigInt64 extends ColumnType { + public dbName: string; + + public constructor() { + super(); + this.dbName = 'BIGINT'; + } + + public getDbName = (): string => this.dbName; + + public insertStrategy = (value: bigint): string => `${value}`; + + public selectStrategy(value: string): bigint | undefined { + return value ? BigInt(value) : undefined; } } diff --git a/src/columns/types/pgBigSerial.ts b/src/columns/types/pgBigSerial.ts new file mode 100644 index 000000000..133f8e088 --- /dev/null +++ b/src/columns/types/pgBigSerial.ts @@ -0,0 +1,36 @@ +/* eslint-disable max-classes-per-file */ +import ColumnType from './columnType'; + +export default class PgBigSerial53 extends ColumnType { + public dbName: string; + + public constructor() { + super(); + this.dbName = 'BIGSERIAL'; + } + + public getDbName = (): string => this.dbName; + + public insertStrategy = (value: number): string => `${value}`; + + public selectStrategy(value: string): number | undefined { + return value ? parseInt(value, 10) : undefined; + } +} + +export class PgBigSerial64 extends ColumnType { + public dbName: string; + + public constructor() { + super(); + this.dbName = 'BIGSERIAL'; + } + + public getDbName = (): string => this.dbName; + + public insertStrategy = (value: bigint): string => `${value}`; + + public selectStrategy(value: string): bigint | undefined { + return value ? BigInt(value) : undefined; + } +} diff --git a/src/columns/types/pgInteger.ts b/src/columns/types/pgInteger.ts index 055e9e0d8..8ca79e17d 100644 --- a/src/columns/types/pgInteger.ts +++ b/src/columns/types/pgInteger.ts @@ -12,7 +12,7 @@ export default class PgInteger extends ColumnType { public insertStrategy = (value: number): string => `${value}`; - public selectStrategy(value: string): number { - return parseInt(value, 10); + public selectStrategy(value: string): number | undefined { + return value ? parseInt(value, 10) : undefined; } } diff --git a/src/columns/types/pgSerial.ts b/src/columns/types/pgSerial.ts new file mode 100644 index 000000000..16d17f5fb --- /dev/null +++ b/src/columns/types/pgSerial.ts @@ -0,0 +1,18 @@ +import ColumnType from './columnType'; + +export default class PgSerial extends ColumnType { + public dbName: string; + + public constructor() { + super(); + this.dbName = 'SERIAL'; + } + + public getDbName = (): string => this.dbName; + + public insertStrategy = (value: number): string => `${value}`; + + public selectStrategy(value: string): number | undefined { + return value ? parseInt(value, 10) : undefined; + } +} diff --git a/src/columns/types/pgSmallInt.ts b/src/columns/types/pgSmallInt.ts new file mode 100644 index 000000000..5f3b51664 --- /dev/null +++ b/src/columns/types/pgSmallInt.ts @@ -0,0 +1,18 @@ +import ColumnType from './columnType'; + +export default class PgSmallInt extends ColumnType { + public dbName: string; + + public constructor() { + super(); + this.dbName = 'SMALLINT'; + } + + public getDbName = (): string => this.dbName; + + public insertStrategy = (value: number): string => `${value}`; + + public selectStrategy(value: string): number | undefined { + return value ? parseInt(value, 10) : undefined; + } +} diff --git a/src/columns/types/pgTimestamptz.ts b/src/columns/types/pgTimestamptz.ts new file mode 100644 index 000000000..1f08272e9 --- /dev/null +++ b/src/columns/types/pgTimestamptz.ts @@ -0,0 +1,18 @@ +import ColumnType from './columnType'; + +export default class PgTimestamptz extends ColumnType { + public dbName: string; + + public constructor() { + super(); + this.dbName = 'timestamp with time zone'; + } + + public getDbName = (): string => this.dbName; + + public insertStrategy = (value: Date): string => `'${value.toISOString()}'`; + + public selectStrategy(value: any): Date { + return value; + } +} diff --git a/src/db/db.ts b/src/db/db.ts index bf4cb0d86..a6177a8ac 100644 --- a/src/db/db.ts +++ b/src/db/db.ts @@ -1,19 +1,18 @@ /* eslint-disable max-classes-per-file */ -import { Pool } from 'pg'; import BaseLogger from '../logger/abstractLogger'; import { AbstractTable } from '../tables'; -import Session from './session'; +import { ISession } from './session'; export type TableConstructor = { new (db: DB): AbstractTable}; export default class DB { - private _session: Session; - private _logger?: BaseLogger; + protected _session: ISession; + protected _logger?: BaseLogger; - private _cache = new Map>(); + protected _cache = new Map>(); - public constructor(pool: Pool) { - this._session = new Session(pool); + public constructor(session: ISession) { + this._session = session; } public create>(t: new (db: DB) => TTable) @@ -34,7 +33,7 @@ export default class DB { public logger = (): BaseLogger | undefined => this._logger; - public session = (): Session => this._session; + public session = (): ISession => this._session; protected instanceFor>( t: new (db: DB) => TTable, diff --git a/src/db/dbConnector.ts b/src/db/dbConnector.ts index 58a5d73ac..ff6b0938e 100644 --- a/src/db/dbConnector.ts +++ b/src/db/dbConnector.ts @@ -1,6 +1,7 @@ import { ClientConfig, Pool } from 'pg'; import DB from './db'; import DBStringConnector from './dbStringConnector'; +import Session from './session'; export default class DbConnector { private __config: ClientConfig; @@ -21,7 +22,7 @@ export default class DbConnector { // check if table structure is the same as in code - return new DB(pool); + return new DB(new Session(pool)); } catch (e: any) { // console.log(`Connection error: ${e.message}`); throw new Error(`Connection error: ${e.message}`); diff --git a/src/db/dbStringConnector.ts b/src/db/dbStringConnector.ts index 279ecf914..cbc82510d 100644 --- a/src/db/dbStringConnector.ts +++ b/src/db/dbStringConnector.ts @@ -1,5 +1,6 @@ import { ClientConfig, Pool } from 'pg'; import Db from './db'; +import Session from './session'; export default class DBStringConnector { private _url: string; @@ -19,7 +20,7 @@ export default class DBStringConnector { await pool.connect(); // console.log('Db connected!'); - return new Db(pool); + return new Db(new Session(pool)); } catch (e: any) { // console.log(`Connection error: ${e.message}`); throw new Error(`Connection error: ${e.message}`); diff --git a/src/db/index.ts b/src/db/index.ts index ae0f1f1b7..e07078347 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -1,3 +1,4 @@ export { default as DB } from './db'; export { default as DbConnector } from './dbConnector'; export { default as DBStringConnector } from './dbStringConnector'; +export { ISession } from './session'; diff --git a/src/db/session.ts b/src/db/session.ts index c645e789e..9f234196c 100644 --- a/src/db/session.ts +++ b/src/db/session.ts @@ -1,21 +1,16 @@ +/* eslint-disable max-classes-per-file */ import { Pool, QueryResult } from 'pg'; -import { - Either, Failure, left, PgSessionError, right, -} from '../errors/baseError'; -export default class Session { +export abstract class ISession { + public abstract execute(query: string): Promise>; +} + +export default class Session extends ISession { public constructor(private pool: Pool) { + super(); } - public execute = async (query: string) - : Promise>> => { - try { - return right(await this.pool.query(query)); - } catch (e: any) { - return left({ - type: PgSessionError.PgQueryExecutionError, - reason: e, - }); - } - }; + public execute(query: string): Promise> { + return this.pool.query(query); + } } diff --git a/src/docs/cases/simple_insert.ts b/src/docs/cases/simple_insert.ts index dcb18c745..d90dec78d 100644 --- a/src/docs/cases/simple_insert.ts +++ b/src/docs/cases/simple_insert.ts @@ -1,5 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { Create, DbConnector } from '../..'; +import { PgInteger } from '../../columns'; +import PgSerial from '../../columns/types/pgSerial'; import { ExtractModel } from '../../tables/inferTypes'; import CitiesTable from '../tables/citiesTable'; import UserGroupsTable from '../tables/userGroupsTable'; @@ -20,7 +22,7 @@ import UsersTable from '../tables/usersTable'; await usersTable.insert({ decimalField: 12.4, createdAt: new Date(), - role: 'guest', + // role: 'guest', }).execute(); const insertedCities = await citiesTable.insert({ @@ -43,11 +45,11 @@ import UsersTable from '../tables/usersTable'; const conflictInsertedUsers = await usersTable.insertMany([{ decimalField: 12.4, createdAt: new Date(), - role: 'guest', + // role: 'guest', }, { decimalField: 32.4, createdAt: new Date(), - role: 'admin', + // role: 'admin', phone: '+1808', }]) .onConflict( diff --git a/src/docs/cases/simple_join.ts b/src/docs/cases/simple_join.ts index d497b6d01..52af8abb8 100644 --- a/src/docs/cases/simple_join.ts +++ b/src/docs/cases/simple_join.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-len */ /* eslint-disable @typescript-eslint/no-unused-vars */ import { Create, DbConnector } from '../..'; import { eq } from '../../builders'; @@ -26,11 +27,11 @@ import UsersToUserGroupsTable from '../tables/usersToUserGroups'; const userRes = await usersTable.insertMany([{ decimalField: 4.2, createdAt: new Date(), - role: 'guest', + // role: 'guest', }, { decimalField: 5.8, createdAt: new Date(), - role: 'user', + // role: 'user', }]).all(); const citiesRes = await citiesTable.insertMany([{ diff --git a/src/docs/cases/simple_select.ts b/src/docs/cases/simple_select.ts index fbf259489..21c3b09ad 100644 --- a/src/docs/cases/simple_select.ts +++ b/src/docs/cases/simple_select.ts @@ -47,7 +47,7 @@ import UsersTable from '../tables/usersTable'; const greaterEqSelect = usersTable.select().where(greaterEq(usersTable.bigIntField, 3)).all(); - const lessEqSelect = usersTable.select().where(lessEq(usersTable.bigIntField, 3)).all(); + const lessEqSelect = usersTable.select().where(lessEq(usersTable.bigIntField, 3)); const isNullSelect = usersTable.select().where(isNull(usersTable.phone)).all(); diff --git a/src/docs/tables/citiesTable.ts b/src/docs/tables/citiesTable.ts index d0f63e70d..d025a37e1 100644 --- a/src/docs/tables/citiesTable.ts +++ b/src/docs/tables/citiesTable.ts @@ -7,9 +7,9 @@ interface CityMeta { } export default class CitiesTable extends AbstractTable { - public id = this.int('id').autoIncrement().primaryKey(); + public id = this.serial('id').primaryKey(); - public foundationDate = this.timestamp('name', { notNull: true }); + public foundationDate = this.timestamp('name').notNull(); public location = this.varchar('page', { size: 256 }); public userId = this.int('user_id').foreignKey(UsersTable, (table) => table.id, { onUpdate: 'CASCADE' }); diff --git a/src/docs/tables/userGroupsTable.ts b/src/docs/tables/userGroupsTable.ts index 97fd8a867..1785e23e4 100644 --- a/src/docs/tables/userGroupsTable.ts +++ b/src/docs/tables/userGroupsTable.ts @@ -1,7 +1,7 @@ import AbstractTable from '../../tables/abstractTable'; export default class UserGroupsTable extends AbstractTable { - public id = this.int('id').autoIncrement().primaryKey(); + public id = this.serial('id').primaryKey(); public name = this.varchar('name'); public description = this.varchar('description'); diff --git a/src/docs/tables/usersTable.ts b/src/docs/tables/usersTable.ts index f72946094..820699a30 100644 --- a/src/docs/tables/usersTable.ts +++ b/src/docs/tables/usersTable.ts @@ -1,4 +1,5 @@ /* eslint-disable max-classes-per-file */ +import { Defaults } from '../../columns/column'; import AbstractTable from '../../tables/abstractTable'; import { createEnum } from '../../types/type'; // import { rolesEnum } from '../types/rolesType'; @@ -6,17 +7,20 @@ import { createEnum } from '../../types/type'; export const rolesEnum = createEnum({ alias: 'test-enum', values: ['user', 'guest', 'admin'] }); export default class UsersTable extends AbstractTable { - public id = this.int('id').autoIncrement().primaryKey(); + public id = this.serial('id').primaryKey(); public fullName = this.text('full_name'); public phone = this.varchar('phone', { size: 256 }); public media = this.jsonb('media'); - public decimalField = this.decimal('test', { notNull: true, precision: 100, scale: 2 }); - public bigIntField = this.bigint('test1'); - public role = this.type(rolesEnum, 'name_in_table', { notNull: true }); + public decimalField = this.decimal('test', { precision: 100, scale: 2 }).notNull(); + public bigIntField = this.bigint('test1', 'max_bytes_53'); + // public role = this.type(rolesEnum, 'name_in_table', { notNull: true }); - public createdAt = this.timestamp('created_at', { notNull: true }); - public updatedAt = this.timestamp('updated_at'); + public createdAt = this.timestamp('created_at').notNull(); + + public createdAtWithTimezone = this.timestamptz('created_at_time_zone'); + + public updatedAt = this.timestamp('updated_at').defaultValue(Defaults.CURRENT_TIMESTAMP); public isArchived = this.bool('is_archived').defaultValue(false); public phoneFullNameIndex = this.index([this.phone, this.fullName]); diff --git a/src/drizzle.config.yaml b/src/drizzle.config.yaml new file mode 100644 index 000000000..34dbf89e4 --- /dev/null +++ b/src/drizzle.config.yaml @@ -0,0 +1 @@ +migrationFolder: drizzle diff --git a/src/index.ts b/src/index.ts index 8311e3bd0..90d308eaa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,7 @@ +/* eslint-disable import/export */ import { ClientConfig } from 'pg'; -import Create from './builders/lowLvlBuilders/create'; import { DB, DbConnector } from './db'; import Migrator from './migrator/migrator'; -import AbstractTable from './tables/abstractTable'; export * from './db'; export * from './builders'; @@ -10,14 +9,12 @@ export * from './columns'; export * from './tables'; export const drizzle = { - prepareCreateTable>(table: AbstractTable): string { - return Create.table(table).build(); - }, - migrator(db:DB): Migrator { - return new Migrator(db); - }, async connect(config: ClientConfig): Promise { const dbConnector: DbConnector = new DbConnector().params(config); return dbConnector.connect(); }, + + migrator(db: DB): Migrator { + return new Migrator(db); + }, }; diff --git a/src/migrator/migrator.ts b/src/migrator/migrator.ts index a8e08e41d..07389c98d 100644 --- a/src/migrator/migrator.ts +++ b/src/migrator/migrator.ts @@ -1,107 +1,90 @@ +/* eslint-disable no-restricted-syntax */ /* eslint-disable import/export */ /* eslint-disable max-classes-per-file */ -import Create from '../builders/lowLvlBuilders/create'; +import * as fs from 'fs'; +import { Create } from '../builders'; import Transaction from '../builders/transaction/transaction'; import Db from '../db/db'; -import Session from '../db/session'; -import { - ExtractModel, -} from '../tables/inferTypes'; -import MigrationsTable from '../tables/migrationsTable'; +import { MigrationsTable } from '../tables'; -export class MigrationSession { - private finalQuery = ''; - - public execute = (query: string): void => { - this.finalQuery += query; - this.finalQuery += '\n'; - }; - - public getQuery = (): string => this.finalQuery; -} +export type InCodeConfig = { migrationFolder: string }; export default class Migrator { - private _db: Db; - private migrationsPerVersion: Map = new Map(); - private session: Session; - - public constructor(db: Db) { - this._db = db; - this.session = db.session(); + public constructor(private db: Db) { } - public chain = (tag: number, - migration: (dbSession: MigrationSession) => void): Migrator => { - const migrationSession = new MigrationSession(); - migration(migrationSession); - this.migrationsPerVersion.set(+tag, migrationSession.getQuery()); - return this; - }; + public async migrate(configPath: string): Promise + public async migrate(config: InCodeConfig): Promise + public async migrate(configPath?: any, config?: InCodeConfig): Promise { + let migrationFolderTo: string | undefined; + if (configPath) { + const configAsString = fs.readFileSync(configPath, 'utf8'); + const splitted = configAsString.trim().split('\n'); + // eslint-disable-next-line no-restricted-syntax + for (const split of splitted) { + const entry = split.trim().split(':'); + const key = entry[0]; + const value = entry[1].trim().replace(/['"]+/g, ''); - public getResultScript = (): string[] => { - const values: string[] = []; - // eslint-disable-next-line no-restricted-syntax - for (const value of this.migrationsPerVersion.values()) { - values.push(value); + if (key === 'migrationFolder') { + // proceed value + migrationFolderTo = value; + } + } + } + + if (config) { + migrationFolderTo = config.migrationFolder; } - return values; - }; - public execute = async (): Promise => { - const migrationsTable = new MigrationsTable(this._db); + if (!migrationFolderTo) { + throw Error('no migration folder defined'); + } - await this.session.execute(Create.table(migrationsTable).build()); + const migrationTable = new MigrationsTable(this.db); - const migrations - : Array | undefined> = await migrationsTable.select().all(); + await this.db.session().execute(Create.table(migrationTable).build()); - const transaction = new Transaction(this.session); + const dbMigrations = await migrationTable.select().all(); + const lastDbMigration = dbMigrations.length > 0 + ? dbMigrations[dbMigrations.length - 1] + : undefined; + + const files = fs.readdirSync(migrationFolderTo); + const transaction = new Transaction(this.db.session()); await transaction.begin(); - // eslint-disable-next-line no-restricted-syntax - for await (const [key, value] of this.migrationsPerVersion) { - const dbMigrationByTag = migrations.find((it) => it!.version === key); - if (dbMigrationByTag) { - // const isHashSameAsInDb = - // Buffer.from(dbMigrationByTag.hash, 'base64').toString('ascii') === value; - // if (!isHashSameAsInDb) { - // throw Error(`Migration script was changed for version ${key}`); - // } - } else { - try { - const logger = this._db.logger(); - if (logger) { - logger.info(`Executing migration with tag ${key} with query:\n${value}`); - } - const result = await this._db.session().execute(value); - if (result.isLeft()) { - const { reason } = result.value; - throw new Error(`Error while executing migration tag ${key}. Error: ${reason}`); - } else { - await migrationsTable - .insert({ - version: key, - createdAt: new Date(), - hash: Buffer.from(value).toString('base64'), - }).execute(); - } - } catch (e: any) { - await transaction.rollback(); - throw new Error(`Migration chain ${key} was not migrated sucessfully.\nMessage: ${e.message}`); + try { + for await (const migrationFolder of files) { + const migrationFiles = fs.readdirSync(`${migrationFolderTo}/${migrationFolder}`); + const migrationFile = migrationFiles.filter((file) => file === 'migration.sql')[0]; + + const query = fs.readFileSync(`${migrationFolderTo}/${migrationFolder}/${migrationFile}`).toString(); + + const folderAsMillis = new Date(migrationFolder).getTime(); + if (!lastDbMigration || lastDbMigration.createdAt! < folderAsMillis) { + await this.db.session().execute(query); + await migrationTable.insert({ + hash: this.generateHash(query), + createdAt: folderAsMillis, + }).execute(); } } - } - await transaction.commit(); - - return true; - }; + await transaction.commit(); + } catch (e) { + if (this.db.logger()) { + this.db.logger()!.error(e); + } + transaction.rollback(); + } + } - private generateHash(value: string): number { + private generateHash(value: string): string { let hash = 0; let i; let chr; - if (value.length === 0) return hash; + if (value.length === 0) return ''; for (i = 0; i < value.length; i += 1) { chr = value.charCodeAt(i); // eslint-disable-next-line no-bitwise @@ -109,6 +92,6 @@ export default class Migrator { // eslint-disable-next-line no-bitwise hash |= 0; } - return hash; + return Buffer.from(value).toString('base64'); } } diff --git a/src/serializer/serializer.ts b/src/serializer/serializer.ts index 8e9a45f7e..d570422a4 100644 --- a/src/serializer/serializer.ts +++ b/src/serializer/serializer.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-classes-per-file */ /* eslint-disable import/no-named-as-default-member */ /* eslint-disable import/no-named-as-default */ /* eslint-disable no-param-reassign */ @@ -5,10 +6,18 @@ import { Column } from '../columns'; import ColumnType from '../columns/types/columnType'; +import { DB } from '../db'; import TableIndex from '../indexes/tableIndex'; import { AbstractTable } from '../tables'; import Enum from '../types/type'; +interface EnumsAsObject { + [name: string]: { + name: string, + values: string[] + } +} + interface ColumnAsObject { [name: string]: { name?: string; @@ -63,7 +72,6 @@ export default class MigrationSerializer { const indexToReturn: IndexAsObject = {}; for (const properties of tableEntries) { - const key = properties[0]; const value = properties[1]; if (value instanceof TableIndex) { const columns = value.getColumns(); @@ -85,9 +93,9 @@ export default class MigrationSerializer { } if (value instanceof Column) { - columnToReturn[key] = { + columnToReturn[value.getColumnName()] = { name: value.getColumnName(), - type: value.isAutoIncrement() ? 'serial' : (value.getColumnType() as ColumnType).getDbName(), + type: (value.getColumnType() as ColumnType).getDbName(), primaryKey: !!value.primaryKeyName, unique: !!value.uniqueKeyName, default: value.getDefaultValue() === null ? undefined : value.getDefaultValue(), @@ -96,7 +104,7 @@ export default class MigrationSerializer { const referenced = value.getReferenced(); if (referenced) { - columnToReturn[key].references = { + columnToReturn[value.getColumnName()].references = { foreignKeyName: `${value.getParent().tableName()}_${value.getColumnName()}_fk`, table: referenced.getParentName(), column: referenced.getColumnName(), @@ -127,4 +135,194 @@ export default class MigrationSerializer { return { version: '1', tables: result, enums: enumsToReturn }; }; + + public fromDatabase = async (db: DB) => { + const result: TableAsObject = {}; + + const allTables = await db.session().execute('SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema != \'pg_catalog\' and table_schema != \'information_schema\';'); + for await (const row of allTables.rows) { + try { + // const tableSchema = row.table_schema; + const tableName = row.table_name; + + const columnToReturn: ColumnAsObject = {}; + const indexToReturn: IndexAsObject = {}; + + const tableResponse = await db.session().execute(`SELECT a.attrelid::regclass::text, a.attname + , CASE WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[]) + AND EXISTS ( + SELECT FROM pg_attrdef ad + WHERE ad.adrelid = a.attrelid + AND ad.adnum = a.attnum + AND pg_get_expr(ad.adbin, ad.adrelid) + = 'nextval(''' + || (pg_get_serial_sequence (a.attrelid::regclass::text + , a.attname))::regclass + || '''::regclass)' + ) + THEN CASE a.atttypid + WHEN 'int'::regtype THEN 'serial' + WHEN 'int8'::regtype THEN 'bigserial' + WHEN 'int2'::regtype THEN 'smallserial' + END + ELSE format_type(a.atttypid, a.atttypmod) + END AS data_type, INFORMATION_SCHEMA.COLUMNS.table_name, INFORMATION_SCHEMA.COLUMNS.column_name, INFORMATION_SCHEMA.COLUMNS.column_default + FROM pg_attribute a + JOIN INFORMATION_SCHEMA.COLUMNS ON INFORMATION_SCHEMA.COLUMNS.column_name = a.attname + WHERE a.attrelid = '${tableName}'::regclass and INFORMATION_SCHEMA.COLUMNS.table_name = '${tableName}' + AND a.attnum > 0 + AND NOT a.attisdropped + ORDER BY a.attnum;`); + const tableConstraints = await db.session().execute(`SELECT c.column_name, c.data_type, constraint_type, constraint_name + FROM information_schema.table_constraints tc + JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) + JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema + AND tc.table_name = c.table_name AND ccu.column_name = c.column_name + WHERE tc.table_name = '${tableName}';`); + + const tableForeignKeys = await db.session().execute(`SELECT + tc.table_schema, + tc.constraint_name, + tc.table_name, + kcu.column_name, + ccu.table_schema AS foreign_table_schema, + ccu.table_name AS foreign_table_name, + ccu.column_name AS foreign_column_name, + rc.delete_rule, rc.update_rule + FROM + information_schema.table_constraints AS tc + JOIN information_schema.key_column_usage AS kcu + ON tc.constraint_name = kcu.constraint_name + AND tc.table_schema = kcu.table_schema + JOIN information_schema.constraint_column_usage AS ccu + ON ccu.constraint_name = tc.constraint_name + AND ccu.table_schema = tc.table_schema + JOIN information_schema.referential_constraints AS rc + ON ccu.constraint_name = rc.constraint_name + WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name='${tableName}';`); + + const mappedRefernces: {[name: string]: { + foreignKeyName: string; + onDelete?: string; + onUpdate?: string; + table: string; + column: string; + }} = {}; + + for (const fk of tableForeignKeys.rows) { + // const tableFrom = fk.table_name; + const columnFrom = fk.column_name; + const tableTo = fk.foreign_table_name; + const columnTo = fk.foreign_column_name; + const foreignKeyName = fk.constraint_name; + const onUpdate = fk.update_rule; + const onDelete = fk.delete_rule; + + mappedRefernces[columnFrom] = { + foreignKeyName, + table: tableTo, + column: columnTo, + onDelete: onUpdate ? `ON UPDATE ${onUpdate}` : undefined, + onUpdate: onDelete ? `ON DELETE ${onDelete}` : undefined, + }; + } + + for (const columnResponse of tableResponse.rows) { + const columnName = columnResponse.attname; + const columnType = columnResponse.data_type; + + const primaryKey = tableConstraints.rows.filter((mapRow) => columnName === mapRow.column_name && mapRow.constraint_type === 'PRIMARY KEY'); + const uniqueKey = tableConstraints.rows.filter((mapRow) => columnName === mapRow.column_name && mapRow.constraint_type === 'UNIQUE'); + + const defaultValue: string = columnResponse.column_default === null + ? undefined : columnResponse.column_default; + + const isSerial = columnType === 'serial'; + + columnToReturn[columnName] = { + name: columnName, + type: columnType, + primaryKey: !!primaryKey[0], + unique: !!uniqueKey[0], + default: isSerial ? undefined : defaultValue, + notNull: !columnResponse.is_nullable, + references: mappedRefernces[columnName] ?? undefined, + }; + } + + const dbIndexes = await db.session().execute(`select + t.relname as table_name, + i.relname as index_name, + a.attname as column_name + from + pg_class t, + pg_class i, + pg_index ix, + pg_attribute a + where + t.oid = ix.indrelid + and i.oid = ix.indexrelid + and a.attrelid = t.oid + and a.attnum = ANY(ix.indkey) + and t.relkind = 'r' + and t.relname = '${tableName}' + order by + t.relname, + i.relname;`); + + for (const dbIndex of dbIndexes.rows) { + const indexName = dbIndex.index_name; + const indexColumnName = dbIndex.column_name; + + if (indexToReturn[indexName] !== undefined && indexToReturn[indexName] !== null) { + indexToReturn[indexName]!.columns![indexColumnName] = { + name: indexColumnName, + }; + } else { + indexToReturn[indexName] = { + name: indexName, + columns: { + [indexColumnName]: { + name: indexColumnName, + }, + }, + }; + } + } + + result[tableName] = { + name: tableName, + columns: columnToReturn, + indexes: indexToReturn, + }; + } catch (e) { + console.log(e); + } + } + + const allEnums = await db.session().execute(`select n.nspname as enum_schema, + t.typname as enum_name, + e.enumlabel as enum_value + from pg_type t + join pg_enum e on t.oid = e.enumtypid + join pg_catalog.pg_namespace n ON n.oid = t.typnamespace;`); + + const enumsToReturn: EnumsAsObject = {}; + + for (const dbEnum of allEnums.rows) { + const enumName = dbEnum.enum_name; + const enumValue = dbEnum.enum_value; + + if (enumsToReturn[enumName] !== undefined && enumsToReturn[enumName] !== null) { + enumsToReturn[enumName].values.push(enumValue); + } else { + enumsToReturn[enumName] = { + name: enumName, + values: [enumValue], + }; + } + } + + return { version: '1', tables: result, enums: enumsToReturn }; + }; } diff --git a/src/tables/abstractTable.ts b/src/tables/abstractTable.ts index 746ffbeea..fc197ec51 100644 --- a/src/tables/abstractTable.ts +++ b/src/tables/abstractTable.ts @@ -11,8 +11,8 @@ import InsertTRB from '../builders/highLvlBuilders/insertRequestBuilder'; import DeleteTRB from '../builders/highLvlBuilders/deleteRequestBuilder'; import UpdateTRB from '../builders/highLvlBuilders/updateRequestBuilder'; import SelectTRB from '../builders/highLvlBuilders/selectRequestBuilder'; -import PgBigInt from '../columns/types/pgBigInt'; -import Session from '../db/session'; +import PgBigInt53, { PgBigInt64 } from '../columns/types/pgBigInt'; +import { ISession } from '../db/session'; import BaseLogger from '../logger/abstractLogger'; import PgEnum from '../columns/types/pgEnum'; import DB from '../db/db'; @@ -20,11 +20,15 @@ import { AbstractColumn, Column } from '../columns/column'; import TableIndex from '../indexes/tableIndex'; import { ExtractModel } from './inferTypes'; import Enum, { ExtractEnumValues } from '../types/type'; +import PgSmallInt from '../columns/types/pgSmallInt'; +import PgSerial from '../columns/types/pgSerial'; +import PgTimestamptz from '../columns/types/pgTimestamptz'; +import PgBigSerial53, { PgBigSerial64 } from '../columns/types/pgBigSerial'; export default abstract class AbstractTable> { public db: DB; - private _session: Session; + private _session: ISession; private _logger: BaseLogger | undefined; public constructor(db: DB) { @@ -113,104 +117,72 @@ export default abstract class AbstractTable return new TableIndex(this.tableName(), columns instanceof Array ? columns : [columns]); } - protected varchar(name: string, params?: {size?: number, notNull: false}) - : Column; - protected varchar(name: string, params: {size?: number, notNull: true}) - : Column; - protected varchar(name: string, params?: {size?: number, notNull?: false}) - : Column; - protected varchar(name: string, params: {size?: number, notNull?: true}) - : Column; - protected varchar(name: string, params: {size?: number, notNull?: boolean} = {}) { - return new Column(this, name, new PgVarChar(params.size), - !params?.notNull ?? false); - } - - protected int(name: string, params?: {notNull: false}): Column; - protected int(name: string, params: {notNull: true}): Column; - protected int(name: string, params: {notNull?: boolean} = {}) { - return new Column(this, name, new PgInteger(), !params?.notNull ?? false); - } - - protected timestamp(name: string, params?: { notNull: false }): Column; - protected timestamp(name: string, params: { notNull: true }): Column; - protected timestamp(name: string, params: { notNull?: boolean } = {}) { - return new Column(this, name, new PgTimestamp(), !params?.notNull ?? false); - } - - protected bigint(name: string, params?: {notNull: false}): Column; - protected bigint(name: string, params: {notNull: true}): Column; - protected bigint(name: string, params: {notNull?: boolean} = {}) { - return new Column(this, name, new PgBigInt(), !params?.notNull ?? false); - } - - // protected enum(from: { [s: number]: string }, - // name: string, dbName:string, params?: {notNull: false}) - // : Column, true>; - // protected enum(from: { [s: number]: string }, - // name: string, dbName:string, params: {notNull: true}) - // : Column, false>; - // protected enum(from: { [s: number]: string }, - // name: string, dbName:string, params: {notNull?: boolean} = {}) { - // return new Column(this, name, - // new PgEnum(name, dbName, from as TSubType), !params?.notNull ?? false); - // } - - // @TODO handle enums properly - protected type(typeEnum: Enum, - name: string, params?: {notNull: false}) - : Column>>, true>; - protected type(typeEnum: Enum, - name: string, params: {notNull: true}) - : Column>>, false>; - protected type(typeEnum: Enum, - name: string, params: {notNull?: boolean} = {}) { + protected varchar(name: string, params: {size?: number} = {}): Column { + return new Column(this, name, new PgVarChar(params.size)); + } + + protected int(name: string): Column { + return new Column(this, name, new PgInteger()); + } + + protected smallInt(name: string): Column { + return new Column(this, name, new PgSmallInt()); + } + + protected serial(name: string): Column { + return new Column(this, name, new PgSerial()); + } + + protected bigSerial(name: string, maxBytes: 'max_bytes_53'): Column + protected bigSerial(name: string, maxBytes: 'max_bytes_64'): Column + protected bigSerial(name: string, maxBytes: 'max_bytes_53' | 'max_bytes_64') { + if (maxBytes === 'max_bytes_53') { + return new Column(this, name, new PgBigSerial53()); + } + return new Column(this, name, new PgBigSerial64()); + } + + protected timestamp(name: string): Column { + return new Column(this, name, new PgTimestamp()); + } + + protected timestamptz(name: string): Column { + return new Column(this, name, new PgTimestamptz()); + } + + protected bigint(name: string, maxBytes: 'max_bytes_53'): Column + protected bigint(name: string, maxBytes: 'max_bytes_64'): Column + protected bigint(name: string, maxBytes: 'max_bytes_53' | 'max_bytes_64') { + if (maxBytes === 'max_bytes_53') { + return new Column(this, name, new PgBigInt53()); + } + return new Column(this, name, new PgBigInt64()); + } + + protected type(typeEnum: Enum, name: string) + : Column>>, true> { const pgEnum = new PgEnum>(typeEnum.name); - return new Column(this, name, pgEnum, !params?.notNull ?? false); - } - - protected decimal(name: string, params?: { precision?: number, scale: number, notNull?: false }) - : Column; - protected decimal(name: string, params: { precision?: number, scale: number, notNull?: true }) - : Column; - protected decimal(name: string, params?: { precision: number, scale?: number, notNull?: false }) - : Column; - protected decimal(name: string, params: { precision: number, scale?: number, notNull?: true }) - : Column; - protected decimal(name: string, params?: { precision?: number, scale?: number, notNull?: false }) - : Column; - protected decimal(name: string, params: { precision?: number, scale?: number, notNull?: true }) - : Column; - protected decimal(name: string, params: { precision?: number, scale?: number, - notNull?: boolean } = {}) { - return new Column(this, name, - new PgBigDecimal(params.precision, params.scale), !params?.notNull ?? false); - } - - protected time(name: string, params?: { notNull: false }): Column; - protected time(name: string, params: {notNull: true}): Column; - protected time(name: string, params: {notNull?: boolean} = {}) { - return new Column(this, name, new PgTime(), !params?.notNull ?? false); - } - - protected bool(name: string, params?: {notNull: false}): Column; - protected bool(name: string, params: {notNull: true}): Column; - protected bool(name: string, params: {notNull?: boolean} = {}) { - return new Column(this, name, new PgBoolean(), !params?.notNull ?? false); - } - - protected text(name: string, params?: {notNull: false}): Column; - protected text(name: string, params: {notNull: true}): Column; - protected text(name: string, params: {notNull?: boolean} = {}) { - return new Column(this, name, new PgText(), !params?.notNull ?? false); - } - - protected jsonb(name: string, params?: {notNull: false}) - : Column, true>; - protected jsonb(name: string, params: {notNull: true}) - : Column, false>; - protected jsonb(name: string, params: {notNull?: boolean} = {}) { - return new Column(this, name, - new PgJsonb(), !params?.notNull ?? false); + return new Column(this, name, pgEnum); + } + + protected decimal(name: string, params: { precision?: number, scale?: number} + = {}): Column { + return new Column(this, name, new PgBigDecimal(params.precision, params.scale)); + } + + protected time(name: string): Column { + return new Column(this, name, new PgTime()); + } + + protected bool(name: string): Column { + return new Column(this, name, new PgBoolean()); + } + + protected text(name: string): Column { + return new Column(this, name, new PgText()); + } + + protected jsonb(name: string): Column, true> { + return new Column(this, name, new PgJsonb()); } } diff --git a/src/tables/index.ts b/src/tables/index.ts index de8a43d82..0a6502a1d 100644 --- a/src/tables/index.ts +++ b/src/tables/index.ts @@ -1,3 +1,4 @@ /* eslint-disable import/no-cycle */ export { default as MigrationsTable } from './migrationsTable'; export { default as AbstractTable } from './abstractTable'; +export { ExtractModel } from './inferTypes'; diff --git a/src/tables/migrationsTable.ts b/src/tables/migrationsTable.ts index 1225806b3..704f169de 100644 --- a/src/tables/migrationsTable.ts +++ b/src/tables/migrationsTable.ts @@ -1,12 +1,11 @@ import AbstractTable from './abstractTable'; export default class MigrationsTable extends AbstractTable { - public id = this.int('id').autoIncrement().primaryKey(); - public version = this.int('version', { notNull: true }).unique(); - public hash = this.text('hash'); - public createdAt = this.timestamp('created_at'); + public id = this.serial('id').primaryKey(); + public hash = this.text('hash').notNull(); + public createdAt = this.bigint('created_at', 'max_bytes_53'); public tableName(): string { - return 'migrations'; + return 'drizzle_migrations'; } }