diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
new file mode 100644
index 0000000..5555dd2
--- /dev/null
+++ b/.idea/codeStyleSettings.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..f2f7930
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..1beadde
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jsLinters/tslint.xml b/.idea/jsLinters/tslint.xml
new file mode 100644
index 0000000..5d68de2
--- /dev/null
+++ b/.idea/jsLinters/tslint.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..2070abf
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/typeorm-model-generator.iml b/.idea/typeorm-model-generator.iml
new file mode 100644
index 0000000..24643cc
--- /dev/null
+++ b/.idea/typeorm-model-generator.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..05d6099
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,837 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ char_max_lenght
+ .mst
+ EntityName
+ lower
+ relationimports
+ relatedTable
+ imports
+ relations
+ ownertable
+ Handlebars
+ toLowerCase
+ changeCase
+ changeCase.param
+ relationImports
+ char
+ argv
+ engineoptions
+ convertCase
+ camelcase
+ sample1-s
+ integration.test
+ "boolean"
+ "bool"
+ bool
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1505146396007
+
+
+ 1505146396007
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index dcf055a..99be057 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,28 +1,30 @@
language: node_js
-
node_js:
- - stable
- - 7
- - 6
- - 5
-
-
+- stable
+- 8
+- 6
sudo: required
-
services:
- - docker
-
+- docker
env:
- - MSSQL_Skip=0 MSSQL_Host=localhost MSSQL_Port=1433 MSSQL_Username=sa MSSQL_Password=!Passw0rd MSSQL_Database=typeorm_mg POSTGRES_Skip=0 POSTGRES_Host=localhost POSTGRES_Port=5432 POSTGRES_Username=postgres POSTGRES_Password=!Passw0rd POSTGRES_Database=typeorm_mg MYSQL_Skip=0 MYSQL_Host=localhost MYSQL_Port=3306 MYSQL_Username=root MYSQL_Password=!Passw0rd MYSQL_Database=typeorm_mg MARIADB_Skip=0 MARIADB_Host=localhost MARIADB_Port=3307 MARIADB_Username=root MARIADB_Password=!Passw0rd MARIADB_Database=typeorm_mg
-
+ matrix:
+ - POSTGRES_Skip=0 POSTGRES_Host=localhost POSTGRES_Port=5432 POSTGRES_Username=postgres
+ POSTGRES_Password=!Passw0rd POSTGRES_Database=typeorm_mg POSTGRES_SSL=0 MYSQL_Skip=0
+ MYSQL_Host=localhost MYSQL_Port=3306 MYSQL_Username=root MYSQL_Password=!Passw0rd
+ MYSQL_Database=typeorm_mg MYSQL_SSL=1 MARIADB_Skip=0 MARIADB_Host=localhost MARIADB_Port=3307
+ MARIADB_Username=root MARIADB_Password=!Passw0rd MARIADB_Database=typeorm_mg MARIADB_SSL=0
+ global:
+ secure: Xj6wO8aghAhi6nvBI/HTtW9mIq9xfigIQfCC7ZkgAcqS4Oe3ba+7A5pCJq6Fxndadc6Bg1bZ3BGCH3Upf/Yv3zCFybsk43LwwXPJoG9gCrva/me7Sd+ws30EcD2dsKbvjZqNYai/XdrhzJY+KlxWvS/g3N/puBNffcU5hteo1zllxakQIAiavJ64D4g+Th8LSytmb2qDDToSsCxXkzNSutaKgZSf6T8QCWzcl0NCZkl69s9kX7L5335HVBD9lR/EKFC4wqHQjryCDRAyNRvItZRNlTPqgOI8lvcTsH9zKozDwEz7h/zcLebbY/+YTsLB5pb2sa62tkQE0x24TG7bLxujQShEQZU8itkRSV+w6+0JpBHQPlSUppkQJBNGKao7GaO/Eix4mSyvHkeECmTWDtEpBGWERYLqCKGe2Nj3BfcA2Ue6pjz9CX8wnrCbx53j6be3M/g/gcx7fbJbX3P95yc1CWAaR+tJKlP38rTcyo+o+Db1Ft0pzRJyZGmkGGPnCj6LxWYSmVqumLYDyqAMBDcQYuVwaKaTsJtU/2OBb3+zjKmWivV+19SXBqILvFbLv9IYLavpMr9OAwDGcJu0+mF+VCjGkZTlBxWJ53PmCoIJ6Qx/5o67LsCYL4L/hugNETlOEEKwe/k1mBraYWB0jI3mBUCV0d8J5P+ZQhwIZo4=
before_install:
- - sudo service mysql stop
- - sudo service postgresql stop
- - docker-compose up -d
-
-
+- sudo service mysql stop
+- sudo service postgresql stop
+- docker-compose up -d
+- npm install -g npm@5
+- npm install -g greenkeeper-lockfile@1
before_script:
- - npm run typings-install
- - npm link typescript
- - tsc
- - sleep 20s
+- greenkeeper-lockfile-update
+- npm run typings-install
+- npm link typescript
+- tsc
+after_script:
+- greenkeeper-lockfile-upload
diff --git a/README.md b/README.md
index d8862a5..bb90d0c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
# 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)
@@ -33,7 +35,8 @@ Options:
-e, --engine Database engine.
[choices: "mssql", "postgres", "mysql", "mariadb"] [default: "mssql"]
-o, --output Where to place generated models.
- -c, --case Convert snake_case tables names to PascalCase entities and snake_case columns to camelCase properties
+ -s, --schema Schema name to create model from. Only for mssql and postgres.
+ --ssl [boolean] [default: false]
```
### Examples
@@ -46,12 +49,12 @@ Options:
```
npx typeorm-model-generator -h localhost -d tempdb -u sa -x !Passw0rd -e mssql -o .\
````
-* Creating model from local Postgres database
+* Creating model from local Postgres database, public schema with ssl connection
* Global module
```
- typeorm-model-generator -h localhost -d postgres -u postgres -x !Passw0rd -e postgres -o .\
+ typeorm-model-generator -h localhost -d postgres -u postgres -x !Passw0rd -e postgres -o .\ -s public --ssl
````
* Npx Way
```
- npx typeorm-model-generator -h localhost -d postgres -u postgres -x !Passw0rd -e postgres -o .\
+ npx typeorm-model-generator -h localhost -d postgres -u postgres -x !Passw0rd -e postgres -o .\ -s public --ssl
````
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 5e8425c..a2b2149 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -3,8 +3,8 @@ services:
# mysql
mysql:
- image: "mysql:5.7.10"
- container_name: "typeorm-mysql"
+ image: "mysql:5.7.19"
+ container_name: "typeorm-mg-mysql"
ports:
- "3306:3306"
environment:
@@ -12,8 +12,8 @@ services:
# mariadb
mariadb:
- image: "mariadb:10.1.16"
- container_name: "typeorm-mariadb"
+ image: "mariadb:10.2.9"
+ container_name: "typeorm-mg-mariadb"
ports:
- "3307:3306"
environment:
@@ -21,19 +21,20 @@ services:
# postgres
postgres:
- image: "postgres:9.6.1"
- container_name: "typeorm-postgres"
+ image: "postgres:10.0"
+ container_name: "typeorm-mg-postgres"
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: "!Passw0rd"
- # mssql
- mssql:
- image: "microsoft/mssql-server-linux:ctp2-1"
- container_name: "typeorm-mssql"
- ports:
- - "1433:1433"
- environment:
- ACCEPT_EULA: "Y"
- SA_PASSWORD: "!Passw0rd"
\ No newline at end of file
+ # # mssql
+ # mssql:
+ # image: "microsoft/mssql-server-linux:2017-GA"
+ # container_name: "typeorm-mg-mssql"
+ # ports:
+ # - "1433:1433"
+ # environment:
+ # ACCEPT_EULA: "Y"
+ # SA_PASSWORD: "!Passw0rd"
+
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index c7036ab..5b639d5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,97 +1,108 @@
{
"name": "typeorm-model-generator",
- "version": "0.2.0",
+ "version": "0.2.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/chai": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-3.5.2.tgz",
- "integrity": "sha1-wRzSgX06QBt7oPWkIPNcVhObHB4=",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.5.tgz",
+ "integrity": "sha512-ZC4tZU+3rDblhVy9cUQp5u+Zw9M0geGY8tzUQgc+4CMIWQLUFpgvrHhaYrSq1TK2m0DjaYIp9yJPyTHN+qhBZg==",
"dev": true
},
"@types/chai-as-promised": {
- "version": "0.0.30",
- "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-0.0.30.tgz",
- "integrity": "sha1-I0EyHMeWxsNUSpSaBj52CaIi8wM=",
+ "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==",
"dev": true,
"requires": {
- "@types/chai": "3.5.2"
+ "@types/chai": "4.0.5"
}
},
"@types/chai-subset": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.0.tgz",
- "integrity": "sha1-dM7M7zsvwtpzkbcT3rcv6afl94I=",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
"dev": true,
"requires": {
- "@types/chai": "3.5.2"
+ "@types/chai": "4.0.5"
}
},
+ "@types/events": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+ "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==",
+ "dev": true
+ },
"@types/fs-extra": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-3.0.3.tgz",
- "integrity": "sha512-o2qkg/J2LWK+sr007+KFBBOrxzxpr9kiP0gMFC75gQJXhUn/E3pQA0kSVdxrQ3lf+rOwsRnuH0wnR5MNTotEKg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==",
"dev": true,
"requires": {
- "@types/node": "7.0.39"
+ "@types/node": "9.3.0"
}
},
"@types/handlebars": {
- "version": "4.0.33",
- "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.33.tgz",
- "integrity": "sha512-39w19Mseg83z68JsIdcuFH3Z+BR/Jc3gRBB4Pn/aUm76rdy0prMz5iIMJAOb0Bo6H/rZhQc41vFf3tAMgqufVQ==",
+ "version": "4.0.36",
+ "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.36.tgz",
+ "integrity": "sha512-LjNiTX7TY7wtuC6y3QwC93hKMuqYhgV9A1uXBKNvZtVC8ZvyWAjZkJ5BvT0K7RKqORRYRLMrqCxpw5RgS+MdrQ==",
"dev": true
},
"@types/mocha": {
- "version": "2.2.41",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.41.tgz",
- "integrity": "sha1-4nzwgXFT658nE7LT9saPHhw8pgg=",
+ "version": "2.2.44",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.44.tgz",
+ "integrity": "sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw==",
"dev": true
},
"@types/mssql": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@types/mssql/-/mssql-3.3.1.tgz",
- "integrity": "sha1-DAlm4jnCOP5Rzldt7unqGBFmU/Y=",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@types/mssql/-/mssql-4.0.6.tgz",
+ "integrity": "sha512-59tGR0k2cygPsK1zxFi6zdCRHfriLWQ7Prsk+LMYXdkFq/4hw3KgcMIOlprGPz+mqIQr8LukV1GYPHK+PQ4EEw==",
"dev": true,
"requires": {
- "@types/node": "7.0.39"
+ "@types/node": "9.3.0"
}
},
"@types/mysql": {
- "version": "0.0.34",
- "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-0.0.34.tgz",
- "integrity": "sha512-IocdMpYtCBSLJqSg0BGgZTbYf3K9iAq81a1sNw6FlgVYh3/2cOXR3LpuQS6o5avWAmNTJqC6u5gS+IRrY56+9Q==",
+ "version": "2.15.2",
+ "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.2.tgz",
+ "integrity": "sha512-5U5pYZd+UMGfDJfmNLYJ6+PBEfjZbHqd0kzDDItFPB2COPmFmlmMsV6t6om/loorx1XMWY3rYTQn7wLipmt4JA==",
+ "dev": true,
"requires": {
- "@types/node": "7.0.39"
+ "@types/node": "9.3.0"
}
},
"@types/node": {
- "version": "7.0.39",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.39.tgz",
- "integrity": "sha512-KQHAZeVsk4UIT9XaR6cn4WpHZzimK6UBD1UomQKfQQFmTlUHaNBzeuov+TM4+kigLO0IJt4I5OOsshcCyA9gSA=="
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.3.0.tgz",
+ "integrity": "sha512-wNBfvNjzsJl4tswIZKXCFQY0lss9nKUyJnG6T94X/eqjRgI2jHZ4evdjhQYBSan/vGtF6XVXPApOmNH2rf0KKw==",
+ "dev": true
},
"@types/pg": {
- "version": "6.1.41",
- "resolved": "https://registry.npmjs.org/@types/pg/-/pg-6.1.41.tgz",
- "integrity": "sha512-iTzD3R2CY/aSybbZieXGXi3Wxrk7XV/jRU1lofH/hyQNCbTTskXB/fomFDv+XTVXKjqrpCB/AXVLnUwbdFqthQ==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.4.1.tgz",
+ "integrity": "sha512-z1Ickwry/lCehbKCcEm8J5T+LZhHrVJiG6ARYefRGobJmSVh+C0H8hj7aRzLXRmfWyD0TpVxEB12W8rbHddDFg==",
+ "dev": true,
"requires": {
- "@types/node": "7.0.39",
- "@types/pg-types": "1.11.2"
+ "@types/events": "1.1.0",
+ "@types/node": "9.3.0",
+ "@types/pg-types": "1.11.4"
}
},
"@types/pg-types": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/@types/pg-types/-/pg-types-1.11.2.tgz",
- "integrity": "sha512-ZkLnKt6q9PhVhM3hA9if2HCu+NLSETvk7TeHXqlZxIE1O7HL2RDm2epBscwDh3pEzDpWoB+VlUYpz20R3Kqj7A==",
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/@types/pg-types/-/pg-types-1.11.4.tgz",
+ "integrity": "sha512-WdIiQmE347LGc1Vq3Ki8sk3iyCuLgnccqVzgxek6gEHp2H0p3MQ3jniIHt+bRODXKju4kNQ+mp53lmP5+/9moQ==",
+ "dev": true,
"requires": {
- "moment": "2.18.1"
+ "moment": "2.20.1"
}
},
"@types/sinon": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.1.tgz",
- "integrity": "sha512-WXpK6gOice0sdhfrAtRaDNtg0E0e04MRuCKYuqtCmc8O1P9P+ia3Z5zuMf4cDVB27s9w4UjjML5/6vjkiI2gNA==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.1.2.tgz",
+ "integrity": "sha512-fL6bJHYRzbw/7ofbKiJ65SOAasoe5mZhHNSYKxWsF3sGl/arhRwDPwXJqM1xofKNTQD14HNX9VruicM7pm++mQ==",
"dev": true
},
"abbrev": {
@@ -118,6 +129,16 @@
}
}
},
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
"align-text": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
@@ -179,13 +200,7 @@
"any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
- "dev": true
- },
- "ap": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/ap/-/ap-0.2.0.tgz",
- "integrity": "sha1-rglCYAspkS8NKxTsYMRejzMLYRA="
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
},
"app-root-path": {
"version": "2.0.1",
@@ -202,7 +217,6 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
"integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
- "dev": true,
"requires": {
"sprintf-js": "1.0.3"
}
@@ -231,11 +245,6 @@
"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
"dev": true
},
- "asap": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz",
- "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8="
- },
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@@ -278,11 +287,12 @@
"dev": true
},
"babel-runtime": {
- "version": "5.8.38",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz",
- "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=",
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
- "core-js": "1.2.7"
+ "core-js": "2.5.1",
+ "regenerator-runtime": "0.11.0"
}
},
"balanced-match": {
@@ -312,9 +322,9 @@
"integrity": "sha1-rHMCDApZu3nrF8LOLbd/d9l04BM="
},
"bignumber.js": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.2.tgz",
- "integrity": "sha1-LR3DfuWWiGfs6pC22k0W5oYI0h0="
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.4.tgz",
+ "integrity": "sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg=="
},
"bl": {
"version": "1.2.1",
@@ -403,6 +413,15 @@
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
},
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
"camelcase": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
@@ -434,9 +453,9 @@
"dev": true
},
"caseless": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
- "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
"center-align": {
@@ -450,29 +469,49 @@
}
},
"chai": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
- "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
"dev": true,
"requires": {
"assertion-error": "1.0.2",
- "deep-eql": "0.1.3",
- "type-detect": "1.0.0"
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.3"
+ },
+ "dependencies": {
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.3"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz",
+ "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=",
+ "dev": true
+ }
}
},
"chai-as-promised": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz",
- "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
+ "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
"dev": true,
"requires": {
"check-error": "1.0.2"
}
},
"chai-subset": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.5.0.tgz",
- "integrity": "sha1-0D28+oydqthIZDu95OYzdreIJCc=",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz",
+ "integrity": "sha1-pdDKFOMpp5WW7XAFi2ZGvWmIz+k=",
"dev": true
},
"chalk": {
@@ -487,6 +526,31 @@
"supports-color": "2.0.0"
}
},
+ "change-case": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.1.tgz",
+ "integrity": "sha1-7l9a0EFa0a2egHLPSc1M+nZgpVQ=",
+ "requires": {
+ "camel-case": "3.0.0",
+ "constant-case": "2.0.0",
+ "dot-case": "2.1.1",
+ "header-case": "1.0.1",
+ "is-lower-case": "1.1.3",
+ "is-upper-case": "1.1.2",
+ "lower-case": "1.1.4",
+ "lower-case-first": "1.0.2",
+ "no-case": "2.3.2",
+ "param-case": "2.1.1",
+ "pascal-case": "2.0.1",
+ "path-case": "2.1.1",
+ "sentence-case": "2.1.1",
+ "snake-case": "2.1.0",
+ "swap-case": "1.1.2",
+ "title-case": "2.1.1",
+ "upper-case": "1.1.3",
+ "upper-case-first": "1.1.2"
+ }
+ },
"check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
@@ -508,6 +572,56 @@
"restore-cursor": "1.0.1"
}
},
+ "cli-highlight": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-1.1.4.tgz",
+ "integrity": "sha1-5FWQwU+xjhOGXjiZ6CTFWSzCKSY=",
+ "requires": {
+ "chalk": "1.1.3",
+ "he": "1.1.1",
+ "highlight.js": "9.12.0",
+ "mz": "2.7.0",
+ "yargs": "4.8.1"
+ },
+ "dependencies": {
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ }
+ },
+ "window-size": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
+ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU="
+ },
+ "yargs": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
+ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=",
+ "requires": {
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "lodash.assign": "4.2.0",
+ "os-locale": "1.4.0",
+ "read-pkg-up": "1.0.1",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "1.0.2",
+ "which-module": "1.0.0",
+ "window-size": "0.2.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "2.4.1"
+ }
+ }
+ }
+ },
"cli-truncate": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.0.0.tgz",
@@ -567,22 +681,41 @@
"integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
"dev": true
},
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
},
"codecov": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/codecov/-/codecov-2.2.0.tgz",
- "integrity": "sha1-LQaBfOuIkeymNog21Ptr9swE/9E=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.0.tgz",
+ "integrity": "sha1-wnO4xPEpRXI+jcnSWAPYk0Pl8o4=",
"dev": true,
"requires": {
"argv": "0.0.2",
- "request": "2.79.0",
+ "request": "2.81.0",
"urlgrey": "0.4.4"
}
},
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
"columnify": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz",
@@ -602,15 +735,6 @@
"delayed-stream": "1.0.0"
}
},
- "commander": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
- "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
- "dev": true,
- "requires": {
- "graceful-readlink": "1.0.1"
- }
- },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -641,10 +765,19 @@
"xdg-basedir": "3.0.0"
}
},
+ "constant-case": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
+ "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=",
+ "requires": {
+ "snake-case": "2.1.0",
+ "upper-case": "1.1.3"
+ }
+ },
"core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
+ "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs="
},
"core-util-is": {
"version": "1.0.2",
@@ -660,6 +793,16 @@
"capture-stack-trace": "1.0.0"
}
},
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.2.14"
+ }
+ },
"cross-spawn-async": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz",
@@ -735,23 +878,6 @@
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
},
- "deep-eql": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
- "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
- "dev": true,
- "requires": {
- "type-detect": "0.1.1"
- },
- "dependencies": {
- "type-detect": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
- "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
- "dev": true
- }
- }
- },
"deep-extend": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
@@ -786,11 +912,19 @@
"dev": true
},
"diff": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
- "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz",
+ "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==",
"dev": true
},
+ "dot-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz",
+ "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=",
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
"dot-prop": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz",
@@ -803,8 +937,7 @@
"dotenv": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz",
- "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=",
- "dev": true
+ "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0="
},
"duplexer2": {
"version": "0.0.2",
@@ -954,9 +1087,9 @@
"dev": true
},
"extsprintf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
- "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true
},
"fancy-log": {
@@ -1012,18 +1145,18 @@
"integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
"dev": true,
"requires": {
- "samsam": "1.2.1"
+ "samsam": "1.3.0"
}
},
"fs-extra": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
- "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
"dev": true,
"requires": {
"graceful-fs": "4.1.11",
- "jsonfile": "3.0.0",
- "universalify": "0.1.0"
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
}
},
"fs.realpath": {
@@ -1037,31 +1170,22 @@
"integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=",
"dev": true
},
- "generate-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
- "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
- "dev": true
- },
- "generate-object-property": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
- "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
- "dev": true,
- "requires": {
- "is-property": "1.0.2"
- }
- },
"generic-pool": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.5.4.tgz",
- "integrity": "sha1-OMYYhRPhQDCUjsblz2VSPZd5KZs="
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.1.8.tgz",
+ "integrity": "sha1-CYRLZUW8kXfsIYvTXUrYlMZb4nE="
},
"get-caller-file": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
"integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
},
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
"get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
@@ -1071,8 +1195,7 @@
"get-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
- "dev": true
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
},
"getpass": {
"version": "0.1.7",
@@ -1137,18 +1260,6 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
- "graceful-readlink": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
- "dev": true
- },
- "growl": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
- "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
- "dev": true
- },
"gulp-util": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz",
@@ -1193,9 +1304,9 @@
}
},
"handlebars": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz",
- "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=",
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
"requires": {
"async": "1.5.2",
"optimist": "0.6.1",
@@ -1203,16 +1314,20 @@
"uglify-js": "2.8.29"
}
},
+ "har-schema": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+ "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+ "dev": true
+ },
"har-validator": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
- "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
"dev": true,
"requires": {
- "chalk": "1.1.3",
- "commander": "2.9.0",
- "is-my-json-valid": "2.16.0",
- "pinkie-promise": "2.0.1"
+ "ajv": "4.11.8",
+ "har-schema": "1.0.5"
}
},
"has": {
@@ -1265,6 +1380,25 @@
"sntp": "1.0.9"
}
},
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
+ },
+ "header-case": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz",
+ "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=",
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
+ "highlight.js": {
+ "version": "9.12.0",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz",
+ "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4="
+ },
"hoek": {
"version": "2.16.3",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
@@ -1294,7 +1428,7 @@
"dev": true,
"requires": {
"assert-plus": "0.2.0",
- "jsprim": "1.4.0",
+ "jsprim": "1.4.1",
"sshpk": "1.13.1"
}
},
@@ -1310,9 +1444,9 @@
}
},
"iconv-lite": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz",
- "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA=="
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
},
"import-lazy": {
"version": "2.1.0",
@@ -1385,9 +1519,9 @@
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
},
"is-buffer": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
- "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"is-builtin-module": {
"version": "1.0.0",
@@ -1414,16 +1548,12 @@
"number-is-nan": "1.0.1"
}
},
- "is-my-json-valid": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz",
- "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=",
- "dev": true,
+ "is-lower-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz",
+ "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=",
"requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "jsonpointer": "4.0.1",
- "xtend": "4.0.1"
+ "lower-case": "1.1.4"
}
},
"is-npm": {
@@ -1444,12 +1574,6 @@
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
"dev": true
},
- "is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
- "dev": true
- },
"is-redirect": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
@@ -1474,8 +1598,7 @@
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
- "dev": true
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"is-typedarray": {
"version": "1.0.0",
@@ -1492,6 +1615,14 @@
"unc-path-regex": "0.1.2"
}
},
+ "is-upper-case": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz",
+ "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=",
+ "requires": {
+ "upper-case": "1.1.3"
+ }
+ },
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -1511,8 +1642,7 @@
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
"isobject": {
"version": "2.1.0",
@@ -1540,7 +1670,7 @@
"escodegen": "1.8.1",
"esprima": "2.7.3",
"glob": "5.0.15",
- "handlebars": "4.0.10",
+ "handlebars": "4.0.11",
"js-yaml": "3.8.4",
"mkdirp": "0.5.1",
"nopt": "3.0.6",
@@ -1581,6 +1711,11 @@
}
}
},
+ "js-string-escape": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
+ "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8="
+ },
"js-tokens": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
@@ -1591,7 +1726,6 @@
"version": "3.8.4",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz",
"integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=",
- "dev": true,
"requires": {
"argparse": "1.0.9",
"esprima": "3.1.3"
@@ -1600,8 +1734,7 @@
"esprima": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
- "dev": true
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
}
}
},
@@ -1618,31 +1751,34 @@
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
"dev": true
},
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
"dev": true
},
- "json3": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
- "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
- "dev": true
- },
"jsonfile": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.0.tgz",
- "integrity": "sha1-kufHRE5f/V+jLmqa6LhQNN+DR9A=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "4.1.11"
}
},
- "jsonpointer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
- "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"dev": true
},
"jspm-config": {
@@ -1671,15 +1807,15 @@
}
},
"jsprim": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
- "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"dev": true,
"requires": {
"assert-plus": "1.0.0",
- "extsprintf": "1.0.2",
+ "extsprintf": "1.3.0",
"json-schema": "0.2.3",
- "verror": "1.3.6"
+ "verror": "1.10.0"
},
"dependencies": {
"assert-plus": {
@@ -1690,12 +1826,18 @@
}
}
},
+ "just-extend": {
+ "version": "1.1.27",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz",
+ "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==",
+ "dev": true
+ },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"requires": {
- "is-buffer": "1.1.5"
+ "is-buffer": "1.1.6"
}
},
"latest-version": {
@@ -1749,34 +1891,34 @@
"strip-bom": "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=",
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ }
+ }
+ },
"lockfile": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.3.tgz",
"integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=",
"dev": true
},
- "lodash._baseassign": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
- "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
- "dev": true,
- "requires": {
- "lodash._basecopy": "3.0.1",
- "lodash.keys": "3.1.2"
- }
- },
"lodash._basecopy": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
"integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
"dev": true
},
- "lodash._basecreate": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
- "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
- "dev": true
- },
"lodash._basetostring": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
@@ -1825,16 +1967,10 @@
"integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
"dev": true
},
- "lodash.create": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
- "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
- "dev": true,
- "requires": {
- "lodash._baseassign": "3.2.0",
- "lodash._basecreate": "3.0.3",
- "lodash._isiterateecall": "3.0.9"
- }
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
},
"lodash.escape": {
"version": "3.2.0",
@@ -1845,6 +1981,12 @@
"lodash._root": "3.0.1"
}
},
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+ "dev": true
+ },
"lodash.isarguments": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
@@ -1912,9 +2054,9 @@
}
},
"lolex": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
- "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.0.tgz",
+ "integrity": "sha512-rPO6R1t8PjYL6xbsFUg7aByKkWAql907na6powPBORVs4DCm8aMBUkL4+6CXO0gEIV8vtu3mWV0FB8ZaCYPBmA==",
"dev": true
},
"longest": {
@@ -1941,6 +2083,19 @@
"signal-exit": "3.0.2"
}
},
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
+ },
+ "lower-case-first": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz",
+ "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=",
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
"lowercase-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
@@ -1951,7 +2106,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
"integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "dev": true,
"requires": {
"pseudomap": "1.0.2",
"yallist": "2.1.2"
@@ -1987,6 +2141,14 @@
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
"dev": true
},
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
"meow": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
@@ -2034,6 +2196,11 @@
"mime-db": "1.27.0"
}
},
+ "mimic-fn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg="
+ },
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -2051,7 +2218,6 @@
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "dev": true,
"requires": {
"minimist": "0.0.8"
},
@@ -2059,59 +2225,83 @@
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
}
}
},
"mocha": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz",
- "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz",
+ "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==",
"dev": true,
"requires": {
"browser-stdout": "1.3.0",
- "commander": "2.9.0",
- "debug": "2.6.0",
- "diff": "3.2.0",
+ "commander": "2.11.0",
+ "debug": "3.1.0",
+ "diff": "3.3.1",
"escape-string-regexp": "1.0.5",
- "glob": "7.1.1",
- "growl": "1.9.2",
- "json3": "3.3.2",
- "lodash.create": "3.1.1",
+ "glob": "7.1.2",
+ "growl": "1.10.3",
+ "he": "1.1.1",
"mkdirp": "0.5.1",
- "supports-color": "3.1.2"
+ "supports-color": "4.4.0"
},
"dependencies": {
- "glob": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
- "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "commander": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
+ "ms": "2.0.0"
}
},
+ "diff": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
+ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
+ "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
"supports-color": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
- "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
+ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
"dev": true,
"requires": {
- "has-flag": "1.0.0"
+ "has-flag": "2.0.0"
}
}
}
},
"moment": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
- "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz",
+ "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==",
+ "dev": true
},
"ms": {
"version": "0.7.2",
@@ -2120,13 +2310,28 @@
"dev": true
},
"mssql": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/mssql/-/mssql-3.3.0.tgz",
- "integrity": "sha1-tuYzf/Ej6Hv4ruHmyDRLU8pdqFY=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mssql/-/mssql-4.1.0.tgz",
+ "integrity": "sha512-ekht0eILEV0P1CbpkwpAxhgO+/5goYizUJrt7pgDm3fP6lGKe0+8V9jhTvQZ8DPHkycSd0wYGUoz/YA7VN7kQQ==",
"requires": {
- "generic-pool": "2.5.4",
- "promise": "7.1.1",
- "tedious": "1.14.0"
+ "debug": "2.6.9",
+ "generic-pool": "3.1.8",
+ "tedious": "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==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
}
},
"multipipe": {
@@ -2139,14 +2344,14 @@
}
},
"mysql": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.14.1.tgz",
- "integrity": "sha512-ZPXqQeYH7L1QPDyC77Rcp32cNCQnNjz8Y4BbF17tOjm5yhSfjFa3xS4PvuxWJtEEmwVc4ccI7sSntj4eyYRq0A==",
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.15.0.tgz",
+ "integrity": "sha512-C7tjzWtbN5nzkLIV+E8Crnl9bFyc7d3XJcBAvHKEVkjrYjogz3llo22q6s/hw+UcsE4/844pDob9ac+3dVjQSA==",
"requires": {
- "bignumber.js": "4.0.2",
+ "bignumber.js": "4.0.4",
"readable-stream": "2.3.3",
"safe-buffer": "5.1.1",
- "sqlstring": "2.2.0"
+ "sqlstring": "2.3.0"
},
"dependencies": {
"readable-stream": {
@@ -2178,11 +2383,51 @@
}
}
},
- "native-promise-only": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
- "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
- "dev": true
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ }
+ }
+ },
+ "nise": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz",
+ "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==",
+ "dev": true,
+ "requires": {
+ "formatio": "1.2.0",
+ "just-extend": "1.1.27",
+ "lolex": "1.6.0",
+ "path-to-regexp": "1.7.0",
+ "text-encoding": "0.6.4"
+ },
+ "dependencies": {
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ }
+ }
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "requires": {
+ "lower-case": "1.1.4"
+ }
},
"nopt": {
"version": "3.0.6",
@@ -2292,6 +2537,24 @@
"lcid": "1.0.0"
}
},
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-limit": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
+ "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw="
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "1.1.0"
+ }
+ },
"package-json": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
@@ -2309,6 +2572,14 @@
"resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz",
"integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc="
},
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
"parent-require": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz",
@@ -2322,6 +2593,23 @@
"error-ex": "1.3.1"
}
},
+ "pascal-case": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz",
+ "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=",
+ "requires": {
+ "camel-case": "3.0.0",
+ "upper-case-first": "1.1.2"
+ }
+ },
+ "path-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz",
+ "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=",
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
@@ -2368,16 +2656,29 @@
"pinkie-promise": "2.0.1"
}
},
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+ "dev": true
+ },
"pg": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/pg/-/pg-6.4.0.tgz",
- "integrity": "sha1-y3a6Lnwuq4n8ZL96n+ZIztckNtw=",
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-7.4.0.tgz",
+ "integrity": "sha1-4lYGHSxScjw8hY3vuX8RWcpmD4M=",
"requires": {
"buffer-writer": "1.0.1",
+ "js-string-escape": "1.0.1",
"packet-reader": "0.3.1",
"pg-connection-string": "0.1.3",
- "pg-pool": "1.8.0",
- "pg-types": "1.12.0",
+ "pg-pool": "2.0.3",
+ "pg-types": "1.12.1",
"pgpass": "1.0.2",
"semver": "4.3.2"
},
@@ -2395,36 +2696,19 @@
"integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc="
},
"pg-pool": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-1.8.0.tgz",
- "integrity": "sha1-9+xzgkw3oD8Hb1G/33DjQBR8Tzc=",
- "requires": {
- "generic-pool": "2.4.3",
- "object-assign": "4.1.0"
- },
- "dependencies": {
- "generic-pool": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.3.tgz",
- "integrity": "sha1-eAw29p360FpaBF3Te+etyhGk9v8="
- },
- "object-assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
- "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A="
- }
- }
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.3.tgz",
+ "integrity": "sha1-wCIDLIlJ8xKk+R+2QJzgQHa+Mlc="
},
"pg-types": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.12.0.tgz",
- "integrity": "sha1-itO3uJfj/UY+Yt4kGtX8ZAtKZvA=",
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.12.1.tgz",
+ "integrity": "sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I=",
"requires": {
- "ap": "0.2.0",
"postgres-array": "1.0.2",
"postgres-bytea": "1.0.0",
"postgres-date": "1.0.3",
- "postgres-interval": "1.1.0"
+ "postgres-interval": "1.1.1"
}
},
"pgpass": {
@@ -2432,7 +2716,7 @@
"resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz",
"integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=",
"requires": {
- "split": "1.0.0"
+ "split": "1.0.1"
}
},
"pify": {
@@ -2513,9 +2797,9 @@
"integrity": "sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g="
},
"postgres-interval": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.0.tgz",
- "integrity": "sha1-EDHnusNFZBMoYq3J62xtLzqnW7Q=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.1.tgz",
+ "integrity": "sha512-OkuCi9t/3CZmeQreutGgx/OVNv9MKHGIT5jH8KldQ4NLYXkvmT9nDVxEuCENlNwhlGPE374oA/xMqn05G49pHA==",
"requires": {
"xtend": "4.0.1"
}
@@ -2537,14 +2821,6 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
- "promise": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
- "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=",
- "requires": {
- "asap": "2.0.5"
- }
- },
"promise-finally": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/promise-finally/-/promise-finally-3.0.0.tgz",
@@ -2554,8 +2830,7 @@
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
- "dev": true
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
},
"punycode": {
"version": "1.4.1",
@@ -2564,9 +2839,9 @@
"dev": true
},
"qs": {
- "version": "6.3.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
- "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
"dev": true
},
"rc": {
@@ -2637,6 +2912,11 @@
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz",
"integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo="
},
+ "regenerator-runtime": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz",
+ "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A=="
+ },
"registry-auth-token": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz",
@@ -2699,19 +2979,19 @@
"dev": true
},
"request": {
- "version": "2.79.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
- "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "version": "2.81.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
"dev": true,
"requires": {
"aws-sign2": "0.6.0",
"aws4": "1.6.0",
- "caseless": "0.11.0",
+ "caseless": "0.12.0",
"combined-stream": "1.0.5",
"extend": "3.0.1",
"forever-agent": "0.6.1",
"form-data": "2.1.4",
- "har-validator": "2.0.6",
+ "har-validator": "4.2.1",
"hawk": "3.1.3",
"http-signature": "1.1.1",
"is-typedarray": "1.0.0",
@@ -2719,11 +2999,13 @@
"json-stringify-safe": "5.0.1",
"mime-types": "2.1.15",
"oauth-sign": "0.8.2",
- "qs": "6.3.2",
+ "performance-now": "0.2.0",
+ "qs": "6.4.0",
+ "safe-buffer": "5.0.1",
"stringstream": "0.0.5",
"tough-cookie": "2.3.2",
- "tunnel-agent": "0.4.3",
- "uuid": "3.0.1"
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.1.0"
}
},
"require-directory": {
@@ -2776,11 +3058,16 @@
"integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c="
},
"samsam": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz",
- "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
"dev": true
},
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
"semver": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
@@ -2795,45 +3082,74 @@
"semver": "5.3.0"
}
},
+ "sentence-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz",
+ "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=",
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case-first": "1.1.2"
+ }
+ },
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"sinon": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.4.tgz",
- "integrity": "sha1-RmrY0brobW21GqIYuS6Ze8Pl24g=",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.1.2.tgz",
+ "integrity": "sha512-5uLBZPdCWl59Lpbf45ygKj7Z0LVol+ftBe7RDIXOQV/sF58pcFmbK8raA7bt6eljNuGnvBP+/ZxlicVn0emDjA==",
"dev": true,
"requires": {
- "diff": "3.2.0",
+ "diff": "3.4.0",
"formatio": "1.2.0",
- "lolex": "1.6.0",
- "native-promise-only": "0.8.1",
- "path-to-regexp": "1.7.0",
- "samsam": "1.2.1",
- "text-encoding": "0.6.4",
- "type-detect": "4.0.3"
+ "lodash.get": "4.4.2",
+ "lolex": "2.3.0",
+ "nise": "1.2.0",
+ "supports-color": "4.5.0",
+ "type-detect": "4.0.5"
},
"dependencies": {
- "type-detect": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz",
- "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=",
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
}
}
},
"sinon-chai": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.11.0.tgz",
- "integrity": "sha512-3kbzpr2q8N+M4CWkcym349ifwkXorsbw2YyVpEIvB3AKC/ebrLHXj3DySt8epKGA49zJBSgn1OvWHZ+O+aR0dA==",
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
"dev": true
},
"slice-ansi": {
@@ -2848,6 +3164,14 @@
"integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
"dev": true
},
+ "snake-case": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz",
+ "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=",
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
"sntp": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
@@ -2899,9 +3223,9 @@
"integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc="
},
"split": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz",
- "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
"requires": {
"through": "2.3.8"
}
@@ -2914,13 +3238,12 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"sqlstring": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.2.0.tgz",
- "integrity": "sha1-wxNcTqirzX5+50GklmqJHYak8ZE="
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.0.tgz",
+ "integrity": "sha1-UluKT9Jtb3GqYegipsr5dtMa0qg="
},
"sshpk": {
"version": "1.13.1",
@@ -2946,14 +3269,6 @@
}
}
},
- "string_decoder": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz",
- "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=",
- "requires": {
- "safe-buffer": "5.0.1"
- }
- },
"string-template": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz",
@@ -2970,6 +3285,14 @@
"strip-ansi": "3.0.1"
}
},
+ "string_decoder": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz",
+ "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=",
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
"stringstream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
@@ -2995,8 +3318,7 @@
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
- "dev": true
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
},
"strip-indent": {
"version": "1.0.1",
@@ -3018,17 +3340,25 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
},
- "tedious": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/tedious/-/tedious-1.14.0.tgz",
- "integrity": "sha1-wFwwO4Zoz5HlWmSTt0SGavYZh94=",
+ "swap-case": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz",
+ "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=",
"requires": {
- "babel-runtime": "5.8.38",
+ "lower-case": "1.1.4",
+ "upper-case": "1.1.3"
+ }
+ },
+ "tedious": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tedious/-/tedious-2.0.0.tgz",
+ "integrity": "sha1-J2XpyGhPYmMdheaogFXruC3I9X0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
"big-number": "0.3.1",
"bl": "1.2.1",
- "iconv-lite": "0.4.18",
+ "iconv-lite": "0.4.19",
"readable-stream": "2.2.11",
- "semver": "5.3.0",
"sprintf": "0.1.5"
}
},
@@ -3051,11 +3381,18 @@
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
"integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
- "dev": true,
"requires": {
"any-promise": "1.3.0"
}
},
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
"throat": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz",
@@ -3111,6 +3448,15 @@
"integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
"dev": true
},
+ "title-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz",
+ "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=",
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
"touch": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-1.0.0.tgz",
@@ -3147,10 +3493,13 @@
"dev": true
},
"tunnel-agent": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
- "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
- "dev": true
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
},
"tweetnacl": {
"version": "0.14.5",
@@ -3169,9 +3518,9 @@
}
},
"type-detect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
- "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz",
+ "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==",
"dev": true
},
"typedarray": {
@@ -3181,21 +3530,50 @@
"dev": true
},
"typeorm": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.0.10.tgz",
- "integrity": "sha1-5C2CHjypwEXj6mnUE2vnoDk7Gj8=",
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.1.3.tgz",
+ "integrity": "sha512-5c+TMBuVqzet2LHrf5ZfkVaa7U89Vr8mlbSxONUQT+l4f+pvFcBHcWNOYFRN9bfrw+kKBGzCavTBYHbm3bmHSQ==",
"requires": {
"app-root-path": "2.0.1",
+ "chalk": "2.3.0",
+ "cli-highlight": "1.1.4",
+ "dotenv": "4.0.0",
"glob": "7.1.2",
+ "js-yaml": "3.8.4",
+ "mkdirp": "0.5.1",
"reflect-metadata": "0.1.10",
+ "xml2js": "0.4.19",
"yargonaut": "1.1.2",
- "yargs": "6.6.0"
+ "yargs": "9.0.1"
},
"dependencies": {
- "camelcase": {
+ "ansi-regex": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
},
"cliui": {
"version": "3.2.0",
@@ -3205,34 +3583,184 @@
"string-width": "1.0.2",
"strip-ansi": "3.0.1",
"wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
}
},
- "yargs": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
- "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
"requires": {
- "camelcase": "3.0.0",
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "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=",
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
+ },
+ "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=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "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.1"
+ }
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.3.8",
+ "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=",
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "yargs": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz",
+ "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=",
+ "requires": {
+ "camelcase": "4.1.0",
"cliui": "3.2.0",
"decamelize": "1.2.0",
"get-caller-file": "1.0.2",
- "os-locale": "1.4.0",
- "read-pkg-up": "1.0.1",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
"require-directory": "2.1.1",
"require-main-filename": "1.0.1",
"set-blocking": "2.0.0",
- "string-width": "1.0.2",
- "which-module": "1.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
"y18n": "3.2.1",
- "yargs-parser": "4.2.1"
+ "yargs-parser": "7.0.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "requires": {
+ "camelcase": "4.1.0"
}
}
}
},
"typescript": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.0.tgz",
- "integrity": "sha1-rvWo1AS+ujatM5q/B53d3/+6ht0="
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz",
+ "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE="
},
"typings": {
"version": "2.1.1",
@@ -3306,7 +3834,7 @@
"thenify": "3.3.0",
"throat": "3.2.0",
"touch": "1.0.0",
- "typescript": "2.4.0",
+ "typescript": "2.6.1",
"xtend": "4.0.1",
"zip-object": "0.1.0"
},
@@ -3325,15 +3853,15 @@
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
"optional": true,
"requires": {
- "source-map": "0.5.6",
+ "source-map": "0.5.7",
"uglify-to-browserify": "1.0.2",
"yargs": "3.10.0"
},
"dependencies": {
"source-map": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
- "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"optional": true
},
"yargs": {
@@ -3372,9 +3900,9 @@
}
},
"universalify": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.0.tgz",
- "integrity": "sha1-nrHEZR3rzGcMyU8adXYjMruWd3g=",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
"dev": true
},
"unzip-response": {
@@ -3399,6 +3927,19 @@
"xdg-basedir": "3.0.0"
}
},
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
+ },
+ "upper-case-first": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz",
+ "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=",
+ "requires": {
+ "upper-case": "1.1.3"
+ }
+ },
"url-parse-lax": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
@@ -3420,9 +3961,9 @@
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"uuid": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
- "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
+ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
"dev": true
},
"validate-npm-package-license": {
@@ -3435,12 +3976,22 @@
}
},
"verror": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
- "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
- "extsprintf": "1.0.2"
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
}
},
"vinyl": {
@@ -3467,7 +4018,6 @@
"version": "1.2.14",
"resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
"integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
- "dev": true,
"requires": {
"isexe": "2.0.0"
}
@@ -3528,6 +4078,20 @@
"integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
"dev": true
},
+ "xml2js": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
+ "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+ "requires": {
+ "sax": "1.2.4",
+ "xmlbuilder": "9.0.4"
+ }
+ },
+ "xmlbuilder": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz",
+ "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8="
+ },
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
@@ -3541,8 +4105,7 @@
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
- "dev": true
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
},
"yargonaut": {
"version": "1.1.2",
@@ -3555,29 +4118,33 @@
}
},
"yargs": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
- "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz",
+ "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==",
"requires": {
- "camelcase": "3.0.0",
"cliui": "3.2.0",
"decamelize": "1.2.0",
+ "find-up": "2.1.0",
"get-caller-file": "1.0.2",
- "os-locale": "1.4.0",
- "read-pkg-up": "1.0.1",
+ "os-locale": "2.1.0",
"require-directory": "2.1.1",
"require-main-filename": "1.0.1",
"set-blocking": "2.0.0",
- "string-width": "1.0.2",
- "which-module": "1.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
"y18n": "3.2.1",
- "yargs-parser": "5.0.0"
+ "yargs-parser": "8.1.0"
},
"dependencies": {
- "camelcase": {
+ "ansi-regex": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
},
"cliui": {
"version": "3.2.0",
@@ -3587,24 +4154,111 @@
"string-width": "1.0.2",
"strip-ansi": "3.0.1",
"wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
}
},
- "yargs-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
- "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
"requires": {
- "camelcase": "3.0.0"
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "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=",
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "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.1"
+ }
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "yargs-parser": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
+ "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
+ "requires": {
+ "camelcase": "4.1.0"
}
}
}
},
"yargs-parser": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
- "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
+ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=",
"requires": {
- "camelcase": "3.0.0"
+ "camelcase": "3.0.0",
+ "lodash.assign": "4.2.0"
},
"dependencies": {
"camelcase": {
@@ -3614,6 +4268,11 @@
}
}
},
+ "yn": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+ "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo="
+ },
"zip-object": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/zip-object/-/zip-object-0.1.0.tgz",
diff --git a/package.json b/package.json
index 5755d9a..7a01435 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "typeorm-model-generator",
- "version": "0.2.0",
+ "version": "0.2.4",
"description": "Generates models for TypeORM from existing databases.",
"bin": "bin/typeorm-model-generator",
"scripts": {
@@ -24,39 +24,40 @@
},
"homepage": "https://github.com/Kononnable/typeorm-model-generator#readme",
"dependencies": {
- "@types/mysql": "0.0.34",
- "@types/pg": "^6.1.41",
"change-case": "^3.0.1",
- "handlebars": "^4.0.10",
- "mssql": "^3.3.0",
- "mysql": "^2.14.1",
- "pg": "^6.4.0",
+ "handlebars": "^4.0.11",
+ "mssql": "^4.0.4",
+ "mysql": "^2.15.0",
+ "pg": "^7.4.0",
"reflect-metadata": "^0.1.10",
- "typeorm": "0.0.10",
- "typescript": "^2.4.0",
- "yargs": "^7.0.2"
+ "typeorm": "^0.1.3",
+ "typescript": "^2.6.1",
+ "yargs": "^10.0.3",
+ "yn": "^2.0.0"
},
"devDependencies": {
- "@types/chai": "^3.5.2",
- "@types/chai-as-promised": "0.0.30",
- "@types/chai-subset": "^1.3.0",
- "@types/fs-extra": "^3.0.0",
- "@types/handlebars": "^4.0.32",
- "@types/mocha": "^2.2.41",
- "@types/mssql": "^3.3.0",
- "@types/node": "^7.0.39",
- "@types/sinon": "^2.1.3",
- "chai": "^3.5.0",
- "chai-as-promised": "^6.0.0",
- "chai-subset": "^1.5.0",
- "codecov": "^2.1.0",
+ "@types/chai": "^4.0.5",
+ "@types/chai-as-promised": "7.1.0",
+ "@types/chai-subset": "^1.3.1",
+ "@types/fs-extra": "^5.0.0",
+ "@types/handlebars": "^4.0.36",
+ "@types/mocha": "^2.2.44",
+ "@types/mssql": "^4.0.4",
+ "@types/mysql": "2.15.2",
+ "@types/node": "^9.3.0",
+ "@types/pg": "^7.4.1",
+ "@types/sinon": "^4.1.2",
+ "chai": "^4.1.2",
+ "chai-as-promised": "^7.1.1",
+ "chai-subset": "^1.6.0",
+ "codecov": "^3.0.0",
"dotenv": "^4.0.0",
- "fs-extra": "^3.0.1",
+ "fs-extra": "^5.0.0",
"istanbul": "^0.4.5",
- "mocha": "^3.3.0",
+ "mocha": "^4.0.1",
"remap-istanbul": "^0.9.5",
- "sinon": "^2.2.0",
- "sinon-chai": "^2.10.0",
- "typings": "^2.1.0"
+ "sinon": "^4.1.2",
+ "sinon-chai": "^2.14.0",
+ "typings": "^2.1.1"
}
}
diff --git a/src/Engine.ts b/src/Engine.ts
index f473945..1a21bf1 100644
--- a/src/Engine.ts
+++ b/src/Engine.ts
@@ -12,7 +12,7 @@ export class Engine {
}
public async createModelFromDatabase(): Promise {
- let dbModel = await this.getEntitiesInfo(this.Options.databaseName, this.Options.host, this.Options.port, this.Options.user, this.Options.password);
+ let dbModel = await this.getEntitiesInfo(this.Options.databaseName, this.Options.host, this.Options.port, this.Options.user, this.Options.password, this.Options.schemaName, this.Options.ssl);
if (dbModel.entities.length > 0) {
this.createModelFromMetadata(dbModel);
} else {
@@ -20,8 +20,8 @@ export class Engine {
}
return true;
}
- private async getEntitiesInfo(database: string, server: string, port: number, user: string, password: string): Promise {
- return await this.driver.GetDataFromServer(database, server, port, user, password)
+ private async getEntitiesInfo(database: string, server: string, port: number, user: string, password: string, schemaName:string, ssl:boolean): Promise {
+ return await this.driver.GetDataFromServer(database, server, port, user, password,schemaName,ssl)
}
private createModelFromMetadata(databaseModel: DatabaseModel) {
@@ -99,5 +99,7 @@ export interface EngineOptions {
password: string,
resultsPath: string,
databaseType: string,
+ schemaName:string,
+ ssl:boolean,
convertCase: boolean
}
diff --git a/src/drivers/AbstractDriver.ts b/src/drivers/AbstractDriver.ts
index 7f6f399..707a86c 100644
--- a/src/drivers/AbstractDriver.ts
+++ b/src/drivers/AbstractDriver.ts
@@ -4,22 +4,22 @@ import { DatabaseModel } from './../models/DatabaseModel'
* AbstractDriver
*/
export abstract class AbstractDriver {
- async GetDataFromServer(database: string, server: string, port: number, user: string, password: string): Promise {
+ async GetDataFromServer(database: string, server: string, port: number, user: string, password: string, schema:string, ssl:boolean): Promise {
let dbModel = {};
- await this.ConnectToServer(database, server, port, user, password);
- dbModel.entities = await this.GetAllTables();
- await this.GetCoulmnsFromEntity(dbModel.entities);
- await this.GetIndexesFromEntity(dbModel.entities);
- dbModel.entities = await this.GetRelations(dbModel.entities);
+ await this.ConnectToServer(database, server, port, user, password,ssl);
+ dbModel.entities = await this.GetAllTables(schema);
+ await this.GetCoulmnsFromEntity(dbModel.entities,schema);
+ await this.GetIndexesFromEntity(dbModel.entities,schema);
+ dbModel.entities = await this.GetRelations(dbModel.entities,schema);
await this.DisconnectFromServer();
this.FindPrimaryColumnsFromIndexes(dbModel)
return dbModel;
}
- abstract async ConnectToServer(database: string, server: string, port: number, user: string, password: string);
- abstract async GetAllTables(): Promise
- abstract async GetCoulmnsFromEntity(entities: EntityInfo[]): Promise;
- abstract async GetIndexesFromEntity(entities: EntityInfo[]): Promise;
- abstract async GetRelations(entities: EntityInfo[]): Promise;
+ abstract async ConnectToServer(database: string, server: string, port: number, user: string, password: string,ssl:boolean);
+ abstract async GetAllTables(schema:string): Promise
+ abstract async GetCoulmnsFromEntity(entities: EntityInfo[],schema:string): Promise;
+ abstract async GetIndexesFromEntity(entities: EntityInfo[],schema:string): Promise;
+ abstract async GetRelations(entities: EntityInfo[],schema:string): Promise;
abstract async FindPrimaryColumnsFromIndexes(dbModel: DatabaseModel);
abstract async DisconnectFromServer();
diff --git a/src/drivers/MariaDbDriver.ts b/src/drivers/MariaDbDriver.ts
index 14badc6..3595d97 100644
--- a/src/drivers/MariaDbDriver.ts
+++ b/src/drivers/MariaDbDriver.ts
@@ -4,404 +4,11 @@ import { ColumnInfo } from './../models/ColumnInfo'
import { EntityInfo } from './../models/EntityInfo'
import { RelationInfo } from './../models/RelationInfo'
import { DatabaseModel } from './../models/DatabaseModel'
+import { MysqlDriver } from './MysqlDriver';
/**
* MariaDb
*/
-export class MariaDbDriver extends AbstractDriver {
- FindPrimaryColumnsFromIndexes(dbModel: DatabaseModel) {
- dbModel.entities.forEach(entity => {
- let primaryIndex = entity.Indexes.find(v => v.isPrimaryKey);
- if (!primaryIndex) {
- console.error(`Table ${entity.EntityName} has no PK.`)
- return;
- }
- entity.Columns.forEach(col => {
- if (primaryIndex!.columns.some(cIndex => cIndex.name == col.name)) col.isPrimary = true
- })
- });
- }
-
- async GetAllTables(): Promise {
-
- let response = await this.ExecQuery<{ TABLE_SCHEMA: string, TABLE_NAME: string }>(`SELECT TABLE_SCHEMA, TABLE_NAME
- FROM information_schema.tables
- WHERE table_type='BASE TABLE'
- AND table_schema like DATABASE()`);
- let ret: EntityInfo[] = [];
- response.forEach((val) => {
- let ent: EntityInfo = new EntityInfo();
- ent.EntityName = val.TABLE_NAME;
- ent.Columns = [];
- ent.Indexes = [];
- ret.push(ent);
- })
- return ret;
- }
- async GetCoulmnsFromEntity(entities: EntityInfo[]): Promise {
- let response = await this.ExecQuery<{
- TABLE_NAME: string, COLUMN_NAME: string, COLUMN_DEFAULT: string,
- IS_NULLABLE: string, DATA_TYPE: string, CHARACTER_MAXIMUM_LENGTH: number,
- NUMERIC_PRECISION: number, NUMERIC_SCALE: number, IsIdentity: number
- }>(`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 FROM INFORMATION_SCHEMA.COLUMNS
- where TABLE_SCHEMA like DATABASE()`);
- entities.forEach((ent) => {
- response.filter((filterVal) => {
- return filterVal.TABLE_NAME == ent.EntityName;
- }).forEach((resp) => {
- let colInfo: ColumnInfo = new ColumnInfo();
- colInfo.name = resp.COLUMN_NAME;
- colInfo.is_nullable = resp.IS_NULLABLE == 'YES' ? true : false;
- colInfo.is_generated = resp.IsIdentity == 1 ? true : false;
- colInfo.default = resp.COLUMN_DEFAULT;
- switch (resp.DATA_TYPE) {
- case "int":
- colInfo.ts_type = "number"
- colInfo.sql_type = "int"
- break;
- case "tinyint":
- if (resp.NUMERIC_PRECISION == 3) {
- colInfo.ts_type = "boolean"
- colInfo.sql_type = "boolean"
- } else {
- colInfo.ts_type = "number"
- colInfo.sql_type = "smallint"
- }
- break;
- case "smallint":
- colInfo.ts_type = "number"
- colInfo.sql_type = "smallint"
- break;
- case "bit":
- colInfo.ts_type = "boolean"
- colInfo.sql_type = "boolean"
- break;
- case "float":
- colInfo.ts_type = "number"
- colInfo.sql_type = "float"
- break;
- case "bigint":
- colInfo.ts_type = "number"
- colInfo.sql_type = "bigint"
- break;
- case "date":
- colInfo.ts_type = "Date"
- colInfo.sql_type = "date"
- break;
- case "time":
- colInfo.ts_type = "Date"
- colInfo.sql_type = "time"
- break;
- case "datetime":
- colInfo.ts_type = "Date";
- colInfo.sql_type = "datetime"
- break;
- case "char":
- colInfo.ts_type = "string"
- colInfo.sql_type = "text"
- break;
- case "nchar":
- colInfo.ts_type = "string"
- colInfo.sql_type = "text"
- break;
- case "text":
- colInfo.ts_type = "string"
- colInfo.sql_type = "text"
- break;
- case "ntext":
- colInfo.ts_type = "string"
- colInfo.sql_type = "text"
- break;
- case "varchar":
- colInfo.ts_type = "string"
- colInfo.sql_type = "string"
- break;
- case "nvarchar":
- colInfo.ts_type = "string"
- colInfo.sql_type = "string"
- break;
- case "money":
- colInfo.ts_type = "number"
- colInfo.sql_type = "decimal"
- break;
- case "real":
- colInfo.ts_type = "number"
- colInfo.sql_type = "double"
- break;
- case "double":
- colInfo.ts_type = "number"
- colInfo.sql_type = "double"
- break;
- case "decimal":
- colInfo.ts_type = "number"
- colInfo.sql_type = "decimal"
- colInfo.numericPrecision = resp.NUMERIC_PRECISION
- colInfo.numericScale = resp.NUMERIC_SCALE
- break;
- case "xml":
- colInfo.ts_type = "string"
- colInfo.sql_type = "text"
- break;
- default:
- console.error("Unknown column type:" + resp.DATA_TYPE);
- break;
- }
- colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
- if (colInfo.sql_type) ent.Columns.push(colInfo);
- })
- })
- return entities;
- }
- async GetIndexesFromEntity(entities: EntityInfo[]): Promise {
- let response = await this.ExecQuery<{
- TableName: string, IndexName: string, ColumnName: string, is_unique: number,
- is_primary_key: number//, is_descending_key: number//, is_included_column: number
- }>(`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 like DATABASE();
- `);
- entities.forEach((ent) => {
- response.filter((filterVal) => {
- return filterVal.TableName == ent.EntityName;
- }).forEach((resp) => {
- let indexInfo: IndexInfo = {};
- let indexColumnInfo: IndexColumnInfo = {};
- if (ent.Indexes.filter((filterVal) => {
- return filterVal.name == resp.IndexName
- }).length > 0) {
- indexInfo = ent.Indexes.filter((filterVal) => {
- return filterVal.name == resp.IndexName
- })[0];
- } else {
- indexInfo.columns = [];
- indexInfo.name = resp.IndexName;
- indexInfo.isUnique = resp.is_unique == 1 ? true : false;
- indexInfo.isPrimaryKey = resp.is_primary_key == 1 ? true : false;
- ent.Indexes.push(indexInfo);
- }
- indexColumnInfo.name = resp.ColumnName;
- // indexColumnInfo.isIncludedColumn = resp.is_included_column == 1 ? true : false;
- // indexColumnInfo.isDescending = resp.is_descending_key == 1 ? true : false;
- indexInfo.columns.push(indexColumnInfo);
-
- })
- })
-
- return entities;
- }
- async GetRelations(entities: EntityInfo[]): Promise {
- let response = await this.ExecQuery<{
- TableWithForeignKey: string, FK_PartNo: number, ForeignKeyColumn: string,
- TableReferenced: string, ForeignKeyColumnReferenced: string,
- onDelete: "RESTRICT" | "CASCADE" | "SET NULL",
- onUpdate: "RESTRICT" | "CASCADE" | "SET NULL", object_id: string
- }>(`SELECT
- CU.TABLE_NAME TableWithForeignKey,
- CU.ORDINAL_POSITION FK_PartNo,
- CU.COLUMN_NAME ForeignKeyColumn,
- CU.REFERENCED_TABLE_NAME TableReferenced,
- CU.REFERENCED_COLUMN_NAME ForeignKeyColumnReferenced,
- RC.DELETE_RULE onDelete,
- RC.UPDATE_RULE onUpdate,
- CU.CONSTRAINT_NAME object_id
- FROM
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
- JOIN
- INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC ON CU.CONSTRAINT_NAME=RC.CONSTRAINT_NAME
- WHERE
- TABLE_SCHEMA = SCHEMA()
- AND CU.REFERENCED_TABLE_NAME IS NOT NULL;
- `);
- let relationsTemp: RelationTempInfo[] = [];
- response.forEach((resp) => {
- let rels = relationsTemp.find((val) => {
- return val.object_id == resp.object_id;
- })
- if (rels == undefined) {
- rels = {};
- rels.ownerColumnsNames = [];
- rels.referencedColumnsNames = [];
- rels.actionOnDelete = resp.onDelete;
- rels.actionOnUpdate = resp.onUpdate;
- rels.object_id = resp.object_id;
- rels.ownerTable = resp.TableWithForeignKey;
- rels.referencedTable = resp.TableReferenced;
- relationsTemp.push(rels);
- }
- rels.ownerColumnsNames.push(resp.ForeignKeyColumn);
- rels.referencedColumnsNames.push(resp.ForeignKeyColumnReferenced);
- })
- relationsTemp.forEach((relationTmp) => {
- let ownerEntity = entities.find((entitity) => {
- return entitity.EntityName == relationTmp.ownerTable;
- })
- if (!ownerEntity) {
- console.error(`Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity model ${relationTmp.ownerTable}.`)
- return;
- }
- let referencedEntity = entities.find((entitity) => {
- return entitity.EntityName == relationTmp.referencedTable;
- })
- if (!referencedEntity) {
- console.error(`Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity model ${relationTmp.referencedTable}.`)
- return;
- }
- let ownerColumn = ownerEntity.Columns.find((column) => {
- return column.name == relationTmp.ownerColumnsNames[0];
- })
- if (!ownerColumn) {
- console.error(`Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity column ${relationTmp.ownerTable}.${ownerColumn}.`)
- return;
- }
- let relatedColumn = referencedEntity.Columns.find((column) => {
- return column.name == relationTmp.referencedColumnsNames[0];
- })
- if (!relatedColumn) {
- console.error(`Relation between tables ${relationTmp.ownerTable} and ${relationTmp.referencedTable} didn't found entity column ${relationTmp.referencedTable}.${relatedColumn}.`)
- return;
- }
- let ownColumn: ColumnInfo = ownerColumn;
- let isOneToMany: boolean;
- isOneToMany = false;
- let index = ownerEntity.Indexes.find(
- (index) => {
- return index.isUnique && index.columns.some(col => {
- return col.name == ownerColumn!.name
- })
- }
- )
- if (!index) {
- isOneToMany = true;
- } else {
- isOneToMany = false;
- }
- let ownerRelation = new RelationInfo()
- ownerRelation.actionOnDelete = relationTmp.actionOnDelete
- ownerRelation.actionOnUpdate = relationTmp.actionOnUpdate
- ownerRelation.isOwner = true
- ownerRelation.relatedColumn = relatedColumn.name.toLowerCase()
- ownerRelation.relatedTable = relationTmp.referencedTable
- ownerRelation.ownerTable = relationTmp.ownerTable
- ownerRelation.ownerColumn = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')
- ownerRelation.relationType = isOneToMany ? "ManyToOne" : "OneToOne"
- ownerColumn.relations.push(ownerRelation)
- if (isOneToMany) {
- let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase() + 's'
- let referencedRelation = new RelationInfo();
- col.relations.push(referencedRelation)
- referencedRelation.actionOnDelete = relationTmp.actionOnDelete
- referencedRelation.actionOnUpdate = relationTmp.actionOnUpdate
- referencedRelation.isOwner = false
- referencedRelation.relatedColumn = ownerColumn.name
- referencedRelation.relatedTable = relationTmp.ownerTable
- referencedRelation.ownerTable = relationTmp.referencedTable
- referencedRelation.ownerColumn = relatedColumn.name.toLowerCase()
- referencedRelation.relationType = "OneToMany"
- referencedEntity.Columns.push(col)
- } else {
- let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase()
- let referencedRelation = new RelationInfo();
- col.relations.push(referencedRelation)
- referencedRelation.actionOnDelete = relationTmp.actionOnDelete
- referencedRelation.actionOnUpdate = relationTmp.actionOnUpdate
- referencedRelation.isOwner = false
- referencedRelation.relatedColumn = ownerColumn.name
- referencedRelation.relatedTable = relationTmp.ownerTable
- referencedRelation.ownerTable = relationTmp.referencedTable
- referencedRelation.ownerColumn = relatedColumn.name.toLowerCase()
- referencedRelation.relationType = "OneToOne"
-
- referencedEntity.Columns.push(col)
- }
- })
- return entities;
- }
- async DisconnectFromServer() {
- let promise = new Promise(
- (resolve, reject) => {
- this.Connection.end((err) => {
- if (!err) {
- //Connection successfull
- resolve(true)
- }
- else {
- console.error('Error disconnecting to MariaDb Server.')
- console.error(err.message)
- process.abort()
- reject(err)
- }
- });
- }
- )
-
- if (this.Connection)
- await promise;
-
- }
-
- private Connection: MariaDb.IConnection;
- async ConnectToServer(database: string, server: string, port: number, user: string, password: string) {
- let config: MariaDb.IConnectionConfig = {
- database: database,
- host: server,
- port: port,
- user: user,
- password: password,
- }
-
-
- let promise = new Promise(
- (resolve, reject) => {
- this.Connection = MariaDb.createConnection(config)
-
- this.Connection.connect((err) => {
- if (!err) {
- //Connection successfull
- resolve(true)
- }
- else {
- console.error('Error connecting to MariaDb Server.')
- console.error(err.message)
- process.abort()
- reject(err)
- }
- });
- }
- )
-
- await promise;
- }
- async CreateDB(dbName: string) {
- let resp = await this.ExecQuery(`CREATE DATABASE ${dbName}; `)
- }
- async UseDB(dbName: string) {
- let resp = await this.ExecQuery(`USE ${dbName}; `)
- }
- async DropDB(dbName: string) {
- let resp = await this.ExecQuery(`DROP DATABASE ${dbName}; `)
- }
- async CheckIfDBExists(dbName: string): Promise {
- let resp = await this.ExecQuery(`SHOW DATABASES LIKE '${dbName}' `)
- return resp.length > 0;
- }
- async ExecQuery(sql: string): Promise> {
- let ret: Array = [];
- let that = this;
- let query = this.Connection.query(sql)
- let stream = query.stream({});
- let promise = new Promise(
- (resolve, reject) => {
- stream.on('data',
- chunk => {
- ret.push(chunk)
- });
- stream.on('end', () => resolve(true));
- })
- await promise;
- return ret;
- }
+export class MariaDbDriver extends MysqlDriver {
+ readonly EngineName:string = 'MariaDb'
+
}
\ No newline at end of file
diff --git a/src/drivers/MssqlDriver.ts b/src/drivers/MssqlDriver.ts
index d67a41f..2fa64d4 100644
--- a/src/drivers/MssqlDriver.ts
+++ b/src/drivers/MssqlDriver.ts
@@ -21,10 +21,10 @@ export class MssqlDriver extends AbstractDriver {
});
}
- async GetAllTables(): Promise {
+ async GetAllTables(schema: string): Promise {
let request = new MSSQL.Request(this.Connection)
let response: { TABLE_SCHEMA: string, TABLE_NAME: string }[]
- = await request.query("SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'");
+ = (await request.query(`SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA='${schema}'`)).recordset;
let ret: EntityInfo[] = [];
response.forEach((val) => {
let ent: EntityInfo = new EntityInfo();
@@ -35,16 +35,16 @@ export class MssqlDriver extends AbstractDriver {
})
return ret;
}
- async GetCoulmnsFromEntity(entities: EntityInfo[]): Promise {
+ async GetCoulmnsFromEntity(entities: EntityInfo[], schema: string): Promise {
let request = new MSSQL.Request(this.Connection)
let response: {
TABLE_NAME: string, COLUMN_NAME: string, COLUMN_DEFAULT: string,
IS_NULLABLE: string, DATA_TYPE: string, CHARACTER_MAXIMUM_LENGTH: number,
NUMERIC_PRECISION: number, NUMERIC_SCALE: number, IsIdentity: 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 FROM INFORMATION_SCHEMA.COLUMNS`);
+ COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') IsIdentity FROM INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='${schema}'`)).recordset;
entities.forEach((ent) => {
response.filter((filterVal) => {
return filterVal.TABLE_NAME == ent.EntityName;
@@ -58,14 +58,17 @@ export class MssqlDriver extends AbstractDriver {
case "int":
colInfo.ts_type = "number"
colInfo.sql_type = "int"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "tinyint":
colInfo.ts_type = "number"
colInfo.sql_type = "smallint"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "smallint":
colInfo.ts_type = "number"
colInfo.sql_type = "smallint"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "bit":
colInfo.ts_type = "boolean"
@@ -74,10 +77,13 @@ export class MssqlDriver extends AbstractDriver {
case "float":
colInfo.ts_type = "number"
colInfo.sql_type = "float"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
+ colInfo.numericPrecision = resp.NUMERIC_PRECISION
break;
case "bigint":
- colInfo.ts_type = "number"
+ colInfo.ts_type = "string"
colInfo.sql_type = "bigint"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "date":
colInfo.ts_type = "Date"
@@ -93,11 +99,13 @@ export class MssqlDriver extends AbstractDriver {
break;
case "char":
colInfo.ts_type = "string"
- colInfo.sql_type = "text"
+ colInfo.sql_type = "char"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "nchar":
colInfo.ts_type = "string"
- colInfo.sql_type = "text"
+ colInfo.sql_type = "nchar"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "text":
colInfo.ts_type = "string"
@@ -105,29 +113,81 @@ export class MssqlDriver extends AbstractDriver {
break;
case "ntext":
colInfo.ts_type = "string"
- colInfo.sql_type = "text"
+ colInfo.sql_type = "ntext"
+ break;
+ case "uniqueidentifier":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "uniqueidentifier"
break;
case "varchar":
colInfo.ts_type = "string"
- colInfo.sql_type = "string"
+ colInfo.sql_type = "varchar"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
+ break;
+ case "binary":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "binary"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
+ break;
+ case "varbinary":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "varbinary"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
+ break;
+ case "image":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "image"
break;
case "nvarchar":
colInfo.ts_type = "string"
- colInfo.sql_type = "string"
+ colInfo.sql_type = "nvarchar"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "money":
colInfo.ts_type = "number"
colInfo.sql_type = "decimal"
break;
+ case "smallmoney":
+ colInfo.ts_type = "number"
+ colInfo.sql_type = "smallmoney"
+ break;
case "real":
colInfo.ts_type = "number"
colInfo.sql_type = "double"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "decimal":
colInfo.ts_type = "number"
colInfo.sql_type = "decimal"
colInfo.numericPrecision = resp.NUMERIC_PRECISION
colInfo.numericScale = resp.NUMERIC_SCALE
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
+ break;
+ case "numeric":
+ colInfo.ts_type = "number"
+ colInfo.sql_type = "numeric"
+ colInfo.numericPrecision = resp.NUMERIC_PRECISION
+ colInfo.numericScale = resp.NUMERIC_SCALE
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
+ break;
+ case "datetime2":
+ colInfo.ts_type = "Date"
+ colInfo.sql_type = "datetime2"
+ colInfo.numericPrecision = resp.NUMERIC_PRECISION
+ break;
+ case "time":
+ colInfo.ts_type = "Date"
+ colInfo.sql_type = "time"
+ colInfo.numericPrecision = resp.NUMERIC_PRECISION
+ break;
+ case "datetimeoffset":
+ colInfo.ts_type = "Date"
+ colInfo.sql_type = "datetimeoffset"
+ colInfo.numericPrecision = resp.NUMERIC_PRECISION
+ break;
+ case "smalldatetime":
+ colInfo.ts_type = "Date"
+ colInfo.sql_type = "smalldatetime"
break;
case "xml":
colInfo.ts_type = "string"
@@ -137,19 +197,19 @@ export class MssqlDriver extends AbstractDriver {
console.error("Unknown column type:" + resp.DATA_TYPE);
break;
}
- colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
+
if (colInfo.sql_type) ent.Columns.push(colInfo);
})
})
return entities;
}
- async GetIndexesFromEntity(entities: EntityInfo[]): Promise {
+ async GetIndexesFromEntity(entities: EntityInfo[], schema: string): Promise {
let request = new MSSQL.Request(this.Connection)
let response: {
TableName: string, IndexName: string, ColumnName: string, is_unique: number,
is_primary_key: number//, is_descending_key: number//, is_included_column: number
}[]
- = await request.query(`SELECT
+ = (await request.query(`SELECT
TableName = t.name,
IndexName = ind.name,
ColumnName = col.name,
@@ -165,10 +225,12 @@ INNER JOIN
sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
INNER JOIN
sys.tables t ON ind.object_id = t.object_id
+INNER JOIN
+ sys.schemas s on s.schema_id=t.schema_id
WHERE
- t.is_ms_shipped = 0
+ t.is_ms_shipped = 0 and s.name='${schema}'
ORDER BY
- t.name, ind.name, ind.index_id, ic.key_ordinal;`);
+ t.name, ind.name, ind.index_id, ic.key_ordinal;`)).recordset;
entities.forEach((ent) => {
response.filter((filterVal) => {
return filterVal.TableName == ent.EntityName;
@@ -198,7 +260,7 @@ ORDER BY
return entities;
}
- async GetRelations(entities: EntityInfo[]): Promise {
+ async GetRelations(entities: EntityInfo[], schema: string): Promise {
let request = new MSSQL.Request(this.Connection)
let response: {
TableWithForeignKey: string, FK_PartNo: number, ForeignKeyColumn: string,
@@ -206,7 +268,7 @@ ORDER BY
onDelete: "RESTRICT" | "CASCADE" | "SET NULL",
onUpdate: "RESTRICT" | "CASCADE" | "SET NULL", object_id: number
}[]
- = await request.query(`select
+ = (await request.query(`select
parentTable.name as TableWithForeignKey,
fkc.constraint_column_id as FK_PartNo,
parentColumn.name as ForeignKeyColumn,
@@ -227,10 +289,12 @@ inner join
sys.tables as referencedTable on fkc.referenced_object_id = referencedTable.object_id
inner join
sys.columns as referencedColumn on fkc.referenced_object_id = referencedColumn.object_id and fkc.referenced_column_id = referencedColumn.column_id
+inner join
+ sys.schemas as parentSchema on parentSchema.schema_id=parentTable.schema_id
where
- fk.is_disabled=0 and fk.is_ms_shipped=0
+ fk.is_disabled=0 and fk.is_ms_shipped=0 and parentSchema.name='${schema}'
order by
- TableWithForeignKey, FK_PartNo`);
+ TableWithForeignKey, FK_PartNo`)).recordset;
let relationsTemp: RelationTempInfo[] = [];
response.forEach((resp) => {
let rels = relationsTemp.find((val) => {
@@ -295,18 +359,29 @@ order by
isOneToMany = false;
}
let ownerRelation = new RelationInfo()
+ let columnName = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')
+ if (referencedEntity.Columns.filter((filterVal) => {
+ return filterVal.name == columnName;
+ }).length>0){
+ for (let i=2;i<=ownerEntity.Columns.length;i++){
+ columnName = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')+i.toString();
+ if (referencedEntity.Columns.filter((filterVal) => {
+ return filterVal.name == columnName;
+ }).length==0) break;
+ }
+ }
ownerRelation.actionOnDelete = relationTmp.actionOnDelete
ownerRelation.actionOnUpdate = relationTmp.actionOnUpdate
ownerRelation.isOwner = true
ownerRelation.relatedColumn = relatedColumn.name.toLowerCase()
ownerRelation.relatedTable = relationTmp.referencedTable
ownerRelation.ownerTable = relationTmp.ownerTable
- ownerRelation.ownerColumn = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')
+ ownerRelation.ownerColumn = columnName
ownerRelation.relationType = isOneToMany ? "ManyToOne" : "OneToOne"
ownerColumn.relations.push(ownerRelation)
if (isOneToMany) {
let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase() + 's'
+ col.name = columnName
let referencedRelation = new RelationInfo();
col.relations.push(referencedRelation)
referencedRelation.actionOnDelete = relationTmp.actionOnDelete
@@ -320,7 +395,7 @@ order by
referencedEntity.Columns.push(col)
} else {
let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase()
+ col.name = columnName
let referencedRelation = new RelationInfo();
col.relations.push(referencedRelation)
referencedRelation.actionOnDelete = relationTmp.actionOnDelete
@@ -342,8 +417,8 @@ order by
await this.Connection.close();
}
- private Connection: MSSQL.Connection;
- async ConnectToServer(database: string, server: string, port: number, user: string, password: string) {
+ private Connection: MSSQL.ConnectionPool;
+ async ConnectToServer(database: string, server: string, port: number, user: string, password: string, ssl: boolean) {
let config: MSSQL.config = {
database: database,
server: server,
@@ -351,7 +426,7 @@ order by
user: user,
password: password,
options: {
- encrypt: true, // Use this if you're on Windows Azure
+ encrypt: ssl, // Use this if you're on Windows Azure
appName: 'typeorm-model-generator'
}
}
@@ -359,7 +434,7 @@ order by
let promise = new Promise(
(resolve, reject) => {
- this.Connection = new MSSQL.Connection(config, (err) => {
+ this.Connection = new MSSQL.ConnectionPool(config, (err) => {
if (!err) {
//Connection successfull
resolve(true)
@@ -391,6 +466,6 @@ order by
async CheckIfDBExists(dbName: string): Promise {
let request = new MSSQL.Request(this.Connection);
let resp = await request.query(`SELECT name FROM master.sys.databases WHERE name = N'${dbName}' `)
- return resp.length > 0;
+ return resp.recordset.length > 0;
}
}
\ No newline at end of file
diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts
index 606bdc9..e279b47 100644
--- a/src/drivers/MysqlDriver.ts
+++ b/src/drivers/MysqlDriver.ts
@@ -8,6 +8,8 @@ import { DatabaseModel } from './../models/DatabaseModel'
* MysqlDriver
*/
export class MysqlDriver extends AbstractDriver {
+ readonly EngineName: string = 'MySQL'
+
FindPrimaryColumnsFromIndexes(dbModel: DatabaseModel) {
dbModel.entities.forEach(entity => {
let primaryIndex = entity.Indexes.find(v => v.isPrimaryKey);
@@ -21,7 +23,7 @@ export class MysqlDriver extends AbstractDriver {
});
}
- async GetAllTables(): Promise {
+ async GetAllTables(schema: string): Promise {
let response = await this.ExecQuery<{ TABLE_SCHEMA: string, TABLE_NAME: string }>(`SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
@@ -37,7 +39,7 @@ export class MysqlDriver extends AbstractDriver {
})
return ret;
}
- async GetCoulmnsFromEntity(entities: EntityInfo[]): Promise {
+ async GetCoulmnsFromEntity(entities: EntityInfo[], schema: string): Promise {
let response = await this.ExecQuery<{
TABLE_NAME: string, COLUMN_NAME: string, COLUMN_DEFAULT: string,
IS_NULLABLE: string, DATA_TYPE: string, CHARACTER_MAXIMUM_LENGTH: number,
@@ -59,19 +61,16 @@ export class MysqlDriver extends AbstractDriver {
case "int":
colInfo.ts_type = "number"
colInfo.sql_type = "int"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "tinyint":
- if (resp.NUMERIC_PRECISION == 3) {
- colInfo.ts_type = "boolean"
- colInfo.sql_type = "boolean"
- } else {
- colInfo.ts_type = "number"
- colInfo.sql_type = "smallint"
- }
+ colInfo.ts_type = "number"
+ colInfo.sql_type = "tinyint"
break;
case "smallint":
colInfo.ts_type = "number"
colInfo.sql_type = "smallint"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "bit":
colInfo.ts_type = "boolean"
@@ -80,17 +79,19 @@ export class MysqlDriver extends AbstractDriver {
case "float":
colInfo.ts_type = "number"
colInfo.sql_type = "float"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "bigint":
colInfo.ts_type = "number"
colInfo.sql_type = "bigint"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "date":
- colInfo.ts_type = "Date"
+ colInfo.ts_type = "string"
colInfo.sql_type = "date"
break;
case "time":
- colInfo.ts_type = "Date"
+ colInfo.ts_type = "string"
colInfo.sql_type = "time"
break;
case "datetime":
@@ -113,13 +114,57 @@ export class MysqlDriver extends AbstractDriver {
colInfo.ts_type = "string"
colInfo.sql_type = "text"
break;
+
+ case "mediumint":
+ colInfo.ts_type = "number"
+ colInfo.sql_type = "mediumint"
+ break;
+ case "timestamp":
+ colInfo.ts_type = "Date"
+ colInfo.sql_type = "timestamp"
+ break;
+ case "year":
+ colInfo.ts_type = "number"
+ colInfo.sql_type = "year"
+ break;
+ case "blob":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "blob"
+ break;
+ case "tinyblob":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "tinyblob"
+ break;
+ case "tinytext":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "tinytext"
+ break;
+ case "mediumblob":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "mediumblob"
+ break;
+ case "mediumtext":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "mediumtext"
+ break;
+ case "longblob":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "longblob"
+ break;
+ case "longtext":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "longtext"
+ break;
+
case "varchar":
colInfo.ts_type = "string"
- colInfo.sql_type = "string"
+ colInfo.sql_type = "varchar"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "nvarchar":
colInfo.ts_type = "string"
- colInfo.sql_type = "string"
+ colInfo.sql_type = "nvarchar"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "money":
colInfo.ts_type = "number"
@@ -128,32 +173,38 @@ export class MysqlDriver extends AbstractDriver {
case "real":
colInfo.ts_type = "number"
colInfo.sql_type = "double"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "double":
colInfo.ts_type = "number"
colInfo.sql_type = "double"
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "decimal":
colInfo.ts_type = "number"
colInfo.sql_type = "decimal"
colInfo.numericPrecision = resp.NUMERIC_PRECISION
colInfo.numericScale = resp.NUMERIC_SCALE
+ colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
break;
case "xml":
colInfo.ts_type = "string"
colInfo.sql_type = "text"
break;
+ case "json":
+ colInfo.ts_type = "Object"
+ colInfo.sql_type = "json"
+ break;
default:
console.error("Unknown column type:" + resp.DATA_TYPE);
break;
}
- colInfo.char_max_lenght = resp.CHARACTER_MAXIMUM_LENGTH > 0 ? resp.CHARACTER_MAXIMUM_LENGTH : null;
if (colInfo.sql_type) ent.Columns.push(colInfo);
})
})
return entities;
}
- async GetIndexesFromEntity(entities: EntityInfo[]): Promise {
+ async GetIndexesFromEntity(entities: EntityInfo[], schema: string): Promise {
let response = await this.ExecQuery<{
TableName: string, IndexName: string, ColumnName: string, is_unique: number,
is_primary_key: number//, is_descending_key: number//, is_included_column: number
@@ -191,7 +242,7 @@ export class MysqlDriver extends AbstractDriver {
return entities;
}
- async GetRelations(entities: EntityInfo[]): Promise {
+ async GetRelations(entities: EntityInfo[], schema: string): Promise {
let response = await this.ExecQuery<{
TableWithForeignKey: string, FK_PartNo: number, ForeignKeyColumn: string,
TableReferenced: string, ForeignKeyColumnReferenced: string,
@@ -278,18 +329,29 @@ export class MysqlDriver extends AbstractDriver {
isOneToMany = false;
}
let ownerRelation = new RelationInfo()
+ let columnName = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')
+ if (referencedEntity.Columns.filter((filterVal) => {
+ return filterVal.name == columnName;
+ }).length > 0) {
+ for (let i=2;i<=ownerEntity.Columns.length;i++){
+ columnName = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '') + i.toString();
+ if (referencedEntity.Columns.filter((filterVal) => {
+ return filterVal.name == columnName;
+ }).length == 0) break;
+ }
+ }
ownerRelation.actionOnDelete = relationTmp.actionOnDelete
ownerRelation.actionOnUpdate = relationTmp.actionOnUpdate
ownerRelation.isOwner = true
ownerRelation.relatedColumn = relatedColumn.name.toLowerCase()
ownerRelation.relatedTable = relationTmp.referencedTable
ownerRelation.ownerTable = relationTmp.ownerTable
- ownerRelation.ownerColumn = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')
+ ownerRelation.ownerColumn = columnName
ownerRelation.relationType = isOneToMany ? "ManyToOne" : "OneToOne"
ownerColumn.relations.push(ownerRelation)
if (isOneToMany) {
let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase() + 's'
+ col.name = columnName
let referencedRelation = new RelationInfo();
col.relations.push(referencedRelation)
referencedRelation.actionOnDelete = relationTmp.actionOnDelete
@@ -303,7 +365,7 @@ export class MysqlDriver extends AbstractDriver {
referencedEntity.Columns.push(col)
} else {
let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase()
+ col.name = columnName
let referencedRelation = new RelationInfo();
col.relations.push(referencedRelation)
referencedRelation.actionOnDelete = relationTmp.actionOnDelete
@@ -329,7 +391,7 @@ export class MysqlDriver extends AbstractDriver {
resolve(true)
}
else {
- console.error('Error disconnecting to MYSQL Server.')
+ console.error(`Error disconnecting to ${this.EngineName} Server.`)
console.error(err.message)
process.abort()
reject(err)
@@ -343,14 +405,28 @@ export class MysqlDriver extends AbstractDriver {
}
- private Connection: MYSQL.IConnection;
- async ConnectToServer(database: string, server: string, port: number, user: string, password: string) {
- let config: MYSQL.IConnectionConfig = {
- database: database,
- host: server,
- port: port,
- user: user,
- password: password,
+ private Connection: MYSQL.Connection;
+ async ConnectToServer(database: string, server: string, port: number, user: string, password: string, ssl: boolean) {
+ let config: MYSQL.ConnectionConfig
+ if (ssl) {
+ config = {
+ database: database,
+ host: server,
+ port: port,
+ user: user,
+ password: password,
+ ssl: {
+ rejectUnauthorized: false
+ }
+ }
+ } else {
+ config = {
+ database: database,
+ host: server,
+ port: port,
+ user: user,
+ password: password
+ }
}
@@ -364,7 +440,7 @@ export class MysqlDriver extends AbstractDriver {
resolve(true)
}
else {
- console.error('Error connecting to MYSQL Server.')
+ console.error(`Error connecting to ${this.EngineName} Server.`)
console.error(err.message)
process.abort()
reject(err)
diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts
index 4d6ae3d..f1d7176 100644
--- a/src/drivers/PostgresDriver.ts
+++ b/src/drivers/PostgresDriver.ts
@@ -23,10 +23,10 @@ export class PostgresDriver extends AbstractDriver {
});
}
- async GetAllTables(): Promise {
+ async GetAllTables(schema: string): Promise {
let response: { table_schema: string, table_name: string }[]
- = (await this.Connection.query("SELECT table_schema,table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND table_schema = 'public' ")).rows;
+ = (await this.Connection.query(`SELECT table_schema,table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND table_schema = '${schema}' `)).rows;
let ret: EntityInfo[] = [];
response.forEach((val) => {
@@ -38,7 +38,7 @@ export class PostgresDriver extends AbstractDriver {
})
return ret;
}
- async GetCoulmnsFromEntity(entities: EntityInfo[]): Promise {
+ async GetCoulmnsFromEntity(entities: EntityInfo[], schema: string): Promise {
let response: {
table_name: string, column_name: string, column_default: string,
is_nullable: string, data_type: string, character_maximum_length: number,
@@ -46,9 +46,9 @@ export class PostgresDriver extends AbstractDriver {
}[]
= (await this.Connection.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
+ --,COLUMNPROPERTY(object_id(table_name), column_name, 'isidentity') isidentity
, case when column_default LIKE 'nextval%' then 'YES' else 'NO' end isidentity
- FROM INFORMATION_SCHEMA.COLUMNS where table_schema ='public'`)).rows;
+ FROM INFORMATION_SCHEMA.COLUMNS where table_schema ='${schema}'`)).rows;
entities.forEach((ent) => {
response.filter((filterVal) => {
return filterVal.table_name == ent.EntityName;
@@ -59,29 +59,33 @@ export class PostgresDriver extends AbstractDriver {
colInfo.is_generated = resp.isidentity == 'YES' ? true : false;
colInfo.default = colInfo.is_generated ? '' : resp.column_default;
switch (resp.data_type) {
- //TODO:change types to postgres
case "integer":
colInfo.ts_type = "number"
colInfo.sql_type = "int"
break;
case "character varying":
colInfo.ts_type = "string"
- colInfo.sql_type = "text"
+ colInfo.sql_type = "varchar"
+ colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length : null;
break;
case "text":
colInfo.ts_type = "string"
colInfo.sql_type = "text"
break;
+ case "uuid":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "uuid"
+ break;
case "smallint":
colInfo.ts_type = "number"
colInfo.sql_type = "smallint"
break;
case "bigint":
- colInfo.ts_type = "number"
+ colInfo.ts_type = "string"
colInfo.sql_type = "bigint"
break;
case "date":
- colInfo.ts_type = "Date"
+ colInfo.ts_type = "string"
colInfo.sql_type = "date"
break;
case "boolean":
@@ -91,71 +95,154 @@ export class PostgresDriver extends AbstractDriver {
case "double precision":
colInfo.ts_type = "number"
colInfo.sql_type = "double"
+ colInfo.numericPrecision = resp.numeric_precision
+ colInfo.numericScale = resp.numeric_scale
break;
case "real":
colInfo.ts_type = "number"
colInfo.sql_type = "float"
+ colInfo.numericPrecision = resp.numeric_precision
+ colInfo.numericScale = resp.numeric_scale
break;
case "numeric":
- colInfo.ts_type = "number"
- colInfo.sql_type = "decimal"
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "numeric"
+ colInfo.numericPrecision = resp.numeric_precision
+ colInfo.numericScale = resp.numeric_scale
break;
case "time without time zone":
- colInfo.ts_type = "Date"
- colInfo.sql_type = "time"
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "time without time zone"
break;
case "timestamp without time zone":
colInfo.ts_type = "Date"
colInfo.sql_type = "datetime"
break;
+ case "timestamp with time zone":
+ colInfo.ts_type = "Date"
+ colInfo.sql_type = "timestamp"
+ break;
case "json":
- colInfo.ts_type = "any"
+ colInfo.ts_type = "Object"
colInfo.sql_type = "json"
break;
- // case "boolean":
- // colInfo.ts_type = "boolean"
- // colInfo.sql_type = "boolean"
- // break;
+ case "jsonb":
+ colInfo.ts_type = "Object"
+ colInfo.sql_type = "jsonb"
+ break;
+ case "money":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "money"
+ break;
+ case "character":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "character"
+ colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length : null;
+ break;
+ case "bytea":
+ colInfo.ts_type = "Buffer"
+ colInfo.sql_type = "bytea"
+ break;
+ case "interval":
+ colInfo.ts_type = "any"
+ colInfo.sql_type = "interval"
+ break;
+ case "time with time zone":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "time with time zone"
+ break;
+ case "point":
+ colInfo.ts_type = "string | Object"
+ colInfo.sql_type = "point"
+ break;
+ case "line":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "line"
+ break;
+ case "lseg":
+ colInfo.ts_type = "string | string[]"
+ colInfo.sql_type = "lseg"
+ break;
+ case "box":
+ colInfo.ts_type = "string | Object"
+ colInfo.sql_type = "box"
+ break;
+ case "path":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "path"
+ break;
+ case "polygon":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "polygon"
+ break;
+ case "circle":
+ colInfo.ts_type = "string | Object"
+ colInfo.sql_type = "circle"
+ break;
+ case "cidr":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "cidr"
+ break;
+ case "inet":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "inet"
+ break;
+ case "macaddr":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "macaddr"
+ break;
+ case "bit":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "bit"
+ break;
+ case "bit varying":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "bit varying"
+ break;
+ case "xml":
+ colInfo.ts_type = "string"
+ colInfo.sql_type = "xml"
+ break;
default:
console.error("Unknown column type:" + resp.data_type);
break;
}
- colInfo.char_max_lenght = resp.character_maximum_length > 0 ? resp.character_maximum_length : null;
+
if (colInfo.sql_type) ent.Columns.push(colInfo);
})
})
return entities;
}
- async GetIndexesFromEntity(entities: EntityInfo[]): Promise {
+ async GetIndexesFromEntity(entities: EntityInfo[], schema: string): Promise {
let response: {
tablename: string, indexname: string, columnname: string, is_unique: number,
is_primary_key: number//, is_descending_key: number//, is_included_column: number
}[]
- = (await this.Connection.query(`SELECT
+ = (await this.Connection.query(`SELECT
c.relname AS tablename,
- i.relname as indexname,
- f.attname AS columnname,
- CASE
- WHEN ix.indisunique = true THEN '1'
+ i.relname as indexname,
+ f.attname AS columnname,
+ CASE
+ WHEN ix.indisunique = true THEN '1'
+ ELSE '0'
+ END AS is_unique,
+ CASE
+ WHEN p.contype = 'p' THEN '1'
ELSE '0'
- END AS is_unique,
- CASE
- WHEN p.contype = 'p' THEN '1'
- ELSE '0'
END AS is_primary_key
- FROM pg_attribute f
- JOIN pg_class c ON c.oid = f.attrelid
- JOIN pg_type t ON t.oid = f.atttypid
- LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum
- LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
- LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)
+ FROM pg_attribute f
+ JOIN pg_class c ON c.oid = f.attrelid
+ JOIN pg_type t ON t.oid = f.atttypid
+ LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum
+ LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
+ LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)
LEFT JOIN pg_class AS g ON p.confrelid = g.oid
- LEFT JOIN pg_index AS ix ON f.attnum = ANY(ix.indkey) and c.oid = f.attrelid and c.oid = ix.indrelid
- LEFT JOIN pg_class AS i ON ix.indexrelid = i.oid
-
- WHERE c.relkind = 'r'::char
- AND n.nspname = 'public' -- Replace with Schema name
+ LEFT JOIN pg_index AS ix ON f.attnum = ANY(ix.indkey) and c.oid = f.attrelid and c.oid = ix.indrelid
+ LEFT JOIN pg_class AS i ON ix.indexrelid = i.oid
+
+ WHERE c.relkind = 'r'::char
+ AND n.nspname = '${schema}'
--AND c.relname = 'nodes' -- Replace with table name, or Comment this for get all tables
AND f.attnum > 0
AND i.oid<>0
@@ -192,14 +279,14 @@ export class PostgresDriver extends AbstractDriver {
return entities;
}
- async GetRelations(entities: EntityInfo[]): Promise {
+ async GetRelations(entities: EntityInfo[], schema: string): Promise {
let response: {
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: string
}[]
- = (await this.Connection.query(`SELECT
+ = (await this.Connection.query(`SELECT
con.relname AS tablewithforeignkey,
att.attnum as fk_partno,
att2.attname AS foreignkeycolumn,
@@ -208,32 +295,33 @@ export class PostgresDriver extends AbstractDriver {
update_rule as ondelete,
delete_rule as onupdate,
con.conname as object_id
- FROM (
- SELECT
+ FROM (
+ SELECT
unnest(con1.conkey) AS parent,
unnest(con1.confkey) AS child,
con1.confrelid,
con1.conrelid,
cl_1.relname,
con1.conname
- FROM
+ FROM
pg_class cl_1,
pg_namespace ns,
pg_constraint con1
- WHERE
- con1.contype = 'f'::"char"
- AND cl_1.relnamespace = ns.oid
+ WHERE
+ con1.contype = 'f'::"char"
+ AND cl_1.relnamespace = ns.oid
AND con1.conrelid = cl_1.oid
+ and nspname='${schema}'
) con,
pg_attribute att,
pg_class cl,
pg_attribute att2,
information_schema.referential_constraints rc
- WHERE
- att.attrelid = con.confrelid
- AND att.attnum = con.child
+ WHERE
+ att.attrelid = con.confrelid
+ AND att.attnum = con.child
AND cl.oid = con.confrelid
- AND att2.attrelid = con.conrelid
+ AND att2.attrelid = con.conrelid
AND att2.attnum = con.parent
and rc.constraint_name= con.conname`)).rows;
let relationsTemp: RelationTempInfo[] = [];
@@ -300,18 +388,29 @@ export class PostgresDriver extends AbstractDriver {
isOneToMany = false;
}
let ownerRelation = new RelationInfo()
+ let columnName = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')
+ if (referencedEntity.Columns.filter((filterVal) => {
+ return filterVal.name == columnName;
+ }).length>0){
+ for (let i=2;i<=ownerEntity.Columns.length;i++){
+ columnName = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')+i.toString();
+ if (referencedEntity.Columns.filter((filterVal) => {
+ return filterVal.name == columnName;
+ }).length==0) break;
+ }
+ }
ownerRelation.actionOnDelete = relationTmp.actionOnDelete
ownerRelation.actionOnUpdate = relationTmp.actionOnUpdate
ownerRelation.isOwner = true
ownerRelation.relatedColumn = relatedColumn.name.toLowerCase()
ownerRelation.relatedTable = relationTmp.referencedTable
ownerRelation.ownerTable = relationTmp.ownerTable
- ownerRelation.ownerColumn = ownerEntity.EntityName.toLowerCase() + (isOneToMany ? 's' : '')
+ ownerRelation.ownerColumn = columnName
ownerRelation.relationType = isOneToMany ? "ManyToOne" : "OneToOne"
ownerColumn.relations.push(ownerRelation)
if (isOneToMany) {
let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase() + 's'
+ col.name = columnName
let referencedRelation = new RelationInfo();
col.relations.push(referencedRelation)
referencedRelation.actionondelete = relationTmp.actionOnDelete
@@ -325,7 +424,7 @@ export class PostgresDriver extends AbstractDriver {
referencedEntity.Columns.push(col)
} else {
let col = new ColumnInfo()
- col.name = ownerEntity.EntityName.toLowerCase()
+ col.name = columnName
let referencedRelation = new RelationInfo();
col.relations.push(referencedRelation)
referencedRelation.actionondelete = relationTmp.actionOnDelete
@@ -363,13 +462,14 @@ export class PostgresDriver extends AbstractDriver {
}
}
- async ConnectToServer(database: string, server: string, port: number, user: string, password: string) {
+ async ConnectToServer(database: string, server: string, port: number, user: string, password: string, ssl: boolean) {
this.Connection = new PG.Client({
database: database,
host: server,
port: port,
user: user,
- password: password
+ password: password,
+ ssl: ssl
})
diff --git a/src/entity.mst b/src/entity.mst
index 43ce01d..98d2196 100644
--- a/src/entity.mst
+++ b/src/entity.mst
@@ -22,7 +22,7 @@ import {{curly true}}{{toEntityName this}}{{curly false}} from "./{{toFileName t
{{/relations~}}
{{~#relations}} @{{relationType}}(type => {{toEntityName relatedTable}}, {{toPropertyName ../name}} => {{toPropertyName ../name}}.{{#if isOwner}}{{toPropertyName ownerColumn}}{{else}}{{toPropertyName relatedColumn}}{{/if}}){{#isOwner}}
- @JoinColumn(){{/isOwner}}
+ @JoinColumn({name: "{{../name}}"}){{/isOwner}}
{{#if isOneToMany}}{{toPropertyName ../name}}: {{toEntityName relatedTable}}[];{{else}}{{toPropertyName ../name}}: {{toEntityName relatedTable}};{{/if}}
{{/relations~}}
{{"\n"}}
diff --git a/src/index.ts b/src/index.ts
index cc602e4..13f9306 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -29,7 +29,7 @@ var argv = Yargs
.option('x', {
alias: 'pass',
describe: 'Password for database server.',
- demand: true
+ default: ''
})
.option('p', {
alias: 'port',
@@ -46,6 +46,14 @@ var argv = Yargs
describe: 'Where to place generated models.',
default: path.resolve(process.cwd(), 'output')
})
+ .option('s', {
+ alias: 'schema',
+ describe: 'Schema name to create model from. Only for mssql and postgres.'
+ })
+ .option('ssl',{
+ boolean:true,
+ default:false
+ })
.option('c', {
alias: 'case',
describe: 'Convert snake_case tables names to PascalCase entities and snake_case columns to camelCase properties'
@@ -55,14 +63,17 @@ var argv = Yargs
var driver: AbstractDriver;
var standardPort: number;
+var standardSchema: string = '';
switch (argv.e) {
case 'mssql':
driver = new MssqlDriver();
standardPort = 1433;
+ standardSchema = 'dbo';
break;
case 'postgres':
driver = new PostgresDriver();
standardPort = 5432;
+ standardSchema = 'public';
break;
case 'mysql':
driver = new MysqlDriver();
@@ -87,6 +98,8 @@ let engine = new Engine(
password: argv.x,
databaseType: argv.e,
resultsPath: argv.o,
+ schemaName: argv.s || standardSchema,
+ ssl:argv.ssl,
convertCase: !!argv.c
});
diff --git a/src/models/ColumnInfo.ts b/src/models/ColumnInfo.ts
index ec1308b..3c241c2 100644
--- a/src/models/ColumnInfo.ts
+++ b/src/models/ColumnInfo.ts
@@ -1,4 +1,5 @@
import { RelationInfo } from './RelationInfo'
+import { ColumnType } from 'typeorm';
/**
* ColumnInfo
*/
@@ -6,9 +7,8 @@ export class ColumnInfo {
name: string = '';
default: string | null = null;
is_nullable: boolean = false;
- ts_type: 'number' | 'string' | 'boolean' | 'Date' | 'any';
- sql_type: "string" | "text" | "number" | "integer" | "int" | "smallint" | "bigint" |
- "float" | "double" | "decimal" | "date" | "time" | "datetime" | "boolean" | "json";
+ ts_type: 'number' | 'string' | 'boolean' | 'Date' | 'Buffer' | 'Object' | 'string | Object' | 'string | string[]' | 'any';
+ sql_type: ColumnType;
char_max_lenght: number | null = null;
isPrimary: boolean = false;
is_generated: boolean = false;
diff --git a/test/drivers/MssqlDriver.test.ts b/test/drivers/MssqlDriver.test.ts
index 916a371..bbcb22a 100644
--- a/test/drivers/MssqlDriver.test.ts
+++ b/test/drivers/MssqlDriver.test.ts
@@ -5,7 +5,21 @@ import * as MSSQL from 'mssql'
import { EntityInfo } from './../../src/models/EntityInfo'
import { ColumnInfo } from './../../src/models/ColumnInfo'
import { RelationInfo } from './../../src/models/RelationInfo'
+import { Table, IColumnMetadata } from "mssql";
+ class fakeResponse implements MSSQL.IResult {
+ recordsets: MSSQL.IRecordSet[];
+ recordset: MSSQL.IRecordSet;
+ rowsAffected: number[];
+ output: { [key: string]: any; };
+
+ }
+ class fakeRecordset extends Array implements MSSQL.IRecordSet{
+ columns: IColumnMetadata;
+ toTable(): Table{
+ return new Table();
+ }
+ }
describe('MssqlDriver', function () {
let driver: MssqlDriver
@@ -34,13 +48,16 @@ describe('MssqlDriver', function () {
.returns(
{
query: (q) => {
- let response = <{ TABLE_SCHEMA: string, TABLE_NAME: string }[]>[];
- response.push({ TABLE_SCHEMA: 'schema', TABLE_NAME: 'name' })
+
+ let response=new fakeResponse();
+
+ response.recordset=new fakeRecordset();
+ response.recordset.push({ TABLE_SCHEMA: 'schema', TABLE_NAME: 'name' })
return response;
}
}
)
- let result = await driver.GetAllTables()
+ let result = await driver.GetAllTables('schema')
let expectedResult = [];
let y = new EntityInfo();
y.EntityName = 'name'
@@ -54,12 +71,9 @@ describe('MssqlDriver', function () {
.returns(
{
query: (q) => {
- let response = <{
- TABLE_NAME: string, COLUMN_NAME: string, COLUMN_DEFAULT: string,
- IS_NULLABLE: string, DATA_TYPE: string, CHARACTER_MAXIMUM_LENGTH: number,
- NUMERIC_PRECISION: number, NUMERIC_SCALE: number, IsIdentity:number
- }[]>[]
- response.push({
+ let 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,
@@ -91,7 +105,7 @@ describe('MssqlDriver', function () {
ts_type: 'number',
relations: []
})
- let result = await driver.GetCoulmnsFromEntity(entities);
+ let result = await driver.GetCoulmnsFromEntity(entities,'schema');
expect(result).to.be.deep.equal(expected)
})
it('should find primary indexes')
diff --git a/test/integration/entityTypes.test.ts b/test/integration/entityTypes.test.ts
new file mode 100644
index 0000000..6102403
--- /dev/null
+++ b/test/integration/entityTypes.test.ts
@@ -0,0 +1,99 @@
+require('dotenv').config()
+import "reflect-metadata";
+import { createConnection, ConnectionOptions, Connection } from "typeorm";
+import fs = require('fs-extra');
+import path = require('path')
+import { expect } from "chai";
+import * as Sinon from 'sinon'
+import { EntityFileToJson } from "../utils/EntityFileToJson";
+var chai = require('chai');
+var chaiSubset = require('chai-subset');
+import * as ts from "typescript";
+import * as GTU from "../utils/GeneralTestUtils"
+import { Engine } from "./../../src/Engine";
+
+chai.use(chaiSubset);
+
+
+describe("Platform specyfic types", async function () {
+ this.timeout(20000)
+ this.slow(5000)//compiling created models takes time
+
+ let dbDrivers: string[] = []
+ if (process.env.POSTGRES_Skip == '0') dbDrivers.push('postgres')
+ if (process.env.MYSQL_Skip == '0') dbDrivers.push('mysql')
+ if (process.env.MARIADB_Skip == '0') dbDrivers.push('mariadb')
+ if (process.env.MSSQL_Skip == '0') dbDrivers.push('mssql')
+
+
+ let examplesPathJS = path.resolve(process.cwd(), 'dist/test/integration/entityTypes')
+ let examplesPathTS = path.resolve(process.cwd(), 'test/integration/entityTypes')
+ let files = fs.readdirSync(examplesPathTS)
+
+ for (let folder of files) {
+
+ for (let dbDriver of dbDrivers) {
+ if (dbDriver == folder) {
+ it(dbDriver, async function () {
+
+ let filesOrgPathJS = path.resolve(examplesPathJS, folder, 'entity')
+ let filesOrgPathTS = path.resolve(examplesPathTS, folder, 'entity')
+ let resultsPath = path.resolve(process.cwd(), `output`)
+ fs.removeSync(resultsPath)
+
+ let engine: Engine;
+ switch (dbDriver) {
+ case 'mssql':
+ engine = await GTU.createMSSQLModels(filesOrgPathJS, resultsPath)
+ break;
+ case 'postgres':
+ engine = await GTU.createPostgresModels(filesOrgPathJS, resultsPath)
+ break;
+ case 'mysql':
+ engine = await GTU.createMysqlModels(filesOrgPathJS, resultsPath)
+ break;
+ case 'mariadb':
+ engine = await GTU.createMariaDBModels(filesOrgPathJS, resultsPath)
+ break;
+
+ default:
+ console.log(`Unknown engine type`);
+ engine = {}
+ break;
+ }
+
+
+ let result = await engine.createModelFromDatabase()
+
+ let filesGenPath = path.resolve(resultsPath, 'entities')
+
+ let filesOrg = fs.readdirSync(filesOrgPathTS).filter(function (this, val, ind, arr) { return val.toString().endsWith('.ts') })
+ let filesGen = fs.readdirSync(filesGenPath).filter(function (this, val, ind, arr) { return val.toString().endsWith('.ts') })
+
+ expect(filesOrg, 'Errors detected in model comparision').to.be.deep.equal(filesGen)
+
+ for (let file of filesOrg) {
+ let entftj = new EntityFileToJson();
+ let jsonEntityOrg = entftj.convert(fs.readFileSync(path.resolve(filesOrgPathTS, file)))
+ let jsonEntityGen = entftj.convert(fs.readFileSync(path.resolve(filesGenPath, file)))
+ expect(jsonEntityGen, `Error in file ${file}`).to.containSubset(jsonEntityOrg)
+ }
+ const currentDirectoryFiles = fs.readdirSync(filesGenPath).
+ filter(fileName => fileName.length >= 3 && fileName.substr(fileName.length - 3, 3) === ".ts").map(v => {
+ return path.resolve(filesGenPath, v)
+ })
+ let compileErrors = GTU.compileTsFiles(currentDirectoryFiles, {
+
+ experimentalDecorators: true,
+ sourceMap: false,
+ emitDecoratorMetadata: true,
+ target: ts.ScriptTarget.ES2016,
+ moduleResolution: ts.ModuleResolutionKind.NodeJs,
+ module: ts.ModuleKind.CommonJS
+ });
+ expect(compileErrors, 'Errors detected while compiling generated model').to.be.false;
+ });
+ }
+ }
+ }
+})
diff --git a/test/integration/entityTypes/mariadb/entity/Post.ts b/test/integration/entityTypes/mariadb/entity/Post.ts
new file mode 100644
index 0000000..2b25f57
--- /dev/null
+++ b/test/integration/entityTypes/mariadb/entity/Post.ts
@@ -0,0 +1,94 @@
+import { Entity, PrimaryColumn, Column } from "typeorm";
+
+@Entity("Post")
+export class Post {
+
+ @PrimaryColumn()
+ id: number;
+
+ @Column()
+ name: string;
+
+ @Column("int")
+ int: number;
+
+ @Column("tinyint")
+ tinyint: number;
+
+ @Column("smallint")
+ smallint: number;
+
+ @Column("mediumint")
+ mediumint: number;
+
+ @Column("bigint")
+ bigint: number;
+
+ @Column("float")
+ float: number;
+
+ @Column("double")
+ double: number;
+
+ @Column("decimal")
+ decimal: number;
+
+ @Column("date")
+ date: string;
+
+ @Column("datetime")
+ datetime: Date;
+
+ @Column("timestamp")
+ timestamp: Date;
+
+ @Column("time")
+ time: string;
+
+ @Column("year")
+ year: number;
+
+ @Column("char")
+ char: string;
+
+ @Column("varchar")
+ varchar: string;
+
+ @Column("blob")
+ blob: Buffer;
+
+ @Column("text")
+ text: string;
+
+ @Column("tinyblob")
+ tinyblob: Buffer;
+
+ @Column("tinytext")
+ tinytext: string;
+
+ @Column("mediumblob")
+ mediumblob: Buffer;
+
+ @Column("mediumtext")
+ mediumtext: string;
+
+ @Column("longblob")
+ longblob: Buffer;
+
+ @Column("longtext")
+ longtext: string;
+
+ // @Column("enum", { enum: ["A", "B", "C"] })
+ // enum: string;
+
+ // @Column("enum", { enum: FruitEnum })
+ // classEnum1: FruitEnum;
+
+ //MariaDb type for Json - LONGTEXT
+ // @Column("json")
+ // json: Object;
+
+ // @Column("simple-array")
+ // simpleArray: string[];
+
+}
\ No newline at end of file
diff --git a/test/integration/entityTypes/mssql/entity/Post.ts b/test/integration/entityTypes/mssql/entity/Post.ts
new file mode 100644
index 0000000..43b4c19
--- /dev/null
+++ b/test/integration/entityTypes/mssql/entity/Post.ts
@@ -0,0 +1,121 @@
+import { Entity, PrimaryColumn, Column } from "typeorm";
+
+@Entity("Post")
+export class Post {
+
+ @PrimaryColumn()
+ id: number;
+
+ @Column()
+ name: string;
+
+ // -------------------------------------------------------------------------
+ // Numeric Types
+ // -------------------------------------------------------------------------
+
+ @Column("bit")
+ bit: boolean;
+
+ @Column("tinyint")
+ tinyint: number;
+
+ @Column("smallint")
+ smallint: number;
+
+ @Column("int")
+ int: number;
+
+ @Column("bigint")
+ bigint: string;
+
+ @Column("decimal")
+ decimal: number;
+
+ @Column("dec")
+ dec: number;
+
+ @Column("numeric")
+ numeric: number;
+
+ @Column("float")
+ float: number;
+
+ @Column("real")
+ real: number;
+
+ @Column("smallmoney")
+ smallmoney: number;
+
+ @Column("money")
+ money: number;
+
+ // -------------------------------------------------------------------------
+ // Character Types
+ // -------------------------------------------------------------------------
+
+ @Column("uniqueidentifier")
+ uniqueidentifier: string;
+
+ @Column("char")
+ char: string;
+
+ @Column("varchar")
+ varchar: string;
+
+ @Column("text")
+ text: string;
+
+ @Column("nchar")
+ nchar: string;
+
+ @Column("nvarchar")
+ nvarchar: string;
+
+ @Column("ntext")
+ ntext: string;
+
+ @Column("binary")
+ binary: Buffer;
+
+ @Column("varbinary")
+ varbinary: Buffer;
+
+ @Column("image")
+ image: Buffer;
+
+ // -------------------------------------------------------------------------
+ // Date Types
+ // -------------------------------------------------------------------------
+
+ @Column("date")
+ dateObj: Date;
+
+ // @Column("date")
+ // date: string;
+
+ @Column("datetime")
+ datetime: Date;
+
+ @Column("datetime2")
+ datetime2: Date;
+
+ @Column("smalldatetime")
+ smalldatetime: Date;
+
+ @Column("time")
+ timeObj: Date;
+
+ // @Column("time")
+ // time: string;
+
+ @Column("datetimeoffset")
+ datetimeoffset: Date;
+
+ // -------------------------------------------------------------------------
+ // TypeOrm Specific Type
+ // -------------------------------------------------------------------------
+
+ // @Column("simple-array")
+ // simpleArray: string[];
+
+}
\ No newline at end of file
diff --git a/test/integration/entityTypes/mysql/entity/Post.ts b/test/integration/entityTypes/mysql/entity/Post.ts
new file mode 100644
index 0000000..8149e01
--- /dev/null
+++ b/test/integration/entityTypes/mysql/entity/Post.ts
@@ -0,0 +1,93 @@
+import { Entity, PrimaryColumn, Column } from "typeorm";
+
+@Entity("Post")
+export class Post {
+
+ @PrimaryColumn()
+ id: number;
+
+ @Column()
+ name: string;
+
+ @Column("int")
+ int: number;
+
+ @Column("tinyint")
+ tinyint: number;
+
+ @Column("smallint")
+ smallint: number;
+
+ @Column("mediumint")
+ mediumint: number;
+
+ @Column("bigint")
+ bigint: number;
+
+ @Column("float")
+ float: number;
+
+ @Column("double")
+ double: number;
+
+ @Column("decimal")
+ decimal: number;
+
+ @Column("date")
+ date: string;
+
+ @Column("datetime")
+ datetime: Date;
+
+ @Column("timestamp")
+ timestamp: Date;
+
+ @Column("time")
+ time: string;
+
+ @Column("year")
+ year: number;
+
+ @Column("char")
+ char: string;
+
+ @Column("varchar")
+ varchar: string;
+
+ @Column("blob")
+ blob: Buffer;
+
+ @Column("text")
+ text: string;
+
+ @Column("tinyblob")
+ tinyblob: Buffer;
+
+ @Column("tinytext")
+ tinytext: string;
+
+ @Column("mediumblob")
+ mediumblob: Buffer;
+
+ @Column("mediumtext")
+ mediumtext: string;
+
+ @Column("longblob")
+ longblob: Buffer;
+
+ @Column("longtext")
+ longtext: string;
+
+ // @Column("enum", { enum: ["A", "B", "C"] })
+ // enum: string;
+
+ // @Column("enum", { enum: FruitEnum })
+ // classEnum1: FruitEnum;
+
+ @Column("json")
+ json: Object;
+
+ // @Column("simple-array")
+ // simpleArray: string[];
+
+}
\ No newline at end of file
diff --git a/test/integration/entityTypes/postgres/entity/Post.ts b/test/integration/entityTypes/postgres/entity/Post.ts
new file mode 100644
index 0000000..9acf3ea
--- /dev/null
+++ b/test/integration/entityTypes/postgres/entity/Post.ts
@@ -0,0 +1,240 @@
+import { Entity, PrimaryColumn, Column } from "typeorm";
+
+@Entity("Post")
+export class Post {
+
+ @PrimaryColumn()
+ id: number;
+
+ @Column()
+ name: string;
+
+ // -------------------------------------------------------------------------
+ // Numeric Types
+ // -------------------------------------------------------------------------
+
+ @Column("integer")
+ integer: number;
+
+ @Column("int4")
+ int4: number;
+
+ @Column("int")
+ int: number;
+
+ @Column("smallint")
+ smallint: number;
+
+ @Column("int2")
+ int2: number;
+
+ @Column("bigint")
+ bigint: string;
+
+ @Column("int8")
+ int8: string;
+
+ // @Column("serial")
+ // serial: number;
+
+ // @Column("serial4")
+ // serial4: number;
+
+ // @Column("smallserial")
+ // smallserial: number;
+
+ // @Column("serial2")
+ // serial2: number;
+
+ // @Column("bigserial")
+ // bigserial: number;
+
+ // @Column("serial8")
+ // serial8: number;
+
+ @Column("numeric")
+ numeric: string;
+
+ @Column("decimal")
+ decimal: string;
+
+ @Column("double precision")
+ doublePrecision: number;
+
+ @Column("float8")
+ float8: number;
+
+ @Column("real")
+ real: number;
+
+ @Column("float4")
+ float4: number;
+
+ // -------------------------------------------------------------------------
+ // Monetary Types
+ // -------------------------------------------------------------------------
+
+ @Column("money")
+ money: string;
+
+ // -------------------------------------------------------------------------
+ // Character Types
+ // -------------------------------------------------------------------------
+
+ @Column("char")
+ char: string;
+
+ @Column("character")
+ character: string;
+
+ @Column("varchar")
+ varchar: string;
+
+ @Column("character varying")
+ characterVarying: string;
+
+ @Column("text")
+ text: string;
+
+ // @Column("citext")
+ // citext: string;
+
+ // -------------------------------------------------------------------------
+ // Binary Data Types
+ // -------------------------------------------------------------------------
+
+ @Column("bytea")
+ bytea: Buffer;
+
+ // -------------------------------------------------------------------------
+ // Date/Time Types
+ // -------------------------------------------------------------------------
+
+ @Column("date")
+ date: string;
+
+ @Column("interval")
+ interval: any;
+
+ @Column("time")
+ time: string;
+
+ @Column("time with time zone")
+ timeWithTimeZone: string;
+
+ @Column("timetz")
+ timetz: string;
+
+ @Column("timestamp")
+ timestamp: Date;
+
+ @Column("timestamp with time zone")
+ timestampWithTimeZone: Date;
+
+ @Column("timestamptz")
+ timestamptz: Date;
+
+ // -------------------------------------------------------------------------
+ // Boolean Type
+ // -------------------------------------------------------------------------
+
+ @Column("boolean")
+ boolean: boolean;
+
+ @Column("bool")
+ bool: boolean;
+
+ // -------------------------------------------------------------------------
+ // Enumerated Type
+ // -------------------------------------------------------------------------
+
+ // @Column("enum", { enum: ["A", "B", "C"] })
+ // enum: string;
+
+ // -------------------------------------------------------------------------
+ // Geometric Type
+ // -------------------------------------------------------------------------
+
+ @Column("point")
+ point: string | Object;
+
+ @Column("line")
+ line: string;
+
+ @Column("lseg")
+ lseg: string | string[];
+
+ @Column("box")
+ box: string | Object;
+
+ @Column("path")
+ path: string;
+
+ @Column("polygon")
+ polygon: string;
+
+ @Column("circle")
+ circle: string | Object;
+
+ // -------------------------------------------------------------------------
+ // Network Address Type
+ // -------------------------------------------------------------------------
+
+ @Column("cidr")
+ cidr: string;
+
+ @Column("inet")
+ inet: string;
+
+ @Column("macaddr")
+ macaddr: string;
+
+ // -------------------------------------------------------------------------
+ // Bit String Type
+ // -------------------------------------------------------------------------
+
+ @Column("bit")
+ bit: string;
+
+ @Column("varbit")
+ varbit: string;
+
+ @Column("bit varying")
+ bitVarying: string;
+
+ // -------------------------------------------------------------------------
+ // UUID Type
+ // -------------------------------------------------------------------------
+
+ @Column("uuid")
+ uuid: string;
+
+ // -------------------------------------------------------------------------
+ // XML Type
+ // -------------------------------------------------------------------------
+
+ @Column("xml")
+ xml: string;
+
+ // -------------------------------------------------------------------------
+ // JSON Type
+ // -------------------------------------------------------------------------
+
+ @Column("json")
+ json: Object;
+
+ // -------------------------------------------------------------------------
+ // Array Type
+ // -------------------------------------------------------------------------
+
+ // @Column("int", { isArray: true })
+ // array: number[];
+
+ // // -------------------------------------------------------------------------
+ // // TypeOrm Specific Type
+ // // -------------------------------------------------------------------------
+
+ // @Column("simple-array")
+ // simpleArray: string[];
+
+}
\ No newline at end of file
diff --git a/test/integration/examples/sample1-simple-entity/entity/Post.ts b/test/integration/examples/sample1-simple-entity/entity/Post.ts
index 999192f..6c208ff 100644
--- a/test/integration/examples/sample1-simple-entity/entity/Post.ts
+++ b/test/integration/examples/sample1-simple-entity/entity/Post.ts
@@ -1,9 +1,9 @@
-import {Column, Entity,PrimaryColumn,Index} from "typeorm";
+import {Column, Entity,PrimaryGeneratedColumn,Index,Generated} from "typeorm";
@Entity("Post")
export class Post {
- @PrimaryColumn("int", { generated: true })
+ @PrimaryGeneratedColumn()
id: number;
@Column()
diff --git a/test/integration/examples/sample11-all-types-entity/entity/EverythingEntity.ts b/test/integration/examples/sample11-all-types-entity/entity/EverythingEntity.ts
index 7a5224d..a2eb712 100644
--- a/test/integration/examples/sample11-all-types-entity/entity/EverythingEntity.ts
+++ b/test/integration/examples/sample11-all-types-entity/entity/EverythingEntity.ts
@@ -2,7 +2,7 @@ import { PrimaryGeneratedColumn, Column, Entity, OneToOne, JoinColumn, Index } f
@Entity("EverythingEntity")
export class EverythingEntity {
-
+ //TODO: change to check column types per database engine
@PrimaryGeneratedColumn()
id: number;
@@ -27,35 +27,35 @@ export class EverythingEntity {
@Column("smallint")
smallintColumn: number;
- @Column("bigint")
- bigintColumn: number;
+ // @Column("bigint")
+ // bigintColumn: number;
- @Column("float")
- floatColumn: number;
+ // @Column("float")
+ // floatColumn: number;
- @Column("double")
- doubleColumn: number;
+ // @Column("double")
+ // doubleColumn: number;
- @Column("decimal")
- decimalColumn: number;
+ // @Column("decimal")
+ // decimalColumn: number;
@Column()
date: Date;
- @Column("date")
- dateColumn: Date;
+ // @Column("date")
+ // dateColumn: Date;
- @Column("time")
- timeColumn: Date;
+ // @Column("time")
+ // timeColumn: Date;
- @Column("boolean")
- isBooleanColumn: boolean;
+ // @Column("boolean")
+ // isBooleanColumn: boolean;
- @Column("boolean")
- isSecondBooleanColumn: boolean;
+ // @Column("boolean")
+ // isSecondBooleanColumn: boolean;
- @Column("json")
- jsonColumn: any;
+ // @Column("json")
+ // jsonColumn: any;
// @Column()
// alsoJson: any;
diff --git a/test/integration/github-issues/12/entity/Post.ts b/test/integration/github-issues/12/entity/Post.ts
new file mode 100644
index 0000000..79d2472
--- /dev/null
+++ b/test/integration/github-issues/12/entity/Post.ts
@@ -0,0 +1,16 @@
+import { PrimaryGeneratedColumn, Column, Entity, OneToOne, OneToMany, ManyToOne, JoinColumn } from "typeorm";
+import { PostAuthor } from "./PostAuthor";
+
+@Entity("Post")
+export class Post {
+
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @ManyToOne(type => PostAuthor, author => author.posts)
+ author: PostAuthor;
+
+ @ManyToOne(type => PostAuthor, author => author.posts2)
+ author2: PostAuthor;
+
+}
\ No newline at end of file
diff --git a/test/integration/github-issues/12/entity/PostAuthor.ts b/test/integration/github-issues/12/entity/PostAuthor.ts
new file mode 100644
index 0000000..9d5a433
--- /dev/null
+++ b/test/integration/github-issues/12/entity/PostAuthor.ts
@@ -0,0 +1,16 @@
+import { PrimaryGeneratedColumn, Column, Entity, OneToOne, OneToMany, ManyToOne, JoinColumn } from "typeorm";
+import { Post } from "./Post";
+
+@Entity("PostAuthor")
+export class PostAuthor {
+
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @OneToMany(type => Post, post => post.author)
+ posts: Post[];
+
+ @OneToMany(type => Post, post => post.author2)
+ posts2: Post[];
+
+}
\ No newline at end of file
diff --git a/test/integration/githubIssues.test.ts b/test/integration/githubIssues.test.ts
new file mode 100644
index 0000000..8266e65
--- /dev/null
+++ b/test/integration/githubIssues.test.ts
@@ -0,0 +1,100 @@
+require('dotenv').config()
+import "reflect-metadata";
+import { createConnection, ConnectionOptions, Connection } from "typeorm";
+import fs = require('fs-extra');
+import path = require('path')
+import { Engine } from "./../../src/Engine";
+import { expect } from "chai";
+import * as Sinon from 'sinon'
+import { EntityFileToJson } from "../utils/EntityFileToJson";
+var chai = require('chai');
+var chaiSubset = require('chai-subset');
+import * as yn from "yn"
+import * as ts from "typescript";
+import * as GTU from "../utils/GeneralTestUtils"
+
+chai.use(chaiSubset);
+
+
+describe("GitHub issues", async function () {
+ this.timeout(20000)
+ this.slow(5000)//compiling created models takes time
+
+ let dbDrivers: string[] = []
+ if (process.env.POSTGRES_Skip == '0') dbDrivers.push('postgres')
+ if (process.env.MYSQL_Skip == '0') dbDrivers.push('mysql')
+ if (process.env.MARIADB_Skip == '0') dbDrivers.push('mariadb')
+ if (process.env.MSSQL_Skip == '0') dbDrivers.push('mssql')
+
+ let examplesPathJS = path.resolve(process.cwd(), 'dist/test/integration/github-issues')
+ let examplesPathTS = path.resolve(process.cwd(), 'test/integration/github-issues')
+ let files = fs.readdirSync(examplesPathTS)
+
+ for (let folder of files) {
+
+ describe(`#${folder}`, async function () {
+ for (let dbDriver of dbDrivers) {
+ it(dbDriver, async function () {
+
+ let filesOrgPathJS = path.resolve(examplesPathJS, folder, 'entity')
+ let filesOrgPathTS = path.resolve(examplesPathTS, folder, 'entity')
+ let resultsPath = path.resolve(process.cwd(), `output`)
+ fs.removeSync(resultsPath)
+
+ let engine: Engine;
+ switch (dbDriver) {
+ case 'mssql':
+ engine = await GTU.createMSSQLModels(filesOrgPathJS, resultsPath)
+ break;
+ case 'postgres':
+ engine = await GTU.createPostgresModels(filesOrgPathJS, resultsPath)
+ break;
+ case 'mysql':
+ engine = await GTU.createMysqlModels(filesOrgPathJS, resultsPath)
+ break;
+ case 'mariadb':
+ engine = await GTU.createMariaDBModels(filesOrgPathJS, resultsPath)
+ break;
+
+ default:
+ console.log(`Unknown engine type`);
+ engine = {}
+ break;
+ }
+
+
+ let result = await engine.createModelFromDatabase()
+
+ let filesGenPath = path.resolve(resultsPath, 'entities')
+
+ let filesOrg = fs.readdirSync(filesOrgPathTS).filter(function (this, val, ind, arr) { return val.toString().endsWith('.ts') })
+ let filesGen = fs.readdirSync(filesGenPath).filter(function (this, val, ind, arr) { return val.toString().endsWith('.ts') })
+
+ expect(filesOrg, 'Errors detected in model comparision').to.be.deep.equal(filesGen)
+
+ for (let file of filesOrg) {
+ let entftj = new EntityFileToJson();
+ let jsonEntityOrg = entftj.convert(fs.readFileSync(path.resolve(filesOrgPathTS, file)))
+ let jsonEntityGen = entftj.convert(fs.readFileSync(path.resolve(filesGenPath, file)))
+ expect(jsonEntityGen, `Error in file ${file}`).to.containSubset(jsonEntityOrg)
+ }
+ const currentDirectoryFiles = fs.readdirSync(filesGenPath).
+ filter(fileName => fileName.length >= 3 && fileName.substr(fileName.length - 3, 3) === ".ts").map(v => {
+ return path.resolve(filesGenPath, v)
+ })
+ let compileErrors = GTU.compileTsFiles(currentDirectoryFiles, {
+
+ experimentalDecorators: true,
+ sourceMap: false,
+ emitDecoratorMetadata: true,
+ target: ts.ScriptTarget.ES2016,
+ moduleResolution: ts.ModuleResolutionKind.NodeJs,
+ module: ts.ModuleKind.CommonJS
+ });
+ expect(compileErrors, 'Errors detected while compiling generated model').to.be.false;
+ });
+
+ }
+ })
+ }
+})
diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts
index 9db9050..1a9395d 100644
--- a/test/integration/integration.test.ts
+++ b/test/integration/integration.test.ts
@@ -4,36 +4,32 @@ import { createConnection, ConnectionOptions, Connection } from "typeorm";
import fs = require('fs-extra');
import path = require('path')
import { Engine } from "./../../src/Engine";
-import { AbstractDriver } from "./../../src/drivers/AbstractDriver";
-import { MssqlDriver } from "./../../src/drivers/MssqlDriver";
-import { DriverType } from "typeorm/driver/DriverOptions";
import { expect } from "chai";
import * as Sinon from 'sinon'
import { EntityFileToJson } from "../utils/EntityFileToJson";
var chai = require('chai');
var chaiSubset = require('chai-subset');
+import * as yn from "yn"
import * as ts from "typescript";
-import { PostgresDriver } from "../../src/drivers/PostgresDriver";
-import { MysqlDriver } from "../../src/drivers/MysqlDriver";
-import { MariaDbDriver } from "../../src/drivers/MariaDbDriver";
-
+import * as GTU from "../utils/GeneralTestUtils"
chai.use(chaiSubset);
-describe("integration tests", async function () {
+describe("TypeOrm examples", async function () {
this.timeout(20000)
this.slow(5000)//compiling created models takes time
- let examplesPathJS = path.resolve(process.cwd(), 'dist/test/integration/examples')
- let examplesPathTS = path.resolve(process.cwd(), 'test/integration/examples')
- let files = fs.readdirSync(examplesPathTS)
- let dbDrivers: DriverType[] = []
+ let dbDrivers: string[] = []
if (process.env.POSTGRES_Skip == '0') dbDrivers.push('postgres')
if (process.env.MYSQL_Skip == '0') dbDrivers.push('mysql')
if (process.env.MARIADB_Skip == '0') dbDrivers.push('mariadb')
if (process.env.MSSQL_Skip == '0') dbDrivers.push('mssql')
+ let examplesPathJS = path.resolve(process.cwd(), 'dist/test/integration/examples')
+ let examplesPathTS = path.resolve(process.cwd(), 'test/integration/examples')
+ let files = fs.readdirSync(examplesPathTS)
+
for (let folder of files) {
describe(folder, async function () {
@@ -48,16 +44,16 @@ describe("integration tests", async function () {
let engine: Engine;
switch (dbDriver) {
case 'mssql':
- engine = await createMSSQLModels(filesOrgPathJS, resultsPath)
+ engine = await GTU.createMSSQLModels(filesOrgPathJS, resultsPath)
break;
case 'postgres':
- engine = await createPostgresModels(filesOrgPathJS, resultsPath)
+ engine = await GTU.createPostgresModels(filesOrgPathJS, resultsPath)
break;
case 'mysql':
- engine = await createMysqlModels(filesOrgPathJS, resultsPath)
+ engine = await GTU.createMysqlModels(filesOrgPathJS, resultsPath)
break;
case 'mariadb':
- engine = await createMariaDBModels(filesOrgPathJS, resultsPath)
+ engine = await GTU.createMariaDBModels(filesOrgPathJS, resultsPath)
break;
default:
@@ -86,7 +82,7 @@ describe("integration tests", async function () {
filter(fileName => fileName.length >= 3 && fileName.substr(fileName.length - 3, 3) === ".ts").map(v => {
return path.resolve(filesGenPath, v)
})
- let compileErrors = compileTsFiles(currentDirectoryFiles, {
+ let compileErrors = GTU.compileTsFiles(currentDirectoryFiles, {
experimentalDecorators: true,
sourceMap: false,
@@ -102,199 +98,3 @@ describe("integration tests", async function () {
})
}
})
-
-async function createMSSQLModels(filesOrgPath: string, resultsPath: string): Promise {
-
- let driver: AbstractDriver;
- driver = new MssqlDriver();
- await driver.ConnectToServer(`master`, process.env.MSSQL_Host, process.env.MSSQL_Port, process.env.MSSQL_Username, process.env.MSSQL_Password);
-
- if (! await driver.CheckIfDBExists(process.env.MSSQL_Database))
- await driver.CreateDB(process.env.MSSQL_Database);
- await driver.DisconnectFromServer();
-
- let connOpt: ConnectionOptions = {
- driver: {
- database: process.env.MSSQL_Database,
- host: process.env.MSSQL_Host,
- password: process.env.MSSQL_Password,
- type: 'mssql',
- username: process.env.MSSQL_Username,
- port: process.env.MSSQL_Port
- },
- dropSchemaOnConnection: true,
- autoSchemaSync: true,
- entities: [path.resolve(filesOrgPath, '*.js')],
- }
- let conn = await createConnection(connOpt)
-
- if (conn.isConnected)
- await conn.close()
-
-
- driver = new MssqlDriver();
- let engine = new Engine(
- driver, {
- host: process.env.MSSQL_Host,
- port: process.env.MSSQL_Port,
- databaseName: process.env.MSSQL_Database,
- user: process.env.MSSQL_Username,
- password: process.env.MSSQL_Password,
- databaseType: 'mssql',
- resultsPath: resultsPath,
- convertCase: true
- });
-
-
- return engine;
-}
-
-async function createPostgresModels(filesOrgPath: string, resultsPath: string): Promise {
- let driver: AbstractDriver;
- driver = new PostgresDriver();
- await driver.ConnectToServer(`postgres`, process.env.POSTGRES_Host, process.env.POSTGRES_Port, process.env.POSTGRES_Username, process.env.POSTGRES_Password);
-
- if (! await driver.CheckIfDBExists(process.env.POSTGRES_Database))
- await driver.CreateDB(process.env.POSTGRES_Database);
- await driver.DisconnectFromServer();
-
- let connOpt: ConnectionOptions = {
- driver: {
- database: process.env.POSTGRES_Database,
- host: process.env.POSTGRES_Host,
- password: process.env.POSTGRES_Password,
- type: 'postgres',
- username: process.env.POSTGRES_Username,
- port: process.env.POSTGRES_Port
- },
- dropSchemaOnConnection: true,
- autoSchemaSync: true,
- entities: [path.resolve(filesOrgPath, '*.js')],
- }
- let conn = await createConnection(connOpt)
-
- if (conn.isConnected)
- await conn.close()
-
- driver = new PostgresDriver();
- let engine = new Engine(
- driver, {
- host: process.env.POSTGRES_Host,
- port: process.env.POSTGRES_Port,
- databaseName: process.env.POSTGRES_Database,
- user: process.env.POSTGRES_Username,
- password: process.env.POSTGRES_Password,
- databaseType: 'postgres',
- resultsPath: resultsPath,
- convertCase: true
- });
-
-
-
- return engine;
-}
-
-async function createMysqlModels(filesOrgPath: string, resultsPath: string): Promise {
- let driver: AbstractDriver;
- driver = new MysqlDriver();
- await driver.ConnectToServer(`mysql`, process.env.MYSQL_Host, process.env.MYSQL_Port, process.env.MYSQL_Username, process.env.MYSQL_Password);
-
- if (! await driver.CheckIfDBExists(process.env.MYSQL_Database))
- await driver.CreateDB(process.env.MYSQL_Database);
- await driver.DisconnectFromServer();
-
- let connOpt: ConnectionOptions = {
- driver: {
- database: process.env.MYSQL_Database,
- host: process.env.MYSQL_Host,
- password: process.env.MYSQL_Password,
- type: 'mysql',
- username: process.env.MYSQL_Username,
- port: process.env.MYSQL_Port
- },
- dropSchemaOnConnection: true,
- autoSchemaSync: true,
- entities: [path.resolve(filesOrgPath, '*.js')],
- }
- let conn = await createConnection(connOpt)
-
- if (conn.isConnected)
- await conn.close()
-
- driver = new MysqlDriver();
- let engine = new Engine(
- driver, {
- host: process.env.MYSQL_Host,
- port: process.env.MYSQL_Port,
- databaseName: process.env.MYSQL_Database,
- user: process.env.MYSQL_Username,
- password: process.env.MYSQL_Password,
- databaseType: 'mysql',
- resultsPath: resultsPath,
- convertCase: true
- });
-
-
-
- return engine;
-}
-async function createMariaDBModels(filesOrgPath: string, resultsPath: string): Promise {
- let driver: AbstractDriver;
- driver = new MariaDbDriver();
- await driver.ConnectToServer(`mysql`, process.env.MARIADB_Host, process.env.MARIADB_Port, process.env.MARIADB_Username, process.env.MARIADB_Password);
-
- if (! await driver.CheckIfDBExists(process.env.MARIADB_Database))
- await driver.CreateDB(process.env.MARIADB_Database);
- await driver.DisconnectFromServer();
-
- let connOpt: ConnectionOptions = {
- driver: {
- database: process.env.MARIADB_Database,
- host: process.env.MARIADB_Host,
- password: process.env.MARIADB_Password,
- type: 'mariadb',
- username: process.env.MARIADB_Username,
- port: process.env.MARIADB_Port
- },
- dropSchemaOnConnection: true,
- autoSchemaSync: true,
- entities: [path.resolve(filesOrgPath, '*.js')],
- }
- let conn = await createConnection(connOpt)
-
- if (conn.isConnected)
- await conn.close()
-
- driver = new MariaDbDriver();
- let engine = new Engine(
- driver, {
- host: process.env.MARIADB_Host,
- port: process.env.MARIADB_Port,
- databaseName: process.env.MARIADB_Database,
- user: process.env.MARIADB_Username,
- password: process.env.MARIADB_Password,
- databaseType: 'mariadb',
- resultsPath: resultsPath,
- convertCase: true
- });
-
-
-
- return engine;
-}
-
-function compileTsFiles(fileNames: string[], options: ts.CompilerOptions): boolean {
- let program = ts.createProgram(fileNames, options);
- let emitResult = program.emit();
- let compileErrors = false;
- let allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
-
- allDiagnostics.forEach(diagnostic => {
- let lineAndCharacter = diagnostic.file!.getLineAndCharacterOfPosition(diagnostic.start!);
- let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
- console.log(`${diagnostic.file!.fileName} (${lineAndCharacter.line + 1},${lineAndCharacter.character + 1}): ${message}`);
- compileErrors = true;
- });
-
- return compileErrors;
-}
\ No newline at end of file
diff --git a/test/utils/EntityFileToJson.ts b/test/utils/EntityFileToJson.ts
index 2ae6f19..0d09b92 100644
--- a/test/utils/EntityFileToJson.ts
+++ b/test/utils/EntityFileToJson.ts
@@ -271,6 +271,20 @@ export class EntityFileToJson {
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)
+ 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)
+ return colName;
+ })
+ return ind;
+ })
return retVal;
}
isPartOfMultilineStatement(statement: string) {
diff --git a/test/utils/GeneralTestUtils.ts b/test/utils/GeneralTestUtils.ts
new file mode 100644
index 0000000..5226f77
--- /dev/null
+++ b/test/utils/GeneralTestUtils.ts
@@ -0,0 +1,206 @@
+import * as ts from "typescript";
+import { AbstractDriver } from "../../src/drivers/AbstractDriver";
+import { MssqlDriver } from "../../src/drivers/MssqlDriver";
+import { PostgresDriver } from "./../../src/drivers/PostgresDriver";
+import { MysqlDriver } from "../../src/drivers/MysqlDriver";
+import { MariaDbDriver } from "../../src/drivers/MariaDbDriver";
+import { Engine } from "../../src/Engine";
+import { createConnection, ConnectionOptions, Connection } from "typeorm";
+import * as yn from "yn"
+import path = require('path')
+
+export async function createMSSQLModels(filesOrgPath: string, resultsPath: string): Promise {
+
+ let driver: AbstractDriver;
+ driver = new MssqlDriver();
+ await driver.ConnectToServer(`master`, String(process.env.MSSQL_Host), Number(process.env.MSSQL_Port), String(process.env.MSSQL_Username), String(process.env.MSSQL_Password), yn(process.env.MSSQL_SSL));
+
+ if (! await driver.CheckIfDBExists(String(process.env.MSSQL_Database)))
+ await driver.CreateDB(String(process.env.MSSQL_Database));
+ await driver.DisconnectFromServer();
+
+ let connOpt: ConnectionOptions = {
+
+ database: String(process.env.MSSQL_Database),
+ host: String(process.env.MSSQL_Host),
+ password: String(process.env.MSSQL_Password),
+ type: 'mssql',
+ username: String(process.env.MSSQL_Username),
+ port: Number(process.env.MSSQL_Port),
+ dropSchema: true,
+ synchronize: true,
+ entities: [path.resolve(filesOrgPath, '*.js')],
+ }
+ let conn = await createConnection(connOpt)
+
+ if (conn.isConnected)
+ await conn.close()
+
+
+ driver = new MssqlDriver();
+ let engine = new Engine(
+ driver, {
+ host: String(process.env.MSSQL_Host),
+ port: Number(process.env.MSSQL_Port),
+ databaseName: String(process.env.MSSQL_Database),
+ user: String(process.env.MSSQL_Username),
+ password: String(process.env.MSSQL_Password),
+ databaseType: 'mssql',
+ resultsPath: resultsPath,
+ schemaName: 'dbo',
+ ssl: yn(process.env.MSSQL_SSL)
+ });
+
+
+ return engine;
+}
+
+export async function createPostgresModels(filesOrgPath: string, resultsPath: string): Promise {
+ let driver: AbstractDriver;
+ driver = new PostgresDriver();
+ await driver.ConnectToServer(`postgres`, String(process.env.POSTGRES_Host), Number(process.env.POSTGRES_Port), String(process.env.POSTGRES_Username), String(process.env.POSTGRES_Password), yn(process.env.POSTGRES_SSL));
+
+ if (! await driver.CheckIfDBExists(String(process.env.POSTGRES_Database)))
+ await driver.CreateDB(String(process.env.POSTGRES_Database));
+ await driver.DisconnectFromServer();
+
+ let connOpt: ConnectionOptions = {
+ database: String(process.env.POSTGRES_Database),
+ host: String(process.env.POSTGRES_Host),
+ password: String(process.env.POSTGRES_Password),
+ type: 'postgres',
+ username: String(process.env.POSTGRES_Username),
+ port: Number(process.env.POSTGRES_Port),
+ dropSchema: true,
+ synchronize: true,
+ entities: [path.resolve(filesOrgPath, '*.js')],
+ }
+ let conn = await createConnection(connOpt)
+
+ if (conn.isConnected)
+ await conn.close()
+
+ driver = new PostgresDriver();
+ let engine = new Engine(
+ driver, {
+ host: String(process.env.POSTGRES_Host),
+ port: Number(process.env.POSTGRES_Port),
+ databaseName: String(process.env.POSTGRES_Database),
+ user: String(process.env.POSTGRES_Username),
+ password: String(process.env.POSTGRES_Password),
+ databaseType: 'postgres',
+ resultsPath: resultsPath,
+ schemaName: 'public',
+ ssl: yn(process.env.POSTGRES_SSL)
+ });
+
+
+
+ return engine;
+}
+
+export async function createMysqlModels(filesOrgPath: string, resultsPath: string): Promise {
+ let driver: AbstractDriver;
+ driver = new MysqlDriver();
+ await driver.ConnectToServer(`mysql`, String(process.env.MYSQL_Host), Number(process.env.MYSQL_Port), String(process.env.MYSQL_Username), String(process.env.MYSQL_Password), yn(process.env.MYSQL_SSL));
+
+ if (! await driver.CheckIfDBExists(String(process.env.MYSQL_Database)))
+ await driver.CreateDB(String(process.env.MYSQL_Database));
+ await driver.DisconnectFromServer();
+
+ let connOpt: ConnectionOptions = {
+ database: String(process.env.MYSQL_Database),
+ host: String(process.env.MYSQL_Host),
+ password: String(process.env.MYSQL_Password),
+ type: 'mysql',
+ username: String(process.env.MYSQL_Username),
+ port: Number(process.env.MYSQL_Port),
+ dropSchema: true,
+ synchronize: true,
+ entities: [path.resolve(filesOrgPath, '*.js')],
+ }
+ let conn = await createConnection(connOpt)
+
+ if (conn.isConnected)
+ await conn.close()
+
+ driver = new MysqlDriver();
+ let engine = new Engine(
+ driver, {
+ 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',
+ resultsPath: resultsPath,
+ schemaName: 'ignored',
+ ssl: yn(process.env.MYSQL_SSL)
+ });
+
+
+
+ return engine;
+}
+export async function createMariaDBModels(filesOrgPath: string, resultsPath: string): Promise {
+ let driver: AbstractDriver;
+ driver = new MariaDbDriver();
+ await driver.ConnectToServer(`mysql`, String(process.env.MARIADB_Host), Number(process.env.MARIADB_Port), String(process.env.MARIADB_Username), String(process.env.MARIADB_Password), yn(process.env.MARIADB_SSL));
+
+ if (! await driver.CheckIfDBExists(String(process.env.MARIADB_Database)))
+ await driver.CreateDB(String(process.env.MARIADB_Database));
+ await driver.DisconnectFromServer();
+
+ let connOpt: ConnectionOptions = {
+
+ database: String(process.env.MARIADB_Database),
+ host: String(process.env.MARIADB_Host),
+ password: String(process.env.MARIADB_Password),
+ type: 'mariadb',
+ username: String(process.env.MARIADB_Username),
+ port: Number(process.env.MARIADB_Port),
+ dropSchema: true,
+ synchronize: true,
+ entities: [path.resolve(filesOrgPath, '*.js')],
+ }
+ let conn = await createConnection(connOpt)
+
+ if (conn.isConnected)
+ await conn.close()
+
+ driver = new MariaDbDriver();
+ let engine = new Engine(
+ driver, {
+ 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',
+ resultsPath: resultsPath,
+ schemaName: 'ignored',
+ ssl: yn(process.env.MARIADB_SSL)
+ });
+
+
+
+ return engine;
+}
+
+export function compileTsFiles(fileNames: string[], options: ts.CompilerOptions): boolean {
+ let program = ts.createProgram(fileNames, options);
+ let emitResult = program.emit();
+ let compileErrors = false;
+ let preDiagnostics = ts.getPreEmitDiagnostics(program);
+
+ let allDiagnostics = [...preDiagnostics, ...emitResult.diagnostics];
+
+ allDiagnostics.forEach(diagnostic => {
+ let lineAndCharacter = diagnostic.file!.getLineAndCharacterOfPosition(diagnostic.start!);
+ let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
+ console.log(`${diagnostic.file!.fileName} (${lineAndCharacter.line + 1},${lineAndCharacter.character + 1}): ${message}`);
+ compileErrors = true;
+ });
+
+ return compileErrors;
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index ac226f8..09773a7 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -12,7 +12,8 @@
"stripInternal": true,
"strictNullChecks": true,
"moduleResolution": "node",
- "outDir": "dist"
+ "outDir": "dist",
+ "newLine": "LF"
}, "include": [
"src",
"test"
diff --git a/typings.json b/typings.json
index 8203879..82bf57c 100644
--- a/typings.json
+++ b/typings.json
@@ -4,6 +4,7 @@
},
"dependencies": {
"mssql": "registry:dt/mssql#3.3.0+20170311011547",
- "yargs": "registry:npm/yargs#5.0.0+20160907000723"
+ "yargs": "registry:npm/yargs#5.0.0+20160907000723",
+ "yn": "registry:npm/yn#1.3.0+20170508185912"
}
}