From 6aa45d15b7b98529d3370048fa0490f8bb83d6b7 Mon Sep 17 00:00:00 2001 From: Justin Lettau Date: Thu, 31 May 2018 17:16:36 -0400 Subject: [PATCH 1/2] feat: add data scripting to pull command --- README.md | 38 +- package-lock.json | 851 +++++++++++++++++++------------------- src/commands/cat.ts | 5 +- src/commands/conns.ts | 4 +- src/commands/pull.ts | 90 ++-- src/commands/push.ts | 8 +- src/common/config.ts | 5 + src/common/idempotency.ts | 2 +- src/common/output.ts | 5 +- src/common/utility.ts | 25 +- src/sql/record-set.ts | 13 +- src/sql/script.ts | 93 ++++- 12 files changed, 620 insertions(+), 519 deletions(-) diff --git a/README.md b/README.md index 4942d8c..069597a 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,9 @@ Example output: ``` ./_sql-database + ./data + dbo.easy-lookup.sql + ... ./functions/scalar-valued dbo.complex-math.sql ... @@ -78,15 +81,20 @@ Example output: ./tables dbo.people.sql ... - ./views - dbo.super-cool-view.sql - ... ./user-defined-types/table-valued-parameters dbo.insert-people-params.sql ... + ./views + dbo.super-cool-view.sql + ... ``` -## Push (beta) +Data can be included in the `pull` via the `data` glob in the configuration file. All tables included +in the `data` glob will result in a file that truncates the table and inserts all rows. Because a truncate +is issued, it is recommended to only include static data tables, like lookup tables, in the `data` +configuration. + +## Push Execute all local scripts against the requested database. ```bash @@ -130,23 +138,32 @@ Configuration options are stored in a `ssc.json` file. // glob of files to include / exclude (examples: ["dbo.*"] or ["*", "!dbo.*"]) "files": [], + // glob of tables to include / exclude for data scripting (example: ["dbo.LookupTable"]) + "data": [], + "output": { // directory to place scripted files into (relative to config file) "root": "./_sql-database", + // directory to script data (relative to root) + "data": "./data" + // directory to script procs (relative to root) "procs": "./stored-procedures", - // directory to script schemas (relative to root) - "schemas": "./schemas", - // directory to script scalar functions (relative to root) "scalar-valued": "./functions/scalar-valued", + // directory to script schemas (relative to root) + "schemas": "./schemas", + // directory to script table functions (relative to root) "table-valued": "./functions/table-valued", + // directory to script table-valued parameters (relative to root) + "table-valued-parameters": "./user-defined-types/table-valued-parameters" + // directory to script tables (relative to root) "tables": "./tables", @@ -155,9 +172,6 @@ Configuration options are stored in a `ssc.json` file. // directory to script views (relative to root) "views": "./views" - - // directory to script table-valued parameters (relative to root) - "table-valued-parameters": "./user-defined-types/table-valued-parameters" }, "idempotency": { @@ -166,10 +180,10 @@ Configuration options are stored in a `ssc.json` file. "procs": "if-exists-drop", "scalar-valued": "if-exists-drop", "table-valued": "if-exists-drop", + "table-valued-parameters": "if-not-exists", "tables": "if-not-exists", "triggers": "if-exists-drop", - "views": "if-exists-drop", - "table-valued-parameters": "if-not-exists"; + "views": "if-exists-drop" } } ``` diff --git a/package-lock.json b/package-lock.json index 4f7368e..c5a571b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "integrity": "sha512-0QEFiR8ljcHp9bAbWxecjVRuAMr16ivPiGOw6KFQBVrVd0RQIcM3xKdRisH2EDWgVWujiYtHwhSkSUoAAGzH7Q==", "dev": true, "requires": { - "commander": "2.15.0" + "commander": "*" } }, "@types/deepmerge": { @@ -31,7 +31,7 @@ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==", "dev": true, "requires": { - "@types/node": "8.0.47" + "@types/node": "*" } }, "@types/glob": { @@ -40,9 +40,9 @@ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==", "dev": true, "requires": { - "@types/events": "1.2.0", - "@types/minimatch": "3.0.3", - "@types/node": "8.0.47" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, "@types/inquirer": { @@ -51,8 +51,8 @@ "integrity": "sha512-kIWkK3FECGKt9OrURxRvi59gwMNiWTePXWOvaJn+xhplbEvu91hIDMfLe5PUu+cEEMmD6EFU4VFJJKKp5kzCtw==", "dev": true, "requires": { - "@types/rx": "4.1.1", - "@types/through": "0.0.29" + "@types/rx": "*", + "@types/through": "*" } }, "@types/minimatch": { @@ -67,8 +67,8 @@ "integrity": "sha512-N06zogdWXWrI9Giqz+5M3xM9B4FZ68lwsRgIbVwaijHrhY4XuLy0BVNhyMUqDYlUsBJk++k2NtpFiuhr861BkQ==", "dev": true, "requires": { - "@types/events": "1.2.0", - "@types/node": "8.0.47" + "@types/events": "*", + "@types/node": "*" } }, "@types/multimatch": { @@ -89,18 +89,18 @@ "integrity": "sha1-WY/JSla67ZdfGUV04PVy/Y5iekg=", "dev": true, "requires": { - "@types/rx-core": "4.0.3", - "@types/rx-core-binding": "4.0.4", - "@types/rx-lite": "4.0.5", - "@types/rx-lite-aggregates": "4.0.3", - "@types/rx-lite-async": "4.0.2", - "@types/rx-lite-backpressure": "4.0.3", - "@types/rx-lite-coincidence": "4.0.3", - "@types/rx-lite-experimental": "4.0.1", - "@types/rx-lite-joinpatterns": "4.0.1", - "@types/rx-lite-testing": "4.0.1", - "@types/rx-lite-time": "4.0.3", - "@types/rx-lite-virtualtime": "4.0.3" + "@types/rx-core": "*", + "@types/rx-core-binding": "*", + "@types/rx-lite": "*", + "@types/rx-lite-aggregates": "*", + "@types/rx-lite-async": "*", + "@types/rx-lite-backpressure": "*", + "@types/rx-lite-coincidence": "*", + "@types/rx-lite-experimental": "*", + "@types/rx-lite-joinpatterns": "*", + "@types/rx-lite-testing": "*", + "@types/rx-lite-time": "*", + "@types/rx-lite-virtualtime": "*" } }, "@types/rx-core": { @@ -115,7 +115,7 @@ "integrity": "sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ==", "dev": true, "requires": { - "@types/rx-core": "4.0.3" + "@types/rx-core": "*" } }, "@types/rx-lite": { @@ -124,8 +124,8 @@ "integrity": "sha512-KZk5XTR1dm/kNgBx8iVpjno6fRYtAUQWBOmj+O8j724+nk097sz4fOoHJNpCkOJUtHUurZlJC7QvSFCZHbkC+w==", "dev": true, "requires": { - "@types/rx-core": "4.0.3", - "@types/rx-core-binding": "4.0.4" + "@types/rx-core": "*", + "@types/rx-core-binding": "*" } }, "@types/rx-lite-aggregates": { @@ -134,7 +134,7 @@ "integrity": "sha512-MAGDAHy8cRatm94FDduhJF+iNS5//jrZ/PIfm+QYw9OCeDgbymFHChM8YVIvN2zArwsRftKgE33QfRWvQk4DPg==", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/rx-lite-async": { @@ -143,7 +143,7 @@ "integrity": "sha512-vTEv5o8l6702ZwfAM5aOeVDfUwBSDOs+ARoGmWAKQ6LOInQ8J4/zjM7ov12fuTpktUKdMQjkeCp07Vd73mPkxw==", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/rx-lite-backpressure": { @@ -152,7 +152,7 @@ "integrity": "sha512-Y6aIeQCtNban5XSAF4B8dffhIKu6aAy/TXFlScHzSxh6ivfQBQw6UjxyEJxIOt3IT49YkS+siuayM2H/Q0cmgA==", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/rx-lite-coincidence": { @@ -161,7 +161,7 @@ "integrity": "sha512-1VNJqzE9gALUyMGypDXZZXzR0Tt7LC9DdAZQ3Ou/Q0MubNU35agVUNXKGHKpNTba+fr8GdIdkC26bRDqtCQBeQ==", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/rx-lite-experimental": { @@ -170,7 +170,7 @@ "integrity": "sha1-xTL1y98/LBXaFt7Ykw0bKYQCPL0=", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/rx-lite-joinpatterns": { @@ -179,7 +179,7 @@ "integrity": "sha1-9w/jcFGKhDLykVjMkv+1a05K/D4=", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/rx-lite-testing": { @@ -188,7 +188,7 @@ "integrity": "sha1-IbGdEfTf1v/vWp0WSOnIh5v+Iek=", "dev": true, "requires": { - "@types/rx-lite-virtualtime": "4.0.3" + "@types/rx-lite-virtualtime": "*" } }, "@types/rx-lite-time": { @@ -197,7 +197,7 @@ "integrity": "sha512-ukO5sPKDRwCGWRZRqPlaAU0SKVxmWwSjiOrLhoQDoWxZWg6vyB9XLEZViKOzIO6LnTIQBlk4UylYV0rnhJLxQw==", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/rx-lite-virtualtime": { @@ -206,7 +206,7 @@ "integrity": "sha512-3uC6sGmjpOKatZSVHI2xB1+dedgml669ZRvqxy+WqmGJDVusOdyxcKfyzjW0P3/GrCiN4nmRkLVMhPwHCc5QLg==", "dev": true, "requires": { - "@types/rx-lite": "4.0.5" + "@types/rx-lite": "*" } }, "@types/through": { @@ -215,7 +215,7 @@ "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==", "dev": true, "requires": { - "@types/node": "8.0.47" + "@types/node": "*" } }, "@types/xml2js": { @@ -224,7 +224,7 @@ "integrity": "sha512-8aKUBSj3oGcnuiBmDLm3BIk09RYg01mz9HlQ2u4aS17oJ25DxjQrEUVGFSBVNOfM45pQW4OjcBPplq6r/exJdA==", "dev": true, "requires": { - "@types/node": "8.0.47" + "@types/node": "*" } }, "JSONStream": { @@ -233,8 +233,8 @@ "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", "dev": true, "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, "align-text": { @@ -242,11 +242,10 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, - "optional": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -260,7 +259,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" } }, "ansi-escapes": { @@ -278,7 +277,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "argparse": { @@ -287,7 +286,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "array-differ": { @@ -312,7 +311,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -337,9 +336,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-regex": { @@ -360,11 +359,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -373,7 +372,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -389,8 +388,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "balanced-match": { @@ -408,7 +407,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.5" } }, "boxen": { @@ -416,13 +415,13 @@ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "dependencies": { "camelcase": { @@ -437,7 +436,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -459,8 +458,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "capture-stack-trace": { @@ -475,8 +474,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -484,9 +483,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chardet": { @@ -527,8 +526,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -552,7 +551,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -576,8 +575,8 @@ "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", "dev": true, "requires": { - "array-ify": "1.0.0", - "dot-prop": "3.0.0" + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" } }, "concat-map": { @@ -591,9 +590,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -601,12 +600,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.1.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "dot-prop": { @@ -614,7 +613,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } } } @@ -625,16 +624,16 @@ "integrity": "sha1-kVGmKx2O2y2CcR2r9bfPcQQfgrE=", "dev": true, "requires": { - "conventional-changelog-angular": "1.6.0", - "conventional-changelog-atom": "0.1.2", - "conventional-changelog-codemirror": "0.2.1", - "conventional-changelog-core": "1.9.5", - "conventional-changelog-ember": "0.2.10", - "conventional-changelog-eslint": "0.2.1", - "conventional-changelog-express": "0.2.1", - "conventional-changelog-jquery": "0.1.0", - "conventional-changelog-jscs": "0.1.0", - "conventional-changelog-jshint": "0.2.1" + "conventional-changelog-angular": "^1.5.2", + "conventional-changelog-atom": "^0.1.2", + "conventional-changelog-codemirror": "^0.2.1", + "conventional-changelog-core": "^1.9.3", + "conventional-changelog-ember": "^0.2.9", + "conventional-changelog-eslint": "^0.2.1", + "conventional-changelog-express": "^0.2.1", + "conventional-changelog-jquery": "^0.1.0", + "conventional-changelog-jscs": "^0.1.0", + "conventional-changelog-jshint": "^0.2.1" } }, "conventional-changelog-angular": { @@ -643,8 +642,8 @@ "integrity": "sha1-CiagcfLJ/PzyuGugz79uYwG3W/o=", "dev": true, "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" + "compare-func": "^1.3.1", + "q": "^1.4.1" } }, "conventional-changelog-atom": { @@ -653,7 +652,7 @@ "integrity": "sha1-Ella1SZ6aTfDTPkAKBscZRmKTGM=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-codemirror": { @@ -662,7 +661,7 @@ "integrity": "sha1-KZpPcUe681DmyBWPxUlUopHFzAk=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-core": { @@ -671,19 +670,19 @@ "integrity": "sha1-XbdWba18DLddr0f7spdve/mSjB0=", "dev": true, "requires": { - "conventional-changelog-writer": "2.0.3", - "conventional-commits-parser": "2.1.0", - "dateformat": "1.0.12", - "get-pkg-repo": "1.4.0", - "git-raw-commits": "1.3.0", - "git-remote-origin-url": "2.0.0", - "git-semver-tags": "1.2.3", - "lodash": "4.17.4", - "normalize-package-data": "2.4.0", - "q": "1.5.1", - "read-pkg": "1.1.0", - "read-pkg-up": "1.0.1", - "through2": "2.0.3" + "conventional-changelog-writer": "^2.0.3", + "conventional-commits-parser": "^2.1.0", + "dateformat": "^1.0.12", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^1.3.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^1.2.3", + "lodash": "^4.0.0", + "normalize-package-data": "^2.3.5", + "q": "^1.4.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "through2": "^2.0.0" } }, "conventional-changelog-ember": { @@ -692,7 +691,7 @@ "integrity": "sha512-LBBBZO6Q7ib4HhSdyCNVR25OtaXl710UJg1aSHCLmR8AjuXKs3BO8tnbY1MH+D1C+z5IFoEDkpjOddefNTyhCQ==", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-eslint": { @@ -701,7 +700,7 @@ "integrity": "sha1-LCoRvrIW+AZJunKDQYApO2h8BmI=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-express": { @@ -710,7 +709,7 @@ "integrity": "sha1-g42eHmyQmXA7FQucGaoteBdCvWw=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-jquery": { @@ -719,7 +718,7 @@ "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-jscs": { @@ -728,7 +727,7 @@ "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-jshint": { @@ -737,8 +736,8 @@ "integrity": "sha1-hhObs6yZiZ8rF36WF+CbN9mbzzo=", "dev": true, "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" + "compare-func": "^1.3.1", + "q": "^1.4.1" } }, "conventional-changelog-writer": { @@ -747,16 +746,16 @@ "integrity": "sha512-2E1h7UXL0fhRO5h0CxDZ5EBc5sfBZEQePvuZ+gPvApiRrICUyNDy/NQIP+2TBd4wKZQf2Zm7TxbzXHG5HkPIbA==", "dev": true, "requires": { - "compare-func": "1.3.2", - "conventional-commits-filter": "1.1.1", - "dateformat": "1.0.12", - "handlebars": "4.0.11", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "semver": "5.4.1", - "split": "1.0.1", - "through2": "2.0.3" + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.1.1", + "dateformat": "^1.0.11", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.0.0", + "meow": "^3.3.0", + "semver": "^5.0.1", + "split": "^1.0.0", + "through2": "^2.0.0" } }, "conventional-commits-filter": { @@ -765,8 +764,8 @@ "integrity": "sha512-bQyatySNKHhcaeKVr9vFxYWA1W1Tdz6ybVMYDmv4/FhOXY1+fchiW07TzRbIQZhVa4cvBwrEaEUQBbCncFSdJQ==", "dev": true, "requires": { - "is-subset": "0.1.1", - "modify-values": "1.0.0" + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" } }, "conventional-commits-parser": { @@ -775,13 +774,13 @@ "integrity": "sha512-8MD05yN0Zb6aRsZnFX1ET+8rHWfWJk+my7ANCJZBU2mhz7TSB1fk2vZhkrwVy/PCllcTYAP/1T1NiWQ7Z01mKw==", "dev": true, "requires": { - "JSONStream": "1.3.2", - "is-text-path": "1.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3", - "trim-off-newlines": "1.0.1" + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^3.3.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" } }, "conventional-recommended-bump": { @@ -790,13 +789,13 @@ "integrity": "sha512-WK0HnYnXd9e8J1YezUlfle+Pz7HB1RYvIH6gPLAXoroQTzDSfNfGM1tHHmdrJw0/4BMr+zw0U9V1WzFEfQwE3w==", "dev": true, "requires": { - "concat-stream": "1.6.0", - "conventional-commits-filter": "1.1.1", - "conventional-commits-parser": "2.1.0", - "git-raw-commits": "1.3.0", - "git-semver-tags": "1.2.3", - "meow": "3.7.0", - "object-assign": "4.1.1" + "concat-stream": "^1.4.10", + "conventional-commits-filter": "^1.1.1", + "conventional-commits-parser": "^2.1.0", + "git-raw-commits": "^1.3.0", + "git-semver-tags": "^1.2.3", + "meow": "^3.3.0", + "object-assign": "^4.0.1" } }, "core-js": { @@ -814,7 +813,7 @@ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { @@ -822,9 +821,9 @@ "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.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-random-string": { @@ -838,7 +837,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "dargs": { @@ -847,7 +846,7 @@ "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "dateformat": { @@ -856,8 +855,8 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" } }, "debug": { @@ -901,7 +900,7 @@ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotgitignore": { @@ -910,8 +909,8 @@ "integrity": "sha512-eu5XjSstm0WXQsARgo6kPjkINYZlOUW+z/KtAAIBjHa5mUpMPrxJytbPIndWz6GubBuuuH5ljtVcXKnVnH5q8w==", "dev": true, "requires": { - "find-up": "2.1.0", - "minimatch": "3.0.4" + "find-up": "^2.1.0", + "minimatch": "^3.0.4" }, "dependencies": { "find-up": { @@ -920,7 +919,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -936,7 +935,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { @@ -961,13 +960,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "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" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "external-editor": { @@ -1004,8 +1003,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "fs-access": { @@ -1014,7 +1013,7 @@ "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { - "null-check": "1.0.0" + "null-check": "^1.0.0" } }, "fs-extra": { @@ -1049,11 +1048,11 @@ "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "meow": "3.7.0", - "normalize-package-data": "2.4.0", - "parse-github-repo-url": "1.4.1", - "through2": "2.0.3" + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" } }, "get-stdin": { @@ -1073,11 +1072,11 @@ "integrity": "sha1-C8hZbpDV/+c29/VUa9LRL3OrqsY=", "dev": true, "requires": { - "dargs": "4.1.0", - "lodash.template": "4.4.0", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3" + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^3.3.0", + "split2": "^2.0.0", + "through2": "^2.0.0" } }, "git-remote-origin-url": { @@ -1086,8 +1085,8 @@ "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", "dev": true, "requires": { - "gitconfiglocal": "1.0.0", - "pify": "2.3.0" + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" } }, "git-semver-tags": { @@ -1096,8 +1095,8 @@ "integrity": "sha1-GItFOIK/nXojr9Mbq6U32rc4jV0=", "dev": true, "requires": { - "meow": "3.7.0", - "semver": "5.4.1" + "meow": "^3.3.0", + "semver": "^5.0.1" } }, "gitconfiglocal": { @@ -1106,7 +1105,7 @@ "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.2" } }, "glob": { @@ -1114,12 +1113,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "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" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "global-dirs": { @@ -1127,7 +1126,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "got": { @@ -1135,17 +1134,17 @@ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { @@ -1159,10 +1158,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" } }, "has-ansi": { @@ -1171,7 +1170,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -1214,7 +1213,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "inflight": { @@ -1222,8 +1221,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1272,8 +1271,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true + "dev": true }, "is-builtin-module": { "version": "1.0.0", @@ -1281,7 +1279,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-finite": { @@ -1290,7 +1288,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -1303,8 +1301,8 @@ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-npm": { @@ -1322,7 +1320,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-promise": { @@ -1357,7 +1355,7 @@ "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { - "text-extensions": "1.7.0" + "text-extensions": "^1.0.0" } }, "is-utf8": { @@ -1388,8 +1386,8 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "json-stringify-safe": { @@ -1417,9 +1415,8 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "optional": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "latest-version": { @@ -1427,7 +1424,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-cache": { @@ -1443,7 +1440,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "load-json-file": { @@ -1452,11 +1449,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "locate-path": { @@ -1465,8 +1462,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -1494,8 +1491,8 @@ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { @@ -1504,15 +1501,14 @@ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0" + "lodash._reinterpolate": "~3.0.0" } }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true + "dev": true }, "loud-rejection": { "version": "1.6.0", @@ -1520,8 +1516,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lowercase-keys": { @@ -1534,8 +1530,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -1543,7 +1539,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -1565,7 +1561,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "meow": { @@ -1574,16 +1570,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" } }, "mimic-fn": { @@ -1596,7 +1592,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -1620,9 +1616,9 @@ "resolved": "https://registry.npmjs.org/mssql/-/mssql-4.1.0.tgz", "integrity": "sha512-ekht0eILEV0P1CbpkwpAxhgO+/5goYizUJrt7pgDm3fP6lGKe0+8V9jhTvQZ8DPHkycSd0wYGUoz/YA7VN7kQQ==", "requires": { - "debug": "2.6.9", - "generic-pool": "3.2.0", - "tedious": "2.6.1" + "debug": "^2.6.3", + "generic-pool": "^3.1.7", + "tedious": "^2.0.0" } }, "multimatch": { @@ -1630,10 +1626,10 @@ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" } }, "mute-stream": { @@ -1647,10 +1643,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "npm-run-path": { @@ -1658,7 +1654,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "null-check": { @@ -1684,7 +1680,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -1701,8 +1697,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { @@ -1719,9 +1715,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -1740,7 +1736,7 @@ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -1749,7 +1745,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -1763,10 +1759,10 @@ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.4.1" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "parse-github-repo-url": { @@ -1781,7 +1777,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "path-exists": { @@ -1790,7 +1786,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -1820,9 +1816,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pify": { @@ -1843,7 +1839,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "prepend-http": { @@ -1877,10 +1873,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, "read-pkg": { @@ -1889,9 +1885,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -1900,8 +1896,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -1909,13 +1905,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "redent": { @@ -1924,8 +1920,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "regenerator-runtime": { @@ -1938,8 +1934,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "1.2.5", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -1947,15 +1943,14 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "1.2.5" + "rc": "^1.0.1" } }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true + "dev": true }, "repeating": { "version": "2.0.1", @@ -1963,7 +1958,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "require-directory": { @@ -1984,7 +1979,7 @@ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "restore-cursor": { @@ -2003,7 +1998,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "run-async": { @@ -2054,7 +2049,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "5.4.1" + "semver": "^5.0.3" } }, "set-blocking": { @@ -2068,7 +2063,7 @@ "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": "^1.0.0" } }, "shebang-regex": { @@ -2087,7 +2082,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "spdx-correct": { @@ -2096,7 +2091,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -2117,7 +2112,7 @@ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { - "through": "2.3.8" + "through": "2" } }, "split2": { @@ -2126,7 +2121,7 @@ "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { - "through2": "2.0.3" + "through2": "^2.0.2" } }, "sprintf-js": { @@ -2141,14 +2136,14 @@ "integrity": "sha512-2UJ2BIUNa7+41PH4FvYicSQED2LCt2RXjmNFis+JZlxZtwzNnGn4uuL8WBUqHoC9b+bJ0AHIAX/bilzm+pGPeA==", "dev": true, "requires": { - "chalk": "1.1.3", - "conventional-changelog": "1.1.7", - "conventional-recommended-bump": "1.1.0", - "dotgitignore": "1.0.3", - "figures": "1.7.0", - "fs-access": "1.0.1", - "semver": "5.4.1", - "yargs": "8.0.2" + "chalk": "^1.1.3", + "conventional-changelog": "^1.1.0", + "conventional-recommended-bump": "^1.0.0", + "dotgitignore": "^1.0.3", + "figures": "^1.5.0", + "fs-access": "^1.0.0", + "semver": "^5.1.0", + "yargs": "^8.0.1" }, "dependencies": { "ansi-regex": { @@ -2169,11 +2164,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "figures": { @@ -2182,8 +2177,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "strip-ansi": { @@ -2192,7 +2187,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -2208,8 +2203,8 @@ "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string_decoder": { @@ -2217,7 +2212,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -2225,7 +2220,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -2234,7 +2229,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -2248,7 +2243,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -2261,7 +2256,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "tedious": { @@ -2269,14 +2264,14 @@ "resolved": "https://registry.npmjs.org/tedious/-/tedious-2.6.1.tgz", "integrity": "sha512-5Edp2QNmxHLdeJUPcloE5qwT7zCHkdE/Yb1Xt3XYE2MONhAyMKzMfOo1jB7CoQYqEDU6+CxvwG9jcqj0I4H9rw==", "requires": { - "babel-runtime": "6.26.0", + "babel-runtime": "^6.26.0", "big-number": "0.3.1", - "bl": "1.2.1", - "depd": "1.1.2", - "iconv-lite": "0.4.19", - "punycode": "2.1.0", - "readable-stream": "2.3.3", - "sprintf-js": "1.1.1" + "bl": "^1.2.0", + "depd": "^1.1.2", + "iconv-lite": "^0.4.11", + "punycode": "^2.1.0", + "readable-stream": "^2.2.6", + "sprintf-js": "^1.1.1" }, "dependencies": { "sprintf-js": { @@ -2291,7 +2286,7 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "text-extensions": { @@ -2311,8 +2306,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "timed-out": { @@ -2357,18 +2352,18 @@ "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.3.2", - "commander": "2.15.0", - "diff": "3.4.0", - "glob": "7.1.2", - "js-yaml": "3.10.0", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.4.1", - "tslib": "1.8.1", - "tsutils": "2.16.0" + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.12.1" } }, "tslint-config-unicorn-science": { @@ -2383,7 +2378,7 @@ "integrity": "sha512-9Ier/60O7OZRNPiw+or5QAtAY4kQA+WDiO/r6xOYATEyefH9bdfvTRLCxrYnFhQlZfET2vYXKfpr3Vw2BiArZw==", "dev": true, "requires": { - "tslib": "1.8.1" + "tslib": "^1.8.1" } }, "typedarray": { @@ -2405,9 +2400,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "camelcase": { @@ -2431,9 +2426,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -2451,7 +2446,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universalify": { @@ -2469,15 +2464,15 @@ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", "requires": { - "boxen": "1.3.0", - "chalk": "2.3.2", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "url-parse-lax": { @@ -2485,7 +2480,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "util-deprecate": { @@ -2499,8 +2494,8 @@ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "which": { @@ -2508,7 +2503,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -2522,7 +2517,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "window-size": { @@ -2544,8 +2539,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -2560,7 +2555,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -2569,9 +2564,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -2580,7 +2575,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -2595,9 +2590,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -2610,8 +2605,8 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.4" + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" } }, "xmlbuilder": { @@ -2642,19 +2637,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "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": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.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": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { "ansi-regex": { @@ -2675,9 +2670,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -2686,9 +2681,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -2699,7 +2694,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -2708,7 +2703,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "load-json-file": { @@ -2717,10 +2712,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "path-type": { @@ -2729,7 +2724,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { @@ -2738,9 +2733,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -2749,8 +2744,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "strip-ansi": { @@ -2759,7 +2754,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -2776,7 +2771,7 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { diff --git a/src/commands/cat.ts b/src/commands/cat.ts index 1b0a57e..98b7afa 100644 --- a/src/commands/cat.ts +++ b/src/commands/cat.ts @@ -1,6 +1,5 @@ import chalk from 'chalk'; import * as fs from 'fs-extra'; -import * as glob from 'glob'; import { EOL } from 'os'; import { Config } from '../common/config'; @@ -17,7 +16,7 @@ export function cat(): void { // order is important const files: string[] = util.getFilesOrdered(config); - for (const file of files) { + files.forEach(file => { const content: string = fs.readFileSync(file).toString(); const end: string = content.substr(-2).toLowerCase(); @@ -25,7 +24,7 @@ export function cat(): void { output += EOL; output += (end !== 'go' ? 'go' : ''); output += EOL + EOL; - } + }); fs.outputFileSync(`${config.output.root}/cat.sql`, output); diff --git a/src/commands/conns.ts b/src/commands/conns.ts index d85caf1..f111b83 100644 --- a/src/commands/conns.ts +++ b/src/commands/conns.ts @@ -16,7 +16,7 @@ export function conns(): void { head: ['Name', 'Server', 'Port', 'Database', 'User', 'Password'] }); - for (const conn of connections) { + connections.forEach(conn => { table.push([ conn.name || placeholder, conn.server || placeholder, @@ -25,7 +25,7 @@ export function conns(): void { conn.user || placeholder, conn.password || placeholder ]); - } + }); console.log(table.toString()); } diff --git a/src/commands/pull.ts b/src/commands/pull.ts index 68603d8..7a99fe9 100644 --- a/src/commands/pull.ts +++ b/src/commands/pull.ts @@ -12,24 +12,17 @@ import { IdempotencyOption } from '../common/idempotency'; import * as util from '../common/utility'; import { ColumnRecordSet, + DataRecordSet, ForeignKeyRecordSet, IndexRecordSet, ObjectRecordSet, PrimaryKeyRecordSet, SchemaRecordSet, TableRecordSet, - TvpRecordSet + TvpRecordSet, } from '../sql/record-set'; import * as script from '../sql/script'; -import { - columnRead, - foreignKeyRead, - indexRead, - objectRead, - primaryKeyRead, - tableRead, - tvpRead - } from '../sql/sys'; +import { columnRead, foreignKeyRead, indexRead, objectRead, primaryKeyRead, tableRead, tvpRead } from '../sql/sys'; /** * Generate SQL files for all tables, stored procedures, functions, etc. @@ -46,15 +39,20 @@ export function pull(name: string): void { // connect to db new sql.ConnectionPool(conn) .connect() - .then((pool: sql.ConnectionPool): Promise[]> => { - return Promise.all([ + .then(pool => { + return Promise.all([ pool.request().query(objectRead), pool.request().query(tableRead), pool.request().query(columnRead), pool.request().query(primaryKeyRead), pool.request().query(foreignKeyRead), pool.request().query(indexRead), - pool.request().query(tvpRead) + pool.request().query(tvpRead), + ...config.data.map(table => { + return pool.request() + .query(`select * from ${table}`) + .then(result => ({ name: table, type: 'DATA', result })) + }) ]).then(results => { pool.close(); return results; @@ -74,7 +72,7 @@ export function pull(name: string): void { * @param config Current configuration to use. * @param results Array of data sets from SQL queries. */ -function scriptFiles(config: Config, results: sql.IResult[]): void { +function scriptFiles(config: Config, results: any[]): void { const existing: string[] = glob.sync(`${config.output.root}/**/*.sql`); // note: array order MUST match query promise array @@ -85,6 +83,7 @@ function scriptFiles(config: Config, results: sql.IResult[]): void { const foreignKeys: ForeignKeyRecordSet[] = results[4].recordset; const indexes: IndexRecordSet[] = results[5].recordset; const tvps: TvpRecordSet[] = results[6].recordset; + const data: DataRecordSet[] = results.slice(7); // get unique schema names const schemas: SchemaRecordSet[] = tables @@ -93,55 +92,68 @@ function scriptFiles(config: Config, results: sql.IResult[]): void { .map(value => ({ name: value, type: 'SCHEMA' })); // write files for schemas - for (const item of schemas) { + schemas.forEach(item => { const file: string = util.safeFile(`${item.name}.sql`); - if (!include(config, file)) { - continue; + if (!include(config.files, file)) { + return; } const content: string = script.schema(item); const dir: string = createFile(config, item, file, content); exclude(config, existing, dir); - } + }); // write files for stored procedures, functions, ect. - for (const item of objects) { + objects.forEach(item => { const file: string = util.safeFile(`${item.schema}.${item.name}.sql`); - if (!include(config, file)) { - continue; + if (!include(config.files, file)) { + return; } const dir: string = createFile(config, item, file, item.text); exclude(config, existing, dir); - } + }); // write files for tables - for (const item of tables) { + tables.forEach(item => { const file: string = util.safeFile(`${item.schema}.${item.name}.sql`); - if (!include(config, file)) { - continue; + if (!include(config.files, file)) { + return; } const content: string = script.table(item, columns, primaryKeys, foreignKeys, indexes); const dir: string = createFile(config, item, file, content); exclude(config, existing, dir); - } + }); // write files for user-defined table-valued parameter - for (const item of tvps) { + tvps.forEach(item => { const file: string = util.safeFile(`${item.schema}.${item.name}.sql`); - if (!include(config, file)) { - continue; + if (!include(config.files, file)) { + return; } const content: string = script.tvp(item, columns); const dir: string = createFile(config, item, file, content); exclude(config, existing, dir); - } + }); + + // write files for data + data.forEach(item => { + const file: string = util.safeFile(`${item.name}.sql`); + + if (!include(config.data, item.name)) { + return; + } + + const content: string = script.data(item); + const dir: string = createFile(config, item, file, content); + exclude(config, existing, dir); + }); // all remaining files in `existing` need deleted removeFiles(existing); @@ -165,6 +177,10 @@ function createFile(config: Config, item: any, file: string, content: string): s output = config.output.schemas; type = null; break; + case 'DATA': // not a real object type + output = config.output.data; + type = null; + break; case 'U': output = config.output.tables; type = config.idempotency.tables; @@ -212,13 +228,13 @@ function createFile(config: Config, item: any, file: string, content: string): s } /** - * Check if a file passes the `files` glob pattern. + * Check if a file passes the glob pattern. * - * @param config Current configuration to use. + * @param glob Glob pattern to check against. * @param file File path to check. */ -function include(config: Config, file: string | string[]): boolean { - if (!config.files || !config.files.length) { +function include(glob: string[], file: string | string[]): boolean { + if (!glob || !glob.length) { return true; } @@ -226,7 +242,7 @@ function include(config: Config, file: string | string[]): boolean { file = [file]; } - const results: string[] = multimatch(file, config.files); + const results: string[] = multimatch(file, glob); return !!results.length; } @@ -255,8 +271,8 @@ function exclude(config: Config, existing: string[], dir: string): void { * @param files Array of file paths to delete. */ function removeFiles(files: string[]): void { - for (const file of files) { + files.forEach(file => { console.log(`Removing ${chalk.cyan(file)} ...`); fs.removeSync(file); - } + }); } diff --git a/src/commands/push.ts b/src/commands/push.ts index 0339a57..a7d42eb 100644 --- a/src/commands/push.ts +++ b/src/commands/push.ts @@ -23,18 +23,18 @@ export function push(name?: string): void { const files: string[] = util.getFilesOrdered(config); let promise: Promise = new sql.ConnectionPool(conn).connect(); - for (const file of files) { + files.forEach(file => { console.log(`Executing ${chalk.cyan(file)} ...`); const content: string = fs.readFileSync(file, 'utf8'); const statements: string[] = content.split('go' + EOL); - for (const statement of statements) { + statements.forEach(statement => { promise = promise.then(pool => { return pool.request().batch(statement).then(result => pool); }); - } - } + }); + }); promise .then(() => { diff --git a/src/common/config.ts b/src/common/config.ts index dceff87..9a0bcba 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -22,6 +22,11 @@ export interface Config { */ files?: string[]; + /** + * Glob of tables to include / exclude for data pulling. + */ + data?: string[]; + /** * Describes output folder structure. */ diff --git a/src/common/idempotency.ts b/src/common/idempotency.ts index 3f26721..08c1016 100644 --- a/src/common/idempotency.ts +++ b/src/common/idempotency.ts @@ -5,10 +5,10 @@ export interface IdempotencyConfig { 'procs'?: IdempotencyOption; 'scalar-valued'?: IdempotencyOption; 'table-valued'?: IdempotencyOption; + 'table-valued-parameters'?: IdempotencyOption; 'tables'?: IdempotencyOption; 'triggers'?: IdempotencyOption; 'views'?: IdempotencyOption; - 'table-valued-parameters'?: IdempotencyOption; } /** diff --git a/src/common/output.ts b/src/common/output.ts index 27e5d11..3e1055f 100644 --- a/src/common/output.ts +++ b/src/common/output.ts @@ -3,12 +3,13 @@ */ export interface OutputConfig { 'root'?: string; + 'data'?: string; 'procs'?: string; - 'schemas'?: string; 'scalar-valued'?: string; + 'schemas'?: string; 'table-valued'?: string; + 'table-valued-parameters'?: string; 'tables'?: string; 'triggers'?: string; 'views'?: string; - 'table-valued-parameters'?: string; } diff --git a/src/common/utility.ts b/src/common/utility.ts index 561a287..2594301 100644 --- a/src/common/utility.ts +++ b/src/common/utility.ts @@ -25,25 +25,27 @@ export const webConfigFile: string = './Web.config'; export const configDefaults: Config = { connections: [], files: [], + data: [], output: { 'root': './_sql-database', + 'data': './data', 'procs': './stored-procedures', - 'schemas': './schemas', 'scalar-valued': './functions/scalar-valued', + 'schemas': './schemas', 'table-valued': './functions/table-valued', + 'table-valued-parameters': './user-defined-types/table-valued-parameters', 'tables': './tables', 'triggers': './triggers', - 'views': './views', - 'table-valued-parameters': './user-defined-types/table-valued-parameters' + 'views': './views' }, idempotency: { 'procs': 'if-exists-drop', 'scalar-valued': 'if-exists-drop', 'table-valued': 'if-exists-drop', + 'table-valued-parameters': 'if-not-exists', 'tables': 'if-not-exists', 'triggers': 'if-exists-drop', - 'views': 'if-exists-drop', - 'table-valued-parameters': 'if-not-exists' + 'views': 'if-exists-drop' } }; @@ -145,8 +147,8 @@ export function getConn(config: Config, name?: string): Connection { export function getWebConfigConns(file?: string): Connection[] { const parser: xml2js.Parser = new xml2js.Parser(); const webConfig: string = file || webConfigFile; - let content: string; const conns: Connection[] = []; + let content: string; if (!fs.existsSync(webConfig)) { // web config not found, use defaults @@ -166,9 +168,9 @@ export function getWebConfigConns(file?: string): Connection[] { try { const connStrings: any[] = result.configuration.connectionStrings[0].add; - for (const item of connStrings) { + connStrings.forEach(item => { conns.push(parseConnString(item.$.name, item.$.connectionString)); - } + }); } catch (err) { console.error('Could not parse connection strings from Web.config file!'); @@ -194,13 +196,14 @@ export function getFilesOrdered(config: Config): string[] { config.output['table-valued'], config.output.procs, config.output.triggers, - config.output['table-valued-parameters'] + config.output['table-valued-parameters'], + config.output.data ]; - for (const dir of directories) { + directories.forEach(dir => { const files: string[] = glob.sync(`${config.output.root}/${dir}/**/*.sql`); output.push(...files); - } + }); return output; } diff --git a/src/sql/record-set.ts b/src/sql/record-set.ts index 68c2fde..843ac02 100644 --- a/src/sql/record-set.ts +++ b/src/sql/record-set.ts @@ -1,3 +1,5 @@ +import * as sql from 'mssql'; + /** * Base record set for record sets. */ @@ -9,13 +11,22 @@ export interface AbstractRecordSet { } /** - * Mock dataset, properties from table query. + * Mock schema record set, properties from table query. */ export interface SchemaRecordSet { name: string; type: string; } +/** + * Mock data record set. + */ +export interface DataRecordSet { + name: string; + type: string; + result: sql.IResult; +} + /** * Dataset returned from table query. */ diff --git a/src/sql/script.ts b/src/sql/script.ts index c95dbd2..c27c89f 100644 --- a/src/sql/script.ts +++ b/src/sql/script.ts @@ -1,15 +1,16 @@ import { EOL } from 'os'; +import { isBoolean, isDate, isString } from 'ts-util-is'; import { IdempotencyOption } from '../common/idempotency'; import { AbstractRecordSet, ColumnRecordSet, + DataRecordSet, ForeignKeyRecordSet, IndexRecordSet, - ObjectRecordSet, PrimaryKeyRecordSet, SchemaRecordSet, - TableRecordSet + TableRecordSet, } from '../sql/record-set'; /** @@ -131,32 +132,40 @@ export function table( output += EOL; // columns - for (const col of columns.filter(x => x.object_id === item.object_id)) { - output += ' ' + column(col) + ','; - output += EOL; - } + columns + .filter(x => x.object_id === item.object_id) + .forEach(col => { + output += ' ' + column(col) + ','; + output += EOL; + }); // primary keys - for (const pk of primaryKeys.filter(x => x.object_id === item.object_id)) { - output += ' ' + primaryKey(pk); - output += EOL; - } + primaryKeys + .filter(x => x.object_id === item.object_id) + .forEach(pk => { + output += ' ' + primaryKey(pk); + output += EOL; + }); // foreign keys - for (const fk of foreignKeys.filter(x => x.object_id === item.object_id)) { - output += ' ' + foreignKey(fk); - output += EOL; - } + foreignKeys + .filter(x => x.object_id === item.object_id) + .forEach(fk => { + output += ' ' + foreignKey(fk); + output += EOL; + }); output += ')'; output += EOL; output += EOL; // indexes - for (const ix of indexes.filter(x => x.object_id === item.object_id)) { - output += index(ix); - output += EOL; - } + indexes + .filter(x => x.object_id === item.object_id) + .forEach(ix => { + output += index(ix); + output += EOL; + }) return output; } @@ -197,6 +206,54 @@ export function tvp( return output; } +/** + * Get script for for table data. + * + * @param item Results from data query. + */ +export function data(item: DataRecordSet): string { + let output: string = ''; + + // idempotency + output += `truncate table ${item.name}`; + output += EOL; + + item.result.recordset.forEach(row => { + const keys: string[] = Object.keys(row); + const columns: string = keys.join(', '); + const values: string = keys.map(key => value(row[key])).join(', '); + + output += `insert into ${item.name} (${columns}) values (${values})`; + output += EOL; + }); + + output += EOL; + return output; +} + +/** + * Safely transform SQL value for scripting. + * + * @param value SQL data value. + */ +function value(value: any): any { + if (isString(value)) { + value = value.replace(`'`, `''`); + return `'${value}'`; + } + + if (isDate(value)) { + value = value.toISOString(); + return `'${value}'`; + } + + if (isBoolean(value)) { + return value ? 1 : 0; + } + + return value; +} + /** * Get script for table's column. * From a0324d3ff03ee9c99f7e13db48f4040600a4b15e Mon Sep 17 00:00:00 2001 From: Justin Lettau Date: Sun, 10 Jun 2018 20:07:55 -0400 Subject: [PATCH 2/2] fix: fix lint errors --- src/commands/pull.ts | 12 ++++++------ src/sql/script.ts | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/commands/pull.ts b/src/commands/pull.ts index 7a99fe9..c5fcc2f 100644 --- a/src/commands/pull.ts +++ b/src/commands/pull.ts @@ -19,7 +19,7 @@ import { PrimaryKeyRecordSet, SchemaRecordSet, TableRecordSet, - TvpRecordSet, + TvpRecordSet } from '../sql/record-set'; import * as script from '../sql/script'; import { columnRead, foreignKeyRead, indexRead, objectRead, primaryKeyRead, tableRead, tvpRead } from '../sql/sys'; @@ -51,7 +51,7 @@ export function pull(name: string): void { ...config.data.map(table => { return pool.request() .query(`select * from ${table}`) - .then(result => ({ name: table, type: 'DATA', result })) + .then(result => ({ name: table, type: 'DATA', result })); }) ]).then(results => { pool.close(); @@ -230,11 +230,11 @@ function createFile(config: Config, item: any, file: string, content: string): s /** * Check if a file passes the glob pattern. * - * @param glob Glob pattern to check against. + * @param files Glob pattern to check against. * @param file File path to check. */ -function include(glob: string[], file: string | string[]): boolean { - if (!glob || !glob.length) { +function include(files: string[], file: string | string[]): boolean { + if (!files || !files.length) { return true; } @@ -242,7 +242,7 @@ function include(glob: string[], file: string | string[]): boolean { file = [file]; } - const results: string[] = multimatch(file, glob); + const results: string[] = multimatch(file, files); return !!results.length; } diff --git a/src/sql/script.ts b/src/sql/script.ts index c27c89f..693aeb1 100644 --- a/src/sql/script.ts +++ b/src/sql/script.ts @@ -10,7 +10,7 @@ import { IndexRecordSet, PrimaryKeyRecordSet, SchemaRecordSet, - TableRecordSet, + TableRecordSet } from '../sql/record-set'; /** @@ -165,7 +165,7 @@ export function table( .forEach(ix => { output += index(ix); output += EOL; - }) + }); return output; } @@ -221,7 +221,7 @@ export function data(item: DataRecordSet): string { item.result.recordset.forEach(row => { const keys: string[] = Object.keys(row); const columns: string = keys.join(', '); - const values: string = keys.map(key => value(row[key])).join(', '); + const values: string = keys.map(key => safeValue(row[key])).join(', '); output += `insert into ${item.name} (${columns}) values (${values})`; output += EOL; @@ -236,9 +236,9 @@ export function data(item: DataRecordSet): string { * * @param value SQL data value. */ -function value(value: any): any { +function safeValue(value: any): any { if (isString(value)) { - value = value.replace(`'`, `''`); + value = value.replace("'", "''"); return `'${value}'`; }