From 8cc0433e6025dca31a7702ac27da210130c2fc4c Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 7 Jan 2019 07:36:51 +0100 Subject: [PATCH 01/37] Update to Babel 7 This is a pre-requisite to using @babel/preset-typescript later. This change required upgrading rollup-plugin-babel, which in turn required upgrading Rollup.js itself. Fortunately, the upgraded rollup-plugin-babel automatically takes care of Babel helpers deduplication and turning off module transpilation in Babel's env preset, so the Babel configuration could be drastically simplified. For the same reason, we don't need rollup-plugin-replace anymore. --- .babelrc | 17 +- package-lock.json | 2103 +++++++++++++++++++++++++++------------------ package.json | 18 +- rollup.config.js | 4 - 4 files changed, 1279 insertions(+), 863 deletions(-) diff --git a/.babelrc b/.babelrc index 728ab2d248..1320b9a327 100644 --- a/.babelrc +++ b/.babelrc @@ -1,18 +1,3 @@ { - "presets": [ - [ - "env", - { - "modules": false - } - ] - ], - "env": { - "development": { - "plugins": ["external-helpers"] - }, - "test": { - "plugins": ["transform-es2015-modules-commonjs"] - } - } + "presets": ["@babel/preset-env"] } diff --git a/package-lock.json b/package-lock.json index ca866ad3a3..3eea88d4c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,261 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", + "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.2", + "@babel/template": "^7.2.2", + "@babel/traverse": "^7.2.2", + "@babel/types": "^7.2.2", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz", + "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", + "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-define-map": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", + "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", + "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz", + "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.2.2", + "@babel/types": "^7.2.2", + "lodash": "^4.17.10" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", + "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz", + "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.2.3", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==", + "dev": true, + "requires": { + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.2.0" + } + }, "@babel/highlight": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", @@ -34,9 +289,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -55,6 +310,636 @@ } } }, + "@babel/parser": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", + "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", + "dev": true + }, + "@babel/plugin-external-helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz", + "integrity": "sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", + "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", + "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", + "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", + "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", + "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", + "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", + "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", + "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", + "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", + "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", + "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", + "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", + "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.3.tgz", + "integrity": "sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.2.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.2.0", + "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.7.tgz", + "integrity": "sha512-pWQv51Ynb0MNk9JGMCZ8VkM785/4MQNXiFYtPqI7EEP0TJO+/d/NqRVn1uiAN0DNbnlUSpL2sh16Kspasv3pUQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000925", + "electron-to-chromium": "^1.3.96", + "node-releases": "^1.1.3" + } + }, + "caniuse-lite": { + "version": "1.0.30000927", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000927.tgz", + "integrity": "sha512-ogq4NbUWf1uG/j66k0AmiO3GjqJAlQyF8n4w8a954cbCyFKmYGvRtgz6qkq2fWuduTXHibX7GyYL5Pg58Aks2g==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" + } + }, + "@babel/traverse": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", + "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.2.3", + "@babel/types": "^7.2.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", + "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "dev": true + }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -78,9 +963,9 @@ }, "dependencies": { "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", "dev": true } } @@ -567,226 +1452,100 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "axobject-query": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", - "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "babel-eslint": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "babel-traverse": "^6.23.1", - "babel-types": "^6.23.0", - "babylon": "^6.17.0" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "axobject-query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "ast-types-flow": "0.0.7" } }, - "babel-helper-regex": { + "babel-code-frame": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } } }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "dev": true + }, + "babel-eslint": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", + "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } } }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } } }, "babel-helpers": { @@ -818,24 +1577,6 @@ "babel-runtime": "^6.22.0" } }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-external-helpers": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz", - "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, "babel-plugin-istanbul": { "version": "4.1.6", "resolved": "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", @@ -856,351 +1597,20 @@ "requires": { "locate-path": "^2.0.0" } - } - } - }, - "babel-plugin-jest-hoist": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", - "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", - "dev": true - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" + } } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true }, "babel-preset-jest": { "version": "22.4.4", @@ -1225,6 +1635,50 @@ "lodash": "^4.17.4", "mkdirp": "^0.5.1", "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } } }, "babel-runtime": { @@ -1265,6 +1719,14 @@ "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" + }, + "dependencies": { + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + } } }, "babel-types": { @@ -1277,6 +1739,14 @@ "esutils": "^2.0.2", "lodash": "^4.17.4", "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } } }, "babylon": { @@ -1411,16 +1881,6 @@ } } }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, "bser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", @@ -1488,12 +1948,6 @@ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, - "caniuse-lite": { - "version": "1.0.30000923", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000923.tgz", - "integrity": "sha512-j5ur7eeluOFjjPUkydtXP4KFAsmH3XaQNch5tvWSO+dLHYt5PE+VgJZLWtbVOodfWij6m6zas28T4gB/cLYq1w==", - "dev": true - }, "capture-exit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", @@ -2308,9 +2762,9 @@ "dev": true }, "estree-walker": { - "version": "0.2.1", - "resolved": "http://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", - "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", "dev": true }, "esutils": { @@ -2369,7 +2823,7 @@ }, "expect": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", "dev": true, "requires": { @@ -2635,14 +3089,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2657,20 +3109,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2787,8 +3236,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2800,7 +3248,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2815,7 +3262,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2823,14 +3269,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2849,7 +3293,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2930,8 +3373,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2943,7 +3385,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -3065,7 +3506,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3210,9 +3650,9 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", "dev": true }, "graceful-fs": { @@ -3981,9 +4421,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4055,7 +4495,7 @@ }, "jest-changed-files": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", "dev": true, "requires": { @@ -4091,9 +4531,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4114,7 +4554,7 @@ }, "jest-diff": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", "dev": true, "requires": { @@ -4134,9 +4574,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4157,7 +4597,7 @@ }, "jest-docblock": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", "dev": true, "requires": { @@ -4166,7 +4606,7 @@ }, "jest-environment-jsdom": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", "dev": true, "requires": { @@ -4177,7 +4617,7 @@ }, "jest-environment-node": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", "dev": true, "requires": { @@ -4193,7 +4633,7 @@ }, "jest-haste-map": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", "dev": true, "requires": { @@ -4235,9 +4675,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4245,22 +4685,6 @@ "supports-color": "^5.3.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4274,7 +4698,7 @@ }, "jest-leak-detector": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", "dev": true, "requires": { @@ -4283,7 +4707,7 @@ }, "jest-matcher-utils": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", "dev": true, "requires": { @@ -4302,9 +4726,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4325,7 +4749,7 @@ }, "jest-message-util": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", "dev": true, "requires": { @@ -4346,9 +4770,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4369,19 +4793,19 @@ }, "jest-mock": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", "dev": true }, "jest-regex-util": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", "dev": true }, "jest-resolve": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", "dev": true, "requires": { @@ -4399,9 +4823,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4422,7 +4846,7 @@ }, "jest-resolve-dependencies": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", "dev": true, "requires": { @@ -4485,10 +4909,37 @@ "color-convert": "^1.9.0" } }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4496,6 +4947,12 @@ "supports-color": "^5.3.0" } }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4509,13 +4966,13 @@ }, "jest-serializer": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", "dev": true }, "jest-snapshot": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", "dev": true, "requires": { @@ -4537,9 +4994,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4560,7 +5017,7 @@ }, "jest-util": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", "dev": true, "requires": { @@ -4589,9 +5046,9 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4639,9 +5096,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4662,13 +5119,19 @@ }, "jest-worker": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", "dev": true, "requires": { "merge-stream": "^1.0.1" } }, + "js-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", + "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4725,9 +5188,9 @@ } }, "jsesc": { - "version": "1.3.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-schema": { @@ -4763,10 +5226,21 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } }, "jsonify": { "version": "0.0.0", @@ -4893,12 +5367,12 @@ } }, "magic-string": { - "version": "0.22.5", - "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", "dev": true, "requires": { - "vlq": "^0.2.2" + "sourcemap-codec": "^1.4.1" } }, "makeerror": { @@ -5124,6 +5598,15 @@ "which": "^1.3.0" } }, + "node-releases": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz", + "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -5517,7 +6000,7 @@ }, "pretty-format": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", "dev": true, "requires": { @@ -5709,23 +6192,21 @@ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", @@ -5751,40 +6232,6 @@ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", "dev": true }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -5969,116 +6416,73 @@ } }, "rollup": { - "version": "0.56.5", - "resolved": "http://registry.npmjs.org/rollup/-/rollup-0.56.5.tgz", - "integrity": "sha512-IGPk5vdWrsc4vkiW9XMeXr5QMtxmvATTttTi59w2jBQWe9G/MMQtn8teIBAj+DdK51TrpVT6P0aQUaQUlUYCJA==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.0.2.tgz", + "integrity": "sha512-FkkSrWUVo1WliS+/GIgEmKQPILubgVdBRTWampfdhkasxx7sM2nfwSfKiX3paIBVnN0HG3DvkTy13RfjkyBX9w==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "*", + "acorn": "^6.0.4" + }, + "dependencies": { + "acorn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "dev": true + } + } }, "rollup-plugin-babel": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz", - "integrity": "sha512-bVe2y0z/V5Ax1qU8NX/0idmzIwJPdUGu8Xx3vXH73h0yGjxfv2gkFI82MBVg49SlsFlLTBadBHb67zy4TWM3hA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.2.0.tgz", + "integrity": "sha512-DBZbItGcru3iZM8aqVOS6+9GgIE+u0eX1HHN2iUIOjeXKMN8MK9/DaCOmQEt/le0sxqQOLIG+rPIhhm8uhJA7Q==", "dev": true, "requires": { - "rollup-pluginutils": "^1.5.0" + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.3.0" } }, "rollup-plugin-commonjs": { - "version": "8.4.1", - "resolved": "http://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz", - "integrity": "sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.2.0.tgz", + "integrity": "sha512-0RM5U4Vd6iHjL6rLvr3lKBwnPsaVml+qxOGaaNUWN1lSq6S33KhITOfHmvxV3z2vy9Mk4t0g4rNlVaJJsNQPWA==", "dev": true, "requires": { - "acorn": "^5.2.1", - "estree-walker": "^0.5.0", - "magic-string": "^0.22.4", - "resolve": "^1.4.0", - "rollup-pluginutils": "^2.0.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", - "dev": true - }, - "rollup-pluginutils": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", - "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", - "dev": true, - "requires": { - "estree-walker": "^0.5.2", - "micromatch": "^2.3.11" - } - } + "estree-walker": "^0.5.2", + "magic-string": "^0.25.1", + "resolve": "^1.8.1", + "rollup-pluginutils": "^2.3.3" } }, "rollup-plugin-node-resolve": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", - "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.0.0.tgz", + "integrity": "sha512-7Ni+/M5RPSUBfUaP9alwYQiIKnKeXCOHiqBpKUl9kwp3jX5ZJtgXAait1cne6pGEVUUztPD6skIKH9Kq9sNtfw==", "dev": true, "requires": { - "builtin-modules": "^2.0.0", + "builtin-modules": "^3.0.0", "is-module": "^1.0.0", - "resolve": "^1.1.6" + "resolve": "^1.8.1" }, "dependencies": { "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", - "dev": true - } - } - }, - "rollup-plugin-replace": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.1.0.tgz", - "integrity": "sha512-SxrAIgpH/B5/W4SeULgreOemxcpEgKs2gcD42zXw50bhqGWmcnlXneVInQpAqzA/cIly4bJrOpeelmB9p4YXSQ==", - "dev": true, - "requires": { - "magic-string": "^0.25.1", - "minimatch": "^3.0.2", - "rollup-pluginutils": "^2.0.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", + "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", "dev": true - }, - "magic-string": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", - "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.1" - } - }, - "rollup-pluginutils": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", - "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", - "dev": true, - "requires": { - "estree-walker": "^0.5.2", - "micromatch": "^2.3.11" - } } } }, "rollup-pluginutils": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", - "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", + "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", "dev": true, "requires": { - "estree-walker": "^0.2.1", - "minimatch": "^3.0.2" + "estree-walker": "^0.5.2", + "micromatch": "^2.3.11" } }, "rsvp": { @@ -6653,12 +7057,21 @@ } }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "source-map-url": { @@ -7025,9 +7438,9 @@ "dev": true }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "to-object-path": { @@ -7163,6 +7576,34 @@ "pathington": "^1.1.5" } }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "dev": true + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -7308,12 +7749,6 @@ "extsprintf": "^1.2.0" } }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, "w3c-hr-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", diff --git a/package.json b/package.json index cdbc671e72..ab3c7ebc9b 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,11 @@ "author": "Mark Erikson ", "license": "MIT", "devDependencies": { - "babel-core": "^6.26.0", - "babel-eslint": "^7.2.3", - "babel-plugin-external-helpers": "^6.22.0", - "babel-preset-env": "^1.6.1", + "@babel/core": "^7.0.0", + "@babel/plugin-external-helpers": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.0.1", "eslint": "^4.17.0", "eslint-config-react-app": "^2.1.0", "eslint-plugin-flowtype": "^2.44.0", @@ -21,11 +22,10 @@ "eslint-plugin-react": "^7.6.1", "jest": "^22.4.2", "prettier": "^1.10.2", - "rollup": "^0.56.3", - "rollup-plugin-babel": "^3.0.3", - "rollup-plugin-commonjs": "^8.3.0", - "rollup-plugin-node-resolve": "^3.0.3", - "rollup-plugin-replace": "^2.1.0" + "rollup": "^1.0.2", + "rollup-plugin-babel": "^4.2.0", + "rollup-plugin-commonjs": "^9.2.0", + "rollup-plugin-node-resolve": "^4.0.0" }, "scripts": { "build": "rollup -c", diff --git a/rollup.config.js b/rollup.config.js index fd2c6c9d33..bc24f163a2 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,7 +1,6 @@ import resolve from 'rollup-plugin-node-resolve' import babel from 'rollup-plugin-babel' import commonjs from 'rollup-plugin-commonjs' -import replace from 'rollup-plugin-replace' import pkg from './package.json' const input = 'src/index' @@ -21,9 +20,6 @@ export default [ exclude: 'node_modules/**' }), resolve(), - replace({ - 'process.env.NODE_ENV': JSON.stringify('development') - }), commonjs({ namedExports: { 'node_modules/curriable/dist/curriable.js': ['curry', '__'] From 9432c6b03d3ceb1426054e574b079b323557505c Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 19:54:12 +0100 Subject: [PATCH 02/37] Remove unused @babel/plugin-external-helpers --- package-lock.json | 9 --------- package.json | 1 - 2 files changed, 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3eea88d4c4..6a4d85e046 100644 --- a/package-lock.json +++ b/package-lock.json @@ -316,15 +316,6 @@ "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", "dev": true }, - "@babel/plugin-external-helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz", - "integrity": "sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", diff --git a/package.json b/package.json index ab3c7ebc9b..ce6b2e880b 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "license": "MIT", "devDependencies": { "@babel/core": "^7.0.0", - "@babel/plugin-external-helpers": "^7.0.0", "@babel/preset-env": "^7.0.0", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^10.0.1", From 1c0c74e0a573ecac637b50ba4ca9e13b32a43e31 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 7 Jan 2019 08:03:05 +0100 Subject: [PATCH 03/37] Add Babel Typescript preset and port isPlainObject --- .babelrc | 2 +- package-lock.json | 41 +++++++++++++++++++ package.json | 20 +++++++-- ...inObject.test.js => isPlainObject.test.ts} | 9 ++-- src/{isPlainObject.js => isPlainObject.ts} | 2 +- tsconfig.json | 9 ++++ 6 files changed, 75 insertions(+), 8 deletions(-) rename src/{isPlainObject.test.js => isPlainObject.test.ts} (80%) rename src/{isPlainObject.js => isPlainObject.ts} (84%) create mode 100644 tsconfig.json diff --git a/.babelrc b/.babelrc index 1320b9a327..3313ff9ef0 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["@babel/preset-env"] + "presets": ["@babel/preset-env", "@babel/preset-typescript"] } diff --git a/package-lock.json b/package-lock.json index 6a4d85e046..e68e4235c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -441,6 +441,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-typescript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz", + "integrity": "sha512-WhKr6yu6yGpGcNMVgIBuI9MkredpVc7Y3YR4UzEZmDztHoL6wV56YBHLhWnjO1EvId1B32HrD3DRFc+zSoKI1g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-arrow-functions": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", @@ -747,6 +756,16 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-typescript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.2.0.tgz", + "integrity": "sha512-EnI7i2/gJ7ZNr2MuyvN2Hu+BHJENlxWte5XygPvfj/MbvtOkWor9zcnHpMMQL2YYaaCcqtIvJUyJ7QVfoGs7ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.2.0" + } + }, "@babel/plugin-transform-unicode-regex": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", @@ -863,6 +882,16 @@ } } }, + "@babel/preset-typescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz", + "integrity": "sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.1.0" + } + }, "@babel/template": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", @@ -925,6 +954,12 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/jest": { + "version": "23.3.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.12.tgz", + "integrity": "sha512-/kQvbVzdEpOq4tEWT79yAHSM4nH4xMlhJv2GrLVQt4Qmo8yYsPdioBM1QpN/2GX1wkfMnyXvdoftvLUr0LBj7Q==", + "dev": true + }, "@types/node": { "version": "10.12.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", @@ -7531,6 +7566,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "dev": true + }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", diff --git a/package.json b/package.json index ce6b2e880b..4f00acad4e 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,9 @@ "devDependencies": { "@babel/core": "^7.0.0", "@babel/preset-env": "^7.0.0", + "@babel/preset-typescript": "^7.1.0", + "@types/jest": "^23.3.12", + "@types/node": "^10.12.18", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^10.0.1", "eslint": "^4.17.0", @@ -24,7 +27,8 @@ "rollup": "^1.0.2", "rollup-plugin-babel": "^4.2.0", "rollup-plugin-commonjs": "^9.2.0", - "rollup-plugin-node-resolve": "^4.0.0" + "rollup-plugin-node-resolve": "^4.0.0", + "typescript": "^3.2.2" }, "scripts": { "build": "rollup -c", @@ -33,7 +37,8 @@ "format:check": "prettier --list-different \"**/*.{js,md}\"", "lint": "eslint src", "prepare": "npm run lint && npm test && npm run build", - "test": "jest" + "test": "jest", + "tsc": "tsc" }, "files": [ "dist" @@ -47,7 +52,16 @@ "selectorator": "^4.0.1" }, "jest": { - "testEnvironment": "node" + "testEnvironment": "node", + "moduleFileExtensions": [ + "ts", + "js", + "json" + ], + "testRegex": "^.+\\.test\\.(ts|js)$", + "transform": { + "^.+\\.(ts|js)$": "babel-jest" + } }, "sideEffects": false } diff --git a/src/isPlainObject.test.js b/src/isPlainObject.test.ts similarity index 80% rename from src/isPlainObject.test.js rename to src/isPlainObject.test.ts index 8c4d86fdc0..6fb99021da 100644 --- a/src/isPlainObject.test.js +++ b/src/isPlainObject.test.ts @@ -3,8 +3,11 @@ import vm from 'vm' describe('isPlainObject', () => { it('returns true only if plain object', () => { - function Test() { - this.prop = 1 + class Test { + prop: number + constructor() { + this.prop = 1 + } } const sandbox = { fromAnotherRealm: false } @@ -15,7 +18,7 @@ describe('isPlainObject', () => { expect(isPlainObject(new Date())).toBe(false) expect(isPlainObject([1, 2, 3])).toBe(false) expect(isPlainObject(null)).toBe(false) - expect(isPlainObject()).toBe(false) + expect(isPlainObject(undefined)).toBe(false) expect(isPlainObject({ x: 1, y: 2 })).toBe(true) }) }) diff --git a/src/isPlainObject.js b/src/isPlainObject.ts similarity index 84% rename from src/isPlainObject.js rename to src/isPlainObject.ts index 15ce724283..6da3e23e1f 100644 --- a/src/isPlainObject.js +++ b/src/isPlainObject.ts @@ -2,7 +2,7 @@ * @param {any} obj The object to inspect. * @returns {boolean} True if the argument appears to be a plain object. */ -export default function isPlainObject(obj) { +export default function isPlainObject(obj: any): obj is object { if (typeof obj !== 'object' || obj === null) return false let proto = obj diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..56536b98f3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "lib": ["es2015"], + "noEmit": true, + "strict": true + }, + "include": ["src"] +} From 027b870b5ac78b92d7f2ae9d9778e82b9cd1adf5 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 7 Jan 2019 08:32:24 +0100 Subject: [PATCH 04/37] Port createAction() to TypeScript --- src/createAction.js | 10 ---- ...ateAction.test.js => createAction.test.ts} | 12 ++-- src/createAction.ts | 57 +++++++++++++++++++ 3 files changed, 63 insertions(+), 16 deletions(-) delete mode 100644 src/createAction.js rename src/{createAction.test.js => createAction.test.ts} (55%) create mode 100644 src/createAction.ts diff --git a/src/createAction.js b/src/createAction.js deleted file mode 100644 index 82d69c8a79..0000000000 --- a/src/createAction.js +++ /dev/null @@ -1,10 +0,0 @@ -export function createAction(type) { - const action = payload => ({ - type, - payload - }) - action.toString = () => `${type}` - return action -} - -export const getType = action => `${action}` diff --git a/src/createAction.test.js b/src/createAction.test.ts similarity index 55% rename from src/createAction.test.js rename to src/createAction.test.ts index e25a077838..51cf28d936 100644 --- a/src/createAction.test.js +++ b/src/createAction.test.ts @@ -2,8 +2,8 @@ import { createAction, getType } from './createAction' describe('createAction', () => { it('should create an action', () => { - const action = createAction('A_TYPE') - expect(action('something')).toEqual({ + const actionCreator = createAction('A_TYPE') + expect(actionCreator('something')).toEqual({ type: 'A_TYPE', payload: 'something' }) @@ -11,15 +11,15 @@ describe('createAction', () => { describe('when stringifying action', () => { it('should return the action type', () => { - const action = createAction('A_TYPE') - expect(`${action}`).toEqual('A_TYPE') + const actionCreator = createAction('A_TYPE') + expect(`${actionCreator}`).toEqual('A_TYPE') }) }) }) describe('getType', () => { it('should return the action type', () => { - const action = createAction('A_TYPE') - expect(getType(action)).toEqual('A_TYPE') + const actionCreator = createAction('A_TYPE') + expect(getType(actionCreator)).toEqual('A_TYPE') }) }) diff --git a/src/createAction.ts b/src/createAction.ts new file mode 100644 index 0000000000..56ca585bb9 --- /dev/null +++ b/src/createAction.ts @@ -0,0 +1,57 @@ +import { Action } from 'redux' + +/** + * An action with an associated payload. The type of action returned by + * action creators that are generated using `createAction()`. + * + * @template P The type of the action's payload. + * @template T the type of the action's `type` tag. + */ +export interface PayloadAction

extends Action { + payload: P +} + +/** + * An action creator that produces actions with a `payload` attribute. + */ +export interface PayloadActionCreator

{ + (): Action + (payload: P): PayloadAction +} + +/** + * A utility function to create an action creator for the given action type + * string. The action creator accepts a single argument, which will be included + * in the action object as a field called payload. The action creator function + * will also have its toString() overriden so that it returns the action type, + * allowing it to be used in reducer logic that is looking for that action type. + * + * @param type The action type to use for created actions. + */ +export function createAction

( + type: string +): PayloadActionCreator { + function actionCreator(): Action + function actionCreator(payload: P): PayloadAction + function actionCreator(payload?: P) { + return { type, payload } + } + + actionCreator.toString = () => `${type}` + + return actionCreator +} + +/** + * Returns the action type of the actions created by the passed + * `createAction()`-generated action creator (arbitrary action creators + * are not supported). + * + * @param action The action creator whose action type to get. + * @returns The action type used by the action creator. + */ +export function getType

( + actionCreator: PayloadActionCreator +): string { + return `${actionCreator}` +} From 86fd7b0db3703f9da04f7bb56b7f2615d89485b9 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 8 Jan 2019 08:43:50 +0100 Subject: [PATCH 05/37] Port configureStore() to TypeScript --- package-lock.json | 9 ++ package.json | 1 + src/configureStore.js | 64 -------- ...reStore.test.js => configureStore.test.ts} | 9 +- src/configureStore.ts | 140 ++++++++++++++++++ ...ializableStateInvariantMiddleware.test.ts} | 0 ...> serializableStateInvariantMiddleware.ts} | 43 +++++- 7 files changed, 190 insertions(+), 76 deletions(-) delete mode 100644 src/configureStore.js rename src/{configureStore.test.js => configureStore.test.ts} (94%) create mode 100644 src/configureStore.ts rename src/{serializableStateInvariantMiddleware.test.js => serializableStateInvariantMiddleware.test.ts} (100%) rename src/{serializableStateInvariantMiddleware.js => serializableStateInvariantMiddleware.ts} (70%) diff --git a/package-lock.json b/package-lock.json index e68e4235c9..51fcd8b12e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -966,6 +966,15 @@ "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", "dev": true }, + "@types/redux-immutable-state-invariant": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/redux-immutable-state-invariant/-/redux-immutable-state-invariant-2.1.0.tgz", + "integrity": "sha512-QmzPRr4YVC4S7XRORufWopi6B+8c0v/xevSK58iEpwUNIiTKG6RUyZPHtTlUdNQ6S/wHoeNHYRGPh8ryv3b/1Q==", + "dev": true, + "requires": { + "redux": "^3.6.0 || ^4.0.0" + } + }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", diff --git a/package.json b/package.json index 4f00acad4e..b61193476d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@babel/preset-typescript": "^7.1.0", "@types/jest": "^23.3.12", "@types/node": "^10.12.18", + "@types/redux-immutable-state-invariant": "^2.1.0", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^10.0.1", "eslint": "^4.17.0", diff --git a/src/configureStore.js b/src/configureStore.js deleted file mode 100644 index 82c2bc666a..0000000000 --- a/src/configureStore.js +++ /dev/null @@ -1,64 +0,0 @@ -import { createStore, compose, applyMiddleware, combineReducers } from 'redux' -import { composeWithDevTools } from 'redux-devtools-extension' -import thunk from 'redux-thunk' -import createImmutableStateInvariantMiddleware from 'redux-immutable-state-invariant' -import createSerializableStateInvariantMiddleware from './serializableStateInvariantMiddleware' - -import isPlainObject from './isPlainObject' - -const IS_PRODUCTION = process.env.NODE_ENV === 'production' - -export function getDefaultMiddleware(isProduction = IS_PRODUCTION) { - let middlewareArray = [thunk] - - if (!isProduction) { - middlewareArray = [ - createImmutableStateInvariantMiddleware(), - thunk, - createSerializableStateInvariantMiddleware() - ] - } - - return middlewareArray -} - -export function configureStore(options = {}) { - const { - reducer, - middleware = getDefaultMiddleware(), - devTools = true, - preloadedState, - enhancers = [] - } = options - - let rootReducer - - if (typeof reducer === 'function') { - rootReducer = reducer - } else if (isPlainObject(reducer)) { - rootReducer = combineReducers(reducer) - } else { - throw new Error( - 'Reducer argument must be a function or an object of functions that can be passed to combineReducers' - ) - } - - const middlewareEnhancer = applyMiddleware(...middleware) - - let finalCompose = compose - - if (devTools) { - finalCompose = composeWithDevTools({ - // Enable capture of stack traces for dispatched Redux actions - trace: !IS_PRODUCTION - }) - } - - const storeEnhancers = [middlewareEnhancer, ...enhancers] - - const composedEnhancer = finalCompose(...storeEnhancers) - - const store = createStore(rootReducer, preloadedState, composedEnhancer) - - return store -} diff --git a/src/configureStore.test.js b/src/configureStore.test.ts similarity index 94% rename from src/configureStore.test.js rename to src/configureStore.test.ts index bda98f3208..962d9eef85 100644 --- a/src/configureStore.test.js +++ b/src/configureStore.test.ts @@ -3,7 +3,6 @@ import * as redux from 'redux' import * as devtools from 'redux-devtools-extension' import thunk from 'redux-thunk' -import immutableStateInvariant from 'redux-immutable-state-invariant' describe('getDefaultMiddleware', () => { it('returns an array with only redux-thunk in production', () => { @@ -24,12 +23,14 @@ describe('configureStore', () => { jest.spyOn(redux, 'createStore') jest.spyOn(devtools, 'composeWithDevTools') - function reducer() {} + const reducer: redux.Reducer<{}, redux.AnyAction> = (state = {}, action) => + state beforeEach(() => jest.clearAllMocks()) describe('given a function reducer', () => { it('calls createStore with the reducer', () => { + configureStore({ reducer }) expect(configureStore({ reducer })).toBeInstanceOf(Object) expect(redux.applyMiddleware).toHaveBeenCalled() expect(devtools.composeWithDevTools).toHaveBeenCalled() @@ -83,7 +84,7 @@ describe('configureStore', () => { describe('given custom middleware', () => { it('calls createStore with custom middleware and without default middleware', () => { - const thank = store => next => action => next(action) + const thank: redux.Middleware = store => next => action => next(action) expect(configureStore({ middleware: [thank], reducer })).toBeInstanceOf( Object ) @@ -127,7 +128,7 @@ describe('configureStore', () => { describe('given enhancers', () => { it('calls createStore with enhancers', () => { - const enhancer = next => next + const enhancer: redux.StoreEnhancer = next => next expect(configureStore({ enhancers: [enhancer], reducer })).toBeInstanceOf( Object ) diff --git a/src/configureStore.ts b/src/configureStore.ts new file mode 100644 index 0000000000..eac36896bc --- /dev/null +++ b/src/configureStore.ts @@ -0,0 +1,140 @@ +import { + createStore, + compose, + applyMiddleware, + combineReducers, + Reducer, + ReducersMapObject, + Middleware, + Action, + AnyAction, + StoreEnhancer, + Store, + DeepPartial +} from 'redux' +import { composeWithDevTools } from 'redux-devtools-extension' +import thunk from 'redux-thunk' +import createImmutableStateInvariantMiddleware from 'redux-immutable-state-invariant' +import createSerializableStateInvariantMiddleware from './serializableStateInvariantMiddleware' + +import isPlainObject from './isPlainObject' + +const IS_PRODUCTION = process.env.NODE_ENV === 'production' + +/** + * Returns any array containing the default middleware installed by + * `configureStore()`. Useful if you want to configure your store with a custom + * `middleware` array but still keep the default set. + * + * @return The default middleware used by `configureStore()`. + */ +export function getDefaultMiddleware( + isProduction = IS_PRODUCTION +): Middleware[] { + let middlewareArray: Middleware[] = [thunk] + + if (!isProduction) { + middlewareArray = [ + createImmutableStateInvariantMiddleware(), + thunk, + createSerializableStateInvariantMiddleware() + ] + } + + return middlewareArray +} + +/** + * Options for `configureStore()`. + */ +export interface ConfigureStoreOptions { + /** + * A single reducer function that will be used as the root reducer, or an + * object of slice reducers that will be passed to `combineReducers()`. + */ + reducer: Reducer | ReducersMapObject + + /** + * An array of Redux middleware to install. If not supplied, defaults to + * the set of middleware returned by `getDefaultMiddleware()`. + */ + middleware?: Middleware[] + + /** + * Whether to enable Redux DevTools integration. Defaults to `true`. + */ + devTools?: boolean + + /** + * The initial state. You may optionally specify it to hydrate the state + * from the server in universal apps, or to restore a previously serialized + * user session. If you use `combineReducers()` to produce the root reducer + * function (either directly or indirectly by passing an object as `reducer`), + * this must be an object with the same shape as the reducer map keys. + */ + preloadedState?: DeepPartial + + /** + * The store enhancers to apply. See Redux's `createStore()`. If you only + * need to add middleware, you can use the `middleware` parameter instaead. + */ + enhancers?: StoreEnhancer[] +} + +/** + * A friendly abstraction over the standard Redux `createStore()` function. + * + * @param config The store configuration. + * @returns A configured Redux store. + */ +export function configureStore( + options: ConfigureStoreOptions +): Store { + const { + reducer = undefined, + middleware = getDefaultMiddleware(), + devTools = true, + preloadedState = undefined, + enhancers = [] + } = options || {} + + let rootReducer: Reducer + + if (typeof reducer === 'function') { + rootReducer = reducer + } else if (isPlainObject(reducer)) { + rootReducer = combineReducers(reducer) + } else { + throw new Error( + 'Reducer argument must be a function or an object of functions that can be passed to combineReducers' + ) + } + + const middlewareEnhancer = applyMiddleware(...middleware) + + let finalCompose = compose + + if (devTools) { + finalCompose = composeWithDevTools({ + // Enable capture of stack traces for dispatched Redux actions + + // @ts-ignore redux-devtools-extension doesn't have `trace` defined in + // its type definition file yet: + // + // https://github.com/zalmoxisus/redux-devtools-extension/pull/624 + trace: !IS_PRODUCTION + }) + } + + const storeEnhancers = [middlewareEnhancer, ...enhancers] + + const composedEnhancer = finalCompose(...storeEnhancers) as StoreEnhancer + + const store: Store = createStore( + rootReducer, + preloadedState, + composedEnhancer + ) + + return store +} diff --git a/src/serializableStateInvariantMiddleware.test.js b/src/serializableStateInvariantMiddleware.test.ts similarity index 100% rename from src/serializableStateInvariantMiddleware.test.js rename to src/serializableStateInvariantMiddleware.test.ts diff --git a/src/serializableStateInvariantMiddleware.js b/src/serializableStateInvariantMiddleware.ts similarity index 70% rename from src/serializableStateInvariantMiddleware.js rename to src/serializableStateInvariantMiddleware.ts index f0a74b158f..ffc1ba30f3 100644 --- a/src/serializableStateInvariantMiddleware.js +++ b/src/serializableStateInvariantMiddleware.ts @@ -1,6 +1,14 @@ import isPlainObject from './isPlainObject' - -export function isPlain(val) { +import { Middleware } from 'redux' + +/** + * Returns true if the passed value is "plain", i.e. a value that is either + * directly JSON-serializable (boolean, number, string, array, plain object) + * or `undefined`. + * + * @param val The value to check. + */ +export function isPlain(val: any) { return ( typeof val === 'undefined' || val === null || @@ -25,10 +33,10 @@ const NON_SERIALIZABLE_ACTION_MESSAGE = [ ].join('\n') export function findNonSerializableValue( - obj, - path = [], - isSerializable = isPlain -) { + obj: any, + path: string[] = [], + isSerializable: (value: any) => boolean = isPlain +): any { let foundNestedSerializable if (!isSerializable(obj)) { @@ -61,9 +69,28 @@ export function findNonSerializableValue( return false } +/** + * Options for `createSerializableStateInvariantMiddleware()`. + */ +export interface SerializableStateInvariantMiddlewareOptions { + /** + * The function to check if a value is considered serializable. This + * function is applied recursively to every value contained in the + * state. Defaults to `isPlain()`. + */ + isSerializable?: (value: any) => boolean +} + +/** + * Creates a middleware that, after every state change, checks if the new + * state is serializable. If a non-serializable value is found within the + * state, an error is printed to the console. + * + * @param options Middleware options. + */ export default function createSerializableStateInvariantMiddleware( - options = {} -) { + options: SerializableStateInvariantMiddlewareOptions = {} +): Middleware { const { isSerializable = isPlain } = options return storeAPI => next => action => { From 0b22aaadb91f49e3467510216556da74c1d6e3e0 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 8 Jan 2019 08:52:23 +0100 Subject: [PATCH 06/37] Fix Rollup configuration --- rollup.config.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/rollup.config.js b/rollup.config.js index bc24f163a2..b40aa36e8c 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,6 +6,8 @@ import pkg from './package.json' const input = 'src/index' const exclude = 'node_modules/**' +const extensions = ['.ts', '.js'] + export default [ // browser-friendly UMD build { @@ -17,10 +19,14 @@ export default [ }, plugins: [ babel({ + extensions, exclude: 'node_modules/**' }), - resolve(), + resolve({ + extensions + }), commonjs({ + extensions, namedExports: { 'node_modules/curriable/dist/curriable.js': ['curry', '__'] } @@ -40,6 +46,14 @@ export default [ { file: pkg.module, format: 'es' } ], external: Object.keys(pkg.dependencies), - plugins: babel({ exclude }) + plugins: [ + babel({ + extensions, + exclude + }), + resolve({ + extensions + }) + ] } ] From dfc2b6858e58846a85e56057c45936b827e4498c Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 8 Jan 2019 19:23:12 +0100 Subject: [PATCH 07/37] Fix type errors in serializableStateInvariantMiddleware.test.ts --- ...rializableStateInvariantMiddleware.test.ts | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/serializableStateInvariantMiddleware.test.ts b/src/serializableStateInvariantMiddleware.test.ts index 247be618dd..4f016b7432 100644 --- a/src/serializableStateInvariantMiddleware.test.ts +++ b/src/serializableStateInvariantMiddleware.test.ts @@ -1,3 +1,4 @@ +import { Reducer } from 'redux' import { configureStore } from './configureStore' import createSerializableStateInvariantMiddleware, { @@ -87,7 +88,7 @@ describe('serializableStateInvariantMiddleware', () => { }) it('Should log an error when a non-serializable action is dispatched', () => { - const reducer = (state = 0, action) => state + 1 + const reducer: Reducer = (state = 0, action) => state + 1 const serializableStateInvariantMiddleware = createSerializableStateInvariantMiddleware() @@ -103,7 +104,13 @@ describe('serializableStateInvariantMiddleware', () => { expect(console.error).toHaveBeenCalled() - const [message, keyPath, value, action] = console.error.mock.calls[0] + const [ + message, + keyPath, + value, + action + ] = (console.error as jest.Mock).mock.calls[0] + expect(message).toContain('detected in an action, in the path: `%s`') expect(keyPath).toBe('type') expect(value).toBe(type) @@ -119,7 +126,7 @@ describe('serializableStateInvariantMiddleware', () => { const badValue = new Map() - const reducer = (state = initialState, action) => { + const reducer: Reducer = (state = initialState, action) => { switch (action.type) { case ACTION_TYPE: { return { @@ -144,7 +151,13 @@ describe('serializableStateInvariantMiddleware', () => { expect(console.error).toHaveBeenCalled() - const [message, keyPath, value, actionType] = console.error.mock.calls[0] + const [ + message, + keyPath, + value, + actionType + ] = (console.error as jest.Mock).mock.calls[0] + expect(message).toContain('detected in the state, in the path: `%s`') expect(keyPath).toBe('testSlice.a') expect(value).toBe(badValue) From 4caa7a30e1e9ac273aba71ce5cf29de7784eada1 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 8 Jan 2019 21:04:32 +0100 Subject: [PATCH 08/37] Port createReducer() to TypeScript --- src/createReducer.js | 15 ----- ...eReducer.test.js => createReducer.test.ts} | 30 +++++++--- src/createReducer.ts | 56 +++++++++++++++++++ 3 files changed, 77 insertions(+), 24 deletions(-) delete mode 100644 src/createReducer.js rename src/{createReducer.test.js => createReducer.test.ts} (76%) create mode 100644 src/createReducer.ts diff --git a/src/createReducer.js b/src/createReducer.js deleted file mode 100644 index 5f2f71474b..0000000000 --- a/src/createReducer.js +++ /dev/null @@ -1,15 +0,0 @@ -import createNextState from 'immer' - -export function createReducer(initialState, actionsMap) { - return function(state = initialState, action) { - return createNextState(state, draft => { - const caseReducer = actionsMap[action.type] - - if (caseReducer) { - return caseReducer(draft, action) - } - - return draft - }) - } -} diff --git a/src/createReducer.test.js b/src/createReducer.test.ts similarity index 76% rename from src/createReducer.test.js rename to src/createReducer.test.ts index b3dadf1805..9279f58593 100644 --- a/src/createReducer.test.js +++ b/src/createReducer.test.ts @@ -1,15 +1,26 @@ -import { createReducer } from './createReducer' +import { createReducer, CaseReducer } from './createReducer' +import { PayloadAction } from './createAction' +import { Reducer, Action } from 'redux' + +interface Todo { + text: string + completed: boolean +} + +type TodoState = Todo[] +type TodosReducer = Reducer +type TodosCaseReducer = CaseReducer describe('createReducer', () => { describe('given impure reducers with immer', () => { - function addTodo(state, action) { + const addTodo: TodosCaseReducer = (state, action) => { const { newTodo } = action.payload // Can safely call state.push() here state.push({ ...newTodo, completed: false }) } - function toggleTodo(state, action) { + const toggleTodo: TodosCaseReducer = (state, action) => { const { index } = action.payload const todo = state[index] @@ -17,7 +28,7 @@ describe('createReducer', () => { todo.completed = !todo.completed } - const todosReducer = createReducer([], { + const todosReducer = createReducer([] as TodoState, { ADD_TODO: addTodo, TOGGLE_TODO: toggleTodo }) @@ -26,14 +37,14 @@ describe('createReducer', () => { }) describe('given pure reducers with immutable updates', () => { - function addTodo(state, action) { + const addTodo: TodosCaseReducer = (state, action) => { const { newTodo } = action.payload // Updates the state immutably without relying on immer return [...state, { ...newTodo, completed: false }] } - function toggleTodo(state, action) { + const toggleTodo: TodosCaseReducer = (state, action) => { const { index } = action.payload // Updates the todo object immutably withot relying on immer @@ -43,7 +54,7 @@ describe('createReducer', () => { }) } - const todosReducer = createReducer([], { + const todosReducer = createReducer([] as TodoState, { ADD_TODO: addTodo, TOGGLE_TODO: toggleTodo }) @@ -52,9 +63,10 @@ describe('createReducer', () => { }) }) -function behavesLikeReducer(todosReducer) { +function behavesLikeReducer(todosReducer: TodosReducer) { it('should handle initial state', () => { - expect(todosReducer(undefined, {})).toEqual([]) + const initialAction = { type: '', payload: undefined } + expect(todosReducer(undefined, initialAction)).toEqual([]) }) it('should handle ADD_TODO', () => { diff --git a/src/createReducer.ts b/src/createReducer.ts new file mode 100644 index 0000000000..80be541fda --- /dev/null +++ b/src/createReducer.ts @@ -0,0 +1,56 @@ +import createNextState from 'immer' +import { AnyAction, Action, Reducer } from 'redux' + +/** + * An *case reducer* is a reducer function for a speficic action type. Case + * reducers can be composed to full reducers using `createReducer()`. + * + * Unlike a normal Redux reducer, a case reducer is never called with an + * `undefined` state to determine the initial state. Instead, the initial + * state is explicitly specified as an argument to `createReducer()`. + * + * In addition, a case reducer can choose to mutate the passed-in `state` + * value directly instead of returning a new state. This does not actually + * cause the store state to be mutated directly; instead, thanks to + * [immer](https://github.com/mweststrate/immer), the mutations are + * translated to copy operations that result in a new state. + */ +export type CaseReducer = ( + state: S, + action: A +) => S | void + +/** + * A mapping from action types to case reducers for `createReducer()`. + */ +export interface CaseReducersMapObject { + [actionType: string]: CaseReducer +} + +/** + * A utility function that allows defining a reducer as a mapping from action + * type to *case reducer* functions that handle these action types. The + * reducer's initial state is passed as the first argument. + * + * The body of every case reducer is implicitly wrapped with a call to + * `produce()` from the [immer](https://github.com/mweststrate/immer) library. + * This means that rather than returning a new state object, you can also + * mutate the passed-in state object directly; these mutations will then be + * automatically and efficiently translated into copies, giving you both + * convenience and immutability. + * + * @param initialState The initial state to be returned by the reducer. + * @param actionsMap A mapping from action types to action-type-specific + * case redeucers. + */ +export function createReducer( + initialState: S, + actionsMap: CaseReducersMapObject +): Reducer { + return function(state = initialState, action): S { + return createNextState(state, draft => { + const caseReducer = actionsMap[action.type] + return caseReducer ? caseReducer(draft as S, action) : draft + }) as S + } +} From 898a586913f0032fe220afed818a1c91520b3d70 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 8 Jan 2019 23:29:11 +0100 Subject: [PATCH 09/37] Port createSlice() to TypeScript --- src/createAction.ts | 23 ++-- src/createSlice.js | 33 ----- ...reateSlice.test.js => createSlice.test.ts} | 6 +- src/createSlice.ts | 115 ++++++++++++++++++ src/sliceSelector.js | 22 ---- ...Selector.test.js => sliceSelector.test.ts} | 0 src/sliceSelector.ts | 30 +++++ 7 files changed, 158 insertions(+), 71 deletions(-) delete mode 100644 src/createSlice.js rename src/{createSlice.test.js => createSlice.test.ts} (95%) create mode 100644 src/createSlice.ts delete mode 100644 src/sliceSelector.js rename src/{sliceSelector.test.js => sliceSelector.test.ts} (100%) create mode 100644 src/sliceSelector.ts diff --git a/src/createAction.ts b/src/createAction.ts index 56ca585bb9..0d9560135e 100644 --- a/src/createAction.ts +++ b/src/createAction.ts @@ -1,22 +1,21 @@ import { Action } from 'redux' /** - * An action with an associated payload. The type of action returned by - * action creators that are generated using `createAction()`. + * An action with a string type and an associated payload. This is the + * type of action returned by `createAction()` action creators. * * @template P The type of the action's payload. - * @template T the type of the action's `type` tag. */ -export interface PayloadAction

extends Action { +export interface PayloadAction

extends Action { payload: P } /** * An action creator that produces actions with a `payload` attribute. */ -export interface PayloadActionCreator

{ - (): Action - (payload: P): PayloadAction +export interface PayloadActionCreator

{ + (): Action + (payload: P): PayloadAction

} /** @@ -28,11 +27,9 @@ export interface PayloadActionCreator

{ * * @param type The action type to use for created actions. */ -export function createAction

( - type: string -): PayloadActionCreator { +export function createAction

(type: string): PayloadActionCreator

{ function actionCreator(): Action - function actionCreator(payload: P): PayloadAction + function actionCreator(payload: P): PayloadAction

function actionCreator(payload?: P) { return { type, payload } } @@ -50,8 +47,6 @@ export function createAction

( * @param action The action creator whose action type to get. * @returns The action type used by the action creator. */ -export function getType

( - actionCreator: PayloadActionCreator -): string { +export function getType

(actionCreator: PayloadActionCreator

): string { return `${actionCreator}` } diff --git a/src/createSlice.js b/src/createSlice.js deleted file mode 100644 index a492191fd7..0000000000 --- a/src/createSlice.js +++ /dev/null @@ -1,33 +0,0 @@ -import { createAction } from './createAction' -import { createReducer } from './createReducer' -import { createSliceSelector, createSelectorName } from './sliceSelector' - -const getType = (slice, action) => (slice ? `${slice}/${action}` : action) - -export function createSlice({ slice = '', reducers = {}, initialState }) { - const actionKeys = Object.keys(reducers) - - const reducerMap = actionKeys.reduce((map, action) => { - map[getType(slice, action)] = reducers[action] - return map - }, {}) - - const reducer = createReducer(initialState, reducerMap) - - const actionMap = actionKeys.reduce((map, action) => { - const type = getType(slice, action) - map[action] = createAction(type) - return map - }, {}) - - const selectors = { - [createSelectorName(slice)]: createSliceSelector(slice) - } - - return { - actions: actionMap, - reducer, - slice, - selectors - } -} diff --git a/src/createSlice.test.js b/src/createSlice.test.ts similarity index 95% rename from src/createSlice.test.js rename to src/createSlice.test.ts index 2bd1a140ee..c5d7ae3e9b 100644 --- a/src/createSlice.test.js +++ b/src/createSlice.test.ts @@ -87,18 +87,20 @@ describe('createSlice', () => { }) describe('when mutating state object', () => { + const initialState = { user: '' } + const { actions, reducer } = createSlice({ reducers: { setUserName: (state, action) => { state.user = action.payload } }, - initialState: { user: '' }, + initialState, slice: 'user' }) it('should set the username', () => { - expect(reducer({}, actions.setUserName('eric'))).toEqual({ + expect(reducer(initialState, actions.setUserName('eric'))).toEqual({ user: 'eric' }) }) diff --git a/src/createSlice.ts b/src/createSlice.ts new file mode 100644 index 0000000000..cce1658fba --- /dev/null +++ b/src/createSlice.ts @@ -0,0 +1,115 @@ +import { Action, AnyAction, ActionCreator, Reducer } from 'redux' +import { createAction, PayloadAction } from './createAction' +import { createReducer, CaseReducersMapObject } from './createReducer' +import { createSliceSelector, createSelectorName } from './sliceSelector' + +export interface Slice< + S = any, + A extends Action = AnyAction, + AT extends string = string +> { + /** + * The slice name. + */ + slice: string + + /** + * The slice's reducer. + */ + reducer: Reducer + + /** + * Action creators for the types of actions that are handled by the slice + * reducer. + */ + actions: { [type in AT]: ActionCreator } + + /** + * Selectors for the slice reducer state. `createSlice()` inserts a single + * selector that returns the entire slice state and whose name is + * automatically derived from the slice name (e.g., `getCounter` for a slice + * named `counter`). + */ + selectors: { [key: string]: (state: any) => S } +} + +/** + * Options for `createSlice()`. + */ +export interface CreateSliceOptions< + S = any, + A extends Action = AnyAction, + CR extends CaseReducersMapObject = CaseReducersMapObject +> { + /** + * The slice's name. Used to namespace the generated action types and to + * name the selector for retrieving the reducer's state. + */ + slice?: string + + /** + * The initial state to be returned by the slice reducer. + */ + initialState: S + + /** + * A mapping from action types to action-type-specific *case reducer* + * functions. For every action type, a matching action creator will be + * generated using `createAction()`. + */ + reducers: CR +} + +function getType(slice: string, actionKey: string): string { + return slice ? `${slice}/${actionKey}` : actionKey +} + +/** + * A function that accepts an initial state, an object full of reducer + * functions, and optionally a "slice name", and automatically generates + * action creators, action types, and selectors that correspond to the + * reducers and state. + * + * The `reducer` argument is passed to `createReducer()`. + */ +export function createSlice< + S = any, + A extends PayloadAction = PayloadAction, + CR extends CaseReducersMapObject = CaseReducersMapObject +>( + options: CreateSliceOptions +): Slice> { + const { slice = '', initialState } = options + const reducers = options.reducers || {} + const actionKeys = Object.keys(reducers) + + const reducerMap = actionKeys.reduce( + (map, actionKey) => { + map[getType(slice, actionKey)] = reducers[actionKey] + return map + }, + {} as CR + ) + + const reducer = createReducer(initialState, reducerMap) + + const actionMap = actionKeys.reduce( + (map, action) => { + const type = getType(slice, action) + map[action] = createAction(type) + return map + }, + {} as any + ) + + const selectors = { + [createSelectorName(slice)]: createSliceSelector(slice) + } + + return { + slice, + reducer, + actions: actionMap, + selectors + } +} diff --git a/src/sliceSelector.js b/src/sliceSelector.js deleted file mode 100644 index 704156f6bc..0000000000 --- a/src/sliceSelector.js +++ /dev/null @@ -1,22 +0,0 @@ -export function createSliceSelector(slice) { - if (!slice) { - return state => state - } - return state => state[slice] -} - -export function createSelectorName(slice) { - if (!slice) { - return 'getState' - } - return camelize(`get ${slice}`) -} - -function camelize(str) { - return str - .replace(/(?:^\w|[A-Z]|\b\w)/g, (letter, index) => { - return index === 0 ? letter.toLowerCase() : letter.toUpperCase() - }) - .replace(/\s+/g, '') - .replace(/[-_]/g, '') -} diff --git a/src/sliceSelector.test.js b/src/sliceSelector.test.ts similarity index 100% rename from src/sliceSelector.test.js rename to src/sliceSelector.test.ts diff --git a/src/sliceSelector.ts b/src/sliceSelector.ts new file mode 100644 index 0000000000..79813ef6ce --- /dev/null +++ b/src/sliceSelector.ts @@ -0,0 +1,30 @@ +export type Selector = (state: S) => R + +export function createSliceSelector(): Selector +export function createSliceSelector< + S extends { [key: string]: any } = any, + R = any +>(slice: string): Selector + +export function createSliceSelector(slice?: string) { + if (!slice) { + return (state: S): S => state + } + return (state: { [key: string]: any }): R => state[slice] +} + +export function createSelectorName(slice: string): string { + if (!slice) { + return 'getState' + } + return camelize(`get ${slice}`) +} + +function camelize(str: string): string { + return str + .replace(/(?:^\w|[A-Z]|\b\w)/g, (letter, index) => { + return index === 0 ? letter.toLowerCase() : letter.toUpperCase() + }) + .replace(/\s+/g, '') + .replace(/[-_]/g, '') +} From 59a4d446c8bd5f76946d7152f72d8a145ebe2491 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 8 Jan 2019 23:31:26 +0100 Subject: [PATCH 10/37] Port index.js to TS and add index.d.ts --- index.d.ts | 28 ++++++++++++++++++++++++++++ package.json | 3 ++- rollup.config.js | 2 +- src/index.js | 12 ------------ src/index.ts | 23 +++++++++++++++++++++++ 5 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 index.d.ts delete mode 100644 src/index.js create mode 100644 src/index.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000000..6dc56023f6 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,28 @@ +export { default as createNextState } from 'immer' +export { + Action, + ActionCreator, + AnyAction, + Middleware, + Reducer, + StoreEnhancer +} from 'redux' +export { default as createSelector } from 'selectorator' + +export { + configureStore, + ConfigureStoreOptions, + getDefaultMiddleware +} from './src/configureStore' +export { + createAction, + getType, + PayloadAction, + PayloadActionCreator +} from './src/createAction' +export { createReducer } from './src/createReducer' +export { createSlice, CreateSliceOptions, Slice } from './src/createSlice' +export { + default as createSerializableStateInvariantMiddleware, + isPlain +} from './src/serializableStateInvariantMiddleware' diff --git a/package.json b/package.json index b61193476d..b54177b3ac 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "tsc": "tsc" }, "files": [ - "dist" + "dist", + "index.d.ts" ], "dependencies": { "immer": "^1.9.3", diff --git a/rollup.config.js b/rollup.config.js index b40aa36e8c..c12e4d94c2 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -3,7 +3,7 @@ import babel from 'rollup-plugin-babel' import commonjs from 'rollup-plugin-commonjs' import pkg from './package.json' -const input = 'src/index' +const input = './src/index.ts' const exclude = 'node_modules/**' const extensions = ['.ts', '.js'] diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 1964062748..0000000000 --- a/src/index.js +++ /dev/null @@ -1,12 +0,0 @@ -export { configureStore, getDefaultMiddleware } from './configureStore' -export { createReducer } from './createReducer' -export { createAction, getType } from './createAction' -export { createSlice } from './createSlice' -export { - default as createSerializableStateInvariantMiddleware, - isPlain -} from './serializableStateInvariantMiddleware' - -export { default as createNextState } from 'immer' -export { combineReducers, compose } from 'redux' -export { default as createSelector } from 'selectorator' diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000000..f1918f7583 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,23 @@ +export { default as createNextState } from 'immer' +export { default as createSelector } from 'selectorator' + +export { configureStore, getDefaultMiddleware } from './configureStore' +export { createAction, getType } from './createAction' +export { createReducer } from './createReducer' +export { createSlice } from './createSlice' +export { + default as createSerializableStateInvariantMiddleware, + isPlain +} from './serializableStateInvariantMiddleware' + +// Unfortunately, Babel's TypeScript plugin doesn't let us re-export +// types using the `export { ... } from` syntax. Because it compiles +// modules, independently, it has no way of knowing whether an identifier +// refers to a type or value, and thus cannot strip the type re-exports +// out of the generated JS. +// +// https://github.com/babel/babel/issues/8361 +// +// As a workaround, the root of this repository contains an `index.d.ts` +// that contains all type re-exports. Whenever adding a new public function +// or type, remember to export it in `index.d.ts` as well. From 81ceb20950e270c012852dbbc187e5fefdb74b7c Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 8 Jan 2019 23:41:04 +0100 Subject: [PATCH 11/37] Add some typings-tester tests --- index.d.ts | 1 + package-lock.json | 9 ++ package.json | 3 +- type-tests/files/configureStore.typetest.ts | 124 ++++++++++++++++++++ type-tests/files/createAction.typetest.ts | 114 ++++++++++++++++++ type-tests/files/createReducer.typetest.ts | 58 +++++++++ type-tests/files/createSlice.typetest.ts | 44 +++++++ type-tests/files/tsconfig.json | 11 ++ type-tests/types.test.ts | 5 + 9 files changed, 368 insertions(+), 1 deletion(-) create mode 100644 type-tests/files/configureStore.typetest.ts create mode 100644 type-tests/files/createAction.typetest.ts create mode 100644 type-tests/files/createReducer.typetest.ts create mode 100644 type-tests/files/createSlice.typetest.ts create mode 100644 type-tests/files/tsconfig.json create mode 100644 type-tests/types.test.ts diff --git a/index.d.ts b/index.d.ts index 6dc56023f6..d63b4d7b30 100644 --- a/index.d.ts +++ b/index.d.ts @@ -5,6 +5,7 @@ export { AnyAction, Middleware, Reducer, + Store, StoreEnhancer } from 'redux' export { default as createSelector } from 'selectorator' diff --git a/package-lock.json b/package-lock.json index 51fcd8b12e..5bbe0335d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7581,6 +7581,15 @@ "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", "dev": true }, + "typings-tester": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/typings-tester/-/typings-tester-0.3.2.tgz", + "integrity": "sha512-HjGoAM2UoGhmSKKy23TYEKkxlphdJFdix5VvqWFLzH1BJVnnwG38tpC6SXPgqhfFGfHY77RlN1K8ts0dbWBQ7A==", + "dev": true, + "requires": { + "commander": "^2.12.2" + } + }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", diff --git a/package.json b/package.json index b54177b3ac..7de0cac8ef 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "rollup-plugin-babel": "^4.2.0", "rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-node-resolve": "^4.0.0", - "typescript": "^3.2.2" + "typescript": "^3.2.2", + "typings-tester": "^0.3.2" }, "scripts": { "build": "rollup -c", diff --git a/type-tests/files/configureStore.typetest.ts b/type-tests/files/configureStore.typetest.ts new file mode 100644 index 0000000000..4e543766bc --- /dev/null +++ b/type-tests/files/configureStore.typetest.ts @@ -0,0 +1,124 @@ +import { applyMiddleware } from 'redux' +import { + AnyAction, + configureStore, + Middleware, + PayloadAction, + Reducer, + Store +} from 'redux-starter-kit' + +/* + * Test: configureStore() requires a valid reducer or reducer map. + */ +{ + configureStore({ + reducer: (state, action) => 0 + }) + + configureStore({ + reducer: { + counter1: () => 0, + counter2: () => 1 + } + }) + + // typings:expect-error + configureStore({ reducer: 'not a reducer' }) + + // typings:expect-error + configureStore({ reducer: { a: 'not a reducer' } }) + + // typings:expect-error + configureStore({}) +} + +/* + * Test: configureStore() infers the store state type. + */ +{ + const reducer: Reducer = () => 0 + const store = configureStore({ reducer }) + const numberStore: Store = store + + // typings:expect-error + const stringStore: Store = store +} + +/* + * Test: configureStore() infers the store action type. + */ +{ + const reducer: Reducer> = () => 0 + const store = configureStore({ reducer }) + const numberStore: Store> = store + + // typings:expect-error + const stringStore: Store> = store +} + +/* + * Test: configureStore() accepts middleware array. + */ +{ + const middleware: Middleware = store => next => next + + configureStore({ + reducer: () => 0, + middleware: [middleware] + }) + + // typings:expect-error + configureStore({ + reducer: () => 0, + middleware: ['not middleware'] + }) +} + +/* + * Test: configureStore() accepts devTools flag. + */ +{ + configureStore({ + reducer: () => 0, + devTools: true + }) + + // typings:expect-error + configureStore({ + reducer: () => 0, + devTools: 'true' + }) +} + +/* + * Test: configureStore() accepts preloadedState. + */ +{ + configureStore({ + reducer: () => 0, + preloadedState: 0 + }) + + // typings:expect-error + configureStore({ + reducer: () => 0, + preloadedState: 'non-matching state type' + }) +} + +/* + * Test: configureStore() accepts store enhancer. + */ +{ + configureStore({ + reducer: () => 0, + enhancers: [applyMiddleware(store => next => next)] + }) + + // typings:expect-error + configureStore({ + reducer: () => 0, + enhancers: ['not a store enhancer'] + }) +} diff --git a/type-tests/files/createAction.typetest.ts b/type-tests/files/createAction.typetest.ts new file mode 100644 index 0000000000..d652a5ea31 --- /dev/null +++ b/type-tests/files/createAction.typetest.ts @@ -0,0 +1,114 @@ +import { + createAction, + PayloadAction, + ActionCreator, + PayloadActionCreator, + Action, + AnyAction +} from 'redux-starter-kit' + +/* PayloadAction */ + +/* + * Test: PayloadAction has type parameter for the payload. + */ +{ + const action: PayloadAction = { type: '', payload: 5 } + const numberPayload: number = action.payload + + // typings:expect-error + const stringPayload: string = action.payload +} + +/* + * Test: PayloadAction type parameter is optional (defaults to `any`). + */ +{ + const action: PayloadAction = { type: '', payload: 5 } + const numberPayload: number = action.payload + const stringPayload: string = action.payload +} + +/* + * Test: PayloadAction has a string type tag. + */ +{ + const action: PayloadAction = { type: '', payload: 5 } + + // typings:expect-error + const action2: PayloadAction = { type: 1, payload: 5 } +} + +/* + * Test: PayloadAction is compatible with Action + */ +{ + const action: PayloadAction = { type: '', payload: 5 } + const stringAction: Action = action +} + +/* PayloadActionCreator */ + +/* + * Test: PayloadActionCreator returns Action or PayloadAction depending + * on whether a payload is passed. + */ +{ + const actionCreator: PayloadActionCreator = (payload?: number) => ({ + type: 'action', + payload + }) + + let action: Action + let payloadAction: PayloadAction + + action = actionCreator() + action = actionCreator(1) + payloadAction = actionCreator(1) + + // typings:expect-error + payloadAction = actionCreator() +} + +/* + * Test: PayloadActionCreator is compatible with ActionCreator. + */ +{ + const payloadActionCreator: PayloadActionCreator = (payload?: number) => ({ + type: 'action', + payload + }) + const actionCreator: ActionCreator = payloadActionCreator + + const payloadActionCreator2: PayloadActionCreator = ( + payload?: number + ) => ({ + type: 'action', + payload: payload || 1 + }) + const actionCreator2: ActionCreator< + PayloadAction + > = payloadActionCreator2 +} + +/* createAction() */ + +/* + * Test: createAction() has type parameter for the action payload. + */ +{ + const increment = createAction('increment') + const n: number = increment(1).payload + + // typings:expect-error + const s: string = increment(1).payload +} + +/* + * Test: createAction() type parameter is optional (defaults to `any`). + */ +{ + const increment = createAction('increment') + const n: number = increment(1).payload + const s: string = increment(1).payload +} diff --git a/type-tests/files/createReducer.typetest.ts b/type-tests/files/createReducer.typetest.ts new file mode 100644 index 0000000000..e455faf78d --- /dev/null +++ b/type-tests/files/createReducer.typetest.ts @@ -0,0 +1,58 @@ +import { AnyAction, createReducer, Reducer } from 'redux-starter-kit' + +/* + * Test: createReducer() infers type of returned reducer. + */ +{ + type CounterAction = + | { type: 'increment'; payload: number } + | { type: 'decrement'; payload: number } + + const incrementHandler = (state: number, action: CounterAction) => state + 1 + const decrementHandler = (state: number, action: CounterAction) => state - 1 + + const reducer = createReducer(0 as number, { + increment: incrementHandler, + decrement: decrementHandler + }) + + const numberReducer: Reducer = reducer + + // typings:expect-error + const stringReducer: Reducer = reducer + + // typings:expect-error + const anyActionReducer: Reducer = reducer +} + +/** + * Test: createReducer() type parameters can be specified expliclity. + */ +{ + type CounterAction = + | { type: 'increment'; payload: number } + | { type: 'decrement'; payload: number } + + const incrementHandler = (state: number, action: CounterAction) => + state + action.payload + + const decrementHandler = (state: number, action: CounterAction) => + state - action.payload + + createReducer(0, { + increment: incrementHandler, + decrement: decrementHandler + }) + + // typings:expect-error + createReducer(0, { + increment: incrementHandler, + decrement: decrementHandler + }) + + // typings:expect-error + createReducer(0, { + increment: incrementHandler, + decrement: decrementHandler + }) +} diff --git a/type-tests/files/createSlice.typetest.ts b/type-tests/files/createSlice.typetest.ts new file mode 100644 index 0000000000..d4dd4d3572 --- /dev/null +++ b/type-tests/files/createSlice.typetest.ts @@ -0,0 +1,44 @@ +import { + AnyAction, + createSlice, + PayloadAction, + Reducer +} from 'redux-starter-kit' + +/* + * Test: createSlice() infers the returned slice's type. + */ +{ + const slice = createSlice({ + slice: 'counter', + initialState: 0, + reducers: { + increment: (state: number, action) => state + action.payload, + decrement: (state: number, action) => state - action.payload + } + }) + + /* Reducer */ + + const reducer: Reducer = slice.reducer + + // typings:expect-error + const stringReducer: Reducer = slice.reducer + // typings:expect-error + const anyActionReducer: Reducer = slice.reducer + + /* Actions */ + + slice.actions.increment(1) + slice.actions.decrement(1) + + // typings:expect-error + slice.actions.other(1) + + /* Selector */ + + const value: number = slice.selectors.getCounter(0) + + // typings:expect-error + const stringValue: string = slice.selectors.getCounter(0) +} diff --git a/type-tests/files/tsconfig.json b/type-tests/files/tsconfig.json new file mode 100644 index 0000000000..a993190ffc --- /dev/null +++ b/type-tests/files/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "lib": ["es2015"], + "strict": true, + "baseUrl": "../..", + "paths": { + "redux-starter-kit": ["index.d.ts"] + } + } +} diff --git a/type-tests/types.test.ts b/type-tests/types.test.ts new file mode 100644 index 0000000000..e959536c50 --- /dev/null +++ b/type-tests/types.test.ts @@ -0,0 +1,5 @@ +import { checkDirectory } from 'typings-tester' + +test('Types', () => { + checkDirectory(`${__dirname}/files`) +}) From a9225a51690bc6e81c3455a4631a571e521324a1 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 10:28:36 +0100 Subject: [PATCH 12/37] Add "target" to tsconfig.json It's apparently not strictly needed for Babel's TypeScript plugin, but at least more explicit. --- tsconfig.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 56536b98f3..8c3f613fc2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,8 +2,11 @@ "compilerOptions": { "allowSyntheticDefaultImports": true, "lib": ["es2015"], + "module": "es2015", + "moduleResolution": "node", "noEmit": true, - "strict": true + "strict": true, + "target": "es2018" }, "include": ["src"] } From 39e69e39898e396cd8589c942a8ffa2b4390037e Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 15:15:33 +0100 Subject: [PATCH 13/37] Use `T extends string` instaead of `string` as action type This allows more concrete types like `Action<'increment'>` to be inferred by TypeScript. --- src/createAction.ts | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/createAction.ts b/src/createAction.ts index 0d9560135e..7590db5778 100644 --- a/src/createAction.ts +++ b/src/createAction.ts @@ -5,17 +5,19 @@ import { Action } from 'redux' * type of action returned by `createAction()` action creators. * * @template P The type of the action's payload. + * @template T the type used for the action type. */ -export interface PayloadAction

extends Action { +export interface PayloadAction

+ extends Action { payload: P } /** * An action creator that produces actions with a `payload` attribute. */ -export interface PayloadActionCreator

{ - (): Action - (payload: P): PayloadAction

+export interface PayloadActionCreator

{ + (): Action + (payload: P): PayloadAction } /** @@ -27,10 +29,12 @@ export interface PayloadActionCreator

{ * * @param type The action type to use for created actions. */ -export function createAction

(type: string): PayloadActionCreator

{ - function actionCreator(): Action - function actionCreator(payload: P): PayloadAction

- function actionCreator(payload?: P) { +export function createAction

( + type: T +): PayloadActionCreator

{ + function actionCreator(): Action + function actionCreator(payload: P): PayloadAction + function actionCreator(payload?: P): Action | PayloadAction { return { type, payload } } @@ -47,6 +51,8 @@ export function createAction

(type: string): PayloadActionCreator

{ * @param action The action creator whose action type to get. * @returns The action type used by the action creator. */ -export function getType

(actionCreator: PayloadActionCreator

): string { - return `${actionCreator}` +export function getType( + actionCreator: PayloadActionCreator +): T { + return `${actionCreator}` as T } From 26bb3b215be6887689eabc85cbf21d73e8aedc2a Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 15:24:40 +0100 Subject: [PATCH 14/37] Remove unneeded extension from Rollup input path --- rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index c12e4d94c2..3dd26f573e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -3,7 +3,7 @@ import babel from 'rollup-plugin-babel' import commonjs from 'rollup-plugin-commonjs' import pkg from './package.json' -const input = './src/index.ts' +const input = './src/index' const exclude = 'node_modules/**' const extensions = ['.ts', '.js'] From f1ca437dc6d3ad9ec4d286f8506c7fd9be76b1f4 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 15:30:14 +0100 Subject: [PATCH 15/37] Remove unneeded type parameter --- src/createAction.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/createAction.ts b/src/createAction.ts index 7590db5778..6c6de86a41 100644 --- a/src/createAction.ts +++ b/src/createAction.ts @@ -51,8 +51,8 @@ export function createAction

( * @param action The action creator whose action type to get. * @returns The action type used by the action creator. */ -export function getType( - actionCreator: PayloadActionCreator +export function getType( + actionCreator: PayloadActionCreator ): T { return `${actionCreator}` as T } From 50c2ed8eb0152bd5d47eace0876fad431a425f24 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 15:36:14 +0100 Subject: [PATCH 16/37] Avoid a type cast in createReducer() --- src/createReducer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/createReducer.ts b/src/createReducer.ts index 80be541fda..c77abcd2f3 100644 --- a/src/createReducer.ts +++ b/src/createReducer.ts @@ -48,9 +48,9 @@ export function createReducer( actionsMap: CaseReducersMapObject ): Reducer { return function(state = initialState, action): S { - return createNextState(state, draft => { + return createNextState(state, (draft: S) => { const caseReducer = actionsMap[action.type] return caseReducer ? caseReducer(draft as S, action) : draft - }) as S + }) } } From 64c703c44c00106b832b7e5e6d30ff5ffc76f465 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 15:58:18 +0100 Subject: [PATCH 17/37] Type `isPlainObject` argument as `unknown` --- src/isPlainObject.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/isPlainObject.ts b/src/isPlainObject.ts index 6da3e23e1f..997e85a072 100644 --- a/src/isPlainObject.ts +++ b/src/isPlainObject.ts @@ -1,14 +1,18 @@ /** - * @param {any} obj The object to inspect. + * Returns true if the passed value is "plain" object, i.e. an object whose + * protoype is the root `Object.prototype`. This includes objects created + * using object literals, but not for instance for class instances. + * + * @param {any} value The value to inspect. * @returns {boolean} True if the argument appears to be a plain object. */ -export default function isPlainObject(obj: any): obj is object { - if (typeof obj !== 'object' || obj === null) return false +export default function isPlainObject(value: unknown): value is object { + if (typeof value !== 'object' || value === null) return false - let proto = obj + let proto = value while (Object.getPrototypeOf(proto) !== null) { proto = Object.getPrototypeOf(proto) } - return Object.getPrototypeOf(obj) === proto + return Object.getPrototypeOf(value) === proto } From cac9df14f108fa652479ed1638d2c0a4f81a375d Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 16:20:40 +0100 Subject: [PATCH 18/37] Make findNonSerializableValue() typing more precise --- src/serializableStateInvariantMiddleware.ts | 59 +++++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/src/serializableStateInvariantMiddleware.ts b/src/serializableStateInvariantMiddleware.ts index ffc1ba30f3..a6f519a655 100644 --- a/src/serializableStateInvariantMiddleware.ts +++ b/src/serializableStateInvariantMiddleware.ts @@ -32,36 +32,49 @@ const NON_SERIALIZABLE_ACTION_MESSAGE = [ '(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)' ].join('\n') +interface NonSerializableValue { + keyPath: string + value: unknown +} + export function findNonSerializableValue( - obj: any, - path: string[] = [], - isSerializable: (value: any) => boolean = isPlain -): any { - let foundNestedSerializable - - if (!isSerializable(obj)) { - return { keyPath: path.join('.') || '', value: obj } + value: unknown, + path: ReadonlyArray = [], + isSerializable: (value: unknown) => boolean = isPlain +): NonSerializableValue | false { + let foundNestedSerializable: NonSerializableValue | false + + if (!isSerializable(value)) { + return { + keyPath: path.join('.') || '', + value: value + } } - for (let property in obj) { - if (obj.hasOwnProperty(property)) { - const nestedPath = path.concat(property) - const nestedValue = obj[property] + if (typeof value !== 'object' || value === null) { + return false + } + + for (const property of Object.keys(value)) { + const nestedPath = path.concat(property) + const nestedValue: unknown = (value as any)[property] - if (!isSerializable(nestedValue)) { - return { keyPath: nestedPath.join('.'), value: nestedValue } + if (!isSerializable(nestedValue)) { + return { + keyPath: nestedPath.join('.'), + value: nestedValue } + } - if (typeof nestedValue === 'object') { - foundNestedSerializable = findNonSerializableValue( - nestedValue, - nestedPath, - isSerializable - ) + if (typeof nestedValue === 'object') { + foundNestedSerializable = findNonSerializableValue( + nestedValue, + nestedPath, + isSerializable + ) - if (foundNestedSerializable) { - return foundNestedSerializable - } + if (foundNestedSerializable) { + return foundNestedSerializable } } } From 8c555806cff15beb21346a74db042831263b0170 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 16:28:00 +0100 Subject: [PATCH 19/37] Remove redundant "lib" in tsconfig.json It's implied by "target": "es2018". --- tsconfig.json | 1 - 1 file changed, 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 8c3f613fc2..08cb51ba40 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "compilerOptions": { "allowSyntheticDefaultImports": true, - "lib": ["es2015"], "module": "es2015", "moduleResolution": "node", "noEmit": true, From f1bfbefdee0866aa90b4d11ddcd25927b81eba4f Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 16:29:02 +0100 Subject: [PATCH 20/37] Enable "esModuleInterop" in tsconfig.json --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index 08cb51ba40..718f4b63ca 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "allowSyntheticDefaultImports": true, + "esModuleInterop": true, "module": "es2015", "moduleResolution": "node", "noEmit": true, From 3933c9a9bb009aec736c786db9c1eef330118f2e Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 16:31:11 +0100 Subject: [PATCH 21/37] Update typings-tester tsconfig.json --- type-tests/files/tsconfig.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/type-tests/files/tsconfig.json b/type-tests/files/tsconfig.json index a993190ffc..b9f3329600 100644 --- a/type-tests/files/tsconfig.json +++ b/type-tests/files/tsconfig.json @@ -1,8 +1,11 @@ { "compilerOptions": { "allowSyntheticDefaultImports": true, - "lib": ["es2015"], + "esModuleInterop": true, + "module": "es2015", + "moduleResolution": "node", "strict": true, + "target": "es2018", "baseUrl": "../..", "paths": { "redux-starter-kit": ["index.d.ts"] From da9783197e04b838aca2101d72e74b56ca08fd7a Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sat, 12 Jan 2019 20:21:04 +0100 Subject: [PATCH 22/37] Fix configureStore() state type inference edge case When passing an object as `reducer` and at the same time `preloadedState`, TypeScript infers the store state type from the latter although `preloadedState` is potentially just a partial state. An additional `PS` type parameter fixes this. --- src/configureStore.ts | 18 +++++++++++------ type-tests/files/configureStore.typetest.ts | 22 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/configureStore.ts b/src/configureStore.ts index eac36896bc..27ed27bc56 100644 --- a/src/configureStore.ts +++ b/src/configureStore.ts @@ -47,7 +47,11 @@ export function getDefaultMiddleware( /** * Options for `configureStore()`. */ -export interface ConfigureStoreOptions { +export interface ConfigureStoreOptions< + S = any, + A extends Action = AnyAction, + PS extends S = S +> { /** * A single reducer function that will be used as the root reducer, or an * object of slice reducers that will be passed to `combineReducers()`. @@ -72,7 +76,7 @@ export interface ConfigureStoreOptions { * function (either directly or indirectly by passing an object as `reducer`), * this must be an object with the same shape as the reducer map keys. */ - preloadedState?: DeepPartial + preloadedState?: DeepPartial /** * The store enhancers to apply. See Redux's `createStore()`. If you only @@ -87,9 +91,11 @@ export interface ConfigureStoreOptions { * @param config The store configuration. * @returns A configured Redux store. */ -export function configureStore( - options: ConfigureStoreOptions -): Store { +export function configureStore< + S = any, + A extends Action = AnyAction, + PS extends S = S +>(options: ConfigureStoreOptions): Store { const { reducer = undefined, middleware = getDefaultMiddleware(), @@ -132,7 +138,7 @@ export function configureStore( const store: Store = createStore( rootReducer, - preloadedState, + preloadedState as DeepPartial, composedEnhancer ) diff --git a/type-tests/files/configureStore.typetest.ts b/type-tests/files/configureStore.typetest.ts index 4e543766bc..602172426f 100644 --- a/type-tests/files/configureStore.typetest.ts +++ b/type-tests/files/configureStore.typetest.ts @@ -122,3 +122,25 @@ import { enhancers: ['not a store enhancer'] }) } + +/** + * Test: configureStore() state type inference works when specifying both a + * reducer object and a partial preloaded state. + */ +{ + let counterReducer1: Reducer = () => 0 + let counterReducer2: Reducer = () => 0 + + const store = configureStore({ + reducer: { + counter1: counterReducer1, + counter2: counterReducer2 + }, + preloadedState: { + counter1: 0 + } + }) + + const counter1: number = store.getState().counter1 + const counter2: number = store.getState().counter2 +} From 7b0502dca225506aed06a1fd7bbb98714cc2a8fd Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Sun, 13 Jan 2019 23:37:46 +0100 Subject: [PATCH 23/37] Fix configureStore() state inference without extra type Thanks to @Dudeonyx for this hack. --- src/configureStore.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/configureStore.ts b/src/configureStore.ts index 27ed27bc56..e42d5b912f 100644 --- a/src/configureStore.ts +++ b/src/configureStore.ts @@ -47,11 +47,7 @@ export function getDefaultMiddleware( /** * Options for `configureStore()`. */ -export interface ConfigureStoreOptions< - S = any, - A extends Action = AnyAction, - PS extends S = S -> { +export interface ConfigureStoreOptions { /** * A single reducer function that will be used as the root reducer, or an * object of slice reducers that will be passed to `combineReducers()`. @@ -76,7 +72,11 @@ export interface ConfigureStoreOptions< * function (either directly or indirectly by passing an object as `reducer`), * this must be an object with the same shape as the reducer map keys. */ - preloadedState?: DeepPartial + // NOTE: The needlessly complicated `S extends any ? S : S` instead of just + // `S` ensures that the TypeScript compiler doesn't attempt to infer `S` + // based on the value passed as `preloadedState`, which might be a partial + // state rather than the full thing. + preloadedState?: DeepPartial /** * The store enhancers to apply. See Redux's `createStore()`. If you only @@ -91,11 +91,9 @@ export interface ConfigureStoreOptions< * @param config The store configuration. * @returns A configured Redux store. */ -export function configureStore< - S = any, - A extends Action = AnyAction, - PS extends S = S ->(options: ConfigureStoreOptions): Store { +export function configureStore( + options: ConfigureStoreOptions +): Store { const { reducer = undefined, middleware = getDefaultMiddleware(), From 1c21c86437a23d44fd4c55192609a8e8c344e020 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 14 Jan 2019 00:02:49 +0100 Subject: [PATCH 24/37] Introduce EnhancedStore type for thunk dispatch --- src/configureStore.ts | 28 +++++++++++++-------- type-tests/files/configureStore.typetest.ts | 21 +++++++++++++++- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/configureStore.ts b/src/configureStore.ts index e42d5b912f..cba4fe7189 100644 --- a/src/configureStore.ts +++ b/src/configureStore.ts @@ -10,10 +10,11 @@ import { AnyAction, StoreEnhancer, Store, - DeepPartial + DeepPartial, + Dispatch } from 'redux' import { composeWithDevTools } from 'redux-devtools-extension' -import thunk from 'redux-thunk' +import thunk, { ThunkDispatch, ThunkMiddleware } from 'redux-thunk' import createImmutableStateInvariantMiddleware from 'redux-immutable-state-invariant' import createSerializableStateInvariantMiddleware from './serializableStateInvariantMiddleware' @@ -28,10 +29,10 @@ const IS_PRODUCTION = process.env.NODE_ENV === 'production' * * @return The default middleware used by `configureStore()`. */ -export function getDefaultMiddleware( +export function getDefaultMiddleware( isProduction = IS_PRODUCTION -): Middleware[] { - let middlewareArray: Middleware[] = [thunk] +): [ThunkMiddleware, ...Middleware<{}, S>[]] { + let middlewareArray: [ThunkMiddleware, ...Middleware<{}, S>[]] = [thunk] if (!isProduction) { middlewareArray = [ @@ -58,7 +59,7 @@ export interface ConfigureStoreOptions { * An array of Redux middleware to install. If not supplied, defaults to * the set of middleware returned by `getDefaultMiddleware()`. */ - middleware?: Middleware[] + middleware?: Middleware<{}, S>[] /** * Whether to enable Redux DevTools integration. Defaults to `true`. @@ -85,6 +86,15 @@ export interface ConfigureStoreOptions { enhancers?: StoreEnhancer[] } +/** + * A Redux store returned by `configureStore()`. Supports dispatching + * side-effectful _thunks_ in addition to plain actions. + */ +export interface EnhancedStore + extends Store { + dispatch: ThunkDispatch +} + /** * A friendly abstraction over the standard Redux `createStore()` function. * @@ -93,7 +103,7 @@ export interface ConfigureStoreOptions { */ export function configureStore( options: ConfigureStoreOptions -): Store { +): EnhancedStore { const { reducer = undefined, middleware = getDefaultMiddleware(), @@ -134,11 +144,9 @@ export function configureStore( const composedEnhancer = finalCompose(...storeEnhancers) as StoreEnhancer - const store: Store = createStore( + return createStore( rootReducer, preloadedState as DeepPartial, composedEnhancer ) - - return store } diff --git a/type-tests/files/configureStore.typetest.ts b/type-tests/files/configureStore.typetest.ts index 602172426f..b5928eed26 100644 --- a/type-tests/files/configureStore.typetest.ts +++ b/type-tests/files/configureStore.typetest.ts @@ -1,4 +1,4 @@ -import { applyMiddleware } from 'redux' +import { applyMiddleware, Dispatch } from 'redux' import { AnyAction, configureStore, @@ -144,3 +144,22 @@ import { const counter1: number = store.getState().counter1 const counter2: number = store.getState().counter2 } + +/** + * Test: Returned store allows dispatching thunks. + */ +{ + const store = configureStore({ + reducer: () => 0 + }) + + function incrementMaybe() { + return (dispatch: Dispatch) => { + if (Math.random() > 0.5) { + dispatch({ type: 'increment' }) + } + } + } + + store.dispatch(incrementMaybe()) +} From b23997aee7fa442b074fa4ac363ead9fa710716b Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Sun, 13 Jan 2019 20:21:51 -0500 Subject: [PATCH 25/37] Update formatting commands --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7de0cac8ef..e07c490ebf 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "scripts": { "build": "rollup -c", "dev": "rollup -c -w", - "format": "prettier --write \"**/*.{js,md}\"", - "format:check": "prettier --list-different \"**/*.{js,md}\"", + "format": "prettier --write \"src/*.ts\" \"**/*.md\"", + "format:check": "prettier --list-different \"src/*.ts\" \"**/*.md\"", "lint": "eslint src", "prepare": "npm run lint && npm test && npm run build", "test": "jest", From 88bf6b9618c3eec2ec5b285947cc2abfa37a8b74 Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Sun, 13 Jan 2019 20:22:16 -0500 Subject: [PATCH 26/37] Reformat, again --- README.md | 85 +++++++++++++++++++++------------------ docs/api/createReducer.md | 20 ++++----- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index e370735530..c0277b79d2 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,46 @@ -# Redux Starter Kit - -[![build status](https://img.shields.io/travis/reduxjs/redux-starter-kit/master.svg?style=flat-square)](https://travis-ci.org/reduxjs/redux-starter-kit) -[![npm version](https://img.shields.io/npm/v/redux-starter-kit.svg?style=flat-square)](https://www.npmjs.com/package/redux-starter-kit) -[![npm downloads](https://img.shields.io/npm/dm/redux-starter-kit.svg?style=flat-square)](https://www.npmjs.com/package/redux-starter-kit) - -**A simple set of tools to make using Redux easier** - -`npm install redux-starter-kit` - -(Special thanks to Github user @shotak for donating to the package name.) - -### Purpose - -The `redux-starter-kit` package is intended to help address three common complaints about Redux: - -- "Configuring a Redux store is too complicated" -- "I have to add a lot of packages to get Redux to do anything useful" -- "Redux requires too much boilerplate code" - -We can't solve every use case, but in the spirit of [`create-react-app`](https://github.com/facebook/create-react-app) and [`apollo-boost`](https://dev-blog.apollodata.com/zero-config-graphql-state-management-27b1f1b3c2c3), we can try to provide some tools that abstract over the setup process and handle the most common use cases, as well as include some useful utilities that will let the user simplify their application code. - -This package is _not_ intended to solve every possible complaint about Redux, and is deliberately limited in scope. It does _not_ address concepts like "reusable encapsulated Redux modules", data fetching, folder or file structures, managing entity relationships in the store, and so on. - -### What's Included - -`redux-starter-kit` includes: - -- A `configureStore()` function with simplified configuration options. It can automatically combine your slice reducers, adds whatever Redux middleware you supply, includes `redux-thunk` by default, and enables use of the Redux DevTools Extension. -- A `createReducer()` utility that lets you supply a lookup table of action types to case reducer functions, rather than writing switch statements. In addition, it automatically uses the [`immer` library](https://github.com/mweststrate/immer) to let you write simpler immutable updates with normal mutative code, like `state.todos[3].completed = true`. -- A `createAction()` utility that returns an action creator function for the given action type string. The function itself has `toString()` defined, so that it can be used in place of the type constant. -- A `createSlice()` function that accepts a set of reducer functions, a slice name, and an initial state value, and automatically generates corresponding action creators, types, and simple selector functions. -- An improved version of the widely used `createSelector` utility for creating memoized selector functions, which can accept string keypaths as "input selectors" (re-exported from the [`selectorator` library](https://github.com/planttheidea/selectorator)). - -## Documentation - -The `redux-starter-kit` docs are now published at **https://redux-starter-kit.js.org**. - -We're currently expanding and rewriting our docs content - check back soon for more updates! +# Redux Starter Kit + +[![build status](https://img.shields.io/travis/reduxjs/redux-starter-kit/master.svg?style=flat-square)](https://travis-ci.org/reduxjs/redux-starter-kit) + +[![npm version](https://img.shields.io/npm/v/redux-starter-kit.svg?style=flat-square)](https://www.npmjs.com/package/redux-starter-kit) + +**A simple set of tools to make using Redux easier** + +`npm install redux-starter-kit` + +(Special thanks to Github user @shotak for dona + +**A simple set of tools to make using Redux easier** + +`npm install redux-starter-kit` + +(Special thanks to Github user @shotak for donating to the package name.) + +### Purpose + +The `redux-starter-kit` package is intended to help address three common complaints about Redux: + +- "Configuring a Redux store is too complicated" +- "I have to add a lot of packages to get Redux to do anything useful" +- "Redux requires too much boilerplate code" + +We can't solve every use case, but in the spirit of le complaint about Redux, and is deliberately limited in scope. It and _not_ address concepts like "reusable encapsulated Redux modules", data fetching, folder or file s, we can try to provide some tools that abstract over the setup process and handle the most common use cases, as well as include some useful utilities that will let the user simplify their application code. + +This package is _not_ intended to solve every possible complaint about Redux, and is deliberately limited in scope. It does _not_ address concepts like "reusable encapsulated Redux modules", data fetching, folder or file structures, managing entity relationships in the store, and so on. + +### What's Included + +`redux-starter-kit` includes: + +- A `configureStore()` function with simplified configuration options. It can automatically combine your slice reducers, adds whatever Redux middleware you supply, includes `redux-thunk` by default, and enables use of the Redux DevTools Extension. +- A `createReducer()` utility that lets you supply a lookup table of action types to case reducer functions, rather than writing switch statements. In addition, it automatically uses the e selector functions. +- An improved version of the wid to let you write simpler immutable updates with normal mutative code, like `state.todos[3].completed = true`. +- A `createAction()` utility that returns an action creator function for the given action type string. The function itself has `toString()` defined, so that it can be used in place of the type constant. +- A `createSlice()` function that accepts a set of reducer functions, a slice name, and an initial state value, and automatically generates corresponding action creators, types, and simple selector functions. +- An improved version of the widely used `createSelector` utility for creating memoized selector functions, which can accept string keypaths as "input selectors" (re-exported from the n for more updates!). + +## Documentation + +The `redux-starter-kit` docs are now published at **tent - check back soon for more **. + +We're currently expanding and rewriting our docs content - check back soon for more updates! diff --git a/docs/api/createReducer.md b/docs/api/createReducer.md index e17876ee57..7538e05526 100644 --- a/docs/api/createReducer.md +++ b/docs/api/createReducer.md @@ -7,7 +7,7 @@ hide_title: true # `createReducer()` -A utility that simplifies creating Redux reducer functions, by defining them as lookup tables of functions to handle each action type. It also allows you to drastically simplify immutable update logic, by writing "mutative" code inside your reducers. +A utility that simplifies creating Redux reducer functions, by defining them as lookup tables of functions to handle each action type. It also allows you to drastically simplify immutable update logic, by writing "mutative" code inside your reducers. Redux [reducers](https://redux.js.org/basics/reducers) are often implemented using a `switch` statement, with one `case` for every handled action type. @@ -49,7 +49,7 @@ const counterReducer = createReducer(0, { ## Direct State Mutation -Redux requires reducer functions to be pure and treat state values as immutable. While this is essential for making state updates predictable and observable, it can sometimes make the implementation of such updates awkward. Consider the following example: +Redux requires reducer functions to be pure and treat state values as immutable. While this is essential for making state updates predictable and observable, it can sometimes make the implementation of such updates awkward. Consider the following example: ```js const addTodo = createAction('todos/add') @@ -72,7 +72,7 @@ const todosReducer = createReducer([], { }) ``` -The `addTodo` reducer is pretty easy to follow if you know the [ES6 spread syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax). However, the code for `toggleTodo` is much less straightforward, especially considering that it only sets a single flag. +The `addTodo` reducer is pretty easy to follow if you know the [ES6 spread syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax). However, the code for `toggleTodo` is much less straightforward, especially considering that it only sets a single flag. To make things easier, `createReducer` uses [immer](https://github.com/mweststrate/immer) to let you write reducers as if they were mutating the state directly. In reality, the reducer receives a proxy state that translates all mutations into equivalent copy operations. @@ -84,19 +84,19 @@ const todosReducer = createReducer([], { [addTodo]: (state, action) => { // This push() operation gets translated into the same // extended-array creation as in the previous example. - state.push(todo) + state.push(todo) }, [toggleTodo]: (state, action) => { // The "mutating" version of this case reducer is much // more direct than the explicitly pure one. const index = action.payload - const todo = state[index] - todo.completed = !todo.completed + const todo = state[index] + todo.completed = !todo.completed } }) ``` -If you choose to write reducers in this style, make sure to learn about the [pitfalls mentioned in the immer docs](https://github.com/mweststrate/immer#pitfalls) . Most importantly, you need to ensure that you either mutate the `state` argument or return a new state, _but not both_. For example, the following reducer would throw an exception if a `toggleTodo` action is passed: +If you choose to write reducers in this style, make sure to learn about the [pitfalls mentioned in the immer docs](https://github.com/mweststrate/immer#pitfalls) . Most importantly, you need to ensure that you either mutate the `state` argument or return a new state, _but not both_. For example, the following reducer would throw an exception if a `toggleTodo` action is passed: ```js const todosReducer = createReducer([], { @@ -110,11 +110,7 @@ const todosReducer = createReducer([], { // ... and returns a new value. This will throw an // exception. In this example, the easiest fix is // to remove the `return` statement. - return [ - ...state.slice(0, index), - todo, - ...state.slice(index + 1) - ] + return [...state.slice(0, index), todo, ...state.slice(index + 1)] } }) ``` From b38b2f7edbe100fc740f8b4e016a013202a2aa90 Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Sun, 13 Jan 2019 20:26:03 -0500 Subject: [PATCH 27/37] Package lock random changes --- package-lock.json | 107 ++++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5bbe0335d6..7e259a0bbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1007,7 +1007,7 @@ }, "acorn-jsx": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { @@ -1016,7 +1016,7 @@ "dependencies": { "acorn": { "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true } @@ -1048,7 +1048,7 @@ }, "ansi-escapes": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -1150,7 +1150,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -1170,7 +1170,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -1401,7 +1401,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1614,7 +1614,7 @@ }, "babel-plugin-istanbul": { "version": "4.1.6", - "resolved": "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "dev": true, "requires": { @@ -1643,7 +1643,7 @@ }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, @@ -1910,7 +1910,7 @@ "dependencies": { "resolve": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true } @@ -1973,7 +1973,7 @@ }, "callsites": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, @@ -2000,7 +2000,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -2167,7 +2167,7 @@ }, "concat-stream": { "version": "1.6.2", - "resolved": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { @@ -2525,7 +2525,7 @@ }, "eslint": { "version": "4.19.1", - "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { @@ -2691,7 +2691,7 @@ "dependencies": { "doctrine": { "version": "1.5.0", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -2758,7 +2758,7 @@ }, "espree": { "version": "3.5.4", - "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { @@ -2849,7 +2849,7 @@ }, "expand-range": { "version": "1.8.2", - "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { @@ -2910,7 +2910,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -2936,7 +2936,7 @@ }, "fast-deep-equal": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, @@ -3124,12 +3124,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3149,7 +3151,8 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", @@ -3271,7 +3274,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3297,6 +3301,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3632,7 +3637,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, @@ -4054,7 +4059,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -4075,7 +4080,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { @@ -4099,7 +4104,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -4662,7 +4667,7 @@ }, "jest-get-type": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", "dev": true }, @@ -5076,7 +5081,7 @@ }, "callsites": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, @@ -5343,7 +5348,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -5517,7 +5522,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, @@ -5544,7 +5549,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -5830,7 +5835,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -5847,7 +5852,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -5925,7 +5930,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -5969,7 +5974,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -6171,7 +6176,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -6263,7 +6268,7 @@ }, "regexpp": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", "dev": true }, @@ -6374,7 +6379,7 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -6558,7 +6563,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -6664,7 +6669,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -6684,7 +6689,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -6864,7 +6869,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -7164,7 +7169,7 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, @@ -7274,7 +7279,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -7283,7 +7288,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -7298,7 +7303,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -7310,7 +7315,7 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, @@ -7385,7 +7390,7 @@ "dependencies": { "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -7453,7 +7458,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -7829,7 +7834,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -7890,7 +7895,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -7909,7 +7914,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { From a68004959742ee66a2d1883afa6d61a22ec0e3e6 Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Sun, 13 Jan 2019 20:28:38 -0500 Subject: [PATCH 28/37] Conditionally import immutable-state-invariant middleware --- src/configureStore.test.ts | 12 ++++++++++-- src/configureStore.ts | 12 +++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/configureStore.test.ts b/src/configureStore.test.ts index 962d9eef85..d5d4c20317 100644 --- a/src/configureStore.test.ts +++ b/src/configureStore.test.ts @@ -5,12 +5,20 @@ import * as devtools from 'redux-devtools-extension' import thunk from 'redux-thunk' describe('getDefaultMiddleware', () => { + const ORIGINAL_NODE_ENV = process.env.NODE_ENV + + afterEach(() => { + process.env.NODE_ENV = ORIGINAL_NODE_ENV + }) + it('returns an array with only redux-thunk in production', () => { - expect(getDefaultMiddleware(true)).toEqual([thunk]) + process.env.NODE_ENV = "production"; + + expect(getDefaultMiddleware()).toEqual([thunk]) }) it('returns an array with additional middleware in development', () => { - const middleware = getDefaultMiddleware(false) + const middleware = getDefaultMiddleware() expect(middleware).toContain(thunk) expect(middleware.length).toBeGreaterThan(1) }) diff --git a/src/configureStore.ts b/src/configureStore.ts index cba4fe7189..2e6cb80bc4 100644 --- a/src/configureStore.ts +++ b/src/configureStore.ts @@ -15,7 +15,6 @@ import { } from 'redux' import { composeWithDevTools } from 'redux-devtools-extension' import thunk, { ThunkDispatch, ThunkMiddleware } from 'redux-thunk' -import createImmutableStateInvariantMiddleware from 'redux-immutable-state-invariant' import createSerializableStateInvariantMiddleware from './serializableStateInvariantMiddleware' import isPlainObject from './isPlainObject' @@ -29,12 +28,15 @@ const IS_PRODUCTION = process.env.NODE_ENV === 'production' * * @return The default middleware used by `configureStore()`. */ -export function getDefaultMiddleware( - isProduction = IS_PRODUCTION -): [ThunkMiddleware, ...Middleware<{}, S>[]] { +export function getDefaultMiddleware(): [ + ThunkMiddleware, + ...Middleware<{}, S>[] +] { let middlewareArray: [ThunkMiddleware, ...Middleware<{}, S>[]] = [thunk] - if (!isProduction) { + if (process.env.NODE_ENV !== 'production') { + const createImmutableStateInvariantMiddleware = require('redux-immutable-state-invariant').default + middlewareArray = [ createImmutableStateInvariantMiddleware(), thunk, From db169a45a6b3a0b3b9a20d5ef1994fe82f9cf57e Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 14 Jan 2019 07:48:54 +0100 Subject: [PATCH 29/37] Make createReducer() return Reducer, A> This reflects the actual runtime behavior of immer (which freezes produced values) and fixes a type error with immer >= 1.10.3. --- package-lock.json | 17 ++++++--------- package.json | 2 +- src/createReducer.ts | 17 ++++++++------- src/createSlice.ts | 5 +++-- type-tests/files/createReducer.typetest.ts | 24 ++++++++++++++++++++++ 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e259a0bbb..f5240c72f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3124,14 +3124,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3151,8 +3149,7 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", @@ -3274,8 +3271,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -3301,7 +3297,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3919,9 +3914,9 @@ "dev": true }, "immer": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.9.3.tgz", - "integrity": "sha512-bUyz3fOHGn82V7h4oVgJGmFglZt53JWwSyVNAT4sO0d7IovHLwLuHbh14uYKY0tewFoDcEdiQW7HuL0NsRVziw==" + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.4.tgz", + "integrity": "sha512-4i8Y+cZQK3x5Sm/YT3R7JwOB6ozVFQuDPqxiiVWzBhaU5FoZ1dCoRH24CmB4z6BH8oenicTW/FrajTUDhajJDg==" }, "import-local": { "version": "1.0.0", diff --git a/package.json b/package.json index e07c490ebf..0eca0f5aa2 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "index.d.ts" ], "dependencies": { - "immer": "^1.9.3", + "immer": "^1.10.3", "redux": "^4.0.0", "redux-devtools-extension": "^2.13.7", "redux-immutable-state-invariant": "^2.1.0", diff --git a/src/createReducer.ts b/src/createReducer.ts index c77abcd2f3..71f8f40bea 100644 --- a/src/createReducer.ts +++ b/src/createReducer.ts @@ -1,4 +1,4 @@ -import createNextState from 'immer' +import createNextState, { Draft, Immutable } from 'immer' import { AnyAction, Action, Reducer } from 'redux' /** @@ -16,7 +16,7 @@ import { AnyAction, Action, Reducer } from 'redux' * translated to copy operations that result in a new state. */ export type CaseReducer = ( - state: S, + state: Draft, action: A ) => S | void @@ -44,13 +44,16 @@ export interface CaseReducersMapObject { * case redeucers. */ export function createReducer( - initialState: S, + initialState: Immutable, actionsMap: CaseReducersMapObject -): Reducer { - return function(state = initialState, action): S { - return createNextState(state, (draft: S) => { +): Reducer, A> { + return function(state = initialState, action): Immutable { + // @ts-ignore createNextState() produces an Immutable> rather + // than an Immutable, and TypeScript cannot find out how to reconcile + // these two types. + return createNextState(state, (draft: Draft) => { const caseReducer = actionsMap[action.type] - return caseReducer ? caseReducer(draft as S, action) : draft + return caseReducer ? caseReducer(draft, action) : undefined }) } } diff --git a/src/createSlice.ts b/src/createSlice.ts index cce1658fba..ccddcf4c64 100644 --- a/src/createSlice.ts +++ b/src/createSlice.ts @@ -1,3 +1,4 @@ +import { Immutable } from 'immer' import { Action, AnyAction, ActionCreator, Reducer } from 'redux' import { createAction, PayloadAction } from './createAction' import { createReducer, CaseReducersMapObject } from './createReducer' @@ -50,7 +51,7 @@ export interface CreateSliceOptions< /** * The initial state to be returned by the slice reducer. */ - initialState: S + initialState: Immutable /** * A mapping from action types to action-type-specific *case reducer* @@ -78,7 +79,7 @@ export function createSlice< CR extends CaseReducersMapObject = CaseReducersMapObject >( options: CreateSliceOptions -): Slice> { +): Slice, A, Extract> { const { slice = '', initialState } = options const reducers = options.reducers || {} const actionKeys = Object.keys(reducers) diff --git a/type-tests/files/createReducer.typetest.ts b/type-tests/files/createReducer.typetest.ts index e455faf78d..a06deb83ba 100644 --- a/type-tests/files/createReducer.typetest.ts +++ b/type-tests/files/createReducer.typetest.ts @@ -56,3 +56,27 @@ import { AnyAction, createReducer, Reducer } from 'redux-starter-kit' decrement: decrementHandler }) } + +/* + * Test: createReducer() reducers are typed to return readonly states. + */ +{ + const initialCounters = { + a: 0, + b: 0 + } + + const reducer = createReducer(initialCounters, { + incrementA: state => { + state.a += 1 + }, + incrementB: state => { + state.b += 1 + } + }) + + const newCounters = reducer(initialCounters, { type: 'incrementA' }) + + // typings:expect-error + newCounters.a++ +} From fcf015bcd38facc169ddaf72984263c8dd7c2dd0 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 14 Jan 2019 23:25:17 +0100 Subject: [PATCH 30/37] Revert createReducer() type change Things are fixed in v1.10.5. --- package-lock.json | 6 +++--- package.json | 2 +- src/createReducer.ts | 8 ++++---- src/createSlice.ts | 5 ++--- type-tests/files/createReducer.typetest.ts | 21 +++++---------------- 5 files changed, 15 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5240c72f3..c931eaad99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3914,9 +3914,9 @@ "dev": true }, "immer": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.4.tgz", - "integrity": "sha512-4i8Y+cZQK3x5Sm/YT3R7JwOB6ozVFQuDPqxiiVWzBhaU5FoZ1dCoRH24CmB4z6BH8oenicTW/FrajTUDhajJDg==" + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.5.tgz", + "integrity": "sha512-5z/nKfF1GQoLCt2JraST2PFkUTwegZDUX3+dd0u2xD2IVxFAbXCZDvWnG8KtxXoqLzRSTqTpf8s/8bXkZE61xA==" }, "import-local": { "version": "1.0.0", diff --git a/package.json b/package.json index 0eca0f5aa2..7f88e98d23 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "index.d.ts" ], "dependencies": { - "immer": "^1.10.3", + "immer": "^1.10.5", "redux": "^4.0.0", "redux-devtools-extension": "^2.13.7", "redux-immutable-state-invariant": "^2.1.0", diff --git a/src/createReducer.ts b/src/createReducer.ts index 71f8f40bea..d4a84a8dfb 100644 --- a/src/createReducer.ts +++ b/src/createReducer.ts @@ -1,4 +1,4 @@ -import createNextState, { Draft, Immutable } from 'immer' +import createNextState, { Draft } from 'immer' import { AnyAction, Action, Reducer } from 'redux' /** @@ -44,10 +44,10 @@ export interface CaseReducersMapObject { * case redeucers. */ export function createReducer( - initialState: Immutable, + initialState: S, actionsMap: CaseReducersMapObject -): Reducer, A> { - return function(state = initialState, action): Immutable { +): Reducer { + return function(state = initialState, action): S { // @ts-ignore createNextState() produces an Immutable> rather // than an Immutable, and TypeScript cannot find out how to reconcile // these two types. diff --git a/src/createSlice.ts b/src/createSlice.ts index ccddcf4c64..cce1658fba 100644 --- a/src/createSlice.ts +++ b/src/createSlice.ts @@ -1,4 +1,3 @@ -import { Immutable } from 'immer' import { Action, AnyAction, ActionCreator, Reducer } from 'redux' import { createAction, PayloadAction } from './createAction' import { createReducer, CaseReducersMapObject } from './createReducer' @@ -51,7 +50,7 @@ export interface CreateSliceOptions< /** * The initial state to be returned by the slice reducer. */ - initialState: Immutable + initialState: S /** * A mapping from action types to action-type-specific *case reducer* @@ -79,7 +78,7 @@ export function createSlice< CR extends CaseReducersMapObject = CaseReducersMapObject >( options: CreateSliceOptions -): Slice, A, Extract> { +): Slice> { const { slice = '', initialState } = options const reducers = options.reducers || {} const actionKeys = Object.keys(reducers) diff --git a/type-tests/files/createReducer.typetest.ts b/type-tests/files/createReducer.typetest.ts index a06deb83ba..8752ea8330 100644 --- a/type-tests/files/createReducer.typetest.ts +++ b/type-tests/files/createReducer.typetest.ts @@ -58,25 +58,14 @@ import { AnyAction, createReducer, Reducer } from 'redux-starter-kit' } /* - * Test: createReducer() reducers are typed to return readonly states. + * Test: createReducer() ensures state type is mutable within a case reducer. */ { - const initialCounters = { - a: 0, - b: 0 - } + const initialState: { readonly counter: number } = { counter: 0 } - const reducer = createReducer(initialCounters, { - incrementA: state => { - state.a += 1 - }, - incrementB: state => { - state.b += 1 + createReducer(initialState, { + increment: state => { + state.counter += 1 } }) - - const newCounters = reducer(initialCounters, { type: 'incrementA' }) - - // typings:expect-error - newCounters.a++ } From 9fa744267d238642b3ad8724151fa3de0cb8b787 Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Mon, 14 Jan 2019 20:20:42 -0500 Subject: [PATCH 31/37] 0.4.0-0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c931eaad99..461dde625c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "redux-starter-kit", - "version": "0.3.3", + "version": "0.4.0-0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7f88e98d23..fa4cfb56ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redux-starter-kit", - "version": "0.3.3", + "version": "0.4.0-0", "description": "A simple set of tools to make using Redux easier", "repository": "https://github.com/markerikson/redux-starter-kit", "main": "dist/redux-starter-kit.cjs.js", From 82ecf27a581730db57f28dc65f6b10a50ec6f6c5 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 14 Jan 2019 23:29:03 +0100 Subject: [PATCH 32/37] Run TypeScript compiler in `prepare` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fa4cfb56ed..4979b89385 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "format": "prettier --write \"src/*.ts\" \"**/*.md\"", "format:check": "prettier --list-different \"src/*.ts\" \"**/*.md\"", "lint": "eslint src", - "prepare": "npm run lint && npm test && npm run build", + "prepare": "npm run tsc && npm run lint && npm test && npm run build", "test": "jest", "tsc": "tsc" }, From c48a52d10bf445cc1c479925ceebc2a8e227000a Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 15 Jan 2019 07:37:58 +0100 Subject: [PATCH 33/37] Configure ESLint for TypeScript For now, we need to use the Git version of typescript-eslint-parser because the last release only supports TypeScript 3.1. A new release is planned for any day now, so we should be able to move to an NPM release soon. https://github.com/eslint/typescript-eslint-parser/pull/596 As ESLint's no-unused-vars doesn't work well with TypeScript, I enabled noUnusedLocals and noUnusedParameters on the TypeScript side instead. --- .eslintrc.js | 5 +- package-lock.json | 46 +++++++++++++++++++ package.json | 3 +- src/configureStore.test.ts | 7 ++- src/configureStore.ts | 6 +-- src/createReducer.test.ts | 4 +- ...rializableStateInvariantMiddleware.test.ts | 8 +--- tsconfig.json | 2 + 8 files changed, 63 insertions(+), 18 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 8896387c94..1512249b46 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,7 +1,10 @@ module.exports = { extends: 'react-app', + parser: 'typescript-eslint-parser', rules: { - 'jsx-a11y/href-no-hash': 'off' + 'jsx-a11y/href-no-hash': 'off', + // Taken care of by TypeScript's `noUnusedLocals` / `noUnusedParameters` + 'no-unused-vars': 'off' } } diff --git a/package-lock.json b/package-lock.json index 461dde625c..89d3f18d3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5383,6 +5383,12 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7581,6 +7587,46 @@ "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", "dev": true }, + "typescript-eslint-parser": { + "version": "github:eslint/typescript-eslint-parser#a8fee9089306b9fc890dd9275cbc7f3988fcccda", + "from": "github:eslint/typescript-eslint-parser", + "dev": true, + "requires": { + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0", + "typescript-estree": "18.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "typescript-estree": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/typescript-estree/-/typescript-estree-18.0.0.tgz", + "integrity": "sha512-HxTWrzFyYOPWA91Ij7xL9mNUVpGTKLH2KiaBn28CMbYgX2zgWdJqU9hO7Are+pAPAqY91NxAYoaAyDDZ3rLj2A==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, "typings-tester": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/typings-tester/-/typings-tester-0.3.2.tgz", diff --git a/package.json b/package.json index 4979b89385..ef30dfa243 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-node-resolve": "^4.0.0", "typescript": "^3.2.2", + "typescript-eslint-parser": "eslint/typescript-eslint-parser", "typings-tester": "^0.3.2" }, "scripts": { @@ -37,7 +38,7 @@ "dev": "rollup -c -w", "format": "prettier --write \"src/*.ts\" \"**/*.md\"", "format:check": "prettier --list-different \"src/*.ts\" \"**/*.md\"", - "lint": "eslint src", + "lint": "eslint 'src/**/*.ts'", "prepare": "npm run tsc && npm run lint && npm test && npm run build", "test": "jest", "tsc": "tsc" diff --git a/src/configureStore.test.ts b/src/configureStore.test.ts index d5d4c20317..22ac51b775 100644 --- a/src/configureStore.test.ts +++ b/src/configureStore.test.ts @@ -12,7 +12,7 @@ describe('getDefaultMiddleware', () => { }) it('returns an array with only redux-thunk in production', () => { - process.env.NODE_ENV = "production"; + process.env.NODE_ENV = 'production' expect(getDefaultMiddleware()).toEqual([thunk]) }) @@ -31,8 +31,7 @@ describe('configureStore', () => { jest.spyOn(redux, 'createStore') jest.spyOn(devtools, 'composeWithDevTools') - const reducer: redux.Reducer<{}, redux.AnyAction> = (state = {}, action) => - state + const reducer: redux.Reducer = (state = {}, _action) => state beforeEach(() => jest.clearAllMocks()) @@ -92,7 +91,7 @@ describe('configureStore', () => { describe('given custom middleware', () => { it('calls createStore with custom middleware and without default middleware', () => { - const thank: redux.Middleware = store => next => action => next(action) + const thank: redux.Middleware = _store => next => action => next(action) expect(configureStore({ middleware: [thank], reducer })).toBeInstanceOf( Object ) diff --git a/src/configureStore.ts b/src/configureStore.ts index 2e6cb80bc4..de779d8719 100644 --- a/src/configureStore.ts +++ b/src/configureStore.ts @@ -10,8 +10,7 @@ import { AnyAction, StoreEnhancer, Store, - DeepPartial, - Dispatch + DeepPartial } from 'redux' import { composeWithDevTools } from 'redux-devtools-extension' import thunk, { ThunkDispatch, ThunkMiddleware } from 'redux-thunk' @@ -35,7 +34,8 @@ export function getDefaultMiddleware(): [ let middlewareArray: [ThunkMiddleware, ...Middleware<{}, S>[]] = [thunk] if (process.env.NODE_ENV !== 'production') { - const createImmutableStateInvariantMiddleware = require('redux-immutable-state-invariant').default + const createImmutableStateInvariantMiddleware = require('redux-immutable-state-invariant') + .default middlewareArray = [ createImmutableStateInvariantMiddleware(), diff --git a/src/createReducer.test.ts b/src/createReducer.test.ts index 9279f58593..f4ee23ecc4 100644 --- a/src/createReducer.test.ts +++ b/src/createReducer.test.ts @@ -1,6 +1,6 @@ import { createReducer, CaseReducer } from './createReducer' import { PayloadAction } from './createAction' -import { Reducer, Action } from 'redux' +import { Reducer } from 'redux' interface Todo { text: string @@ -63,7 +63,7 @@ describe('createReducer', () => { }) }) -function behavesLikeReducer(todosReducer: TodosReducer) { +function behavesLikeReducer(todosReducer: TodosReducer) { it('should handle initial state', () => { const initialAction = { type: '', payload: undefined } expect(todosReducer(undefined, initialAction)).toEqual([]) diff --git a/src/serializableStateInvariantMiddleware.test.ts b/src/serializableStateInvariantMiddleware.test.ts index 4f016b7432..4d5b3188e0 100644 --- a/src/serializableStateInvariantMiddleware.test.ts +++ b/src/serializableStateInvariantMiddleware.test.ts @@ -39,7 +39,6 @@ describe('findNonSerializableValue', () => { it('Should return the first non-serializable value it finds', () => { const map = new Map() const symbol = Symbol.for('testSymbol') - function testFunction() {} const obj = { a: 42, @@ -63,11 +62,6 @@ describe('findNonSerializableValue', () => { }) it('Should accept null as a valid value', () => { - const map = new Map() - const symbol = Symbol.for('testSymbol') - - function testFunction() {} - const obj = { a: 42, b: { @@ -88,7 +82,7 @@ describe('serializableStateInvariantMiddleware', () => { }) it('Should log an error when a non-serializable action is dispatched', () => { - const reducer: Reducer = (state = 0, action) => state + 1 + const reducer: Reducer = (state = 0, _action) => state + 1 const serializableStateInvariantMiddleware = createSerializableStateInvariantMiddleware() diff --git a/tsconfig.json b/tsconfig.json index 718f4b63ca..77a0ef6200 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,8 @@ "module": "es2015", "moduleResolution": "node", "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, "strict": true, "target": "es2018" }, From e449c8a78a501920c0d96705f81b46f8870e4e6a Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Tue, 15 Jan 2019 21:41:49 +0100 Subject: [PATCH 34/37] Generate TypeScript declaration files in dist/ --- index.d.ts | 10 +++++----- package-lock.json | 8 ++++---- package.json | 6 ++++-- tsconfig.json | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/index.d.ts b/index.d.ts index d63b4d7b30..95f5e6fa61 100644 --- a/index.d.ts +++ b/index.d.ts @@ -14,16 +14,16 @@ export { configureStore, ConfigureStoreOptions, getDefaultMiddleware -} from './src/configureStore' +} from './dist/configureStore' export { createAction, getType, PayloadAction, PayloadActionCreator -} from './src/createAction' -export { createReducer } from './src/createReducer' -export { createSlice, CreateSliceOptions, Slice } from './src/createSlice' +} from './dist/createAction' +export { createReducer } from './dist/createReducer' +export { createSlice, CreateSliceOptions, Slice } from './dist/createSlice' export { default as createSerializableStateInvariantMiddleware, isPlain -} from './src/serializableStateInvariantMiddleware' +} from './dist/serializableStateInvariantMiddleware' diff --git a/package-lock.json b/package-lock.json index 89d3f18d3b..4e7ecec476 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6448,12 +6448,12 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "rollup": { diff --git a/package.json b/package.json index ef30dfa243..3410f085e8 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "eslint-plugin-react": "^7.6.1", "jest": "^22.4.2", "prettier": "^1.10.2", + "rimraf": "^2.6.3", "rollup": "^1.0.2", "rollup-plugin-babel": "^4.2.0", "rollup-plugin-commonjs": "^9.2.0", @@ -39,9 +40,10 @@ "format": "prettier --write \"src/*.ts\" \"**/*.md\"", "format:check": "prettier --list-different \"src/*.ts\" \"**/*.md\"", "lint": "eslint 'src/**/*.ts'", - "prepare": "npm run tsc && npm run lint && npm test && npm run build", + "prepare": "npm run tsc && npm run lint && npm test && npm run build && npm run tsc:declarations", "test": "jest", - "tsc": "tsc" + "tsc": "tsc --noEmit", + "tsc:declarations": "tsc -d --emitDeclarationOnly && rimraf 'dist/*.test.d.ts'" }, "files": [ "dist", diff --git a/tsconfig.json b/tsconfig.json index 77a0ef6200..28544ac60a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "esModuleInterop": true, "module": "es2015", "moduleResolution": "node", - "noEmit": true, + "outDir": "dist", "noUnusedLocals": true, "noUnusedParameters": true, "strict": true, From d44e834d4ddb7cc54f6012ee15532e0a43eb40e1 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Wed, 16 Jan 2019 07:04:26 +0100 Subject: [PATCH 35/37] Revert "Generate TypeScript declaration files in dist/" This reverts commit e449c8a78a501920c0d96705f81b46f8870e4e6a. --- index.d.ts | 10 +++++----- package-lock.json | 8 ++++---- package.json | 6 ++---- tsconfig.json | 2 +- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/index.d.ts b/index.d.ts index 95f5e6fa61..d63b4d7b30 100644 --- a/index.d.ts +++ b/index.d.ts @@ -14,16 +14,16 @@ export { configureStore, ConfigureStoreOptions, getDefaultMiddleware -} from './dist/configureStore' +} from './src/configureStore' export { createAction, getType, PayloadAction, PayloadActionCreator -} from './dist/createAction' -export { createReducer } from './dist/createReducer' -export { createSlice, CreateSliceOptions, Slice } from './dist/createSlice' +} from './src/createAction' +export { createReducer } from './src/createReducer' +export { createSlice, CreateSliceOptions, Slice } from './src/createSlice' export { default as createSerializableStateInvariantMiddleware, isPlain -} from './dist/serializableStateInvariantMiddleware' +} from './src/serializableStateInvariantMiddleware' diff --git a/package-lock.json b/package-lock.json index 4e7ecec476..89d3f18d3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6448,12 +6448,12 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "^7.0.5" } }, "rollup": { diff --git a/package.json b/package.json index 3410f085e8..ef30dfa243 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "eslint-plugin-react": "^7.6.1", "jest": "^22.4.2", "prettier": "^1.10.2", - "rimraf": "^2.6.3", "rollup": "^1.0.2", "rollup-plugin-babel": "^4.2.0", "rollup-plugin-commonjs": "^9.2.0", @@ -40,10 +39,9 @@ "format": "prettier --write \"src/*.ts\" \"**/*.md\"", "format:check": "prettier --list-different \"src/*.ts\" \"**/*.md\"", "lint": "eslint 'src/**/*.ts'", - "prepare": "npm run tsc && npm run lint && npm test && npm run build && npm run tsc:declarations", + "prepare": "npm run tsc && npm run lint && npm test && npm run build", "test": "jest", - "tsc": "tsc --noEmit", - "tsc:declarations": "tsc -d --emitDeclarationOnly && rimraf 'dist/*.test.d.ts'" + "tsc": "tsc" }, "files": [ "dist", diff --git a/tsconfig.json b/tsconfig.json index 28544ac60a..77a0ef6200 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "esModuleInterop": true, "module": "es2015", "moduleResolution": "node", - "outDir": "dist", + "noEmit": true, "noUnusedLocals": true, "noUnusedParameters": true, "strict": true, From e3d7337a8313daab813304be4b3bbbfc34a6145d Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Wed, 16 Jan 2019 07:05:46 +0100 Subject: [PATCH 36/37] Publish src/ for TypeScript typings --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ef30dfa243..b7037fab83 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,8 @@ }, "files": [ "dist", - "index.d.ts" + "index.d.ts", + "src" ], "dependencies": { "immer": "^1.10.5", From 497babf1b15f422bd55a5c6b36ba20a1cad802f5 Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Wed, 16 Jan 2019 23:10:12 -0500 Subject: [PATCH 37/37] 0.4.0-1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89d3f18d3b..c0b700d38d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "redux-starter-kit", - "version": "0.4.0-0", + "version": "0.4.0-1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b7037fab83..38d199c319 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redux-starter-kit", - "version": "0.4.0-0", + "version": "0.4.0-1", "description": "A simple set of tools to make using Redux easier", "repository": "https://github.com/markerikson/redux-starter-kit", "main": "dist/redux-starter-kit.cjs.js",