From 1601878d1ad852bf3c81337e550d77d0b86889ba Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Wed, 8 Oct 2025 16:23:44 +0300 Subject: [PATCH] refactor: fix logic for empty resource --- lib/LoaderRunner.js | 11 +- test/fixtures/set-empty-resource-loader.js | 7 + test/fixtures/set-resource-loader.js | 7 + test/runLoaders.js | 180 +++++++++++++++++++++ 4 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 test/fixtures/set-empty-resource-loader.js create mode 100644 test/fixtures/set-resource-loader.js diff --git a/lib/LoaderRunner.js b/lib/LoaderRunner.js index 7616ffe..490bef9 100644 --- a/lib/LoaderRunner.js +++ b/lib/LoaderRunner.js @@ -410,7 +410,6 @@ module.exports.runLoaders = function runLoaders(options, callback) { Object.defineProperty(loaderContext, "resource", { enumerable: true, get() { - if (loaderContext.resourcePath === undefined) return undefined; return ( loaderContext.resourcePath.replace(/#/g, "\0#") + loaderContext.resourceQuery.replace(/#/g, "\0#") + @@ -419,15 +418,11 @@ module.exports.runLoaders = function runLoaders(options, callback) { }, set(value) { const splittedResource = value && parseIdentifier(value); - loaderContext.resourcePath = splittedResource - ? splittedResource[0] - : undefined; - loaderContext.resourceQuery = splittedResource - ? splittedResource[1] - : undefined; + loaderContext.resourcePath = splittedResource ? splittedResource[0] : ""; + loaderContext.resourceQuery = splittedResource ? splittedResource[1] : ""; loaderContext.resourceFragment = splittedResource ? splittedResource[2] - : undefined; + : ""; }, }); Object.defineProperty(loaderContext, "request", { diff --git a/test/fixtures/set-empty-resource-loader.js b/test/fixtures/set-empty-resource-loader.js new file mode 100644 index 0000000..72abec2 --- /dev/null +++ b/test/fixtures/set-empty-resource-loader.js @@ -0,0 +1,7 @@ +const path = require("path"); + +module.exports = function (source) { + this.resource = ""; + + return source + "-simple"; +}; diff --git a/test/fixtures/set-resource-loader.js b/test/fixtures/set-resource-loader.js new file mode 100644 index 0000000..2da970b --- /dev/null +++ b/test/fixtures/set-resource-loader.js @@ -0,0 +1,7 @@ +const path = require("path"); + +module.exports = function (source) { + this.resource = `${path.resolve(__dirname, "./resource.bin")}?foo=bar#hash`; + + return source + "-simple"; +}; diff --git a/test/runLoaders.js b/test/runLoaders.js index 14254d7..e00d923 100644 --- a/test/runLoaders.js +++ b/test/runLoaders.js @@ -809,6 +809,186 @@ describe("runLoaders", () => { ); }); + it("should have to correct keys in context with empty resource", (done) => { + runLoaders( + { + resource: "", + loaders: [ + `${path.resolve(fixtures, "keys-loader.js")}?loader-query`, + path.resolve(fixtures, "simple-loader.js"), + ], + }, + (err, result) => { + if (err) return done(err); + try { + JSON.parse(result.result[0]).should.be.eql({ + context: null, + resource: "", + resourcePath: "", + resourceQuery: "", + resourceFragment: "", + loaderIndex: 0, + query: "?loader-query", + currentRequest: `${path.resolve( + fixtures, + "keys-loader.js" + )}?loader-query!${path.resolve(fixtures, "simple-loader.js")}!`, + remainingRequest: `${path.resolve(fixtures, "simple-loader.js")}!`, + previousRequest: "", + request: `${path.resolve( + fixtures, + "keys-loader.js" + )}?loader-query!${path.resolve(fixtures, "simple-loader.js")}!`, + data: null, + loaders: [ + { + request: `${path.resolve(fixtures, "keys-loader.js")}?loader-query`, + path: path.resolve(fixtures, "keys-loader.js"), + query: "?loader-query", + fragment: "", + data: null, + pitchExecuted: true, + normalExecuted: true, + }, + { + request: path.resolve(fixtures, "simple-loader.js"), + path: path.resolve(fixtures, "simple-loader.js"), + query: "", + fragment: "", + data: null, + pitchExecuted: true, + normalExecuted: true, + }, + ], + }); + } catch (err_) { + return done(err_); + } + done(); + } + ); + }); + + it("should have to correct keys in context with empty resource and set a new resource", (done) => { + runLoaders( + { + resource: "", + loaders: [ + `${path.resolve(fixtures, "keys-loader.js")}?loader-query`, + path.resolve(fixtures, "set-resource-loader.js"), + ], + }, + (err, result) => { + if (err) return done(err); + try { + JSON.parse(result.result[0]).should.be.eql({ + context: null, + resource: `${path.resolve(fixtures, "resource.bin")}?foo=bar#hash`, + resourcePath: path.resolve(fixtures, "resource.bin"), + resourceQuery: "?foo=bar", + resourceFragment: "#hash", + loaderIndex: 0, + query: "?loader-query", + currentRequest: `${path.resolve( + fixtures, + "keys-loader.js" + )}?loader-query!${path.resolve(fixtures, "set-resource-loader.js")}!${path.resolve(fixtures, "resource.bin")}?foo=bar#hash`, + remainingRequest: `${path.resolve(fixtures, "set-resource-loader.js")}!${path.resolve(fixtures, "resource.bin")}?foo=bar#hash`, + previousRequest: "", + request: `${path.resolve( + fixtures, + "keys-loader.js" + )}?loader-query!${path.resolve(fixtures, "set-resource-loader.js")}!${path.resolve(fixtures, "resource.bin")}?foo=bar#hash`, + data: null, + loaders: [ + { + request: `${path.resolve(fixtures, "keys-loader.js")}?loader-query`, + path: path.resolve(fixtures, "keys-loader.js"), + query: "?loader-query", + fragment: "", + data: null, + pitchExecuted: true, + normalExecuted: true, + }, + { + request: path.resolve(fixtures, "set-resource-loader.js"), + path: path.resolve(fixtures, "set-resource-loader.js"), + query: "", + fragment: "", + data: null, + pitchExecuted: true, + normalExecuted: true, + }, + ], + }); + } catch (err_) { + return done(err_); + } + done(); + } + ); + }); + + it("should have to correct keys in context with resource and set a new resource", (done) => { + runLoaders( + { + resource: path.resolve(fixtures, "resource.bin"), + loaders: [ + `${path.resolve(fixtures, "keys-loader.js")}?loader-query`, + path.resolve(fixtures, "set-empty-resource-loader.js"), + ], + }, + (err, result) => { + if (err) return done(err); + try { + JSON.parse(result.result[0]).should.be.eql({ + context: fixtures, + resource: "", + resourcePath: "", + resourceQuery: "", + resourceFragment: "", + loaderIndex: 0, + query: "?loader-query", + currentRequest: `${path.resolve( + fixtures, + "keys-loader.js" + )}?loader-query!${path.resolve(fixtures, "set-empty-resource-loader.js")}!`, + remainingRequest: `${path.resolve(fixtures, "set-empty-resource-loader.js")}!`, + previousRequest: "", + request: `${path.resolve( + fixtures, + "keys-loader.js" + )}?loader-query!${path.resolve(fixtures, "set-empty-resource-loader.js")}!`, + data: null, + loaders: [ + { + request: `${path.resolve(fixtures, "keys-loader.js")}?loader-query`, + path: path.resolve(fixtures, "keys-loader.js"), + query: "?loader-query", + fragment: "", + data: null, + pitchExecuted: true, + normalExecuted: true, + }, + { + request: path.resolve(fixtures, "set-empty-resource-loader.js"), + path: path.resolve(fixtures, "set-empty-resource-loader.js"), + query: "", + fragment: "", + data: null, + pitchExecuted: true, + normalExecuted: true, + }, + ], + }); + } catch (err_) { + return done(err_); + } + done(); + } + ); + }); + describe("getContext", () => { const TESTS = [ ["/", "/"],