From a2204a9d2e714cf352811f91de22f4e04aec38de Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Thu, 2 May 2019 08:32:40 -0400 Subject: [PATCH 1/6] switch license to MIT --- LICENSE | 10 ++++------ package.json | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/LICENSE b/LICENSE index b28f316..1f756de 100644 --- a/LICENSE +++ b/LICENSE @@ -1,9 +1,7 @@ -Copyright (c) 2017 [these people](https://github.com/sveltejs/sapper/graphs/contributors). +Copyright (c) 2016-19 [these people](https://github.com/sveltejs/sapper/graphs/contributors) -Permission is hereby granted by the authors of this software, to any person, to use the software for any purpose, free of charge, including the rights to run, read, copy, change, distribute and sell it, and including usage rights to any patents the authors may hold on it, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -This license, or a link to its text, must be included with all copies of the software and any derivative works. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -Any modification to the software submitted to the authors may be incorporated into the software under the terms of this license. - -The software is provided "as is", without warranty of any kind, including but not limited to the warranties of title, fitness, merchantability and non-infringement. The authors have no obligation to provide support or updates for the software, and may not be held liable for any damages, claims or other liability arising from its use. \ No newline at end of file +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/package.json b/package.json index f94c445..ac239b0 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "express" ], "author": "Rich Harris", - "license": "LIL", + "license": "MIT", "bugs": { "url": "https://github.com/sveltejs/sapper/issues" }, From f6e72a0432d52224424550357ca4e62d6a4f8e3e Mon Sep 17 00:00:00 2001 From: mrkishi Date: Sun, 5 May 2019 19:52:18 -0300 Subject: [PATCH 2/6] Update dependencies --- package-lock.json | 1451 +++++++++++++++++++++++++++++++-------------- package.json | 42 +- rollup.config.js | 2 +- 3 files changed, 1036 insertions(+), 459 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5009090..47a3254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.26.0", + "version": "0.26.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -49,190 +49,203 @@ "dev": true }, "@types/node": { - "version": "10.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.26.tgz", - "integrity": "sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg==", + "version": "10.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.6.tgz", + "integrity": "sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==", "dev": true }, "@types/puppeteer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.12.1.tgz", - "integrity": "sha512-6qpe7XXM93iWh8quEP8Ay516Vmfc2r+ZAxFH3Mt6fx3vzmZz+4Q+hYxc9PxeEIXJhWLAAPYAgAiM/vLHEUwGpw==", + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.12.4.tgz", + "integrity": "sha512-aaGbJaJ9TuF9vZfTeoh876sBa+rYJWPwtsmHmYr28pGr42ewJnkDTq2aeSKEmS39SqUdkwLj73y/d7rBSp7mDQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "dev": true, "requires": { "@types/node": "*" } }, "@webassemblyjs/ast": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.2.tgz", - "integrity": "sha512-5LLqqVsXZAhAJN0S7fTi11jwMJOjfR8290V0V7BWKgmZ36VVE6ZGuH4BN3eLt7LvNMIgyuYwyrPwiz6f3SGlBQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.2", - "@webassemblyjs/helper-wasm-bytecode": "1.8.2", - "@webassemblyjs/wast-parser": "1.8.2" + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.2.tgz", - "integrity": "sha512-5WIj+pSzbs8ao7NM31xFcGeOSnXgpCikmCFRYkXygVDqVaXTq/Hr9roqarUVMNfAegNc61oKEhe3pi+HUCXJEw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.2.tgz", - "integrity": "sha512-TJBDJPXO9DSC4qf5FZT0VFlTdJSm4DKxzcoyWwVike1aQQQEbCk167MJxYLi0SuHeOtULLtDDSZL7yDL3XXMKA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.2.tgz", - "integrity": "sha512-6fTynU6b0bC+yBH7+M6/BBRZId4F1fIuX00G1ZX45EAQOrB8p4TK5bccAEPG2vuyvnd4tgB1/4cYXq5GpszMGA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.2.tgz", - "integrity": "sha512-5beYTZS4Wsscu8ys2cLZ0SiToEe1wNitzrV/jCr02wGPOcpPHf0ERImR6iBGe/LX0O2cV9Pgi78hFp5WfNKeAg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.2" + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.2.tgz", - "integrity": "sha512-7xRO1lFNj1fGm+ik73n8TuWXKeAqTuqeApqnxWnW+nI2lPyj4awrt+n1XkQr8OwmVK7mFJSRuTZc568qtgOyzQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.2.tgz", - "integrity": "sha512-EBr+n9M2F7PQ02s0f87KnSPva0KlT2S4IGDP+7aYqt2FCaMZzCtXcVahGSGg3ESZBSD0gzFU4486zD7SUsSD0Q==", - "dev": true + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.2.tgz", - "integrity": "sha512-gS0trUUPYevbs5Rsv9E+VbzDuZ9KB4Tu/QymTfHtnSDpX4wxhs9u9/y/KiH84r0Z4xvm8/pqWnGvM77oxSPHYw==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.2.tgz", - "integrity": "sha512-HLHOR6/Vc+f5UziOUNQ3f5YedCMCuU46BdMEhjQBQwlOWqVAxgwqUn/KJkuhMvvjQ2FkASaDup8ohZrjyCKDKg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/helper-buffer": "1.8.2", - "@webassemblyjs/helper-wasm-bytecode": "1.8.2", - "@webassemblyjs/wasm-gen": "1.8.2" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" } }, "@webassemblyjs/ieee754": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.2.tgz", - "integrity": "sha512-v9RtqGJ+z8UweiRh47DheXVtV0d/o9sQfXzAX1/1n/nw5G85yEQJdHcmwiRdu+SXmqlZQeymsnmve2oianzW4g==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.2.tgz", - "integrity": "sha512-41zX+6xpo6G2bkq3mdr+K5nXx5OOL6V979ucbLyq1ra5dFI3ReLiw6+HOCF5ih0t5HMQVIQBhInZIdxqcpc/Qg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "dev": true, "requires": { - "long": "git://github.com/dcodeIO/long.js.git#8181a6b50a2a230f0b2a1e4c4093f9b9d19c8b69" + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.2.tgz", - "integrity": "sha512-fP2Q4igo9/R82xeVra+zIQOjnmknSiAhykg//fz7c1UjghzoutQtldcbKOaL0+0j31RRFMDHgrUL+12RQExOYg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.2.tgz", - "integrity": "sha512-rM1sgdLQrXQs4ZapglK86mW8QMml0FJ+jwZ5961sEmHISTkJRvheILuzA9jcKy5vwhWgkPf/nIhO2I6A9rkGww==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/helper-buffer": "1.8.2", - "@webassemblyjs/helper-wasm-bytecode": "1.8.2", - "@webassemblyjs/helper-wasm-section": "1.8.2", - "@webassemblyjs/wasm-gen": "1.8.2", - "@webassemblyjs/wasm-opt": "1.8.2", - "@webassemblyjs/wasm-parser": "1.8.2", - "@webassemblyjs/wast-printer": "1.8.2" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.2.tgz", - "integrity": "sha512-WTBesrMydDwJbbB48OZGcMq6zDsT6CJd1UalvGuXtHJLargazOron+JBdmt8Nnd+Z2s3TPfCPP54EpQBsDVR7Q==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/helper-wasm-bytecode": "1.8.2", - "@webassemblyjs/ieee754": "1.8.2", - "@webassemblyjs/leb128": "1.8.2", - "@webassemblyjs/utf8": "1.8.2" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.2.tgz", - "integrity": "sha512-tzXn0xNQNyoUBr1+O1rwYXZd2bcUdXSOUTu0fLAIPl01dcTY6hjIi2B2DXYqk9OVQRnjPyX2Ew6rkeCTxfaYaQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/helper-buffer": "1.8.2", - "@webassemblyjs/wasm-gen": "1.8.2", - "@webassemblyjs/wasm-parser": "1.8.2" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.2.tgz", - "integrity": "sha512-uc6nVjvUjZzHa8fSl0ko684puuw0ujfCYn19v5tTu0DQ7tXx9jlZXzYw0aW7fmROxyez7BcbJloYLmXg723vVQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/helper-api-error": "1.8.2", - "@webassemblyjs/helper-wasm-bytecode": "1.8.2", - "@webassemblyjs/ieee754": "1.8.2", - "@webassemblyjs/leb128": "1.8.2", - "@webassemblyjs/utf8": "1.8.2" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.2.tgz", - "integrity": "sha512-idk8cCqM+T6/iIxoQCOz85vKvWhyHghJbICob/H1AN8byN1O6a2Jxk+g1ZJA7sZDc6/q8pYV6dVkHKgm8y1oUA==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/floating-point-hex-parser": "1.8.2", - "@webassemblyjs/helper-api-error": "1.8.2", - "@webassemblyjs/helper-code-frame": "1.8.2", - "@webassemblyjs/helper-fsm": "1.8.2", - "long": "git://github.com/dcodeIO/long.js.git#8181a6b50a2a230f0b2a1e4c4093f9b9d19c8b69" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.2.tgz", - "integrity": "sha512-TENFBgf5bKKfs2LbW8fd/0xvamccbEHoR83lQlEP7Qi0nkpXAP77VpvIITy0J+UZAa/Y3j6K6MPw1tNMbdjf4A==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/wast-parser": "1.8.2", - "long": "git://github.com/dcodeIO/long.js.git#8181a6b50a2a230f0b2a1e4c4093f9b9d19c8b69" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, "@xtuc/ieee754": { @@ -241,10 +254,16 @@ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, "acorn": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.0.tgz", - "integrity": "sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true }, "acorn-dynamic-import": { @@ -291,9 +310,9 @@ } }, "ajv": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", - "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -314,6 +333,12 @@ "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -401,6 +426,16 @@ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -469,9 +504,9 @@ "dev": true }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-limiter": { @@ -560,15 +595,15 @@ "dev": true }, "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", "dev": true }, "bn.js": { @@ -723,9 +758,9 @@ "dev": true }, "builtin-modules": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", - "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, "builtin-status-codes": { @@ -774,9 +809,9 @@ } }, "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camel-case": { @@ -788,6 +823,12 @@ "upper-case": "^1.1.1" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -812,9 +853,9 @@ "dev": true }, "chokidar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.1.tgz", - "integrity": "sha512-gfw3p2oQV2wEt+8VuMlNsPjCxDxvvgnm/kz+uATu805mWVF8IJN7uz9DN7iBz+RMJISmiVbCOBFs9qBGMjtPfQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -828,7 +869,7 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.0" + "upath": "^1.1.1" } }, "chownr": { @@ -902,6 +943,23 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -928,9 +986,9 @@ "dev": true }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" }, "commondir": { "version": "1.0.1", @@ -1105,6 +1163,12 @@ "ms": "^2.1.1" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -1339,9 +1403,9 @@ "dev": true }, "eslint": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.0.tgz", - "integrity": "sha512-jrOhiYyENRrRnWlMYANlGZTqb89r2FuRT+615AabBoajhNjeh9ywDNlh2LU9vTqf0WYN+L3xdXuIi7xuj/tK9w==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1350,7 +1414,7 @@ "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", "espree": "^5.0.1", @@ -1364,7 +1428,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "inquirer": "^6.2.2", - "js-yaml": "^3.12.0", + "js-yaml": "^3.13.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", "lodash": "^4.17.11", @@ -1410,9 +1474,9 @@ } }, "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", "dev": true, "requires": { "debug": "^2.6.8", @@ -1437,21 +1501,22 @@ } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", "dev": true, "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", + "eslint-module-utils": "^2.4.0", "has": "^1.0.3", "lodash": "^4.17.11", "minimatch": "^3.0.4", "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" + "resolve": "^1.10.0" }, "dependencies": { "debug": { @@ -1482,9 +1547,9 @@ } }, "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1545,9 +1610,9 @@ "dev": true }, "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": "0.6.0", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", + "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", "dev": true }, "esutils": { @@ -1572,6 +1637,21 @@ "safe-buffer": "^5.1.1" } }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -1823,13 +1903,13 @@ } }, "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^1.0.0", + "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" }, "dependencies": { @@ -1853,9 +1933,9 @@ } }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -1871,9 +1951,9 @@ } }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "pkg-dir": { @@ -1896,6 +1976,23 @@ "locate-path": "^2.0.0" } }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -1967,14 +2064,14 @@ "dev": true }, "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -1986,7 +2083,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2007,12 +2105,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" @@ -2027,17 +2127,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2046,12 +2149,12 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { @@ -2154,7 +2257,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2166,6 +2270,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2180,6 +2285,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2187,12 +2293,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2211,29 +2319,30 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.4", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.3", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, @@ -2261,13 +2370,13 @@ } }, "npm-bundled": { - "version": "1.0.5", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.2.0", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -2291,7 +2400,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2303,6 +2413,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2388,7 +2499,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2403,7 +2515,7 @@ "optional": true }, "semver": { - "version": "5.6.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -2424,6 +2536,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2443,6 +2556,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2486,12 +2600,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2507,6 +2623,21 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -2549,21 +2680,9 @@ } }, "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "globalyzer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.4.tgz", - "integrity": "sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA==", - "dev": true - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { @@ -2674,17 +2793,17 @@ "dev": true }, "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" } }, "http-link-header": { @@ -2729,9 +2848,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "iferr": { @@ -2785,9 +2904,9 @@ "dev": true }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -2801,27 +2920,33 @@ "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^4.0.0" + "ansi-regex": "^4.1.0" } } } }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2933,9 +3058,9 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -2991,6 +3116,12 @@ "has": "^1.0.1" } }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -3031,9 +3162,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3088,11 +3219,20 @@ "dev": true }, "kleur": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.2.tgz", - "integrity": "sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -3154,10 +3294,14 @@ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, - "long": { - "version": "git://github.com/dcodeIO/long.js.git#8181a6b50a2a230f0b2a1e4c4093f9b9d19c8b69", - "from": "git://github.com/dcodeIO/long.js.git#8181a6b50a2a230f0b2a1e4c4093f9b9d19c8b69", - "dev": true + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } }, "lower-case": { "version": "1.1.4", @@ -3183,22 +3327,38 @@ } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "dependencies": { "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true } } }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3234,6 +3394,25 @@ "safe-buffer": "^5.1.2" } }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -3282,9 +3461,9 @@ } }, "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", + "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==", "dev": true }, "mimic-fn": { @@ -3369,69 +3548,92 @@ } }, "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", + "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", "dev": true, "requires": { + "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", + "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "glob": "7.1.2", + "find-up": "3.0.0", + "glob": "7.1.3", "growl": "1.10.5", - "he": "1.1.1", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", + "yargs-unparser": "1.5.0" }, "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "locate-path": "^3.0.0" } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -3483,9 +3685,9 @@ } }, "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true, "optional": true }, @@ -3534,10 +3736,28 @@ "lower-case": "^1.1.1" } }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.5.0.tgz", + "integrity": "sha512-YuZKluhWGJwCcUu4RlZstdAxr8bFfOVHakc1mplwHkk8J+tqM1Y5yraYvIUpeX8aY7+crCwiELJq7Vl0o0LWXw==", "dev": true }, "node-libs-browser": { @@ -3670,6 +3890,21 @@ } } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3722,6 +3957,28 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -3769,12 +4026,41 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -3800,9 +4086,9 @@ "dev": true }, "pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "dev": true }, "parallel-transform": { @@ -3825,9 +4111,9 @@ } }, "parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" @@ -3945,9 +4231,9 @@ "dev": true }, "pirates": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", - "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { "node-modules-regexp": "^1.0.0" @@ -3991,9 +4277,9 @@ "dev": true }, "pretty-bytes": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.1.0.tgz", - "integrity": "sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.2.0.tgz", + "integrity": "sha512-ujANBhiUsl9AhREUDUEY1GPOharMGm8x8juS7qOHybcLi7XsKfrYQ88hSly1l2i0klXHTDYrlL8ihMCG55Dc3w==", "dev": true }, "process": { @@ -4086,9 +4372,9 @@ "dev": true }, "puppeteer": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.12.2.tgz", - "integrity": "sha512-xWSyCeD6EazGlfnQweMpM+Hs6X6PhUYhNTHKFj/axNZDq4OmrVERf70isBf7HsnFgB3zOC1+23/8+wCAZYg+Pg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.15.0.tgz", + "integrity": "sha512-D2y5kwA9SsYkNUmcBzu9WZ4V1SGHiQTmgvDZSx6sRYFsgV25IebL4V6FaHjF6MbwLK9C6f3G3pmck9qmwM8H3w==", "dev": true, "requires": { "debug": "^4.1.0", @@ -4114,9 +4400,9 @@ "dev": true }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -4218,6 +4504,18 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "require-relative": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", @@ -4281,84 +4579,110 @@ } }, "rollup": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.2.0.tgz", - "integrity": "sha512-oHNv2NSX5y/rY6W8MuKW8BVQwpIfwfTNp4PJiQYR7cLcBYeR5wP0LsPqKNw3Heji6hYci5Nd53q/fVfTuNe3GA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.11.3.tgz", + "integrity": "sha512-81MR7alHcFKxgWzGfG7jSdv+JQxSOIOD/Fa3iNUmpzbd7p+V19e1l9uffqT8/7YAHgGOzmoPGN3Fx3L2ptOf5g==", "dev": true, "requires": { "@types/estree": "0.0.39", - "@types/node": "*", - "acorn": "^6.1.0" + "@types/node": "^11.13.9", + "acorn": "^6.1.1" + }, + "dependencies": { + "@types/node": { + "version": "11.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.10.tgz", + "integrity": "sha512-leUNzbFTMX94TWaIKz8N15Chu55F9QSH+INKayQr5xpkasBQBRF3qQXfo3/dOnMU/dEIit+Y/SU8HyOjq++GwA==", + "dev": true + } } }, "rollup-plugin-commonjs": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.2.0.tgz", - "integrity": "sha512-0RM5U4Vd6iHjL6rLvr3lKBwnPsaVml+qxOGaaNUWN1lSq6S33KhITOfHmvxV3z2vy9Mk4t0g4rNlVaJJsNQPWA==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", + "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", "dev": true, "requires": { - "estree-walker": "^0.5.2", - "magic-string": "^0.25.1", - "resolve": "^1.8.1", - "rollup-pluginutils": "^2.3.3" + "estree-walker": "^0.6.0", + "magic-string": "^0.25.2", + "resolve": "^1.10.0", + "rollup-pluginutils": "^2.6.0" + }, + "dependencies": { + "rollup-pluginutils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", + "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.0", + "micromatch": "^3.1.10" + } + } } }, "rollup-plugin-json": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-3.1.0.tgz", - "integrity": "sha512-BlYk5VspvGpjz7lAwArVzBXR60JK+4EKtPkCHouAWg39obk9S61hZYJDBfMK+oitPdoe11i69TlxKlMQNFC/Uw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", + "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", "dev": true, "requires": { - "rollup-pluginutils": "^2.3.1" + "rollup-pluginutils": "^2.5.0" + }, + "dependencies": { + "rollup-pluginutils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", + "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.0", + "micromatch": "^3.1.10" + } + } } }, "rollup-plugin-node-resolve": { - "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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.3.tgz", + "integrity": "sha512-r+WaesPzdGEynpLZLALFEDugA4ACa5zn7bc/+LVX4vAXQQ8IgDHv0xfsSvJ8tDXUtprfBtrDtRFg27ifKjcJTg==", "dev": true, "requires": { - "builtin-modules": "^3.0.0", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", "is-module": "^1.0.0", - "resolve": "^1.8.1" + "resolve": "^1.10.0" } }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", + "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==", "dev": true, "requires": { - "magic-string": "^0.25.1", - "minimatch": "^3.0.2", - "rollup-pluginutils": "^2.0.1" + "magic-string": "^0.25.2", + "rollup-pluginutils": "^2.6.0" + }, + "dependencies": { + "rollup-pluginutils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", + "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.0", + "micromatch": "^3.1.10" + } + } } }, "rollup-plugin-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-string/-/rollup-plugin-string-2.0.2.tgz", - "integrity": "sha1-9TI6Is/XOLRQy+piq2WTcF6sdEs=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-string/-/rollup-plugin-string-3.0.0.tgz", + "integrity": "sha512-vqyzgn9QefAgeKi+Y4A7jETeIAU1zQmS6VotH6bzm/zmUQEnYkpIGRaOBPY41oiWYV4JyBoGAaBjYMYuv+6wVw==", "dev": true, "requires": { - "rollup-pluginutils": "^1.5.0" - }, - "dependencies": { - "estree-walker": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", - "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", - "dev": true - }, - "rollup-pluginutils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", - "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", - "dev": true, - "requires": { - "estree-walker": "^0.2.1", - "minimatch": "^3.0.2" - } - } + "rollup-pluginutils": "^2.4.1" } }, "rollup-plugin-sucrase": { @@ -4425,9 +4749,9 @@ } }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz", + "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -4481,9 +4805,15 @@ "dev": true }, "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "set-value": { @@ -4564,14 +4894,13 @@ "dev": true }, "sirv": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.2.2.tgz", - "integrity": "sha512-X0UjfTc32MeK+rkhgdQK/blQ5ysC0CfLF9OH9d8x2RnpaD2D5BDLMeox79utmhxai4T+/VCahK5pDgAEnG/tNQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.4.0.tgz", + "integrity": "sha512-k/dcRW7Ry2VgERDiLyyq3peGZEnqP2EcTcG5646QjoLwz7lnDA50i20m/3Rn7J4FLtimyoKQsG4E2BItctwjhg==", "dev": true, "requires": { "@polka/url": "^0.5.0", - "mime": "^2.3.1", - "tiny-glob": "^0.2.0" + "mime": "^2.3.1" } }, "slice-ansi": { @@ -4738,9 +5067,9 @@ } }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4924,6 +5253,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -4931,23 +5266,15 @@ "dev": true }, "sucrase": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.9.5.tgz", - "integrity": "sha512-gvNjd3PJ0WAXxWUAQzCw/nlG4J5a2j7q8jN+sX8Fwe3ryIsl9UrEcWPxWoEzBPrj3Fias4U05iN84m4/IFQLdw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.10.1.tgz", + "integrity": "sha512-nMOs6rFWwkYRxcKHHDjyQmC5CmLbHN2LwRyWF1n2i0kb/pq0xcB9M19TdY5Ivfcj1BsWfs+az9Ga5B0tFdE5ww==", "dev": true, "requires": { "commander": "^2.19.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.0" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } } }, "supports-color": { @@ -4994,54 +5321,54 @@ }, "dependencies": { "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^4.0.0" + "ansi-regex": "^4.1.0" } } } }, "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, "terser": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", - "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "^2.19.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.9" + "source-map-support": "~0.5.10" } }, "terser-webpack-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz", - "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", "dev": true, "requires": { "cacache": "^11.0.2", @@ -5103,16 +5430,6 @@ "setimmediate": "^1.0.4" } }, - "tiny-glob": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.6.tgz", - "integrity": "sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw==", - "dev": true, - "requires": { - "globalyzer": "^0.1.0", - "globrex": "^0.1.1" - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -5207,11 +5524,11 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.10.tgz", + "integrity": "sha512-/GTF0nosyPLbdJBd+AwYiZ+Hu5z8KXWnO0WCGt1BQ/u9Iamhejykqmz5o1OHJ53+VAk6xVxychonnApDjuqGsw==", "requires": { - "commander": "~2.17.1", + "commander": "~2.20.0", "source-map": "~0.6.1" } }, @@ -5309,9 +5626,9 @@ } }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, "upper-case": { @@ -5404,15 +5721,15 @@ } }, "webpack": { - "version": "4.29.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.4.tgz", - "integrity": "sha512-Uu/QgPFZG+w+5wjWIFBgIy+g9vOF3QiLmT2Bl783MQSLjRF/K+GMv2TH3TVNFyPQVEHY8rVnPoQtcqrnqK2H7Q==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.30.0.tgz", + "integrity": "sha512-4hgvO2YbAFUhyTdlR4FNyt2+YaYBYHavyzjCMbZzgglo02rlKi/pcsEzwCuCpsn1ryzIl1cq/u8ArIKu8JBYMg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.2", - "@webassemblyjs/helper-module-context": "1.8.2", - "@webassemblyjs/wasm-edit": "1.8.2", - "@webassemblyjs/wasm-parser": "1.8.2", + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", "acorn": "^6.0.5", "acorn-dynamic-import": "^4.0.0", "ajv": "^6.1.0", @@ -5463,6 +5780,21 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -5470,14 +5802,61 @@ "dev": true }, "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { "errno": "~0.1.7" } }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -5494,9 +5873,9 @@ } }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -5520,6 +5899,204 @@ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "yauzl": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", diff --git a/package.json b/package.json index a823354..f7f404f 100644 --- a/package.json +++ b/package.json @@ -18,45 +18,45 @@ "test": "test" }, "dependencies": { - "html-minifier": "^3.5.21", + "html-minifier": "^4.0.0", "http-link-header": "^1.0.2", "shimport": "^1.0.0", "sourcemap-codec": "^1.4.4", "string-hash": "^1.1.3" }, "devDependencies": { - "@types/mocha": "^5.2.5", - "@types/node": "^10.12.21", - "@types/puppeteer": "^1.11.3", + "@types/mocha": "^5.2.6", + "@types/node": "^10.14.6", + "@types/puppeteer": "^1.12.4", "agadoo": "^1.0.1", "cheap-watch": "^1.0.2", "cookie": "^0.3.1", "devalue": "^1.1.0", - "eslint": "^5.12.1", - "eslint-plugin-import": "^2.16.0", - "kleur": "^3.0.1", - "mocha": "^5.2.0", - "node-fetch": "^2.3.0", + "eslint": "^5.16.0", + "eslint-plugin-import": "^2.17.2", + "kleur": "^3.0.3", + "mocha": "^6.1.4", + "node-fetch": "^2.5.0", "npm-run-all": "^4.1.5", - "polka": "^0.5.1", + "polka": "^0.5.2", "port-authority": "^1.0.5", - "pretty-bytes": "^5.1.0", - "puppeteer": "^1.12.0", + "pretty-bytes": "^5.2.0", + "puppeteer": "^1.15.0", "require-relative": "^0.8.7", - "rollup": "^1.1.2", - "rollup-plugin-commonjs": "^9.2.0", - "rollup-plugin-json": "^3.1.0", - "rollup-plugin-node-resolve": "^4.0.0", - "rollup-plugin-replace": "^2.1.0", - "rollup-plugin-string": "^2.0.2", + "rollup": "^1.11.3", + "rollup-plugin-commonjs": "^9.3.4", + "rollup-plugin-json": "^4.0.0", + "rollup-plugin-node-resolve": "^4.2.3", + "rollup-plugin-replace": "^2.2.0", + "rollup-plugin-string": "^3.0.0", "rollup-plugin-sucrase": "^2.1.0", "rollup-plugin-svelte": "^5.0.3", "sade": "^1.4.2", - "sirv": "^0.2.2", - "sucrase": "^3.9.5", + "sirv": "^0.4.0", + "sucrase": "^3.10.1", "svelte": "^3.0.0-beta.11", "svelte-loader": "^2.13.3", - "webpack": "^4.29.0", + "webpack": "^4.30.0", "webpack-format-messages": "^2.0.5", "yootils": "0.0.15" }, diff --git a/rollup.config.js b/rollup.config.js index dd6aa84..d548653 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,5 +1,5 @@ import sucrase from 'rollup-plugin-sucrase'; -import string from 'rollup-plugin-string'; +import { string } from 'rollup-plugin-string'; import json from 'rollup-plugin-json'; import resolve from 'rollup-plugin-node-resolve'; import commonjs from 'rollup-plugin-commonjs'; From 8fcc27d44fa509bc10cd638ccf924385559f96ce Mon Sep 17 00:00:00 2001 From: mrkishi Date: Sun, 5 May 2019 20:57:32 -0300 Subject: [PATCH 3/6] Update svelte to released v3 --- .travis.yml | 2 +- package-lock.json | 6 +++--- package.json | 4 ++-- test/apps/errors/src/routes/no-error.svelte | 8 ++++++-- test/apps/ignore/src/routes/_error.svelte | 9 +++++++-- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4ae37b3..b7f839d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: false language: node_js node_js: - - "11" + - "stable" env: global: diff --git a/package-lock.json b/package-lock.json index 47a3254..ae48475 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5287,9 +5287,9 @@ } }, "svelte": { - "version": "3.0.0-beta.11", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-beta.11.tgz", - "integrity": "sha512-NTk89Q1azXoG08qRDd9R9aM8+fylCSon1bPThsS2IWSqw7YEPPu2wv9p3VaZ5Eo4NubUDfnX/HXtwdGozSnjCg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.2.0.tgz", + "integrity": "sha512-i/FSWUcqVw9JBo9bY69/ZI89WCCpyhdWjvAroOroI4qnQboh0WGlgjnFOEKOTvlv1XONd8cVpRGbOYYE3Ec6TQ==", "dev": true }, "svelte-dev-helper": { diff --git a/package.json b/package.json index f7f404f..b8f69f3 100644 --- a/package.json +++ b/package.json @@ -54,14 +54,14 @@ "sade": "^1.4.2", "sirv": "^0.4.0", "sucrase": "^3.10.1", - "svelte": "^3.0.0-beta.11", + "svelte": "^3.2.0", "svelte-loader": "^2.13.3", "webpack": "^4.30.0", "webpack-format-messages": "^2.0.5", "yootils": "0.0.15" }, "peerDependencies": { - "svelte": "^3.0.0" + "svelte": "^3.2.0" }, "scripts": { "test": "mocha --opts mocha.opts", diff --git a/test/apps/errors/src/routes/no-error.svelte b/test/apps/errors/src/routes/no-error.svelte index 8dc116a..69c2065 100644 --- a/test/apps/errors/src/routes/no-error.svelte +++ b/test/apps/errors/src/routes/no-error.svelte @@ -1,3 +1,7 @@ -

{error ? error.message : 'No error here'}

- + + +

{error ? error.message : 'No error here'}

+ Enhance your calm \ No newline at end of file diff --git a/test/apps/ignore/src/routes/_error.svelte b/test/apps/ignore/src/routes/_error.svelte index 4cd55d2..bec41f1 100644 --- a/test/apps/ignore/src/routes/_error.svelte +++ b/test/apps/ignore/src/routes/_error.svelte @@ -1,3 +1,8 @@ -

{status}

- + + +

{status}

+

{error.message}

\ No newline at end of file From 629b5601c8e00710e8a0646ec9ad1dabe1dfaf72 Mon Sep 17 00:00:00 2001 From: Cristian Lorsson Date: Mon, 6 May 2019 20:46:32 -0300 Subject: [PATCH 4/6] Don't add hashes to dist output Default is '[name].[hash].js' --- rollup.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index dd6aa84..4ed024f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -52,7 +52,8 @@ export default [ output: { dir: 'dist', format: 'cjs', - sourcemap: true + sourcemap: true, + chunkFileNames: '[name].js' }, external, plugins: [ From e6c1a54164e75df2cf836afed888acbb9af6dc44 Mon Sep 17 00:00:00 2001 From: mrkishi Date: Wed, 8 May 2019 00:57:59 -0300 Subject: [PATCH 5/6] Harden tests (...a bit) --- .gitignore | 4 - test/apps/AppRunner.ts | 169 +++++++++---- test/apps/basics/src/server.js | 7 +- test/apps/basics/test.ts | 229 +++++++++--------- test/apps/common.js | 42 ++++ test/apps/credentials/src/server.js | 7 +- test/apps/credentials/test.ts | 47 ++-- test/apps/css/src/server.js | 9 +- test/apps/css/test.ts | 67 ++--- test/apps/encoding/src/server.js | 9 +- test/apps/encoding/test.ts | 51 ++-- test/apps/errors/src/server.js | 9 +- test/apps/errors/test.ts | 108 ++++----- test/apps/export-webpack/src/server.js | 12 +- test/apps/export-webpack/test.ts | 8 +- test/apps/export/src/server.js | 12 +- test/apps/export/test.ts | 9 +- test/apps/ignore/src/server.js | 4 +- test/apps/ignore/test.ts | 38 +-- test/apps/layout/src/server.js | 9 +- test/apps/layout/test.ts | 40 ++- test/apps/preloading/src/server.js | 9 +- test/apps/preloading/test.ts | 116 +++++---- test/apps/redirects/src/server.js | 9 +- test/apps/redirects/test.ts | 123 +++++----- test/apps/scroll/src/server.js | 9 +- test/apps/scroll/test.ts | 84 +++---- test/apps/session/src/server.js | 9 +- test/apps/session/test.ts | 50 ++-- test/apps/with-basepath/src/server.js | 13 +- test/apps/with-basepath/test.ts | 67 +++-- .../with-sourcemaps-webpack/src/server.js | 9 +- test/apps/with-sourcemaps-webpack/test.ts | 7 +- test/apps/with-sourcemaps/src/server.js | 9 +- test/apps/with-sourcemaps/test.ts | 7 +- 35 files changed, 726 insertions(+), 685 deletions(-) create mode 100644 test/apps/common.js diff --git a/.gitignore b/.gitignore index 910b5f3..e25b13b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,11 +3,7 @@ yarn.lock yarn-error.log node_modules cypress/screenshots -test/app/.sapper -test/app/src/manifest __sapper__ -test/app/export -test/app/build sapper runtime.js dist diff --git a/test/apps/AppRunner.ts b/test/apps/AppRunner.ts index 0a3d51b..9874583 100644 --- a/test/apps/AppRunner.ts +++ b/test/apps/AppRunner.ts @@ -1,49 +1,77 @@ import * as path from 'path'; import puppeteer from 'puppeteer'; -import * as ports from 'port-authority'; import { fork, ChildProcess } from 'child_process'; +import { AddressInfo } from 'net'; + +import { wait } from '../utils' + +const DEFAULT_ENTRY = '__sapper__/build/server/server.js'; +const DELAY = parseInt(process.env.SAPPER_TEST_DELAY) || 50; declare const start: () => Promise; declare const prefetchRoutes: () => Promise; declare const prefetch: (href: string) => Promise; declare const goto: (href: string) => Promise; -type StartOpts = { - requestInterceptor?: (interceptedRequst: puppeteer.Request) => any -}; - export class AppRunner { - cwd: string; - entry: string; - port: number; - proc: ChildProcess; + exiting: boolean; + terminate: Promise; + + server: ChildProcess; + address: AddressInfo; + base: string; messages: any[]; + errors: Error[]; browser: puppeteer.Browser; page: puppeteer.Page; - constructor(cwd: string, entry: string) { - this.cwd = cwd; - this.entry = path.join(cwd, entry); + sapper = { + start: () => this.page.evaluate(() => start()).then(() => void 0), + prefetchRoutes: () => this.page.evaluate(() => prefetchRoutes()).then(() => void 0), + prefetch: (href: string) => this.page.evaluate((href: string) => prefetch(href), href).then(() => void 0), + goto: (href: string) => this.page.evaluate((href: string) => goto(href), href).then(() => void 0) + }; + + constructor() { this.messages = []; + this.errors = []; } - async start({ requestInterceptor }: StartOpts = {}) { - this.port = await ports.find(3000); + async start(cwd: string, entry: string = DEFAULT_ENTRY) { + const server_listening = deferred(); + const server_closed = deferred(); + const browser_closed = deferred(); - this.proc = fork(this.entry, [], { - cwd: this.cwd, - env: { - PORT: String(this.port) + this.terminate = Promise.all([server_closed, browser_closed]); + + this.server = fork(path.join(cwd, entry), [], { cwd }); + this.server.on('exit', () => { + server_listening.reject(); + server_closed.settle(this.exiting); + }); + this.server.on('message', message => { + if (!message.__sapper__) return; + + switch (message.event) { + case 'listening': + this.address = message.address; + this.base = `http://localhost:${this.address.port}`; + + server_listening.resolve(); + break; + + case 'error': + this.errors.push(Object.assign(new Error(), message.error)); + break; + + default: + this.messages.push(message); } }); - this.proc.on('message', message => { - if (!message.__sapper__) return; - this.messages.push(message); - }); - this.browser = await puppeteer.launch({ args: ['--no-sandbox'] }); + this.browser.on('disconnected', () => browser_closed.settle(this.exiting)); this.page = await this.browser.newPage(); this.page.on('console', msg => { @@ -54,25 +82,28 @@ export class AppRunner { } }); - if (requestInterceptor) { - await this.page.setRequestInterception(true); - this.page.on('request', requestInterceptor); - } + await server_listening; - return { - page: this.page, - base: `http://localhost:${this.port}`, - - // helpers - start: () => this.page.evaluate(() => start()).then(() => void 0), - prefetchRoutes: () => this.page.evaluate(() => prefetchRoutes()).then(() => void 0), - prefetch: (href: string) => this.page.evaluate((href: string) => prefetch(href), href).then(() => void 0), - goto: (href: string) => this.page.evaluate((href: string) => goto(href), href).then(() => void 0), - title: () => this.page.$eval('h1', node => node.textContent).then(serializable => String(serializable)) - }; + return this; } - capture(fn: () => any): Promise { + load(url: string) { + if (url[0] === '/') { + url = `${this.base}${url}`; + } + + return this.page.goto(url); + } + + text(selector: string) { + return this.page.$eval(selector, node => node.textContent); + } + + wait(extra_ms: number = 0) { + return wait(DELAY + extra_ms); + } + + capture_requests(fn: () => any): Promise { return new Promise((fulfil, reject) => { const requests: string[] = []; const pending: Set = new Set(); @@ -120,13 +151,55 @@ export class AppRunner { }); } - end() { - return Promise.all([ - this.browser.close(), - new Promise(fulfil => { - this.proc.once('exit', fulfil); - this.proc.kill(); - }) - ]); + async intercept_requests(interceptor: (request: puppeteer.Request) => void, fn: () => any): Promise { + const unique_interceptor = request => interceptor(request); + + this.page.prependListener('request', unique_interceptor); + await this.page.setRequestInterception(true); + + const result = await Promise.resolve(fn()); + + await this.page.setRequestInterception(false); + this.page.removeListener('request', unique_interceptor); + + return result; } -} \ No newline at end of file + + end() { + this.exiting = true; + + this.server.kill(); + this.browser.close(); + + return this.terminate; + } +} + +interface Deferred extends Promise { + resolve: (value?: T | PromiseLike) => void; + reject: (reason?: any) => void; + settle: (result?: boolean) => void; +} + +function settle(this: Deferred, result: boolean) { + if (result) { + this.resolve(); + } else { + this.reject(); + } +} + +function deferred() { + let resolve, reject; + + const deferred = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }) as Deferred; + + deferred.resolve = resolve; + deferred.reject = reject; + deferred.settle = settle; + + return deferred; +} diff --git a/test/apps/basics/src/server.js b/test/apps/basics/src/server.js index 7f090b8..c839a8b 100644 --- a/test/apps/basics/src/server.js +++ b/test/apps/basics/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() +const app = polka() .use(sapper.middleware()) - .listen(PORT); + +start(app); diff --git a/test/apps/basics/test.ts b/test/apps/basics/test.ts index 53cced3..9f24a8c 100644 --- a/test/apps/basics/test.ts +++ b/test/apps/basics/test.ts @@ -1,23 +1,23 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import * as http from 'http'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -import { wait } from '../../utils'; declare let deleted: { id: number }; declare let el: any; -function get(url: string, opts?: any): Promise<{ headers: Record, body: string }> { +type Response = { headers: http.IncomingHttpHeaders, body: string }; + +function get(url: string, opts: http.RequestOptions = {}): Promise { return new Promise((fulfil, reject) => { - const req = http.get(url, opts || {}, res => { + const req = http.get(url, opts, res => { res.on('error', reject); let body = ''; res.on('data', chunk => body += chunk); res.on('end', () => { fulfil({ - headers: res.headers as Record, + headers: res.headers, body }); }); @@ -30,114 +30,104 @@ function get(url: string, opts?: any): Promise<{ headers: Record describe('basics', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let prefetch: (href: string) => Promise; - let goto: (href: string) => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto, title } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('serves /', async () => { - await page.goto(base); + await r.load('/'); assert.equal( - await title(), + await r.text('h1'), 'Great success!' ); }); it('serves /?', async () => { - await page.goto(`${base}?`); + await r.load('/?'); assert.equal( - await title(), + await r.text('h1'), 'Great success!' ); }); it('serves static route', async () => { - await page.goto(`${base}/a`); + await r.load('/a'); assert.equal( - await title(), + await r.text('h1'), 'a' ); }); it('serves static route from dir/index.html file', async () => { - await page.goto(`${base}/b`); + await r.load('/b'); assert.equal( - await title(), + await r.text('h1'), 'b' ); }); it('serves dynamic route', async () => { - await page.goto(`${base}/test-slug`); + await r.load('/test-slug'); assert.equal( - await title(), + await r.text('h1'), 'TEST-SLUG' ); }); it('navigates to a new page without reloading', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - const requests: string[] = await runner.capture(async () => { - await page.click('a[href="a"]'); + const requests: string[] = await r.capture_requests(async () => { + await r.page.click('a[href="a"]'); + await r.wait(); }); assert.deepEqual(requests, []); assert.equal( - await title(), + await r.text('h1'), 'a' ); }); it('navigates programmatically', async () => { - await page.goto(`${base}/a`); - await start(); - - await goto('b'); + await r.load('/a'); + await r.sapper.start(); + await r.sapper.goto('b'); assert.equal( - await title(), + await r.text('h1'), 'b' ); }); it('prefetches programmatically', async () => { - await page.goto(`${base}/a`); - await start(); + await r.load(`/a`); + await r.sapper.start(); - const requests = await runner.capture(() => prefetch('b')); + const requests = await r.capture_requests(() => r.sapper.prefetch('b')); assert.equal(requests.length, 2); - assert.equal(requests[1], `${base}/b.json`); + assert.equal(requests[1], `${r.base}/b.json`); }); // TODO equivalent test for a webpack app it('sets Content-Type, Link...modulepreload, and Cache-Control headers', async () => { - const { headers } = await get(base); + const { headers } = await get(r.base); assert.equal( headers['content-type'], @@ -157,162 +147,163 @@ describe('basics', function() { }); it('calls a delete handler', async () => { - await page.goto(`${base}/delete-test`); - await start(); + await r.load('/delete-test'); + await r.sapper.start(); - await page.click('.del'); - await page.waitForFunction(() => deleted); + await r.page.click('.del'); + await r.page.waitForFunction(() => deleted); - assert.equal(await page.evaluate(() => deleted.id), 42); + assert.equal(await r.page.evaluate(() => deleted.id), 42); }); it('hydrates initial route', async () => { - await page.goto(base); + await r.load('/'); - await page.evaluate(() => { + await r.page.evaluate(() => { el = document.querySelector('.hydrate-test'); }); - await start(); + await r.sapper.start(); - assert.ok(await page.evaluate(() => { + assert.ok(await r.page.evaluate(() => { return document.querySelector('.hydrate-test') === el; })); }); it('does not attempt client-side navigation to server routes', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click(`[href="ambiguous/ok.json"]`); - await wait(50); + await r.page.click('[href="ambiguous/ok.json"]'); + await r.wait(); assert.equal( - await page.evaluate(() => document.body.textContent), + await r.text('body'), 'ok' ); }); it('allows reserved words as route names', async () => { - await page.goto(`${base}/const`); - await start(); + await r.load('/const'); + await r.sapper.start(); assert.equal( - await title(), + await r.text('h1'), 'reserved words are okay as routes' ); }); it('accepts value-less query string parameter on server', async () => { - await page.goto(`${base}/echo-query?message`); + await r.load('/echo-query?message'); assert.equal( - await title(), + await r.text('h1'), '{"message":""}' ); }); it('accepts value-less query string parameter on client', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('a[href="echo-query?message"]') + await r.page.click('a[href="echo-query?message"]'); + await r.wait(); assert.equal( - await title(), + await r.text('h1'), '{"message":""}' ); }); it('accepts duplicated query string parameter on server', async () => { - await page.goto(`${base}/echo-query?p=one&p=two`); + await r.load('/echo-query?p=one&p=two'); assert.equal( - await title(), + await r.text('h1'), '{"p":["one","two"]}' ); }); it('accepts duplicated query string parameter on client', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('a[href="echo-query?p=one&p=two"]') + await r.page.click('a[href="echo-query?p=one&p=two"]') assert.equal( - await title(), + await r.text('h1'), '{"p":["one","two"]}' ); }); // skipped because Nightmare doesn't seem to focus the correctly it('resets the active element after navigation', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="a"]'); - await wait(50); + await r.page.click('[href="a"]'); + await r.wait(); assert.equal( - await page.evaluate(() => document.activeElement.nodeName), + await r.page.evaluate(() => document.activeElement.nodeName), 'BODY' ); }); it('replaces %sapper.xxx% tags safely', async () => { - await page.goto(`${base}/unsafe-replacement`); - await start(); + await r.load('/unsafe-replacement'); + await r.sapper.start(); - const html = String(await page.evaluate(() => document.body.innerHTML)); + const html = String(await r.page.evaluate(() => document.body.innerHTML)); assert.equal(html.indexOf('%sapper'), -1); }); it('navigates between routes with empty parts', async () => { - await page.goto(`${base}/dirs/foo`); - await start(); + await r.load('/dirs/foo'); + await r.sapper.start(); - assert.equal(await title(), 'foo'); + assert.equal(await r.text('h1'), 'foo'); - await page.click('[href="dirs/bar"]'); - await wait(50); - assert.equal(await title(), 'bar'); + await r.page.click('[href="dirs/bar"]'); + await r.wait(); + assert.equal(await r.text('h1'), 'bar'); }); it('navigates to ...rest', async () => { - await page.goto(`${base}/abc/xyz`); - await start(); + await r.load('/abc/xyz'); + await r.sapper.start(); - assert.equal(await title(), 'abc,xyz'); + assert.equal(await r.text('h1'), 'abc,xyz'); - await page.click('[href="xyz/abc/deep"]'); - await wait(50); - assert.equal(await title(), 'xyz,abc'); + await r.page.click('[href="xyz/abc/deep"]'); + await r.wait(); + assert.equal(await r.text('h1'), 'xyz,abc'); - await page.click(`[href="xyz/abc/qwe/deep.json"]`); - await wait(50); + await r.page.click('[href="xyz/abc/qwe/deep.json"]'); + await r.wait(); assert.equal( - await page.evaluate(() => document.body.textContent), + await r.text('body'), 'xyz,abc,qwe' ); }); it('navigates between dynamic routes with same segments', async () => { - await page.goto(`${base}/dirs/bar/xyz`); - await start(); + await r.load('/dirs/bar/xyz'); + await r.sapper.start(); - assert.equal(await title(), 'A page'); + assert.equal(await r.text('h1'), 'A page'); - await page.click('[href="dirs/foo/xyz"]'); - await wait(50); - assert.equal(await title(), 'B page'); + await r.page.click('[href="dirs/foo/xyz"]'); + await r.wait(); + assert.equal(await r.text('h1'), 'B page'); }); it('runs server route handlers before page handlers, if they match', async () => { - const json = await get(`${base}/middleware`, { + const json = await get(`${r.base}/middleware`, { headers: { 'Accept': 'application/json' } @@ -320,22 +311,26 @@ describe('basics', function() { assert.equal(json.body, '{"json":true}'); - const html = await get(`${base}/middleware`); + const html = await get(`${r.base}/middleware`); assert.ok(html.body.indexOf('

HTML

') !== -1); }); it('invalidates page when a segment is skipped', async () => { - await page.goto(`${base}/skipped/x/1`); - await start(); - await prefetchRoutes(); + await r.load('/skipped/x/1'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('a[href="skipped/y/1"]'); - await wait(50); + await r.page.click('a[href="skipped/y/1"]'); + await r.wait(); assert.equal( - await title(), + await r.text('h1'), 'y:1' ); }); + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); }); diff --git a/test/apps/common.js b/test/apps/common.js new file mode 100644 index 0000000..5425f42 --- /dev/null +++ b/test/apps/common.js @@ -0,0 +1,42 @@ +const { NODE_ENV, PORT } = process.env; + +export const dev = NODE_ENV === 'development'; + +export function start(app) { + const port = parseInt(PORT) || 0; + + app.listen(port, () => { + const address = app.server.address(); + + process.env.PORT = address.port; + + send({ + __sapper__: true, + event: 'listening', + address + }); + }); +} + +const properties = ['name', 'message', 'stack', 'code', 'lineNumber', 'fileName']; + +function send(message) { + process.send && process.send(message); +} + +function send_error(error) { + send({ + __sapper__: true, + event: 'error', + error: properties.reduce((object, key) => ({...object, [key]: error[key]}), {}) + }) +} + +process.on('unhandledRejection', (reason, p) => { + send_error(reason); +}); + +process.on('uncaughtException', err => { + send_error(err); + process.exitCode = 1; +}); diff --git a/test/apps/credentials/src/server.js b/test/apps/credentials/src/server.js index 951243e..1067cb3 100644 --- a/test/apps/credentials/src/server.js +++ b/test/apps/credentials/src/server.js @@ -1,13 +1,14 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() +const app = polka() .use((req, res, next) => { // set test cookie res.setHeader('Set-Cookie', ['a=1; Max-Age=3600', 'b=2; Max-Age=3600']); next(); }) .use(sapper.middleware()) - .listen(PORT); + +start(app); diff --git a/test/apps/credentials/test.ts b/test/apps/credentials/test.ts index 665f46c..67f39c0 100644 --- a/test/apps/credentials/test.ts +++ b/test/apps/credentials/test.ts @@ -1,59 +1,54 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; -import { wait } from '../../utils'; import { AppRunner } from '../AppRunner'; describe('credentials', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('sends cookies when using this.fetch with credentials: "include"', async () => { - await page.goto(`${base}/credentials?creds=include`); + await r.load('/credentials?creds=include'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), 'a: 1, b: 2, max-age: undefined' ); }); it('does not send cookies when using this.fetch without credentials', async () => { - await page.goto(`${base}/credentials`); + await r.load('/credentials'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), 'unauthorized' ); }); it('delegates to fetch on the client', async () => { - await page.goto(base) - await start(); - await prefetchRoutes(); + await r.load('/') + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="credentials?creds=include"]'); - await wait(50); + await r.page.click('[href="credentials?creds=include"]'); + await r.wait(); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), 'a: 1, b: 2, max-age: undefined' ); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/css/src/server.js b/test/apps/css/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/css/src/server.js +++ b/test/apps/css/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/css/test.ts b/test/apps/css/test.ts index c6539af..01e7095 100644 --- a/test/apps/css/test.ts +++ b/test/apps/css/test.ts @@ -1,78 +1,61 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -import { wait } from '../../utils'; describe('css', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let prefetch: (href: string) => Promise; - let goto: (href: string) => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto, title } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('includes critical CSS with server render', async () => { - await page.goto(base); + await r.load('/'); assert.equal( - await page.evaluate(() => { - const h1 = document.querySelector('h1'); - return getComputedStyle(h1).color; - }), + await r.page.$eval('h1', node => getComputedStyle(node).color), 'rgb(255, 0, 0)' ); }); it('loads CSS when navigating client-side', async () => { - await page.goto(base); + await r.load('/'); - await start(); - await prefetchRoutes(); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click(`[href="foo"]`); - await wait(50); + await r.page.click(`[href="foo"]`); + await r.wait(); assert.equal( - await page.evaluate(() => { - const h1 = document.querySelector('h1'); - return getComputedStyle(h1).color; - }), + await r.page.$eval('h1', node => getComputedStyle(node).color), 'rgb(0, 0, 255)' ); }); it('loads CSS for a lazily-rendered component', async () => { - await page.goto(base); + await r.load('/'); - await start(); - await prefetchRoutes(); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click(`[href="bar"]`); - await wait(50); + await r.page.click(`[href="bar"]`); + await r.wait(); assert.equal( - await page.evaluate(() => { - const h1 = document.querySelector('h1'); - return getComputedStyle(h1).color; - }), + await r.page.$eval('h1', node => getComputedStyle(node).color), 'rgb(0, 128, 0)' ); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/encoding/src/server.js b/test/apps/encoding/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/encoding/src/server.js +++ b/test/apps/encoding/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/encoding/test.ts b/test/apps/encoding/test.ts index 157615a..0d51b64 100644 --- a/test/apps/encoding/test.ts +++ b/test/apps/encoding/test.ts @@ -1,68 +1,63 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -import { wait } from '../../utils'; describe('encoding', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('encodes routes', async () => { - await page.goto(`${base}/fünke`); + await r.load('/fünke'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), `I'm afraid I just blue myself` ); }); it('encodes req.params and req.query for server-rendered pages', async () => { - await page.goto(`${base}/echo/page/encöded?message=hëllö+wörld&föo=bar&=baz&tel=%2B123456789`); + await r.load('/echo/page/encöded?message=hëllö+wörld&föo=bar&=baz&tel=%2B123456789'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), 'encöded {"message":"hëllö wörld","föo":"bar","":"baz","tel":"+123456789"}' ); }); it('encodes req.params and req.query for client-rendered pages', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('a'); - await wait(50); + await r.page.click('a'); + await r.wait(); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), 'encöded {"message":"hëllö wörld","föo":"bar","":"baz","tel":"+123456789"}' ); }); it('encodes req.params for server routes', async () => { - await page.goto(`${base}/echo/server-route/encöded`); + await r.load('/echo/server-route/encöded'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), 'encöded' ); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/errors/src/server.js b/test/apps/errors/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/errors/src/server.js +++ b/test/apps/errors/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/errors/test.ts b/test/apps/errors/test.ts index d69470c..181c591 100644 --- a/test/apps/errors/test.ts +++ b/test/apps/errors/test.ts @@ -1,5 +1,4 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; import { wait } from '../../utils'; @@ -7,142 +6,137 @@ import { wait } from '../../utils'; describe('errors', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, title } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('handles missing route on server', async () => { - await page.goto(`${base}/nope`); + await r.load('/nope'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), '404' ); }); it('handles missing route on client', async () => { - await page.goto(base); - await start(); + await r.load('/'); + await r.sapper.start(); - await page.click('[href="nope"]'); - await wait(50); + await r.page.click('[href="nope"]'); + await r.wait(); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), '404' ); }); it('handles explicit 4xx on server', async () => { - await page.goto(`${base}/blog/nope`); + await r.load('/blog/nope'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), '404' ); }); it('handles explicit 4xx on client', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="blog/nope"]'); - await wait(50); + await r.page.click('[href="blog/nope"]'); + await r.wait(); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), '404' ); }); it('handles error on server', async () => { - await page.goto(`${base}/throw`); + await r.load('/throw'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), '500' ); }); it('handles error on client', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="throw"]'); - await wait(50); + await r.page.click('[href="throw"]'); + await r.wait(); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), '500' ); }); it('does not serve error page for explicit non-page errors', async () => { - await page.goto(`${base}/nope.json`); + await r.load('/nope.json'); assert.equal( - await page.evaluate(() => document.body.textContent), + await r.text('body'), 'nope' ); }); it('does not serve error page for thrown non-page errors', async () => { - await page.goto(`${base}/throw.json`); + await r.load('/throw.json'); assert.equal( - await page.evaluate(() => document.body.textContent), + await r.text('body'), 'oops' ); }); it('execute error page hooks', async () => { - await page.goto(`${base}/some-throw-page`); - await start(); - await wait(50); + await r.load('/some-throw-page'); + await r.sapper.start(); assert.equal( - await page.$eval('h2', node => node.textContent), + await r.text('h2'), 'success' ); }) it('does not serve error page for async non-page error', async () => { - await page.goto(`${base}/async-throw.json`); + await r.load('/async-throw.json'); assert.equal( - await page.evaluate(() => document.body.textContent), + await r.text('body'), 'oops' ); }); it('clears props.error on successful render', async () => { - await page.goto(`${base}/no-error`); - await start(); - await prefetchRoutes(); + await r.load('/no-error'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="enhance-your-calm"]'); - await wait(50); - assert.equal(await title(), '420'); + await r.page.click('[href="enhance-your-calm"]'); + await r.wait(); + assert.equal(await r.text('h1'), '420'); - await page.goBack(); - await wait(50); - assert.equal(await title(), 'No error here'); + await r.page.goBack(); + await r.wait(); + assert.equal(await r.text('h1'), 'No error here'); + }); + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); }); }); diff --git a/test/apps/export-webpack/src/server.js b/test/apps/export-webpack/src/server.js index 2c6932d..4ccaf34 100644 --- a/test/apps/export-webpack/src/server.js +++ b/test/apps/export-webpack/src/server.js @@ -2,14 +2,12 @@ import sirv from 'sirv'; import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT, NODE_ENV } = process.env; -const dev = NODE_ENV === 'development'; +import { start, dev } from '../../common.js'; -polka() +const app = polka() .use( sirv('static', { dev }), sapper.middleware() - ) - .listen(PORT, err => { - if (err) console.log('error', err); - }); + ); + +start(app); diff --git a/test/apps/export-webpack/test.ts b/test/apps/export-webpack/test.ts index 44abb78..30c3f49 100644 --- a/test/apps/export-webpack/test.ts +++ b/test/apps/export-webpack/test.ts @@ -6,14 +6,12 @@ describe('export-webpack', function() { this.timeout(10000); // hooks - before(async () => { - await api.build({ cwd: __dirname, bundler: 'webpack' }); - await api.export({ cwd: __dirname, bundler: 'webpack' }); - }); + before('build app', () => api.build({ cwd: __dirname, bundler: 'webpack' })); + before('export app', () => api.export({ cwd: __dirname })); + // tests it('injects tags', () => { const index = fs.readFileSync(`${__dirname}/__sapper__/export/index.html`, 'utf8'); assert.ok(/rel=preload/.test(index)); }); - }); diff --git a/test/apps/export/src/server.js b/test/apps/export/src/server.js index 2c6932d..4ccaf34 100644 --- a/test/apps/export/src/server.js +++ b/test/apps/export/src/server.js @@ -2,14 +2,12 @@ import sirv from 'sirv'; import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT, NODE_ENV } = process.env; -const dev = NODE_ENV === 'development'; +import { start, dev } from '../../common.js'; -polka() +const app = polka() .use( sirv('static', { dev }), sapper.middleware() - ) - .listen(PORT, err => { - if (err) console.log('error', err); - }); + ); + +start(app); diff --git a/test/apps/export/test.ts b/test/apps/export/test.ts index 98e7601..181096c 100644 --- a/test/apps/export/test.ts +++ b/test/apps/export/test.ts @@ -6,11 +6,10 @@ describe('export', function() { this.timeout(10000); // hooks - before(async () => { - await api.build({ cwd: __dirname }); - await api.export({ cwd: __dirname }); - }); + before('build app', () => api.build({ cwd: __dirname })); + before('export app', () => api.export({ cwd: __dirname })); + // tests it('crawls a site', () => { const files = walk(`${__dirname}/__sapper__/export`); @@ -45,4 +44,4 @@ describe('export', function() { }); // TODO test timeout, basepath -}); \ No newline at end of file +}); diff --git a/test/apps/ignore/src/server.js b/test/apps/ignore/src/server.js index 4a66815..950c214 100644 --- a/test/apps/ignore/src/server.js +++ b/test/apps/ignore/src/server.js @@ -1,7 +1,7 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; const app = polka().use(sapper.middleware({ ignore: [ @@ -16,4 +16,4 @@ const app = polka().use(sapper.middleware({ app.get('/'+uri, (req, res) => res.end(uri)); }); -app.listen(PORT); +start(app); diff --git a/test/apps/ignore/test.ts b/test/apps/ignore/test.ts index 6ec8616..641c5a4 100644 --- a/test/apps/ignore/test.ts +++ b/test/apps/ignore/test.ts @@ -1,58 +1,58 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; describe('ignore', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('respects `options.ignore` values (RegExp)', async () => { - await page.goto(`${base}/foobar`); + await r.load('/foobar'); assert.equal( - await page.evaluate(() => document.documentElement.textContent), + await r.text('body'), 'foobar' ); }); it('respects `options.ignore` values (String #1)', async () => { - await page.goto(`${base}/buzz`); + await r.load('/buzz'); assert.equal( - await page.evaluate(() => document.documentElement.textContent), + await r.text('body'), 'buzz' ); }); it('respects `options.ignore` values (String #2)', async () => { - await page.goto(`${base}/fizzer`); + await r.load('/fizzer'); assert.equal( - await page.evaluate(() => document.documentElement.textContent), + await r.text('body'), 'fizzer' ); }); it('respects `options.ignore` values (Function)', async () => { - await page.goto(`${base}/hello`); + await r.load('/hello'); assert.equal( - await page.evaluate(() => document.documentElement.textContent), + await r.text('body'), 'hello' ); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/layout/src/server.js b/test/apps/layout/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/layout/src/server.js +++ b/test/apps/layout/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/layout/test.ts b/test/apps/layout/test.ts index 86a6d3a..7f57408 100644 --- a/test/apps/layout/test.ts +++ b/test/apps/layout/test.ts @@ -1,33 +1,25 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -import { wait } from '../../utils'; describe('layout', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('only recreates components when necessary', async () => { - await page.goto(`${base}/foo/bar/baz`); + await r.load('/foo/bar/baz'); - const text1 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + const text1 = await r.text('#sapper'); assert.deepEqual(text1.split('\n').map(str => str.trim()).filter(Boolean), [ 'y: bar 1', 'z: baz 1', @@ -35,8 +27,8 @@ describe('layout', function() { 'child segment: baz' ]); - await start(); - const text2 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + await r.sapper.start(); + const text2 = await r.text('#sapper'); assert.deepEqual(text2.split('\n').map(str => str.trim()).filter(Boolean), [ 'y: bar 1', 'z: baz 1', @@ -44,10 +36,10 @@ describe('layout', function() { 'child segment: baz' ]); - await page.click('[href="foo/bar/qux"]'); - await wait(50); + await r.page.click('[href="foo/bar/qux"]'); + await r.wait(); - const text3 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + const text3 = await r.text('#sapper'); assert.deepEqual(text3.split('\n').map(str => str.trim()).filter(Boolean), [ 'y: bar 1', 'z: qux 2', @@ -55,4 +47,8 @@ describe('layout', function() { 'child segment: qux' ]); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/preloading/src/server.js b/test/apps/preloading/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/preloading/src/server.js +++ b/test/apps/preloading/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/preloading/test.ts b/test/apps/preloading/test.ts index 97f68b7..4aa05fb 100644 --- a/test/apps/preloading/test.ts +++ b/test/apps/preloading/test.ts @@ -1,7 +1,5 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; -import { wait } from '../../utils'; import { AppRunner } from '../AppRunner'; declare const fulfil: () => Promise; @@ -9,112 +7,106 @@ declare const fulfil: () => Promise; describe('preloading', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, title } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('serializes Set objects returned from preload', async () => { - await page.goto(`${base}/preload-values/set`); + await r.load('/preload-values/set'); - assert.equal(await title(), 'true'); + assert.equal(await r.text('h1'), 'true'); - await start(); - assert.equal(await title(), 'true'); + await r.sapper.start(); + assert.equal(await r.text('h1'), 'true'); }); it('prevent crash if preload return nothing', async () => { - await page.goto(`${base}/preload-nothing`); + await r.load('/preload-nothing'); - await start(); - await wait(50); + await r.sapper.start(); - assert.equal(await title(), 'Page loaded'); + assert.equal(await r.text('h1'), 'Page loaded'); }); it('bails on custom classes returned from preload', async () => { - await page.goto(`${base}/preload-values/custom-class`); + await r.load('/preload-values/custom-class'); - assert.equal(await title(), '42'); + assert.equal(await r.text('h1'), '42'); - await start(); - assert.equal(await title(), '42'); + await r.sapper.start(); + assert.equal(await r.text('h1'), '42'); }); it('sets preloading true when appropriate', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('a[href="slow-preload"]'); + await r.page.click('a[href="slow-preload"]'); - assert.ok(await page.evaluate(() => !!document.querySelector('progress'))); + assert.ok(await r.page.evaluate(() => !!document.querySelector('progress'))); - await page.evaluate(() => fulfil()); - assert.ok(await page.evaluate(() => !document.querySelector('progress'))); + await r.page.evaluate(() => fulfil()); + assert.ok(await r.page.evaluate(() => !document.querySelector('progress'))); }); it('runs preload in root component', async () => { - await page.goto(`${base}/preload-root`); - assert.equal(await title(), 'root preload function ran: true'); + await r.load('/preload-root'); + assert.equal(await r.text('h1'), 'root preload function ran: true'); }); it('cancels navigation if subsequent navigation occurs during preload', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('a[href="slow-preload"]'); - await wait(100); - await page.click('a[href="foo"]'); + await r.page.click('a[href="slow-preload"]'); + await r.wait(); + await r.page.click('a[href="foo"]'); - assert.equal(page.url(), `${base}/foo`); - assert.equal(await title(), 'foo'); + assert.equal(r.page.url(), `${r.base}/foo`); + assert.equal(await r.text('h1'), 'foo'); - await page.evaluate(() => fulfil()); - await wait(100); - assert.equal(page.url(), `${base}/foo`); - assert.equal(await title(), 'foo'); + await r.page.evaluate(() => fulfil()); + await r.wait(); + assert.equal(r.page.url(), `${r.base}/foo`); + assert.equal(await r.text('h1'), 'foo'); }); it('navigates to prefetched urls', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.hover('a[href="prefetch/qwe"]'); - await wait(100); - await page.hover('a[href="prefetch/xyz"]'); - await wait(100); + await r.page.hover('a[href="prefetch/qwe"]'); + await r.wait(50); + await r.page.hover('a[href="prefetch/xyz"]'); + await r.wait(50); - await page.click('a[href="prefetch/qwe"]'); - await wait(50); + await r.page.click('a[href="prefetch/qwe"]'); + await r.wait(); assert.equal( - await title(), + await r.text('h1'), 'qwe' ); - await page.goto(`${base}/prefetch`); - await wait(50); + await r.load('/prefetch'); assert.equal( - await title(), + await r.text('h1'), 'prefetch' ); }); + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); }); diff --git a/test/apps/redirects/src/server.js b/test/apps/redirects/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/redirects/src/server.js +++ b/test/apps/redirects/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/redirects/test.ts b/test/apps/redirects/test.ts index 50d6507..1d8f125 100644 --- a/test/apps/redirects/test.ts +++ b/test/apps/redirects/test.ts @@ -2,138 +2,137 @@ import * as assert from 'assert'; import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -import { wait } from '../../utils'; describe('redirects', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, title } = await runner.start({ - requestInterceptor: (interceptedRequest) => { - if (/example\.com/.test(interceptedRequest.url())) { - interceptedRequest.respond({ - status: 200, - contentType: 'text/html', - body: `

external

` - }); - } else { - interceptedRequest.continue(); - } - } - })); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('redirects on server', async () => { - await page.goto(`${base}/redirect-from`); + await r.load('/redirect-from'); assert.equal( - page.url(), - `${base}/redirect-to` + r.page.url(), + `${r.base}/redirect-to` ); assert.equal( - await title(), + await r.text('h1'), 'redirected' ); }); it('redirects in client', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="redirect-from"]'); - await wait(50); + await r.page.click('[href="redirect-from"]'); + await r.wait(); assert.equal( - page.url(), - `${base}/redirect-to` + r.page.url(), + `${r.base}/redirect-to` ); assert.equal( - await title(), + await r.text('h1'), 'redirected' ); }); it('redirects to root on server', async () => { - await page.goto(`${base}/redirect-to-root`); + await r.load('/redirect-to-root'); assert.equal( - page.url(), - `${base}/` + r.page.url(), + `${r.base}/` ); assert.equal( - await title(), + await r.text('h1'), 'root' ); }); it('redirects to root in client', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="redirect-to-root"]'); - await wait(50); + await r.page.click('[href="redirect-to-root"]'); + await r.wait(); assert.equal( - page.url(), - `${base}/` + r.page.url(), + `${r.base}/` ); assert.equal( - await title(), + await r.text('h1'), 'root' ); }); + const interceptor = (request: puppeteer.Request) => { + if (/example\.com/.test(request.url())) { + request.respond({ + status: 200, + contentType: 'text/html', + body: `

external

` + }); + } else { + request.continue(); + } + }; + it('redirects to external URL on server', async () => { - await page.goto(`${base}/redirect-to-external`); + await r.intercept_requests(interceptor, async () => { + await r.load('/redirect-to-external'); + }); assert.equal( - page.url(), + r.page.url(), `https://example.com/` ); assert.equal( - await title(), + await r.text('h1'), 'external' ); }); it('redirects to external URL in client', async () => { - await page.goto(base); - await start(); - await prefetchRoutes(); + await r.load('/'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="redirect-to-external"]'); - await wait(50); + await r.intercept_requests(interceptor, async () => { + await r.page.click('[href="redirect-to-external"]'); + await r.wait(); + }); assert.equal( - page.url(), + r.page.url(), `https://example.com/` ); assert.equal( - await title(), + await r.text('h1'), 'external' ); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/scroll/src/server.js b/test/apps/scroll/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/scroll/src/server.js +++ b/test/apps/scroll/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/scroll/test.ts b/test/apps/scroll/test.ts index 11130ff..f787d18 100644 --- a/test/apps/scroll/test.ts +++ b/test/apps/scroll/test.ts @@ -1,93 +1,87 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -import { wait } from '../../utils'; describe('scroll', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, title } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('scrolls to active deeplink', async () => { - await page.goto(`${base}/tall-page#foo`); - await start(); + await r.load('/tall-page#foo'); + await r.sapper.start(); - const scrollY = await page.evaluate(() => window.scrollY); + const scrollY = await r.page.evaluate(() => window.scrollY); assert.ok(scrollY > 0, String(scrollY)); }); it('scrolls to any deeplink if it was already active', async () => { - await page.goto(`${base}/tall-page#foo`); - await start(); + await r.load('/tall-page#foo'); + await r.sapper.start(); - let scrollY = await page.evaluate(() => window.scrollY); + let scrollY = await r.page.evaluate(() => window.scrollY); assert.ok(scrollY > 0, String(scrollY)); - scrollY = await page.evaluate(() => { + scrollY = await r.page.evaluate(() => { window.scrollTo(0, 0) return window.scrollY }); assert.ok(scrollY === 0, String(scrollY)); - await page.click('[href="tall-page#foo"]'); - scrollY = await page.evaluate(() => window.scrollY); + await r.page.click('[href="tall-page#foo"]'); + scrollY = await r.page.evaluate(() => window.scrollY); assert.ok(scrollY > 0, String(scrollY)); }); it('resets scroll when a link is clicked', async () => { - await page.goto(`${base}/tall-page#foo`); - await start(); - await prefetchRoutes(); + await r.load('/tall-page#foo'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="another-tall-page"]'); - await wait(50); + await r.page.click('[href="another-tall-page"]'); + await r.wait(); assert.equal( - await page.evaluate(() => window.scrollY), + await r.page.evaluate(() => window.scrollY), 0 ); }); it('preserves scroll when a link with sapper-noscroll is clicked', async () => { - await page.goto(`${base}/tall-page#foo`); - await start(); - await prefetchRoutes(); + await r.load('/tall-page#foo'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="another-tall-page"][sapper-noscroll]'); - await wait(50); + await r.page.click('[href="another-tall-page"][sapper-noscroll]'); + await r.wait(); - const scrollY = await page.evaluate(() => window.scrollY); + const scrollY = await r.page.evaluate(() => window.scrollY); assert.ok(scrollY > 0); }); it('scrolls into a deeplink on a new page', async () => { - await page.goto(`${base}/tall-page#foo`); - await start(); - await prefetchRoutes(); + await r.load('/tall-page#foo'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="another-tall-page#bar"]'); - await wait(50); - assert.equal(await title(), 'Another tall page'); - const scrollY = await page.evaluate(() => window.scrollY); + await r.page.click('[href="another-tall-page#bar"]'); + await r.wait(); + assert.equal(await r.text('h1'), 'Another tall page'); + const scrollY = await r.page.evaluate(() => window.scrollY); assert.ok(scrollY > 0); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/session/src/server.js b/test/apps/session/src/server.js index 16d904e..9e1cdeb 100644 --- a/test/apps/session/src/server.js +++ b/test/apps/session/src/server.js @@ -1,9 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() +const app = polka() .use((req, res, next) => { req.hello = 'hello'; res.locals = { name: 'world' }; @@ -15,5 +15,6 @@ polka() title: `${req.hello} ${res.locals.name}` }) }) - ) - .listen(PORT); + ); + +start(app); diff --git a/test/apps/session/test.ts b/test/apps/session/test.ts index 3fd910f..6dbfec7 100644 --- a/test/apps/session/test.ts +++ b/test/apps/session/test.ts @@ -1,50 +1,46 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; describe('session', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, title } = await runner.start()); + before('build app', () => build({ cwd: __dirname })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('renders session props', async () => { - await page.goto(`${base}/session`); + await r.load('/session'); - assert.equal(await title(), 'hello world'); + assert.equal(await r.text('h1'), 'hello world'); - await start(); - assert.equal(await title(), 'hello world'); + await r.sapper.start(); + assert.equal(await r.text('h1'), 'hello world'); - await page.click('button'); - assert.equal(await title(), 'changed'); + await r.page.click('button'); + assert.equal(await r.text('h1'), 'changed'); }); it('preloads session props', async () => { - await page.goto(`${base}/preloaded`); + await r.load('/preloaded'); - assert.equal(await title(), 'hello world'); + assert.equal(await r.text('h1'), 'hello world'); - await start(); - assert.equal(await title(), 'hello world'); + await r.sapper.start(); + assert.equal(await r.text('h1'), 'hello world'); - await page.click('button'); - assert.equal(await title(), 'changed'); + await r.page.click('button'); + assert.equal(await r.text('h1'), 'changed'); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/with-basepath/src/server.js b/test/apps/with-basepath/src/server.js index 22da3e9..8e8a064 100644 --- a/test/apps/with-basepath/src/server.js +++ b/test/apps/with-basepath/src/server.js @@ -2,15 +2,14 @@ import sirv from 'sirv'; import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT, NODE_ENV } = process.env; -const dev = NODE_ENV === 'development'; +import { start, dev } from '../../common.js'; -polka() +const app = polka() .use( 'custom-basepath', sirv('static', { dev }), sapper.middleware() - ) - .listen(PORT, err => { - if (err) console.log('error', err); - }); + ); + +start(app); + diff --git a/test/apps/with-basepath/test.ts b/test/apps/with-basepath/test.ts index a81875d..0aae2fe 100644 --- a/test/apps/with-basepath/test.ts +++ b/test/apps/with-basepath/test.ts @@ -1,51 +1,36 @@ import * as assert from 'assert'; -import * as puppeteer from 'puppeteer'; import * as api from '../../../api'; import { walk } from '../../utils'; import { AppRunner } from '../AppRunner'; -import { wait } from '../../utils'; - describe('with-basepath', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let title: () => Promise; + let r: AppRunner; // hooks - before(async () => { - await api.build({ cwd: __dirname }); - - await api.export({ - cwd: __dirname, - basepath: '/custom-basepath' - }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, start, page, prefetchRoutes, title } = await runner.start()); + before('build app', () => api.build({ cwd: __dirname })); + before('export app', () => api.export({ cwd: __dirname, basepath: '/custom-basepath' })); + before('start runner', async () => { + r = await new AppRunner().start(__dirname); }); - after(() => runner.end()); + after(() => r && r.end()); + // tests it('serves /custom-basepath', async () => { - await page.goto(`${base}/custom-basepath`); + await r.load('/custom-basepath'); assert.equal( - await page.$eval('h1', node => node.textContent), + await r.text('h1'), 'Great success!' ); }); it('emits a basepath message', async () => { - await page.goto(`${base}/custom-basepath`); + await r.load('/custom-basepath'); - assert.deepEqual(runner.messages, [{ + assert.deepEqual(r.messages, [{ __sapper__: true, event: 'basepath', basepath: '/custom-basepath' @@ -71,35 +56,39 @@ describe('with-basepath', function() { }); it('redirects on server', async () => { - await page.goto(`${base}/custom-basepath/redirect-from`); + await r.load('/custom-basepath/redirect-from'); assert.equal( - page.url(), - `${base}/custom-basepath/redirect-to` + r.page.url(), + `${r.base}/custom-basepath/redirect-to` ); assert.equal( - await title(), + await r.text('h1'), 'redirected' ); }); it('redirects in client', async () => { - await page.goto(`${base}/custom-basepath`); - await start(); - await prefetchRoutes(); + await r.load('/custom-basepath'); + await r.sapper.start(); + await r.sapper.prefetchRoutes(); - await page.click('[href="redirect-from"]'); - await wait(50); + await r.page.click('[href="redirect-from"]'); + await r.wait(); assert.equal( - page.url(), - `${base}/custom-basepath/redirect-to` + r.page.url(), + `${r.base}/custom-basepath/redirect-to` ); assert.equal( - await title(), + await r.text('h1'), 'redirected' ); }); -}); \ No newline at end of file + + it('survives the tests with no server errors', () => { + assert.deepEqual(r.errors, []); + }); +}); diff --git a/test/apps/with-sourcemaps-webpack/src/server.js b/test/apps/with-sourcemaps-webpack/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/with-sourcemaps-webpack/src/server.js +++ b/test/apps/with-sourcemaps-webpack/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/with-sourcemaps-webpack/test.ts b/test/apps/with-sourcemaps-webpack/test.ts index d270919..15b4fd1 100644 --- a/test/apps/with-sourcemaps-webpack/test.ts +++ b/test/apps/with-sourcemaps-webpack/test.ts @@ -7,10 +7,9 @@ describe('with-sourcemaps-webpack', function() { this.timeout(10000); // hooks - before(async () => { - await build({ cwd: __dirname, bundler: 'webpack' }); - }); + before('build app', () => build({ cwd: __dirname, bundler: 'webpack' })); + // tests it('does not put sourcemap files in service worker shell', async () => { const service_worker_source = fs.readFileSync(`${__dirname}/src/node_modules/@sapper/service-worker.js`, 'utf-8'); const shell_source = /shell = (\[[\s\S]+?\])/.exec(service_worker_source)[1]; @@ -23,4 +22,4 @@ describe('with-sourcemaps-webpack', function() { const sourcemapFiles = fs.readdirSync(clientShellDir).filter(_ => _.endsWith('.map')); assert.ok(sourcemapFiles.length > 0, 'sourcemap files exist'); }); -}); \ No newline at end of file +}); diff --git a/test/apps/with-sourcemaps/src/server.js b/test/apps/with-sourcemaps/src/server.js index 7f090b8..e33d804 100644 --- a/test/apps/with-sourcemaps/src/server.js +++ b/test/apps/with-sourcemaps/src/server.js @@ -1,8 +1,9 @@ import polka from 'polka'; import * as sapper from '@sapper/server'; -const { PORT } = process.env; +import { start } from '../../common.js'; -polka() - .use(sapper.middleware()) - .listen(PORT); +const app = polka() + .use(sapper.middleware()); + +start(app); diff --git a/test/apps/with-sourcemaps/test.ts b/test/apps/with-sourcemaps/test.ts index 2d05958..969bf9e 100644 --- a/test/apps/with-sourcemaps/test.ts +++ b/test/apps/with-sourcemaps/test.ts @@ -7,10 +7,9 @@ describe('with-sourcemaps', function() { this.timeout(10000); // hooks - before(async () => { - await build({ cwd: __dirname }); - }); + before('build app', () => build({ cwd: __dirname })); + // tests it('does not put sourcemap files in service worker shell', async () => { const service_worker_source = fs.readFileSync(`${__dirname}/src/node_modules/@sapper/service-worker.js`, 'utf-8'); const shell_source = /shell = (\[[\s\S]+?\])/.exec(service_worker_source)[1]; @@ -23,4 +22,4 @@ describe('with-sourcemaps', function() { const sourcemapFiles = fs.readdirSync(clientShellDir).filter(_ => _.endsWith('.map')); assert.ok(sourcemapFiles.length > 0, 'sourcemap files exist'); }); -}); \ No newline at end of file +}); From 54e92c3b99d8a402cd057e853c231a417b641fbd Mon Sep 17 00:00:00 2001 From: mrkishi Date: Sun, 5 May 2019 03:40:58 -0300 Subject: [PATCH 6/6] Regularize page and server routes Treats both page and server routes similarly in regards to indexes. It's a (somewhat) breaking change: server routes will accept trailing slashes to match page routes behavior, but only if there's no extension. We still need a stronger support for dealing with different clean urls rules. --- runtime/src/app/app.ts | 6 +- src/core/create_manifest_data.ts | 79 +++++++++---------- .../samples/basic/index.js | 0 test/unit/create_manifest_data/test.ts | 11 ++- 4 files changed, 52 insertions(+), 44 deletions(-) create mode 100644 test/unit/create_manifest_data/samples/basic/index.js diff --git a/runtime/src/app/app.ts b/runtime/src/app/app.ts index 3056b31..3f5e8e1 100644 --- a/runtime/src/app/app.ts +++ b/runtime/src/app/app.ts @@ -101,7 +101,11 @@ export function select_target(url: URL): Target { if (url.origin !== location.origin) return null; if (!url.pathname.startsWith(initial_data.baseUrl)) return null; - const path = url.pathname.slice(initial_data.baseUrl.length); + let path = url.pathname.slice(initial_data.baseUrl.length); + + if (path === '') { + path = '/'; + } // avoid accidental clashes between server routes and page routes if (ignore.some(pattern => pattern.test(path))) return; diff --git a/src/core/create_manifest_data.ts b/src/core/create_manifest_data.ts index 12cabe2..f7e2853 100644 --- a/src/core/create_manifest_data.ts +++ b/src/core/create_manifest_data.ts @@ -86,6 +86,7 @@ export default function create_manifest_data(cwd: string): ManifestData { const parts = get_parts(segment); const is_index = is_dir ? false : basename.startsWith('index.'); const is_page = component_extensions.indexOf(ext) !== -1; + const route_suffix = basename.slice(basename.indexOf('.'), -ext.length); parts.forEach(part => { if (/\]\[/.test(part.content)) { @@ -104,7 +105,8 @@ export default function create_manifest_data(cwd: string): ManifestData { file: posixify(file), is_dir, is_index, - is_page + is_page, + route_suffix }; }) .filter(Boolean) @@ -113,25 +115,25 @@ export default function create_manifest_data(cwd: string): ManifestData { items.forEach(item => { const segments = parent_segments.slice(); - if (item.is_index && segments.length > 0) { - const suffix = item.basename - .slice(0, -item.ext.length) - .replace('index', ''); + if (item.is_index) { + if (item.route_suffix) { + if (segments.length > 0) { + const last_segment = segments[segments.length - 1].slice(); + const last_part = last_segment[last_segment.length - 1]; - if (suffix) { - const last_segment = segments[segments.length - 1].slice(); - const last_part = last_segment[last_segment.length - 1]; + if (last_part.dynamic) { + last_segment.push({ dynamic: false, content: item.route_suffix }); + } else { + last_segment[last_segment.length - 1] = { + dynamic: false, + content: `${last_part.content}${item.route_suffix}` + }; + } - if (last_part.dynamic) { - last_segment.push({ dynamic: false, content: suffix }); + segments[segments.length - 1] = last_segment; } else { - last_segment[last_segment.length - 1] = { - dynamic: false, - content: `${last_part.content}${suffix}` - }; + segments.push(item.parts); } - - segments[segments.length - 1] = last_segment; } } else { segments.push(item.parts); @@ -156,8 +158,6 @@ export default function create_manifest_data(cwd: string): ManifestData { } else if (item.is_page) { - const is_index = item.basename === `index${item.ext}`; - const component = { name: get_slug(item.file), file: item.file, @@ -166,22 +166,20 @@ export default function create_manifest_data(cwd: string): ManifestData { components.push(component); - const parts = (is_index && stack[stack.length - 1] === null) + const parts = (item.is_index && stack[stack.length - 1] === null) ? stack.slice(0, -1).concat({ component, params }) : stack.concat({ component, params }) - const page = { - pattern: get_pattern(is_index ? parent_segments : segments, true), + pages.push({ + pattern: get_pattern(segments, true), parts - }; - - pages.push(page); + }); } else { server_routes.push({ name: `route_${get_slug(item.file)}`, - pattern: get_pattern(segments, false), + pattern: get_pattern(segments, !item.route_suffix), file: item.file, params: params }); @@ -321,7 +319,6 @@ function get_parts(part: string): Part[] { function get_slug(file: string) { let name = file .replace(/[\\\/]index/, '') - .replace(/_default([\/\\index])?\.html$/, 'index') .replace(/[\/\\]/g, '_') .replace(/\.\w+$/, '') .replace(/\[([^(]+)(?:\([^(]+\))?\]/, '$$$1') @@ -334,19 +331,19 @@ function get_slug(file: string) { } function get_pattern(segments: Part[][], add_trailing_slash: boolean) { - return new RegExp( - `^` + - segments.map(segment => { - return '\\/' + segment.map(part => { - return part.dynamic - ? part.qualifier || part.spread ? '(.+)' : '([^\\/]+?)' - : encodeURI(part.content.normalize()) - .replace(/\?/g, '%3F') - .replace(/#/g, '%23') - .replace(/%5B/g, '[') - .replace(/%5D/g, ']'); - }).join(''); - }).join('') + - (add_trailing_slash ? '\\\/?$' : '$') - ); + const path = segments.map(segment => { + return segment.map(part => { + return part.dynamic + ? part.qualifier || part.spread ? '(.+)' : '([^\\/]+?)' + : encodeURI(part.content.normalize()) + .replace(/\?/g, '%3F') + .replace(/#/g, '%23') + .replace(/%5B/g, '[') + .replace(/%5D/g, ']'); + }).join(''); + }).join('\\/'); + + const trailing = add_trailing_slash && segments.length ? '\\/?$' : '$'; + + return new RegExp(`^\\/${path}${trailing}`); } diff --git a/test/unit/create_manifest_data/samples/basic/index.js b/test/unit/create_manifest_data/samples/basic/index.js new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/create_manifest_data/test.ts b/test/unit/create_manifest_data/test.ts index 7286dbe..01f7714 100644 --- a/test/unit/create_manifest_data/test.ts +++ b/test/unit/create_manifest_data/test.ts @@ -20,7 +20,7 @@ describe('manifest_data', () => { assert.deepEqual(pages, [ { - pattern: /^\/?$/, + pattern: /^\/$/, parts: [ { component: index, params: [] } ] @@ -50,6 +50,13 @@ describe('manifest_data', () => { ]); assert.deepEqual(server_routes, [ + { + name: 'route_index', + pattern: /^\/$/, + file: 'index.js', + params: [] + }, + { name: 'route_blog_json', pattern: /^\/blog.json$/, @@ -167,7 +174,7 @@ describe('manifest_data', () => { file: 'foo.js', name: 'route_foo', params: [], - pattern: /^\/foo$/ + pattern: /^\/foo\/?$/ }]); }); });