From 12fbd3cc0431aeb5a6bf5f26b17d272c05ed2f8e Mon Sep 17 00:00:00 2001 From: Grzegorz Lachowski Date: Mon, 15 Oct 2018 15:41:38 +0200 Subject: [PATCH 1/2] enhance dates storage --- package-lock.json | 510 +++++++++--------- package.json | 2 +- src/Documents/Commands/GetRevisionsCommand.ts | 2 +- .../Conventions/DocumentConventions.ts | 31 +- .../Identity/Commands/NextHiloCommand.ts | 2 +- .../Session/AbstractDocumentQuery.ts | 2 +- .../InMemoryDocumentSessionOperations.ts | 2 +- src/Mapping/ObjectMapper.ts | 4 +- src/Utility/DateUtil.ts | 48 +- test/Issues/RDBC_233.ts | 12 +- test/Issues/RDBC_236.ts | 242 +++++++++ test/Mapping/ObjectMapperTests.ts | 8 +- test/Ported/BulkInsert/BulkInsertsTest.ts | 2 +- test/Ported/FirstClassPatchTest.ts | 2 +- test/Ported/QueryTest.ts | 8 +- 15 files changed, 592 insertions(+), 285 deletions(-) create mode 100644 test/Issues/RDBC_236.ts diff --git a/package-lock.json b/package-lock.json index c24ffa503..cf6b29fa8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "@sinonjs/formatio": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha1-hNt+nrVTHfGKjF4L+25EnlXmVLI=", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", "dev": true, "requires": { "samsam": "1.3.0" @@ -16,32 +16,32 @@ "@types/bluebird": { "version": "3.5.21", "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.21.tgz", - "integrity": "sha1-VnYVWJzJE+hKKOz57bAxcyvfJjQ=", + "integrity": "sha512-6UNEwyw+6SGMC/WMI0ld0PS4st7Qq51qgguFrFizOSpGvZiqe9iswztFSdZvwJBEhLOy2JaxNE6VC7yMAlbfyQ==", "dev": true }, "@types/caseless": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", - "integrity": "sha1-l5TGnIOF0BkqzEcaVA0fjg0WIYo=" + "integrity": "sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==" }, "@types/events": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha1-gaZzHOTfQ2GeXIyUU4Oz5iqJ6oY=", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", "dev": true }, "@types/form-data": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", - "integrity": "sha1-7is7jqoRwJOCiZU2BrdFtzjFSx4=", + "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", "requires": { - "@types/node": "*" + "@types/node": "10.5.2" } }, "@types/mocha": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha1-ikrM/EA8EkoLr+ip/GGgXsEDIHM=", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", "dev": true }, "@types/node": { @@ -57,56 +57,56 @@ "@types/qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-o49pxiUo1WunvR+RM1qABJiNcvc=" + "integrity": "sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q==" }, "@types/request": { "version": "2.47.1", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.1.tgz", - "integrity": "sha1-JUENOvvawEyRqUrZ78mCQQBzWCQ=", + "integrity": "sha512-TV3XLvDjQbIeVxJ1Z3oCTDk/KuYwwcNKVwz2YaT0F5u86Prgc4syDAp6P96rkTQQ4bIdh+VswQIC9zS6NjY7/g==", "requires": { - "@types/caseless": "*", - "@types/form-data": "*", - "@types/node": "*", - "@types/tough-cookie": "*" + "@types/caseless": "0.12.1", + "@types/form-data": "2.2.1", + "@types/node": "10.5.2", + "@types/tough-cookie": "2.3.3" } }, "@types/semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@types/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha1-ovjbdeZCmuJwO7vn0ojw7cZ4lLI=" + "integrity": "sha512-YD+lyrPhrsJdSOaxmA9K1lzsCoN0J29IsQGMKd67SbkPDXxJPdwdqpok1sytD19NEozUaFpjIsKOWnJDOYO/GA==" }, "@types/sinon": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.7.tgz", - "integrity": "sha1-6Swv7TKX6uB4140doDKyZ4i0r4Y=", + "integrity": "sha512-w+LjztaZbgZWgt/y/VMP5BUAWLtSyoIJhXyW279hehLPyubDoBNwvhcj3WaSptcekuKYeTCVxrq60rdLc6ImJA==", "dev": true }, "@types/tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-fyJtZ9ZU7JBw51X0ba6/AUYo6dk=" + "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==" }, "@types/uuid": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-2.0.30.tgz", - "integrity": "sha1-TcoS2kOuUw+J9G1tIDk10hmWUtU=", + "integrity": "sha512-nmSJ0AL2mZAi68dYb7nKSIJ9YiM68eToP3Ugz66Ou7qkSatIptDM6CvOUmj4epMKWvO9gr9fFBxEEJkromp1Qg==", "requires": { - "@types/node": "*" + "@types/node": "10.5.2" } }, "@types/verror": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.3.tgz", - "integrity": "sha1-i+FrDnUAGP1OLkp2a48jUdi132o=" + "integrity": "sha512-7Jz0MPsW2pWg5dJfEp9nJYI0RDCYfgjg2wIo5HfQ8vOJvUq0/BxT7Mv2wNQvkKBmV9uT++6KF3reMnLmh/0HrA==" }, "@types/ws": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.1.tgz", - "integrity": "sha1-yno/N1aqEvYqCmIUXtFMbbJdWig=", + "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==", "dev": true, "requires": { - "@types/events": "*", - "@types/node": "*" + "@types/events": "1.2.0", + "@types/node": "10.5.2" } }, "ajv": { @@ -114,10 +114,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ansi-regex": { @@ -135,18 +135,18 @@ "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } }, "assert-plus": { @@ -157,7 +157,7 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=" + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", @@ -172,7 +172,7 @@ "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-code-frame": { "version": "6.26.0", @@ -180,9 +180,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": { "chalk": { @@ -191,11 +191,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "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" + "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" } }, "supports-color": { @@ -218,7 +218,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "bluebird": { @@ -229,10 +229,10 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -253,8 +253,8 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "caseless": { @@ -265,21 +265,21 @@ "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "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.4.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.2" } }, "has-flag": { @@ -294,7 +294,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -302,26 +302,26 @@ "change-case": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha1-/Uh0bM4C8D8KZyV30dOo3C7OsDc=", - "requires": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "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" } }, "co": { @@ -347,9 +347,9 @@ "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "concat-map": { @@ -363,8 +363,8 @@ "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.1" + "snake-case": "2.1.0", + "upper-case": "1.1.3" } }, "core-util-is": { @@ -375,7 +375,7 @@ "cross-os": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/cross-os/-/cross-os-1.3.0.tgz", - "integrity": "sha1-KlSIxL3XJ2ihDTzoHf7gP56wX7I=", + "integrity": "sha512-9kViqCcAwlPLTeSDPlyC2FdMQ5UVPtGZUnGV8vYDcBA3olJ/hDR7H6IfrNJft2DlKONleHf8CMhD+7Uv2tBnEw==", "dev": true }, "dashdash": { @@ -383,13 +383,13 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -398,9 +398,9 @@ "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { - "object-keys": "^1.0.12" + "object-keys": "1.0.12" } }, "delayed-stream": { @@ -420,7 +420,7 @@ "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", "dev": true, "requires": { - "esutils": "^1.1.6", + "esutils": "1.1.6", "isarray": "0.0.1" }, "dependencies": { @@ -437,7 +437,7 @@ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, "ecc-jsbn": { @@ -446,20 +446,20 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "es-abstract": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU=", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "is-callable": "1.1.4", + "is-regex": "1.0.4" } }, "es-to-primitive": { @@ -467,9 +467,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-callable": "1.1.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" } }, "escape-string-regexp": { @@ -481,7 +481,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esutils": { @@ -493,7 +493,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extsprintf": { "version": "1.3.0", @@ -520,9 +520,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.20" }, "dependencies": { "combined-stream": { @@ -530,7 +530,7 @@ "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } } } @@ -544,28 +544,28 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "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" } }, "har-schema": { @@ -576,18 +576,18 @@ "har-validator": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha1-RGV/VoiiLP1LckhugbOj+xF0LCk=", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "function-bind": "^1.1.1" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -596,7 +596,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "he": { @@ -610,8 +610,8 @@ "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "http-signature": { @@ -619,9 +619,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "inflight": { @@ -630,8 +630,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -642,7 +642,7 @@ "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=" + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" }, "is-date-object": { "version": "1.0.1", @@ -654,7 +654,7 @@ "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", "requires": { - "lower-case": "^1.1.0" + "lower-case": "1.1.4" } }, "is-regex": { @@ -662,7 +662,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "^1.0.1" + "has": "1.0.3" } }, "is-symbol": { @@ -680,7 +680,7 @@ "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", "requires": { - "upper-case": "^1.1.0" + "upper-case": "1.1.3" } }, "isarray": { @@ -703,11 +703,11 @@ "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "jsbn": { @@ -776,7 +776,7 @@ "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", "requires": { - "lower-case": "^1.1.2" + "lower-case": "1.1.4" } }, "md5-hex": { @@ -784,7 +784,7 @@ "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", "requires": { - "md5-o-matic": "^0.1.1" + "md5-o-matic": "0.1.1" } }, "md5-o-matic": { @@ -795,23 +795,23 @@ "mime-db": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha1-UCBHjbPH/pOq17vMTc+GnEM2M5c=" + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" }, "mime-types": { "version": "2.1.20", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha1-kwy3GdVx6QNzhSD4RwkRVIyizBk=", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", "requires": { - "mime-db": "~1.36.0" + "mime-db": "1.36.0" } }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -832,7 +832,7 @@ "mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { "browser-stdout": "1.3.1", @@ -884,7 +884,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -906,38 +906,38 @@ "integrity": "sha512-BxH/DxoQYYdhKgVAfqVy4pzXRZELHOIewzoesxpjYvpU+7YOalQhGNPf7wAx8pLrTNPrHRDlLOkAl8UI0ZpXjw==", "dev": true, "requires": { - "@sinonjs/formatio": "^2.0.0", - "just-extend": "^1.1.27", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" + "@sinonjs/formatio": "2.0.0", + "just-extend": "1.1.27", + "lolex": "2.7.1", + "path-to-regexp": "1.7.0", + "text-encoding": "0.6.4" } }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=" + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "1.1.3", + "es-abstract": "1.12.0" } }, "once": { @@ -946,7 +946,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "param-case": { @@ -954,7 +954,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, "pascal-case": { @@ -962,8 +962,8 @@ "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.0" + "camel-case": "3.0.0", + "upper-case-first": "1.1.2" } }, "path-case": { @@ -971,7 +971,7 @@ "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, "path-is-absolute": { @@ -1008,7 +1008,7 @@ "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha1-YPWA02AXC7cip5fMcEQR5tqFDGc=" + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" }, "punycode": { "version": "1.4.1", @@ -1018,58 +1018,58 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "readable-stream": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz", "integrity": "sha1-NRMC5MaLWr1qLtVTdqf5olvjBXo=", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "2.0.3", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.7", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.1.0", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.20", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" } }, "resolve": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY=", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.5" } }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-memory-cache": { "version": "1.5.1", @@ -1079,18 +1079,18 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "samsam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha1-jR2TUOJWItow3j5EumkrUiGrfFA=", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", "dev": true }, "semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha1-qq2LhrIP6OmzKxbcLuaCqM0mqKo=" + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" }, "semver": { "version": "5.5.0", @@ -1103,23 +1103,23 @@ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", "requires": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" + "no-case": "2.3.2", + "upper-case-first": "1.1.2" } }, "sinon": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.5.0.tgz", - "integrity": "sha1-QnrjEqM308UWgEzidU6MDVAoywQ=", + "integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==", "dev": true, "requires": { - "@sinonjs/formatio": "^2.0.0", - "diff": "^3.1.0", - "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^5.1.0", - "type-detect": "^4.0.5" + "@sinonjs/formatio": "2.0.0", + "diff": "3.3.1", + "lodash.get": "4.4.2", + "lolex": "2.7.1", + "nise": "1.4.2", + "supports-color": "5.4.0", + "type-detect": "4.0.8" }, "dependencies": { "has-flag": { @@ -1134,7 +1134,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -1144,13 +1144,13 @@ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { @@ -1159,8 +1159,8 @@ "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "buffer-from": "1.1.0", + "source-map": "0.6.1" } }, "sprintf-js": { @@ -1174,41 +1174,41 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "stream-chain": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.0.3.tgz", - "integrity": "sha1-kVUjenGci7LeiDwtGvZtFUb5EMk=" + "integrity": "sha512-uCjJTDTAOgBrM2dLkS3mJGICUV3fL0eiTsGQ0bXiKU6et6/7dkTzZCp0eP1d8ZIwiWjthvQZlSx7NxMt7t1aFQ==" }, "stream-json": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.1.3.tgz", - "integrity": "sha1-Tr73VZDzrypykXJqjiuyzgbSwWY=", + "integrity": "sha512-y+ChhCov2A5nDqC2aZ6HKXs3OvDlvAp0Ps3BF1P/Iv8tUZJQQsMVaSzk0WryVTVoGITKv01UYahCXMpAs7I0lQ==", "requires": { - "stream-chain": "^2.0.3" + "stream-chain": "2.0.3" } }, "string-builder": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/string-builder/-/string-builder-0.1.6.tgz", - "integrity": "sha1-ruKAFjNbjTqWN76a+HQ1HjijLlE=" + "integrity": "sha512-lpfA1Tddd4dwk2Hxf/fhQAG2JK91St/ISqdvBYjOOnW8oNC1172CwW5X2YsU+JqtJBPCBDPZrlrPCK8iQq0QyQ==" }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -1217,7 +1217,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "swap-case": { @@ -1225,8 +1225,8 @@ "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" + "lower-case": "1.1.4", + "upper-case": "1.1.3" } }, "text-encoding": { @@ -1240,23 +1240,23 @@ "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "1.1.29", + "punycode": "1.4.1" } }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, "tslint": { @@ -1265,18 +1265,18 @@ "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", "dev": true, "requires": { - "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.27.2" + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.4.1", + "commander": "2.16.0", + "diff": "3.3.1", + "glob": "7.1.2", + "js-yaml": "3.12.0", + "minimatch": "3.0.4", + "resolve": "1.8.1", + "semver": "5.5.0", + "tslib": "1.9.3", + "tsutils": "2.28.0" }, "dependencies": { "commander": { @@ -1290,27 +1290,27 @@ "tslint-eslint-rules": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha1-5IjMkYG/GT/lzXv8ohOnaV8XN7U=", + "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", "dev": true, "requires": { "doctrine": "0.7.2", "tslib": "1.9.0", - "tsutils": "^3.0.0" + "tsutils": "3.0.0" }, "dependencies": { "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", "dev": true }, "tsutils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.0.0.tgz", - "integrity": "sha1-DFBwoXoFA+BW2gOMSLWhhwpQqa0=", + "integrity": "sha512-LjHBWR0vWAUHWdIAoTjoqi56Kz+FDKBgVEuL+gVPG/Pv7QW5IdaDDeK9Txlr6U0Cmckp5EgCIq1T25qe3J6hyw==", "dev": true, "requires": { - "tslib": "^1.8.1" + "tslib": "1.9.0" } } } @@ -1321,7 +1321,7 @@ "integrity": "sha512-p7xN6cN6y2REFT/11Xl4OAPdhPLHcsZk2IfA8rFS9wi3hhkY6Shz+yoJ61Z+GJ8L4TsRhIbG/09w3e1sdOHs9g==", "dev": true, "requires": { - "tsutils": "^2.12.1" + "tsutils": "2.28.0" } }, "tsutils": { @@ -1330,7 +1330,7 @@ "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", "dev": true, "requires": { - "tslib": "^1.8.1" + "tslib": "1.9.3" } }, "tunnel-agent": { @@ -1338,7 +1338,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -1350,13 +1350,13 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha1-HL9h0F1rliaSROtqO85L2RTg8Aw=", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", "dev": true }, "upper-case": { @@ -1369,7 +1369,7 @@ "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.1" + "upper-case": "1.1.3" } }, "util-deprecate": { @@ -1380,25 +1380,25 @@ "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "1.1.3", + "object.getownpropertydescriptors": "2.0.3" } }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "wrappy": { @@ -1412,7 +1412,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.0.0.tgz", "integrity": "sha512-c2UlYcAZp1VS8AORtpq6y4RJIkJ9dQz18W32SpR/qXGfLDZ2jU4y4wKvvZwqbi7U6gxFQTeE+urMbXU/tsDy4w==", "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "1.0.0" } }, "xregexp": { diff --git a/package.json b/package.json index a4a16e2a6..6dd5246d5 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "bluebird": "^3.4.7", "change-case": "^3.0.2", "md5-hex": "^2.0.0", - "moment": "^2.22.0", + "moment": "^2.22.2", "pluralize": "^4.0.0", "qs": "^6.5.2", "readable-stream": "^3.0.6", diff --git a/src/Documents/Commands/GetRevisionsCommand.ts b/src/Documents/Commands/GetRevisionsCommand.ts index e634a4dee..c27753b4f 100644 --- a/src/Documents/Commands/GetRevisionsCommand.ts +++ b/src/Documents/Commands/GetRevisionsCommand.ts @@ -70,7 +70,7 @@ export class GetRevisionsCommand extends RavenCommand { } if (this._before) { - uri += "&before=" + DateUtil.stringify(this._before); + uri += "&before=" + DateUtil.default.stringify(this._before); } if (!TypeUtil.isNullOrUndefined(this._start)) { diff --git a/src/Documents/Conventions/DocumentConventions.ts b/src/Documents/Conventions/DocumentConventions.ts index d088fbe38..fc324d591 100644 --- a/src/Documents/Conventions/DocumentConventions.ts +++ b/src/Documents/Conventions/DocumentConventions.ts @@ -13,7 +13,7 @@ import { ReadBalanceBehavior } from "../../Http/ReadBalanceBehavior"; import { throwError } from "../../Exceptions"; import { CONSTANTS } from "../../Constants"; import { TypeUtil } from "../../Utility/TypeUtil"; -import { DateUtil } from "../../Utility/DateUtil"; +import { DateUtil, DateUtilOpts } from "../../Utility/DateUtil"; import { CasingConvention, ObjectUtil, ObjectChangeCaseOptions } from "../../Utility/ObjectUtil"; import { JsonSerializer } from "../../Mapping/Json/Serializer"; @@ -71,6 +71,7 @@ export class DocumentConventions { private _remoteEntityFieldNameConvention: CasingConvention; private _objectMapper: TypesAwareObjectMapper; + private _dateUtil: DateUtil; private _useCompression; @@ -116,6 +117,9 @@ export class DocumentConventions { }); this._useCompression = null; + + this._dateUtilOpts = {}; + this._dateUtil = new DateUtil(this._dateUtilOpts); } public get objectMapper(): TypesAwareObjectMapper { @@ -123,9 +127,14 @@ export class DocumentConventions { } public set objectMapper(value: TypesAwareObjectMapper) { + this._assertNotFrozen(); this._objectMapper = value; } + public get dateUtil(): DateUtil { + return this._dateUtil; + } + public get readBalanceBehavior(): ReadBalanceBehavior { return this._readBalanceBehavior; } @@ -196,6 +205,26 @@ export class DocumentConventions { this._useCompression = value; } + private _dateUtilOpts: DateUtilOpts; + + public get storeDatesInUtc() { + return this._dateUtilOpts.useUtcDates; + } + + public set storeDatesInUtc(value) { + this._assertNotFrozen(); + this._dateUtilOpts.useUtcDates = value; + } + + public get storeDatesWithTimezoneInfo() { + return this._dateUtilOpts.withTimezone; + } + + public set storeDatesWithTimezoneInfo(value) { + this._assertNotFrozen(); + this._dateUtilOpts.withTimezone = true; + } + /** * If set to 'true' then it will throw an exception when any query is performed (in session) * without explicit page size set. diff --git a/src/Documents/Identity/Commands/NextHiloCommand.ts b/src/Documents/Identity/Commands/NextHiloCommand.ts index 0c3b47f86..99e27ad6d 100644 --- a/src/Documents/Identity/Commands/NextHiloCommand.ts +++ b/src/Documents/Identity/Commands/NextHiloCommand.ts @@ -52,7 +52,7 @@ export class NextHiloCommand extends RavenCommand { public createRequest(node: ServerNode): HttpRequestParameters { const lastRangeAt: string = this._lastRangeAt - ? DateUtil.stringify(this._lastRangeAt) + ? DateUtil.default.stringify(this._lastRangeAt) : ""; const queryString = qs.stringify({ diff --git a/src/Documents/Session/AbstractDocumentQuery.ts b/src/Documents/Session/AbstractDocumentQuery.ts index 082a40f17..fe2685ff3 100644 --- a/src/Documents/Session/AbstractDocumentQuery.ts +++ b/src/Documents/Session/AbstractDocumentQuery.ts @@ -389,7 +389,7 @@ export abstract class AbstractDocumentQuery { + conventions = DocumentConventions.defaultConventions; mapper = new TypesAwareObjectMapper({ - documentConventions: DocumentConventions.defaultConventions + documentConventions: conventions }); }); @@ -45,8 +47,12 @@ describe("RDBC-233", function () { assert.ok(result); assert.strictEqual(result.date, null); assert.ok(result.anotherOne.start instanceof Date); - assert.strictEqual(result.anotherOne.start.toString(), DateUtil.parse(obj.anotherOne.start).toString()); - assert.strictEqual(result.anotherOne.end.toString(), DateUtil.parse(obj.anotherOne.end).toString()); + assert.strictEqual( + result.anotherOne.start.toString(), + DocumentConventions.defaultConventions.dateUtil.parse(obj.anotherOne.start).toString()); + assert.strictEqual( + result.anotherOne.end.toString(), + DocumentConventions.defaultConventions.dateUtil.parse(obj.anotherOne.end).toString()); }); describe("entire flow - store, patch, load", async () => { diff --git a/test/Issues/RDBC_236.ts b/test/Issues/RDBC_236.ts new file mode 100644 index 000000000..11c40f8a3 --- /dev/null +++ b/test/Issues/RDBC_236.ts @@ -0,0 +1,242 @@ +import * as assert from "assert"; +import * as moment from "moment"; +import { testContext, disposeTestDocumentStore } from "../Utils/TestUtil"; + +import { + RavenErrorType, + GetNextOperationIdCommand, + IDocumentStore, + PutDocumentCommand, +} from "../../src"; +import { DateUtil } from "../../src/Utility/DateUtil"; +import { GetDocumentsCommand } from "../../src/Documents/Commands/GetDocumentsCommand"; + +describe.only("DateUtil", function () { + + describe("without timezones", function () { + + it("should properly parse & format date (without UTC dates)", async function () { + const dateUtil = new DateUtil({ + withTimezone: false + }); + const date = moment("2018-10-15T09:46:28.306").toDate(); + const stringified = dateUtil.stringify(date); + assert.strictEqual(stringified, "2018-10-15T09:46:28.3060000"); + + const parsed = dateUtil.parse(stringified); + assert.strictEqual(parsed.getHours(), date.getHours()); + assert.strictEqual(parsed.toISOString(), date.toISOString()); + }); + + it("should properly format regular date using UTC dates", async function () { + const dateUtil = new DateUtil({ + withTimezone: false, + useUtcDates: true + }); + const date = moment("2018-10-15T09:46:28.306").toDate(); + const stringified = dateUtil.stringify(date); + assert.strictEqual(stringified, "2018-10-15T07:46:28.3060000Z"); + + const parsed = dateUtil.parse(stringified); + assert.strictEqual(parsed.getHours(), date.getHours()); + assert.strictEqual(parsed.toISOString(), date.toISOString()); + }); + + }); + + describe("with timezones", function () { + + it("should properly parse & format date (without UTC dates)", async function () { + const dateUtil = new DateUtil({ + withTimezone: true + }); + const date = moment.parseZone("2018-10-15T09:46:28.3060000+06:00").toDate(); + assert.strictEqual(date.getHours(), 5); + + const stringified = dateUtil.stringify(date); + assert.strictEqual(stringified, "2018-10-15T05:46:28.3060000+02:00"); + + const parsed = dateUtil.parse(stringified); + assert.strictEqual(parsed.getHours(), date.getHours()); + assert.strictEqual(parsed.toISOString(), date.toISOString()); + }); + + it("should properly format regular date using UTC dates", async function () { + const dateUtil = new DateUtil({ + withTimezone: true, + useUtcDates: true + }); + const date = moment.parseZone("2018-10-15T09:46:28.3060000+06:00").toDate(); + assert.strictEqual(date.getHours(), 5); + + const stringified = dateUtil.stringify(date); + assert.strictEqual(stringified, "2018-10-15T03:46:28.3060000+00:00"); + + const parsed = dateUtil.parse(stringified); + assert.strictEqual(parsed.getHours(), date.getHours()); + assert.strictEqual(parsed.toISOString(), date.toISOString()); + }); + + }); + +}); + +describe("[RDBC-236] Dates storage", function () { + + let store: IDocumentStore; + + describe("store timezone info", function () { + + beforeEach(async function () { + testContext.customizeStore = async store => { + store.conventions.storeDatesWithTimezoneInfo = true; + store.conventions.findCollectionNameForObjectLiteral = () => "tests"; + }; + store = await testContext.getDocumentStore(); + }); + + afterEach(function () { + testContext.customizeStore = null; + }); + + afterEach(async () => + await disposeTestDocumentStore(store)); + + it("can store & load date with timezone info", async () => { + const date = new Date(2018, 9, 12, 13, 10, 10, 0); + + { + const session = store.openSession(); + await session.store({ + start: date + }, "date/1"); + await session.saveChanges(); + } + + { + const cmd = new GetDocumentsCommand({ + ids: [ "date/1" ], + start: 0, + pageSize: 1, + conventions: store.conventions + }); + await store.getRequestExecutor().execute(cmd); + assert.strictEqual( + cmd.result.results[0]["start"], "2018-10-12T13:10:10.0000000+02:00"); + } + + { + const session = store.openSession(); + const loaded = await session.load("date/1"); + const { start } = loaded as any; + assert.strictEqual(start.getHours(), date.getHours()); + assert.strictEqual(start.toString(), date.toString()); + } + }); + + }); + + describe("store dates as UTC", function () { + + beforeEach(async function () { + testContext.customizeStore = async store => { + store.conventions.storeDatesInUtc = true; + store.conventions.findCollectionNameForObjectLiteral = () => "tests"; + }; + store = await testContext.getDocumentStore(); + }); + + afterEach(function () { + testContext.customizeStore = null; + }); + + afterEach(async () => + await disposeTestDocumentStore(store)); + + it("can properly store & load date", async () => { + const date = new Date(2018, 9, 12, 13, 10, 10, 0); + + { + const session = store.openSession(); + await session.store({ + start: date + }, "date/1"); + await session.saveChanges(); + } + + { + const cmd = new GetDocumentsCommand({ + ids: [ "date/1" ], + start: 0, + pageSize: 1, + conventions: store.conventions + }); + await store.getRequestExecutor().execute(cmd); + assert.strictEqual( + cmd.result.results[0]["start"], "2018-10-12T11:10:10.0000000Z"); + } + + { + const session = store.openSession(); + const loaded = await session.load("date/1"); + const { start } = loaded as any; + assert.strictEqual(start.getHours(), date.getHours()); + assert.strictEqual(start.toString(), date.toString()); + } + }); + + }); + + describe("store dates as UTC with timezone info", function () { + + beforeEach(async function () { + testContext.customizeStore = async store => { + store.conventions.storeDatesWithTimezoneInfo = true; + store.conventions.storeDatesInUtc = true; + store.conventions.findCollectionNameForObjectLiteral = () => "tests"; + }; + store = await testContext.getDocumentStore(); + }); + + afterEach(function () { + testContext.customizeStore = null; + }); + + afterEach(async () => + await disposeTestDocumentStore(store)); + + it("can store & load date with timezone info", async () => { + const date = new Date(2018, 9, 12, 13, 10, 10, 0); + + { + const session = store.openSession(); + await session.store({ + start: date + }, "date/1"); + await session.saveChanges(); + } + + { + const cmd = new GetDocumentsCommand({ + ids: [ "date/1" ], + start: 0, + pageSize: 1, + conventions: store.conventions + }); + await store.getRequestExecutor().execute(cmd); + assert.strictEqual( + cmd.result.results[0]["start"], "2018-10-12T11:10:10.0000000+00:00"); + } + + { + const session = store.openSession(); + const loaded = await session.load("date/1"); + const { start } = loaded as any; + assert.strictEqual(start.getHours(), date.getHours()); + assert.strictEqual(start.toString(), date.toString()); + } + }); + + }); + +}); diff --git a/test/Mapping/ObjectMapperTests.ts b/test/Mapping/ObjectMapperTests.ts index ff967a449..2537bff62 100644 --- a/test/Mapping/ObjectMapperTests.ts +++ b/test/Mapping/ObjectMapperTests.ts @@ -14,11 +14,13 @@ import { TypeUtil } from "../../src/Utility/TypeUtil"; describe("ObjectMapper", function () { let mapper: TypesAwareObjectMapper; + let conventions; beforeEach(() => { + conventions = DocumentConventions.defaultConventions; mapper = new TypesAwareObjectMapper({ dateFormat: DateUtil.DEFAULT_DATE_FORMAT, - documentConventions: DocumentConventions.defaultConventions + documentConventions: conventions }); }); @@ -333,7 +335,7 @@ describe("ObjectMapper", function () { function assertArrayEntry(actual, expected) { assert.strictEqual(actual["name"], expected["name"]); assert.strictEqual( - actual["lastActedAt"].valueOf(), DateUtil.parse(expected["lastActedAt"]).valueOf()); + actual["lastActedAt"].valueOf(), conventions.dateUtil.parse(expected["lastActedAt"]).valueOf()); } for (let i = 0; i < result.characters[0].length; i++) { @@ -496,7 +498,7 @@ describe("ObjectMapper", function () { assert.deepStrictEqual(typeInfo, expectedTypeInfo); assert.strictEqual(typeof result.lastModified, "string"); - assert.strictEqual(result.lastModified, DateUtil.stringify(testObject.lastModified)); + assert.strictEqual(result.lastModified, conventions.dateUtil.stringify(testObject.lastModified)); }); it("can handle array", () => { diff --git a/test/Ported/BulkInsert/BulkInsertsTest.ts b/test/Ported/BulkInsert/BulkInsertsTest.ts index ade07dfae..b411e147b 100644 --- a/test/Ported/BulkInsert/BulkInsertsTest.ts +++ b/test/Ported/BulkInsert/BulkInsertsTest.ts @@ -89,7 +89,7 @@ describe("bulk insert", function () { it("can modify metadata with bulk insert", async () => { - const date = DateUtil.stringify(new Date()); + const date = DateUtil.default.stringify(new Date()); const fooBar = new FooBar(); fooBar.name = "John Snow"; diff --git a/test/Ported/FirstClassPatchTest.ts b/test/Ported/FirstClassPatchTest.ts index dfd0fe8d6..1f6d9e88e 100644 --- a/test/Ported/FirstClassPatchTest.ts +++ b/test/Ported/FirstClassPatchTest.ts @@ -51,7 +51,7 @@ describe("FirstClassPatchTest", function () { const session = store.openSession(); const loaded = await session.load(_docId, User); assert.strictEqual(loaded.numbers[0], 31); - assert.strictEqual(loaded.lastLogin, DateUtil.stringify(now)); + assert.strictEqual(loaded.lastLogin, store.conventions.dateUtil.stringify(now)); session.advanced.patch(loaded, "stuff[0].phone", "123456"); await session.saveChanges(); diff --git a/test/Ported/QueryTest.ts b/test/Ported/QueryTest.ts index 19e2dea3e..b6d1ab4ac 100644 --- a/test/Ported/QueryTest.ts +++ b/test/Ported/QueryTest.ts @@ -691,8 +691,12 @@ describe("QueryTest", function () { const indexQuery = q.getIndexQuery(); assert.strictEqual(indexQuery.query, "from events where date between $p0 and $p1"); - assert.strictEqual(indexQuery.queryParameters["p0"], DateUtil.stringify(cocartFestival.date)); - assert.strictEqual(indexQuery.queryParameters["p1"], DateUtil.stringify(offFestival.date)); + assert.strictEqual( + indexQuery.queryParameters["p0"], + DateUtil.default.stringify(cocartFestival.date)); + assert.strictEqual( + indexQuery.queryParameters["p1"], + DateUtil.default.stringify(offFestival.date)); assert.strictEqual(indexQuery.query, "from events where date between $p0 and $p1"); const festivalsHappeningBetweenCocartAndOffInclusive: any[] = await q.all(); From f588ee66c83fc36012ab55bee468eaaaff227264 Mon Sep 17 00:00:00 2001 From: Grzegorz Lachowski Date: Tue, 16 Oct 2018 11:17:21 +0200 Subject: [PATCH 2/2] make date storage tests tz-agnostic --- test/Issues/RDBC_236.ts | 73 +++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/test/Issues/RDBC_236.ts b/test/Issues/RDBC_236.ts index 11c40f8a3..1da2f5840 100644 --- a/test/Issues/RDBC_236.ts +++ b/test/Issues/RDBC_236.ts @@ -10,8 +10,15 @@ import { } from "../../src"; import { DateUtil } from "../../src/Utility/DateUtil"; import { GetDocumentsCommand } from "../../src/Documents/Commands/GetDocumentsCommand"; +import { StringUtil } from "../../src/Utility/StringUtil"; -describe.only("DateUtil", function () { +const LOCAL_TIMEZONE_OFFSET = -(new Date().getTimezoneOffset()); // getTimezoneOffset() returns reversed offset +const LOCAL_TIMEZONE_OFFSET_HOURS = LOCAL_TIMEZONE_OFFSET / 60; +const LOCAL_TIMEZONE_STRING = + // tslint:disable-next-line:max-line-length + `${LOCAL_TIMEZONE_OFFSET >= 0 ? "+" : "-"}${StringUtil.leftPad(LOCAL_TIMEZONE_OFFSET_HOURS.toString(), 2, "0")}:00`; + +describe("DateUtil", function () { describe("without timezones", function () { @@ -33,9 +40,12 @@ describe.only("DateUtil", function () { withTimezone: false, useUtcDates: true }); - const date = moment("2018-10-15T09:46:28.306").toDate(); + const date = moment("2018-10-15T12:00:00.000").toDate(); const stringified = dateUtil.stringify(date); - assert.strictEqual(stringified, "2018-10-15T07:46:28.3060000Z"); + + const expected = new Date(2018, 9, 15, date.getHours() - LOCAL_TIMEZONE_OFFSET_HOURS, 0, 0, 0); + const expectedStringified = moment(expected).format(DateUtil.DEFAULT_DATE_FORMAT) + "Z"; + assert.strictEqual(stringified, expectedStringified); const parsed = dateUtil.parse(stringified); assert.strictEqual(parsed.getHours(), date.getHours()); @@ -50,11 +60,20 @@ describe.only("DateUtil", function () { const dateUtil = new DateUtil({ withTimezone: true }); - const date = moment.parseZone("2018-10-15T09:46:28.3060000+06:00").toDate(); - assert.strictEqual(date.getHours(), 5); + const hour6 = 12; + const timezoneOffsetHours = 6; + const date = moment.parseZone(`2018-10-15T${hour6}:00:00.0000000+06:00`).toDate(); + // preconditions check + assert.strictEqual( + date.getHours(), hour6 - timezoneOffsetHours + LOCAL_TIMEZONE_OFFSET_HOURS); + + const expectedHours = date.getHours(); + const expected = new Date(2018, 9, 15, expectedHours, 0, 0, 0); + const expectedStringified = + moment(expected).format(DateUtil.DEFAULT_DATE_FORMAT) + LOCAL_TIMEZONE_STRING; const stringified = dateUtil.stringify(date); - assert.strictEqual(stringified, "2018-10-15T05:46:28.3060000+02:00"); + assert.strictEqual(stringified, expectedStringified); const parsed = dateUtil.parse(stringified); assert.strictEqual(parsed.getHours(), date.getHours()); @@ -66,11 +85,21 @@ describe.only("DateUtil", function () { withTimezone: true, useUtcDates: true }); - const date = moment.parseZone("2018-10-15T09:46:28.3060000+06:00").toDate(); - assert.strictEqual(date.getHours(), 5); + const hour6 = 12; + const timezoneOffsetHours = 6; + const date = moment.parseZone(`2018-10-15T${hour6}:00:00.0000000+06:00`).toDate(); + // preconditions check + assert.strictEqual( + date.getHours(), hour6 - timezoneOffsetHours + LOCAL_TIMEZONE_OFFSET_HOURS); + + const expectedHours = date.getHours() - LOCAL_TIMEZONE_OFFSET_HOURS; + const utcTimezoneString = "+00:00"; + const expected = new Date(2018, 9, 15, expectedHours, 0, 0, 0); + const expectedStringified = + moment(expected).format(DateUtil.DEFAULT_DATE_FORMAT) + utcTimezoneString; const stringified = dateUtil.stringify(date); - assert.strictEqual(stringified, "2018-10-15T03:46:28.3060000+00:00"); + assert.strictEqual(stringified, expectedStringified); const parsed = dateUtil.parse(stringified); assert.strictEqual(parsed.getHours(), date.getHours()); @@ -85,7 +114,7 @@ describe("[RDBC-236] Dates storage", function () { let store: IDocumentStore; - describe("store timezone info", function () { + describe("storing timezone info", function () { beforeEach(async function () { testContext.customizeStore = async store => { @@ -102,8 +131,9 @@ describe("[RDBC-236] Dates storage", function () { afterEach(async () => await disposeTestDocumentStore(store)); - it("can store & load date with timezone info", async () => { - const date = new Date(2018, 9, 12, 13, 10, 10, 0); + it("can store & load date", async () => { + const hoursLocal = 13; + const date = new Date(2018, 9, 12, hoursLocal, 10, 10, 0); { const session = store.openSession(); @@ -122,7 +152,7 @@ describe("[RDBC-236] Dates storage", function () { }); await store.getRequestExecutor().execute(cmd); assert.strictEqual( - cmd.result.results[0]["start"], "2018-10-12T13:10:10.0000000+02:00"); + cmd.result.results[0]["start"], "2018-10-12T13:10:10.0000000" + LOCAL_TIMEZONE_STRING); } { @@ -154,7 +184,8 @@ describe("[RDBC-236] Dates storage", function () { await disposeTestDocumentStore(store)); it("can properly store & load date", async () => { - const date = new Date(2018, 9, 12, 13, 10, 10, 0); + const hoursLocal = 13; + const date = new Date(2018, 9, 12, hoursLocal, 10, 10, 0); { const session = store.openSession(); @@ -172,8 +203,10 @@ describe("[RDBC-236] Dates storage", function () { conventions: store.conventions }); await store.getRequestExecutor().execute(cmd); + const hoursUtcString = StringUtil.leftPad( + (hoursLocal - LOCAL_TIMEZONE_OFFSET_HOURS).toString(), 2, "0"); assert.strictEqual( - cmd.result.results[0]["start"], "2018-10-12T11:10:10.0000000Z"); + cmd.result.results[0]["start"], `2018-10-12T${hoursUtcString}:10:10.0000000Z`); } { @@ -205,8 +238,9 @@ describe("[RDBC-236] Dates storage", function () { afterEach(async () => await disposeTestDocumentStore(store)); - it("can store & load date with timezone info", async () => { - const date = new Date(2018, 9, 12, 13, 10, 10, 0); + it("can store & load date", async () => { + const hoursLocal = 13; + const date = new Date(2018, 9, 12, hoursLocal, 10, 10, 0); { const session = store.openSession(); @@ -224,8 +258,11 @@ describe("[RDBC-236] Dates storage", function () { conventions: store.conventions }); await store.getRequestExecutor().execute(cmd); + const hoursUtcString = StringUtil.leftPad( + (hoursLocal - LOCAL_TIMEZONE_OFFSET_HOURS).toString(), 2, "0"); assert.strictEqual( - cmd.result.results[0]["start"], "2018-10-12T11:10:10.0000000+00:00"); + cmd.result.results[0]["start"], + `2018-10-12T${hoursUtcString}:10:10.0000000+00:00`); } {