From 100d79c5e2e450655023e9c2d23b8c9775f03c85 Mon Sep 17 00:00:00 2001 From: Vasil Rangelov Date: Tue, 18 Jun 2019 15:56:52 +0300 Subject: [PATCH 01/20] Added property visibility to RelationId properties --- src/entity.mst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/entity.mst b/src/entity.mst index 5a49072..719c657 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -33,7 +33,7 @@ import {BaseEntity,Column,Entity,Index,JoinColumn,JoinTable,ManyToMany,ManyToOne {{#if relationIdField }} @RelationId(({{../../tsEntityName}}: {{toEntityName ../../tsEntityName}}) => {{../../tsEntityName}}.{{toPropertyName ../tsName}}) - {{toPropertyName ../tsName}}Id: {{#if isOneToOne}}{{toLazy ../tsType}}{{else}}{{toLazy (concat ../tsType "[]")}}{{/if}};{{/if}}{{/relations}} + {{printPropertyVisibility}}{{toPropertyName ../tsName}}Id: {{#if isOneToOne}}{{toLazy ../tsType}}{{else}}{{toLazy (concat ../tsType "[]")}}{{/if}};{{/if}}{{/relations}} {{/Columns}} {{#if GenerateConstructor}} constructor(init?: Partial<{{toEntityName tsEntityName}}>) { From c3a9eea49b789295338cd81190998bb68b6108d0 Mon Sep 17 00:00:00 2001 From: Vasil Rangelov Date: Tue, 18 Jun 2019 16:58:47 +0300 Subject: [PATCH 02/20] strict TS and TSLint compliance Removed unused "type" argument in favor of an empty argument list; The generated argument name in RelationId columns now uses the defined property case. --- src/entity.mst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/entity.mst b/src/entity.mst index 5a49072..63f0acb 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -25,14 +25,14 @@ import {BaseEntity,Column,Entity,Index,JoinColumn,JoinTable,ManyToMany,ManyToOne }){{/options}} {{printPropertyVisibility}}{{toPropertyName tsName}}:{{tsType}}{{#options/nullable}} | null{{/options/nullable}}; {{/relations}}{{#relations}} - @{{relationType}}(type=>{{toEntityName relatedTable}}, {{tolowerCaseFirst relatedTable}}=>{{tolowerCaseFirst relatedTable}}.{{#if isOwner}}{{toPropertyName ownerColumn}},{ {{#../options/primary}}primary:true,{{/../options/primary}}{{^../options/nullable}} nullable:false,{{/../options/nullable}}{{#actionOnDelete}}onDelete: '{{.}}',{{/actionOnDelete}}{{#actionOnUpdate}}onUpdate: '{{.}}'{{/actionOnUpdate}} }{{else}}{{toPropertyName relatedColumn}}{{#if (or actionOnDelete actionOnUpdate ) }},{ {{#actionOnDelete}}onDelete: '{{.}}' ,{{/actionOnDelete}}{{#actionOnUpdate}}onUpdate: '{{.}}'{{/actionOnUpdate}} }{{/if}}{{/if}}){{#isOwner}} + @{{relationType}}(()=>{{toEntityName relatedTable}}, {{tolowerCaseFirst relatedTable}}=>{{tolowerCaseFirst relatedTable}}.{{#if isOwner}}{{toPropertyName ownerColumn}},{ {{#../options/primary}}primary:true,{{/../options/primary}}{{^../options/nullable}} nullable:false,{{/../options/nullable}}{{#actionOnDelete}}onDelete: '{{.}}',{{/actionOnDelete}}{{#actionOnUpdate}}onUpdate: '{{.}}'{{/actionOnUpdate}} }{{else}}{{toPropertyName relatedColumn}}{{#if (or actionOnDelete actionOnUpdate ) }},{ {{#actionOnDelete}}onDelete: '{{.}}' ,{{/actionOnDelete}}{{#actionOnUpdate}}onUpdate: '{{.}}'{{/actionOnUpdate}} }{{/if}}{{/if}}){{#isOwner}} {{#if isManyToMany}}@JoinTable({ name:'{{ ../options/name}}'}){{else}}@JoinColumn({ name:'{{ ../options/name}}'}){{/if}}{{/isOwner}} {{#if (or isOneToMany isManyToMany)}}{{printPropertyVisibility}}{{toPropertyName ../tsName}}:{{toLazy (concat (toEntityName relatedTable) "[]")}}; {{else}}{{printPropertyVisibility}}{{toPropertyName ../tsName}}:{{toLazy (concat (toEntityName relatedTable) ' | null')}}; {{/if}} {{#if relationIdField }} - @RelationId(({{../../tsEntityName}}: {{toEntityName ../../tsEntityName}}) => {{../../tsEntityName}}.{{toPropertyName ../tsName}}) + @RelationId(({{toPropertyName ../../tsEntityName}}: {{toEntityName ../../tsEntityName}}) => {{toPropertyName ../../tsEntityName}}.{{toPropertyName ../tsName}}) {{toPropertyName ../tsName}}Id: {{#if isOneToOne}}{{toLazy ../tsType}}{{else}}{{toLazy (concat ../tsType "[]")}}{{/if}};{{/if}}{{/relations}} {{/Columns}} {{#if GenerateConstructor}} From 4868dcbdfa2b98a108569b81f1172f0a805f7a73 Mon Sep 17 00:00:00 2001 From: Vasil Rangelov Date: Thu, 20 Jun 2019 15:54:33 +0300 Subject: [PATCH 03/20] Replaced "Object" with "object" for the generated JSON column type, so that TSLint does not complain about it being too general, while still preserving the same semantics. --- src/drivers/MysqlDriver.ts | 2 +- src/drivers/PostgresDriver.ts | 14 +++++++------- src/models/ColumnInfo.ts | 4 ++-- .../integration/entityTypes/mariadb/entity/Post.ts | 2 +- .../entityTypes/postgres/entity/Post.ts | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index 11e43a4..23c0c0f 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -163,7 +163,7 @@ export class MysqlDriver extends AbstractDriver { ).replace(/\'/gi, '"'); break; case "json": - colInfo.tsType = "Object"; + colInfo.tsType = "object"; break; case "binary": colInfo.tsType = "Buffer"; diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index 2c2fd0c..6881b91 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -159,8 +159,8 @@ export class PostgresDriver extends AbstractDriver { | "boolean" | "Date" | "Buffer" - | "Object" - | "string | Object" + | "object" + | "string | object" | "string | string[]" | "any" | null; @@ -288,7 +288,7 @@ export class PostgresDriver extends AbstractDriver { ret.ts_type = "string"; break; case "point": - ret.ts_type = "string | Object"; + ret.ts_type = "string | object"; break; case "line": ret.ts_type = "string"; @@ -297,7 +297,7 @@ export class PostgresDriver extends AbstractDriver { ret.ts_type = "string | string[]"; break; case "box": - ret.ts_type = "string | Object"; + ret.ts_type = "string | object"; break; case "path": ret.ts_type = "string"; @@ -306,7 +306,7 @@ export class PostgresDriver extends AbstractDriver { ret.ts_type = "string"; break; case "circle": - ret.ts_type = "string | Object"; + ret.ts_type = "string | object"; break; case "cidr": ret.ts_type = "string"; @@ -330,10 +330,10 @@ export class PostgresDriver extends AbstractDriver { ret.ts_type = "string"; break; case "json": - ret.ts_type = "Object"; + ret.ts_type = "object"; break; case "jsonb": - ret.ts_type = "Object"; + ret.ts_type = "object"; break; case "int4range": ret.ts_type = "string"; diff --git a/src/models/ColumnInfo.ts b/src/models/ColumnInfo.ts index 24307c6..6b7f167 100644 --- a/src/models/ColumnInfo.ts +++ b/src/models/ColumnInfo.ts @@ -10,8 +10,8 @@ export class ColumnInfo { | "boolean" | "Date" | "Buffer" - | "Object" - | "string | Object" + | "object" + | "string | object" | "string | string[]" | "any"; public relations: RelationInfo[] = []; diff --git a/test/integration/entityTypes/mariadb/entity/Post.ts b/test/integration/entityTypes/mariadb/entity/Post.ts index 491f16b..bdd5343 100644 --- a/test/integration/entityTypes/mariadb/entity/Post.ts +++ b/test/integration/entityTypes/mariadb/entity/Post.ts @@ -89,7 +89,7 @@ export class Post { // In mariaDb Json is recognized as longtext // @Column("json") - // json: Object; + // json: object; @Column("binary") binary: Buffer; diff --git a/test/integration/entityTypes/postgres/entity/Post.ts b/test/integration/entityTypes/postgres/entity/Post.ts index 79f26dc..c422050 100644 --- a/test/integration/entityTypes/postgres/entity/Post.ts +++ b/test/integration/entityTypes/postgres/entity/Post.ts @@ -123,7 +123,7 @@ export class Post { // enum: string; @Column("point") - point: string | Object; + point: string | object; @Column("line") line: string; @@ -132,7 +132,7 @@ export class Post { lseg: string | string[]; @Column("box") - box: string | Object; + box: string | object; @Column("path") path: string; @@ -141,7 +141,7 @@ export class Post { polygon: string; @Column("circle") - circle: string | Object; + circle: string | object; @Column("cidr") cidr: string; From 2240cc3aebd2c9e90c9a6862851af1cf6cee4ec2 Mon Sep 17 00:00:00 2001 From: Vasil Rangelov Date: Tue, 2 Jul 2019 15:18:47 +0300 Subject: [PATCH 04/20] Added support for UNSIGNED columns in MySQL. --- src/drivers/MysqlDriver.ts | 3 +++ src/entity.mst | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index 11e43a4..3ba911f 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -72,6 +72,9 @@ export class MysqlDriver extends AbstractDriver { resp.COLUMN_DEFAULT ); colInfo.options.type = resp.DATA_TYPE as any; + colInfo.options.unsigned = resp.COLUMN_TYPE.endsWith( + " unsigned" + ); switch (resp.DATA_TYPE) { case "int": colInfo.tsType = "number"; diff --git a/src/entity.mst b/src/entity.mst index 5a49072..eacaa33 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -15,7 +15,8 @@ import {BaseEntity,Column,Entity,Index,JoinColumn,JoinTable,ManyToMany,ManyToOne primary:{{primary}},{{/primary}}{{/generated}}{{#unique}} unique: true,{{/unique}}{{#length}} length:{{.}},{{/length}}{{#width}} - width:{{.}},{{/width}}{{#default}} + width:{{.}},{{/width}}{{#unsigned}} + unsigned: true,{{/unsigned}}{{#default}} default: {{.}},{{/default}}{{#precision}} precision:{{.}},{{/precision}}{{#scale}} scale:{{.}},{{/scale}}{{#enum}} From ac985b0a61d0e338b95387de19933486b40d84d6 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Tue, 9 Jul 2019 22:31:04 +0200 Subject: [PATCH 05/20] fixing tests --- test/integration/entityTypes/mysql/entity/Post.ts | 2 +- test/integration/entityTypes/postgres/entity/Post.ts | 4 ++-- .../entityTypes/postgres/entity/PostArrays.ts | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/integration/entityTypes/mysql/entity/Post.ts b/test/integration/entityTypes/mysql/entity/Post.ts index 6e468d9..60c5282 100644 --- a/test/integration/entityTypes/mysql/entity/Post.ts +++ b/test/integration/entityTypes/mysql/entity/Post.ts @@ -88,7 +88,7 @@ export class Post { enum: string; @Column("json") - json: Object; + json: object; @Column("binary") binary: Buffer; diff --git a/test/integration/entityTypes/postgres/entity/Post.ts b/test/integration/entityTypes/postgres/entity/Post.ts index c422050..3bf7985 100644 --- a/test/integration/entityTypes/postgres/entity/Post.ts +++ b/test/integration/entityTypes/postgres/entity/Post.ts @@ -165,10 +165,10 @@ export class Post { xml: string; @Column("json") - json: Object; + json: object; @Column("jsonb") - jsonb: Object; + jsonb: object; @Column("int4range") int4range: string; diff --git a/test/integration/entityTypes/postgres/entity/PostArrays.ts b/test/integration/entityTypes/postgres/entity/PostArrays.ts index d880503..fde1012 100644 --- a/test/integration/entityTypes/postgres/entity/PostArrays.ts +++ b/test/integration/entityTypes/postgres/entity/PostArrays.ts @@ -123,7 +123,7 @@ export class PostArrays { // enum: string[]; @Column("point", { array: true }) - point: string[] | Object[]; + point: string[] | object[]; @Column("line", { array: true }) line: string[]; @@ -132,7 +132,7 @@ export class PostArrays { lseg: string[] | string[][]; @Column("box", { array: true }) - box: string[] | Object[]; + box: string[] | object[]; @Column("path", { array: true }) path: string[]; @@ -141,7 +141,7 @@ export class PostArrays { polygon: string[]; @Column("circle", { array: true }) - circle: string[] | Object[]; + circle: string[] | object[]; @Column("cidr", { array: true }) cidr: string[]; @@ -165,10 +165,10 @@ export class PostArrays { xml: string[]; @Column("json", { array: true }) - json: Object[]; + json: object[]; @Column("jsonb", { array: true }) - jsonb: Object[]; + jsonb: object[]; @Column("int4range", { array: true }) int4range: string[]; From b89542a4d1b7223637d0df7595e74852131339f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2019 07:33:13 +0000 Subject: [PATCH 06/20] Bump lodash from 4.17.11 to 4.17.14 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.14. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.14) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec320e4..56ee124 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2959,9 +2959,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" }, "lodash.flattendeep": { "version": "4.4.0", From df20deef142dab4f4e92383ae1849702d4ca2b83 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Fri, 19 Jul 2019 10:48:21 +0200 Subject: [PATCH 07/20] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a57a805..1e09d79 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # typeorm-model-generator -[![Greenkeeper badge](https://badges.greenkeeper.io/Kononnable/typeorm-model-generator.svg)](https://greenkeeper.io/) [![Build Status](https://travis-ci.org/Kononnable/typeorm-model-generator.svg?branch=master)](https://travis-ci.org/Kononnable/typeorm-model-generator) [![npm version](https://badge.fury.io/js/typeorm-model-generator.svg)](https://badge.fury.io/js/typeorm-model-generator) [![codecov](https://codecov.io/gh/Kononnable/typeorm-model-generator/branch/master/graph/badge.svg)](https://codecov.io/gh/Kononnable/typeorm-model-generator) From 71c4f0ea7329f90aa53da77b94da8f3e95e6067d Mon Sep 17 00:00:00 2001 From: Pawe Kotarski Date: Fri, 19 Jul 2019 11:21:33 +0200 Subject: [PATCH 08/20] add test --- test/integration/entityTypes/mysql/entity/Post.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/integration/entityTypes/mysql/entity/Post.ts b/test/integration/entityTypes/mysql/entity/Post.ts index 6e468d9..9b71cbf 100644 --- a/test/integration/entityTypes/mysql/entity/Post.ts +++ b/test/integration/entityTypes/mysql/entity/Post.ts @@ -15,10 +15,13 @@ export class Post { @Column("int") int: number; + @Column("int", { unsigned: true }) + uint: number; + @Column("tinyint") tinyint: number; - @Column("tinyint",{width:1}) + @Column("tinyint", { width: 1 }) boolean: boolean; @Column("smallint") From 1f4cfedc38fb0dcb8b9b3bc02c2005149151b5bc Mon Sep 17 00:00:00 2001 From: Bert Verhelst Date: Thu, 1 Aug 2019 10:14:13 +0200 Subject: [PATCH 09/20] docs: add docs:generating multiple schemas at once --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1e09d79..baafc71 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,9 @@ Options: -o, --output Where to place generated models [default: "Z:\Repos\typeorm-model-generator\output"] -s, --schema Schema name to create model from. Only for mssql and - postgres + postgres. Specify multiple schemas at once by providing + a comma separated list. + eg: -s scheme1, scheme2, scheme3 --ssl [boolean] [default: false] --noConfig Doesn't create tsconfig.json and ormconfig.json [boolean] [default: false] From 0794cf92ef9ab4f71b648064b705838f31ea9d06 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Sat, 3 Aug 2019 20:26:37 +0200 Subject: [PATCH 10/20] update dependencies --- package-lock.json | 1958 +++++++++------------------------ package.json | 38 +- src/drivers/AbstractDriver.ts | 24 +- src/drivers/MssqlDriver.ts | 6 +- src/drivers/MysqlDriver.ts | 6 +- src/drivers/OracleDriver.ts | 8 +- src/drivers/PostgresDriver.ts | 12 +- src/drivers/SqliteDriver.ts | 6 +- 8 files changed, 523 insertions(+), 1535 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56ee124..5c5c43c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,23 +80,6 @@ "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", "dev": true }, - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - } - } - }, "@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", @@ -147,6 +130,32 @@ "to-fast-properties": "^2.0.0" } }, + "@nodelib/fs.scandir": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz", + "integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.1", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz", + "integrity": "sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz", + "integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.1", + "fastq": "^1.6.0" + } + }, "@samverschueren/stream-to-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", @@ -199,9 +208,9 @@ "dev": true }, "@types/chai-as-promised": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", - "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-dberBxQW/XWv6BMj0su1lV9/C9AUx5Hqu2pisuS6S4YK/Qt6vurcj/BmcbEsobIWWCQzhesNY8k73kIxx4X7Mg==", "dev": true, "requires": { "@types/chai": "*" @@ -216,15 +225,32 @@ "@types/chai": "*" } }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, "@types/fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-ndoMMbGyuToTy4qB6Lex/inR98nPiNHacsgMPvy+zqMLgSxbt8VtWpDArpGp69h1fEDQHn1KB+9DWD++wgbwYA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", "dev": true, "requires": { "@types/node": "*" } }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/handlebars": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", @@ -235,15 +261,21 @@ } }, "@types/inquirer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.0.3.tgz", - "integrity": "sha512-lBsdZScFMaFYYIE3Y6CWX22B9VeY2NerT1kyU2heTc3u/W6a+Om6Au2q0rMzBrzynN0l4QoABhI0cbNdyz6fDg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==", "dev": true, "requires": { "@types/through": "*", "rxjs": "^6.4.0" } }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", @@ -251,9 +283,9 @@ "dev": true }, "@types/mssql": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/mssql/-/mssql-4.0.14.tgz", - "integrity": "sha512-cU3IzY3Dlnac1sGj4KL5rK/1VNSQ+G8mFWGPcYh0KwPDsitqHLLr1Jnbh8Lej+j06phdtscKbZWiENtXwDBo+A==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@types/mssql/-/mssql-4.0.16.tgz", + "integrity": "sha512-bvH+9IZJ46QyQtuBciDyDf3lSqFFM/XhdVsHsCdVm0CdaZwH421wOIHJ2ajb2CG4XFqfNXA+UVNDyPqiNz6c0w==", "dev": true, "requires": { "@types/node": "*" @@ -269,9 +301,9 @@ } }, "@types/node": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.4.tgz", - "integrity": "sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw==", + "version": "12.6.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.9.tgz", + "integrity": "sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw==", "dev": true }, "@types/normalize-package-data": { @@ -281,9 +313,9 @@ "dev": true }, "@types/oracledb": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-3.1.1.tgz", - "integrity": "sha512-ZAcvx0+WNaqqQ1S5Oqq7ju5K42GOHtHzh3JLcYcTrzCskGQVonmuKHlfyjfIkTU0sPinZDBO39gzy06oG9wkFA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-3.1.3.tgz", + "integrity": "sha512-UlFv/T2A+PnvaNldjGjVQ7EBXxrAqtPman3i5J9kUQu37W+l/iFM2BPTg6CYr/Uxx6v0dAoVgHb1Po+dFfCdSg==", "dev": true, "requires": { "@types/node": "*" @@ -309,9 +341,9 @@ } }, "@types/sinon": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.12.tgz", - "integrity": "sha512-fo0MWpVPSUrnZZhp9wyu+hhI3VJ9+Jhs+PWrokBTg3d2ryNPDOAWF1csIhQuYWBTn7KdZzXpRgpX2o6cwOlPWg==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.13.tgz", + "integrity": "sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung==", "dev": true }, "@types/through": { @@ -330,9 +362,9 @@ "dev": true }, "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "adal-node": { "version": "0.1.28", @@ -447,9 +479,9 @@ } }, "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", + "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==" }, "argparse": { "version": "1.0.9", @@ -465,24 +497,6 @@ "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", "dev": true }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -490,30 +504,9 @@ "dev": true }, "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "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 }, "asn1": { @@ -535,12 +528,6 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -551,12 +538,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -572,61 +553,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", @@ -669,32 +595,12 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "fill-range": "^7.0.1" } }, "browser-stdout": { @@ -733,23 +639,6 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "caching-transform": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", @@ -881,9 +770,9 @@ "dev": true }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" }, "ci-info": { "version": "2.0.0", @@ -891,29 +780,6 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -1085,16 +951,6 @@ } } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1127,12 +983,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1161,12 +1011,6 @@ "safe-buffer": "~5.1.1" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1182,18 +1026,6 @@ "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" - }, - "dependencies": { - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } } }, "cp-file": { @@ -1221,6 +1053,7 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -1232,7 +1065,8 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true } } }, @@ -1268,12 +1102,6 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -1312,59 +1140,17 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.0.0.tgz", + "integrity": "sha512-TfU3nUY0WDIhN18eq+pgpbLY9AfL5RfiE9czKaTSolc6aK7qASXfDErvYgjV1UqCR4sNXDoxO0/idPmhDUt2Sg==", "dev": true, "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "globby": "^10.0.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "rimraf": "^2.6.3" } }, "delayed-stream": { @@ -1393,6 +1179,23 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "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" + }, + "dependencies": { + "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 + } + } + }, "dot-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", @@ -1439,6 +1242,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -1518,6 +1322,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -1528,157 +1333,21 @@ "strip-eof": "^1.0.0" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1689,11 +1358,34 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, + "fast-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", + "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.1", + "@nodelib/fs.walk": "^1.2.1", + "glob-parent": "^5.0.0", + "is-glob": "^4.0.1", + "merge2": "^1.2.3", + "micromatch": "^4.0.2" + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fastq": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", + "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "dev": true, + "requires": { + "reusify": "^1.0.0" + } + }, "figlet": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.2.3.tgz", @@ -1708,26 +1400,12 @@ } }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" } }, "find-cache-dir": { @@ -1752,12 +1430,6 @@ } } }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -1783,18 +1455,6 @@ } } }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -1832,23 +1492,21 @@ "mime-types": "^2.1.12" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fs-extra": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", - "integrity": "sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + } } }, "fs-minipass": { @@ -1870,17 +1528,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "g-status": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", - "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "matcher": "^1.0.0", - "simple-git": "^1.85.0" - } - }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -1961,16 +1608,11 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, "requires": { "pump": "^3.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1992,6 +1634,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1999,24 +1650,19 @@ "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" } }, "graceful-fs": { @@ -2095,38 +1741,6 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hasha": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", @@ -2183,17 +1797,18 @@ } }, "husky": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-2.3.0.tgz", - "integrity": "sha512-A/ZQSEILoq+mQM3yC3RIBSaw1bYXdkKnyyKVSUiJl+iBjVZc5LQEXdGY1ZjrDxC4IzfRPiJ0IqzEQGCN5TQa/A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.2.tgz", + "integrity": "sha512-WXCtaME2x0o4PJlKY4ap8BzLA+D0zlvefqAvLCPriOOu+x0dpO5uc5tlB7CY6/0SE2EESmoZsj4jW5D09KrJoA==", "dev": true, "requires": { - "cosmiconfig": "^5.2.0", + "chalk": "^2.4.2", + "cosmiconfig": "^5.2.1", "execa": "^1.0.0", - "find-up": "^3.0.0", "get-stdin": "^7.0.0", "is-ci": "^2.0.0", - "pkg-dir": "^4.1.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", "please-upgrade-node": "^3.1.1", "read-pkg": "^5.1.1", "run-node": "^1.0.0", @@ -2213,6 +1828,12 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, + "ignore": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", + "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", + "dev": true + }, "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", @@ -2263,9 +1884,9 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -2273,7 +1894,7 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", @@ -2285,27 +1906,8 @@ "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true }, "is-arrayish": { "version": "0.2.1", @@ -2313,12 +1915,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -2334,63 +1930,18 @@ "ci-info": "^2.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2420,24 +1971,10 @@ } }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-obj": { "version": "1.0.1", @@ -2455,36 +1992,27 @@ } }, "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "^2.1.0" } }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" + "path-is-inside": "^1.0.2" } }, "is-promise": { @@ -2510,7 +2038,8 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-symbol": { "version": "1.0.2", @@ -2534,12 +2063,6 @@ "upper-case": "^1.1.0" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2548,12 +2071,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isstream": { @@ -2746,74 +2264,127 @@ "safe-buffer": "^5.0.1" } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, "requires": { "invert-kv": "^2.0.0" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "lint-staged": { - "version": "8.1.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.7.tgz", - "integrity": "sha512-egT0goFhIFoOGk6rasPngTFh2qDqxZddM0PwI58oi66RxCDcn5uDwxmiasWIF0qGnchHSYVJ8HPRD5LrFo7TKA==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.2.1.tgz", + "integrity": "sha512-3lGgJfBddCy/WndKdNko+uJbwyYjBD1k+V+SA+phBYWzH265S95KQya/Wln/UL+hOjc7NcjtFYVCUWuAcqYHhg==", "dev": true, "requires": { - "chalk": "^2.3.1", - "commander": "^2.14.1", - "cosmiconfig": "^5.2.0", - "debug": "^3.1.0", + "chalk": "^2.4.2", + "commander": "^2.20.0", + "cosmiconfig": "^5.2.1", + "debug": "^4.1.1", "dedent": "^0.7.0", - "del": "^3.0.0", - "execa": "^1.0.0", - "find-parent-dir": "^0.3.0", - "g-status": "^2.0.2", - "is-glob": "^4.0.0", - "is-windows": "^1.0.2", - "listr": "^0.14.2", - "listr-update-renderer": "^0.5.0", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "micromatch": "^3.1.8", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "please-upgrade-node": "^3.0.2", - "staged-git-files": "1.1.2", - "string-argv": "^0.0.2", - "stringify-object": "^3.2.2", - "yup": "^0.27.0" + "del": "^5.0.0", + "execa": "^2.0.3", + "listr": "^0.14.3", + "log-symbols": "^3.0.0", + "micromatch": "^4.0.2", + "please-upgrade-node": "^3.1.1", + "string-argv": "^0.3.0", + "stringify-object": "^3.3.0" }, "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "ms": "^2.1.1" } }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "execa": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.3.tgz", + "integrity": "sha512-iM124nlyGSrXmuyZF1EMe83ESY2chIYVyDRZKgmcDynid2Q2v/+GuE7gNMl6Sy9Niwf4MC0DDxagOxeMPjuLsw==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "cross-spawn": "^6.0.5", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true } } }, @@ -2832,14 +2403,6 @@ "listr-verbose-renderer": "^0.5.0", "p-map": "^2.0.0", "rxjs": "^6.3.3" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } } }, "listr-silent-renderer": { @@ -3059,38 +2622,16 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, "requires": { "p-defer": "^1.0.0" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.4" - } - }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", @@ -3100,7 +2641,8 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true } } }, @@ -3113,25 +2655,26 @@ "source-map": "^0.6.1" } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", + "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==", + "dev": true + }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "mime-db": { @@ -3175,9 +2718,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" } } }, @@ -3189,27 +2732,6 @@ "minipass": "^2.2.1" } }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3226,9 +2748,9 @@ } }, "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", + "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -3270,16 +2792,6 @@ "path-is-absolute": "^1.0.0" } }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -3389,25 +2901,6 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "native-duplexpair": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", @@ -3437,7 +2930,8 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "nise": { "version": "1.5.0", @@ -3501,15 +2995,6 @@ "tar": "^4" }, "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -3517,6 +3002,15 @@ } } }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -3546,40 +3040,21 @@ "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" }, "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", + "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" } }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, - "requires": { - "which": "^1.2.10" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", "dev": true, "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" + "path-key": "^2.0.0" } }, "npmlog": { @@ -3649,52 +3124,12 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "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-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -3717,15 +3152,6 @@ "es-abstract": "^1.5.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3742,6 +3168,12 @@ "mimic-fn": "^1.0.0" } }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -3760,6 +3192,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", @@ -3783,17 +3216,20 @@ "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true }, "p-limit": { "version": "2.2.0", @@ -3812,9 +3248,9 @@ } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, "p-try": { @@ -3876,12 +3312,6 @@ "upper-case-first": "^1.1.0" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, "path-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", @@ -3909,7 +3339,8 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.6", @@ -3955,9 +3386,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pg": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.11.0.tgz", - "integrity": "sha512-YO4V7vCmEMGoF390LJaFaohWNKaA2ayoQOEZmiHVcAUF+YsRThpf/TaKCgSvsSE7cDm37Q/Cy3Gz41xiX/XjTw==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.12.0.tgz", + "integrity": "sha512-q54Ic0oBXfDZMwheP8ALeUX32TUXvF7SNgAlZjyhkDuFCJkQCgcLBz0Be5uOrAj3ljSok/CI9lRbYzEko0z1Zw==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", @@ -3979,9 +3410,9 @@ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, "pg-pool": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.6.tgz", - "integrity": "sha512-hod2zYQxM8Gt482q+qONGTYcg/qVcV32VHVPtktbBJs0us3Dj7xibISw0BAAXVMCzt8A/jhfJvpZaxUlqtqs0g==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw==" }, "pg-types": { "version": "2.0.1", @@ -4003,27 +3434,18 @@ "split": "^1.0.0" } }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -4034,12 +3456,13 @@ }, "dependencies": { "find-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.0.0.tgz", - "integrity": "sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^5.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { @@ -4059,6 +3482,12 @@ "requires": { "p-limit": "^2.2.0" } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true } } }, @@ -4071,12 +3500,6 @@ "semver-compare": "^1.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -4101,15 +3524,9 @@ } }, "prettier": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", - "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", - "dev": true - }, - "property-expr": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", - "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", "dev": true }, "pseudomap": { @@ -4127,6 +3544,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -4161,15 +3579,29 @@ } }, "read-pkg": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", - "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", - "parse-json": "^4.0.0", - "type-fest": "^0.4.1" + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + } } }, "read-pkg-up": { @@ -4221,16 +3653,6 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -4240,18 +3662,6 @@ "es6-error": "^4.0.1" } }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -4296,18 +3706,21 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -4317,10 +3730,10 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "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": { @@ -4360,6 +3773,12 @@ "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", "dev": true }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", @@ -4373,15 +3792,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4417,33 +3827,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -4451,33 +3839,14 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "simple-git": { - "version": "1.113.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.113.0.tgz", - "integrity": "sha512-i9WVsrK2u0G/cASI9nh7voxOk9mhanWY9eGtWBDSYql6m49Yk5/Fan6uZsDr/xmzv8n+eQ8ahKCoEr8cvU3h+g==", - "dev": true, - "requires": { - "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "sinon": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", @@ -4519,167 +3888,20 @@ "no-case": "^2.2.0" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "spawn-wrap": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", @@ -4734,24 +3956,15 @@ "through": "2" } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^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=" }, "sqlite3": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.8.tgz", - "integrity": "sha512-kgwHu4j10KhpCHtx//dejd/tVQot7jc3sw+Sn0vMuKOw0X00Ckyg9VceKgzPyGmmz+zEoYue9tOLriWTvYy0ww==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.9.tgz", + "integrity": "sha512-IkvzjmsWQl9BuBiM4xKpl5X8WCR4w0AeJHRdobCdXZ8dT/lNc1XS6WqvY35N6+YzIIgzSBeY5prdFObID9F9tA==", "requires": { "nan": "^2.12.1", "node-pre-gyp": "^0.11.0", @@ -4779,37 +3992,10 @@ "tweetnacl": "~0.14.0" } }, - "staged-git-files": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", - "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "string-argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", - "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.0.tgz", + "integrity": "sha512-NGZHq3nkSXVtGZXTBjFru3MNfoZyIzN25T7BmvdgnSC0LCJczAGLLMQLyjywSIaAoqSemgLzBRHOsnrHbt60+Q==", "dev": true }, "string-width": { @@ -4874,7 +4060,14 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true }, "strip-json-comments": { "version": "2.0.1", @@ -4904,12 +4097,6 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, - "synchronous-promise": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.9.tgz", - "integrity": "sha512-LO95GIW16x69LuND1nuuwM4pjgFGupg7pZ/4lU86AmchPKrhk0o2tpMU2unXRrqo81iAFe1YJ0nAGEVwsrZAgg==", - "dev": true - }, "tar": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", @@ -4925,9 +4112,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" } } }, @@ -5031,54 +4218,15 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "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": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", - "dev": true - }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -5102,9 +4250,9 @@ "dev": true }, "ts-node": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz", - "integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", "requires": { "arg": "^4.1.0", "diff": "^4.0.1", @@ -5119,9 +4267,9 @@ "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" }, "yn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", - "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" } } }, @@ -5131,9 +4279,9 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.17.0.tgz", - "integrity": "sha512-pflx87WfVoYepTet3xLfDOLDm9Jqi61UXIKePOuca0qoAZyrGWonDG9VTbji58Fy+8gciUn8Bt7y69+KEVjc/w==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", + "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5151,25 +4299,6 @@ "tsutils": "^2.29.0" }, "dependencies": { - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -5213,9 +4342,9 @@ "dev": true }, "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true }, "typeorm": { @@ -5264,9 +4393,9 @@ } }, "typescript": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz", - "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==" + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==" }, "uglify-js": { "version": "3.6.0", @@ -5283,86 +4412,11 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -5384,24 +4438,12 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "urlgrey": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", "dev": true }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5436,6 +4478,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -5520,9 +4563,9 @@ "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==" }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", @@ -5582,21 +4625,20 @@ } }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^13.1.1" }, "dependencies": { "cliui": { @@ -5630,9 +4672,9 @@ } }, "yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -5709,20 +4751,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" - }, - "yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.11", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.6", - "toposort": "^2.0.2" - } } } } diff --git a/package.json b/package.json index 44d8952..7bb2f9c 100644 --- a/package.json +++ b/package.json @@ -22,49 +22,49 @@ "homepage": "https://github.com/Kononnable/typeorm-model-generator#readme", "dependencies": { "change-case": "^3.1.0", - "fs-extra": "^8.0.1", + "fs-extra": "^8.1.0", "handlebars": "^4.1.2", - "inquirer": "^6.3.1", + "inquirer": "^6.5.0", "mssql": "^5.1.0", "mysql": "^2.17.1", - "pg": "^7.11.0", + "pg": "^7.12.0", "reflect-metadata": "^0.1.13", - "sqlite3": "^4.0.8", - "ts-node": "^8.2.0", + "sqlite3": "^4.0.9", + "ts-node": "^8.3.0", "typeorm": "^0.2.18", - "typescript": "^3.5.1", - "yargs": "^13.2.4", + "typescript": "^3.5.3", + "yargs": "^13.3.0", "yn": "^2.0.0" }, "devDependencies": { "@types/chai": "^4.1.7", - "@types/chai-as-promised": "7.1.0", + "@types/chai-as-promised": "^7.1.1", "@types/chai-subset": "^1.3.2", - "@types/fs-extra": "^7.0.0", + "@types/fs-extra": "^8.0.0", "@types/handlebars": "^4.1.0", - "@types/inquirer": "^6.0.3", + "@types/inquirer": "^6.5.0", "@types/mocha": "^5.2.7", - "@types/mssql": "^4.0.14", + "@types/mssql": "^4.0.16", "@types/mysql": "^2.15.6", - "@types/node": "^12.0.4", - "@types/oracledb": "^3.1.1", + "@types/node": "^12.6.9", + "@types/oracledb": "^3.1.3", "@types/pg": "^7.4.14", - "@types/sinon": "^7.0.12", + "@types/sinon": "^7.0.13", "@types/yargs": "^12.0.1", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "chai-subset": "^1.6.0", "codecov": "^3.5.0", "dotenv": "^8.0.0", - "husky": "^2.3.0", - "lint-staged": "^8.1.7", - "mocha": "^6.1.4", + "husky": "^3.0.2", + "lint-staged": "^9.2.1", + "mocha": "^6.2.0", "nyc": "^14.1.1", - "prettier": "^1.17.1", + "prettier": "^1.18.2", "rimraf": "^2.6.3", "sinon": "^7.3.2", "sinon-chai": "^3.3.0", - "tslint": "^5.17.0", + "tslint": "^5.18.0", "tslint-config-prettier": "^1.18.0" }, "husky": { diff --git a/src/drivers/AbstractDriver.ts b/src/drivers/AbstractDriver.ts index 48be04b..8fd6431 100644 --- a/src/drivers/AbstractDriver.ts +++ b/src/drivers/AbstractDriver.ts @@ -209,9 +209,7 @@ export abstract class AbstractDriver { ); if (!ownerEntity) { TomgUtils.LogError( - `Relation between tables ${relationTmp.ownerTable} and ${ - relationTmp.referencedTable - } didn't found entity model ${relationTmp.ownerTable}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity model ${relationTmp.ownerTable}.` ); return; } @@ -221,9 +219,7 @@ export abstract class AbstractDriver { ); if (!referencedEntity) { TomgUtils.LogError( - `Relation between tables ${relationTmp.ownerTable} and ${ - relationTmp.referencedTable - } didn't found entity model ${relationTmp.referencedTable}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity model ${relationTmp.referencedTable}.` ); return; } @@ -239,13 +235,7 @@ export abstract class AbstractDriver { ); if (!ownerColumn) { TomgUtils.LogError( - `Relation between tables ${ - relationTmp.ownerTable - } and ${ - relationTmp.referencedTable - } didn't found entity column ${ - relationTmp.ownerTable - }.${ownerColumn}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity column ${relationTmp.ownerTable}.${ownerColumn}.` ); return; } @@ -256,13 +246,7 @@ export abstract class AbstractDriver { ); if (!relatedColumn) { TomgUtils.LogError( - `Relation between tables ${ - relationTmp.ownerTable - } and ${ - relationTmp.referencedTable - } didn't found entity column ${ - relationTmp.referencedTable - }.${relatedColumn}.` + `Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity column ${relationTmp.referencedTable}.${relatedColumn}.` ); return; } diff --git a/src/drivers/MssqlDriver.ts b/src/drivers/MssqlDriver.ts index 6fba3f8..75701c2 100644 --- a/src/drivers/MssqlDriver.ts +++ b/src/drivers/MssqlDriver.ts @@ -187,11 +187,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG break; default: TomgUtils.LogError( - `Unknown column type: ${ - resp.DATA_TYPE - } table name: ${ - resp.TABLE_NAME - } column name: ${resp.COLUMN_NAME}` + `Unknown column type: ${resp.DATA_TYPE} table name: ${resp.TABLE_NAME} column name: ${resp.COLUMN_NAME}` ); break; } diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index a0352f0..88e6156 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -202,11 +202,7 @@ export class MysqlDriver extends AbstractDriver { break; default: TomgUtils.LogError( - `Unknown column type: ${ - resp.DATA_TYPE - } table name: ${ - resp.TABLE_NAME - } column name: ${resp.COLUMN_NAME}` + `Unknown column type: ${resp.DATA_TYPE} table name: ${resp.TABLE_NAME} column name: ${resp.COLUMN_NAME}` ); break; } diff --git a/src/drivers/OracleDriver.ts b/src/drivers/OracleDriver.ts index 358888c..d91d633 100644 --- a/src/drivers/OracleDriver.ts +++ b/src/drivers/OracleDriver.ts @@ -305,9 +305,7 @@ export class OracleDriver extends AbstractDriver { let config: any; if (connectionOptons.user === String(process.env.ORACLE_UsernameSys)) { config /*Oracle.IConnectionAttributes*/ = { - connectString: `${connectionOptons.host}:${ - connectionOptons.port - }/${connectionOptons.databaseName}`, + connectString: `${connectionOptons.host}:${connectionOptons.port}/${connectionOptons.databaseName}`, externalAuth: connectionOptons.ssl, password: connectionOptons.password, privilege: this.Oracle.SYSDBA, @@ -315,9 +313,7 @@ export class OracleDriver extends AbstractDriver { }; } else { config /*Oracle.IConnectionAttributes*/ = { - connectString: `${connectionOptons.host}:${ - connectionOptons.port - }/${connectionOptons.databaseName}`, + connectString: `${connectionOptons.host}:${connectionOptons.port}/${connectionOptons.databaseName}`, externalAuth: connectionOptons.ssl, password: connectionOptons.password, user: connectionOptons.user diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index 6881b91..387f20a 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -88,19 +88,11 @@ export class PostgresDriver extends AbstractDriver { resp.data_type === "ARRAY" ) { TomgUtils.LogError( - `Unknown ${resp.data_type} column type: ${ - resp.udt_name - } table name: ${ - resp.table_name - } column name: ${resp.column_name}` + `Unknown ${resp.data_type} column type: ${resp.udt_name} table name: ${resp.table_name} column name: ${resp.column_name}` ); } else { TomgUtils.LogError( - `Unknown column type: ${ - resp.data_type - } table name: ${ - resp.table_name - } column name: ${resp.column_name}` + `Unknown column type: ${resp.data_type} table name: ${resp.table_name} column name: ${resp.column_name}` ); } return; diff --git a/src/drivers/SqliteDriver.ts b/src/drivers/SqliteDriver.ts index 8bead30..a86d5b9 100644 --- a/src/drivers/SqliteDriver.ts +++ b/src/drivers/SqliteDriver.ts @@ -155,11 +155,7 @@ export class SqliteDriver extends AbstractDriver { break; default: TomgUtils.LogError( - `Unknown column type: ${ - colInfo.options.type - } table name: ${ent.tsEntityName} column name: ${ - resp.name - }` + `Unknown column type: ${colInfo.options.type} table name: ${ent.tsEntityName} column name: ${resp.name}` ); break; } From e8c01bdba94a82f2b41544540b4956b149c17a72 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Thu, 8 Aug 2019 21:57:29 +0200 Subject: [PATCH 11/20] docs change --- README.md | 7 +++---- src/index.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index baafc71..0945288 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,9 @@ Options: [default: "mssql"] -o, --output Where to place generated models [default: "Z:\Repos\typeorm-model-generator\output"] - -s, --schema Schema name to create model from. Only for mssql and - postgres. Specify multiple schemas at once by providing - a comma separated list. - eg: -s scheme1, scheme2, scheme3 + -s, --schema Schema name to create model from. Only for mssql + and postgres. You can pass multiple values + separted by comma eg. -s scheme1,scheme2,scheme3 --ssl [boolean] [default: false] --noConfig Doesn't create tsconfig.json and ormconfig.json [boolean] [default: false] diff --git a/src/index.ts b/src/index.ts index a87cb02..af4bee5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -102,7 +102,7 @@ function GetUtilParametersByArgs() { .option("s", { alias: "schema", describe: - "Schema name to create model from. Only for mssql and postgres. You can pass multiple values separted by comma." + "Schema name to create model from. Only for mssql and postgres. You can pass multiple values separted by comma eg. -s scheme1,scheme2,scheme3" }) .option("ssl", { boolean: true, From 139aac0facac0e37ec0d6173fc8e79bf4c82a727 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Fri, 9 Aug 2019 18:13:13 +0200 Subject: [PATCH 12/20] support for postgres enum types #187 --- src/drivers/PostgresDriver.ts | 46 ++++++++++++++----- .../entityTypes/postgres/entity/Post.ts | 4 +- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index 387f20a..4e4afee 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -48,6 +48,7 @@ export class PostgresDriver extends AbstractDriver { numeric_scale: number; isidentity: string; isunique: string; + enumvalues: string | null; }> = (await this.Connection .query(`SELECT table_name,column_name,udt_name,column_default,is_nullable, data_type,character_maximum_length,numeric_precision,numeric_scale, @@ -60,7 +61,14 @@ export class PostgresDriver extends AbstractDriver { tc.CONSTRAINT_TYPE = 'UNIQUE' and tc.TABLE_NAME = c.TABLE_NAME and cu.COLUMN_NAME = c.COLUMN_NAME - and tc.TABLE_SCHEMA=c.TABLE_SCHEMA) IsUnique + and tc.TABLE_SCHEMA=c.TABLE_SCHEMA) IsUnique, + (SELECT +string_agg(enumlabel, ',') +FROM "pg_enum" "e" +INNER JOIN "pg_type" "t" ON "t"."oid" = "e"."enumtypid" +INNER JOIN "pg_namespace" "n" ON "n"."oid" = "t"."typnamespace" +WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name + ) enumValues FROM INFORMATION_SCHEMA.COLUMNS c where table_schema in (${schema}) order by ordinal_position`)).rows; @@ -80,7 +88,8 @@ export class PostgresDriver extends AbstractDriver { const columnTypes = this.MatchColumnTypes( resp.data_type, - resp.udt_name + resp.udt_name, + resp.enumvalues ); if (!columnTypes.sql_type || !columnTypes.ts_type) { if ( @@ -100,6 +109,7 @@ export class PostgresDriver extends AbstractDriver { colInfo.options.type = columnTypes.sql_type as any; colInfo.tsType = columnTypes.ts_type; colInfo.options.array = columnTypes.is_array; + colInfo.options.enum = columnTypes.enumValues; if (colInfo.options.array) { colInfo.tsType = colInfo.tsType .split("|") @@ -143,7 +153,11 @@ export class PostgresDriver extends AbstractDriver { return entities; } - public MatchColumnTypes(dataType: string, udtName: string) { + public MatchColumnTypes( + dataType: string, + udtName: string, + enumValues: string | null + ) { const ret: { ts_type: | "number" @@ -158,7 +172,8 @@ export class PostgresDriver extends AbstractDriver { | null; sql_type: string | null; is_array: boolean; - } = { ts_type: null, sql_type: null, is_array: false }; + enumValues: string[]; + } = { ts_type: null, sql_type: null, is_array: false, enumValues: [] }; ret.sql_type = dataType; switch (dataType) { case "int2": @@ -276,9 +291,6 @@ export class PostgresDriver extends AbstractDriver { case "boolean": ret.ts_type = "boolean"; break; - case "enum": - ret.ts_type = "string"; - break; case "point": ret.ts_type = "string | object"; break; @@ -346,22 +358,34 @@ export class PostgresDriver extends AbstractDriver { ret.ts_type = "string"; break; case "ARRAY": - const z = this.MatchColumnTypes(udtName.substring(1), udtName); + const z = this.MatchColumnTypes( + udtName.substring(1), + udtName, + enumValues + ); ret.ts_type = z.ts_type; ret.sql_type = z.sql_type; ret.is_array = true; + ret.enumValues = z.enumValues; break; case "USER-DEFINED": - ret.sql_type = udtName; ret.ts_type = "string"; switch (udtName) { case "citext": case "hstore": case "geometry": + ret.sql_type = udtName; break; default: - ret.ts_type = null; - ret.sql_type = null; + if (enumValues) { + ret.sql_type = "enum"; + ret.enumValues = (('"' + + enumValues.split(",").join('","') + + '"') as never) as string[]; + } else { + ret.ts_type = null; + ret.sql_type = null; + } break; } break; diff --git a/test/integration/entityTypes/postgres/entity/Post.ts b/test/integration/entityTypes/postgres/entity/Post.ts index 3bf7985..0dc2de8 100644 --- a/test/integration/entityTypes/postgres/entity/Post.ts +++ b/test/integration/entityTypes/postgres/entity/Post.ts @@ -119,8 +119,8 @@ export class Post { @Column("boolean") boolean: boolean; - // @Column("enum") - // enum: string; + @Column("enum", { enum: ["A", "B", "C"] }) + enum: string; @Column("point") point: string | object; From b81b54f57f26919e2f5e53a0fa37b5e70eb7b1c2 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Fri, 9 Aug 2019 19:40:01 +0200 Subject: [PATCH 13/20] set precision when scale isn't default numeric types fixes #184 --- src/Engine.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Engine.ts b/src/Engine.ts index bf4efe6..6416068 100644 --- a/src/Engine.ts +++ b/src/Engine.ts @@ -106,15 +106,12 @@ function removeColumnDefaultProperties( if ( column.options.precision && defVal.precision && - column.options.precision === defVal.precision - ) { - column.options.precision = undefined; - } - if ( + column.options.precision === defVal.precision && column.options.scale && defVal.scale && column.options.scale === defVal.scale ) { + column.options.precision = undefined; column.options.scale = undefined; } if ( From ecd90e8ac8899b915b8dcb5677057c0108d08bb4 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Fri, 9 Aug 2019 22:34:56 +0200 Subject: [PATCH 14/20] query timeout option #185 #188 --- src/IConnectionOptions.ts | 1 + src/drivers/MssqlDriver.ts | 1 + src/drivers/MysqlDriver.ts | 2 ++ src/drivers/PostgresDriver.ts | 1 + src/index.ts | 39 +++++++++++++++++++++++++++++++---- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/IConnectionOptions.ts b/src/IConnectionOptions.ts index 65dee14..6da7f91 100644 --- a/src/IConnectionOptions.ts +++ b/src/IConnectionOptions.ts @@ -7,4 +7,5 @@ export class IConnectionOptions { public databaseType: string = ""; public schemaName: string = ""; public ssl: boolean = false; + public timeout?: number; } diff --git a/src/drivers/MssqlDriver.ts b/src/drivers/MssqlDriver.ts index 75701c2..4331b08 100644 --- a/src/drivers/MssqlDriver.ts +++ b/src/drivers/MssqlDriver.ts @@ -405,6 +405,7 @@ order by }, password: connectionOptons.password, port: connectionOptons.port, + requestTimeout: connectionOptons.timeout, server: connectionOptons.host, user: connectionOptons.user }; diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index 88e6156..f618e34 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -377,6 +377,7 @@ export class MysqlDriver extends AbstractDriver { ssl: { rejectUnauthorized: false }, + timeout: connectionOptons.timeout, user: connectionOptons.user }; } else { @@ -385,6 +386,7 @@ export class MysqlDriver extends AbstractDriver { host: connectionOptons.host, password: connectionOptons.password, port: connectionOptons.port, + timeout: connectionOptons.timeout, user: connectionOptons.user }; } diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index 4e4afee..04ac1d0 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -569,6 +569,7 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name password: connectionOptons.password, port: connectionOptons.port, ssl: connectionOptons.ssl, + statement_timeout: connectionOptons.timeout, user: connectionOptons.user }); diff --git a/src/index.ts b/src/index.ts index af4bee5..1361a20 100644 --- a/src/index.ts +++ b/src/index.ts @@ -161,6 +161,10 @@ function GetUtilParametersByArgs() { boolean: true, default: false, describe: "Generate constructor allowing partial initialization" + }) + .option("timeout", { + describe: "SQL Query timeout(ms)", + number: true }).argv; const driver = createDriver(argv.e); @@ -184,6 +188,7 @@ function GetUtilParametersByArgs() { ? argv.s.toString() : standardSchema), (connectionOptions.ssl = argv.ssl), + (connectionOptions.timeout = argv.timeout), (connectionOptions.user = argv.u ? argv.u.toString() : standardUser); const generationOptions: IGenerationOptions = new IGenerationOptions(); (generationOptions.activeRecord = argv.a), @@ -306,15 +311,41 @@ async function GetUtilParametersByInquirer() { type: "input" } ])) as any).output; - const customize = ((await inquirer.prompt([ + + if ( + connectionOptions.databaseType === "mssql" || + connectionOptions.databaseType === "postgres" + ) { + const changeRequestTimeout = ((await inquirer.prompt([ + { + default: false, + message: "Do you want to change default sql query timeout?", + name: "changeRequestTimeout", + type: "confirm" + } + ])) as any).changeRequestTimeout; + if (changeRequestTimeout) { + const timeout: any = ((await inquirer.prompt({ + message: "Query timeout(ms):", + name: "timeout", + type: "input", + validate(value) { + const valid = !isNaN(parseInt(value, 10)); + return valid || "Please enter a valid number"; + } + })) as any).timeout; + connectionOptions.timeout = timeout; + } + } + const customizeGeneration = ((await inquirer.prompt([ { default: false, message: "Do you want to customize generated model?", - name: "customize", + name: "customizeGeneration", type: "confirm" } - ])) as any).customize; - if (customize) { + ])) as any).customizeGeneration; + if (customizeGeneration) { const customizations: string[] = ((await inquirer.prompt([ { choices: [ From 7ce6f139ee5c888fdabceb12a8612354a581841f Mon Sep 17 00:00:00 2001 From: Kononnable Date: Fri, 9 Aug 2019 22:55:03 +0200 Subject: [PATCH 15/20] codecov config change --- codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codecov.yml b/codecov.yml index 82d70e5..76e6b95 100644 --- a/codecov.yml +++ b/codecov.yml @@ -8,3 +8,4 @@ coverage: default: threshold: 50 target: 50 + patch: off From 6ab81afe285f94a3f9796729dde32c8f6ae013e0 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Fri, 9 Aug 2019 23:12:28 +0200 Subject: [PATCH 16/20] change node versions tested on CI --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cb0dfc3..3a9816f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: -- 11 +- 12 - 10 - 8 cache: npm From acfb717d896504cc11c65325e4871e9b78270fd3 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Fri, 9 Aug 2019 23:19:43 +0200 Subject: [PATCH 17/20] add full code compilation as part of test process --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7bb2f9c..32bdfea 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "Generates models for TypeORM from existing databases.", "bin": "bin/typeorm-model-generator", "scripts": { - "setup": "npm install", "start": "ts-node ./src/index.ts", + "pretest": "tsc --noEmit", "test": "nyc --reporter=lcov ts-node ./node_modules/mocha/bin/_mocha test/**/*.test.ts -- -R spec --bail", "clean": "rimraf coverage output", "prettier": "prettier --write ./src/*.ts ./src/**/*.ts" From 0d0ceeb1da95d5a578fc8e89e717d5789c951a91 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Sun, 11 Aug 2019 20:59:41 +0200 Subject: [PATCH 18/20] switch to eslint-typescript from deprecated tslint (part 1) --- .editorconfig | 11 +- .eslintrc.js | 43 ++ .gitignore | 3 - .npmignore | 2 +- package-lock.json | 842 ++++++++++++++++++++-- package.json | 13 +- src/AbstractNamingStrategy.ts | 6 +- src/Engine.ts | 86 ++- src/IConnectionOptions.ts | 10 +- src/IGenerationOptions.ts | 12 +- src/NamingStrategy.ts | 20 +- src/Utils.ts | 8 +- src/drivers/AbstractDriver.ts | 92 ++- src/drivers/MariaDbDriver.ts | 4 +- src/drivers/MssqlDriver.ts | 142 ++-- src/drivers/MysqlDriver.ts | 78 +- src/drivers/OracleDriver.ts | 108 +-- src/drivers/PostgresDriver.ts | 245 ++++--- src/drivers/SqliteDriver.ts | 541 +++++++------- src/index.ts | 134 ++-- src/models/ColumnInfo.ts | 7 +- src/models/EntityInfo.ts | 15 +- src/models/IndexColumnInfo.ts | 2 +- src/models/IndexInfo.ts | 4 +- src/models/RelationInfo.ts | 21 +- src/models/RelationTempInfo.ts | 4 +- src/tslint.json | 11 - test/drivers/MssqlDriver.test.ts | 141 ++-- test/integration/runTestsFromPath.test.ts | 290 +++++--- test/utils/GeneralTestUtils.ts | 257 ++++--- 30 files changed, 2134 insertions(+), 1018 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 src/tslint.json diff --git a/.editorconfig b/.editorconfig index 08891d8..3626f17 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,8 +1,15 @@ root = true -[*] +[*.ts] indent_style = space indent_size = 4 end_of_line = lf insert_final_newline = true -trim_trailing_whitespace = true \ No newline at end of file +trim_trailing_whitespace = true + +[*.{json,yml}] +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..4d6e44e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,43 @@ +module.exports = { + env: { + node: true + }, + extends: [ + "airbnb-base", + "plugin:@typescript-eslint/recommended", + "prettier", + "prettier/@typescript-eslint" + ], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json" + }, + plugins: ["@typescript-eslint"], + rules: { + "@typescript-eslint/explicit-function-return-type": ["off"], + "@typescript-eslint/no-use-before-define": ["error", "nofunc"], + "@typescript-eslint/prefer-interface": ["off"], + "import/no-extraneous-dependencies": [ + "error", + { devDependencies: ["**/*.test.ts"] } + ], + "@typescript-eslint/no-floating-promises": ["error"], + "no-use-before-define": ["error", "nofunc"], + "no-console": ["off"], + "no-plusplus": ["error", { allowForLoopAfterthoughts: true }], + + "@typescript-eslint/no-non-null-assertion": ["off"], + "@typescript-eslint/no-object-literal-type-assertion": ["off"], + + "no-param-reassign": ["off"], + "@typescript-eslint/no-explicit-any": ["off"], + "no-loop-func": ["off"] + }, + settings: { + "import/resolver": { + node: { + extensions: [".js", ".jsx", ".ts", ".tsx"] + } + } + } +}; diff --git a/.gitignore b/.gitignore index 5daaa3c..e3496ca 100644 --- a/.gitignore +++ b/.gitignore @@ -4,13 +4,10 @@ ormconfig.json .vscode .idea typings/ -**/*.js -**/*.js.map output/**/*.* .nyc_output/ coverage/ .env dist *.tgz -!gulpfile.js .tomg-config diff --git a/.npmignore b/.npmignore index 01817ea..1a265b7 100644 --- a/.npmignore +++ b/.npmignore @@ -23,4 +23,4 @@ codecov.yml tsconfig.json typings.json dist/test/ -src/tslint.json +.eslintrc.js diff --git a/package-lock.json b/package-lock.json index 5c5c43c..f9fa7c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -225,6 +225,12 @@ "@types/chai": "*" } }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -270,6 +276,12 @@ "rxjs": "^6.4.0" } }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -346,6 +358,15 @@ "integrity": "sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung==", "dev": true }, + "@types/sqlite3": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.5.tgz", + "integrity": "sha512-upsrd1zEYMa4Y+prurQ+vpo5SN63BUF6tOjeTv3ziF+9W9PHVh4/S5cy0qAqkHvmOEm/AZhEKd7V/0bR2udmFw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/through": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz", @@ -361,11 +382,77 @@ "integrity": "sha512-UVjo2oH79aRNcsDlFlnQ/iJ67Jd7j6uSg7jUJP/RZ/nUjAh5ElmnwlD5K/6eGgETJUgCHkiWn91B8JjXQ6ubAw==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", + "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "1.13.0", + "eslint-utils": "^1.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.7.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", + "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "acorn": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, "adal-node": { "version": "0.1.28", "resolved": "https://registry.npmjs.org/adal-node/-/adal-node-0.1.28.tgz", @@ -503,6 +590,16 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -528,6 +625,12 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "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 + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -633,12 +736,6 @@ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "caching-transform": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", @@ -988,6 +1085,12 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "confusing-browser-globals": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz", + "integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==", + "dev": true + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -1002,6 +1105,12 @@ "upper-case": "^1.1.1" } }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -1122,6 +1231,12 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "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 + }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -1196,6 +1311,15 @@ } } }, + "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" + } + }, "dot-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", @@ -1307,11 +1431,451 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.1.0.tgz", + "integrity": "sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^6.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-config-prettier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz", + "integrity": "sha512-vDrcCFE3+2ixNT5H83g28bO/uYAwibJxerXPj+E7op4qzBCsAV36QfvdAyVOoNxKAH2Os/e01T/2x++V0LPukA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.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" + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.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" + } + }, + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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 + }, + "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" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.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" + } + }, + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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 + }, + "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-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" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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" + } + }, + "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" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", + "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.0.0.tgz", + "integrity": "sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -1377,6 +1941,12 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "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.6.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", @@ -1399,6 +1969,15 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1455,6 +2034,23 @@ } } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -1528,6 +2124,12 @@ "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 + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -2215,6 +2817,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "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 + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -2273,6 +2881,16 @@ "invert-kv": "^2.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -2532,6 +3150,12 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -2906,6 +3530,12 @@ "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=" }, + "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 + }, "needle": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", @@ -3142,6 +3772,18 @@ "object-keys": "^1.0.11" } }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -3152,6 +3794,18 @@ "es-abstract": "^1.5.1" } }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3183,6 +3837,28 @@ "wordwrap": "~0.0.2" } }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -3283,6 +3959,23 @@ "no-case": "^2.2.0" } }, + "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" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parent-require": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", @@ -3523,12 +4216,24 @@ "xtend": "^4.0.0" } }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "prettier": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", "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 + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -3653,6 +4358,12 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -4097,6 +4808,54 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, + "table": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.5.tgz", + "integrity": "sha512-oGa2Hl7CQjfoaogtrOHEJroOcYILTx7BZWLGsJIlzoWmB2zmguhNfPJZsWPKYek/MgCxfco54gEi31d1uN2hFA==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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" + } + }, + "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" + } + } + } + }, "tar": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", @@ -4174,6 +4933,12 @@ "require-main-filename": "^2.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 + }, "thenify": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", @@ -4278,45 +5043,10 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, - "tslint": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", - "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "dev": true - }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -4335,6 +5065,15 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -4454,6 +5193,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "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", @@ -4527,6 +5272,15 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", diff --git a/package.json b/package.json index 32bdfea..63a5217 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "start": "ts-node ./src/index.ts", "pretest": "tsc --noEmit", "test": "nyc --reporter=lcov ts-node ./node_modules/mocha/bin/_mocha test/**/*.test.ts -- -R spec --bail", + "posttest": "eslint ./src/*.ts ./src/**/*.ts", "clean": "rimraf coverage output", "prettier": "prettier --write ./src/*.ts ./src/**/*.ts" }, @@ -50,12 +51,20 @@ "@types/oracledb": "^3.1.3", "@types/pg": "^7.4.14", "@types/sinon": "^7.0.13", + "@types/sqlite3": "^3.1.5", "@types/yargs": "^12.0.1", + "@typescript-eslint/eslint-plugin": "^1.13.0", + "@typescript-eslint/parser": "^1.13.0", + "@typescript-eslint/typescript-estree": "^1.13.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "chai-subset": "^1.6.0", "codecov": "^3.5.0", "dotenv": "^8.0.0", + "eslint": "^6.1.0", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-config-prettier": "^6.0.0", + "eslint-plugin-import": "^2.18.2", "husky": "^3.0.2", "lint-staged": "^9.2.1", "mocha": "^6.2.0", @@ -63,9 +72,7 @@ "prettier": "^1.18.2", "rimraf": "^2.6.3", "sinon": "^7.3.2", - "sinon-chai": "^3.3.0", - "tslint": "^5.18.0", - "tslint-config-prettier": "^1.18.0" + "sinon-chai": "^3.3.0" }, "husky": { "hooks": { diff --git a/src/AbstractNamingStrategy.ts b/src/AbstractNamingStrategy.ts index ee3b9ee..b2b9783 100644 --- a/src/AbstractNamingStrategy.ts +++ b/src/AbstractNamingStrategy.ts @@ -1,7 +1,7 @@ -import { EntityInfo } from "./models/EntityInfo"; -import { RelationInfo } from "./models/RelationInfo"; +import RelationInfo from "./models/RelationInfo"; +import EntityInfo from "./models/EntityInfo"; -export abstract class AbstractNamingStrategy { +export default abstract class AbstractNamingStrategy { public abstract relationName( columnName: string, relation: RelationInfo, diff --git a/src/Engine.ts b/src/Engine.ts index 6416068..2111e00 100644 --- a/src/Engine.ts +++ b/src/Engine.ts @@ -1,20 +1,21 @@ +import * as Handlebars from "handlebars"; +import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; +import * as TomgUtils from "./Utils"; +import AbstractDriver from "./drivers/AbstractDriver"; +import MssqlDriver from "./drivers/MssqlDriver"; +import MariaDbDriver from "./drivers/MariaDbDriver"; +import IConnectionOptions from "./IConnectionOptions"; +import IGenerationOptions from "./IGenerationOptions"; +import EntityInfo from "./models/EntityInfo"; +import PostgresDriver from "./drivers/PostgresDriver"; +import MysqlDriver from "./drivers/MysqlDriver"; +import OracleDriver from "./drivers/OracleDriver"; +import SqliteDriver from "./drivers/SqliteDriver"; +import NamingStrategy from "./NamingStrategy"; + import changeCase = require("change-case"); import fs = require("fs"); -import * as Handlebars from "handlebars"; import path = require("path"); -import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import { AbstractDriver } from "./drivers/AbstractDriver"; -import { MariaDbDriver } from "./drivers/MariaDbDriver"; -import { MssqlDriver } from "./drivers/MssqlDriver"; -import { MysqlDriver } from "./drivers/MysqlDriver"; -import { OracleDriver } from "./drivers/OracleDriver"; -import { PostgresDriver } from "./drivers/PostgresDriver"; -import { SqliteDriver } from "./drivers/SqliteDriver"; -import { IConnectionOptions } from "./IConnectionOptions"; -import { IGenerationOptions } from "./IGenerationOptions"; -import { EntityInfo } from "./models/EntityInfo"; -import { NamingStrategy } from "./NamingStrategy"; -import * as TomgUtils from "./Utils"; export function createDriver(driverName: string): AbstractDriver { switch (driverName) { @@ -60,7 +61,7 @@ export async function dataCollectionPhase( driver: AbstractDriver, connectionOptions: IConnectionOptions ) { - return await driver.GetDataFromServer(connectionOptions); + return driver.GetDataFromServer(connectionOptions); } export function modelCustomizationPhase( @@ -73,17 +74,17 @@ export function modelCustomizationPhase( generationOptions.customNamingStrategyPath && generationOptions.customNamingStrategyPath !== "" ) { - // tslint:disable-next-line:no-var-requires + // eslint-disable-next-line global-require, import/no-dynamic-require, @typescript-eslint/no-var-requires const req = require(generationOptions.customNamingStrategyPath); namingStrategy = new req.NamingStrategy(); } else { namingStrategy = new NamingStrategy(); } - dbModel = setRelationId(generationOptions, dbModel); - dbModel = applyNamingStrategy(namingStrategy, dbModel); - dbModel = addImportsAndGenerationOptions(dbModel, generationOptions); - dbModel = removeColumnDefaultProperties(dbModel, defaultValues); - return dbModel; + let retVal = setRelationId(generationOptions, dbModel); + retVal = applyNamingStrategy(namingStrategy, retVal); + retVal = addImportsAndGenerationOptions(retVal, generationOptions); + retVal = removeColumnDefaultProperties(retVal, defaultValues); + return retVal; } function removeColumnDefaultProperties( dbModel: EntityInfo[], @@ -155,7 +156,7 @@ function setRelationId( if (generationOptions.relationIds) { model.forEach(ent => { ent.Columns.forEach(col => { - col.relations.map(rel => { + col.relations.forEach(rel => { rel.relationIdField = rel.isOwner; }); }); @@ -202,8 +203,10 @@ export function modelGenerationPhase( case "none": casedFileName = element.tsEntityName; break; + default: + throw new Error("Unknown case style"); } - const resultFilePath = path.resolve(entitesPath, casedFileName + ".ts"); + const resultFilePath = path.resolve(entitesPath, `${casedFileName}.ts`); const rendered = compliedTemplate(element); fs.writeFileSync(resultFilePath, rendered, { encoding: "UTF-8", @@ -226,6 +229,8 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions) { case "none": retStr = str; break; + default: + throw new Error("Unknown case style"); } return retStr; }); @@ -247,12 +252,14 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions) { case "none": retStr = str; break; + default: + throw new Error("Unknown case style"); } return retStr; }); Handlebars.registerHelper("printPropertyVisibility", () => generationOptions.propertyVisibility !== "none" - ? generationOptions.propertyVisibility + " " + ? `${generationOptions.propertyVisibility} ` : "" ); Handlebars.registerHelper("toPropertyName", str => { @@ -267,6 +274,8 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions) { case "none": retStr = str; break; + default: + throw new Error("Unknown case style"); } return retStr; }); @@ -277,9 +286,8 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions) { Handlebars.registerHelper("toLazy", str => { if (generationOptions.lazy) { return `Promise<${str}>`; - } else { - return str; } + return str; }); Handlebars.registerHelper({ and: (v1, v2) => v1 && v2, @@ -360,10 +368,10 @@ function applyNamingStrategy( namingStrategy: NamingStrategy, dbModel: EntityInfo[] ) { - dbModel = changeRelationNames(dbModel); - dbModel = changeEntityNames(dbModel); - dbModel = changeColumnNames(dbModel); - return dbModel; + let retval = changeRelationNames(dbModel); + retval = changeEntityNames(retval); + retval = changeColumnNames(retval); + return retval; function changeRelationNames(model: EntityInfo[]) { model.forEach(entity => { @@ -398,9 +406,9 @@ function applyNamingStrategy( col => col.name === column.tsName ) - .forEach( - col => (col.name = newName) - ); + .forEach(col => { + col.name = newName; + }); }); } }); @@ -420,7 +428,9 @@ function applyNamingStrategy( entity.Indexes.forEach(index => { index.columns .filter(column2 => column2.name === column.tsName) - .forEach(column2 => (column2.name = newName)); + .forEach(column2 => { + column2.name = newName; + }); }); model.forEach(entity2 => { entity2.Columns.forEach(column2 => { @@ -431,7 +441,9 @@ function applyNamingStrategy( entity.tsEntityName && relation.relatedColumn === column.tsName ) - .map(v => (v.relatedColumn = newName)); + .forEach(v => { + v.relatedColumn = newName; + }); column2.relations .filter( relation => @@ -439,7 +451,9 @@ function applyNamingStrategy( entity.tsEntityName && relation.ownerColumn === column.tsName ) - .map(v => (v.ownerColumn = newName)); + .forEach(v => { + v.ownerColumn = newName; + }); }); }); diff --git a/src/IConnectionOptions.ts b/src/IConnectionOptions.ts index 6da7f91..3cab302 100644 --- a/src/IConnectionOptions.ts +++ b/src/IConnectionOptions.ts @@ -1,11 +1,19 @@ -export class IConnectionOptions { +export default class IConnectionOptions { public host: string = ""; + public port: number = 0; + public databaseName: string = ""; + public user: string = ""; + public password: string = ""; + public databaseType: string = ""; + public schemaName: string = ""; + public ssl: boolean = false; + public timeout?: number; } diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 11a0016..9a825f4 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -1,14 +1,24 @@ -export class IGenerationOptions { +export default class IGenerationOptions { public resultsPath: string = ""; + public noConfigs: boolean = false; + public convertCaseFile: "pascal" | "param" | "camel" | "none" = "none"; + public convertCaseEntity: "pascal" | "camel" | "none" = "none"; + public convertCaseProperty: "pascal" | "camel" | "none" = "none"; + public propertyVisibility: "public" | "protected" | "private" | "none" = "none"; + public lazy: boolean = false; + public activeRecord: boolean = false; + public generateConstructor: boolean = false; + public customNamingStrategyPath: string = ""; + public relationIds: boolean = false; } diff --git a/src/NamingStrategy.ts b/src/NamingStrategy.ts index 4e814d6..bcdde51 100644 --- a/src/NamingStrategy.ts +++ b/src/NamingStrategy.ts @@ -1,9 +1,11 @@ -import changeCase = require("change-case"); -import { AbstractNamingStrategy } from "./AbstractNamingStrategy"; -import { EntityInfo } from "./models/EntityInfo"; -import { RelationInfo } from "./models/RelationInfo"; +import AbstractNamingStrategy from "./AbstractNamingStrategy"; +import RelationInfo from "./models/RelationInfo"; +import EntityInfo from "./models/EntityInfo"; -export class NamingStrategy extends AbstractNamingStrategy { +import changeCase = require("change-case"); + +/* eslint-disable class-methods-use-this */ +export default class NamingStrategy extends AbstractNamingStrategy { public relationName( columnOldName: string, relation: RelationInfo, @@ -24,10 +26,10 @@ export class NamingStrategy extends AbstractNamingStrategy { columnName.toLowerCase().lastIndexOf("id") ); } - if (!isNaN(parseInt(columnName[columnName.length - 1], 10))) { + if (!Number.isNaN(parseInt(columnName[columnName.length - 1], 10))) { columnName = columnName.substring(0, columnName.length - 1); } - if (!isNaN(parseInt(columnName[columnName.length - 1], 10))) { + if (!Number.isNaN(parseInt(columnName[columnName.length - 1], 10))) { columnName = columnName.substring(0, columnName.length - 1); } columnName += isRelationToMany ? "s" : ""; @@ -37,7 +39,7 @@ export class NamingStrategy extends AbstractNamingStrategy { columnOldName !== columnName ) { if (ownerEntity.Columns.some(v => v.tsName === columnName)) { - columnName = columnName + "_"; + columnName += "_"; for (let i = 2; i <= ownerEntity.Columns.length; i++) { columnName = columnName.substring( @@ -68,3 +70,5 @@ export class NamingStrategy extends AbstractNamingStrategy { return columnName; } } + +/* eslint-enable class-methods-use-this */ diff --git a/src/Utils.ts b/src/Utils.ts index e60fc2c..aebf54d 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -1,9 +1,11 @@ import * as packagejson from "../package.json"; + export function LogError( errText: string, isABug: boolean = true, - errObject?: any + passedError?: any ) { + let errObject = passedError; console.error(errText); console.error(`Error occured in typeorm-model-generator.`); console.error(`${packageVersion()} node@${process.version}`); @@ -12,10 +14,10 @@ export function LogError( (packagejson as any).bugs.url }` ); - if (isABug && !errObject) { + if (isABug && !passedError) { errObject = new Error().stack; } - if (!!errObject) { + if (errObject) { console.error(errObject); } } diff --git a/src/drivers/AbstractDriver.ts b/src/drivers/AbstractDriver.ts index 8fd6431..9bb27cf 100644 --- a/src/drivers/AbstractDriver.ts +++ b/src/drivers/AbstractDriver.ts @@ -4,18 +4,21 @@ import { WithWidthColumnType } from "typeorm/driver/types/ColumnTypes"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import { IConnectionOptions } from "../IConnectionOptions"; -import { ColumnInfo } from "../models/ColumnInfo"; -import { EntityInfo } from "../models/EntityInfo"; -import { IndexInfo } from "../models/IndexInfo"; -import { RelationInfo } from "../models/RelationInfo"; -import { IRelationTempInfo } from "../models/RelationTempInfo"; import * as TomgUtils from "../Utils"; +import EntityInfo from "../models/EntityInfo"; +import RelationInfo from "../models/RelationInfo"; +import ColumnInfo from "../models/ColumnInfo"; +import IConnectionOptions from "../IConnectionOptions"; +import IndexInfo from "../models/IndexInfo"; +import RelationTempInfo from "../models/RelationTempInfo"; -export abstract class AbstractDriver { +export default abstract class AbstractDriver { public abstract standardPort: number; + public abstract standardSchema: string; + public abstract standardUser: string; + public abstract defaultValues: DataTypeDefaults; public ColumnTypesWithWidth: WithWidthColumnType[] = [ @@ -25,6 +28,7 @@ export abstract class AbstractDriver { "int", "bigint" ]; + public ColumnTypesWithPrecision: WithPrecisionColumnType[] = [ "float", "double", @@ -45,6 +49,7 @@ export abstract class AbstractDriver { "timestamp with time zone", "timestamp with local time zone" ]; + public ColumnTypesWithLength: WithLengthColumnType[] = [ "character varying", "varying character", @@ -65,15 +70,16 @@ export abstract class AbstractDriver { schema: string, dbNames: string ) => Promise< - Array<{ + { TABLE_SCHEMA: string; TABLE_NAME: string; DB_NAME: string; - }> + }[] >; - public FindManyToManyRelations(dbModel: EntityInfo[]) { - const manyToManyEntities = dbModel.filter( + public static FindManyToManyRelations(dbModel: EntityInfo[]) { + let retval = dbModel; + const manyToManyEntities = retval.filter( entity => entity.Columns.filter(column => { return ( @@ -83,7 +89,7 @@ export abstract class AbstractDriver { ); }).length === entity.Columns.length ); - manyToManyEntities.map(entity => { + manyToManyEntities.forEach(entity => { let relations: RelationInfo[] = []; relations = entity.Columns.reduce( (prev: RelationInfo[], curr) => prev.concat(curr.relations), @@ -92,9 +98,14 @@ export abstract class AbstractDriver { const namesOfRelatedTables = relations .map(v => v.relatedTable) .filter((v, i, s) => s.indexOf(v) === i); + const [ + firstRelatedTable, + secondRelatedTable + ] = namesOfRelatedTables; + if (namesOfRelatedTables.length === 2) { - const relatedTable1 = dbModel.find( - v => v.tsEntityName === namesOfRelatedTables[0] + const relatedTable1 = retval.find( + v => v.tsEntityName === firstRelatedTable )!; relatedTable1.Columns = relatedTable1.Columns.filter( v => @@ -102,7 +113,7 @@ export abstract class AbstractDriver { .toLowerCase() .startsWith(entity.tsEntityName.toLowerCase()) ); - const relatedTable2 = dbModel.find( + const relatedTable2 = retval.find( v => v.tsEntityName === namesOfRelatedTables[1] )!; relatedTable2.Columns = relatedTable2.Columns.filter( @@ -111,31 +122,31 @@ export abstract class AbstractDriver { .toLowerCase() .startsWith(entity.tsEntityName.toLowerCase()) ); - dbModel = dbModel.filter(ent => { + retval = retval.filter(ent => { return ent.tsEntityName !== entity.tsEntityName; }); const column1 = new ColumnInfo(); - column1.tsName = namesOfRelatedTables[1]; + column1.tsName = secondRelatedTable; column1.options.name = entity.sqlEntityName; const col1Rel = new RelationInfo(); - col1Rel.relatedTable = namesOfRelatedTables[1]; - col1Rel.relatedColumn = namesOfRelatedTables[1]; + col1Rel.relatedTable = secondRelatedTable; + col1Rel.relatedColumn = secondRelatedTable; col1Rel.relationType = "ManyToMany"; col1Rel.isOwner = true; - col1Rel.ownerColumn = namesOfRelatedTables[0]; + col1Rel.ownerColumn = firstRelatedTable; column1.relations.push(col1Rel); relatedTable1.Columns.push(column1); const column2 = new ColumnInfo(); - column2.tsName = namesOfRelatedTables[0]; + column2.tsName = firstRelatedTable; const col2Rel = new RelationInfo(); - col2Rel.relatedTable = namesOfRelatedTables[0]; - col2Rel.relatedColumn = namesOfRelatedTables[1]; + col2Rel.relatedTable = firstRelatedTable; + col2Rel.relatedColumn = secondRelatedTable; col2Rel.relationType = "ManyToMany"; col2Rel.isOwner = false; @@ -143,14 +154,15 @@ export abstract class AbstractDriver { relatedTable2.Columns.push(column2); } }); - return dbModel; + return retval; } + public async GetDataFromServer( connectionOptons: IConnectionOptions ): Promise { let dbModel = [] as EntityInfo[]; await this.ConnectToServer(connectionOptons); - const sqlEscapedSchema = this.escapeCommaSeparatedList( + const sqlEscapedSchema = AbstractDriver.escapeCommaSeparatedList( connectionOptons.schemaName ); dbModel = await this.GetAllTables( @@ -173,8 +185,8 @@ export abstract class AbstractDriver { connectionOptons.databaseName ); await this.DisconnectFromServer(); - dbModel = this.FindManyToManyRelations(dbModel); - this.FindPrimaryColumnsFromIndexes(dbModel); + dbModel = AbstractDriver.FindManyToManyRelations(dbModel); + AbstractDriver.FindPrimaryColumnsFromIndexes(dbModel); return dbModel; } @@ -199,8 +211,8 @@ export abstract class AbstractDriver { return ret; } - public GetRelationsFromRelationTempInfo( - relationsTemp: IRelationTempInfo[], + public static GetRelationsFromRelationTempInfo( + relationsTemp: RelationTempInfo[], entities: EntityInfo[] ) { relationsTemp.forEach(relationTmp => { @@ -275,7 +287,7 @@ export abstract class AbstractDriver { if ( referencedEntity.Columns.some(v => v.tsName === columnName) ) { - columnName = columnName + "_"; + columnName += "_"; for (let i = 2; i <= referencedEntity.Columns.length; i++) { columnName = columnName.substring( @@ -331,23 +343,26 @@ export abstract class AbstractDriver { }); return entities; } + public abstract async GetCoulmnsFromEntity( entities: EntityInfo[], schema: string, dbNames: string ): Promise; + public abstract async GetIndexesFromEntity( entities: EntityInfo[], schema: string, dbNames: string ): Promise; + public abstract async GetRelations( entities: EntityInfo[], schema: string, dbNames: string ): Promise; - public FindPrimaryColumnsFromIndexes(dbModel: EntityInfo[]) { + public static FindPrimaryColumnsFromIndexes(dbModel: EntityInfo[]) { dbModel.forEach(entity => { const primaryIndex = entity.Indexes.find(v => v.isPrimaryKey); entity.Columns.filter( @@ -356,7 +371,10 @@ export abstract class AbstractDriver { primaryIndex.columns.some( cIndex => cIndex.name === col.tsName ) - ).forEach(col => (col.options.primary = true)); + ).forEach(col => { + // eslint-disable-next-line no-param-reassign + col.options.primary = true; + }); if ( !entity.Columns.some(v => { return !!v.options.primary; @@ -366,18 +384,22 @@ export abstract class AbstractDriver { `Table ${entity.tsEntityName} has no PK.`, false ); - return; } }); } + public abstract async DisconnectFromServer(); + public abstract async CreateDB(dbName: string); + public abstract async DropDB(dbName: string); + public abstract async UseDB(dbName: string); + public abstract async CheckIfDBExists(dbName: string): Promise; // TODO: change name - protected escapeCommaSeparatedList(commaSeparatedList: string) { - return "'" + commaSeparatedList.split(",").join("','") + "'"; + protected static escapeCommaSeparatedList(commaSeparatedList: string) { + return `'${commaSeparatedList.split(",").join("','")}'`; } } diff --git a/src/drivers/MariaDbDriver.ts b/src/drivers/MariaDbDriver.ts index 93c587a..71324f2 100644 --- a/src/drivers/MariaDbDriver.ts +++ b/src/drivers/MariaDbDriver.ts @@ -1,5 +1,5 @@ -import { MysqlDriver } from "./MysqlDriver"; +import MysqlDriver from "./MysqlDriver"; -export class MariaDbDriver extends MysqlDriver { +export default class MariaDbDriver extends MysqlDriver { public readonly EngineName: string = "MariaDb"; } diff --git a/src/drivers/MssqlDriver.ts b/src/drivers/MssqlDriver.ts index 4331b08..2aed97b 100644 --- a/src/drivers/MssqlDriver.ts +++ b/src/drivers/MssqlDriver.ts @@ -2,33 +2,37 @@ import * as MSSQL from "mssql"; import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/sqlserver/SqlServerDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import { IConnectionOptions } from "../IConnectionOptions"; -import { ColumnInfo } from "../models/ColumnInfo"; -import { EntityInfo } from "../models/EntityInfo"; -import { IndexColumnInfo } from "../models/IndexColumnInfo"; -import { IndexInfo } from "../models/IndexInfo"; -import { IRelationTempInfo } from "../models/RelationTempInfo"; import * as TomgUtils from "../Utils"; -import { AbstractDriver } from "./AbstractDriver"; +import AbstractDriver from "./AbstractDriver"; +import EntityInfo from "../models/EntityInfo"; +import ColumnInfo from "../models/ColumnInfo"; +import IndexInfo from "../models/IndexInfo"; +import IndexColumnInfo from "../models/IndexColumnInfo"; +import RelationTempInfo from "../models/RelationTempInfo"; +import IConnectionOptions from "../IConnectionOptions"; -export class MssqlDriver extends AbstractDriver { +export default class MssqlDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.SqlServerDriver({ options: { replication: undefined } as ConnectionOptions } as any).dataTypeDefaults; + public readonly standardPort = 1433; + public readonly standardSchema = "dbo"; + public readonly standardUser = "sa"; private Connection: MSSQL.ConnectionPool; + public GetAllTablesQuery = async (schema: string, dbNames: string) => { const request = new MSSQL.Request(this.Connection); - const response: Array<{ + const response: { TABLE_SCHEMA: string; TABLE_NAME: string; DB_NAME: string; - }> = (await request.query( + }[] = (await request.query( `SELECT TABLE_SCHEMA,TABLE_NAME, table_catalog as "DB_NAME" FROM INFORMATION_SCHEMA.TABLES -WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG in (${this.escapeCommaSeparatedList( +WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG in (${MssqlDriver.escapeCommaSeparatedList( dbNames )})` )).recordset; @@ -41,7 +45,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG dbNames: string ): Promise { const request = new MSSQL.Request(this.Connection); - const response: Array<{ + const response: { TABLE_NAME: string; COLUMN_NAME: string; COLUMN_DEFAULT: string; @@ -52,7 +56,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG NUMERIC_SCALE: number; IsIdentity: number; IsUnique: number; - }> = (await request.query(`SELECT TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE, + }[] = (await request.query(`SELECT TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE, COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') IsIdentity, (SELECT count(*) @@ -65,7 +69,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG and cu.COLUMN_NAME = c.COLUMN_NAME and tc.TABLE_SCHEMA=c.TABLE_SCHEMA) IsUnique FROM INFORMATION_SCHEMA.COLUMNS c - where TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG in (${this.escapeCommaSeparatedList( + where TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG in (${MssqlDriver.escapeCommaSeparatedList( dbNames )}) order by ordinal_position`)).recordset; @@ -81,7 +85,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG colInfo.options.nullable = resp.IS_NULLABLE === "YES"; colInfo.options.generated = resp.IsIdentity === 1; colInfo.options.unique = resp.IsUnique === 1; - colInfo.options.default = this.ReturnDefaultValueFunction( + colInfo.options.default = MssqlDriver.ReturnDefaultValueFunction( resp.COLUMN_DEFAULT ); colInfo.options.type = resp.DATA_TYPE as any; @@ -218,28 +222,30 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG }); return entities; } + public async GetIndexesFromEntity( entities: EntityInfo[], schema: string, dbNames: string ): Promise { const request = new MSSQL.Request(this.Connection); - const response: Array<{ + const response: { TableName: string; IndexName: string; ColumnName: string; is_unique: boolean; is_primary_key: boolean; - }> = []; - for (const dbName of dbNames.split(",")) { - await this.UseDB(dbName); - const resp: Array<{ - TableName: string; - IndexName: string; - ColumnName: string; - is_unique: boolean; - is_primary_key: boolean; - }> = (await request.query(`SELECT + }[] = []; + await Promise.all( + dbNames.split(",").map(async dbName => { + await this.UseDB(dbName); + const resp: { + TableName: string; + IndexName: string; + ColumnName: string; + is_unique: boolean; + is_primary_key: boolean; + }[] = (await request.query(`SELECT TableName = t.name, IndexName = ind.name, ColumnName = col.name, @@ -259,8 +265,9 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG t.is_ms_shipped = 0 and s.name in (${schema}) ORDER BY t.name, ind.name, ind.index_id, ic.key_ordinal;`)).recordset; - response.push(...resp); - } + response.push(...resp); + }) + ); entities.forEach(ent => { response .filter(filterVal => filterVal.TableName === ent.tsEntityName) @@ -272,9 +279,9 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG return filterVal.name === resp.IndexName; }).length > 0 ) { - indexInfo = ent.Indexes.filter(filterVal => { + [indexInfo] = ent.Indexes.filter(filterVal => { return filterVal.name === resp.IndexName; - })[0]; + }); } else { indexInfo.columns = [] as IndexColumnInfo[]; indexInfo.name = resp.IndexName; @@ -289,13 +296,14 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG return entities; } + public async GetRelations( entities: EntityInfo[], schema: string, dbNames: string ): Promise { const request = new MSSQL.Request(this.Connection); - const response: Array<{ + const response: { TableWithForeignKey: string; FK_PartNo: number; ForeignKeyColumn: string; @@ -303,20 +311,21 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG ForeignKeyColumnReferenced: string; onDelete: "RESTRICT" | "CASCADE" | "SET_NULL" | "NO_ACTION"; onUpdate: "RESTRICT" | "CASCADE" | "SET_NULL" | "NO_ACTION"; - object_id: number; - }> = []; - for (const dbName of dbNames.split(",")) { - await this.UseDB(dbName); - const resp: Array<{ - TableWithForeignKey: string; - FK_PartNo: number; - ForeignKeyColumn: string; - TableReferenced: string; - ForeignKeyColumnReferenced: string; - onDelete: "RESTRICT" | "CASCADE" | "SET_NULL" | "NO_ACTION"; - onUpdate: "RESTRICT" | "CASCADE" | "SET_NULL" | "NO_ACTION"; - object_id: number; - }> = (await request.query(`select + objectId: number; + }[] = []; + await Promise.all( + dbNames.split(",").map(async dbName => { + await this.UseDB(dbName); + const resp: { + TableWithForeignKey: string; + FK_PartNo: number; + ForeignKeyColumn: string; + TableReferenced: string; + ForeignKeyColumnReferenced: string; + onDelete: "RESTRICT" | "CASCADE" | "SET_NULL" | "NO_ACTION"; + onUpdate: "RESTRICT" | "CASCADE" | "SET_NULL" | "NO_ACTION"; + objectId: number; + }[] = (await request.query(`select parentTable.name as TableWithForeignKey, fkc.constraint_column_id as FK_PartNo, parentColumn.name as ForeignKeyColumn, @@ -324,7 +333,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG referencedColumn.name as ForeignKeyColumnReferenced, fk.delete_referential_action_desc as onDelete, fk.update_referential_action_desc as onUpdate, - fk.object_id + fk.object_id as objectId from sys.foreign_keys fk inner join @@ -343,15 +352,16 @@ where fk.is_disabled=0 and fk.is_ms_shipped=0 and parentSchema.name in (${schema}) order by TableWithForeignKey, FK_PartNo`)).recordset; - response.push(...resp); - } - const relationsTemp: IRelationTempInfo[] = [] as IRelationTempInfo[]; + response.push(...resp); + }) + ); + const relationsTemp: RelationTempInfo[] = [] as RelationTempInfo[]; response.forEach(resp => { let rels = relationsTemp.find( - val => val.object_id === resp.object_id + val => val.objectId === resp.objectId ); if (rels === undefined) { - rels = {} as IRelationTempInfo; + rels = {} as RelationTempInfo; rels.ownerColumnsNames = []; rels.referencedColumnsNames = []; switch (resp.onDelete) { @@ -376,7 +386,7 @@ order by rels.actionOnUpdate = resp.onUpdate; break; } - rels.object_id = resp.object_id; + rels.objectId = resp.objectId; rels.ownerTable = resp.TableWithForeignKey; rels.referencedTable = resp.TableReferenced; relationsTemp.push(rels); @@ -384,17 +394,19 @@ order by rels.ownerColumnsNames.push(resp.ForeignKeyColumn); rels.referencedColumnsNames.push(resp.ForeignKeyColumnReferenced); }); - entities = this.GetRelationsFromRelationTempInfo( + const retVal = MssqlDriver.GetRelationsFromRelationTempInfo( relationsTemp, entities ); - return entities; + return retVal; } + public async DisconnectFromServer() { if (this.Connection) { await this.Connection.close(); } } + public async ConnectToServer(connectionOptons: IConnectionOptions) { const databaseName = connectionOptons.databaseName.split(",")[0]; const config: MSSQL.config = { @@ -427,18 +439,22 @@ order by await promise; } + public async CreateDB(dbName: string) { const request = new MSSQL.Request(this.Connection); await request.query(`CREATE DATABASE ${dbName}; `); } + public async UseDB(dbName: string) { const request = new MSSQL.Request(this.Connection); await request.query(`USE ${dbName}; `); } + public async DropDB(dbName: string) { const request = new MSSQL.Request(this.Connection); await request.query(`DROP DATABASE ${dbName}; `); } + public async CheckIfDBExists(dbName: string): Promise { const request = new MSSQL.Request(this.Connection); const resp = await request.query( @@ -446,16 +462,20 @@ order by ); return resp.recordset.length > 0; } - private ReturnDefaultValueFunction(defVal: string | null): string | null { - if (!defVal) { + + private static ReturnDefaultValueFunction( + defVal: string | null + ): string | null { + let defaultValue = defVal; + if (!defaultValue) { return null; } - if (defVal.startsWith("(") && defVal.endsWith(")")) { - defVal = defVal.slice(1, -1); + if (defaultValue.startsWith("(") && defaultValue.endsWith(")")) { + defaultValue = defaultValue.slice(1, -1); } - if (defVal.startsWith(`'`)) { - return `() => "${defVal}"`; + if (defaultValue.startsWith(`'`)) { + return `() => "${defaultValue}"`; } - return `() => "${defVal}"`; + return `() => "${defaultValue}"`; } } diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index f618e34..28ee666 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -2,22 +2,26 @@ import * as MYSQL from "mysql"; import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/mysql/MysqlDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import { IConnectionOptions } from "../IConnectionOptions"; -import { ColumnInfo } from "../models/ColumnInfo"; -import { EntityInfo } from "../models/EntityInfo"; -import { IndexColumnInfo } from "../models/IndexColumnInfo"; -import { IndexInfo } from "../models/IndexInfo"; -import { IRelationTempInfo } from "../models/RelationTempInfo"; import * as TomgUtils from "../Utils"; -import { AbstractDriver } from "./AbstractDriver"; +import AbstractDriver from "./AbstractDriver"; +import EntityInfo from "../models/EntityInfo"; +import ColumnInfo from "../models/ColumnInfo"; +import IndexInfo from "../models/IndexInfo"; +import IndexColumnInfo from "../models/IndexColumnInfo"; +import RelationTempInfo from "../models/RelationTempInfo"; +import IConnectionOptions from "../IConnectionOptions"; -export class MysqlDriver extends AbstractDriver { +export default class MysqlDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.MysqlDriver({ options: { replication: undefined } as ConnectionOptions } as any).dataTypeDefaults; + public readonly EngineName: string = "MySQL"; + public readonly standardPort = 3306; + public readonly standardUser = "root"; + public readonly standardSchema = ""; private Connection: MYSQL.Connection; @@ -30,7 +34,9 @@ export class MysqlDriver extends AbstractDriver { }>(`SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_SCHEMA as DB_NAME FROM information_schema.tables WHERE table_type='BASE TABLE' - AND table_schema IN (${this.escapeCommaSeparatedList(dbNames)})`); + AND table_schema IN (${MysqlDriver.escapeCommaSeparatedList( + dbNames + )})`); return response; }; @@ -54,7 +60,7 @@ export class MysqlDriver extends AbstractDriver { }>(`SELECT TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE, CASE WHEN EXTRA like '%auto_increment%' THEN 1 ELSE 0 END IsIdentity, COLUMN_TYPE, COLUMN_KEY - FROM INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA IN (${this.escapeCommaSeparatedList( + FROM INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA IN (${MysqlDriver.escapeCommaSeparatedList( dbNames )}) order by ordinal_position`); @@ -68,7 +74,7 @@ export class MysqlDriver extends AbstractDriver { colInfo.options.nullable = resp.IS_NULLABLE === "YES"; colInfo.options.generated = resp.IsIdentity === 1; colInfo.options.unique = resp.COLUMN_KEY === "UNI"; - colInfo.options.default = this.ReturnDefaultValueFunction( + colInfo.options.default = MysqlDriver.ReturnDefaultValueFunction( resp.COLUMN_DEFAULT ); colInfo.options.type = resp.DATA_TYPE as any; @@ -163,7 +169,7 @@ export class MysqlDriver extends AbstractDriver { colInfo.options.enum = resp.COLUMN_TYPE.substring( 5, resp.COLUMN_TYPE.length - 1 - ).replace(/\'/gi, '"'); + ).replace(/'/gi, '"'); break; case "json": colInfo.tsType = "object"; @@ -244,6 +250,7 @@ export class MysqlDriver extends AbstractDriver { }); return entities; } + public async GetIndexesFromEntity( entities: EntityInfo[], schema: string, @@ -258,7 +265,9 @@ export class MysqlDriver extends AbstractDriver { }>(`SELECT TABLE_NAME TableName,INDEX_NAME IndexName,COLUMN_NAME ColumnName,CASE WHEN NON_UNIQUE=0 THEN 1 ELSE 0 END is_unique, CASE WHEN INDEX_NAME='PRIMARY' THEN 1 ELSE 0 END is_primary_key FROM information_schema.statistics sta - WHERE table_schema IN (${this.escapeCommaSeparatedList(dbNames)})`); + WHERE table_schema IN (${MysqlDriver.escapeCommaSeparatedList( + dbNames + )})`); entities.forEach(ent => { response .filter(filterVal => filterVal.TableName === ent.tsEntityName) @@ -287,6 +296,7 @@ export class MysqlDriver extends AbstractDriver { return entities; } + public async GetRelations( entities: EntityInfo[], schema: string, @@ -316,23 +326,23 @@ export class MysqlDriver extends AbstractDriver { INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC ON CU.CONSTRAINT_NAME=RC.CONSTRAINT_NAME AND CU.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA WHERE - TABLE_SCHEMA IN (${this.escapeCommaSeparatedList(dbNames)}) + TABLE_SCHEMA IN (${MysqlDriver.escapeCommaSeparatedList(dbNames)}) AND CU.REFERENCED_TABLE_NAME IS NOT NULL; `); - const relationsTemp: IRelationTempInfo[] = [] as IRelationTempInfo[]; + const relationsTemp: RelationTempInfo[] = [] as RelationTempInfo[]; response.forEach(resp => { let rels = relationsTemp.find( - val => val.object_id === resp.object_id + val => val.objectId === resp.object_id ); if (rels === undefined) { - rels = {} as IRelationTempInfo; + rels = {} as RelationTempInfo; rels.ownerColumnsNames = []; rels.referencedColumnsNames = []; rels.actionOnDelete = resp.onDelete === "NO_ACTION" ? null : resp.onDelete; rels.actionOnUpdate = resp.onUpdate === "NO_ACTION" ? null : resp.onUpdate; - rels.object_id = resp.object_id; + rels.objectId = resp.object_id; rels.ownerTable = resp.TableWithForeignKey; rels.referencedTable = resp.TableReferenced; relationsTemp.push(rels); @@ -340,12 +350,13 @@ export class MysqlDriver extends AbstractDriver { rels.ownerColumnsNames.push(resp.ForeignKeyColumn); rels.referencedColumnsNames.push(resp.ForeignKeyColumnReferenced); }); - entities = this.GetRelationsFromRelationTempInfo( + const retVal = MysqlDriver.GetRelationsFromRelationTempInfo( relationsTemp, entities ); - return entities; + return retVal; } + public async DisconnectFromServer() { const promise = new Promise((resolve, reject) => { this.Connection.end(err => { @@ -365,6 +376,7 @@ export class MysqlDriver extends AbstractDriver { await promise; } } + public async ConnectToServer(connectionOptons: IConnectionOptions) { const databaseName = connectionOptons.databaseName.split(",")[0]; let config: MYSQL.ConnectionConfig; @@ -410,21 +422,26 @@ export class MysqlDriver extends AbstractDriver { await promise; } + public async CreateDB(dbName: string) { await this.ExecQuery(`CREATE DATABASE ${dbName}; `); } + public async UseDB(dbName: string) { await this.ExecQuery(`USE ${dbName}; `); } + public async DropDB(dbName: string) { await this.ExecQuery(`DROP DATABASE ${dbName}; `); } + public async CheckIfDBExists(dbName: string): Promise { const resp = await this.ExecQuery( `SHOW DATABASES LIKE '${dbName}' ` ); return resp.length > 0; } + public async ExecQuery(sql: string): Promise { const ret: T[] = []; const query = this.Connection.query(sql); @@ -439,16 +456,23 @@ export class MysqlDriver extends AbstractDriver { await promise; return ret; } - private ReturnDefaultValueFunction(defVal: string | null): string | null { - if (!defVal || defVal === "NULL") { + + private static ReturnDefaultValueFunction( + defVal: string | null + ): string | null { + let defaultValue = defVal; + if (!defaultValue || defaultValue === "NULL") { return null; } - if (defVal.toLowerCase() === "current_timestamp()") { - defVal = "CURRENT_TIMESTAMP"; + if (defaultValue.toLowerCase() === "current_timestamp()") { + defaultValue = "CURRENT_TIMESTAMP"; } - if (defVal === "CURRENT_TIMESTAMP" || defVal.startsWith(`'`)) { - return `() => "${defVal}"`; + if ( + defaultValue === "CURRENT_TIMESTAMP" || + defaultValue.startsWith(`'`) + ) { + return `() => "${defaultValue}"`; } - return `() => "'${defVal}'"`; + return `() => "'${defaultValue}'"`; } } diff --git a/src/drivers/OracleDriver.ts b/src/drivers/OracleDriver.ts index d91d633..27dd884 100644 --- a/src/drivers/OracleDriver.ts +++ b/src/drivers/OracleDriver.ts @@ -1,28 +1,33 @@ import * as TypeormDriver from "typeorm/driver/oracle/OracleDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import { IConnectionOptions } from "../IConnectionOptions"; -import { ColumnInfo } from "../models/ColumnInfo"; -import { EntityInfo } from "../models/EntityInfo"; -import { IndexColumnInfo } from "../models/IndexColumnInfo"; -import { IndexInfo } from "../models/IndexInfo"; -import { IRelationTempInfo } from "../models/RelationTempInfo"; import * as TomgUtils from "../Utils"; -import { AbstractDriver } from "./AbstractDriver"; +import AbstractDriver from "./AbstractDriver"; +import EntityInfo from "../models/EntityInfo"; +import ColumnInfo from "../models/ColumnInfo"; +import IndexInfo from "../models/IndexInfo"; +import IndexColumnInfo from "../models/IndexColumnInfo"; +import RelationTempInfo from "../models/RelationTempInfo"; +import IConnectionOptions from "../IConnectionOptions"; -export class OracleDriver extends AbstractDriver { +export default class OracleDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.OracleDriver({ options: undefined } as any).dataTypeDefaults; + public readonly standardPort = 1521; + public readonly standardUser = "SYS"; + public readonly standardSchema = ""; public Oracle: any; - private Connection: any /*Oracle.IConnection*/; - constructor() { + private Connection: any /* Oracle.IConnection */; + + public constructor() { super(); try { + // eslint-disable-next-line import/no-extraneous-dependencies, global-require this.Oracle = require("oracledb"); this.Oracle.outFormat = this.Oracle.OBJECT; } catch (error) { @@ -31,22 +36,21 @@ export class OracleDriver extends AbstractDriver { } } - public GetAllTablesQuery = async (schema: string) => { - const response: Array<{ + public GetAllTablesQuery = async () => { + const response: { TABLE_SCHEMA: string; TABLE_NAME: string; DB_NAME: string; - }> = (await this.Connection.execute( + }[] = (await this.Connection.execute( ` SELECT NULL AS TABLE_SCHEMA, TABLE_NAME, NULL AS DB_NAME FROM all_tables WHERE owner = (select user from dual)` )).rows!; return response; }; public async GetCoulmnsFromEntity( - entities: EntityInfo[], - schema: string + entities: EntityInfo[] ): Promise { - const response: Array<{ + const response: { TABLE_NAME: string; COLUMN_NAME: string; DATA_DEFAULT: string; @@ -57,7 +61,7 @@ export class OracleDriver extends AbstractDriver { DATA_SCALE: number; IDENTITY_COLUMN: string; IS_UNIQUE: number; - }> = (await this.Connection + }[] = (await this.Connection .execute(`SELECT utc.TABLE_NAME, utc.COLUMN_NAME, DATA_DEFAULT, NULLABLE, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, IDENTITY_COLUMN, (select count(*) from USER_CONS_COLUMNS ucc @@ -77,13 +81,13 @@ export class OracleDriver extends AbstractDriver { colInfo.options.default = !resp.DATA_DEFAULT || resp.DATA_DEFAULT.includes('"') ? null - : this.ReturnDefaultValueFunction( + : OracleDriver.ReturnDefaultValueFunction( resp.DATA_DEFAULT ); colInfo.options.unique = resp.IS_UNIQUE > 0; - resp.DATA_TYPE = resp.DATA_TYPE.replace(/\([0-9]+\)/g, ""); - colInfo.options.type = resp.DATA_TYPE.toLowerCase() as any; - switch (resp.DATA_TYPE.toLowerCase()) { + const DATA_TYPE = resp.DATA_TYPE.replace(/\([0-9]+\)/g, ""); + colInfo.options.type = DATA_TYPE.toLowerCase() as any; + switch (DATA_TYPE.toLowerCase()) { case "char": colInfo.tsType = "string"; break; @@ -173,7 +177,7 @@ export class OracleDriver extends AbstractDriver { break; default: TomgUtils.LogError( - "Unknown column type:" + resp.DATA_TYPE + `Unknown column type:${DATA_TYPE}` ); break; } @@ -201,17 +205,17 @@ export class OracleDriver extends AbstractDriver { }); return entities; } + public async GetIndexesFromEntity( - entities: EntityInfo[], - schema: string + entities: EntityInfo[] ): Promise { - const response: Array<{ + const response: { COLUMN_NAME: string; TABLE_NAME: string; INDEX_NAME: string; UNIQUENESS: string; ISPRIMARYKEY: number; - }> = (await this.Connection + }[] = (await this.Connection .execute(`SELECT ind.TABLE_NAME, ind.INDEX_NAME, col.COLUMN_NAME,ind.UNIQUENESS, CASE WHEN uc.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END ISPRIMARYKEY FROM USER_INDEXES ind JOIN USER_IND_COLUMNS col ON ind.INDEX_NAME=col.INDEX_NAME @@ -246,11 +250,9 @@ export class OracleDriver extends AbstractDriver { return entities; } - public async GetRelations( - entities: EntityInfo[], - schema: string - ): Promise { - const response: Array<{ + + public async GetRelations(entities: EntityInfo[]): Promise { + const response: { OWNER_TABLE_NAME: string; OWNER_POSITION: string; OWNER_COLUMN_NAME: string; @@ -258,7 +260,7 @@ export class OracleDriver extends AbstractDriver { CHILD_COLUMN_NAME: string; DELETE_RULE: "RESTRICT" | "CASCADE" | "SET NULL" | "NO ACTION"; CONSTRAINT_NAME: string; - }> = (await this.Connection + }[] = (await this.Connection .execute(`select owner.TABLE_NAME OWNER_TABLE_NAME,ownCol.POSITION OWNER_POSITION,ownCol.COLUMN_NAME OWNER_COLUMN_NAME, child.TABLE_NAME CHILD_TABLE_NAME ,childCol.COLUMN_NAME CHILD_COLUMN_NAME, owner.DELETE_RULE, @@ -270,19 +272,19 @@ export class OracleDriver extends AbstractDriver { ORDER BY OWNER_TABLE_NAME ASC, owner.CONSTRAINT_NAME ASC, OWNER_POSITION ASC`)) .rows!; - const relationsTemp: IRelationTempInfo[] = [] as IRelationTempInfo[]; + const relationsTemp: RelationTempInfo[] = [] as RelationTempInfo[]; response.forEach(resp => { let rels = relationsTemp.find( - val => val.object_id === resp.CONSTRAINT_NAME + val => val.objectId === resp.CONSTRAINT_NAME ); if (rels === undefined) { - rels = {} as IRelationTempInfo; + rels = {} as RelationTempInfo; rels.ownerColumnsNames = []; rels.referencedColumnsNames = []; rels.actionOnDelete = resp.DELETE_RULE === "NO ACTION" ? null : resp.DELETE_RULE; rels.actionOnUpdate = null; - rels.object_id = resp.CONSTRAINT_NAME; + rels.objectId = resp.CONSTRAINT_NAME; rels.ownerTable = resp.OWNER_TABLE_NAME; rels.referencedTable = resp.CHILD_TABLE_NAME; relationsTemp.push(rels); @@ -290,21 +292,23 @@ export class OracleDriver extends AbstractDriver { rels.ownerColumnsNames.push(resp.OWNER_COLUMN_NAME); rels.referencedColumnsNames.push(resp.CHILD_COLUMN_NAME); }); - entities = this.GetRelationsFromRelationTempInfo( + const retVal = OracleDriver.GetRelationsFromRelationTempInfo( relationsTemp, entities ); - return entities; + return retVal; } + public async DisconnectFromServer() { if (this.Connection) { await this.Connection.close(); } } + public async ConnectToServer(connectionOptons: IConnectionOptions) { let config: any; if (connectionOptons.user === String(process.env.ORACLE_UsernameSys)) { - config /*Oracle.IConnectionAttributes*/ = { + config /* Oracle.IConnectionAttributes */ = { connectString: `${connectionOptons.host}:${connectionOptons.port}/${connectionOptons.databaseName}`, externalAuth: connectionOptons.ssl, password: connectionOptons.password, @@ -312,7 +316,7 @@ export class OracleDriver extends AbstractDriver { user: connectionOptons.user }; } else { - config /*Oracle.IConnectionAttributes*/ = { + config /* Oracle.IConnectionAttributes */ = { connectString: `${connectionOptons.host}:${connectionOptons.port}/${connectionOptons.databaseName}`, externalAuth: connectionOptons.ssl, password: connectionOptons.password, @@ -347,28 +351,36 @@ export class OracleDriver extends AbstractDriver { ); await this.Connection.execute(`GRANT CONNECT TO ${dbName}`); } - public async UseDB(dbName: string) { + + // eslint-disable-next-line class-methods-use-this + public async UseDB() { // not supported } + public async DropDB(dbName: string) { await this.Connection.execute(`DROP USER ${dbName} CASCADE`); } + public async CheckIfDBExists(dbName: string): Promise { const x = await this.Connection.execute( `select count(*) as CNT from dba_users where username='${dbName.toUpperCase()}'` ); return x.rows[0][0] > 0 || x.rows[0].CNT; } - private ReturnDefaultValueFunction(defVal: string | null): string | null { - if (!defVal) { + + private static ReturnDefaultValueFunction( + defVal: string | null + ): string | null { + let defaultVal = defVal; + if (!defaultVal) { return null; } - if (defVal.endsWith(" ")) { - defVal = defVal.slice(0, -1); + if (defaultVal.endsWith(" ")) { + defaultVal = defaultVal.slice(0, -1); } - if (defVal.startsWith(`'`)) { - return `() => "${defVal}"`; + if (defaultVal.startsWith(`'`)) { + return `() => "${defaultVal}"`; } - return `() => "${defVal}"`; + return `() => "${defaultVal}"`; } } diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index 04ac1d0..5ed4b6c 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -2,31 +2,34 @@ import * as PG from "pg"; import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/postgres/PostgresDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import { IConnectionOptions } from "../IConnectionOptions"; -import { ColumnInfo } from "../models/ColumnInfo"; -import { EntityInfo } from "../models/EntityInfo"; -import { IndexColumnInfo } from "../models/IndexColumnInfo"; -import { IndexInfo } from "../models/IndexInfo"; -import { IRelationTempInfo } from "../models/RelationTempInfo"; import * as TomgUtils from "../Utils"; -import { AbstractDriver } from "./AbstractDriver"; +import AbstractDriver from "./AbstractDriver"; +import EntityInfo from "../models/EntityInfo"; +import ColumnInfo from "../models/ColumnInfo"; +import IndexInfo from "../models/IndexInfo"; +import IndexColumnInfo from "../models/IndexColumnInfo"; +import RelationTempInfo from "../models/RelationTempInfo"; +import IConnectionOptions from "../IConnectionOptions"; -export class PostgresDriver extends AbstractDriver { +export default class PostgresDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.PostgresDriver({ options: { replication: undefined } as ConnectionOptions } as any).dataTypeDefaults; + public readonly standardPort = 5432; + public readonly standardUser = "postgres"; + public readonly standardSchema = "public"; private Connection: PG.Client; public GetAllTablesQuery = async (schema: string) => { - const response: Array<{ + const response: { TABLE_SCHEMA: string; TABLE_NAME: string; DB_NAME: string; - }> = (await this.Connection.query( + }[] = (await this.Connection.query( `SELECT table_schema as "TABLE_SCHEMA",table_name as "TABLE_NAME", table_catalog as "DB_NAME" FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND table_schema in (${schema}) ` )).rows; return response; @@ -36,7 +39,7 @@ export class PostgresDriver extends AbstractDriver { entities: EntityInfo[], schema: string ): Promise { - const response: Array<{ + const response: { table_name: string; column_name: string; udt_name: string; @@ -49,7 +52,7 @@ export class PostgresDriver extends AbstractDriver { isidentity: string; isunique: string; enumvalues: string | null; - }> = (await this.Connection + }[] = (await this.Connection .query(`SELECT table_name,column_name,udt_name,column_default,is_nullable, data_type,character_maximum_length,numeric_precision,numeric_scale, case when column_default LIKE 'nextval%' then 'YES' else 'NO' end isidentity, @@ -84,14 +87,16 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name colInfo.options.unique = resp.isunique === "1"; colInfo.options.default = colInfo.options.generated ? null - : this.ReturnDefaultValueFunction(resp.column_default); + : PostgresDriver.ReturnDefaultValueFunction( + resp.column_default + ); const columnTypes = this.MatchColumnTypes( resp.data_type, resp.udt_name, resp.enumvalues ); - if (!columnTypes.sql_type || !columnTypes.ts_type) { + if (!columnTypes.sqlType || !columnTypes.tsType) { if ( resp.data_type === "USER-DEFINED" || resp.data_type === "ARRAY" @@ -106,14 +111,14 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name } return; } - colInfo.options.type = columnTypes.sql_type as any; - colInfo.tsType = columnTypes.ts_type; - colInfo.options.array = columnTypes.is_array; + colInfo.options.type = columnTypes.sqlType as any; + colInfo.tsType = columnTypes.tsType; + colInfo.options.array = columnTypes.isArray; colInfo.options.enum = columnTypes.enumValues; if (colInfo.options.array) { colInfo.tsType = colInfo.tsType .split("|") - .map(x => x.replace("|", "").trim() + "[]") + .map(x => `${x.replace("|", "").trim()}[]`) .join(" | ") as any; } @@ -158,8 +163,8 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name udtName: string, enumValues: string | null ) { - const ret: { - ts_type: + let ret: { + tsType: | "number" | "string" | "boolean" @@ -170,243 +175,241 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name | "string | string[]" | "any" | null; - sql_type: string | null; - is_array: boolean; + sqlType: string | null; + isArray: boolean; enumValues: string[]; - } = { ts_type: null, sql_type: null, is_array: false, enumValues: [] }; - ret.sql_type = dataType; + } = { tsType: null, sqlType: null, isArray: false, enumValues: [] }; + ret.sqlType = dataType; switch (dataType) { case "int2": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "int4": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "int8": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "smallint": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "integer": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "bigint": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "decimal": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "numeric": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "real": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "float": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "float4": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "float8": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "double precision": - ret.ts_type = "number"; + ret.tsType = "number"; break; case "money": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "character varying": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "varchar": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "character": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "char": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "bpchar": - ret.sql_type = "char"; - ret.ts_type = "string"; + ret.sqlType = "char"; + ret.tsType = "string"; break; case "text": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "citext": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "hstore": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "bytea": - ret.ts_type = "Buffer"; + ret.tsType = "Buffer"; break; case "bit": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "varbit": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "bit varying": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "timetz": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "timestamptz": - ret.ts_type = "Date"; + ret.tsType = "Date"; break; case "timestamp": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "timestamp without time zone": - ret.ts_type = "Date"; + ret.tsType = "Date"; break; case "timestamp with time zone": - ret.ts_type = "Date"; + ret.tsType = "Date"; break; case "date": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "time": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "time without time zone": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "time with time zone": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "interval": - ret.ts_type = "any"; + ret.tsType = "any"; break; case "bool": - ret.ts_type = "boolean"; + ret.tsType = "boolean"; break; case "boolean": - ret.ts_type = "boolean"; + ret.tsType = "boolean"; break; case "point": - ret.ts_type = "string | object"; + ret.tsType = "string | object"; break; case "line": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "lseg": - ret.ts_type = "string | string[]"; + ret.tsType = "string | string[]"; break; case "box": - ret.ts_type = "string | object"; + ret.tsType = "string | object"; break; case "path": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "polygon": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "circle": - ret.ts_type = "string | object"; + ret.tsType = "string | object"; break; case "cidr": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "inet": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "macaddr": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "tsvector": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "tsquery": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "uuid": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "xml": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "json": - ret.ts_type = "object"; + ret.tsType = "object"; break; case "jsonb": - ret.ts_type = "object"; + ret.tsType = "object"; break; case "int4range": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "int8range": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "numrange": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "tsrange": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "tstzrange": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "daterange": - ret.ts_type = "string"; + ret.tsType = "string"; break; case "ARRAY": - const z = this.MatchColumnTypes( + ret = this.MatchColumnTypes( udtName.substring(1), udtName, enumValues ); - ret.ts_type = z.ts_type; - ret.sql_type = z.sql_type; - ret.is_array = true; - ret.enumValues = z.enumValues; + ret.isArray = true; break; case "USER-DEFINED": - ret.ts_type = "string"; + ret.tsType = "string"; switch (udtName) { case "citext": case "hstore": case "geometry": - ret.sql_type = udtName; + ret.sqlType = udtName; break; default: if (enumValues) { - ret.sql_type = "enum"; - ret.enumValues = (('"' + - enumValues.split(",").join('","') + - '"') as never) as string[]; + ret.sqlType = "enum"; + ret.enumValues = (`"${enumValues + .split(",") + .join('","')}"` as never) as string[]; } else { - ret.ts_type = null; - ret.sql_type = null; + ret.tsType = null; + ret.sqlType = null; } break; } break; default: - ret.ts_type = null; - ret.sql_type = null; + ret.tsType = null; + ret.sqlType = null; break; } return ret; } + public async GetIndexesFromEntity( entities: EntityInfo[], schema: string ): Promise { - const response: Array<{ + const response: { tablename: string; indexname: string; columnname: string; is_unique: number; is_primary_key: number; - }> = (await this.Connection.query(`SELECT + }[] = (await this.Connection.query(`SELECT c.relname AS tablename, i.relname as indexname, f.attname AS columnname, @@ -461,11 +464,12 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name return entities; } + public async GetRelations( entities: EntityInfo[], schema: string ): Promise { - const response: Array<{ + const response: { tablewithforeignkey: string; fk_partno: number; foreignkeycolumn: string; @@ -475,7 +479,7 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name onupdate: "RESTRICT" | "CASCADE" | "SET NULL" | "NO ACTION"; object_id: string; // Distinct because of note in https://www.postgresql.org/docs/9.1/information-schema.html - }> = (await this.Connection.query(`SELECT DISTINCT + }[] = (await this.Connection.query(`SELECT DISTINCT con.relname AS tablewithforeignkey, att.attnum as fk_partno, att2.attname AS foreignkeycolumn, @@ -515,20 +519,20 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name AND att2.attnum = con.parent AND rc.constraint_name= con.conname AND constraint_catalog=current_database() AND rc.constraint_schema=nspname `)).rows; - const relationsTemp: IRelationTempInfo[] = [] as IRelationTempInfo[]; + const relationsTemp: RelationTempInfo[] = [] as RelationTempInfo[]; response.forEach(resp => { let rels = relationsTemp.find( - val => val.object_id === resp.object_id + val => val.objectId === resp.object_id ); if (rels === undefined) { - rels = {} as IRelationTempInfo; + rels = {} as RelationTempInfo; rels.ownerColumnsNames = []; rels.referencedColumnsNames = []; rels.actionOnDelete = resp.ondelete === "NO ACTION" ? null : resp.ondelete; rels.actionOnUpdate = resp.onupdate === "NO ACTION" ? null : resp.onupdate; - rels.object_id = resp.object_id; + rels.objectId = resp.object_id; rels.ownerTable = resp.tablewithforeignkey; rels.referencedTable = resp.tablereferenced; relationsTemp.push(rels); @@ -536,12 +540,13 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name rels.ownerColumnsNames.push(resp.foreignkeycolumn); rels.referencedColumnsNames.push(resp.foreignkeycolumnreferenced); }); - entities = this.GetRelationsFromRelationTempInfo( + const retVal = PostgresDriver.GetRelationsFromRelationTempInfo( relationsTemp, entities ); - return entities; + return retVal; } + public async DisconnectFromServer() { if (this.Connection) { const promise = new Promise((resolve, reject) => { @@ -569,6 +574,7 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name password: connectionOptons.password, port: connectionOptons.port, ssl: connectionOptons.ssl, + // eslint-disable-next-line @typescript-eslint/camelcase statement_timeout: connectionOptons.timeout, user: connectionOptons.user }); @@ -594,26 +600,33 @@ WHERE "n"."nspname" = table_schema AND "t"."typname"=udt_name public async CreateDB(dbName: string) { await this.Connection.query(`CREATE DATABASE ${dbName}; `); } + public async UseDB(dbName: string) { await this.Connection.query(`USE ${dbName}; `); } + public async DropDB(dbName: string) { await this.Connection.query(`DROP DATABASE ${dbName}; `); } + public async CheckIfDBExists(dbName: string): Promise { const resp = await this.Connection.query( `SELECT datname FROM pg_database WHERE datname ='${dbName}' ` ); return resp.rowCount > 0; } - private ReturnDefaultValueFunction(defVal: string | null): string | null { - if (!defVal) { + + private static ReturnDefaultValueFunction( + defVal: string | null + ): string | null { + let defaultValue = defVal; + if (!defaultValue) { return null; } - defVal = defVal.replace(/'::[\w ]*/, "'"); - if (defVal.startsWith(`'`)) { - return `() => "${defVal}"`; + defaultValue = defaultValue.replace(/'::[\w ]*/, "'"); + if (defaultValue.startsWith(`'`)) { + return `() => "${defaultValue}"`; } - return `() => "${defVal}"`; + return `() => "${defaultValue}"`; } } diff --git a/src/drivers/SqliteDriver.ts b/src/drivers/SqliteDriver.ts index a86d5b9..5dbadc5 100644 --- a/src/drivers/SqliteDriver.ts +++ b/src/drivers/SqliteDriver.ts @@ -1,29 +1,36 @@ import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/sqlite/SqliteDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import { IConnectionOptions } from "../IConnectionOptions"; -import { ColumnInfo } from "../models/ColumnInfo"; -import { EntityInfo } from "../models/EntityInfo"; -import { IndexColumnInfo } from "../models/IndexColumnInfo"; -import { IndexInfo } from "../models/IndexInfo"; -import { IRelationTempInfo } from "../models/RelationTempInfo"; +import * as sqliteLib from "sqlite3"; import * as TomgUtils from "../Utils"; -import { AbstractDriver } from "./AbstractDriver"; +import AbstractDriver from "./AbstractDriver"; +import EntityInfo from "../models/EntityInfo"; +import ColumnInfo from "../models/ColumnInfo"; +import IndexInfo from "../models/IndexInfo"; +import IndexColumnInfo from "../models/IndexColumnInfo"; +import RelationTempInfo from "../models/RelationTempInfo"; +import IConnectionOptions from "../IConnectionOptions"; -export class SqliteDriver extends AbstractDriver { +export default class SqliteDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.SqliteDriver({ options: { database: "true" } as ConnectionOptions } as any).dataTypeDefaults; + public readonly standardPort = 0; + public readonly standardUser = ""; + public readonly standardSchema = ""; - public sqlite = require("sqlite3").verbose(); + public sqlite = sqliteLib.verbose(); + public db: any; + public tablesWithGeneratedPrimaryKey: string[] = new Array(); + public GetAllTablesQuery: any; - public async GetAllTables(schema: string): Promise { + public async GetAllTables(): Promise { const ret: EntityInfo[] = [] as EntityInfo[]; const rows = await this.ExecQuery<{ tbl_name: string; sql: string }>( `SELECT tbl_name, sql FROM "sqlite_master" WHERE "type" = 'table' AND name NOT LIKE 'sqlite_%'` @@ -40,260 +47,279 @@ export class SqliteDriver extends AbstractDriver { }); return ret; } + public async GetCoulmnsFromEntity( - entities: EntityInfo[], - schema: string + entities: EntityInfo[] ): Promise { - for (const ent of entities) { - const response = await this.ExecQuery<{ - cid: number; - name: string; - type: string; - notnull: number; - dflt_value: string; - pk: number; - }>(`PRAGMA table_info('${ent.tsEntityName}');`); - response.forEach(resp => { - const colInfo: ColumnInfo = new ColumnInfo(); - colInfo.tsName = resp.name; - colInfo.options.name = resp.name; - colInfo.options.nullable = resp.notnull === 0; - colInfo.options.primary = resp.pk > 0; - colInfo.options.default = this.ReturnDefaultValueFunction( - resp.dflt_value - ); - colInfo.options.type = resp.type - .replace(/\([0-9 ,]+\)/g, "") - .toLowerCase() - .trim() as any; - colInfo.options.generated = - colInfo.options.primary && - this.tablesWithGeneratedPrimaryKey.includes( - ent.tsEntityName - ); - switch (colInfo.options.type) { - case "int": - colInfo.tsType = "number"; - break; - case "integer": - colInfo.tsType = "number"; - break; - case "int2": - colInfo.tsType = "number"; - break; - case "int8": - colInfo.tsType = "number"; - break; - case "tinyint": - colInfo.tsType = "number"; - break; - case "smallint": - colInfo.tsType = "number"; - break; - case "mediumint": - colInfo.tsType = "number"; - break; - case "bigint": - colInfo.tsType = "string"; - break; - case "unsigned big int": - colInfo.tsType = "string"; - break; - case "character": - colInfo.tsType = "string"; - break; - case "varchar": - colInfo.tsType = "string"; - break; - case "varying character": - colInfo.tsType = "string"; - break; - case "nchar": - colInfo.tsType = "string"; - break; - case "native character": - colInfo.tsType = "string"; - break; - case "nvarchar": - colInfo.tsType = "string"; - break; - case "text": - colInfo.tsType = "string"; - break; - case "blob": - colInfo.tsType = "Buffer"; - break; - case "clob": - colInfo.tsType = "string"; - break; - case "real": - colInfo.tsType = "number"; - break; - case "double": - colInfo.tsType = "number"; - break; - case "double precision": - colInfo.tsType = "number"; - break; - case "float": - colInfo.tsType = "number"; - break; - case "numeric": - colInfo.tsType = "number"; - break; - case "decimal": - colInfo.tsType = "number"; - break; - case "boolean": - colInfo.tsType = "boolean"; - break; - case "date": - colInfo.tsType = "string"; - break; - case "datetime": - colInfo.tsType = "Date"; - break; - default: - TomgUtils.LogError( - `Unknown column type: ${colInfo.options.type} table name: ${ent.tsEntityName} column name: ${resp.name}` - ); - break; - } - const options = resp.type.match(/\([0-9 ,]+\)/g); - if ( - this.ColumnTypesWithPrecision.some( - v => v === colInfo.options.type - ) && - options - ) { - colInfo.options.precision = options[0] - .substring(1, options[0].length - 1) - .split(",")[0] as any; - colInfo.options.scale = options[0] - .substring(1, options[0].length - 1) - .split(",")[1] as any; - } - if ( - this.ColumnTypesWithLength.some( - v => v === colInfo.options.type - ) && - options - ) { - colInfo.options.length = options[0].substring( - 1, - options[0].length - 1 - ) as any; - } - if ( - this.ColumnTypesWithWidth.some( - v => - v === colInfo.options.type && - colInfo.tsType !== "boolean" - ) && - options - ) { - colInfo.options.width = options[0].substring( - 1, - options[0].length - 1 - ) as any; - } - - if (colInfo.options.type) { - ent.Columns.push(colInfo); - } - }); - } - - return entities; - } - public async GetIndexesFromEntity( - entities: EntityInfo[], - schema: string - ): Promise { - for (const ent of entities) { - const response = await this.ExecQuery<{ - seq: number; - name: string; - unique: number; - origin: string; - partial: number; - }>(`PRAGMA index_list('${ent.tsEntityName}');`); - for (const resp of response) { - const indexColumnsResponse = await this.ExecQuery<{ - seqno: number; + await Promise.all( + entities.map(async ent => { + const response = await this.ExecQuery<{ cid: number; name: string; - }>(`PRAGMA index_info('${resp.name}');`); - indexColumnsResponse.forEach(element => { - let indexInfo: IndexInfo = {} as IndexInfo; - const indexColumnInfo: IndexColumnInfo = {} as IndexColumnInfo; - if ( - ent.Indexes.filter(filterVal => { - return filterVal.name === resp.name; - }).length > 0 - ) { - indexInfo = ent.Indexes.find( - filterVal => filterVal.name === resp.name - )!; - } else { - indexInfo.columns = [] as IndexColumnInfo[]; - indexInfo.name = resp.name; - indexInfo.isUnique = resp.unique === 1; - ent.Indexes.push(indexInfo); + type: string; + notnull: number; + dflt_value: string; + pk: number; + }>(`PRAGMA table_info('${ent.tsEntityName}');`); + response.forEach(resp => { + const colInfo: ColumnInfo = new ColumnInfo(); + colInfo.tsName = resp.name; + colInfo.options.name = resp.name; + colInfo.options.nullable = resp.notnull === 0; + colInfo.options.primary = resp.pk > 0; + colInfo.options.default = SqliteDriver.ReturnDefaultValueFunction( + resp.dflt_value + ); + colInfo.options.type = resp.type + .replace(/\([0-9 ,]+\)/g, "") + .toLowerCase() + .trim() as any; + colInfo.options.generated = + colInfo.options.primary && + this.tablesWithGeneratedPrimaryKey.includes( + ent.tsEntityName + ); + switch (colInfo.options.type) { + case "int": + colInfo.tsType = "number"; + break; + case "integer": + colInfo.tsType = "number"; + break; + case "int2": + colInfo.tsType = "number"; + break; + case "int8": + colInfo.tsType = "number"; + break; + case "tinyint": + colInfo.tsType = "number"; + break; + case "smallint": + colInfo.tsType = "number"; + break; + case "mediumint": + colInfo.tsType = "number"; + break; + case "bigint": + colInfo.tsType = "string"; + break; + case "unsigned big int": + colInfo.tsType = "string"; + break; + case "character": + colInfo.tsType = "string"; + break; + case "varchar": + colInfo.tsType = "string"; + break; + case "varying character": + colInfo.tsType = "string"; + break; + case "nchar": + colInfo.tsType = "string"; + break; + case "native character": + colInfo.tsType = "string"; + break; + case "nvarchar": + colInfo.tsType = "string"; + break; + case "text": + colInfo.tsType = "string"; + break; + case "blob": + colInfo.tsType = "Buffer"; + break; + case "clob": + colInfo.tsType = "string"; + break; + case "real": + colInfo.tsType = "number"; + break; + case "double": + colInfo.tsType = "number"; + break; + case "double precision": + colInfo.tsType = "number"; + break; + case "float": + colInfo.tsType = "number"; + break; + case "numeric": + colInfo.tsType = "number"; + break; + case "decimal": + colInfo.tsType = "number"; + break; + case "boolean": + colInfo.tsType = "boolean"; + break; + case "date": + colInfo.tsType = "string"; + break; + case "datetime": + colInfo.tsType = "Date"; + break; + default: + TomgUtils.LogError( + `Unknown column type: ${colInfo.options.type} table name: ${ent.tsEntityName} column name: ${resp.name}` + ); + break; } - indexColumnInfo.name = element.name; + const options = resp.type.match(/\([0-9 ,]+\)/g); if ( - indexColumnsResponse.length === 1 && - indexInfo.isUnique + this.ColumnTypesWithPrecision.some( + v => v === colInfo.options.type + ) && + options ) { - ent.Columns.filter( - v => v.tsName === indexColumnInfo.name - ).map(v => (v.options.unique = true)); + colInfo.options.precision = options[0] + .substring(1, options[0].length - 1) + .split(",")[0] as any; + colInfo.options.scale = options[0] + .substring(1, options[0].length - 1) + .split(",")[1] as any; + } + if ( + this.ColumnTypesWithLength.some( + v => v === colInfo.options.type + ) && + options + ) { + colInfo.options.length = options[0].substring( + 1, + options[0].length - 1 + ) as any; + } + if ( + this.ColumnTypesWithWidth.some( + v => + v === colInfo.options.type && + colInfo.tsType !== "boolean" + ) && + options + ) { + colInfo.options.width = options[0].substring( + 1, + options[0].length - 1 + ) as any; + } + + if (colInfo.options.type) { + ent.Columns.push(colInfo); } - indexInfo.columns.push(indexColumnInfo); }); - } - } + }) + ); return entities; } - public async GetRelations( - entities: EntityInfo[], - schema: string + + public async GetIndexesFromEntity( + entities: EntityInfo[] ): Promise { - for (const entity of entities) { - const response = await this.ExecQuery<{ - id: number; - seq: number; - table: string; - from: string; - to: string; - on_update: "RESTRICT" | "CASCADE" | "SET NULL" | "NO ACTION"; - on_delete: "RESTRICT" | "CASCADE" | "SET NULL" | "NO ACTION"; - match: string; - }>(`PRAGMA foreign_key_list('${entity.tsEntityName}');`); - const relationsTemp: IRelationTempInfo[] = [] as IRelationTempInfo[]; - response.forEach(resp => { - const rels = {} as IRelationTempInfo; - rels.ownerColumnsNames = []; - rels.referencedColumnsNames = []; - rels.actionOnDelete = - resp.on_delete === "NO ACTION" ? null : resp.on_delete; - rels.actionOnUpdate = - resp.on_update === "NO ACTION" ? null : resp.on_update; - rels.ownerTable = entity.tsEntityName; - rels.referencedTable = resp.table; - relationsTemp.push(rels); - rels.ownerColumnsNames.push(resp.from); - rels.referencedColumnsNames.push(resp.to); - }); - entities = this.GetRelationsFromRelationTempInfo( - relationsTemp, - entities - ); - } + await Promise.all( + entities.map(async ent => { + const response = await this.ExecQuery<{ + seq: number; + name: string; + unique: number; + origin: string; + partial: number; + }>(`PRAGMA index_list('${ent.tsEntityName}');`); + await Promise.all( + response.map(async resp => { + const indexColumnsResponse = await this.ExecQuery<{ + seqno: number; + cid: number; + name: string; + }>(`PRAGMA index_info('${resp.name}');`); + indexColumnsResponse.forEach(element => { + let indexInfo: IndexInfo = {} as IndexInfo; + const indexColumnInfo: IndexColumnInfo = {} as IndexColumnInfo; + if ( + ent.Indexes.filter(filterVal => { + return filterVal.name === resp.name; + }).length > 0 + ) { + indexInfo = ent.Indexes.find( + filterVal => filterVal.name === resp.name + )!; + } else { + indexInfo.columns = [] as IndexColumnInfo[]; + indexInfo.name = resp.name; + indexInfo.isUnique = resp.unique === 1; + ent.Indexes.push(indexInfo); + } + indexColumnInfo.name = element.name; + if ( + indexColumnsResponse.length === 1 && + indexInfo.isUnique + ) { + ent.Columns.filter( + v => v.tsName === indexColumnInfo.name + ).forEach(v => { + // eslint-disable-next-line no-param-reassign + v.options.unique = true; + }); + } + indexInfo.columns.push(indexColumnInfo); + }); + }) + ); + }) + ); + return entities; } + + public async GetRelations(entities: EntityInfo[]): Promise { + let retVal = entities; + await Promise.all( + retVal.map(async entity => { + const response = await this.ExecQuery<{ + id: number; + seq: number; + table: string; + from: string; + to: string; + on_update: + | "RESTRICT" + | "CASCADE" + | "SET NULL" + | "NO ACTION"; + on_delete: + | "RESTRICT" + | "CASCADE" + | "SET NULL" + | "NO ACTION"; + match: string; + }>(`PRAGMA foreign_key_list('${entity.tsEntityName}');`); + const relationsTemp: RelationTempInfo[] = [] as RelationTempInfo[]; + response.forEach(resp => { + const rels = {} as RelationTempInfo; + rels.ownerColumnsNames = []; + rels.referencedColumnsNames = []; + rels.actionOnDelete = + resp.on_delete === "NO ACTION" ? null : resp.on_delete; + rels.actionOnUpdate = + resp.on_update === "NO ACTION" ? null : resp.on_update; + rels.ownerTable = entity.tsEntityName; + rels.referencedTable = resp.table; + relationsTemp.push(rels); + rels.ownerColumnsNames.push(resp.from); + rels.referencedColumnsNames.push(resp.to); + }); + retVal = SqliteDriver.GetRelationsFromRelationTempInfo( + relationsTemp, + retVal + ); + }) + ); + return retVal; + } + public async DisconnectFromServer() { this.db.close(); } @@ -302,9 +328,11 @@ export class SqliteDriver extends AbstractDriver { await this.UseDB(connectionOptons.databaseName); } - public async CreateDB(dbName: string) { + // eslint-disable-next-line class-methods-use-this + public async CreateDB() { // not supported } + public async UseDB(dbName: string) { const promise = new Promise((resolve, reject) => { this.db = new this.sqlite.Database(dbName, err => { @@ -322,10 +350,14 @@ export class SqliteDriver extends AbstractDriver { }); return promise; } - public async DropDB(dbName: string) { + + // eslint-disable-next-line class-methods-use-this + public async DropDB() { // not supported } - public async CheckIfDBExists(dbName: string): Promise { + + // eslint-disable-next-line class-methods-use-this + public async CheckIfDBExists(): Promise { return true; } @@ -351,7 +383,10 @@ export class SqliteDriver extends AbstractDriver { await promise; return ret; } - private ReturnDefaultValueFunction(defVal: string | null): string | null { + + private static ReturnDefaultValueFunction( + defVal: string | null + ): string | null { if (!defVal) { return null; } diff --git a/src/index.ts b/src/index.ts index 1361a20..6bd2858 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,15 @@ +import * as Yargs from "yargs"; +import { createDriver, createModelFromDatabase } from "./Engine"; +import * as TomgUtils from "./Utils"; +import AbstractDriver from "./drivers/AbstractDriver"; +import IConnectionOptions from "./IConnectionOptions"; +import IGenerationOptions from "./IGenerationOptions"; + import fs = require("fs-extra"); import inquirer = require("inquirer"); import path = require("path"); -import * as Yargs from "yargs"; -import { AbstractDriver } from "./drivers/AbstractDriver"; -import { createDriver, createModelFromDatabase } from "./Engine"; -import { IConnectionOptions } from "./IConnectionOptions"; -import { IGenerationOptions } from "./IGenerationOptions"; -import * as TomgUtils from "./Utils"; +// eslint-disable-next-line @typescript-eslint/no-floating-promises CliLogic(); async function CliLogic() { @@ -20,41 +22,35 @@ async function CliLogic() { connectionOptions = retVal.connectionOptions; generationOptions = retVal.generationOptions; driver = retVal.driver; + } else if (fs.existsSync(path.resolve(process.cwd(), ".tomg-config"))) { + console.log( + `[${new Date().toLocaleTimeString()}] Using configuration file. [${path.resolve( + process.cwd(), + ".tomg-config" + )}]` + ); + const retVal = await fs.readJson( + path.resolve(process.cwd(), ".tomg-config") + ); + [connectionOptions, generationOptions] = retVal; + driver = createDriver(connectionOptions.databaseType); } else { - if (fs.existsSync(path.resolve(process.cwd(), ".tomg-config"))) { - console.log( - `[${new Date().toLocaleTimeString()}] Using configuration file. [${path.resolve( - process.cwd(), - ".tomg-config" - )}]` - ); - const retVal = await fs.readJson( - path.resolve(process.cwd(), ".tomg-config") - ); - connectionOptions = retVal[0]; - generationOptions = retVal[1]; - driver = createDriver(connectionOptions.databaseType); - } else { - const retVal = await GetUtilParametersByInquirer(); - driver = retVal.driver; - connectionOptions = retVal.connectionOptions; - generationOptions = retVal.generationOptions; - } + const retVal = await GetUtilParametersByInquirer(); + driver = retVal.driver; + connectionOptions = retVal.connectionOptions; + generationOptions = retVal.generationOptions; } console.log( `[${new Date().toLocaleTimeString()}] Starting creation of model classes.` ); - createModelFromDatabase(driver, connectionOptions, generationOptions).then( - () => { - console.info( - `[${new Date().toLocaleTimeString()}] Typeorm model classes created.` - ); - } + await createModelFromDatabase(driver, connectionOptions, generationOptions); + console.info( + `[${new Date().toLocaleTimeString()}] Typeorm model classes created.` ); } function GetUtilParametersByArgs() { - const argv = Yargs.usage( + const { argv } = Yargs.usage( "Usage: typeorm-model-generator -h -d -p [port] -u -x [password] -e [engine]\nYou can also run program without specyfiying any parameters." ) .option("h", { @@ -165,43 +161,40 @@ function GetUtilParametersByArgs() { .option("timeout", { describe: "SQL Query timeout(ms)", number: true - }).argv; + }); const driver = createDriver(argv.e); - const standardPort = driver.standardPort; - const standardSchema = driver.standardSchema; + const { standardPort } = driver; + const { standardSchema } = driver; const standardUser = driver.standardPort; let namingStrategyPath: string; if (argv.namingStrategy && argv.namingStrategy !== "") { - // tslint:disable-next-line:no-var-requires namingStrategyPath = argv.namingStrategy; } else { namingStrategyPath = ""; } const connectionOptions: IConnectionOptions = new IConnectionOptions(); - (connectionOptions.databaseName = argv.d ? argv.d.toString() : null), - (connectionOptions.databaseType = argv.e), - (connectionOptions.host = argv.h), - (connectionOptions.password = argv.x ? argv.x.toString() : null), - (connectionOptions.port = parseInt(argv.p, 10) || standardPort), - (connectionOptions.schemaName = argv.s - ? argv.s.toString() - : standardSchema), - (connectionOptions.ssl = argv.ssl), - (connectionOptions.timeout = argv.timeout), - (connectionOptions.user = argv.u ? argv.u.toString() : standardUser); + connectionOptions.databaseName = argv.d ? argv.d.toString() : null; + connectionOptions.databaseType = argv.e; + connectionOptions.host = argv.h; + connectionOptions.password = argv.x ? argv.x.toString() : null; + connectionOptions.port = parseInt(argv.p, 10) || standardPort; + connectionOptions.schemaName = argv.s ? argv.s.toString() : standardSchema; + connectionOptions.ssl = argv.ssl; + connectionOptions.timeout = argv.timeout; + connectionOptions.user = argv.u ? argv.u.toString() : standardUser; const generationOptions: IGenerationOptions = new IGenerationOptions(); - (generationOptions.activeRecord = argv.a), - (generationOptions.generateConstructor = argv.generateConstructor), - (generationOptions.convertCaseEntity = argv.ce), - (generationOptions.convertCaseFile = argv.cf), - (generationOptions.convertCaseProperty = argv.cp), - (generationOptions.lazy = argv.lazy), - (generationOptions.customNamingStrategyPath = namingStrategyPath), - (generationOptions.noConfigs = argv.noConfig), - (generationOptions.propertyVisibility = argv.pv), - (generationOptions.relationIds = argv.relationIds), - (generationOptions.resultsPath = argv.o ? argv.o.toString() : null); + generationOptions.activeRecord = argv.a; + generationOptions.generateConstructor = argv.generateConstructor; + generationOptions.convertCaseEntity = argv.ce; + generationOptions.convertCaseFile = argv.cf; + generationOptions.convertCaseProperty = argv.cp; + generationOptions.lazy = argv.lazy; + generationOptions.customNamingStrategyPath = namingStrategyPath; + generationOptions.noConfigs = argv.noConfig; + generationOptions.propertyVisibility = argv.pv; + generationOptions.relationIds = argv.relationIds; + generationOptions.resultsPath = argv.o ? argv.o.toString() : null; return { driver, connectionOptions, generationOptions }; } @@ -238,11 +231,11 @@ async function GetUtilParametersByInquirer() { message: "Database port:", name: "port", type: "input", - default(answers: any) { + default() { return driver.standardPort; }, validate(value) { - const valid = !isNaN(parseInt(value, 10)); + const valid = !Number.isNaN(parseInt(value, 10)); return valid || "Please enter a valid port number"; } }, @@ -256,7 +249,7 @@ async function GetUtilParametersByInquirer() { message: "Database user name:", name: "login", type: "input", - default(answers: any) { + default() { return driver.standardUser; } }, @@ -316,35 +309,35 @@ async function GetUtilParametersByInquirer() { connectionOptions.databaseType === "mssql" || connectionOptions.databaseType === "postgres" ) { - const changeRequestTimeout = ((await inquirer.prompt([ + const { changeRequestTimeout } = (await inquirer.prompt([ { default: false, message: "Do you want to change default sql query timeout?", name: "changeRequestTimeout", type: "confirm" } - ])) as any).changeRequestTimeout; + ])) as any; if (changeRequestTimeout) { - const timeout: any = ((await inquirer.prompt({ + const { timeout } = (await inquirer.prompt({ message: "Query timeout(ms):", name: "timeout", type: "input", validate(value) { - const valid = !isNaN(parseInt(value, 10)); + const valid = !Number.isNaN(parseInt(value, 10)); return valid || "Please enter a valid number"; } - })) as any).timeout; + })) as any; connectionOptions.timeout = timeout; } } - const customizeGeneration = ((await inquirer.prompt([ + const { customizeGeneration } = (await inquirer.prompt([ { default: false, message: "Do you want to customize generated model?", name: "customizeGeneration", type: "confirm" } - ])) as any).customizeGeneration; + ])) as any; if (customizeGeneration) { const customizations: string[] = ((await inquirer.prompt([ { @@ -413,7 +406,6 @@ async function GetUtilParametersByInquirer() { ])) as any).namingStrategy; if (namingStrategyPath && namingStrategyPath !== "") { - // tslint:disable-next-line:no-var-requires generationOptions.customNamingStrategyPath = namingStrategyPath; } else { generationOptions.customNamingStrategyPath = ""; @@ -449,14 +441,14 @@ async function GetUtilParametersByInquirer() { generationOptions.convertCaseEntity = namingConventions.entityCase; } } - const saveConfig = ((await inquirer.prompt([ + const { saveConfig } = (await inquirer.prompt([ { default: false, message: "Save configuration to config file?", name: "saveConfig", type: "confirm" } - ])) as any).saveConfig; + ])) as any; if (saveConfig) { await fs.writeJson( path.resolve(process.cwd(), ".tomg-config"), diff --git a/src/models/ColumnInfo.ts b/src/models/ColumnInfo.ts index 6b7f167..28058cc 100644 --- a/src/models/ColumnInfo.ts +++ b/src/models/ColumnInfo.ts @@ -1,9 +1,11 @@ import { ColumnOptions } from "typeorm"; -import { RelationInfo } from "./RelationInfo"; +import RelationInfo from "./RelationInfo"; -export class ColumnInfo { +export default class ColumnInfo { public options: ColumnOptions = {}; + public tsName: string = ""; + public tsType: | "number" | "string" @@ -14,5 +16,6 @@ export class ColumnInfo { | "string | object" | "string | string[]" | "any"; + public relations: RelationInfo[] = []; } diff --git a/src/models/EntityInfo.ts b/src/models/EntityInfo.ts index 50592bc..cdcd06c 100644 --- a/src/models/EntityInfo.ts +++ b/src/models/EntityInfo.ts @@ -1,16 +1,25 @@ -import { ColumnInfo } from "./ColumnInfo"; -import { IndexInfo } from "./IndexInfo"; +import ColumnInfo from "./ColumnInfo"; +import IndexInfo from "./IndexInfo"; -export class EntityInfo { +export default class EntityInfo { public tsEntityName: string; + public sqlEntityName: string; + public Columns: ColumnInfo[]; + public Imports: string[]; + public UniqueImports: string[]; + public Indexes: IndexInfo[]; + public Schema: string; + public GenerateConstructor: boolean; + public IsActiveRecord: boolean; + public Database: string; public relationImports() { diff --git a/src/models/IndexColumnInfo.ts b/src/models/IndexColumnInfo.ts index d04e3a6..f4fa605 100644 --- a/src/models/IndexColumnInfo.ts +++ b/src/models/IndexColumnInfo.ts @@ -1,3 +1,3 @@ -export interface IndexColumnInfo { +export default interface IndexColumnInfo { name: string; } diff --git a/src/models/IndexInfo.ts b/src/models/IndexInfo.ts index 0f557f8..ac94f15 100644 --- a/src/models/IndexInfo.ts +++ b/src/models/IndexInfo.ts @@ -1,6 +1,6 @@ -import { IndexColumnInfo } from "./IndexColumnInfo"; +import IndexColumnInfo from "./IndexColumnInfo"; -export interface IndexInfo { +export default interface IndexInfo { name: string; columns: IndexColumnInfo[]; isUnique: boolean; diff --git a/src/models/RelationInfo.ts b/src/models/RelationInfo.ts index 6dd8b3c..efaa10e 100644 --- a/src/models/RelationInfo.ts +++ b/src/models/RelationInfo.ts @@ -1,10 +1,16 @@ -export class RelationInfo { +export default class RelationInfo { public isOwner: boolean; + public relationType: "OneToOne" | "OneToMany" | "ManyToOne" | "ManyToMany"; + public relatedTable: string; + public relatedColumn: string; + public ownerTable: string; + public ownerColumn: string; + public actionOnDelete: | "RESTRICT" | "CASCADE" @@ -12,24 +18,29 @@ export class RelationInfo { | "DEFAULT" | "NO ACTION" | null; + public actionOnUpdate: | "RESTRICT" | "CASCADE" | "SET NULL" | "DEFAULT" | null; + public relationIdField: boolean = false; - get isOneToMany(): boolean { + public get isOneToMany(): boolean { return this.relationType === "OneToMany"; } - get isManyToMany(): boolean { + + public get isManyToMany(): boolean { return this.relationType === "ManyToMany"; } - get isOneToOne(): boolean { + + public get isOneToOne(): boolean { return this.relationType === "OneToOne"; } - get isManyToOne(): boolean { + + public get isManyToOne(): boolean { return this.relationType === "ManyToOne"; } } diff --git a/src/models/RelationTempInfo.ts b/src/models/RelationTempInfo.ts index 7ac64bb..f6914f8 100644 --- a/src/models/RelationTempInfo.ts +++ b/src/models/RelationTempInfo.ts @@ -1,4 +1,4 @@ -export interface IRelationTempInfo { +export default interface RelationTempInfo { ownerTable: string; ownerColumnsNames: string[]; referencedTable: string; @@ -11,5 +11,5 @@ export interface IRelationTempInfo { | "NO ACTION" | null; actionOnUpdate: "RESTRICT" | "CASCADE" | "SET NULL" | "DEFAULT" | null; - object_id: number | string; + objectId: number | string; } diff --git a/src/tslint.json b/src/tslint.json deleted file mode 100644 index bd2c46b..0000000 --- a/src/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended", "tslint-config-prettier" - ], - "jsRules": {}, - "rules": { - "no-console":false - }, - "rulesDirectory": [] -} diff --git a/test/drivers/MssqlDriver.test.ts b/test/drivers/MssqlDriver.test.ts index 030e1a8..c9b3640 100644 --- a/test/drivers/MssqlDriver.test.ts +++ b/test/drivers/MssqlDriver.test.ts @@ -1,105 +1,112 @@ import { expect } from "chai"; -import * as MSSQL from 'mssql' +import * as MSSQL from "mssql"; import { IColumnMetadata, Table } from "mssql"; -import * as Sinon from 'sinon' -import { MssqlDriver } from '../../src/drivers/MssqlDriver' -import { ColumnInfo } from '../../src/models/ColumnInfo' -import { EntityInfo } from '../../src/models/EntityInfo' -import { RelationInfo } from '../../src/models/RelationInfo' -import { NamingStrategy } from "../../src/NamingStrategy"; -import { IndexInfo } from "../../src/models/IndexInfo"; +import * as Sinon from "sinon"; +import MssqlDriver from "../../src/drivers/MssqlDriver"; +import EntityInfo from "../../src/models/EntityInfo"; +import ColumnInfo from "../../src/models/ColumnInfo"; +import IndexInfo from "../../src/models/IndexInfo"; +import RelationInfo from "../../src/models/RelationInfo"; -class fakeResponse implements MSSQL.IResult { +class fakeResponse implements MSSQL.IResult { public recordsets: Array>; public recordset: MSSQL.IRecordSet; public rowsAffected: number[]; - public output: { [key: string]: any; }; + public output: { [key: string]: any }; } -class fakeRecordset extends Array implements MSSQL.IRecordSet{ +class fakeRecordset extends Array implements MSSQL.IRecordSet { public columns: IColumnMetadata; public toTable(): Table { return new Table(); } } -describe('MssqlDriver', function () { - let driver: MssqlDriver - const sandbox = Sinon.sandbox.create() +describe("MssqlDriver", function() { + let driver: MssqlDriver; + const sandbox = Sinon.sandbox.create(); beforeEach(() => { driver = new MssqlDriver(); - }) + }); afterEach(() => { - sandbox.restore() - }) + sandbox.restore(); + }); - it('should get tables info', async () => { - sandbox.stub(MSSQL, 'Request') - .returns( - { - query: (q) => { - const response = new fakeResponse(); - response.recordset = new fakeRecordset(); - response.recordset.push({ TABLE_SCHEMA: 'schema', TABLE_NAME: 'name' }) - return response; - } - }) - const result = await driver.GetAllTables('schema', 'db') + it("should get tables info", async () => { + sandbox.stub(MSSQL, "Request").returns({ + query: q => { + const response = new fakeResponse(); + response.recordset = new fakeRecordset(); + response.recordset.push({ + TABLE_SCHEMA: "schema", + TABLE_NAME: "name" + }); + return response; + } + }); + const result = await driver.GetAllTables("schema", "db"); const expectedResult = [] as EntityInfo[]; const y = new EntityInfo(); - y.tsEntityName = 'name' - y.sqlEntityName = 'name' - y.Schema='schema' + y.tsEntityName = "name"; + y.sqlEntityName = "name"; + y.Schema = "schema"; y.Columns = [] as ColumnInfo[]; y.Indexes = [] as IndexInfo[]; y.Database = ""; - expectedResult.push(y) - expect(result).to.be.deep.equal(expectedResult) - }) - it('should get columns info', async () => { - sandbox.stub(MSSQL, 'Request') - .returns( - { - query: (q) => { - const response = new fakeResponse(); - response.recordset = new fakeRecordset(); - response.recordset.push({ - TABLE_NAME: 'name', CHARACTER_MAXIMUM_LENGTH: 0, - COLUMN_DEFAULT: "'a'", COLUMN_NAME: 'name', DATA_TYPE: 'int', - IS_NULLABLE: 'YES', NUMERIC_PRECISION: 0, NUMERIC_SCALE: 0, - IsIdentity: 1 - }) - return response; - } - }) + expectedResult.push(y); + expect(result).to.be.deep.equal(expectedResult); + }); + it("should get columns info", async () => { + sandbox.stub(MSSQL, "Request").returns({ + query: q => { + const response = new fakeResponse(); + response.recordset = new fakeRecordset(); + response.recordset.push({ + TABLE_NAME: "name", + CHARACTER_MAXIMUM_LENGTH: 0, + COLUMN_DEFAULT: "'a'", + COLUMN_NAME: "name", + DATA_TYPE: "int", + IS_NULLABLE: "YES", + NUMERIC_PRECISION: 0, + NUMERIC_SCALE: 0, + IsIdentity: 1 + }); + return response; + } + }); const entities = [] as EntityInfo[]; const y = new EntityInfo(); - y.tsEntityName = 'name' + y.tsEntityName = "name"; y.Columns = [] as ColumnInfo[]; y.Indexes = [] as IndexInfo[]; y.Database = ""; - entities.push(y) + entities.push(y); const expected: EntityInfo[] = JSON.parse(JSON.stringify(entities)); expected[0].Columns.push({ options: { default: `() => "'a'"`, nullable: true, generated: true, - name: 'name', - unique:false, - type: 'int', + name: "name", + unique: false, + type: "int" }, - tsName: 'name', - tsType: 'number', - relations: [] as RelationInfo[], - }) - const result = await driver.GetCoulmnsFromEntity(entities, 'schema','db'); - expect(result).to.be.deep.equal(expected) - }) - it('should find primary indexes') - it('should get indexes info') - it('should get relations info') -}) + tsName: "name", + tsType: "number", + relations: [] as RelationInfo[] + }); + const result = await driver.GetCoulmnsFromEntity( + entities, + "schema", + "db" + ); + expect(result).to.be.deep.equal(expected); + }); + it("should find primary indexes"); + it("should get indexes info"); + it("should get relations info"); +}); diff --git a/test/integration/runTestsFromPath.test.ts b/test/integration/runTestsFromPath.test.ts index 154733d..e6ca1af 100644 --- a/test/integration/runTestsFromPath.test.ts +++ b/test/integration/runTestsFromPath.test.ts @@ -1,53 +1,62 @@ -require('dotenv').config() +require("dotenv").config(); import "reflect-metadata"; import { expect } from "chai"; -import fs = require('fs-extra'); -import path = require('path'); +import fs = require("fs-extra"); +import path = require("path"); import { EntityFileToJson } from "../utils/EntityFileToJson"; -import { createDriver, createModelFromDatabase, dataCollectionPhase, modelCustomizationPhase, modelGenerationPhase } from "../../src/Engine"; +import { + createDriver, + createModelFromDatabase, + dataCollectionPhase, + modelCustomizationPhase, + modelGenerationPhase +} from "../../src/Engine"; import * as ts from "typescript"; -import * as GTU from "../utils/GeneralTestUtils" -import chaiSubset = require('chai-subset'); -import chai = require('chai'); -import { IConnectionOptions } from "../../src/IConnectionOptions"; +import * as GTU from "../utils/GeneralTestUtils"; +import chaiSubset = require("chai-subset"); +import chai = require("chai"); import yn = require("yn"); -import { EntityInfo } from "../../src/models/EntityInfo"; +import EntityInfo from "../../src/models/EntityInfo"; +import IConnectionOptions from "../../src/IConnectionOptions"; chai.use(chaiSubset); -it("Column default values", async function () { - const testPartialPath = 'test/integration/defaultValues' - this.timeout(60000) - this.slow(10000)// compiling created models takes time +it("Column default values", async function() { + const testPartialPath = "test/integration/defaultValues"; + this.timeout(60000); + this.slow(10000); // compiling created models takes time await runTestsFromPath(testPartialPath, true); -}) -it("Platform specyfic types", async function () { - this.timeout(60000) - this.slow(10000)// compiling created models takes time - const testPartialPath = 'test/integration/entityTypes' +}); +it("Platform specyfic types", async function() { + this.timeout(60000); + this.slow(10000); // compiling created models takes time + const testPartialPath = "test/integration/entityTypes"; await runTestsFromPath(testPartialPath, true); -}) -describe("GitHub issues", async function () { - this.timeout(60000) - this.slow(10000)// compiling created models takes time - const testPartialPath = 'test/integration/github-issues' +}); +describe("GitHub issues", async function() { + this.timeout(60000); + this.slow(10000); // compiling created models takes time + const testPartialPath = "test/integration/github-issues"; runTestsFromPath(testPartialPath, false); -}) -describe("TypeOrm examples", async function () { - this.timeout(60000) - this.slow(10000)// compiling created models takes time - const testPartialPath = 'test/integration/examples' +}); +describe("TypeOrm examples", async function() { + this.timeout(60000); + this.slow(10000); // compiling created models takes time + const testPartialPath = "test/integration/examples"; runTestsFromPath(testPartialPath, false); -}) +}); -export async function runTestsFromPath(testPartialPath: string, isDbSpecific: boolean) { - const resultsPath = path.resolve(process.cwd(), `output`) +export async function runTestsFromPath( + testPartialPath: string, + isDbSpecific: boolean +) { + const resultsPath = path.resolve(process.cwd(), `output`); if (!fs.existsSync(resultsPath)) { fs.mkdirSync(resultsPath); } const dbDrivers: string[] = GTU.getEnabledDbDrivers(); for (const dbDriver of dbDrivers) { - const newDirPath = path.resolve(resultsPath, dbDriver) + const newDirPath = path.resolve(resultsPath, dbDriver); if (!fs.existsSync(newDirPath)) { fs.mkdirSync(newDirPath); } @@ -61,69 +70,138 @@ export async function runTestsFromPath(testPartialPath: string, isDbSpecific: bo } } } -function runTestForMultipleDrivers(testName: string, dbDrivers: string[], testPartialPath: string) { - it(testName, async function () { +function runTestForMultipleDrivers( + testName: string, + dbDrivers: string[], + testPartialPath: string +) { + it(testName, async function() { const driversToRun = selectDriversForSpecyficTest(); - const modelGenerationPromises = driversToRun.map(async (dbDriver) => { - const { generationOptions, driver, connectionOptions, resultsPath, filesOrgPathTS } = await prepareTestRuns(testPartialPath, testName, dbDriver); + const modelGenerationPromises = driversToRun.map(async dbDriver => { + const { + generationOptions, + driver, + connectionOptions, + resultsPath, + filesOrgPathTS + } = await prepareTestRuns(testPartialPath, testName, dbDriver); let dbModel: EntityInfo[] = []; switch (testName) { - case '144': - dbModel = await dataCollectionPhase(driver, Object.assign(connectionOptions, { databaseName: 'db1,db2' })); + case "144": + dbModel = await dataCollectionPhase( + driver, + Object.assign(connectionOptions, { + databaseName: "db1,db2" + }) + ); break; default: - dbModel = await dataCollectionPhase(driver, connectionOptions); + dbModel = await dataCollectionPhase( + driver, + connectionOptions + ); break; } - dbModel = modelCustomizationPhase(dbModel, generationOptions, driver.defaultValues); + dbModel = modelCustomizationPhase( + dbModel, + generationOptions, + driver.defaultValues + ); modelGenerationPhase(connectionOptions, generationOptions, dbModel); - const filesGenPath = path.resolve(resultsPath, 'entities'); + const filesGenPath = path.resolve(resultsPath, "entities"); compareGeneratedFiles(filesOrgPathTS, filesGenPath); - return { dbModel, generationOptions, connectionOptions, resultsPath, filesOrgPathTS, dbDriver }; - }) - await Promise.all(modelGenerationPromises) + return { + dbModel, + generationOptions, + connectionOptions, + resultsPath, + filesOrgPathTS, + dbDriver + }; + }); + await Promise.all(modelGenerationPromises); compileGeneratedModel(path.resolve(process.cwd(), `output`), dbDrivers); }); function selectDriversForSpecyficTest() { switch (testName) { - case '39': - return dbDrivers.filter(dbDriver => !['mysql', 'mariadb', 'oracle', 'sqlite'].includes(dbDriver)) - case '144': - return dbDrivers.filter(dbDriver => ['mysql', 'mariadb'].includes(dbDriver)) + case "39": + return dbDrivers.filter( + dbDriver => + !["mysql", "mariadb", "oracle", "sqlite"].includes( + dbDriver + ) + ); + case "144": + return dbDrivers.filter(dbDriver => + ["mysql", "mariadb"].includes(dbDriver) + ); default: return dbDrivers; } } } -async function runTest(dbDrivers: string[], testPartialPath: string, files: string[]) { - - const modelGenerationPromises = dbDrivers.filter(driver => files.includes(driver)) +async function runTest( + dbDrivers: string[], + testPartialPath: string, + files: string[] +) { + const modelGenerationPromises = dbDrivers + .filter(driver => files.includes(driver)) .map(async dbDriver => { - const { generationOptions, driver, connectionOptions, resultsPath, filesOrgPathTS } = await prepareTestRuns(testPartialPath, dbDriver, dbDriver); + const { + generationOptions, + driver, + connectionOptions, + resultsPath, + filesOrgPathTS + } = await prepareTestRuns(testPartialPath, dbDriver, dbDriver); let dbModel = await dataCollectionPhase(driver, connectionOptions); - dbModel = modelCustomizationPhase(dbModel, generationOptions, driver.defaultValues); + dbModel = modelCustomizationPhase( + dbModel, + generationOptions, + driver.defaultValues + ); modelGenerationPhase(connectionOptions, generationOptions, dbModel); - const filesGenPath = path.resolve(resultsPath, 'entities'); + const filesGenPath = path.resolve(resultsPath, "entities"); compareGeneratedFiles(filesOrgPathTS, filesGenPath); - return { dbModel, generationOptions, connectionOptions, resultsPath, filesOrgPathTS, dbDriver }; - }) - await Promise.all(modelGenerationPromises) + return { + dbModel, + generationOptions, + connectionOptions, + resultsPath, + filesOrgPathTS, + dbDriver + }; + }); + await Promise.all(modelGenerationPromises); compileGeneratedModel(path.resolve(process.cwd(), `output`), dbDrivers); } function compareGeneratedFiles(filesOrgPathTS: string, filesGenPath: string) { - const filesOrg = fs.readdirSync(filesOrgPathTS).filter((val) => val.toString().endsWith('.ts')); - const filesGen = fs.readdirSync(filesGenPath).filter((val) => val.toString().endsWith('.ts')); - expect(filesOrg, 'Errors detected in model comparision').to.be.deep.equal(filesGen); + const filesOrg = fs + .readdirSync(filesOrgPathTS) + .filter(val => val.toString().endsWith(".ts")); + const filesGen = fs + .readdirSync(filesGenPath) + .filter(val => val.toString().endsWith(".ts")); + expect(filesOrg, "Errors detected in model comparision").to.be.deep.equal( + filesGen + ); for (const file of filesOrg) { const entftj = new EntityFileToJson(); - const jsonEntityOrg = entftj.convert(fs.readFileSync(path.resolve(filesOrgPathTS, file))); - const jsonEntityGen = entftj.convert(fs.readFileSync(path.resolve(filesGenPath, file))); - expect(jsonEntityGen, `Error in file ${file}`).to.containSubset(jsonEntityOrg); + const jsonEntityOrg = entftj.convert( + fs.readFileSync(path.resolve(filesOrgPathTS, file)) + ); + const jsonEntityGen = entftj.convert( + fs.readFileSync(path.resolve(filesGenPath, file)) + ); + expect(jsonEntityGen, `Error in file ${file}`).to.containSubset( + jsonEntityOrg + ); } } @@ -131,9 +209,17 @@ function compileGeneratedModel(filesGenPath: string, drivers: string[]) { let currentDirectoryFiles: string[] = []; drivers.forEach(driver => { const entitiesPath = path.resolve(filesGenPath, driver, "entities"); - if (fs.existsSync(entitiesPath)){ - currentDirectoryFiles.push(...fs.readdirSync(entitiesPath). - filter(fileName => fileName.length >= 3 && fileName.substr(fileName.length - 3, 3) === ".ts").map(v => path.resolve(filesGenPath, driver, "entities", v))); + if (fs.existsSync(entitiesPath)) { + currentDirectoryFiles.push( + ...fs + .readdirSync(entitiesPath) + .filter( + fileName => + fileName.length >= 3 && + fileName.substr(fileName.length - 3, 3) === ".ts" + ) + .map(v => path.resolve(filesGenPath, driver, "entities", v)) + ); } }); const compileErrors = GTU.compileTsFiles(currentDirectoryFiles, { @@ -144,50 +230,64 @@ function compileGeneratedModel(filesGenPath: string, drivers: string[]) { moduleResolution: ts.ModuleResolutionKind.NodeJs, module: ts.ModuleKind.CommonJS }); - expect(compileErrors, 'Errors detected while compiling generated model').to.be.false; + expect(compileErrors, "Errors detected while compiling generated model").to + .be.false; } -async function prepareTestRuns(testPartialPath: string, testName: string, dbDriver: string) { - const filesOrgPathJS = path.resolve(process.cwd(), testPartialPath, testName, 'entity'); - const filesOrgPathTS = path.resolve(process.cwd(), testPartialPath, testName, 'entity'); +async function prepareTestRuns( + testPartialPath: string, + testName: string, + dbDriver: string +) { + const filesOrgPathJS = path.resolve( + process.cwd(), + testPartialPath, + testName, + "entity" + ); + const filesOrgPathTS = path.resolve( + process.cwd(), + testPartialPath, + testName, + "entity" + ); const resultsPath = path.resolve(process.cwd(), `output`, dbDriver); fs.removeSync(resultsPath); const driver = createDriver(dbDriver); const generationOptions = GTU.getGenerationOptions(resultsPath); switch (testName) { - case '65': + case "65": generationOptions.relationIds = true; break; - case 'sample18-lazy-relations': + case "sample18-lazy-relations": generationOptions.lazy = true; break; - case '144': - + case "144": let connectionOptions: IConnectionOptions; switch (dbDriver) { - case 'mysql': + case "mysql": connectionOptions = { host: String(process.env.MYSQL_Host), port: Number(process.env.MYSQL_Port), databaseName: String(process.env.MYSQL_Database), user: String(process.env.MYSQL_Username), password: String(process.env.MYSQL_Password), - databaseType: 'mysql', - schemaName: 'ignored', - ssl: yn(process.env.MYSQL_SSL), - } + databaseType: "mysql", + schemaName: "ignored", + ssl: yn(process.env.MYSQL_SSL) + }; break; - case 'mariadb': + case "mariadb": connectionOptions = { host: String(process.env.MARIADB_Host), port: Number(process.env.MARIADB_Port), databaseName: String(process.env.MARIADB_Database), user: String(process.env.MARIADB_Username), password: String(process.env.MARIADB_Password), - databaseType: 'mariadb', - schemaName: 'ignored', - ssl: yn(process.env.MARIADB_SSL), - } + databaseType: "mariadb", + schemaName: "ignored", + ssl: yn(process.env.MARIADB_SSL) + }; break; default: @@ -195,18 +295,26 @@ async function prepareTestRuns(testPartialPath: string, testName: string, dbDriv } await driver.ConnectToServer(connectionOptions!); - if (! await driver.CheckIfDBExists('db1')) { - var x = await driver.CreateDB('db1') + if (!(await driver.CheckIfDBExists("db1"))) { + var x = await driver.CreateDB("db1"); } - if (! await driver.CheckIfDBExists('db2')) { - var t = await driver.CreateDB('db2') + if (!(await driver.CheckIfDBExists("db2"))) { + var t = await driver.CreateDB("db2"); } await driver.DisconnectFromServer(); break; default: break; } - const connectionOptions = await GTU.createModelsInDb(dbDriver, filesOrgPathJS); - return { generationOptions, driver, connectionOptions, resultsPath, filesOrgPathTS }; + const connectionOptions = await GTU.createModelsInDb( + dbDriver, + filesOrgPathJS + ); + return { + generationOptions, + driver, + connectionOptions, + resultsPath, + filesOrgPathTS + }; } - diff --git a/test/utils/GeneralTestUtils.ts b/test/utils/GeneralTestUtils.ts index b85b720..9ddc00e 100644 --- a/test/utils/GeneralTestUtils.ts +++ b/test/utils/GeneralTestUtils.ts @@ -1,35 +1,36 @@ -import path = require('path') +import path = require("path"); import { ConnectionOptions, createConnection } from "typeorm"; import * as ts from "typescript"; -import * as yn from "yn" -import { AbstractDriver } from "../../src/drivers/AbstractDriver"; -import { MariaDbDriver } from "../../src/drivers/MariaDbDriver"; -import { MssqlDriver } from "../../src/drivers/MssqlDriver"; -import { MysqlDriver } from "../../src/drivers/MysqlDriver"; -import { OracleDriver } from "../../src/drivers/OracleDriver"; -import { PostgresDriver } from "../../src/drivers/PostgresDriver"; -import { SqliteDriver } from "../../src/drivers/SqliteDriver"; -import { IConnectionOptions } from "../../src/IConnectionOptions"; -import { IGenerationOptions } from "../../src/IGenerationOptions"; +import * as yn from "yn"; +import IGenerationOptions from "../../src/IGenerationOptions"; +import IConnectionOptions from "../../src/IConnectionOptions"; +import AbstractDriver from "../../src/drivers/AbstractDriver"; +import MssqlDriver from "../../src/drivers/MssqlDriver"; +import MariaDbDriver from "../../src/drivers/MariaDbDriver"; +import PostgresDriver from "../../src/drivers/PostgresDriver"; +import SqliteDriver from "../../src/drivers/SqliteDriver"; +import OracleDriver from "../../src/drivers/OracleDriver"; +import MysqlDriver from "../../src/drivers/MysqlDriver"; export function getGenerationOptions(resultsPath: string): IGenerationOptions { return { resultsPath: resultsPath, noConfigs: false, - convertCaseEntity: 'none', - convertCaseFile: 'none', - convertCaseProperty: 'none', - propertyVisibility: 'none', + convertCaseEntity: "none", + convertCaseFile: "none", + convertCaseProperty: "none", + propertyVisibility: "none", lazy: false, generateConstructor: false, customNamingStrategyPath: "", relationIds: false, activeRecord: false - } + }; } -export async function createMSSQLModels(filesOrgPath: string): Promise { - +export async function createMSSQLModels( + filesOrgPath: string +): Promise { let driver: AbstractDriver; driver = new MssqlDriver(); const connectionOptions: IConnectionOptions = { @@ -38,10 +39,10 @@ export async function createMSSQLModels(filesOrgPath: string): Promise { +export async function createPostgresModels( + filesOrgPath: string +): Promise { let driver: AbstractDriver; driver = new PostgresDriver(); const connectionOptions: IConnectionOptions = { @@ -88,10 +91,10 @@ export async function createPostgresModels(filesOrgPath: string): Promise { +export async function createSQLiteModels( + filesOrgPath: string +): Promise { let driver: AbstractDriver; driver = new SqliteDriver(); const connectionOptions: IConnectionOptions = { - host: '', + host: "", port: 0, databaseName: String(process.env.SQLITE_Database), - user: '', - password: '', - databaseType: 'sqlite', - schemaName: '', - ssl: false, - } + user: "", + password: "", + databaseType: "sqlite", + schemaName: "", + ssl: false + }; await driver.ConnectToServer(connectionOptions); if (await driver.CheckIfDBExists(String(process.env.SQLITE_Database))) { @@ -152,24 +157,26 @@ export async function createSQLiteModels(filesOrgPath: string): Promise { +export async function createMysqlModels( + filesOrgPath: string +): Promise { let driver: AbstractDriver; driver = new MysqlDriver(); const connectionOptions: IConnectionOptions = { @@ -178,10 +185,10 @@ export async function createMysqlModels(filesOrgPath: string): Promise { +export async function createMariaDBModels( + filesOrgPath: string +): Promise { let driver: AbstractDriver; driver = new MariaDbDriver(); const connectionOptions: IConnectionOptions = { @@ -219,10 +228,10 @@ export async function createMariaDBModels(filesOrgPath: string): Promise { +export async function createOracleDBModels( + filesOrgPath: string +): Promise { let driver: AbstractDriver; driver = new OracleDriver(); @@ -262,13 +273,13 @@ export async function createOracleDBModels(filesOrgPath: string): Promise { - const lineAndCharacter = diagnostic.file!.getLineAndCharacterOfPosition(diagnostic.start!); - const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'); - console.log(`${diagnostic.file!.fileName} (${lineAndCharacter.line + 1},${lineAndCharacter.character + 1}): ${message}`); + const lineAndCharacter = diagnostic.file!.getLineAndCharacterOfPosition( + diagnostic.start! + ); + const message = ts.flattenDiagnosticMessageText( + diagnostic.messageText, + "\n" + ); + console.log( + `${diagnostic.file!.fileName} (${lineAndCharacter.line + + 1},${lineAndCharacter.character + 1}): ${message}` + ); compileErrors = true; }); @@ -317,40 +339,43 @@ export function compileTsFiles(fileNames: string[], options: ts.CompilerOptions) export function getEnabledDbDrivers() { const dbDrivers: string[] = []; - if (process.env.SQLITE_Skip == '0') { - dbDrivers.push('sqlite'); + if (process.env.SQLITE_Skip == "0") { + dbDrivers.push("sqlite"); } - if (process.env.POSTGRES_Skip == '0') { - dbDrivers.push('postgres'); + if (process.env.POSTGRES_Skip == "0") { + dbDrivers.push("postgres"); } - if (process.env.MYSQL_Skip == '0') { - dbDrivers.push('mysql'); + if (process.env.MYSQL_Skip == "0") { + dbDrivers.push("mysql"); } - if (process.env.MARIADB_Skip == '0') { - dbDrivers.push('mariadb'); + if (process.env.MARIADB_Skip == "0") { + dbDrivers.push("mariadb"); } - if (process.env.MSSQL_Skip == '0') { - dbDrivers.push('mssql'); + if (process.env.MSSQL_Skip == "0") { + dbDrivers.push("mssql"); } - if (process.env.ORACLE_Skip == '0') { - dbDrivers.push('oracle'); + if (process.env.ORACLE_Skip == "0") { + dbDrivers.push("oracle"); } return dbDrivers; } -export function createModelsInDb(dbDriver: string, filesOrgPathJS: string): Promise { +export function createModelsInDb( + dbDriver: string, + filesOrgPathJS: string +): Promise { switch (dbDriver) { - case 'sqlite': + case "sqlite": return createSQLiteModels(filesOrgPathJS); - case 'postgres': + case "postgres": return createPostgresModels(filesOrgPathJS); - case 'mysql': + case "mysql": return createMysqlModels(filesOrgPathJS); - case 'mariadb': + case "mariadb": return createMariaDBModels(filesOrgPathJS); - case 'mssql': + case "mssql": return createMSSQLModels(filesOrgPathJS); - case 'oracle': + case "oracle": return createOracleDBModels(filesOrgPathJS); default: console.log(`Unknown engine type`); From 52fa711c077ec638a2eda78797b28b42c3203d79 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Mon, 12 Aug 2019 17:32:28 +0200 Subject: [PATCH 19/20] switch to eslint-typescript from deprecated tslint (part2) --- .eslintignore | 5 + .eslintrc.js | 14 +- package-lock.json | 15 + package.json | 3 +- src/typings.d.ts | 4 - test/drivers/MssqlDriver.test.ts | 36 +- test/integration/runTestsFromPath.test.ts | 48 +- test/utils/EntityFileToJson.ts | 736 +++++++++++++--------- test/utils/GeneralTestUtils.ts | 65 +- 9 files changed, 549 insertions(+), 377 deletions(-) create mode 100644 .eslintignore delete mode 100644 src/typings.d.ts diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..44ccaa3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ + +test/integration/defaultValues/**/*.ts +test/integration/entityTypes/**/*.ts +test/integration/examples/**/*.ts +test/integration/github-issues/**/*.ts \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 4d6e44e..b2ae4ed 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,7 @@ module.exports = { env: { - node: true + node: true, + mocha: true }, extends: [ "airbnb-base", @@ -39,5 +40,14 @@ module.exports = { extensions: [".js", ".jsx", ".ts", ".tsx"] } } - } + }, + overrides: [ + { + files: ["**/*.test.ts"], + rules: { + "no-unused-expressions": "off", + "func-names": "off" + } + } + ] }; diff --git a/package-lock.json b/package-lock.json index f9fa7c6..adc8543 100644 --- a/package-lock.json +++ b/package-lock.json @@ -382,6 +382,15 @@ "integrity": "sha512-UVjo2oH79aRNcsDlFlnQ/iJ67Jd7j6uSg7jUJP/RZ/nUjAh5ElmnwlD5K/6eGgETJUgCHkiWn91B8JjXQ6ubAw==", "dev": true }, + "@types/yn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/yn/-/yn-3.1.0.tgz", + "integrity": "sha512-Qs2tU/syFYlALjR3EoT+NcvpMwAd6voSiDxW+c8bhAN1WbzQUnRfWTmttORf4R1WqDUT+dvHKj+llupSxs0O/w==", + "dev": true, + "requires": { + "yn": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", @@ -3859,6 +3868,12 @@ } } }, + "oracledb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/oracledb/-/oracledb-4.0.0.tgz", + "integrity": "sha512-5yB1QR36TrO0hDe6BfSYWVZgfMLOaS7TJ1+iT9qvcmXTQacfUFeAHRVWu2XM4+Adpy8JhxSHQPXXp5+iJ0waug==", + "dev": true + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", diff --git a/package.json b/package.json index 63a5217..cf0d644 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "start": "ts-node ./src/index.ts", "pretest": "tsc --noEmit", "test": "nyc --reporter=lcov ts-node ./node_modules/mocha/bin/_mocha test/**/*.test.ts -- -R spec --bail", - "posttest": "eslint ./src/*.ts ./src/**/*.ts", + "posttest": "eslint ./**/*.ts ./src/**/*.ts ./test/**/*.ts", "clean": "rimraf coverage output", "prettier": "prettier --write ./src/*.ts ./src/**/*.ts" }, @@ -53,6 +53,7 @@ "@types/sinon": "^7.0.13", "@types/sqlite3": "^3.1.5", "@types/yargs": "^12.0.1", + "@types/yn": "^3.1.0", "@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/parser": "^1.13.0", "@typescript-eslint/typescript-estree": "^1.13.0", diff --git a/src/typings.d.ts b/src/typings.d.ts deleted file mode 100644 index 4b3471f..0000000 --- a/src/typings.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module "*.json" { - const value: any; - export default value; -} diff --git a/test/drivers/MssqlDriver.test.ts b/test/drivers/MssqlDriver.test.ts index c9b3640..4a15204 100644 --- a/test/drivers/MssqlDriver.test.ts +++ b/test/drivers/MssqlDriver.test.ts @@ -1,6 +1,5 @@ import { expect } from "chai"; import * as MSSQL from "mssql"; -import { IColumnMetadata, Table } from "mssql"; import * as Sinon from "sinon"; import MssqlDriver from "../../src/drivers/MssqlDriver"; import EntityInfo from "../../src/models/EntityInfo"; @@ -8,17 +7,22 @@ import ColumnInfo from "../../src/models/ColumnInfo"; import IndexInfo from "../../src/models/IndexInfo"; import RelationInfo from "../../src/models/RelationInfo"; -class fakeResponse implements MSSQL.IResult { - public recordsets: Array>; - public recordset: MSSQL.IRecordSet; - public rowsAffected: number[]; - public output: { [key: string]: any }; +interface FakeResponse extends MSSQL.IResult { + recordsets: MSSQL.IRecordSet[]; + + recordset: MSSQL.IRecordSet; + + rowsAffected: number[]; + + output: { [key: string]: any }; } -class fakeRecordset extends Array implements MSSQL.IRecordSet { - public columns: IColumnMetadata; - public toTable(): Table { - return new Table(); +class FakeRecordset extends Array implements MSSQL.IRecordSet { + public columns: MSSQL.IColumnMetadata; + + // eslint-disable-next-line class-methods-use-this + public toTable(): MSSQL.Table { + return new MSSQL.Table(); } } @@ -36,9 +40,9 @@ describe("MssqlDriver", function() { it("should get tables info", async () => { sandbox.stub(MSSQL, "Request").returns({ - query: q => { - const response = new fakeResponse(); - response.recordset = new fakeRecordset(); + query: () => { + const response = {} as FakeResponse; + response.recordset = new FakeRecordset(); response.recordset.push({ TABLE_SCHEMA: "schema", TABLE_NAME: "name" @@ -60,9 +64,9 @@ describe("MssqlDriver", function() { }); it("should get columns info", async () => { sandbox.stub(MSSQL, "Request").returns({ - query: q => { - const response = new fakeResponse(); - response.recordset = new fakeRecordset(); + query: () => { + const response = {} as FakeResponse; + response.recordset = new FakeRecordset(); response.recordset.push({ TABLE_NAME: "name", CHARACTER_MAXIMUM_LENGTH: 0, diff --git a/test/integration/runTestsFromPath.test.ts b/test/integration/runTestsFromPath.test.ts index e6ca1af..47674a5 100644 --- a/test/integration/runTestsFromPath.test.ts +++ b/test/integration/runTestsFromPath.test.ts @@ -1,23 +1,24 @@ -require("dotenv").config(); import "reflect-metadata"; import { expect } from "chai"; -import fs = require("fs-extra"); -import path = require("path"); -import { EntityFileToJson } from "../utils/EntityFileToJson"; +import * as ts from "typescript"; +import EntityFileToJson from "../utils/EntityFileToJson"; import { createDriver, - createModelFromDatabase, dataCollectionPhase, modelCustomizationPhase, modelGenerationPhase } from "../../src/Engine"; -import * as ts from "typescript"; import * as GTU from "../utils/GeneralTestUtils"; +import EntityInfo from "../../src/models/EntityInfo"; +import IConnectionOptions from "../../src/IConnectionOptions"; + +import fs = require("fs-extra"); +import path = require("path"); import chaiSubset = require("chai-subset"); import chai = require("chai"); import yn = require("yn"); -import EntityInfo from "../../src/models/EntityInfo"; -import IConnectionOptions from "../../src/IConnectionOptions"; + +require("dotenv").config(); chai.use(chaiSubset); @@ -37,16 +38,16 @@ describe("GitHub issues", async function() { this.timeout(60000); this.slow(10000); // compiling created models takes time const testPartialPath = "test/integration/github-issues"; - runTestsFromPath(testPartialPath, false); + await runTestsFromPath(testPartialPath, false); }); describe("TypeOrm examples", async function() { this.timeout(60000); this.slow(10000); // compiling created models takes time const testPartialPath = "test/integration/examples"; - runTestsFromPath(testPartialPath, false); + await runTestsFromPath(testPartialPath, false); }); -export async function runTestsFromPath( +async function runTestsFromPath( testPartialPath: string, isDbSpecific: boolean ) { @@ -55,21 +56,22 @@ export async function runTestsFromPath( fs.mkdirSync(resultsPath); } const dbDrivers: string[] = GTU.getEnabledDbDrivers(); - for (const dbDriver of dbDrivers) { + dbDrivers.forEach(dbDriver => { const newDirPath = path.resolve(resultsPath, dbDriver); if (!fs.existsSync(newDirPath)) { fs.mkdirSync(newDirPath); } - } + }); const files = fs.readdirSync(path.resolve(process.cwd(), testPartialPath)); if (isDbSpecific) { await runTest(dbDrivers, testPartialPath, files); } else { - for (const folder of files) { + files.forEach(folder => { runTestForMultipleDrivers(folder, dbDrivers, testPartialPath); - } + }); } } + function runTestForMultipleDrivers( testName: string, dbDrivers: string[], @@ -191,22 +193,21 @@ function compareGeneratedFiles(filesOrgPathTS: string, filesGenPath: string) { expect(filesOrg, "Errors detected in model comparision").to.be.deep.equal( filesGen ); - for (const file of filesOrg) { - const entftj = new EntityFileToJson(); - const jsonEntityOrg = entftj.convert( + filesOrg.forEach(file => { + const jsonEntityOrg = EntityFileToJson.convert( fs.readFileSync(path.resolve(filesOrgPathTS, file)) ); - const jsonEntityGen = entftj.convert( + const jsonEntityGen = EntityFileToJson.convert( fs.readFileSync(path.resolve(filesGenPath, file)) ); expect(jsonEntityGen, `Error in file ${file}`).to.containSubset( jsonEntityOrg ); - } + }); } function compileGeneratedModel(filesGenPath: string, drivers: string[]) { - let currentDirectoryFiles: string[] = []; + const currentDirectoryFiles: string[] = []; drivers.forEach(driver => { const entitiesPath = path.resolve(filesGenPath, driver, "entities"); if (fs.existsSync(entitiesPath)) { @@ -263,6 +264,7 @@ async function prepareTestRuns( generationOptions.lazy = true; break; case "144": + // eslint-disable-next-line no-case-declarations let connectionOptions: IConnectionOptions; switch (dbDriver) { case "mysql": @@ -296,10 +298,10 @@ async function prepareTestRuns( await driver.ConnectToServer(connectionOptions!); if (!(await driver.CheckIfDBExists("db1"))) { - var x = await driver.CreateDB("db1"); + await driver.CreateDB("db1"); } if (!(await driver.CheckIfDBExists("db2"))) { - var t = await driver.CreateDB("db2"); + await driver.CreateDB("db2"); } await driver.DisconnectFromServer(); break; diff --git a/test/utils/EntityFileToJson.ts b/test/utils/EntityFileToJson.ts index 237ec8f..981c10c 100644 --- a/test/utils/EntityFileToJson.ts +++ b/test/utils/EntityFileToJson.ts @@ -1,361 +1,515 @@ -export class EntityFileToJson { - public getEntityOptions(trimmedLine: string, ent: EntityJson) { - const decoratorParameters = trimmedLine.slice(trimmedLine.indexOf('(') + 1, trimmedLine.lastIndexOf(')')) +/* eslint-disable max-classes-per-file */ +class EntityJson { + public entityName: string; + + public entityOptions: any = {}; + + public columns: EntityColumn[] = [] as EntityColumn[]; + + public indicies: EntityIndex[] = [] as EntityIndex[]; +} +class EntityColumn { + public columnName: string; + + public columnTypes: string[] = []; + + public columnOptions: any = {}; + + public relationType: + | "OneToOne" + | "OneToMany" + | "ManyToOne" + | "ManyToMany" + | "None" = "None"; + + public isOwnerOfRelation: boolean = false; +} +class EntityIndex { + public indexName: string; + + public columnNames: string[] = []; + + public isUnique: boolean = false; +} + +export default class EntityFileToJson { + public static getEntityOptions(trimmedLine: string, ent: EntityJson) { + const decoratorParameters = trimmedLine.slice( + trimmedLine.indexOf("(") + 1, + trimmedLine.lastIndexOf(")") + ); if (decoratorParameters.length > 0) { - if (decoratorParameters[0] != '"' || !decoratorParameters.endsWith('"')) { - let badJSON = decoratorParameters.substring(decoratorParameters.indexOf(',') + 1).trim() - if (badJSON.lastIndexOf(',') == badJSON.length - 3) { - badJSON = badJSON.slice(0, badJSON.length - 3) + badJSON[badJSON.length - 2] + badJSON[badJSON.length - 1] + if ( + decoratorParameters[0] !== '"' || + !decoratorParameters.endsWith('"') + ) { + let badJSON = decoratorParameters + .substring(decoratorParameters.indexOf(",") + 1) + .trim(); + if (badJSON.lastIndexOf(",") === badJSON.length - 3) { + badJSON = + badJSON.slice(0, badJSON.length - 3) + + badJSON[badJSON.length - 2] + + badJSON[badJSON.length - 1]; } - ent.entityOptions = JSON.parse(badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) + ent.entityOptions = JSON.parse( + badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + ); } } } - public getColumnOptionsAndType(trimmedLine: string, col: EntityColumn) { - const decoratorParameters = trimmedLine.slice(trimmedLine.indexOf('(') + 1, trimmedLine.lastIndexOf(')')) - const primaryGeneratedColumn = trimmedLine.substring(0, trimmedLine.indexOf('('))=='@PrimaryGeneratedColumn' + + public static getColumnOptionsAndType( + trimmedLine: string, + col: EntityColumn + ) { + const decoratorParameters = trimmedLine.slice( + trimmedLine.indexOf("(") + 1, + trimmedLine.lastIndexOf(")") + ); + const primaryGeneratedColumn = + trimmedLine.substring(0, trimmedLine.indexOf("(")) === + "@PrimaryGeneratedColumn"; if (decoratorParameters.length > 0) { - if (decoratorParameters.search(',') > 0 && !primaryGeneratedColumn) { - col.columnTypes = decoratorParameters.substring(0, decoratorParameters.indexOf(',')).trim().split('|'); - let badJSON = decoratorParameters.substring(decoratorParameters.indexOf(',') + 1).trim() - if (badJSON.lastIndexOf(',') == badJSON.length - 3) { - badJSON = badJSON.slice(0, badJSON.length - 3) + badJSON[badJSON.length - 2] + badJSON[badJSON.length - 1] + if ( + decoratorParameters.search(",") > 0 && + !primaryGeneratedColumn + ) { + col.columnTypes = decoratorParameters + .substring(0, decoratorParameters.indexOf(",")) + .trim() + .split("|"); + let badJSON = decoratorParameters + .substring(decoratorParameters.indexOf(",") + 1) + .trim(); + if (badJSON.lastIndexOf(",") === badJSON.length - 3) { + badJSON = + badJSON.slice(0, badJSON.length - 3) + + badJSON[badJSON.length - 2] + + badJSON[badJSON.length - 1]; } - badJSON = badJSON.replace(/default: \(\) => (.*)/, `default: $1`) - col.columnOptions = JSON.parse(badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) + badJSON = badJSON.replace( + /default: \(\) => (.*)/, + `default: $1` + ); + col.columnOptions = JSON.parse( + badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + ); + } else if ( + decoratorParameters[0] === '"' && + decoratorParameters.endsWith('"') + ) { + col.columnTypes = decoratorParameters + .split("|") + .map(x => x.trim()); } else { - if (decoratorParameters[0] == '"' && decoratorParameters.endsWith('"')) { - col.columnTypes = decoratorParameters.split('|').map( x=>x.trim()) - } else { - let badJSON = !primaryGeneratedColumn ? decoratorParameters.substring(decoratorParameters.indexOf(',') + 1) : decoratorParameters - badJSON = badJSON.trim() - if (badJSON.lastIndexOf(',') == badJSON.length - 3) { - badJSON = badJSON.slice(0, badJSON.length - 3) + badJSON[badJSON.length - 2] + badJSON[badJSON.length - 1] - } - col.columnOptions = JSON.parse(badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) + let badJSON = !primaryGeneratedColumn + ? decoratorParameters.substring( + decoratorParameters.indexOf(",") + 1 + ) + : decoratorParameters; + badJSON = badJSON.trim(); + if (badJSON.lastIndexOf(",") === badJSON.length - 3) { + badJSON = + badJSON.slice(0, badJSON.length - 3) + + badJSON[badJSON.length - 2] + + badJSON[badJSON.length - 1]; } + col.columnOptions = JSON.parse( + badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + ); } } } - public getRelationOptions(trimmedLine:string, col:EntityColumn){ - const decoratorParameters = trimmedLine.slice(trimmedLine.indexOf('(') + 1, trimmedLine.lastIndexOf(')')) - if (decoratorParameters.length > 0) { - const params = decoratorParameters.match(/(,)(?!([^{]*}))/g) - if ( params && params.length == 2) { - let badJSON = decoratorParameters.substring( decoratorParameters.lastIndexOf('{'),decoratorParameters.lastIndexOf('}')+1).trim() - if (badJSON.lastIndexOf(',') == badJSON.length - 3) { - badJSON = badJSON.slice(0, badJSON.length - 3) + badJSON[badJSON.length - 2] + badJSON[badJSON.length - 1] + + public static getRelationOptions(trimmedLine: string, col: EntityColumn) { + const decoratorParameters = trimmedLine.slice( + trimmedLine.indexOf("(") + 1, + trimmedLine.lastIndexOf(")") + ); + if (decoratorParameters.length > 0) { + const params = decoratorParameters.match(/(,)(?!([^{]*}))/g); + if (params && params.length === 2) { + let badJSON = decoratorParameters + .substring( + decoratorParameters.lastIndexOf("{"), + decoratorParameters.lastIndexOf("}") + 1 + ) + .trim(); + if (badJSON.lastIndexOf(",") === badJSON.length - 3) { + badJSON = + badJSON.slice(0, badJSON.length - 3) + + badJSON[badJSON.length - 2] + + badJSON[badJSON.length - 1]; } - col.columnOptions = JSON.parse(badJSON.replace(/(')/g,`"`).replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) + col.columnOptions = JSON.parse( + badJSON + .replace(/(')/g, `"`) + .replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + ); } } } - public getIndexOptions(trimmedLine: string, ind: EntityIndex) { - const decoratorParameters = trimmedLine.slice(trimmedLine.indexOf('(') + 1, trimmedLine.lastIndexOf(')')) + + public static getIndexOptions(trimmedLine: string, ind: EntityIndex) { + const decoratorParameters = trimmedLine.slice( + trimmedLine.indexOf("(") + 1, + trimmedLine.lastIndexOf(")") + ); if (decoratorParameters.length > 0) { - const containsTables = decoratorParameters.search('\\[') > -1 - const containsOptions = decoratorParameters.search('{') > -1 - const containsName = decoratorParameters.search('"') > -1 + const containsTables = decoratorParameters.search("\\[") > -1; + const containsOptions = decoratorParameters.search("{") > -1; + const containsName = decoratorParameters.search('"') > -1; if (containsName) { - ind.indexName = decoratorParameters.slice(decoratorParameters.indexOf('"') + 1, decoratorParameters.substr(decoratorParameters.indexOf('"') + 1).indexOf('"')) + ind.indexName = decoratorParameters.slice( + decoratorParameters.indexOf('"') + 1, + decoratorParameters + .substr(decoratorParameters.indexOf('"') + 1) + .indexOf('"') + ); } if (containsTables) { - const columnsStr = decoratorParameters.slice(decoratorParameters.indexOf('[') + 1, decoratorParameters.indexOf(']')) - ind.columnNames.push(...columnsStr.split(',').map((val) => { - let colName = '' - if (val.search('\\.') > -1) { - colName = val.split('.')[1] - } else { - colName = val.slice(val.indexOf('"') + 1, val.lastIndexOf('"')) - } - return colName - }).filter(v => v.length > 0)) + const columnsStr = decoratorParameters.slice( + decoratorParameters.indexOf("[") + 1, + decoratorParameters.indexOf("]") + ); + ind.columnNames.push( + ...columnsStr + .split(",") + .map(val => { + let colName = ""; + if (val.search("\\.") > -1) { + [, colName] = val.split("."); + } else { + colName = val.slice( + val.indexOf('"') + 1, + val.lastIndexOf('"') + ); + } + return colName; + }) + .filter(v => v.length > 0) + ); } if (containsOptions) { - const optionsStr = decoratorParameters.slice(decoratorParameters.indexOf('{') + 1, decoratorParameters.indexOf('}')) - optionsStr.split(',').forEach((v) => { - if (v.split(':').length - 1 > 0) { - switch (optionsStr.split(':')[0].trim()) { + const optionsStr = decoratorParameters.slice( + decoratorParameters.indexOf("{") + 1, + decoratorParameters.indexOf("}") + ); + optionsStr.split(",").forEach(v => { + if (v.split(":").length - 1 > 0) { + switch (optionsStr.split(":")[0].trim()) { case "unique": - ind.isUnique = optionsStr.split(':')[1].trim() == 'true' ? true : false; + ind.isUnique = + optionsStr.split(":")[1].trim() === "true"; break; default: - console.log(`[EntityFileToJson:convert] Index option not recognized ${ind.indexName}:`) - console.log(`${optionsStr}`) + console.log( + `[EntityFileToJson:convert] Index option not recognized ${ind.indexName}:` + ); + console.log(`${optionsStr}`); break; } } - }) + }); } } } - public convert(entityFile: Buffer): EntityJson { + public static convert(entityFile: Buffer): EntityJson { const retVal = new EntityJson(); let isInClassBody = false; let isMultilineStatement = false; - let priorPartOfMultilineStatement = ''; + let priorPartOfMultilineStatement = ""; - const lines = entityFile.toString().replace('\r', '').split('\n'); - for (const line of lines) { + const lines = entityFile + .toString() + .replace("\r", "") + .split("\n"); + lines.forEach(line => { let trimmedLine = line.trim(); - if (trimmedLine.startsWith('//')) { - continue; + if (trimmedLine.startsWith("//")) { + return; } if (isMultilineStatement) { - trimmedLine = priorPartOfMultilineStatement + ' ' + trimmedLine + trimmedLine = `${priorPartOfMultilineStatement} ${trimmedLine}`; } - if (trimmedLine.length == 0) { - continue; + if (trimmedLine.length === 0) { + return; } - else if (!isInClassBody) { - if (trimmedLine.startsWith('import')) { - continue; - } else if (trimmedLine.startsWith('@Entity')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { + if (!isInClassBody) { + if (trimmedLine.startsWith("import")) { + return; + } + if (trimmedLine.startsWith("@Entity")) { + if ( + EntityFileToJson.isPartOfMultilineStatement(trimmedLine) + ) { isMultilineStatement = true; priorPartOfMultilineStatement = trimmedLine; - continue; } else { - this.getEntityOptions(trimmedLine, retVal); - continue; + EntityFileToJson.getEntityOptions(trimmedLine, retVal); } - } else if (trimmedLine.startsWith('export class')) { - retVal.entityName = trimmedLine.substring(trimmedLine.indexOf('class') + 5, trimmedLine.lastIndexOf('{')).trim().toLowerCase() + return; + } + if (trimmedLine.startsWith("export class")) { + retVal.entityName = trimmedLine + .substring( + trimmedLine.indexOf("class") + 5, + trimmedLine.lastIndexOf("{") + ) + .trim() + .toLowerCase(); isInClassBody = true; - continue; - } else if (trimmedLine.startsWith('@Index')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const ind = new EntityIndex() - this.getIndexOptions(trimmedLine, ind) - retVal.indicies.push(ind); - continue; - } + return; } - } else { - if (trimmedLine.startsWith('@Column')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { + if (trimmedLine.startsWith("@Index")) { + if ( + EntityFileToJson.isPartOfMultilineStatement(trimmedLine) + ) { isMultilineStatement = true; priorPartOfMultilineStatement = trimmedLine; - continue; } else { isMultilineStatement = false; - const col = new EntityColumn() - this.getColumnOptionsAndType(trimmedLine, col) - retVal.columns.push(col); - continue; - } - } else if (trimmedLine.startsWith('@PrimaryColumn')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const col = new EntityColumn() - this.getColumnOptionsAndType(trimmedLine, col) - col.columnOptions.primary = true - retVal.columns.push(col); - continue; - } - } else if (trimmedLine.startsWith('@VersionColumn')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const col = new EntityColumn() - this.getColumnOptionsAndType(trimmedLine, col) - retVal.columns.push(col); - continue; - } - } else if (trimmedLine.startsWith('@PrimaryGeneratedColumn')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const col = new EntityColumn() - this.getColumnOptionsAndType(trimmedLine, col) - col.columnOptions.primary = true - col.columnOptions.generated = true - retVal.columns.push(col); - continue; - } - } else if (trimmedLine.startsWith('@ManyToOne')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const column = new EntityColumn() - retVal.columns.push(column) - column.relationType = "ManyToOne" - column.isOwnerOfRelation = true; - continue; - } - } else if (trimmedLine.startsWith('@OneToMany')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const column = new EntityColumn() - retVal.columns.push(column) - column.relationType = "OneToMany" - continue; - } - } else if (trimmedLine.startsWith('@ManyToMany')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const column = new EntityColumn() - retVal.columns.push(column) - column.relationType = "ManyToMany" - continue; - } - } else if (trimmedLine.startsWith('@OneToOne')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const column = new EntityColumn() - retVal.columns.push(column) - column.relationType = "OneToOne" - this.getRelationOptions(trimmedLine,column); - continue; - } - } else if (trimmedLine.startsWith('@JoinColumn')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - retVal.columns[retVal.columns.length - 1].isOwnerOfRelation = true; - continue; - } - } else if (trimmedLine.startsWith('@JoinTable')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - retVal.columns[retVal.columns.length - 1].isOwnerOfRelation = true; - continue; - } - } else if (trimmedLine.startsWith('@Index')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - const ind = new EntityIndex() - this.getIndexOptions(trimmedLine, ind) + const ind = new EntityIndex(); + EntityFileToJson.getIndexOptions(trimmedLine, ind); retVal.indicies.push(ind); - continue; } - } else if (trimmedLine.startsWith('constructor')) { - if (this.isPartOfMultilineStatement(trimmedLine)) { - isMultilineStatement = true; - priorPartOfMultilineStatement = trimmedLine; - continue; - } else { - isMultilineStatement = false; - continue; - } - } else if (trimmedLine.split(':').length - 1 > 0) { - retVal.columns[retVal.columns.length - 1].columnName = trimmedLine.split(':')[0].trim(); - // TODO:Should check if null only column is nullable? - let colTypes=trimmedLine.split(':')[1].split(';')[0].trim(); - if (colTypes.startsWith('Promise<')) { - colTypes=colTypes.substring(8,colTypes.length-1) - retVal.columns[retVal.columns.length - 1].columnOptions.isLazy=true; - } - retVal.columns[retVal.columns.length - 1].columnTypes = colTypes.split('|').map(function (x) { - if (x == 'any') { - x = 'string' // for json columns - } - x = x.trim(); - return x; - }); - - if (!retVal.columns[retVal.columns.length - 1].columnTypes.some( (val) => val == "null" ? true : false)) { - retVal.columns[retVal.columns.length - 1].columnTypes.push('null') - } - if (retVal.indicies.length > 0 && retVal.indicies[retVal.indicies.length - 1].columnNames.length == 0) { - retVal.indicies[retVal.indicies.length - 1].columnNames.push(retVal.columns[retVal.columns.length - 1].columnName) - } - continue - } else if (trimmedLine == '}') { - isInClassBody = false; - continue; - } - else { - console.log(`[EntityFileToJson:convert] Line not recognized in entity ${retVal.entityName}:`) - console.log(`${trimmedLine}`) + return; } } - console.log(`[EntityFileToJson:convert] Line not recognized in entity ${retVal.entityName}:`) - console.log(`${trimmedLine}`) - } + if (trimmedLine.startsWith("@Column")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const col = new EntityColumn(); + EntityFileToJson.getColumnOptionsAndType(trimmedLine, col); + retVal.columns.push(col); + } + return; + } + if (trimmedLine.startsWith("@PrimaryColumn")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const col = new EntityColumn(); + EntityFileToJson.getColumnOptionsAndType(trimmedLine, col); + col.columnOptions.primary = true; + retVal.columns.push(col); + } + return; + } + if (trimmedLine.startsWith("@VersionColumn")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const col = new EntityColumn(); + EntityFileToJson.getColumnOptionsAndType(trimmedLine, col); + retVal.columns.push(col); + } + return; + } + if (trimmedLine.startsWith("@PrimaryGeneratedColumn")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const col = new EntityColumn(); + EntityFileToJson.getColumnOptionsAndType(trimmedLine, col); + col.columnOptions.primary = true; + col.columnOptions.generated = true; + retVal.columns.push(col); + } + return; + } + if (trimmedLine.startsWith("@ManyToOne")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const column = new EntityColumn(); + retVal.columns.push(column); + column.relationType = "ManyToOne"; + column.isOwnerOfRelation = true; + } + return; + } + if (trimmedLine.startsWith("@OneToMany")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const column = new EntityColumn(); + retVal.columns.push(column); + column.relationType = "OneToMany"; + } + return; + } + if (trimmedLine.startsWith("@ManyToMany")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const column = new EntityColumn(); + retVal.columns.push(column); + column.relationType = "ManyToMany"; + } + return; + } + if (trimmedLine.startsWith("@OneToOne")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const column = new EntityColumn(); + retVal.columns.push(column); + column.relationType = "OneToOne"; + EntityFileToJson.getRelationOptions(trimmedLine, column); + } + return; + } + if (trimmedLine.startsWith("@JoinColumn")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + retVal.columns[ + retVal.columns.length - 1 + ].isOwnerOfRelation = true; + } + return; + } + if (trimmedLine.startsWith("@JoinTable")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + retVal.columns[ + retVal.columns.length - 1 + ].isOwnerOfRelation = true; + } + return; + } + if (trimmedLine.startsWith("@Index")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + const ind = new EntityIndex(); + EntityFileToJson.getIndexOptions(trimmedLine, ind); + retVal.indicies.push(ind); + } + return; + } + if (trimmedLine.startsWith("constructor")) { + if (EntityFileToJson.isPartOfMultilineStatement(trimmedLine)) { + isMultilineStatement = true; + priorPartOfMultilineStatement = trimmedLine; + } else { + isMultilineStatement = false; + } + return; + } + if (trimmedLine.split(":").length - 1 > 0) { + retVal.columns[ + retVal.columns.length - 1 + ].columnName = trimmedLine.split(":")[0].trim(); + // TODO:Should check if null only column is nullable? + let colTypes = trimmedLine + .split(":")[1] + .split(";")[0] + .trim(); + if (colTypes.startsWith("Promise<")) { + colTypes = colTypes.substring(8, colTypes.length - 1); + retVal.columns[ + retVal.columns.length - 1 + ].columnOptions.isLazy = true; + } + retVal.columns[ + retVal.columns.length - 1 + ].columnTypes = colTypes.split("|").map(x => { + if (x === "any") { + x = "string"; // for json columns + } + x = x.trim(); + return x; + }); + + if ( + !retVal.columns[retVal.columns.length - 1].columnTypes.some( + val => val === "null" + ) + ) { + retVal.columns[retVal.columns.length - 1].columnTypes.push( + "null" + ); + } + if ( + retVal.indicies.length > 0 && + retVal.indicies[retVal.indicies.length - 1].columnNames + .length === 0 + ) { + retVal.indicies[ + retVal.indicies.length - 1 + ].columnNames.push( + retVal.columns[retVal.columns.length - 1].columnName + ); + } + return; + } + if (trimmedLine === "}") { + isInClassBody = false; + return; + } + console.log( + `[EntityFileToJson:convert] Line not recognized in entity ${retVal.entityName}:` + ); + console.log(`${trimmedLine}`); + }); retVal.columns = retVal.columns.map(col => { - if (col.columnName.endsWith('Id')) { - col.columnName = col.columnName.substr(0, col.columnName.length - 2) + if (col.columnName.endsWith("Id")) { + col.columnName = col.columnName.substr( + 0, + col.columnName.length - 2 + ); } return col; - }) + }); retVal.indicies = retVal.indicies.map(ind => { ind.columnNames = ind.columnNames.map(colName => { - if (colName.endsWith('Id')) { - colName = colName.substr(0, colName.length - 2) + if (colName.endsWith("Id")) { + colName = colName.substr(0, colName.length - 2); } return colName; - }) + }); return ind; - }) + }); return retVal; } - public isPartOfMultilineStatement(statement: string) { - const matchStarting = statement.split('(').length+statement.split('{').length - const matchEnding = statement.split(')').length+statement.split('}').length - return !(matchStarting == matchEnding) + + public static isPartOfMultilineStatement(statement: string) { + const matchStarting = + statement.split("(").length + statement.split("{").length; + const matchEnding = + statement.split(")").length + statement.split("}").length; + return !(matchStarting === matchEnding); } } -class EntityJson { - public entityName: string - public entityOptions: any = {} - public columns: EntityColumn[] = [] as EntityColumn[]; - public indicies: EntityIndex[] = [] as EntityIndex[]; -} -class EntityColumn { - public columnName: string - public columnTypes: string[] = [] - public columnOptions: any = {} - public relationType: "OneToOne" | "OneToMany" | "ManyToOne" | "ManyToMany" | "None" = "None" - public isOwnerOfRelation: boolean = false; -} -class EntityIndex { - public indexName: string - public columnNames: string[] = [] - public isUnique: boolean = false -} +/* eslint-enable max-classes-per-file */ diff --git a/test/utils/GeneralTestUtils.ts b/test/utils/GeneralTestUtils.ts index 9ddc00e..b49767b 100644 --- a/test/utils/GeneralTestUtils.ts +++ b/test/utils/GeneralTestUtils.ts @@ -1,20 +1,19 @@ -import path = require("path"); import { ConnectionOptions, createConnection } from "typeorm"; import * as ts from "typescript"; import * as yn from "yn"; import IGenerationOptions from "../../src/IGenerationOptions"; import IConnectionOptions from "../../src/IConnectionOptions"; -import AbstractDriver from "../../src/drivers/AbstractDriver"; import MssqlDriver from "../../src/drivers/MssqlDriver"; import MariaDbDriver from "../../src/drivers/MariaDbDriver"; import PostgresDriver from "../../src/drivers/PostgresDriver"; -import SqliteDriver from "../../src/drivers/SqliteDriver"; import OracleDriver from "../../src/drivers/OracleDriver"; import MysqlDriver from "../../src/drivers/MysqlDriver"; +import path = require("path"); + export function getGenerationOptions(resultsPath: string): IGenerationOptions { return { - resultsPath: resultsPath, + resultsPath, noConfigs: false, convertCaseEntity: "none", convertCaseFile: "none", @@ -31,8 +30,7 @@ export function getGenerationOptions(resultsPath: string): IGenerationOptions { export async function createMSSQLModels( filesOrgPath: string ): Promise { - let driver: AbstractDriver; - driver = new MssqlDriver(); + const driver = new MssqlDriver(); const connectionOptions: IConnectionOptions = { host: String(process.env.MSSQL_Host), port: Number(process.env.MSSQL_Port), @@ -66,11 +64,11 @@ export async function createMSSQLModels( }; const schemas = "dbo,sch1,sch2"; - let conn = await createConnection(connOpt); - let queryRunner = conn.createQueryRunner(); - for (const sch of schemas.split(",")) { - await queryRunner.createSchema(sch, true); - } + const conn = await createConnection(connOpt); + const queryRunner = conn.createQueryRunner(); + await Promise.all( + schemas.split(",").map(sch => queryRunner.createSchema(sch, true)) + ); await conn.synchronize(); if (conn.isConnected) { @@ -83,8 +81,7 @@ export async function createMSSQLModels( export async function createPostgresModels( filesOrgPath: string ): Promise { - let driver: AbstractDriver; - driver = new PostgresDriver(); + const driver = new PostgresDriver(); const connectionOptions: IConnectionOptions = { host: String(process.env.POSTGRES_Host), port: Number(process.env.POSTGRES_Port), @@ -118,11 +115,11 @@ export async function createPostgresModels( }; const schemas = "public,sch1,sch2"; - let conn = await createConnection(connOpt); - let queryRunner = conn.createQueryRunner(); - for (const sch of schemas.split(",")) { - await queryRunner.createSchema(sch, true); - } + const conn = await createConnection(connOpt); + const queryRunner = conn.createQueryRunner(); + await Promise.all( + schemas.split(",").map(sch => queryRunner.createSchema(sch, true)) + ); await conn.synchronize(); if (conn.isConnected) { @@ -135,8 +132,6 @@ export async function createPostgresModels( export async function createSQLiteModels( filesOrgPath: string ): Promise { - let driver: AbstractDriver; - driver = new SqliteDriver(); const connectionOptions: IConnectionOptions = { host: "", port: 0, @@ -147,13 +142,6 @@ export async function createSQLiteModels( schemaName: "", ssl: false }; - await driver.ConnectToServer(connectionOptions); - - if (await driver.CheckIfDBExists(String(process.env.SQLITE_Database))) { - await driver.DropDB(String(process.env.SQLITE_Database)); - } - await driver.CreateDB(String(process.env.SQLITE_Database)); - await driver.DisconnectFromServer(); const connOpt: ConnectionOptions = { database: String(process.env.SQLITE_Database), @@ -164,7 +152,7 @@ export async function createSQLiteModels( name: "sqlite" }; - let conn = await createConnection(connOpt); + const conn = await createConnection(connOpt); await conn.synchronize(); if (conn.isConnected) { @@ -177,8 +165,7 @@ export async function createSQLiteModels( export async function createMysqlModels( filesOrgPath: string ): Promise { - let driver: AbstractDriver; - driver = new MysqlDriver(); + const driver = new MysqlDriver(); const connectionOptions: IConnectionOptions = { host: String(process.env.MYSQL_Host), port: Number(process.env.MYSQL_Port), @@ -220,8 +207,7 @@ export async function createMysqlModels( export async function createMariaDBModels( filesOrgPath: string ): Promise { - let driver: AbstractDriver; - driver = new MariaDbDriver(); + const driver = new MariaDbDriver(); const connectionOptions: IConnectionOptions = { host: String(process.env.MARIADB_Host), port: Number(process.env.MARIADB_Port), @@ -264,8 +250,7 @@ export async function createMariaDBModels( export async function createOracleDBModels( filesOrgPath: string ): Promise { - let driver: AbstractDriver; - driver = new OracleDriver(); + const driver = new OracleDriver(); const connectionOptions: IConnectionOptions = { host: String(process.env.ORACLE_Host), @@ -339,22 +324,22 @@ export function compileTsFiles( export function getEnabledDbDrivers() { const dbDrivers: string[] = []; - if (process.env.SQLITE_Skip == "0") { + if (process.env.SQLITE_Skip === "0") { dbDrivers.push("sqlite"); } - if (process.env.POSTGRES_Skip == "0") { + if (process.env.POSTGRES_Skip === "0") { dbDrivers.push("postgres"); } - if (process.env.MYSQL_Skip == "0") { + if (process.env.MYSQL_Skip === "0") { dbDrivers.push("mysql"); } - if (process.env.MARIADB_Skip == "0") { + if (process.env.MARIADB_Skip === "0") { dbDrivers.push("mariadb"); } - if (process.env.MSSQL_Skip == "0") { + if (process.env.MSSQL_Skip === "0") { dbDrivers.push("mssql"); } - if (process.env.ORACLE_Skip == "0") { + if (process.env.ORACLE_Skip === "0") { dbDrivers.push("oracle"); } return dbDrivers; From ebbf75386499670209b4facf58022a556357c087 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Mon, 12 Aug 2019 21:35:37 +0200 Subject: [PATCH 20/20] option to add visibility to constructor #169 --- src/entity.mst | 2 +- src/index.ts | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/entity.mst b/src/entity.mst index 634a2bb..97de093 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -37,7 +37,7 @@ import {BaseEntity,Column,Entity,Index,JoinColumn,JoinTable,ManyToMany,ManyToOne {{printPropertyVisibility}}{{toPropertyName ../tsName}}Id: {{#if isOneToOne}}{{toLazy ../tsType}}{{else}}{{toLazy (concat ../tsType "[]")}}{{/if}};{{/if}}{{/relations}} {{/Columns}} {{#if GenerateConstructor}} - constructor(init?: Partial<{{toEntityName tsEntityName}}>) { + {{printPropertyVisibility}}constructor(init?: Partial<{{toEntityName tsEntityName}}>) { Object.assign(this, init); } {{/if}} diff --git a/src/index.ts b/src/index.ts index 6bd2858..b090f8d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -378,6 +378,18 @@ async function GetUtilParametersByInquirer() { type: "checkbox" } ])) as any).selected; + + generationOptions.propertyVisibility = ((await inquirer.prompt([ + { + choices: ["public", "protected", "private", "none"], + message: + "Defines which visibility should have the generated property", + name: "propertyVisibility", + default: "none", + type: "list" + } + ])) as any).propertyVisibility; + generationOptions.noConfigs = !customizations.includes("config"); generationOptions.lazy = customizations.includes("lazy"); generationOptions.activeRecord = customizations.includes( @@ -450,11 +462,10 @@ async function GetUtilParametersByInquirer() { } ])) as any; if (saveConfig) { - await fs.writeJson( - path.resolve(process.cwd(), ".tomg-config"), - [connectionOptions, generationOptions], - { spaces: "\t" } - ); + await fs.writeJson(path.resolve(process.cwd(), ".tomg-config"), [ + connectionOptions, + generationOptions + ]); console.log(`[${new Date().toLocaleTimeString()}] Config file saved.`); console.warn( `\x1b[33m[${new Date().toLocaleTimeString()}] WARNING: Password was saved as plain text.\x1b[0m`