From 65558c8ca61051030c0dbeabe505d18433904a1c Mon Sep 17 00:00:00 2001 From: Pieter Janssen <4687577+pajter@users.noreply.github.com> Date: Sat, 28 Sep 2019 17:21:55 +0200 Subject: [PATCH 1/4] Support [query] in interpolateName --- lib/interpolateName.js | 6 +++++- test/interpolateName.test.js | 23 ++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/interpolateName.js b/lib/interpolateName.js index d1fa661..a59da2c 100644 --- a/lib/interpolateName.js +++ b/lib/interpolateName.js @@ -52,6 +52,9 @@ function interpolateName(loaderContext, name, options) { let basename = 'file'; let directory = ''; let folder = ''; + const query = loaderContext.resourceQuery + ? loaderContext.resourceQuery.substr(1) + : ''; if (loaderContext.resourcePath) { const parsed = path.parse(loaderContext.resourcePath); @@ -104,7 +107,8 @@ function interpolateName(loaderContext, name, options) { .replace(/\[ext\]/gi, () => ext) .replace(/\[name\]/gi, () => basename) .replace(/\[path\]/gi, () => directory) - .replace(/\[folder\]/gi, () => folder); + .replace(/\[folder\]/gi, () => folder) + .replace(/\[query\]/gi, () => query); if (regExp && loaderContext.resourcePath) { const match = loaderContext.resourcePath.match(new RegExp(regExp)); diff --git a/test/interpolateName.test.js b/test/interpolateName.test.js index e57443a..46367fb 100644 --- a/test/interpolateName.test.js +++ b/test/interpolateName.test.js @@ -131,10 +131,31 @@ describe('interpolateName()', () => { 'test content', 'modal.[md5::base64:20].css', ], + [ + 'images/icon.svg?color=#ff0000&bgColor=#0000ff', + '[name].[ext]?[query]', + 'test content', + 'icon.svg?color=#ff0000&bgColor=#00ff00', + ], + [ + 'images/icon.svg?color=#ff0000&bgColor=#0000ff', + '[name].[ext]?[hash]&[query]', + 'test content', + 'icon.svg?9473fdd0d880a43c21b7778d34872157&color=#ff0000&bgColor=#00ff00', + ], ].forEach((test) => { it('should interpolate ' + test[0] + ' ' + test[1], () => { + const resourcePathParts = test[0].split('?'); + const resourcePath = resourcePathParts[0]; + const resourceQuery = resourcePathParts[1] + ? `?${resourcePathParts[1]}` + : undefined; + const interpolatedName = loaderUtils.interpolateName( - { resourcePath: test[0] }, + { + resourcePath, + resourceQuery, + }, test[1], { content: test[2] } ); From d0512d023ac7fb0b977608133109bf5f76b53924 Mon Sep 17 00:00:00 2001 From: Pieter Janssen <4687577+pajter@users.noreply.github.com> Date: Sat, 28 Sep 2019 17:28:28 +0200 Subject: [PATCH 2/4] Update README --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 289bb32..bc74929 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,7 @@ The following tokens are replaced in the `name` parameter: * `[name]` the basename of the resource * `[path]` the path of the resource relative to the `context` query parameter or option. * `[folder]` the folder the resource is in. +* `[query]` the query parameters string without the leading `?` * `[emoji]` a random emoji representation of `options.content` * `[emoji:]` same as above, but with a customizable number of emojis * `[contenthash]` the hash of `options.content` (Buffer) (by default it's the hex digest of the md5 hash) @@ -212,6 +213,11 @@ loaderUtils.interpolateName(loaderContext, "html-[hash:6].html", { content: ... loaderUtils.interpolateName(loaderContext, "[hash]", { content: ... }); // => c31e9820c001c9c4a86bce33ce43b679 +// loaderContext.resourcePath = "/app/img/icon.svg" +// loaderContext.resourceQuery = "?color=red&bgColor=blue" +loaderUtils.interpolateName(loaderContext, "[name].[ext]?[query]", { content: ... }); +// => /app/img/icon.svg?color=red&bgColor=blue + // loaderContext.resourcePath = "/app/img/image.gif" loaderUtils.interpolateName(loaderContext, "[emoji]", { content: ... }); // => 👍 @@ -234,6 +240,11 @@ loaderUtils.interpolateName(loaderContext, "picture.png"); loaderUtils.interpolateName(loaderContext, "[path][name].[ext]?[hash]", { content: ... }); // => /app/dir/file.png?9473fdd0d880a43c21b7778d34872157 +// loaderContext.resourcePath = "/app/img/icon.png" +// loaderContext.resourceQuery = "?color=red&bgColor=blue" +loaderUtils.interpolateName(loaderContext, "[path][name].[ext]?[hash]&[query]", { content: ... }); +// => /app/img/icon.png?9473fdd0d880a43c21b7778d34872157&color=red&bgColor=blue + // loaderContext.resourcePath = "/app/js/page-home.js" loaderUtils.interpolateName(loaderContext, "script-[1].[ext]", { regExp: "page-(.*)\\.js", content: ... }); // => script-home.js From 386f51230f2386e1f6e0f130089a9fcc0897b1ce Mon Sep 17 00:00:00 2001 From: Pieter Janssen <4687577+pajter@users.noreply.github.com> Date: Sat, 28 Sep 2019 17:41:00 +0200 Subject: [PATCH 3/4] Fix typo in test --- test/interpolateName.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/interpolateName.test.js b/test/interpolateName.test.js index 46367fb..5d950a8 100644 --- a/test/interpolateName.test.js +++ b/test/interpolateName.test.js @@ -135,13 +135,13 @@ describe('interpolateName()', () => { 'images/icon.svg?color=#ff0000&bgColor=#0000ff', '[name].[ext]?[query]', 'test content', - 'icon.svg?color=#ff0000&bgColor=#00ff00', + 'icon.svg?color=#ff0000&bgColor=#0000ff', ], [ 'images/icon.svg?color=#ff0000&bgColor=#0000ff', '[name].[ext]?[hash]&[query]', 'test content', - 'icon.svg?9473fdd0d880a43c21b7778d34872157&color=#ff0000&bgColor=#00ff00', + 'icon.svg?9473fdd0d880a43c21b7778d34872157&color=#ff0000&bgColor=#0000ff', ], ].forEach((test) => { it('should interpolate ' + test[0] + ' ' + test[1], () => { From b0522c39546f80ddcfe00324cd6340de489d3865 Mon Sep 17 00:00:00 2001 From: Pieter Janssen <4687577+pajter@users.noreply.github.com> Date: Sat, 28 Sep 2019 18:22:07 +0200 Subject: [PATCH 4/4] Improve query assertion --- lib/interpolateName.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/interpolateName.js b/lib/interpolateName.js index a59da2c..fe4696f 100644 --- a/lib/interpolateName.js +++ b/lib/interpolateName.js @@ -52,9 +52,11 @@ function interpolateName(loaderContext, name, options) { let basename = 'file'; let directory = ''; let folder = ''; - const query = loaderContext.resourceQuery - ? loaderContext.resourceQuery.substr(1) - : ''; + let query = ''; + if (loaderContext.resourceQuery) { + // If query was passed, strip the leading '?' character + query = loaderContext.resourceQuery.substr(1); + } if (loaderContext.resourcePath) { const parsed = path.parse(loaderContext.resourcePath);