From e4106d270eb3b2adaf32d9ade99b642b5e745658 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 22 Apr 2021 11:07:57 -0500 Subject: [PATCH] Updated hooks (#154) * Updated dependencies * Updated hooks - Added manifest parameter to afterOptions hook - Use manifest parameter in internal transform and afterOptions taps - Check options.enabled after afterOptions hook has been called --- package-lock.json | 83 ++++++++++++------------------ package.json | 8 +-- src/WebpackAssetsManifest.js | 34 ++++++------ test/WebpackAssetsManifest-test.js | 4 +- 4 files changed, 57 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index 540b64b..57bdc13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -733,9 +733,9 @@ } }, "@types/eslint": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.9.tgz", - "integrity": "sha512-SdAAXZNvWfhtf3X3y1cbbCZhP3xyPh7mfTvzV6CgfWc/ZhiHpyr9bVroe2/RCHIf7gczaNcprhaBLsx0CCJHQA==", + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz", + "integrity": "sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==", "dev": true, "requires": { "@types/estree": "*", @@ -753,9 +753,9 @@ } }, "@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", + "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", "dev": true }, "@types/glob": { @@ -804,9 +804,9 @@ "dev": true }, "@types/node": { - "version": "14.14.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", - "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==", + "version": "14.14.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", + "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==", "dev": true }, "@types/parse-json": { @@ -1511,9 +1511,9 @@ "dev": true }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1990,23 +1990,22 @@ } }, "css-loader": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.1.tgz", - "integrity": "sha512-YCyRzlt/jgG1xanXZDG/DHqAueOtXFHeusP9TS478oP1J++JSKOyEgGW1GHVoCj/rkS+GWOlBwqQJBr9yajQ9w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.4.tgz", + "integrity": "sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw==", "dev": true, "requires": { "camelcase": "^6.2.0", - "cssesc": "^3.0.0", "icss-utils": "^5.1.0", "loader-utils": "^2.0.0", - "postcss": "^8.2.8", + "postcss": "^8.2.10", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", "schema-utils": "^3.0.0", - "semver": "^7.3.4" + "semver": "^7.3.5" } }, "cssesc": { @@ -2298,9 +2297,9 @@ } }, "enhanced-resolve": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", - "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz", + "integrity": "sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -3711,12 +3710,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4530,9 +4523,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.4.1.tgz", - "integrity": "sha512-COAGbpAsU0ioFzj+/RRfO5Qv177L1Z/XAx2EmCF33b8GDDqKygMffBTws2lit8iaPdrbKEY5P+zsseBUCREZWQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.5.0.tgz", + "integrity": "sha512-SIbuLMv6jsk1FnLIU5OUG/+VMGUprEjM1+o2trOAx8i5KOKMrhyezb1dJ4Ugsykb8Jgq8/w5NEopy6escV9G7g==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -5349,9 +5342,9 @@ "dev": true }, "postcss": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.9.tgz", - "integrity": "sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==", + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.12.tgz", + "integrity": "sha512-BJnGT5+0q2tzvs6oQfnY2NpEJ7rIXNfBnZtQOKCIsweeWXBXeDd5k31UgTdS3d/c02ouspufn37mTaHWkJyzMQ==", "dev": true, "requires": { "colorette": "^1.2.2", @@ -5409,14 +5402,12 @@ } }, "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz", + "integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" } }, @@ -6783,12 +6774,6 @@ } } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -6960,20 +6945,20 @@ } }, "webpack": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.32.0.tgz", - "integrity": "sha512-jB9PrNMFnPRiZGnm/j3qfNqJmP3ViRzkuQMIf8za0dgOYvSLi/cgA+UEEGvik9EQHX1KYyGng5PgBTTzGrH9xg==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.35.0.tgz", + "integrity": "sha512-au3gu55yYF/h6NXFr0KZPZAYxS6Nlc595BzYPke8n0CSff5WXcoixtjh5LC/8mXunkRKxhymhXmBY0+kEbR6jg==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.46", + "@types/estree": "^0.0.47", "@webassemblyjs/ast": "1.11.0", "@webassemblyjs/wasm-edit": "1.11.0", "@webassemblyjs/wasm-parser": "1.11.0", "acorn": "^8.0.4", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.7.0", + "enhanced-resolve": "^5.8.0", "es-module-lexer": "^0.4.0", "eslint-scope": "^5.1.1", "events": "^3.2.0", diff --git a/package.json b/package.json index 316dedd..014e90e 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "devDependencies": { "@types/lodash.get": "^4.4.6", "@types/lodash.has": "^4.5.6", - "@types/node": "^14.14.27", + "@types/node": "^14.14.41", "@types/tapable": "^2.2.2", "@types/webpack-sources": "^2.1.0", "@webdeveric/eslint-config": "^0.1.2", @@ -74,21 +74,21 @@ "compression-webpack-plugin": "^7.1.2", "copy-webpack-plugin": "^8.1.1", "cspell": "^5.3.12", - "css-loader": "^5.2.1", + "css-loader": "^5.2.4", "eslint": "^7.24.0", "file-loader": "^6.2.0", "fs-extra": "^9.1.0", "husky": "^6.0.0", "lint-staged": "^10.5.4", "memory-fs": "^0.5.0", - "mini-css-extract-plugin": "^1.4.1", + "mini-css-extract-plugin": "^1.5.0", "mkdirp": "^1.0.4", "mocha": "^8.3.0", "nyc": "^15.1.0", "rimraf": "^3.0.2", "superagent": "^6.1.0", "typescript": "^4.2.4", - "webpack": "^5.32.0", + "webpack": "^5.35.0", "webpack-dev-server": "^3.11.2", "webpack-subresource-integrity": "^1.5.2" } diff --git a/src/WebpackAssetsManifest.js b/src/WebpackAssetsManifest.js index 20d581b..833c97e 100644 --- a/src/WebpackAssetsManifest.js +++ b/src/WebpackAssetsManifest.js @@ -53,33 +53,33 @@ class WebpackAssetsManifest transform: new SyncWaterfallHook([ 'assets', 'manifest' ]), done: new AsyncSeriesHook([ 'manifest', 'stats' ]), options: new SyncWaterfallHook([ 'options' ]), - afterOptions: new SyncHook([ 'options' ]), + afterOptions: new SyncHook([ 'options', 'manifest' ]), }); - this.hooks.transform.tap(PLUGIN_NAME, assets => { - const { sortManifest } = this.options; + this.hooks.transform.tap(PLUGIN_NAME, (assets, manifest) => { + const { sortManifest } = manifest.options; return sortManifest ? getSortedObject( assets, - typeof sortManifest === 'function' ? sortManifest.bind(this) : undefined, + typeof sortManifest === 'function' ? sortManifest.bind(manifest) : undefined, ) : assets; }); - this.hooks.afterOptions.tap(PLUGIN_NAME, options => { - this.options = Object.assign( this.defaultOptions, options ); - this.options.integrityHashes = filterHashes( this.options.integrityHashes ); + this.hooks.afterOptions.tap(PLUGIN_NAME, (options, manifest) => { + manifest.options = Object.assign( manifest.defaultOptions, options ); + manifest.options.integrityHashes = filterHashes( manifest.options.integrityHashes ); - validate(optionsSchema, this.options, { name: PLUGIN_NAME }); + validate(optionsSchema, manifest.options, { name: PLUGIN_NAME }); - this.options.output = path.normalize( this.options.output ); + manifest.options.output = path.normalize( manifest.options.output ); // Copy over any entries that may have been added to the manifest before apply() was called. // If the same key exists in assets and options.assets, options.assets should be used. - this.assets = Object.assign(this.options.assets, this.assets, this.options.assets); + manifest.assets = Object.assign(manifest.options.assets, manifest.assets, manifest.options.assets); [ 'apply', 'customize', 'transform', 'done' ].forEach( hookName => { - if ( typeof this.options[ hookName ] === 'function' ) { - this.hooks[ hookName ].tap(`${PLUGIN_NAME}.option.${hookName}`, this.options[ hookName ] ); + if ( typeof manifest.options[ hookName ] === 'function' ) { + manifest.hooks[ hookName ].tap(`${PLUGIN_NAME}.option.${hookName}`, manifest.options[ hookName ] ); } }); }); @@ -109,17 +109,17 @@ class WebpackAssetsManifest */ apply(compiler) { - if ( ! this.options.enabled ) { - return; - } - this.compiler = compiler; // Allow hooks to modify options this.options = this.hooks.options.call(this.options); // Ensure options contain defaults and are valid - this.hooks.afterOptions.call(this.options); + this.hooks.afterOptions.call(this.options, this); + + if ( ! this.options.enabled ) { + return; + } compiler.hooks.watchRun.tap(PLUGIN_NAME, this.handleWatchRun.bind(this)); diff --git a/test/WebpackAssetsManifest-test.js b/test/WebpackAssetsManifest-test.js index 6b2d915..8d525d8 100644 --- a/test/WebpackAssetsManifest-test.js +++ b/test/WebpackAssetsManifest-test.js @@ -121,7 +121,7 @@ describe('WebpackAssetsManifest', function() { it('should return a JSON string', function() { const manifest = new WebpackAssetsManifest(); - manifest.hooks.afterOptions.call(manifest.options); + manifest.hooks.afterOptions.call(manifest.options, manifest); assert.equal('{}', manifest.toString()); assert.equal('{}', manifest + ''); @@ -132,7 +132,7 @@ describe('WebpackAssetsManifest', function() { space: '\t', }); - manifest.hooks.afterOptions.call(manifest.options); + manifest.hooks.afterOptions.call(manifest.options, manifest); manifest.set('test', 'test');