diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3dd1ad0..593a8b5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,27 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+# [4.0.0-beta.0](https://github.com/webpack-contrib/karma-webpack/compare/v3.0.0...v4.0.0-beta.0) (2018-03-19)
+
+
+### Chores
+
+* **package:** update `webpack-dev-middleware` v2.0.6...3.0.1 (`dependencies`) ([ffa0a9c](https://github.com/webpack-contrib/karma-webpack/commit/ffa0a9c))
+
+
+### Code Refactoring
+
+* **karma-webpack:** upgrade plugin system (`tapable`) ([395eab4](https://github.com/webpack-contrib/karma-webpack/commit/395eab4))
+
+
+### BREAKING CHANGES
+
+* **package:** requires `webpack >= v4.0.0`
+* **karma-webpack:** requires `webpack >= v4.0.0`
+
+
+
# [3.0.0](https://github.com/webpack-contrib/karma-webpack/compare/v2.0.13...v3.0.0) (2018-03-19)
diff --git a/package-lock.json b/package-lock.json
index d2028ba..e190238 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "karma-webpack",
- "version": "3.0.0",
+ "version": "4.0.0-beta.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -1680,7 +1680,7 @@
"move-concurrently": "1.0.1",
"promise-inflight": "1.0.1",
"rimraf": "2.6.2",
- "ssri": "5.2.4",
+ "ssri": "5.3.0",
"unique-filename": "1.1.0",
"y18n": "4.0.0"
},
@@ -3246,9 +3246,9 @@
"dev": true
},
"duplexify": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz",
- "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==",
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
+ "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
"dev": true,
"requires": {
"end-of-stream": "1.4.1",
@@ -7497,7 +7497,7 @@
"dev": true,
"requires": {
"concat-stream": "1.6.0",
- "duplexify": "3.5.3",
+ "duplexify": "3.5.4",
"end-of-stream": "1.4.1",
"flush-write-stream": "1.0.2",
"from2": "2.3.0",
@@ -7707,7 +7707,7 @@
"kind-of": "6.0.2",
"object.pick": "1.3.0",
"regex-not": "1.0.2",
- "snapdragon": "0.8.1",
+ "snapdragon": "0.8.2",
"to-regex": "3.0.2"
},
"dependencies": {
@@ -8370,6 +8370,12 @@
"integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
"dev": true
},
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
@@ -8632,7 +8638,7 @@
"integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
"dev": true,
"requires": {
- "duplexify": "3.5.3",
+ "duplexify": "3.5.4",
"inherits": "2.0.3",
"pump": "2.0.1"
}
@@ -9177,14 +9183,14 @@
"integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==",
"dev": true,
"requires": {
- "ajv": "6.1.1",
+ "ajv": "6.3.0",
"ajv-keywords": "3.1.0"
},
"dependencies": {
"ajv": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.1.1.tgz",
- "integrity": "sha1-l41Zf7wrfQ5aXD3esUmmgvKr+g4=",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz",
+ "integrity": "sha1-FlCkERTvAFdMrBC4Ay2PTBSBLac=",
"dev": true,
"requires": {
"fast-deep-equal": "1.0.0",
@@ -9221,15 +9227,6 @@
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
- "set-getter": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
- "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
- "dev": true,
- "requires": {
- "to-object-path": "0.3.0"
- }
- },
"set-immediate-shim": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
@@ -9365,9 +9362,9 @@
}
},
"snapdragon": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
- "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
"dev": true,
"requires": {
"base": "0.11.2",
@@ -9377,7 +9374,7 @@
"map-cache": "0.2.2",
"source-map": "0.5.7",
"source-map-resolve": "0.5.1",
- "use": "2.0.2"
+ "use": "3.1.0"
},
"dependencies": {
"define-property": {
@@ -9454,12 +9451,6 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
"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
}
}
},
@@ -9727,9 +9718,9 @@
}
},
"ssri": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.2.4.tgz",
- "integrity": "sha512-UnEAgMZa15973iH7cUi0AHjJn1ACDIkaMyZILoqwN6yzt+4P81I8tBc5Hl+qwi5auMplZtPQsHrPBR5vJLcQtQ==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
"dev": true,
"requires": {
"safe-buffer": "5.1.1"
@@ -10480,9 +10471,9 @@
"optional": true
},
"uglifyjs-webpack-plugin": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz",
- "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.4.tgz",
+ "integrity": "sha512-z0IbjpW8b3O/OVn+TTZN4pI29RN1zktFBXLIzzfZ+++cUtZ1ERSlLWgpE/5OERuEUs1ijVQnpYAkSlpoVmQmSQ==",
"dev": true,
"requires": {
"cacache": "10.0.4",
@@ -10492,7 +10483,7 @@
"source-map": "0.6.1",
"uglify-es": "3.3.9",
"webpack-sources": "1.1.0",
- "worker-farm": "1.5.2"
+ "worker-farm": "1.6.0"
},
"dependencies": {
"commander": {
@@ -10657,6 +10648,12 @@
"integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
"dev": true
},
+ "upath": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz",
+ "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==",
+ "dev": true
+ },
"update-notifier": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz",
@@ -10730,9 +10727,9 @@
}
},
"url-join": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz",
- "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg="
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz",
+ "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo="
},
"url-parse-lax": {
"version": "1.0.0",
@@ -10744,96 +10741,19 @@
}
},
"use": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
- "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
"dev": true,
"requires": {
- "define-property": "0.2.5",
- "isobject": "3.0.1",
- "lazy-cache": "2.0.2"
+ "kind-of": "6.0.2"
},
"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.6"
- }
- },
- "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.2.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.6"
- }
- }
- }
- },
- "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.2.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.6"
- }
- }
- }
- },
- "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.1.0"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
"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==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
"dev": true
- },
- "lazy-cache": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
- "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
- "dev": true,
- "requires": {
- "set-getter": "0.1.0"
- }
}
}
},
@@ -10940,25 +10860,349 @@
"dev": true
},
"watchpack": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz",
- "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz",
+ "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==",
"dev": true,
"requires": {
- "async": "2.6.0",
- "chokidar": "1.7.0",
- "graceful-fs": "4.1.11"
+ "chokidar": "2.0.2",
+ "graceful-fs": "4.1.11",
+ "neo-async": "2.5.0"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "3.1.9",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
+ "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "kind-of": "6.0.2",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "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.2"
+ }
+ },
+ "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.1"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz",
+ "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "2.0.0",
+ "async-each": "1.0.1",
+ "braces": "2.3.1",
+ "fsevents": "1.1.3",
+ "glob-parent": "3.1.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "4.0.0",
+ "normalize-path": "2.1.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0",
+ "upath": "1.0.4"
+ }
+ },
+ "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.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "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.6"
+ }
+ },
+ "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.1"
+ }
+ },
+ "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.1.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.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "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.2"
+ }
+ },
+ "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.1"
+ }
+ }
+ }
+ },
+ "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.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.1"
+ }
+ }
+ }
+ },
+ "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.2"
+ },
+ "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.1"
+ }
+ }
+ }
+ },
+ "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.2.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.6"
+ }
+ }
+ }
+ },
+ "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.2.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.6"
+ }
+ }
+ }
+ },
+ "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.2.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.6"
+ }
+ }
+ }
+ },
+ "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.9",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
+ "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
+ "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.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ }
}
},
"webpack": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.0.0.tgz",
- "integrity": "sha512-wnEjBERuGrbelfsBJ7QKLuGAEaLNPTGJrLgK8H0p1TPS3pUqvTU4OZKeS1OAd8xBpEkuBrFcyHpXPvi0JZVvkA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.1.1.tgz",
+ "integrity": "sha512-PwxKH81yLjbPyBSZvPj/Ji9pT99XOGFA0t6zipoOKOMNRZ+09N39J5Uzcx3rYKnsHgKwDnfGkvzac4MF2Taknw==",
"dev": true,
"requires": {
"acorn": "5.4.1",
"acorn-dynamic-import": "3.0.0",
- "ajv": "6.1.1",
+ "ajv": "6.3.0",
"ajv-keywords": "3.1.0",
"chrome-trace-event": "0.1.2",
"enhanced-resolve": "4.0.0",
@@ -10972,15 +11216,15 @@
"node-libs-browser": "2.1.0",
"schema-utils": "0.4.5",
"tapable": "1.0.0",
- "uglifyjs-webpack-plugin": "1.2.2",
- "watchpack": "1.4.0",
+ "uglifyjs-webpack-plugin": "1.2.4",
+ "watchpack": "1.5.0",
"webpack-sources": "1.1.0"
},
"dependencies": {
"ajv": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.1.1.tgz",
- "integrity": "sha1-l41Zf7wrfQ5aXD3esUmmgvKr+g4=",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz",
+ "integrity": "sha1-FlCkERTvAFdMrBC4Ay2PTBSBLac=",
"dev": true,
"requires": {
"fast-deep-equal": "1.0.0",
@@ -11014,7 +11258,7 @@
"isobject": "3.0.1",
"kind-of": "6.0.2",
"repeat-element": "1.1.2",
- "snapdragon": "0.8.1",
+ "snapdragon": "0.8.2",
"snapdragon-node": "2.1.1",
"split-string": "3.1.0",
"to-regex": "3.0.2"
@@ -11051,7 +11295,7 @@
"extend-shallow": "2.0.1",
"posix-character-classes": "0.1.1",
"regex-not": "1.0.2",
- "snapdragon": "0.8.1",
+ "snapdragon": "0.8.2",
"to-regex": "3.0.2"
},
"dependencies": {
@@ -11104,7 +11348,7 @@
"extend-shallow": "2.0.1",
"fragment-cache": "0.2.1",
"regex-not": "1.0.2",
- "snapdragon": "0.8.1",
+ "snapdragon": "0.8.2",
"to-regex": "3.0.2"
},
"dependencies": {
@@ -11240,23 +11484,23 @@
"nanomatch": "1.2.9",
"object.pick": "1.3.0",
"regex-not": "1.0.2",
- "snapdragon": "0.8.1",
+ "snapdragon": "0.8.2",
"to-regex": "3.0.2"
}
}
}
},
"webpack-dev-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz",
- "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.0.1.tgz",
+ "integrity": "sha512-JCturcEZNGA0KHEpOJVRTC/VVazTcPfpR9c1Au6NO9a+jxCRchMi87Qe7y3JeOzc0v5eMMKpuGBnPdN52NA+CQ==",
"requires": {
"loud-rejection": "1.6.0",
"memory-fs": "0.4.1",
"mime": "2.2.0",
"path-is-absolute": "1.0.1",
"range-parser": "1.2.0",
- "url-join": "2.0.5",
+ "url-join": "4.0.0",
"webpack-log": "1.1.2"
},
"dependencies": {
@@ -11369,13 +11613,12 @@
"dev": true
},
"worker-farm": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz",
- "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
+ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
"dev": true,
"requires": {
- "errno": "0.1.7",
- "xtend": "4.0.1"
+ "errno": "0.1.7"
}
},
"wrap-ansi": {
diff --git a/package.json b/package.json
index 1753d65..78510fd 100644
--- a/package.json
+++ b/package.json
@@ -1,11 +1,11 @@
{
"name": "karma-webpack",
- "version": "3.0.0",
+ "version": "4.0.0-beta.0",
"author": "Tobias Koppers @sokra",
"description": "Use webpack with karma",
"license": "MIT",
"engines": {
- "node": ">= 4"
+ "node": ">= 6.9.0"
},
"main": "lib",
"files": [
@@ -33,7 +33,7 @@
"loader-utils": "^1.0.0",
"lodash": "^4.0.0",
"source-map": "^0.5.6",
- "webpack-dev-middleware": "^2.0.6"
+ "webpack-dev-middleware": "^3.0.1"
},
"devDependencies": {
"babel-cli": "^6.0.0",
@@ -55,7 +55,7 @@
"karma-spec-reporter": "^0.0.32",
"mocha": "^4.0.0",
"standard-version": "^4.0.0",
- "webpack": "^4.0.0"
+ "webpack": "^4.1.1"
},
"bugs": "https://github.com/webpack-contrib/karma-webpack/issues",
"repository": "https://github.com/webpack-contrib/karma-webpack.git",
diff --git a/src/karma-webpack.js b/src/karma-webpack.js
index bf98ce7..cea3f69 100644
--- a/src/karma-webpack.js
+++ b/src/karma-webpack.js
@@ -20,6 +20,14 @@ var escapeRegExp = function(str) {
return str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&')
}
+function invalidate(middleware) {
+ if (middleware.context.watching) {
+ return middleware.context.watching.invalidate()
+ }
+
+ return middleware.invalidate()
+}
+
function Plugin(
/* config.webpack */ webpackOptions,
/* config.webpackServer */ webpackServerOptions,
@@ -62,11 +70,22 @@ function Plugin(
// https://github.com/webpack/webpack/issues/645
webpackOptions.output.path = path.join(os.tmpdir(), '_karma_webpack_', indexPath, '/')
webpackOptions.output.publicPath = path.join(os.tmpdir(), '_karma_webpack_', publicPath, '/')
- webpackOptions.output.filename = '[name]'
if (includeIndex) {
webpackOptions.output.jsonpFunction = `webpackJsonp${index}`
}
- webpackOptions.output.chunkFilename = '[id].bundle.js'
+ if (!webpackOptions.output.filename) {
+ webpackOptions.output.filename = '[name].js'
+ }
+ if (!webpackOptions.output.chunkFilename) {
+ webpackOptions.output.chunkFilename = '[id].bundle.js'
+ }
+
+ // For webpack 4+, optimization.splitChunks and optimization.runtimeChunk must be false.
+ // Otherwise it hangs at 'Compiled successfully'
+ if (webpackOptions.optimization) {
+ webpackOptions.optimization.splitChunks = false
+ webpackOptions.optimization.runtimeChunk = false
+ }
})
this.emitter = emitter
@@ -75,6 +94,7 @@ function Plugin(
this.files = []
this.basePath = basePath
this.waiting = []
+ this.plugin = {name: 'KarmaWebpack'}
var compiler
@@ -91,23 +111,56 @@ function Plugin(
var applyPlugins = compiler.compilers || [compiler]
applyPlugins.forEach(function(compiler) {
- compiler.plugin('this-compilation', function(compilation, params) {
- compilation.dependencyFactories.set(SingleEntryDependency, params.normalModuleFactory)
- })
- compiler.plugin('make', this.make.bind(this))
- }, this);
+ if (compiler.hooks) {
+ compiler.hooks
+ .thisCompilation
+ .tap(this.plugin, (compilation, params) => {
+ compilation.dependencyFactories.set(SingleEntryDependency, params.normalModuleFactory)
+ })
+ compiler.hooks
+ .make
+ .tapAsync(this.plugin, this.make.bind(this))
+ } else {
+ compiler.plugin('this-compilation', function(compilation, params) {
+ compilation.dependencyFactories.set(SingleEntryDependency, params.normalModuleFactory)
+ })
+ compiler.plugin('make', this.make.bind(this))
+ }
+ }, this)
+
+ function handler(callback) {
+ isBlocked = true
+
+ if (typeof callback === 'function') {
+ callback(null)
+ }
+ }
- ['invalid', 'watch-run', 'run'].forEach(function(name) {
- compiler.plugin(name, function(_, callback) {
- isBlocked = true
+ var hooks = ['invalid', 'watch-run', 'run']
+
+ if (compiler.hooks) {
+ hooks = [
+ {method: 'sync', name: 'invalid'},
+ {method: 'async', name: 'watchRun'},
+ {method: 'async', name: 'run'}
+ ]
+ }
- if (typeof callback === 'function') {
- callback()
+ hooks.forEach(function(hook) {
+ if (compiler.hooks) {
+ if (hook.method === 'sync') {
+ compiler.hooks[hook.name].tap(this.plugin, () => handler())
+ } else {
+ compiler.hooks[hook.name].tapAsync(this.plugin, (_, callback) => handler(callback))
}
- })
- })
+ } else {
+ compiler.plugin(hook, function(_, callback) {
+ handler(callback)
+ })
+ }
+ }, this)
- compiler.plugin('done', function(stats) {
+ function done(stats) {
var applyStats = Array.isArray(stats.stats) ? stats.stats : [stats]
var assets = []
var noAssets = false
@@ -139,12 +192,21 @@ function Plugin(
blocked[i]()
}
blocked = []
- }.bind(this))
- compiler.plugin('invalid', function() {
+ }
+
+ function invalid() {
if (!this.waiting) {
this.waiting = []
}
- }.bind(this))
+ }
+
+ if (compiler.hooks) {
+ compiler.hooks.done.tap(this.plugin, done.bind(this))
+ compiler.hooks.invalid.tap(this.plugin, invalid.bind(this))
+ } else {
+ compiler.plugin('done', done.bind(this))
+ compiler.plugin('invalid', invalid.bind(this))
+ }
webpackMiddlewareOptions.publicPath = path.join(os.tmpdir(), '_karma_webpack_', '/')
var middleware = this.middleware = new webpackDevMiddleware(compiler, webpackMiddlewareOptions)
@@ -197,7 +259,7 @@ Plugin.prototype.make = function(compilation, callback) {
this.files = this.files.filter(function(f) {
return file !== f
})
- this.middleware.invalidate()
+ invalidate(this.middleware)
}
callback(err)
}.bind(this))
@@ -259,7 +321,7 @@ function createPreprocesor(/* config.basePath */ basePath, webpackPlugin) {
return function(content, file, done) {
if (webpackPlugin.addFile(file.originalPath)) {
// recompile as we have an asset that we have not seen before
- webpackPlugin.middleware.invalidate()
+ invalidate(webpackPlugin.middleware)
}
// read blocks until bundle is done