diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 788780a1e43d5..818a5bc24bcac 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -12,16 +12,12 @@ "version": "0.9.11", "dev": true }, - "esprima": { - "version": "4.0.0", - "dev": true - }, "lodash": { "version": "4.17.4", "dev": true }, "recast": { - "version": "0.12.6", + "version": "0.12.5", "dev": true }, "source-map": { @@ -46,14 +42,6 @@ "acorn": { "version": "3.3.0" }, - "acorn-dynamic-import": { - "version": "2.0.2", - "dependencies": { - "acorn": { - "version": "4.0.13" - } - } - }, "acorn-globals": { "version": "3.1.0", "dependencies": { @@ -73,7 +61,8 @@ "version": "4.11.8" }, "ajv-keywords": { - "version": "1.5.1" + "version": "1.5.1", + "dev": true }, "align-text": { "version": "0.1.4" @@ -89,9 +78,6 @@ "version": "1.4.0", "dev": true }, - "ansi-html": { - "version": "0.0.6" - }, "ansi-regex": { "version": "2.1.1" }, @@ -119,10 +105,15 @@ "version": "2.0.3" }, "readable-stream": { - "version": "2.3.2" + "version": "2.3.0" }, "string_decoder": { - "version": "1.0.3" + "version": "1.0.2", + "dependencies": { + "safe-buffer": { + "version": "5.0.1" + } + } } } }, @@ -180,9 +171,6 @@ "asn1": { "version": "0.2.3" }, - "asn1.js": { - "version": "4.9.1" - }, "assert": { "version": "1.4.1" }, @@ -236,16 +224,10 @@ } }, "babel-core": { - "version": "6.24.1", + "version": "6.9.1", "dependencies": { - "babel-register": { - "version": "6.24.1" - }, "source-map": { "version": "0.5.6" - }, - "source-map-support": { - "version": "0.4.15" } } }, @@ -313,7 +295,7 @@ "dev": true }, "babel-loader": { - "version": "7.0.0" + "version": "6.2.4" }, "babel-messages": { "version": "6.23.0" @@ -596,12 +578,6 @@ "babel-register": { "version": "6.9.0", "dependencies": { - "home-or-tmp": { - "version": "1.0.0" - }, - "path-exists": { - "version": "1.0.0" - }, "source-map": { "version": "0.1.32" }, @@ -634,11 +610,14 @@ "base62": { "version": "0.1.1" }, + "Base64": { + "version": "0.2.1" + }, "base64-arraybuffer": { "version": "0.1.2" }, "base64-js": { - "version": "1.2.1" + "version": "1.2.0" }, "base64id": { "version": "0.1.0", @@ -647,6 +626,10 @@ "basic-auth": { "version": "1.0.0" }, + "batch": { + "version": "0.6.1", + "dev": true + }, "bcrypt-pbkdf": { "version": "1.0.1", "optional": true @@ -680,15 +663,21 @@ "version": "2.0.3" }, "readable-stream": { - "version": "2.3.2" + "version": "2.3.0" }, "string_decoder": { - "version": "1.0.3" + "version": "1.0.2", + "dependencies": { + "safe-buffer": { + "version": "5.0.1" + } + } } } }, "blessed": { - "version": "0.1.81" + "version": "0.1.81", + "dev": true }, "blob": { "version": "0.0.4" @@ -699,9 +688,6 @@ "bluebird": { "version": "2.11.0" }, - "bn.js": { - "version": "4.11.7" - }, "body-parser": { "version": "1.17.2", "dependencies": { @@ -736,9 +722,6 @@ "version": "1.0.0", "dev": true }, - "brorand": { - "version": "1.1.0" - }, "browser-filesaver": { "version": "1.1.0" }, @@ -756,21 +739,6 @@ "version": "1.3.0", "dev": true }, - "browserify-aes": { - "version": "1.0.6" - }, - "browserify-cipher": { - "version": "1.0.0" - }, - "browserify-des": { - "version": "1.0.0" - }, - "browserify-rsa": { - "version": "4.0.1" - }, - "browserify-sign": { - "version": "4.0.4" - }, "browserify-zlib": { "version": "0.1.4" }, @@ -784,14 +752,11 @@ "buffer": { "version": "4.9.1" }, - "buffer-xor": { - "version": "1.0.3" - }, "builtin-modules": { "version": "1.1.1" }, "builtin-status-codes": { - "version": "3.0.0" + "version": "2.0.0" }, "bytes": { "version": "2.4.0" @@ -822,7 +787,7 @@ } }, "caniuse-db": { - "version": "1.0.30000696" + "version": "1.0.30000692" }, "cardinal": { "version": "1.0.0", @@ -898,15 +863,7 @@ } }, "chokidar": { - "version": "1.7.0", - "dependencies": { - "is-extglob": { - "version": "1.0.0" - }, - "is-glob": { - "version": "2.0.1" - } - } + "version": "1.7.0" }, "chownr": { "version": "1.0.1" @@ -918,9 +875,6 @@ "version": "1.0.0", "dev": true }, - "cipher-base": { - "version": "1.0.3" - }, "circular-json": { "version": "0.3.1", "dev": true @@ -977,8 +931,7 @@ "version": "2.1.0" }, "clone": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "clone-regexp": { "version": "1.0.0", @@ -995,7 +948,7 @@ "version": "1.1.0" }, "collapse-white-space": { - "version": "1.0.3", + "version": "1.0.2", "dev": true }, "color-convert": { @@ -1037,15 +990,12 @@ "commander": { "version": "2.3.0" }, - "commondir": { - "version": "1.0.1" - }, "commoner": { "version": "0.10.8", "dev": true, "dependencies": { "commander": { - "version": "2.10.0", + "version": "2.9.0", "dev": true }, "glob": { @@ -1110,6 +1060,10 @@ } } }, + "connect-history-api-fallback": { + "version": "1.1.0", + "dev": true + }, "console-browserify": { "version": "1.1.0" }, @@ -1123,7 +1077,7 @@ "version": "3.1.0" }, "constants-browserify": { - "version": "1.0.0" + "version": "0.0.1" }, "content-disposition": { "version": "0.5.0" @@ -1151,13 +1105,13 @@ "version": "2.1.1" }, "copy-webpack-plugin": { - "version": "4.0.1", + "version": "3.0.1", "dependencies": { "glob": { "version": "6.0.4" }, - "loader-utils": { - "version": "0.2.17" + "minimatch": { + "version": "3.0.4" } } }, @@ -1180,15 +1134,6 @@ "crc32": { "version": "0.2.2" }, - "create-ecdh": { - "version": "4.0.0" - }, - "create-hash": { - "version": "1.1.3" - }, - "create-hmac": { - "version": "1.1.6" - }, "create-react-class": { "version": "15.5.3" }, @@ -1215,7 +1160,7 @@ "version": "2.0.5" }, "crypto-browserify": { - "version": "3.11.0" + "version": "3.2.8" }, "css-color-names": { "version": "0.0.3", @@ -1256,7 +1201,7 @@ "version": "1.2.0" }, "d3-collection": { - "version": "1.0.4" + "version": "1.0.3" }, "d3-color": { "version": "1.0.3" @@ -1395,9 +1340,6 @@ "depd": { "version": "1.1.0" }, - "des.js": { - "version": "1.0.0" - }, "destroy": { "version": "1.0.3" }, @@ -1417,9 +1359,6 @@ "diff": { "version": "1.4.0" }, - "diffie-hellman": { - "version": "5.0.2" - }, "disparity": { "version": "2.0.0", "dev": true @@ -1495,7 +1434,7 @@ "dev": true }, "readable-stream": { - "version": "2.3.2", + "version": "2.3.0", "dev": true, "dependencies": { "inherits": { @@ -1505,8 +1444,14 @@ } }, "string_decoder": { - "version": "1.0.3", - "dev": true + "version": "1.0.2", + "dev": true, + "dependencies": { + "safe-buffer": { + "version": "5.0.1", + "dev": true + } + } } } }, @@ -1528,9 +1473,6 @@ "element-class": { "version": "0.2.2" }, - "elliptic": { - "version": "6.4.0" - }, "email-validator": { "version": "1.0.1" }, @@ -1595,11 +1537,19 @@ } }, "enhanced-resolve": { - "version": "3.1.0" + "version": "0.9.1", + "dependencies": { + "memory-fs": { + "version": "0.2.0" + } + } }, "entities": { "version": "1.0.0" }, + "env-hash": { + "version": "1.1.0" + }, "enzyme": { "version": "2.4.1", "dev": true @@ -1907,12 +1857,13 @@ "event-stream": { "version": "3.3.4" }, + "eventemitter3": { + "version": "1.2.0", + "dev": true + }, "events": { "version": "1.0.2" }, - "evp_bytestokey": { - "version": "1.0.0" - }, "exec-sh": { "version": "0.2.0", "dev": true @@ -1941,12 +1892,7 @@ "version": "1.0.0" }, "exports-loader": { - "version": "0.6.2", - "dependencies": { - "loader-utils": { - "version": "0.2.17" - } - } + "version": "0.6.2" }, "express": { "version": "4.13.3", @@ -1966,12 +1912,7 @@ "version": "3.0.1" }, "extglob": { - "version": "0.3.2", - "dependencies": { - "is-extglob": { - "version": "1.0.0" - } - } + "version": "0.3.2" }, "extsprintf": { "version": "1.0.2" @@ -2046,12 +1987,18 @@ "dev": true }, "readable-stream": { - "version": "2.3.2", + "version": "2.3.0", "dev": true }, "string_decoder": { - "version": "1.0.3", - "dev": true + "version": "1.0.2", + "dev": true, + "dependencies": { + "safe-buffer": { + "version": "5.0.1", + "dev": true + } + } }, "through2": { "version": "2.0.3", @@ -2078,7 +2025,13 @@ }, "fileset": { "version": "2.0.3", - "dev": true + "dev": true, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "dev": true + } + } }, "filesize": { "version": "3.2.1" @@ -2089,15 +2042,17 @@ "finalhandler": { "version": "0.4.0" }, - "find-cache-dir": { - "version": "0.1.1" - }, "find-parent-dir": { "version": "0.3.0", "dev": true }, "find-up": { - "version": "1.1.2" + "version": "1.1.2", + "dependencies": { + "path-exists": { + "version": "2.1.0" + } + } }, "findup": { "version": "0.1.5", @@ -2127,7 +2082,7 @@ "dev": true }, "flow-parser": { - "version": "0.49.1", + "version": "0.47.0", "dev": true }, "flux": { @@ -2696,26 +2651,10 @@ "version": "7.0.3" }, "glob-base": { - "version": "0.3.0", - "dependencies": { - "is-extglob": { - "version": "1.0.0" - }, - "is-glob": { - "version": "2.0.1" - } - } + "version": "0.3.0" }, "glob-parent": { - "version": "2.0.0", - "dependencies": { - "is-extglob": { - "version": "1.0.0" - }, - "is-glob": { - "version": "2.0.1" - } - } + "version": "2.0.0" }, "globals": { "version": "9.18.0" @@ -2735,6 +2674,9 @@ }, "lodash": { "version": "4.17.4" + }, + "minimatch": { + "version": "3.0.4" } } }, @@ -2789,12 +2731,18 @@ "dev": true }, "readable-stream": { - "version": "2.3.2", + "version": "2.3.0", "dev": true }, "string_decoder": { - "version": "1.0.3", - "dev": true + "version": "1.0.2", + "dev": true, + "dependencies": { + "safe-buffer": { + "version": "5.0.1", + "dev": true + } + } }, "through2": { "version": "2.0.3", @@ -2818,27 +2766,12 @@ "version": "1.5.2", "dev": true }, - "optimist": { - "version": "0.6.1", - "dev": true - }, "source-map": { "version": "0.4.4", "dev": true } } }, - "happypack": { - "version": "4.0.0-beta.1", - "dependencies": { - "async": { - "version": "1.5.0" - }, - "loader-utils": { - "version": "0.2.16" - } - } - }, "har-schema": { "version": "1.0.5" }, @@ -2846,7 +2779,7 @@ "version": "4.2.1" }, "hard-source-webpack-plugin": { - "version": "0.3.12", + "version": "0.0.42", "dependencies": { "bluebird": { "version": "3.5.0" @@ -2887,26 +2820,12 @@ "has-unicode": { "version": "2.0.1" }, - "hash-base": { - "version": "2.0.2" - }, - "hash.js": { - "version": "1.1.2", - "dependencies": { - "inherits": { - "version": "2.0.3" - } - } - }, "hawk": { "version": "3.1.3" }, "he": { "version": "0.5.0" }, - "hmac-drbg": { - "version": "1.0.1" - }, "hoek": { "version": "2.16.3" }, @@ -2914,10 +2833,10 @@ "version": "1.2.0" }, "home-or-tmp": { - "version": "2.0.0" + "version": "1.0.0" }, "hosted-git-info": { - "version": "2.5.0" + "version": "2.4.2" }, "html": { "version": "1.0.0", @@ -2927,15 +2846,9 @@ "version": "1.0.1", "dev": true }, - "html-entities": { - "version": "1.2.1" - }, "html-loader": { "version": "0.4.0", "dependencies": { - "loader-utils": { - "version": "0.2.17" - }, "source-map": { "version": "0.5.6" } @@ -2968,6 +2881,9 @@ "htmlparser2": { "version": "3.8.3" }, + "http-browserify": { + "version": "1.7.0" + }, "http-errors": { "version": "1.6.1", "dependencies": { @@ -2976,11 +2892,15 @@ } } }, + "http-proxy": { + "version": "1.16.2", + "dev": true + }, "http-signature": { "version": "1.1.1" }, "https-browserify": { - "version": "0.0.1" + "version": "0.0.0" }, "husky": { "version": "0.13.3", @@ -3007,7 +2927,7 @@ "version": "1.5.2" }, "commander": { - "version": "2.10.0" + "version": "2.9.0" } } }, @@ -3028,16 +2948,10 @@ "version": "3.7.6" }, "imports-loader": { - "version": "0.6.5", - "dependencies": { - "loader-utils": { - "version": "0.2.17" - } - } + "version": "0.6.5" }, "imurmurhash": { - "version": "0.1.4", - "dev": true + "version": "0.1.4" }, "in-publish": { "version": "2.0.0" @@ -3082,7 +2996,7 @@ "version": "1.1.0" }, "interpret": { - "version": "1.0.3" + "version": "0.6.6" }, "interval-tree-1d": { "version": "1.0.3" @@ -3135,7 +3049,7 @@ "version": "0.1.1" }, "is-extglob": { - "version": "2.1.1" + "version": "1.0.0" }, "is-finite": { "version": "1.0.2" @@ -3144,7 +3058,7 @@ "version": "1.0.0" }, "is-glob": { - "version": "3.1.0" + "version": "2.0.1" }, "is-integer": { "version": "1.0.7" @@ -3290,11 +3204,11 @@ } }, "istanbul-api": { - "version": "1.1.10", + "version": "1.1.9", "dev": true, "dependencies": { "async": { - "version": "2.5.0", + "version": "2.4.1", "dev": true } } @@ -3308,7 +3222,7 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "1.7.3", + "version": "1.7.2", "dev": true, "dependencies": { "semver": { @@ -3727,22 +3641,10 @@ "version": "6.4.1", "dev": true }, - "home-or-tmp": { - "version": "1.0.0", - "dev": true - }, "js-tokens": { "version": "1.0.1", "dev": true }, - "json5": { - "version": "0.4.0", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "dev": true - }, "minimist": { "version": "1.2.0", "dev": true @@ -3751,10 +3653,6 @@ "version": "0.1.8", "dev": true }, - "path-exists": { - "version": "1.0.0", - "dev": true - }, "repeating": { "version": "1.1.3", "dev": true @@ -3810,7 +3708,7 @@ "version": "3.3.2" }, "json5": { - "version": "0.5.1" + "version": "0.4.0" }, "jsonfile": { "version": "2.4.0" @@ -3938,11 +3836,13 @@ "load-json-file": { "version": "1.1.0" }, - "loader-runner": { - "version": "2.3.0" - }, "loader-utils": { - "version": "1.1.0" + "version": "0.2.17", + "dependencies": { + "json5": { + "version": "0.5.1" + } + } }, "localforage": { "version": "1.4.3" @@ -4148,16 +4048,21 @@ "version": "0.3.0" }, "memory-fs": { - "version": "0.4.1", + "version": "0.3.0", "dependencies": { "inherits": { "version": "2.0.3" }, "readable-stream": { - "version": "2.3.2" + "version": "2.3.0" }, "string_decoder": { - "version": "1.0.3" + "version": "1.0.2", + "dependencies": { + "safe-buffer": { + "version": "5.0.1" + } + } } } }, @@ -4180,18 +4085,7 @@ "version": "1.1.2" }, "micromatch": { - "version": "2.3.11", - "dependencies": { - "is-extglob": { - "version": "1.0.0" - }, - "is-glob": { - "version": "2.0.1" - } - } - }, - "miller-rabin": { - "version": "4.0.0" + "version": "2.3.11" }, "mime": { "version": "1.3.4" @@ -4202,14 +4096,8 @@ "mime-types": { "version": "2.1.15" }, - "minimalistic-assert": { - "version": "1.0.0" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1" - }, "minimatch": { - "version": "3.0.4" + "version": "2.0.10" }, "minimist": { "version": "0.0.8" @@ -4243,6 +4131,10 @@ "version": "7.0.5", "dev": true }, + "minimatch": { + "version": "3.0.4", + "dev": true + }, "supports-color": { "version": "3.1.2", "dev": true @@ -4283,7 +4175,13 @@ }, "multimatch": { "version": "2.1.0", - "dev": true + "dev": true, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "dev": true + } + } }, "multipipe": { "version": "0.1.2", @@ -4334,7 +4232,12 @@ "version": "1.0.0" }, "node-dir": { - "version": "0.1.17" + "version": "0.1.17", + "dependencies": { + "minimatch": { + "version": "3.0.4" + } + } }, "node-emoji": { "version": "1.5.1", @@ -4346,6 +4249,9 @@ "node-gyp": { "version": "3.6.2", "dependencies": { + "minimatch": { + "version": "3.0.4" + }, "semver": { "version": "5.3.0" } @@ -4356,20 +4262,7 @@ "dev": true }, "node-libs-browser": { - "version": "2.0.0", - "dependencies": { - "inherits": { - "version": "2.0.3" - }, - "readable-stream": { - "version": "2.3.2", - "dependencies": { - "string_decoder": { - "version": "1.0.3" - } - } - } - } + "version": "0.6.0" }, "node-localstorage": { "version": "0.6.0", @@ -4416,6 +4309,10 @@ "version": "1.0.10", "dev": true }, + "optimist": { + "version": "0.2.8", + "dev": true + }, "ps-tree": { "version": "0.0.3", "dev": true @@ -4451,7 +4348,7 @@ "version": "3.0.6" }, "normalize-package-data": { - "version": "2.4.0" + "version": "2.3.8" }, "normalize-path": { "version": "2.1.1" @@ -4489,6 +4386,9 @@ "load-json-file": { "version": "2.0.0" }, + "minimatch": { + "version": "3.0.4" + }, "path-type": { "version": "2.0.0" }, @@ -4504,7 +4404,7 @@ } }, "npmlog": { - "version": "4.1.2" + "version": "4.1.0" }, "nth-check": { "version": "1.0.1", @@ -4571,8 +4471,7 @@ "dev": true }, "optimist": { - "version": "0.2.8", - "dev": true + "version": "0.6.1" }, "optionator": { "version": "0.8.2", @@ -4588,7 +4487,7 @@ "version": "0.0.6" }, "os-browserify": { - "version": "0.2.1" + "version": "0.1.2" }, "os-homedir": { "version": "1.0.2" @@ -4627,19 +4526,8 @@ "param-case": { "version": "1.1.2" }, - "parse-asn1": { - "version": "5.1.0" - }, "parse-glob": { - "version": "3.0.4", - "dependencies": { - "is-extglob": { - "version": "1.0.0" - }, - "is-glob": { - "version": "2.0.1" - } - } + "version": "3.0.4" }, "parse-int": { "version": "1.0.2" @@ -4680,7 +4568,7 @@ "version": "1.1.2" }, "path-exists": { - "version": "2.1.0" + "version": "1.0.0" }, "path-is-absolute": { "version": "1.0.1" @@ -4701,8 +4589,8 @@ "pause-stream": { "version": "0.0.11" }, - "pbkdf2": { - "version": "3.0.12" + "pbkdf2-compat": { + "version": "2.0.1" }, "percentage-regex": { "version": "3.0.0" @@ -4731,9 +4619,6 @@ "version": "2.0.3", "dev": true }, - "pkg-dir": { - "version": "1.0.0" - }, "plur": { "version": "2.1.2", "dev": true @@ -4819,8 +4704,8 @@ }, "prettier": { "version": "1.1.7", - "from": "git+https://github.com/Automattic/calypso-prettier.git#fe7705e62920d76581e8ea42c6699c8d1dead7ac", - "resolved": "git+https://github.com/Automattic/calypso-prettier.git#fe7705e62920d76581e8ea42c6699c8d1dead7ac", + "from": "git+https://github.com/Automattic/calypso-prettier.git#28be4a70ff31bd161c545de4fac66f8a9d094a48", + "resolved": "git+https://github.com/Automattic/calypso-prettier.git#28be4a70ff31bd161c545de4fac66f8a9d094a48", "dev": true, "dependencies": { "ast-types": { @@ -4847,6 +4732,10 @@ "version": "7.1.1", "dev": true }, + "minimatch": { + "version": "3.0.4", + "dev": true + }, "minimist": { "version": "1.2.0", "dev": true @@ -4922,9 +4811,6 @@ "pseudomap": { "version": "1.0.2" }, - "public-encrypt": { - "version": "4.0.0" - }, "pump": { "version": "1.0.2" }, @@ -4965,9 +4851,6 @@ } } }, - "randombytes": { - "version": "2.0.5" - }, "range-parser": { "version": "1.0.3" }, @@ -5068,7 +4951,7 @@ "version": "5.8.38" }, "commander": { - "version": "2.10.0" + "version": "2.9.0" } } }, @@ -5080,13 +4963,16 @@ "dev": true }, "react-hot-api": { - "version": "0.4.7" + "version": "0.4.7", + "dev": true }, "react-hot-loader": { - "version": "1.3.1", + "version": "1.3.0", + "dev": true, "dependencies": { "source-map": { - "version": "0.4.4" + "version": "0.4.4", + "dev": true } } }, @@ -5146,12 +5032,18 @@ "dev": true }, "readable-stream": { - "version": "2.3.2", + "version": "2.3.0", "dev": true }, "string_decoder": { - "version": "1.0.3", - "dev": true + "version": "1.0.2", + "dev": true, + "dependencies": { + "safe-buffer": { + "version": "5.0.1", + "dev": true + } + } } } }, @@ -5178,11 +5070,19 @@ "inherits": { "version": "2.0.3" }, + "minimatch": { + "version": "3.0.4" + }, "readable-stream": { - "version": "2.3.2" + "version": "2.3.0" }, "string_decoder": { - "version": "1.0.3" + "version": "1.0.2", + "dependencies": { + "safe-buffer": { + "version": "5.0.1" + } + } } } }, @@ -5358,6 +5258,10 @@ "version": "1.1.0", "dev": true }, + "requires-port": { + "version": "1.0.0", + "dev": true + }, "resolve": { "version": "1.3.3" }, @@ -5377,11 +5281,14 @@ "dependencies": { "glob": { "version": "7.1.2" + }, + "minimatch": { + "version": "3.0.4" } } }, "ripemd160": { - "version": "2.0.1" + "version": "0.2.0" }, "rocambole": { "version": "0.7.0", @@ -5440,7 +5347,7 @@ "dev": true }, "safe-buffer": { - "version": "5.1.1" + "version": "5.1.0" }, "samsam": { "version": "1.1.2", @@ -5450,6 +5357,10 @@ "version": "1.4.1", "dev": true, "dependencies": { + "minimatch": { + "version": "3.0.4", + "dev": true + }, "minimist": { "version": "1.2.0", "dev": true @@ -5474,7 +5385,7 @@ } }, "sax": { - "version": "1.2.4", + "version": "1.2.2", "dev": true }, "scss-tokenizer": { @@ -5515,13 +5426,36 @@ "sentence-case": { "version": "1.1.3" }, - "serialize-error": { - "version": "2.1.0" - }, "serializerr": { "version": "1.0.3", "dev": true }, + "serve-index": { + "version": "1.9.0", + "dev": true, + "dependencies": { + "accepts": { + "version": "1.3.3", + "dev": true + }, + "debug": { + "version": "2.6.8", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "dev": true + }, + "ms": { + "version": "2.0.0", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "dev": true + } + } + }, "serve-static": { "version": "1.10.3", "dependencies": { @@ -5555,7 +5489,7 @@ "version": "1.0.3" }, "sha.js": { - "version": "2.4.8" + "version": "2.2.6" }, "shebang-command": { "version": "1.2.0" @@ -5677,12 +5611,7 @@ "version": "0.1.39" }, "source-map-loader": { - "version": "0.1.5", - "dependencies": { - "loader-utils": { - "version": "0.2.17" - } - } + "version": "0.1.5" }, "source-map-support": { "version": "0.3.2", @@ -5743,40 +5672,15 @@ "version": "1.3.16" }, "stream-browserify": { - "version": "2.0.1", - "dependencies": { - "readable-stream": { - "version": "2.3.2", - "dependencies": { - "inherits": { - "version": "2.0.3" - } - } - }, - "string_decoder": { - "version": "1.0.3" - } - } + "version": "1.0.0" + }, + "stream-cache": { + "version": "0.0.2", + "dev": true }, "stream-combiner": { "version": "0.0.4" }, - "stream-http": { - "version": "2.7.2", - "dependencies": { - "readable-stream": { - "version": "2.3.2", - "dependencies": { - "inherits": { - "version": "2.0.3" - } - } - }, - "string_decoder": { - "version": "1.0.3" - } - } - }, "stream-shift": { "version": "1.0.0", "dev": true @@ -5875,7 +5779,7 @@ "dev": true }, "readable-stream": { - "version": "2.3.2", + "version": "2.3.0", "dev": true, "dependencies": { "inherits": { @@ -5889,8 +5793,14 @@ "dev": true }, "string_decoder": { - "version": "1.0.3", - "dev": true + "version": "1.0.2", + "dev": true, + "dependencies": { + "safe-buffer": { + "version": "5.0.1", + "dev": true + } + } }, "supports-color": { "version": "2.0.0", @@ -5918,10 +5828,15 @@ "version": "6.4.0" }, "readable-stream": { - "version": "2.3.2" + "version": "2.3.0" }, "string_decoder": { - "version": "1.0.3" + "version": "1.0.2", + "dependencies": { + "safe-buffer": { + "version": "5.0.1" + } + } } } }, @@ -5955,10 +5870,6 @@ "version": "3.8.3", "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "dev": true - }, "chalk": { "version": "1.1.3", "dev": true @@ -5968,14 +5879,8 @@ "dev": true }, "string-width": { - "version": "2.1.0", - "dev": true, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "dev": true - } - } + "version": "2.0.0", + "dev": true }, "supports-color": { "version": "2.0.0", @@ -5984,7 +5889,7 @@ } }, "tapable": { - "version": "0.2.6" + "version": "0.1.10" }, "tar": { "version": "2.2.1" @@ -5999,10 +5904,15 @@ "version": "2.0.3" }, "readable-stream": { - "version": "2.3.2" + "version": "2.3.0" }, "string_decoder": { - "version": "1.0.3" + "version": "1.0.2", + "dependencies": { + "safe-buffer": { + "version": "5.0.1" + } + } } } }, @@ -6051,7 +5961,7 @@ "dev": true }, "timers-browserify": { - "version": "2.0.2" + "version": "1.4.2" }, "tiny-emitter": { "version": "1.2.0" @@ -6072,9 +5982,6 @@ "to-array": { "version": "0.1.4" }, - "to-arraybuffer": { - "version": "1.0.1" - }, "to-camel-case": { "version": "1.0.0" }, @@ -6164,7 +6071,7 @@ "version": "0.0.6" }, "ua-parser-js": { - "version": "0.7.13" + "version": "0.7.12" }, "uglify-js": { "version": "2.7.0", @@ -6235,7 +6142,7 @@ "version": "1.1.0" }, "url": { - "version": "0.11.0", + "version": "0.10.3", "dependencies": { "punycode": { "version": "1.3.2" @@ -6326,12 +6233,7 @@ "dev": true }, "watchpack": { - "version": "1.3.1", - "dependencies": { - "async": { - "version": "2.5.0" - } - } + "version": "0.2.9" }, "webidl-conversions": { "version": "2.0.1", @@ -6339,57 +6241,26 @@ "optional": true }, "webpack": { - "version": "2.3.2", + "version": "1.13.1", "dependencies": { - "acorn": { - "version": "4.0.13" - }, "async": { - "version": "2.5.0" - }, - "loader-utils": { - "version": "0.2.17" - }, - "source-list-map": { - "version": "1.1.2" + "version": "1.5.2" }, "source-map": { "version": "0.5.6" }, "uglify-js": { - "version": "2.8.29", - "dependencies": { - "yargs": { - "version": "3.10.0" - } - } - }, - "webpack-sources": { - "version": "0.2.3" - }, - "yargs": { - "version": "6.6.0", - "dependencies": { - "camelcase": { - "version": "3.0.0" - }, - "cliui": { - "version": "3.2.0" - } - } - }, - "yargs-parser": { - "version": "4.2.1", + "version": "2.6.4", "dependencies": { - "camelcase": { - "version": "3.0.0" + "async": { + "version": "0.2.10" } } } } }, "webpack-bundle-analyzer": { - "version": "2.8.2", + "version": "2.2.1", "dev": true, "dependencies": { "accepts": { @@ -6397,7 +6268,7 @@ "dev": true }, "acorn": { - "version": "5.0.3", + "version": "4.0.13", "dev": true }, "chalk": { @@ -6405,7 +6276,7 @@ "dev": true }, "commander": { - "version": "2.10.0", + "version": "2.9.0", "dev": true }, "content-disposition": { @@ -6484,10 +6355,6 @@ "version": "1.2.0", "dev": true }, - "safe-buffer": { - "version": "5.0.1", - "dev": true - }, "send": { "version": "0.15.3", "dev": true @@ -6500,23 +6367,12 @@ "version": "2.0.0", "dev": true }, - "ultron": { - "version": "1.1.0", - "dev": true - }, "vary": { "version": "1.1.1", "dev": true - }, - "ws": { - "version": "2.3.1", - "dev": true } } }, - "webpack-chunk-hash": { - "version": "0.4.0" - }, "webpack-core": { "version": "0.6.9", "dependencies": { @@ -6526,109 +6382,152 @@ } }, "webpack-dashboard": { - "version": "0.2.1", + "version": "0.2.0", + "dev": true, "dependencies": { "accepts": { - "version": "1.3.3" + "version": "1.3.3", + "dev": true }, "after": { - "version": "0.8.2" + "version": "0.8.2", + "dev": true }, "base64-arraybuffer": { - "version": "0.1.5" + "version": "0.1.5", + "dev": true }, "base64id": { - "version": "1.0.0" + "version": "1.0.0", + "dev": true }, "commander": { - "version": "2.10.0" + "version": "2.9.0", + "dev": true }, "component-emitter": { - "version": "1.2.1" + "version": "1.1.2", + "dev": true }, "cookie": { - "version": "0.3.1" + "version": "0.3.1", + "dev": true }, "cross-spawn": { - "version": "4.0.2" + "version": "4.0.2", + "dev": true }, "debug": { - "version": "2.3.3" + "version": "2.3.3", + "dev": true }, "engine.io": { "version": "1.8.4", + "dev": true + }, + "engine.io-client": { + "version": "1.8.4", + "dev": true, "dependencies": { + "component-emitter": { + "version": "1.2.1", + "dev": true + }, "ws": { - "version": "1.1.4" + "version": "1.1.2", + "dev": true } } }, - "engine.io-client": { - "version": "1.8.4" - }, "engine.io-parser": { - "version": "1.3.2" + "version": "1.3.2", + "dev": true }, "filesize": { - "version": "3.5.10" + "version": "3.5.10", + "dev": true }, "isarray": { - "version": "0.0.1" + "version": "0.0.1", + "dev": true }, "ms": { - "version": "0.7.2" + "version": "0.7.2", + "dev": true }, "negotiator": { - "version": "0.6.1" + "version": "0.6.1", + "dev": true }, "object-assign": { - "version": "4.1.0" + "version": "4.1.0", + "dev": true }, "parsejson": { - "version": "0.0.3" + "version": "0.0.3", + "dev": true }, "parseqs": { - "version": "0.0.5" + "version": "0.0.5", + "dev": true }, "parseuri": { - "version": "0.0.5" + "version": "0.0.5", + "dev": true }, "socket.io": { - "version": "1.7.4" + "version": "1.7.4", + "dev": true }, "socket.io-adapter": { - "version": "0.5.0" + "version": "0.5.0", + "dev": true }, "socket.io-client": { - "version": "1.7.4" + "version": "1.7.4", + "dev": true, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "dev": true + } + } }, "socket.io-parser": { "version": "2.3.1", + "dev": true, "dependencies": { - "component-emitter": { - "version": "1.1.2" - }, "debug": { - "version": "2.2.0" + "version": "2.2.0", + "dev": true }, "ms": { - "version": "0.7.1" + "version": "0.7.1", + "dev": true } } }, "ws": { - "version": "1.1.2" + "version": "1.1.4", + "dev": true }, "xmlhttprequest-ssl": { - "version": "1.5.3" + "version": "1.5.3", + "dev": true } } }, "webpack-dev-middleware": { - "version": "1.9.0" + "version": "1.2.0", + "dependencies": { + "memory-fs": { + "version": "0.2.0" + } + } }, - "webpack-hot-middleware": { - "version": "2.15.0" + "webpack-dev-server": { + "version": "1.11.0", + "dev": true }, "webpack-sources": { "version": "0.1.5", @@ -6692,12 +6591,7 @@ "dev": true }, "wp-error": { - "version": "1.3.0", - "dependencies": { - "builtin-status-codes": { - "version": "2.0.0" - } - } + "version": "1.3.0" }, "wpcom": { "version": "5.4.0", @@ -6766,7 +6660,8 @@ "version": "1.0.1" }, "wtf-8": { - "version": "1.0.0" + "version": "1.0.0", + "dev": true }, "xdg-basedir": { "version": "1.0.1", diff --git a/package.json b/package.json index 4818042819d63..e06b84e551c25 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "async": "0.9.0", "autoprefixer": "6.3.5", "autosize": "3.0.15", - "babel-core": "6.24.1", - "babel-loader": "7.0.0", + "babel-core": "6.9.1", + "babel-loader": "6.2.4", "babel-plugin-add-module-exports": "0.2.1", "babel-plugin-lodash": "3.2.0", "babel-plugin-syntax-jsx": "6.8.0", @@ -43,7 +43,7 @@ "component-uid": "0.0.2", "cookie": "0.1.2", "cookie-parser": "1.3.2", - "copy-webpack-plugin": "4.0.1", + "copy-webpack-plugin": "3.0.1", "create-react-class": "15.5.3", "creditcards": "2.1.2", "cross-env": "4.0.0", @@ -71,8 +71,7 @@ "get-video-id": "2.1.4", "globby": "6.1.0", "gridicons": "1.1.0", - "happypack": "4.0.0-beta.1", - "hard-source-webpack-plugin": "0.3.12", + "hard-source-webpack-plugin": "0.0.42", "he": "0.5.0", "html-loader": "0.4.0", "i18n-calypso": "1.7.3", @@ -118,7 +117,6 @@ "react-day-picker": "6.0.2", "react-docgen": "2.13.0", "react-dom": "15.4.0", - "react-hot-loader": "1.3.1", "react-modal": "1.6.5", "react-pure-render": "1.0.2", "react-redux": "5.0.3", @@ -145,11 +143,8 @@ "uuid": "2.0.1", "valid-url": "1.0.9", "walk": "2.3.4", - "webpack": "2.3.2", - "webpack-chunk-hash": "0.4.0", - "webpack-dashboard": "0.2.1", - "webpack-dev-middleware": "1.9.0", - "webpack-hot-middleware": "2.15.0", + "webpack": "1.13.1", + "webpack-dev-middleware": "1.2.0", "wpcom": "5.4.0", "wpcom-oauth": "0.3.3", "wpcom-proxy-request": "3.0.0", @@ -190,7 +185,7 @@ "clean:devdocs": "npm run -s rm -- server/devdocs/search-index.js && npm run -s rm -- server/devdocs/proptypes-index.json && npm run -s rm -- server/devdocs/components-usage-stats.json", "clean:public": "npm run -s rm -- public .css .css.map .js .js.map", "predashboard": "npm run -s install-if-deps-outdated", - "dashboard": "DASHBOARD=1 webpack-dashboard -- npm start", + "dashboard": "webpack-dashboard -- npm start", "distclean": "npm run -s clean && npm run -s rm -- node_modules", "docker": "docker run -it --name wp-calypso --rm -p 80:3000 -e NODE_ENV=wpcalypso -e CALYPSO_ENV=wpcalypso wp-calypso", "env": "cross-env NODE_PATH=$NODE_PATH:server:client:.", @@ -257,6 +252,7 @@ "prettier": "git+https://github.com/Automattic/calypso-prettier.git#calypso-1.1", "react-addons-test-utils": "15.4.0", "react-codemod": "github:reactjs/react-codemod", + "react-hot-loader": "1.3.0", "react-test-env": "0.2.0", "readline-sync": "1.4.5", "sinon": "1.17.7", @@ -264,7 +260,9 @@ "socket.io": "1.4.5", "stylelint": "6.9.0", "supertest": "2.0.0", - "webpack-bundle-analyzer": "2.8.2" + "webpack-bundle-analyzer": "2.2.1", + "webpack-dashboard": "0.2.0", + "webpack-dev-server": "1.11.0" }, "optionalDependencies": { "fsevents": "1.1.1" diff --git a/server/bundler/babel/babel-loader-cache-identifier/index.js b/server/bundler/babel/babel-loader-cache-identifier/index.js index bcb15aed4d4dc..6c7bce3f8e369 100644 --- a/server/bundler/babel/babel-loader-cache-identifier/index.js +++ b/server/bundler/babel/babel-loader-cache-identifier/index.js @@ -11,7 +11,7 @@ const path = require( 'path' ); * @return {String} Module version */ function getModuleVersion( id ) { - return require( path.dirname( require.resolve( id ) ).replace( /[\/\\]lib/, '' ) + '/package' ).version; + return require( path.dirname( require.resolve( id ) ) + '/package' ).version; } /** diff --git a/server/bundler/bin/bundler.js b/server/bundler/bin/bundler.js index 6b4eed274bb86..11732f724d192 100755 --- a/server/bundler/bin/bundler.js +++ b/server/bundler/bin/bundler.js @@ -53,7 +53,7 @@ function minify( files ) { file, '-m', '-c', - '-o', file.replace( '.js', '.min.js' ) + '-o', file.replace( '.js', '.m.js' ) ], // have to pipe stderr to parent, otherwise large bundles will never finish // see https://github.com/nodejs/node-v0.x-archive/issues/6764 diff --git a/server/bundler/index.js b/server/bundler/index.js index 4496a8a139c9b..34f177dd88624 100644 --- a/server/bundler/index.js +++ b/server/bundler/index.js @@ -4,7 +4,6 @@ var webpackMiddleware = require( 'webpack-dev-middleware' ), webpack = require( 'webpack' ), chalk = require( 'chalk' ); -const hotMiddleware = require( 'webpack-hot-middleware' ); var utils = require( './utils' ), webpackConfig = require( 'webpack.config' ); @@ -16,14 +15,8 @@ function middleware( app ) { beforeFirstCompile = true, assets; - app.use( hotMiddleware( compiler ) ); - app.set( 'compiler', compiler ); - compiler.apply( new webpack.ProgressPlugin( { - profile: true, - } ) ); - compiler.plugin( 'done', function( stats ) { built = true; assets = utils.getAssets( stats.toJson() ); @@ -84,7 +77,7 @@ function middleware( app ) { hash: true, version: false, timings: true, - assets: false, + assets: true, chunks: true, chunkModules: false, modules: false, diff --git a/server/bundler/loader.js b/server/bundler/loader.js index 8d97804339240..46806f6faef1d 100644 --- a/server/bundler/loader.js +++ b/server/bundler/loader.js @@ -163,6 +163,8 @@ function singleEnsure( chunkName ) { module.exports = function( content ) { var sections; + this.cacheable && this.cacheable(); + sections = require( this.resourcePath ); if ( ! Array.isArray( sections ) ) { diff --git a/server/bundler/plugin.js b/server/bundler/plugin.js index 6959b15d029ab..8b36659a0a007 100644 --- a/server/bundler/plugin.js +++ b/server/bundler/plugin.js @@ -8,20 +8,15 @@ ChunkFileNames.prototype.apply = function( compiler ) { return this.asString( [ "// \"0\" is the signal for \"already loaded\"", "if ( installedChunks[ chunkId ] === 0 ) {", - this.indent("return Promise.resolve();"), + this.indent("return callback.call( null, " + this.requireFn + " );"), "}", - "// a Promise means \"currently loading\".", - "if ( installedChunks[ chunkId ] ) {", - this.indent( "return installedChunks[ chunkId ][2];" ), + "// an array means \"currently loading\".", + "if ( installedChunks[ chunkId ] !== undefined ) {", + this.indent( "installedChunks[ chunkId ].push( callback );" ), " } else { ", this.indent( [ "// start chunk loading", - "var promise = new Promise( function( resolve, reject ) {", - this.indent( [ - "installedChunks[ chunkId ] = [ resolve, reject ];" - ] ), - "} );", - "installedChunks[ chunkId ][2] = promise;", + "installedChunks[ chunkId ] = [ callback ];", "window.__chunkErrors = window.__chunkErrors || {};", "window.__chunkErrors[ " + JSON.stringify( chunkMaps.name ) + "[chunkId]||chunkId ]=null;", "var head = document.getElementsByTagName('head')[0];", @@ -35,12 +30,11 @@ ChunkFileNames.prototype.apply = function( compiler ) { "script.onerror = script.onload = script.onreadystatechange = null;", "delete installedChunks[ chunkId ];", "window.__chunkErrors[ " + JSON.stringify( chunkMaps.name ) + "[chunkId]||chunkId ]=new Error();", - "return Promise.resolve();" + "callback.call( null, " + this.requireFn + ")" ] ), "};", - "script.src = " + this.requireFn + ".p + (" + JSON.stringify( chunkMaps.name ) + "[chunkId]||chunkId) + '.' + (" + JSON.stringify( chunkMaps.hash ) + "[chunkId]||chunkID) + ( isDebug ? '' : '.min' ) + '.js';", - "head.appendChild( script );", - "return promise;" + "script.src = " + this.requireFn + ".p + (" + JSON.stringify( chunkMaps.name ) + "[chunkId]||chunkId) + '.' + (" + JSON.stringify( chunkMaps.hash ) + "[chunkId]||chunkID) + ( isDebug ? '' : '.m' ) + '.js';", + "head.appendChild( script );" ] ), "}" ] ); diff --git a/server/bundler/webpack-plugins/NamedModulesPlugin.js b/server/bundler/webpack-plugins/NamedModulesPlugin.js deleted file mode 100644 index a8553302a846a..0000000000000 --- a/server/bundler/webpack-plugins/NamedModulesPlugin.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - -class NamedModulesPlugin { - constructor( options ) { - this.options = options || {}; - } - - apply( compiler ) { - compiler.plugin( 'compilation', compilation => { - compilation.plugin( 'before-module-ids', modules => { - modules.forEach( module => { - if ( module.id === null && module.libIdent ) { - module.id = module.libIdent( { - context: this.options.context || compiler.options.context, - } ); - } - } ); - } ); - } ); - } -} - -module.exports = NamedModulesPlugin; diff --git a/server/bundler/webpack/stable-build-plugin.js b/server/bundler/webpack/stable-build-plugin.js new file mode 100644 index 0000000000000..d6e4946333c49 --- /dev/null +++ b/server/bundler/webpack/stable-build-plugin.js @@ -0,0 +1,130 @@ +const crypto = require( 'crypto' ); + +const md5Cache = {}; + +function md5( content ) { + if ( ! md5Cache[ content ] ) { + md5Cache[ content ] = crypto.createHash( 'md5' ).update( content, 'utf-8' ).digest( 'hex' ); + } + return md5Cache[ content ]; +} + +function hashToId( hash, seed, hashSize ) { + // Generate a unsigned integer sized bits using a part of the MD5 + // hash. Seed is a number 0..31 and the hash is expected to be 32 chars + // (nibbles) long. + + // double the hash to allow overflow + hash = hash + hash; + + // get lower and upper 28 bits + const lsb = parseInt( hash.substr( seed, 7 ), 16 ); + const msb = parseInt( hash.substr( seed + 7, 7 ), 16 ); + + // combine them to get the ID + // NOTE: Logical operators only work up to 31 bits (because values will be + // casted to 32bit signed integer), so we use classic arithmetic! + const lsbBits = Math.min( 28, hashSize ); + const msbBits = Math.max( 0, hashSize - 28 ); + const lsbMask = Math.pow( 2, lsbBits ) - 1; + const msbMask = Math.pow( 2, msbBits ) - 1; + return ( lsb & lsbMask ) + ( ( msb & msbMask ) * Math.pow( 2, 28 ) ); +} + +function sortById( a, b ) { + return a > b ? 1 : a < b ? -1 : 0; //eslint-disable-line no-nested-ternary +} + +function getModuleSource( module ) { + return { + id: module.id, + source: ( module._source || {} )._value || '', + dependencies: ( module.dependencies || [] ).map( function( d ) { + return d.module ? d.module.id : ''; + } ) + }; +} + +function concatenateSource( result, module ) { + return result + '#' + module.id + ':' + module.source + '$' + ( module.dependencies.join( ',' ) ); +} + +function WebpackStableBuildPlugin( options ) { + this.options = options || {}; + + this.algorithm = options.algorithm || 'md5'; + this.digest = options.digest || 'hex'; +} + +WebpackStableBuildPlugin.prototype.apply = function( compiler ) { + const usedChunkIds = {}; + const usedModuleIds = {}; + const context = compiler.options.context; + const seed = ( +this.options.seed || 0 ) % 32; + const hashSize = ( +this.options.hashSize || 53 ); + const _plugin = this; + + if ( hashSize > 53 ) { + // In JavaScript, only integers up to 2^53 (exclusive) can be considered + // safe, see http://www.2ality.com/2013/10/safe-integers.html + throw new Error( 'hashSize too large' ); + } + + function genChunkId( chunkName ) { + const hash = md5( chunkName ); + // generate a 28 bit integer using a part of the MD5 hash + const id = hashToId( hash, seed, hashSize ); + if ( usedChunkIds.hasOwnProperty( id ) && usedChunkIds[ id ] !== chunkName ) { + throw new Error( 'chunk id collision' ); + } + return id; + } + + function genModuleId( modulePath ) { + const hash = md5( modulePath ); + // generate a 28 bit integer using a part of the MD5 hash + const id = hashToId( hash, seed, hashSize ); + if ( usedModuleIds.hasOwnProperty( id ) && usedModuleIds[ id ] !== modulePath ) { + throw new Error( 'module id collision' ); + } + return id; + } + + compiler.plugin( 'compilation', function( compilation ) { + compilation.plugin( 'before-chunk-ids', function( chunks ) { + chunks.forEach( function( chunk ) { + const chunkName = chunk.name; + if ( ! chunkName ) { + return; + } + chunk.id = genChunkId( chunkName ); + usedChunkIds[ chunk.id ] = chunkName; + } ); + } ); + + compilation.plugin( 'before-module-ids', function( modules ) { + modules.forEach( function( module ) { + if ( module.libIdent && module.id === null ) { + const modulePath = module.libIdent( { + context: context + } ); + module.id = genModuleId( modulePath ); + usedModuleIds[ module.id ] = modulePath; + } + } ); + } ); + + compilation.plugin( 'chunk-hash', function( chunk, chunkHash ) { + const source = chunk.modules.map( getModuleSource ).sort( sortById ).reduce( concatenateSource, '' ); + const hash = crypto.createHash( _plugin.algorithm ).update( source ); + // have to include the seed to get different hashes for different seeds + hash.update( seed.toString( 16 ) ); + + chunkHash.digest = function( digest ) { + return hash.digest( digest || _plugin.digest ); + }; + } ); + } ); +}; + +module.exports = WebpackStableBuildPlugin; diff --git a/server/pages/index.js b/server/pages/index.js index b0efabdacf629..70cbba41c8149 100644 --- a/server/pages/index.js +++ b/server/pages/index.js @@ -96,7 +96,7 @@ function generateStaticUrls( request ) { const name = asset.name; urls[ name ] = asset.url; if ( config( 'env' ) !== 'development' ) { - urls[ name + '-min' ] = asset.url.replace( '.js', '.min.js' ); + urls[ name + '-min' ] = asset.url.replace( '.js', '.m.js' ); } } ); diff --git a/webpack.config.js b/webpack.config.js index 0febdc54b758a..624e3336183b8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,73 +3,29 @@ /** * External dependencies */ -const _ = require( 'lodash' ); -const CopyWebpackPlugin = require( 'copy-webpack-plugin' ); -const DashboardPlugin = require( 'webpack-dashboard/plugin' ); -const fs = require( 'fs' ); -const HappyPack = require( 'happypack' ); -const HardSourceWebpackPlugin = require( 'hard-source-webpack-plugin' ); -const os = require( 'os' ); -const path = require( 'path' ); -const webpack = require( 'webpack' ); -const WebpackChunkHash = require( 'webpack-chunk-hash' ); +const webpack = require( 'webpack' ), + path = require( 'path' ); /** * Internal dependencies */ -const cacheIdentifier = require( './server/bundler/babel/babel-loader-cache-identifier' ); -const ChunkFileNamePlugin = require( './server/bundler/plugin' ); -const config = require( './server/config' ); -const NamedModulesPlugin = require( './server/bundler/webpack-plugins/NamedModulesPlugin' ); +const config = require( './server/config' ), + cacheIdentifier = require( './server/bundler/babel/babel-loader-cache-identifier' ), + ChunkFileNamePlugin = require( './server/bundler/plugin' ), + CopyWebpackPlugin = require( 'copy-webpack-plugin' ), + HardSourceWebpackPlugin = require( 'hard-source-webpack-plugin' ), + WebpackStableBuildPlugin = require( './server/bundler/webpack/stable-build-plugin' ); /** * Internal variables */ const calypsoEnv = config( 'env_id' ); -const bundleEnv = config( 'env' ); -const isWindows = os.type() === 'Windows_NT'; - -/** - * This function scans the /client/extensions directory in order to generate a map that looks like this: - * { - * sensei: 'absolute/path/to/wp-calypso/client/extensions/sensei', - * woocommerce: 'absolute/path/to/wp-calypso/client/extensions/woocommerce', - * .... - * } - * - * Providing webpack with these aliases instead of telling it to scan client/extensions for every - * module resolution speeds up builds significantly. - */ -function getAliasesForExtensions() { - const extensionsDirectory = path.join( __dirname, 'client', 'extensions' ); - const extensionsNames = fs - .readdirSync( extensionsDirectory ) - .filter( filename => filename.indexOf( '.' ) === -1 ); // heuristic for finding directories - - const aliasesMap = {}; - extensionsNames.forEach( extensionName => - aliasesMap[ extensionName ] = path.join( extensionsDirectory, extensionName ) - ); - return aliasesMap; -} - -const babelLoader = { - loader: 'babel-loader', - options: { - cacheDirectory: path.join( __dirname, 'build', '.babel-client-cache' ), - cacheIdentifier: cacheIdentifier, - plugins: [ [ - path.join( __dirname, 'server', 'bundler', 'babel', 'babel-plugin-transform-wpcalypso-async' ), - { async: config.isEnabled( 'code-splitting' ) } - ] ] - } -}; -// happypack is not compatible with windows: https://github.com/amireh/happypack/blob/caaed26eec1795d464ac4b66abd29e60343e6252/README.md#does-it-work-under-windows -const jsLoader = isWindows ? babelLoader : 'happypack/loader'; +const bundleEnv = config( 'env' ); const webpackConfig = { bail: calypsoEnv !== 'development', + cache: true, entry: {}, devtool: '#eval', output: { @@ -83,52 +39,46 @@ const webpackConfig = { // avoids this warning: // https://github.com/localForage/localForage/issues/577 noParse: /[\/\\]node_modules[\/\\]localforage[\/\\]dist[\/\\]localforage\.js$/, - rules: [ - { - test: /\.jsx?$/, - exclude: /node_modules[\/\\](?!notifications-panel)/, - loader: [ jsLoader ] - }, + loaders: [ { test: /extensions[\/\\]index/, - exclude: path.join( __dirname, 'node_modules' ), + exclude: 'node_modules', loader: path.join( __dirname, 'server', 'bundler', 'extensions-loader' ) }, { test: /sections.js$/, - exclude: path.join( __dirname, 'node_modules' ), + exclude: 'node_modules', loader: path.join( __dirname, 'server', 'bundler', 'loader' ) }, + { + test: /\.json$/, + loader: 'json-loader' + }, { test: /\.html$/, loader: 'html-loader' }, { include: require.resolve( 'tinymce/tinymce' ), - loader: 'exports-loader', - query: { - window: 'tinymce' - } + loader: 'exports?window.tinymce', }, { - test: /node_modules[\/\\]tinymce/, - use: 'imports-loader?this=>window', + include: /node_modules[\/\\]tinymce/, + loader: 'imports?this=>window', } ] }, resolve: { - extensions: [ '.json', '.js', '.jsx' ], - modules: [ - path.join( __dirname, 'client' ), - 'node_modules', - ], - alias: Object.assign( - { - 'react-virtualized': 'react-virtualized/dist/commonjs', - 'social-logos/example': 'social-logos/build/example' - }, - getAliasesForExtensions() - ), + extensions: [ '', '.json', '.js', '.jsx' ], + root: [ path.join( __dirname, 'client' ), path.join( __dirname, 'client', 'extensions' ) ], + modulesDirectories: [ 'node_modules' ], + alias: { + 'react-virtualized': 'react-virtualized/dist/commonjs', + 'social-logos/example': 'social-logos/build/example' + } + }, + resolveLoader: { + root: [ __dirname ] }, node: { console: false, @@ -139,22 +89,19 @@ const webpackConfig = { __dirname: 'mock', fs: 'empty' }, - plugins: _.compact( [ + plugins: [ new webpack.DefinePlugin( { 'process.env': { NODE_ENV: JSON.stringify( bundleEnv ) }, 'PROJECT_NAME': JSON.stringify( config( 'project' ) ) } ), + new WebpackStableBuildPlugin( { + seed: 0 + } ), new webpack.IgnorePlugin( /^props$/ ), - new CopyWebpackPlugin( [ { from: 'node_modules/flag-icon-css/flags/4x3', to: 'images/flags' } ] ), - ! isWindows && new HappyPack( { - loaders: _.compact( [ - process.env.NODE_ENV === 'development' && 'react-hot-loader', - babelLoader - ] ) - } ) - ] ), + new CopyWebpackPlugin( [ { from: 'node_modules/flag-icon-css/flags/4x3', to: 'images/flags' } ] ) + ], externals: [ 'electron' ] }; @@ -178,10 +125,10 @@ if ( calypsoEnv === 'desktop' ) { ]; webpackConfig.plugins.push( - new webpack.optimize.CommonsChunkPlugin( { - name: 'vendor', - filename: 'vendor.[chunkhash].js', - } ) + new webpack.optimize.CommonsChunkPlugin( + 'vendor', + 'vendor.[chunkhash].js' + ) ); // slight black magic here. 'manifest' is a secret webpack module that includes the webpack loader and @@ -211,33 +158,46 @@ if ( calypsoEnv === 'desktop' ) { webpackConfig.externals.push( 'jquery' ); } +const jsLoader = { + test: /\.jsx?$/, + exclude: /node_modules[\/\\](?!notifications-panel)/, + loader: 'babel', + query: { + cacheDirectory: path.join( __dirname, 'build', '.babel-client-cache' ), + cacheIdentifier: cacheIdentifier, + plugins: [ [ + path.join( __dirname, 'server', 'bundler', 'babel', 'babel-plugin-transform-wpcalypso-async' ), + { async: config.isEnabled( 'code-splitting' ) } + ] ] + } +}; + if ( calypsoEnv === 'development' ) { - webpackConfig.plugins = webpackConfig.plugins.concat( [ - new NamedModulesPlugin(), - new webpack.HotModuleReplacementPlugin(), - new webpack.LoaderOptionsPlugin( { debug: true } ), - ] ); + const DashboardPlugin = require( 'webpack-dashboard/plugin' ); + webpackConfig.plugins.splice( 0, 0, new DashboardPlugin() ); + webpackConfig.plugins.push( new webpack.HotModuleReplacementPlugin() ); webpackConfig.entry.build = [ - 'webpack-hot-middleware/client', + 'webpack-dev-server/client?/', + 'webpack/hot/only-dev-server', path.join( __dirname, 'client', 'boot', 'app' ) ]; - webpackConfig.devServer = { hot: true, inline: true }; - if ( config.isEnabled( 'use-source-maps' ) ) { + webpackConfig.debug = true; webpackConfig.devtool = '#eval-cheap-module-source-map'; - webpackConfig.module.rules.push( { + webpackConfig.module.preLoaders = webpackConfig.module.preLoaders || []; + webpackConfig.module.preLoaders.push( { test: /\.jsx?$/, - enforce: 'pre', loader: 'source-map-loader' } ); + } else { + // Add react hot loader before babel-loader. + // It's loaded by default since `use-source-maps` is disabled by default. + jsLoader.loaders = [ 'react-hot' ].concat( jsLoader.loaders ); } } else { webpackConfig.entry.build = path.join( __dirname, 'client', 'boot', 'app' ); - webpackConfig.plugins = webpackConfig.plugins.concat( [ - new webpack.HashedModuleIdsPlugin(), - new WebpackChunkHash(), - ] ); + webpackConfig.debug = false; webpackConfig.devtool = false; } @@ -257,10 +217,7 @@ if ( config.isEnabled( 'webpack/persistent-caching' ) ) { webpackConfig.plugins.unshift( new HardSourceWebpackPlugin( { cacheDirectory: path.join( __dirname, '.webpack-cache', 'client' ) } ) ); } -if ( process.env.DASHBOARD ) { - // dashboard wants to be first - webpackConfig.plugins.unshift( new DashboardPlugin() ); -} +webpackConfig.module.loaders = [ jsLoader ].concat( webpackConfig.module.loaders ); if ( process.env.WEBPACK_OUTPUT_JSON ) { webpackConfig.devtool = 'cheap-module-source-map'; diff --git a/webpack.config.node.js b/webpack.config.node.js index 0fd6d89820c1a..8dc0f20eeec96 100644 --- a/webpack.config.node.js +++ b/webpack.config.node.js @@ -3,20 +3,16 @@ /** * External dependencies */ -const fs = require( 'fs' ); -const HappyPack = require( 'happypack' ); -const HardSourceWebpackPlugin = require( 'hard-source-webpack-plugin' ); -const os = require( 'os' ); -const path = require( 'path' ); -const webpack = require( 'webpack' ); -const _ = require( 'lodash' ); +const webpack = require( 'webpack' ), + path = require( 'path' ), + HardSourceWebpackPlugin = require( 'hard-source-webpack-plugin' ), + fs = require( 'fs' ); /** * Internal dependencies */ -const cacheIdentifier = require( './server/bundler/babel/babel-loader-cache-identifier' ); const config = require( 'config' ); -const isWindows = os.type() === 'Windows_NT'; +const cacheIdentifier = require( './server/bundler/babel/babel-loader-cache-identifier' ); /** * This lists modules that must use commonJS `require()`s @@ -58,57 +54,50 @@ function getExternals() { return externals; } -const babelLoader = { - loader: 'babel-loader', - options: { - plugins: [ [ - path.join( __dirname, 'server', 'bundler', 'babel', 'babel-plugin-transform-wpcalypso-async' ), - { async: false } - ] ], - cacheDirectory: path.join( __dirname, 'build', '.babel-server-cache' ), - cacheIdentifier: cacheIdentifier, - } -} - -// happypack is not compatible with windows: https://github.com/amireh/happypack/blob/caaed26eec1795d464ac4b66abd29e60343e6252/README.md#does-it-work-under-windows -const jsLoader = isWindows ? babelLoader : 'happypack/loader'; - const webpackConfig = { devtool: 'source-map', - entry: './index.js', + entry: path.join( __dirname, 'index.js' ), target: 'node', output: { path: path.join( __dirname, 'build' ), filename: 'bundle.js', }, module: { - rules: [ + loaders: [ { test: /extensions[\/\\]index/, - exclude: path.join( __dirname, 'node_modules' ), + exclude: 'node_modules', loader: path.join( __dirname, 'server', 'bundler', 'extensions-loader' ) }, { test: /sections.js$/, - exclude: path.join( __dirname, 'node_modules' ), + exclude: 'node_modules', loader: path.join( __dirname, 'server', 'isomorphic-routing', 'loader' ) }, { test: /\.jsx?$/, exclude: /(node_modules|devdocs[\/\\]search-index)/, - loader: [ jsLoader ] + loader: 'babel', + query: { + plugins: [ [ + path.join( __dirname, 'server', 'bundler', 'babel', 'babel-plugin-transform-wpcalypso-async' ), + { async: false } + ] ], + cacheDirectory: path.join( __dirname, 'build', '.babel-server-cache' ), + cacheIdentifier: cacheIdentifier, + } }, + { + test: /\.json$/, + exclude: /(devdocs[\/\\]components-usage-stats.json)/, + loader: 'json-loader' + } ] }, resolve: { - modules: [ - __dirname, - path.join( __dirname, 'server' ), - path.join( __dirname, 'client' ), - path.join( __dirname, 'client', 'extensions' ), - 'node_modules', - ], - extensions: [ '.json', '.js', '.jsx' ], + extensions: [ '', '.json', '.js', '.jsx' ], + root: [ __dirname, path.join( __dirname, 'server' ), path.join( __dirname, 'client' ), path.join( __dirname, 'client', 'extensions' ) ], + modulesDirectories: [ 'node_modules' ] }, node: { // Tell webpack we want to supply absolute paths for server code, @@ -116,13 +105,12 @@ const webpackConfig = { __filename: true, __dirname: true }, - plugins: _.compact( [ + plugins: [ // Require source-map-support at the top, so we get source maps for the bundle - new webpack.BannerPlugin( { banner: 'require( "source-map-support" ).install();', raw: true, entryOnly: false } ), + new webpack.BannerPlugin( 'require( "source-map-support" ).install();', { raw: true, entryOnly: false } ), new webpack.DefinePlugin( { 'PROJECT_NAME': JSON.stringify( config( 'project' ) ) } ), - ! isWindows && new HappyPack( { loaders: [ babelLoader ] } ), new webpack.NormalModuleReplacementPlugin( /^lib[\/\\]analytics$/, 'lodash/noop' ), // Depends on BOM new webpack.NormalModuleReplacementPlugin( /^lib[\/\\]sites-list$/, 'lodash/noop' ), // Depends on BOM new webpack.NormalModuleReplacementPlugin( /^lib[\/\\]olark$/, 'lodash/noop' ), // Depends on DOM @@ -133,7 +121,7 @@ const webpackConfig = { new webpack.NormalModuleReplacementPlugin( /^my-sites[\/\\]themes[\/\\]theme-upload$/, 'components/empty-component' ), // Depends on BOM new webpack.NormalModuleReplacementPlugin( /^client[\/\\]layout[\/\\]guided-tours[\/\\]config$/, 'components/empty-component' ), // should never be required server side new webpack.NormalModuleReplacementPlugin( /^components[\/\\]site-selector$/, 'components/null-component' ), // Depends on BOM - ] ), + ], externals: getExternals() };