diff --git a/CHANGELOG.md b/CHANGELOG.md index 31d28c7..4d316b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ 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. + +# [1.4.0](https://github.com/webpack/loader-utils/compare/v1.3.0...v1.4.0) (2020-02-19) + + +### Features + +* the `resourceQuery` is passed to the `interpolateName` method ([#163](https://github.com/webpack/loader-utils/issues/163)) ([cd0e428](https://github.com/webpack/loader-utils/commit/cd0e428)) + + + # [1.3.0](https://github.com/webpack/loader-utils/compare/v1.2.3...v1.3.0) (2020-02-19) diff --git a/README.md b/README.md index b595781..37fb15d 100644 --- a/README.md +++ b/README.md @@ -197,52 +197,66 @@ In loader context `[hash]` and `[contenthash]` are the same, but we recommend us Examples ``` javascript -// loaderContext.resourcePath = "/app/js/javascript.js" +// loaderContext.resourcePath = "/absolute/path/to/app/js/javascript.js" loaderUtils.interpolateName(loaderContext, "js/[hash].script.[ext]", { content: ... }); // => js/9473fdd0d880a43c21b7778d34872157.script.js -// loaderContext.resourcePath = "/app/js/javascript.js" +// loaderContext.resourcePath = "/absolute/path/to/app/js/javascript.js" // loaderContext.resourceQuery = "?foo=bar" loaderUtils.interpolateName(loaderContext, "js/[hash].script.[ext][query]", { content: ... }); // => js/9473fdd0d880a43c21b7778d34872157.script.js?foo=bar -// loaderContext.resourcePath = "/app/js/javascript.js" +// loaderContext.resourcePath = "/absolute/path/to/app/js/javascript.js" loaderUtils.interpolateName(loaderContext, "js/[contenthash].script.[ext]", { content: ... }); // => js/9473fdd0d880a43c21b7778d34872157.script.js -// loaderContext.resourcePath = "/app/page.html" +// loaderContext.resourcePath = "/absolute/path/to/app/page.html" loaderUtils.interpolateName(loaderContext, "html-[hash:6].html", { content: ... }); // => html-9473fd.html -// loaderContext.resourcePath = "/app/flash.txt" +// loaderContext.resourcePath = "/absolute/path/to/app/flash.txt" loaderUtils.interpolateName(loaderContext, "[hash]", { content: ... }); // => c31e9820c001c9c4a86bce33ce43b679 -// loaderContext.resourcePath = "/app/img/image.gif" +// loaderContext.resourcePath = "/absolute/path/to/app/img/image.gif" loaderUtils.interpolateName(loaderContext, "[emoji]", { content: ... }); // => 👍 -// loaderContext.resourcePath = "/app/img/image.gif" +// loaderContext.resourcePath = "/absolute/path/to/app/img/image.gif" loaderUtils.interpolateName(loaderContext, "[emoji:4]", { content: ... }); // => 🙍🏢📤🐝 -// loaderContext.resourcePath = "/app/img/image.png" +// loaderContext.resourcePath = "/absolute/path/to/app/img/image.png" loaderUtils.interpolateName(loaderContext, "[sha512:hash:base64:7].[ext]", { content: ... }); // => 2BKDTjl.png // use sha512 hash instead of md5 and with only 7 chars of base64 -// loaderContext.resourcePath = "/app/img/myself.png" +// loaderContext.resourcePath = "/absolute/path/to/app/img/myself.png" // loaderContext.query.name = loaderUtils.interpolateName(loaderContext, "picture.png"); // => picture.png -// loaderContext.resourcePath = "/app/dir/file.png" +// loaderContext.resourcePath = "/absolute/path/to/app/dir/file.png" loaderUtils.interpolateName(loaderContext, "[path][name].[ext]?[hash]", { content: ... }); // => /app/dir/file.png?9473fdd0d880a43c21b7778d34872157 -// loaderContext.resourcePath = "/app/js/page-home.js" +// loaderContext.resourcePath = "/absolute/path/to/app/js/page-home.js" loaderUtils.interpolateName(loaderContext, "script-[1].[ext]", { regExp: "page-(.*)\\.js", content: ... }); // => script-home.js + +// loaderContext.resourcePath = "/absolute/path/to/app/js/javascript.js" +// loaderContext.resourceQuery = "?foo=bar" +loaderUtils.interpolateName( + loaderContext, + (resourcePath, resourceQuery) => { + // resourcePath - `/app/js/javascript.js` + // resourceQuery - `?foo=bar` + + return "js/[hash].script.[ext]"; + }, + { content: ... } +); +// => js/9473fdd0d880a43c21b7778d34872157.script.js ``` ### `getHashDigest` diff --git a/lib/interpolateName.js b/lib/interpolateName.js index 96cb7ac..6a13a36 100644 --- a/lib/interpolateName.js +++ b/lib/interpolateName.js @@ -38,8 +38,14 @@ function encodeStringToEmoji(content, length) { function interpolateName(loaderContext, name, options) { let filename; + const hasQuery = + loaderContext.resourceQuery && loaderContext.resourceQuery.length > 1; + if (typeof name === 'function') { - filename = name(loaderContext.resourcePath); + filename = name( + loaderContext.resourcePath, + hasQuery ? loaderContext.resourceQuery : undefined + ); } else { filename = name || '[hash].[ext]'; } diff --git a/package.json b/package.json index f2a336a..6abe0f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "loader-utils", - "version": "1.3.0", + "version": "1.4.0", "author": "Tobias Koppers @sokra", "description": "utils for webpack loaders", "dependencies": { diff --git a/test/interpolateName.test.js b/test/interpolateName.test.js index 12c37c8..9f31464 100644 --- a/test/interpolateName.test.js +++ b/test/interpolateName.test.js @@ -167,6 +167,50 @@ describe('interpolateName()', () => { 'test content', 'js/9473fdd0d880a43c21b7778d34872157.script.js?foo=bar', ], + [ + '/app/js/javascript.js?foo=bar#hash', + (resourcePath, resourceQuery) => { + expect(resourcePath).toBeDefined(); + expect(resourceQuery).toBeDefined(); + + return 'js/[hash].script.[ext][query]'; + }, + 'test content', + 'js/9473fdd0d880a43c21b7778d34872157.script.js?foo=bar', + ], + [ + '/app/js/javascript.js?a', + (resourcePath, resourceQuery) => { + expect(resourcePath).toBeDefined(); + expect(resourceQuery).toBeDefined(); + + return 'js/[hash].script.[ext][query]'; + }, + 'test content', + 'js/9473fdd0d880a43c21b7778d34872157.script.js?a', + ], + [ + '/app/js/javascript.js', + (resourcePath, resourceQuery) => { + expect(resourcePath).toBeDefined(); + expect(resourceQuery).not.toBeDefined(); + + return 'js/[hash].script.[ext][query]'; + }, + 'test content', + 'js/9473fdd0d880a43c21b7778d34872157.script.js', + ], + [ + '/app/js/javascript.js?', + (resourcePath, resourceQuery) => { + expect(resourcePath).toBeDefined(); + expect(resourceQuery).not.toBeDefined(); + + return 'js/[hash].script.[ext][query]'; + }, + 'test content', + 'js/9473fdd0d880a43c21b7778d34872157.script.js', + ], ].forEach((test) => { it('should interpolate ' + test[0] + ' ' + test[1], () => { let resourcePath = '';