diff --git a/api.js b/api.js index 9746681bf..719e27065 100644 --- a/api.js +++ b/api.js @@ -1 +1 @@ -module.exports = require('./dist/api.ts.js'); \ No newline at end of file +module.exports = require('./dist/api.js'); \ No newline at end of file diff --git a/config/rollup.js b/config/rollup.js new file mode 100644 index 000000000..3b5c8be48 --- /dev/null +++ b/config/rollup.js @@ -0,0 +1 @@ +module.exports = require('../dist/rollup.js'); \ No newline at end of file diff --git a/config/webpack.js b/config/webpack.js new file mode 100644 index 000000000..15b21cfdf --- /dev/null +++ b/config/webpack.js @@ -0,0 +1 @@ +module.exports = require('../dist/webpack.js'); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 09025f7b3..529a633b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.17.0", + "version": "0.17.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -55,9 +55,9 @@ "dev": true }, "@types/node": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.7.1.tgz", - "integrity": "sha512-EGoI4ylB/lPOaqXqtzAyL8HcgOuCtH2hkEaLmkueOYufsTFWBn4VCvlCDC2HW8Q+9iF+QVC3sxjDKQYjHQeZ9w==", + "version": "10.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.3.tgz", + "integrity": "sha512-DOzWZKUnmFYG0KUOs+9HEBju2QhBU6oM2zeluunQNt0vnJvnkHvtDNlQPZDkTrkC5pZrNx1TPqeL137zciXZMQ==", "dev": true }, "@types/rimraf": { @@ -340,9 +340,9 @@ } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz", + "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==", "dev": true }, "acorn-dynamic-import": { @@ -415,6 +415,282 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, "aproba": { @@ -433,10 +709,13 @@ } }, "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } }, "arr-flatten": { "version": "1.1.0", @@ -496,9 +775,9 @@ "dev": true }, "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, "arrify": { @@ -608,7 +887,7 @@ "dependencies": { "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -688,6 +967,18 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -768,32 +1059,14 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "brorand": { @@ -955,6 +1228,14 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "caller-path": { @@ -1024,9 +1305,9 @@ } }, "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": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -1065,6 +1346,104 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0", "upath": "^1.0.5" + }, + "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "chownr": { @@ -1118,6 +1497,12 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, @@ -1127,13 +1512,6 @@ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "requires": { "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "cli-cursor": { @@ -1180,18 +1558,18 @@ } }, "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "1.1.1" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "combined-stream": { @@ -1468,7 +1846,7 @@ "dependencies": { "lodash": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.0.1.tgz", "integrity": "sha1-FNSQKKOLx0AkHRHi7NV+wG1zwZo=", "dev": true } @@ -1550,6 +1928,18 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -1670,9 +2060,9 @@ "dev": true }, "electron": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-1.8.7.tgz", - "integrity": "sha512-q6dn8bspX8u8z6tNU4bEas6ZrdNavnrjJ6d/oz49Nb4zFIPrdh8p29AFjFlSAavypGwAVR/PhYOAGwzZSQSSVQ==", + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-1.8.8.tgz", + "integrity": "sha512-1f9zJehcTTGjrkb06o6ds+gsRq6SYhZJyxOk6zIWjRH8hVy03y/RzUDELzNas71f5vcvXmfGVvyjeEsadDI8tg==", "dev": true, "requires": { "@types/node": "^8.0.24", @@ -1681,9 +2071,9 @@ }, "dependencies": { "@types/node": { - "version": "8.10.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.26.tgz", - "integrity": "sha512-opk6bLLErLSwyVVJeSH5Ek7ZWOBSsN0JrvXTNVGLXLAXKB9xlTYajrplR44xVyMrmbut94H6uJ9jqzM/12jxkA==", + "version": "8.10.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.28.tgz", + "integrity": "sha512-iHsAzDg3OLH7JP+wipniUULHoDSWLgEDYOvsar6/mpAkTJd9/n23Ap8ikruMlvRTqMv/LXrflH9v/AfiEqaBGg==", "dev": true } } @@ -2056,38 +2446,12 @@ } }, "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2097,48 +2461,6 @@ "dev": true, "requires": { "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "express": { @@ -2226,68 +2548,12 @@ } }, "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "is-extglob": "^1.0.0" } }, "extract-zip": { @@ -2361,26 +2627,16 @@ "dev": true }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "finalhandler": { @@ -3130,9 +3386,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3151,53 +3407,15 @@ "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^2.0.0" } }, "globals": { @@ -3293,6 +3511,14 @@ "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "has-values": { @@ -3305,6 +3531,26 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -3408,9 +3654,9 @@ "dev": true }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -3512,17 +3758,6 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-arrayish": { @@ -3568,17 +3803,6 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-date-object": { @@ -3628,9 +3852,9 @@ "dev": true }, "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-finite": { @@ -3649,12 +3873,12 @@ "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": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "^1.0.0" } }, "is-module": { @@ -3664,23 +3888,12 @@ "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-path-cwd": { @@ -3714,6 +3927,14 @@ "dev": true, "requires": { "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "is-posix-bracket": { @@ -3786,10 +4007,13 @@ "dev": true }, "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } }, "isstream": { "version": "0.1.2", @@ -3896,10 +4120,13 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } }, "klaw": { "version": "1.3.1", @@ -3911,9 +4138,9 @@ } }, "kleur": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.1.tgz", - "integrity": "sha512-Zq/jyANIJ2uX8UZjWlqLwbyhcxSXJtT/Y89lClyeZd3l++3ztL1I5SSCYrbcbwSunTjC88N3WuMk0kRDQD6gzA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", "dev": true }, "levn": { @@ -4230,24 +4457,24 @@ "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "miller-rabin": { @@ -4267,18 +4494,18 @@ "dev": true }, "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", "dev": true }, "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", "dev": true, "requires": { - "mime-db": "~1.35.0" + "mime-db": "~1.36.0" } }, "mimic-fn": { @@ -4393,7 +4620,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -4434,6 +4661,20 @@ "ms": "2.0.0" } }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -4487,9 +4728,9 @@ "dev": true }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", "dev": true, "optional": true }, @@ -4510,6 +4751,26 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "natural-compare": { @@ -4531,9 +4792,9 @@ "dev": true }, "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "nightmare": { @@ -4783,15 +5044,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } } } }, @@ -4808,6 +5060,14 @@ "dev": true, "requires": { "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "object.omit": { @@ -4827,6 +5087,14 @@ "dev": true, "requires": { "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "on-finished": { @@ -4969,23 +5237,6 @@ "is-dotfile": "^1.0.0", "is-extglob": "^1.0.0", "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "parse-json": { @@ -5345,6 +5596,12 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -5678,9 +5935,9 @@ } }, "rollup": { - "version": "0.59.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.59.4.tgz", - "integrity": "sha512-ISiMqq/aJa+57QxX2MRcvLESHdJ7wSavmr6U1euMr+6UgFe6KM+3QANrYy8LQofwhTC1I7BcAdlLnDiaODs1BA==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.65.0.tgz", + "integrity": "sha512-en95i7zwW5IiWay6DR/6QV8TxO2LvWuCjHYDcgP96oVG/gPnWWzsxNViObhoJUs17bAj2RgB67WuBuGmysZZcw==", "dev": true, "requires": { "@types/estree": "0.0.39", @@ -5688,9 +5945,9 @@ } }, "rollup-plugin-commonjs": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.5.tgz", - "integrity": "sha512-Hy7KbvsSMNu6aCO2xabp8gBcWrTiS+EzfHkzWwZwMjrcAYuYfCLU7fP1nM4xM0FMye/13r8mzTkfb9AmDaZ1hQ==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.6.tgz", + "integrity": "sha512-J7GOJm9uzEeLqkVxYSgjyoieh34hATWpa9G2M1ilGzWOLYGfQx5IDQ9ewG8QUj/Z2dzgV+d0/AyloAzElkABAA==", "dev": true, "requires": { "estree-walker": "^0.5.1", @@ -5785,7 +6042,7 @@ }, "typescript": { "version": "1.8.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-1.8.10.tgz", + "resolved": "http://registry.npmjs.org/typescript/-/typescript-1.8.10.tgz", "integrity": "sha1-tHXW4N/wv1DyluXKbvn7tccyDx4=", "dev": true } @@ -5799,97 +6056,6 @@ "requires": { "estree-walker": "^0.5.2", "micromatch": "^2.3.11" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } } }, "run-async": { @@ -6132,6 +6298,11 @@ "jsonify": "~0.0.0" } }, + "shimport": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/shimport/-/shimport-0.0.9.tgz", + "integrity": "sha512-y0DHz5ffBuz+iXUQgkqjT3yJRuegeyhHeDdqVdDMVDCeuS0Ex6AFPLFNV228EfPQmkDumraLsN9HBcT1qyLxHw==" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -6226,6 +6397,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -6277,6 +6454,18 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -6287,17 +6476,6 @@ "dev": true, "requires": { "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "source-list-map": { @@ -6307,10 +6485,9 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { "version": "0.5.2", @@ -6326,19 +6503,12 @@ } }, "source-map-support": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz", - "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "source-map-url": { @@ -6630,9 +6800,9 @@ "dev": true }, "svelte": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-2.11.0.tgz", - "integrity": "sha512-lIgtxDkGzLNppVNRtn+t2GZzyumxQj6f/Ola+z7fT6bmisTUxKTFf3wUzOwNcYkQWNIOk2/NkzIa/UO4JQO/bg==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-2.13.2.tgz", + "integrity": "sha512-b27mBrxCR3CK06iiNdwynq34WV9I9VBBoeO+Rg9lTuRiaYmbN1eG1+6llxvn1VjPt6PGm3EskYOfR85piiCUfA==", "dev": true }, "svelte-dev-helper": { @@ -6642,13 +6812,14 @@ "dev": true }, "svelte-loader": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/svelte-loader/-/svelte-loader-2.10.1.tgz", - "integrity": "sha512-Kua8LHwjrHPEGgFUycPo4pg17vzcBu1ptm/2OR/mZfnR1tk1YRMhyoQGvS15Zr36VwRCPPgDYYVYT3peWVseAw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/svelte-loader/-/svelte-loader-2.11.0.tgz", + "integrity": "sha512-+Q24lBhQ8KGB9flHNXjKqq9TJEIcT3VJlzsxhijqrJ9feK9bUG3TLDlosceoAXvOsjxuaHKN1ZveUbbX7J7zUQ==", "dev": true, "requires": { "loader-utils": "^1.1.0", - "svelte-dev-helper": "^1.1.7" + "require-relative": "^0.8.7", + "svelte-dev-helper": "^1.1.9" } }, "table": { @@ -6772,17 +6943,6 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "to-regex": { @@ -6805,6 +6965,17 @@ "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, "tough-cookie": { @@ -6915,24 +7086,12 @@ "dev": true }, "uglify-js": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.7.tgz", - "integrity": "sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q==", + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.8.tgz", + "integrity": "sha512-WatYTD84gP/867bELqI2F/2xC9PQBETn/L+7RGq9MQOA/7yFBNvY1UwXqvtILeE6n0ITwBXxp34M0/o70dzj6A==", "requires": { - "commander": "~2.16.0", + "commander": "~2.17.1", "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "uglifyjs-webpack-plugin": { @@ -6957,12 +7116,6 @@ "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "uglify-es": { "version": "3.3.9", "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", @@ -7071,6 +7224,12 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, @@ -7233,9 +7392,9 @@ } }, "webpack": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.5.tgz", - "integrity": "sha512-i5cHYHonzSc1zBuwB5MSzW4v9cScZFbprkHK8ZgzPDCRkQXGGpYzPmJhbus5bOrZ0tXTcQp+xyImRSvKb0b+Kw==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.17.1.tgz", + "integrity": "sha512-vdPYogljzWPhFKDj3Gcp01Vqgu7K3IQlybc3XIdKSQHelK1C3eIQuysEUR7MxKJmdandZlQB/9BG2Jb1leJHaw==", "dev": true, "requires": { "@webassemblyjs/ast": "1.5.13", @@ -7283,6 +7442,47 @@ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "eslint-scope": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", @@ -7293,17 +7493,250 @@ "estraverse": "^4.1.1" } }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } } } }, @@ -7317,21 +7750,13 @@ } }, "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", "dev": true, "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "which": { diff --git a/package.json b/package.json index 7ecf9ae69..5ede3e2ca 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,12 @@ "name": "sapper", "version": "0.17.1", "description": "Military-grade apps, engineered by Svelte", - "main": "dist/middleware.ts.js", + "main": "dist/middleware.js", "bin": { "sapper": "./sapper" }, "files": [ "*.js", - "*.ts.js", "runtime", "webpack", "sapper", @@ -20,6 +19,7 @@ }, "dependencies": { "html-minifier": "^3.5.16", + "shimport": "^0.0.9", "source-map-support": "^0.5.6", "tslib": "^1.9.1" }, @@ -48,7 +48,7 @@ "pretty-ms": "^3.1.0", "require-relative": "^0.8.7", "rimraf": "^2.6.2", - "rollup": "^0.59.2", + "rollup": "^0.65.0", "rollup-plugin-commonjs": "^9.1.3", "rollup-plugin-json": "^3.0.0", "rollup-plugin-node-resolve": "^3.3.0", diff --git a/rollup.config.js b/rollup.config.js index 51f14995a..c74d63d14 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -32,6 +32,7 @@ export default [ `src/cli.ts`, `src/core.ts`, `src/middleware.ts`, + `src/rollup.ts`, `src/webpack.ts` ], output: { @@ -51,7 +52,6 @@ export default [ typescript: require('typescript') }) ], - experimentalCodeSplitting: true, - experimentalDynamicImport: true + experimentalCodeSplitting: true } ]; \ No newline at end of file diff --git a/sapper b/sapper index 72c1eca6e..e6f34305f 100755 --- a/sapper +++ b/sapper @@ -1,2 +1,2 @@ #!/usr/bin/env node -require('./dist/cli.ts.js'); \ No newline at end of file +require('./dist/cli.js'); \ No newline at end of file diff --git a/sapper-dev-client.js b/sapper-dev-client.js index b717a25a6..e5c00358e 100644 --- a/sapper-dev-client.js +++ b/sapper-dev-client.js @@ -1,6 +1,8 @@ let source; function check() { + if (typeof module === 'undefined') return; + if (module.hot.status() === 'idle') { module.hot.check(true).then(modules => { console.log(`[SAPPER] applied HMR update`); diff --git a/src/api/build.ts b/src/api/build.ts index 2330a8e21..941c1263c 100644 --- a/src/api/build.ts +++ b/src/api/build.ts @@ -5,7 +5,10 @@ import rimraf from 'rimraf'; import { EventEmitter } from 'events'; import minify_html from './utils/minify_html'; import { create_compilers, create_main_manifests, create_routes, create_serviceworker_manifest } from '../core'; +import { Compilers, Compiler } from '../core/create_compilers'; import * as events from './interfaces'; +import validate_bundler from '../cli/utils/validate_bundler'; +import { copy_shimport } from './utils/copy_shimport'; export function build(opts: {}) { const emitter = new EventEmitter(); @@ -27,11 +30,14 @@ export function build(opts: {}) { async function execute(emitter: EventEmitter, { dest = 'build', app = 'app', + bundler, webpack = 'webpack', + rollup = 'rollup', routes = 'routes' } = {}) { - mkdirp.sync(dest); rimraf.sync(path.join(dest, '**/*')); + mkdirp.sync(`${dest}/client`); + copy_shimport(dest); // minify app/template.html // TODO compile this to a function? could be quicker than str.replace(...).replace(...).replace(...) @@ -51,23 +57,26 @@ async function execute(emitter: EventEmitter, { // create app/manifest/client.js and app/manifest/server.js create_main_manifests({ routes: route_objects }); - const { client, server, serviceworker } = create_compilers({ webpack }); + const { client, server, serviceworker } = create_compilers(validate_bundler(bundler), { webpack, rollup }); - const client_stats = await compile(client); + const client_result = await client.compile(); emitter.emit('build', { type: 'client', // TODO duration/warnings - webpack_stats: client_stats + result: client_result }); - const client_info = client_stats.toJson(); - fs.writeFileSync(path.join(dest, 'client_assets.json'), JSON.stringify(client_info.assetsByChunkName)); + fs.writeFileSync(path.join(dest, 'build.json'), JSON.stringify({ + bundler, + shimport: bundler === 'rollup' && require('shimport/package.json').version, + assets: client_result.assetsByChunkName + })); - const server_stats = await compile(server); + const server_stats = await server.compile(); emitter.emit('build', { type: 'server', // TODO duration/warnings - webpack_stats: server_stats + result: server_stats }); let serviceworker_stats; @@ -75,35 +84,15 @@ async function execute(emitter: EventEmitter, { if (serviceworker) { create_serviceworker_manifest({ routes: route_objects, - client_files: client_stats.toJson().assets.map((chunk: { name: string }) => `client/${chunk.name}`) + client_files: client_result.assets.map((file: string) => `client/${file}`) }); - serviceworker_stats = await compile(serviceworker); + serviceworker_stats = await serviceworker.compile(); emitter.emit('build', { type: 'serviceworker', // TODO duration/warnings - webpack_stats: serviceworker_stats + result: serviceworker_stats }); } -} - -function compile(compiler: any) { - return new Promise((fulfil, reject) => { - compiler.run((err: Error, stats: any) => { - if (err) { - reject(err); - process.exit(1); - } - - if (stats.hasErrors()) { - console.error(stats.toString({ colors: true })); - reject(new Error(`Encountered errors while building app`)); - } - - else { - fulfil(stats); - } - }); - }); -} +} \ No newline at end of file diff --git a/src/api/dev.ts b/src/api/dev.ts index 68711c3e2..1b7a719ef 100644 --- a/src/api/dev.ts +++ b/src/api/dev.ts @@ -5,22 +5,26 @@ import * as child_process from 'child_process'; import * as ports from 'port-authority'; import mkdirp from 'mkdirp'; import rimraf from 'rimraf'; -import format_messages from 'webpack-format-messages'; import { locations } from '../config'; import { EventEmitter } from 'events'; import { create_routes, create_main_manifests, create_compilers, create_serviceworker_manifest } from '../core'; +import { Compiler, Compilers, CompileResult, CompileError } from '../core/create_compilers'; import Deferred from './utils/Deferred'; import * as events from './interfaces'; +import validate_bundler from '../cli/utils/validate_bundler'; +import { copy_shimport } from './utils/copy_shimport'; export function dev(opts) { return new Watcher(opts); } class Watcher extends EventEmitter { + bundler: string; dirs: { app: string; dest: string; routes: string; + rollup: string; webpack: string; } port: number; @@ -47,18 +51,23 @@ class Watcher extends EventEmitter { app = locations.app(), dest = locations.dest(), routes = locations.routes(), + bundler, webpack = 'webpack', + rollup = 'rollup', port = +process.env.PORT }: { app: string, dest: string, routes: string, + bundler?: string, webpack: string, + rollup: string, port: number }) { super(); - this.dirs = { app, dest, routes, webpack }; + this.bundler = validate_bundler(bundler); + this.dirs = { app, dest, routes, webpack, rollup }; this.port = port; this.closed = false; @@ -102,7 +111,8 @@ class Watcher extends EventEmitter { const { dest } = this.dirs; rimraf.sync(dest); - mkdirp.sync(dest); + mkdirp.sync(`${dest}/client`); + if (this.bundler === 'rollup') copy_shimport(dest); const dev_port = await ports.find(10000); @@ -155,7 +165,10 @@ class Watcher extends EventEmitter { }; // TODO watch the configs themselves? - const compilers = create_compilers({ webpack: this.dirs.webpack }); + const compilers: Compilers = create_compilers(this.bundler, { + webpack: this.dirs.webpack, + rollup: this.dirs.rollup + }); let log = ''; @@ -177,7 +190,7 @@ class Watcher extends EventEmitter { this.deferreds.server = new Deferred(); }, - result: info => { + handle_result: (result: CompileResult) => { this.deferreds.client.promise.then(() => { const restart = () => { log = ''; @@ -245,8 +258,6 @@ class Watcher extends EventEmitter { } }); - let first = true; - this.watch(compilers.client, { name: 'client', @@ -259,11 +270,15 @@ class Watcher extends EventEmitter { // quite difficult }, - result: info => { - fs.writeFileSync(path.join(dest, 'client_assets.json'), JSON.stringify(info.assetsByChunkName, null, ' ')); + handle_result: (result: CompileResult) => { + fs.writeFileSync(path.join(dest, 'build.json'), JSON.stringify({ + bundler: this.bundler, + shimport: this.bundler === 'rollup' && require('shimport/package.json').version, + assets: result.assetsByChunkName + }, null, ' ')); this.deferreds.client.fulfil(); - const client_files = info.assets.map((chunk: { name: string }) => `client/${chunk.name}`); + const client_files = result.assets.map((file: string) => `client/${file}`); create_serviceworker_manifest({ routes: create_routes(), @@ -281,11 +296,7 @@ class Watcher extends EventEmitter { watch_serviceworker = noop; this.watch(compilers.serviceworker, { - name: 'service worker', - - result: info => { - fs.writeFileSync(path.join(dest, 'serviceworker_info.json'), JSON.stringify(info, null, ' ')); - } + name: 'service worker' }); } : noop; @@ -332,82 +343,34 @@ class Watcher extends EventEmitter { } } - watch(compiler: any, { name, invalid = noop, result }: { + watch(compiler: Compiler, { name, invalid = noop, handle_result = noop }: { name: string, invalid?: (filename: string) => void; - result: (stats: any) => void; + handle_result?: (result: CompileResult) => void; }) { - compiler.hooks.invalid.tap('sapper', (filename: string) => { - invalid(filename); - }); + compiler.oninvalid(invalid); - compiler.watch({}, (err: Error, stats: any) => { + compiler.watch((err?: Error, result?: CompileResult) => { if (err) { this.emit('error', { type: name, message: err.message }); } else { - const messages = format_messages(stats); - const info = stats.toJson(); - this.emit('build', { type: name, - duration: info.time, - - errors: messages.errors.map((message: string) => { - const duplicate = this.current_build.unique_errors.has(message); - this.current_build.unique_errors.add(message); - - return mungeWebpackError(message, duplicate); - }), - - warnings: messages.warnings.map((message: string) => { - const duplicate = this.current_build.unique_warnings.has(message); - this.current_build.unique_warnings.add(message); - - return mungeWebpackError(message, duplicate); - }), + duration: result.duration, + errors: result.errors, + warnings: result.warnings }); - result(info); + handle_result(result); } }); } } -const locPattern = /\((\d+):(\d+)\)$/; - -function mungeWebpackError(message: string, duplicate: boolean) { - // TODO this is all a bit rube goldberg... - const lines = message.split('\n'); - - const file = lines.shift() - .replace('', '') // careful — there is a special character at the beginning of this string - .replace('', '') - .replace('./', ''); - - let line = null; - let column = null; - - const match = locPattern.exec(lines[0]); - if (match) { - lines[0] = lines[0].replace(locPattern, ''); - line = +match[1]; - column = +match[2]; - } - - return { - file, - line, - column, - message: lines.join('\n'), - originalMessage: message, - duplicate - }; -} - const INTERVAL = 10000; class DevServer { diff --git a/src/api/export.ts b/src/api/export.ts index 9e80ac5c5..0fc877b1e 100644 --- a/src/api/export.ts +++ b/src/api/export.ts @@ -13,7 +13,7 @@ import * as events from './interfaces'; type Opts = { build: string, dest: string, - basepath: string, + basepath?: string, timeout: number | false }; diff --git a/src/api/interfaces.ts b/src/api/interfaces.ts index 381877a80..0be020df2 100644 --- a/src/api/interfaces.ts +++ b/src/api/interfaces.ts @@ -1,4 +1,5 @@ import * as child_process from 'child_process'; +import { CompileResult } from '../core/create_compilers'; export type ReadyEvent = { port: number; @@ -29,7 +30,7 @@ export type BuildEvent = { errors: Array<{ file: string, message: string, duplicate: boolean }>; warnings: Array<{ file: string, message: string, duplicate: boolean }>; duration: number; - webpack_stats: any; + result: CompileResult; } export type FileEvent = { diff --git a/src/api/utils/copy_shimport.ts b/src/api/utils/copy_shimport.ts new file mode 100644 index 000000000..dda43f16f --- /dev/null +++ b/src/api/utils/copy_shimport.ts @@ -0,0 +1,9 @@ +import * as fs from 'fs'; + +export function copy_shimport(dest: string) { + const shimport_version = require('shimport/package.json').version; + fs.writeFileSync( + `${dest}/client/shimport@${shimport_version}.js`, + fs.readFileSync(require.resolve('shimport/index.js')) + ); +} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index 289bffadb..0568206ca 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -11,7 +11,8 @@ prog.command('dev') .describe('Start a development server') .option('-p, --port', 'Specify a port') .option('-o, --open', 'Open a browser window') - .action(async (opts: { port: number, open: boolean }) => { + .option('--bundler', 'Specify a bundler (rollup or webpack)') + .action(async (opts: { port: number, open: boolean, bundler?: string }) => { const { dev } = await import('./cli/dev'); dev(opts); }); @@ -19,8 +20,9 @@ prog.command('dev') prog.command('build [dest]') .describe('Create a production-ready version of your app') .option('-p, --port', 'Default of process.env.PORT', '3000') + .option('--bundler', 'Specify a bundler (rollup or webpack, blank for auto)') .example(`build custom-dir -p 4567`) - .action(async (dest = 'build', opts: { port: string }) => { + .action(async (dest = 'build', opts: { port: string, bundler?: string }) => { console.log(`> Building...`); process.env.NODE_ENV = process.env.NODE_ENV || 'production'; @@ -30,7 +32,7 @@ prog.command('build [dest]') try { const { build } = await import('./cli/build'); - await build(); + await build(opts); const launcher = path.resolve(dest, 'index.js'); @@ -46,7 +48,7 @@ prog.command('build [dest]') console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold.cyan(`node ${dest}`)} to run the app.`); } catch (err) { - console.error(err ? err.details || err.stack || err.message || err : 'Unknown error'); + console.log(`${colors.bold.red(`> ${err.message}`)}`); process.exit(1); } }); @@ -66,8 +68,10 @@ prog.command('export [dest]') .option('--build-dir', 'Specify a custom temporary build directory', '.sapper/prod') .option('--basepath', 'Specify a base path') .option('--timeout', 'Milliseconds to wait for a page (--no-timeout to disable)', 5000) + .option('--bundler', 'Specify a bundler (rollup or webpack, blank for auto)') .action(async (dest = 'export', opts: { build: boolean, + bundler?: string, 'build-dir': string, basepath?: string, timeout: number | false @@ -81,7 +85,7 @@ prog.command('export [dest]') if (opts.build) { console.log(`> Building...`); const { build } = await import('./cli/build'); - await build(); + await build(opts); console.error(`\n> Built in ${elapsed(start)}`); } diff --git a/src/cli/build.ts b/src/cli/build.ts index b7bf87b4f..6b291b627 100644 --- a/src/cli/build.ts +++ b/src/cli/build.ts @@ -1,20 +1,39 @@ import { build as _build } from '../api/build'; import colors from 'kleur'; import { locations } from '../config'; +import validate_bundler from './utils/validate_bundler'; +import { repeat } from '../utils'; + +export function build(opts: { bundler?: string }) { + const bundler = validate_bundler(opts.bundler); -export function build() { return new Promise((fulfil, reject) => { try { const emitter = _build({ dest: locations.dest(), app: locations.app(), routes: locations.routes(), - webpack: 'webpack' + bundler, + webpack: 'webpack', + rollup: 'rollup' }); emitter.on('build', event => { - console.log(colors.inverse(`\nbuilt ${event.type}`)); - console.log(event.webpack_stats.toString({ colors: true })); + let banner = `built ${event.type}`; + let c = colors.cyan; + + const { warnings } = event.result; + if (warnings.length > 0) { + banner += ` with ${warnings.length} ${warnings.length === 1 ? 'warning' : 'warnings'}`; + c = colors.yellow; + } + + console.log(); + console.log(c(`┌─${repeat('─', banner.length)}─┐`)); + console.log(c(`│ ${colors.bold(banner) } │`)); + console.log(c(`└─${repeat('─', banner.length)}─┘`)); + + console.log(event.result.print()); }); emitter.on('error', event => { @@ -25,8 +44,7 @@ export function build() { fulfil(); }); } catch (err) { - console.log(`${colors.bold.red(`> ${err.message}`)}`); - process.exit(1); + reject(err); } }); } \ No newline at end of file diff --git a/src/cli/dev.ts b/src/cli/dev.ts index afbbc2fa5..ecaa4a387 100644 --- a/src/cli/dev.ts +++ b/src/cli/dev.ts @@ -5,7 +5,7 @@ import prettyMs from 'pretty-ms'; import { dev as _dev } from '../api/dev'; import * as events from '../api/interfaces'; -export function dev(opts: { port: number, open: boolean }) { +export function dev(opts: { port: number, open: boolean, bundler?: string }) { try { const watcher = _dev(opts); diff --git a/src/cli/export.ts b/src/cli/export.ts index 04aa0f967..51a02463a 100644 --- a/src/cli/export.ts +++ b/src/cli/export.ts @@ -1,12 +1,8 @@ import { exporter as _exporter } from '../api/export'; import colors from 'kleur'; -import prettyBytes from 'pretty-bytes'; +import pb from 'pretty-bytes'; import { locations } from '../config'; - -function left_pad(str: string, len: number) { - while (str.length < len) str = ` ${str}`; - return str; -} +import { left_pad } from '../utils'; export function exporter(export_dir: string, { basepath = '', @@ -25,9 +21,8 @@ export function exporter(export_dir: string, { }); emitter.on('file', event => { - const pb = prettyBytes(event.size); const size_color = event.size > 150000 ? colors.bold.red : event.size > 50000 ? colors.bold.yellow : colors.bold.gray; - const size_label = size_color(left_pad(prettyBytes(event.size), 10)); + const size_label = size_color(left_pad(pb(event.size), 10)); const file_label = event.status === 200 ? event.file diff --git a/src/cli/utils/validate_bundler.ts b/src/cli/utils/validate_bundler.ts new file mode 100644 index 000000000..38ea550dc --- /dev/null +++ b/src/cli/utils/validate_bundler.ts @@ -0,0 +1,21 @@ +import * as fs from 'fs'; + +export default function validate_bundler(bundler?: string) { + if (!bundler) { + bundler = ( + fs.existsSync('rollup') ? 'rollup' : + fs.existsSync('webpack') ? 'webpack' : + null + ); + + if (!bundler) { + throw new Error(`Could not find a 'rollup' or 'webpack' directory`); + } + } + + if (bundler !== 'rollup' && bundler !== 'webpack') { + throw new Error(`'${bundler}' is not a valid option for --bundler — must be either 'rollup' or 'webpack'`); + } + + return bundler; +} \ No newline at end of file diff --git a/src/core/create_compilers.ts b/src/core/create_compilers.ts index 51a866d34..b5ed87993 100644 --- a/src/core/create_compilers.ts +++ b/src/core/create_compilers.ts @@ -1,29 +1,378 @@ +import * as fs from 'fs'; import * as path from 'path'; +import colors from 'kleur'; +import pb from 'pretty-bytes'; import relative from 'require-relative'; +import { left_pad } from '../utils'; -export default function create_compilers({ webpack }: { webpack: string }) { - const wp = relative('webpack', process.cwd()); +let r: any; +let wp: any; - const serviceworker_config = try_require(path.resolve(`${webpack}/service-worker.config.js`)); +export class CompileError { + file: string; + message: string; +} - return { - client: wp( - require(path.resolve(`${webpack}/client.config.js`)) - ), +export class CompileResult { + duration: number; + errors: CompileError[]; + warnings: CompileError[]; + assets: string[]; + assetsByChunkName: Record; +} - server: wp( - require(path.resolve(`${webpack}/server.config.js`)) - ), +class RollupResult extends CompileResult { + summary: string; - serviceworker: serviceworker_config && wp(serviceworker_config) - }; + constructor(duration: number, compiler: RollupCompiler) { + super(); + + this.duration = duration; + + this.errors = compiler.errors.map(munge_rollup_warning_or_error); + this.warnings = compiler.warnings.map(munge_rollup_warning_or_error); // TODO emit this as they happen + + this.assets = compiler.chunks.map(chunk => chunk.fileName); + + // TODO populate this properly. We don't have namedcompiler. chunks, as in + // webpack, but we can have a route -> [chunk] map or something + this.assetsByChunkName = {}; + + compiler.chunks.forEach(chunk => { + if (compiler.input in chunk.modules) { + this.assetsByChunkName.main = chunk.fileName; + } + }); + + this.summary = compiler.chunks.map(chunk => { + const size_color = chunk.code.length > 150000 ? colors.bold.red : chunk.code.length > 50000 ? colors.bold.yellow : colors.bold.white; + const size_label = left_pad(pb(chunk.code.length), 10); + + const lines = [size_color(`${size_label} ${chunk.fileName}`)]; + + const deps = Object.keys(chunk.modules) + .map(file => { + return { + file: path.relative(process.cwd(), file), + size: chunk.modules[file].renderedLength + }; + }) + .filter(dep => dep.size > 0) + .sort((a, b) => b.size - a.size); + + const total_unminified = deps.reduce((t, d) => t + d.size, 0); + + deps.forEach((dep, i) => { + const c = i === deps.length - 1 ? '└' : '│'; + let line = ` ${c} ${dep.file}`; + + if (deps.length > 1) { + const p = (100 * dep.size / total_unminified).toFixed(1); + line += ` (${p}%)`; + } + + lines.push(colors.gray(line)); + }); + + return lines.join('\n'); + }).join('\n'); + } + + print() { + const blocks: string[] = this.warnings.map(warning => { + return warning.file + ? `> ${colors.bold(warning.file)}\n${warning.message}` + : `> ${warning.message}`; + }); + + blocks.push(this.summary); + + return blocks.join('\n\n'); + } +} + +class WebpackResult extends CompileResult { + stats: any; + + constructor(stats: any) { + super(); + + this.stats = stats; + + const info = stats.toJson(); + + // TODO use import() + const format_messages = require('webpack-format-messages'); + const messages = format_messages(stats); + + this.errors = messages.errors.map(munge_webpack_warning_or_error); + this.warnings = messages.warnings.map(munge_webpack_warning_or_error); + + this.duration = info.time; + + this.assets = info.assets.map((chunk: { name: string }) => chunk.name); + this.assetsByChunkName = info.assetsByChunkName; + } + + print() { + return this.stats.toString({ colors: true }); + } } -function try_require(specifier: string) { - try { - return require(specifier); - } catch (err) { - if (err.code === 'MODULE_NOT_FOUND') return null; - throw err; +export class RollupCompiler { + _: Promise; + _oninvalid: (filename: string) => void; + _start: number; + input: string; + warnings: any[]; + errors: any[]; + chunks: any[]; // TODO types + + constructor(config: any) { + this._ = this.get_config(path.resolve(config)); + this.input = null; + this.warnings = []; + this.errors = []; + this.chunks = []; + } + + async get_config(input: string) { + const bundle = await r.rollup({ + input, + external: (id: string) => { + return (id[0] !== '.' && !path.isAbsolute(id)) || id.slice(-5, id.length) === '.json'; + } + }); + + const { code } = await bundle.generate({ format: 'cjs' }); + + // temporarily override require + const defaultLoader = require.extensions['.js']; + require.extensions['.js'] = (module: any, filename: string) => { + if (filename === input) { + module._compile(code, filename); + } else { + defaultLoader(module, filename); + } + }; + + const mod: any = require(input); + delete require.cache[input]; + + (mod.plugins || (mod.plugins = [])).push({ + name: 'sapper-internal', + options: (opts: any) => { + this.input = opts.input; + }, + renderChunk: (code: string, chunk: any) => { + if (chunk.isEntry) { + this.chunks.push(chunk); + } + } + }); + + const onwarn = mod.onwarn || ((warning: any, handler: (warning: any) => void) => { + handler(warning); + }); + + mod.onwarn = (warning: any) => { + onwarn(warning, (warning: any) => { + this.warnings.push(warning); + }); + }; + + return mod; + } + + oninvalid(cb: (filename: string) => void) { + this._oninvalid = cb; + } + + async compile(): Promise { + const config = await this._; + + const start = Date.now(); + + try { + const bundle = await r.rollup(config); + await bundle.write(config.output); + + return new RollupResult(Date.now() - start, this); + } catch (err) { + if (err.filename) { + // TODO this is a bit messy. Also, can + // Rollup emit other kinds of error? + err.message = [ + `Failed to build — error in ${err.filename}: ${err.message}`, + err.frame + ].filter(Boolean).join('\n'); + } + + throw err; + } } + + async watch(cb: (err?: Error, stats?: any) => void) { + const config = await this._; + + const watcher = r.watch(config); + + watcher.on('change', (id: string) => { + this.chunks = []; + this.warnings = []; + this.errors = []; + this._oninvalid(id); + }); + + watcher.on('event', (event: any) => { + switch (event.code) { + case 'FATAL': + // TODO kill the process? + if (event.error.filename) { + // TODO this is a bit messy. Also, can + // Rollup emit other kinds of error? + event.error.message = [ + `Failed to build — error in ${event.error.filename}: ${event.error.message}`, + event.error.frame + ].filter(Boolean).join('\n'); + } + + cb(event.error); + break; + + case 'ERROR': + this.errors.push(event.error); + cb(null, new RollupResult(Date.now() - this._start, this)); + break; + + case 'START': + case 'END': + // TODO is there anything to do with this info? + break; + + case 'BUNDLE_START': + this._start = Date.now(); + break; + + case 'BUNDLE_END': + cb(null, new RollupResult(Date.now() - this._start, this)); + break; + + default: + console.log(`Unexpected event ${event.code}`); + } + }); + } +} + +export class WebpackCompiler { + _: any; + + constructor(config: any) { + this._ = wp(require(path.resolve(config))); + } + + oninvalid(cb: (filename: string) => void) { + this._.hooks.invalid.tap('sapper', cb); + } + + compile(): Promise { + return new Promise((fulfil, reject) => { + this._.run((err: Error, stats: any) => { + if (err) { + reject(err); + process.exit(1); + } + + const result = new WebpackResult(stats); + + if (result.errors.length) { + // TODO print errors + // console.error(stats.toString({ colors: true })); + reject(new Error(`Encountered errors while building app`)); + } + + else { + fulfil(result); + } + }); + }); + } + + watch(cb: (err?: Error, stats?: any) => void) { + this._.watch({}, (err?: Error, stats?: any) => { + cb(err, stats && new WebpackResult(stats)); + }); + } +} + +export type Compiler = RollupCompiler | WebpackCompiler; + +export type Compilers = { + client: Compiler; + server: Compiler; + serviceworker?: Compiler; +} + +export default function create_compilers(bundler: string, { webpack, rollup }: { webpack: string, rollup: string }): Compilers { + if (bundler === 'rollup') { + if (!r) r = relative('rollup', process.cwd()); + + const sw = `${rollup}/service-worker.config.js`; + + return { + client: new RollupCompiler(`${rollup}/client.config.js`), + server: new RollupCompiler(`${rollup}/server.config.js`), + serviceworker: fs.existsSync(sw) && new RollupCompiler(sw) + }; + } + + if (bundler === 'webpack') { + if (!wp) wp = relative('webpack', process.cwd()); + + const sw = `${webpack}/service-worker.config.js`; + + return { + client: new WebpackCompiler(`${webpack}/client.config.js`), + server: new WebpackCompiler(`${webpack}/server.config.js`), + serviceworker: fs.existsSync(sw) && new WebpackCompiler(sw) + }; + } + + // this shouldn't be possible... + throw new Error(`Invalid bundler option '${bundler}'`); +} + +const locPattern = /\((\d+):(\d+)\)$/; + +function munge_webpack_warning_or_error(message: string) { + // TODO this is all a bit rube goldberg... + const lines = message.split('\n'); + + const file = lines.shift() + .replace('', '') // careful — there is a special character at the beginning of this string + .replace('', '') + .replace('./', ''); + + let line = null; + let column = null; + + const match = locPattern.exec(lines[0]); + if (match) { + lines[0] = lines[0].replace(locPattern, ''); + line = +match[1]; + column = +match[2]; + } + + return { + file, + message: lines.join('\n') + }; +} + +function munge_rollup_warning_or_error(warning_or_error: any) { + return { + file: warning_or_error.filename, + message: [warning_or_error.message, warning_or_error.frame].filter(Boolean).join('\n') + }; } \ No newline at end of file diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index ea950e3bb..815231259 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -56,8 +56,6 @@ function generate_client( const server_routes_to_ignore = routes.server_routes.filter(route => !page_ids.has(route.pattern.toString())); - const len = Math.max(...routes.components.map(c => c.name.length)); - let code = ` // This file is generated by Sapper — do not edit it! import root from '${get_file(path_to_routes, routes.root)}'; @@ -105,11 +103,9 @@ function generate_client( code += ` - if (module.hot) { - import('${sapper_dev_client}').then(client => { - client.connect(${dev_port}); - }); - }`.replace(/^\t{3}/gm, ''); + import('${sapper_dev_client}').then(client => { + client.connect(${dev_port}); + });`.replace(/^\t{3}/gm, ''); } return code; diff --git a/src/middleware.ts b/src/middleware.ts index cd3bf94c8..982e0810d 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -282,9 +282,9 @@ function get_page_handler( ) { const output = locations.dest(); - const get_chunks = dev() - ? () => JSON.parse(fs.readFileSync(path.join(output, 'client_assets.json'), 'utf-8')) - : (assets => () => assets)(JSON.parse(fs.readFileSync(path.join(output, 'client_assets.json'), 'utf-8'))); + const get_build_info = dev() + ? () => JSON.parse(fs.readFileSync(path.join(output, 'build.json'), 'utf-8')) + : (assets => () => assets)(JSON.parse(fs.readFileSync(path.join(output, 'build.json'), 'utf-8'))); const template = dev() ? () => fs.readFileSync(`${locations.app()}/template.html`, 'utf-8') @@ -303,24 +303,28 @@ function get_page_handler( } function handle_page(page: Page, req: Req, res: ServerResponse, status = 200, error: Error | string = null) { - const chunks: Record = get_chunks(); + const build_info: { + bundler: 'rollup' | 'webpack', + shimport: string | null, + assets: Record + } = get_build_info(); res.setHeader('Content-Type', 'text/html'); // preload main.js and current route // TODO detect other stuff we can preload? images, CSS, fonts? - let preloaded_chunks = Array.isArray(chunks.main) ? chunks.main : [chunks.main]; + let preloaded_chunks = Array.isArray(build_info.assets.main) ? build_info.assets.main : [build_info.assets.main]; if (!error) { page.parts.forEach(part => { if (!part) return; // using concat because it could be a string or an array. thanks webpack! - preloaded_chunks = preloaded_chunks.concat(chunks[part.name]); + preloaded_chunks = preloaded_chunks.concat(build_info.assets[part.name]); }); } const link = preloaded_chunks - .filter(file => !file.match(/\.map$/)) + .filter(file => file && !file.match(/\.map$/)) .map(file => `<${req.baseUrl}/client/${file}>;rel="preload";as="script"`) .join(', '); @@ -354,7 +358,6 @@ function get_page_handler( ); if (include_cookies) { - const cookies: Record = {}; if (!opts.headers) opts.headers = {}; const str = [] @@ -481,11 +484,12 @@ function get_page_handler( store }); - let scripts = [] - .concat(chunks.main) // chunks main might be an array. it might not! thanks, webpack - .filter(file => !file.match(/\.map$/)) - .map(file => ``) - .join(''); + const file = [].concat(build_info.assets.main).filter(file => file && /\.js$/.test(file))[0]; + const main = `${req.baseUrl}/client/${file}`; + + const script = build_info.bundler === 'rollup' + ? `` + : ``; let inline_script = `__SAPPER__={${[ error && `error:1`, @@ -501,7 +505,7 @@ function get_page_handler( const body = template() .replace('%sapper.base%', () => ``) - .replace('%sapper.scripts%', () => `${scripts}`) + .replace('%sapper.scripts%', () => `${script}`) .replace('%sapper.html%', () => html) .replace('%sapper.head%', () => `${head}`) .replace('%sapper.styles%', () => (css && css.code ? `` : '')); diff --git a/src/rollup.ts b/src/rollup.ts new file mode 100644 index 000000000..5ef280a4b --- /dev/null +++ b/src/rollup.ts @@ -0,0 +1,46 @@ +import { locations, dev } from './config'; + +export default { + dev: dev(), + + client: { + input: () => { + return `${locations.app()}/client.js` + }, + + output: () => { + return { + dir: `${locations.dest()}/client`, + entryFileNames: '[name].[hash].js', + chunkFileNames: '[name].[hash].js', + format: 'esm' + }; + } + }, + + server: { + input: () => { + return `${locations.app()}/server.js` + }, + + output: () => { + return { + dir: locations.dest(), + format: 'cjs' + }; + } + }, + + serviceworker: { + input: () => { + return `${locations.app()}/service-worker.js`; + }, + + output: () => { + return { + dir: locations.dest(), + format: 'iife' + } + } + } +}; \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 000000000..7740a8fe5 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,10 @@ +export function left_pad(str: string, len: number) { + while (str.length < len) str = ` ${str}`; + return str; +} + +export function repeat(str: string, i: number) { + let result = ''; + while (i--) result += str; + return result; +} \ No newline at end of file diff --git a/test/app/app/server.js b/test/app/app/server.js index f09d31898..430853c9f 100644 --- a/test/app/app/server.js +++ b/test/app/app/server.js @@ -2,7 +2,7 @@ import fs from 'fs'; import { resolve } from 'url'; import express from 'express'; import serve from 'serve-static'; -import sapper from '../../../dist/middleware.ts.js'; +import sapper from '../../../dist/middleware.js'; import { Store } from 'svelte/store.js'; import { manifest } from './manifest/server.js'; diff --git a/test/app/webpack/client.config.js b/test/app/webpack/client.config.js index 9a17294ba..9acbe9b7a 100644 --- a/test/app/webpack/client.config.js +++ b/test/app/webpack/client.config.js @@ -1,4 +1,4 @@ -const config = require('../../../webpack/config.js'); +const config = require('../../../config/webpack.js'); const webpack = require('webpack'); const mode = process.env.NODE_ENV; diff --git a/test/app/webpack/server.config.js b/test/app/webpack/server.config.js index 4f76856de..b88d1a67e 100644 --- a/test/app/webpack/server.config.js +++ b/test/app/webpack/server.config.js @@ -1,4 +1,4 @@ -const config = require('../../../webpack/config.js'); +const config = require('../../../config/webpack.js'); const sapper_pkg = require('../../../package.json'); module.exports = { diff --git a/test/app/webpack/service-worker.config.js b/test/app/webpack/service-worker.config.js index f95b5f42e..aacb312d5 100644 --- a/test/app/webpack/service-worker.config.js +++ b/test/app/webpack/service-worker.config.js @@ -1,4 +1,4 @@ -const config = require('../../../webpack/config.js'); +const config = require('../../../config/webpack.js'); module.exports = { entry: config.serviceworker.entry(), diff --git a/webpack.js b/webpack.js index bb688ffc4..96fb4cece 100644 --- a/webpack.js +++ b/webpack.js @@ -1,2 +1,2 @@ -// TODO write to this file, instead of webpack.ts.js -module.exports = require('./dist/webpack.ts.js'); \ No newline at end of file +console.error(`[DEPRECATION] As of Sapper 0.18, webpack config should be loaded from sapper/config/webpack.js`); +module.exports = require('./dist/webpack.js'); \ No newline at end of file diff --git a/webpack/config.js b/webpack/config.js index 64835555b..388f348b5 100644 --- a/webpack/config.js +++ b/webpack/config.js @@ -1,2 +1,2 @@ -// TODO deprecate this file in favour of sapper/webpack.js -module.exports = require('../dist/webpack.ts.js'); \ No newline at end of file +console.error(`[DEPRECATION] As of Sapper 0.18, webpack config should be loaded from sapper/config/webpack.js`); +module.exports = require('../dist/webpack.js'); \ No newline at end of file