-
-
Notifications
You must be signed in to change notification settings - Fork 8.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add test for behaviour of filesystem-cached assets with loaders
- Loading branch information
1 parent
dfaa3b4
commit 4d561a6
Showing
4 changed files
with
155 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
"use strict"; | ||
|
||
require("./helpers/warmup-webpack"); | ||
|
||
const path = require("path"); | ||
const fs = require("graceful-fs"); | ||
const rimraf = require("rimraf"); | ||
|
||
let fixtureCount = 0; | ||
|
||
describe("Compiler (filesystem caching)", () => { | ||
jest.setTimeout(5000); | ||
|
||
const tempFixturePath = path.join( | ||
__dirname, | ||
"fixtures", | ||
"temp-filesystem-cache-fixture" | ||
); | ||
|
||
function compile(entry, onSuccess, onError) { | ||
const webpack = require(".."); | ||
const options = webpack.config.getNormalizedWebpackOptions({}); | ||
options.cache = { | ||
type: "filesystem", | ||
cacheDirectory: path.join(tempFixturePath, "cache") | ||
}; | ||
options.entry = entry; | ||
options.context = path.join(__dirname, "fixtures"); | ||
options.output.path = path.join(tempFixturePath, "dist"); | ||
options.output.filename = "bundle.js"; | ||
options.output.pathinfo = true; | ||
options.module = { | ||
rules: [ | ||
{ | ||
test: /\.svg$/, | ||
type: "asset/resource", | ||
use: { | ||
loader: require.resolve("./fixtures/empty-svg-loader") | ||
} | ||
} | ||
] | ||
}; | ||
|
||
function runCompiler(onSuccess, onError) { | ||
const c = webpack(options); | ||
c.hooks.compilation.tap( | ||
"CompilerCachingTest", | ||
compilation => (compilation.bail = true) | ||
); | ||
c.run((err, stats) => { | ||
if (err) throw err; | ||
expect(typeof stats).toBe("object"); | ||
stats = stats.toJson({ | ||
modules: true, | ||
reasons: true | ||
}); | ||
expect(typeof stats).toBe("object"); | ||
expect(stats).toHaveProperty("errors"); | ||
expect(Array.isArray(stats.errors)).toBe(true); | ||
if (stats.errors.length > 0) { | ||
onError(new Error(JSON.stringify(stats.errors, null, 4))); | ||
} | ||
c.close(() => { | ||
onSuccess(stats); | ||
}); | ||
}); | ||
} | ||
|
||
runCompiler(onSuccess, onError); | ||
|
||
return { | ||
runAgain: runCompiler | ||
}; | ||
} | ||
|
||
function cleanup() { | ||
rimraf.sync(`${tempFixturePath}*`); | ||
} | ||
|
||
beforeAll(cleanup); | ||
afterAll(cleanup); | ||
|
||
function createTempFixture() { | ||
const fixturePath = `${tempFixturePath}-${fixtureCount}`; | ||
const usesAssetFilepath = path.join(fixturePath, "uses-asset.js"); | ||
const svgFilepath = path.join(fixturePath, "file.svg"); | ||
|
||
// Remove previous copy if present | ||
rimraf.sync(fixturePath); | ||
|
||
// Copy over file since we"ll be modifying some of them | ||
fs.mkdirSync(fixturePath); | ||
fs.copyFileSync( | ||
path.join(__dirname, "fixtures", "uses-asset.js"), | ||
usesAssetFilepath | ||
); | ||
fs.copyFileSync(path.join(__dirname, "fixtures", "file.svg"), svgFilepath); | ||
|
||
fixtureCount++; | ||
return { | ||
rootPath: fixturePath, | ||
usesAssetFilepath: usesAssetFilepath, | ||
svgFilepath: svgFilepath | ||
}; | ||
} | ||
|
||
it("should compile again when cached asset has changed but loader output remains the same", done => { | ||
const tempFixture = createTempFixture(); | ||
|
||
const onError = error => done(error); | ||
|
||
const helper = compile( | ||
tempFixture.usesAssetFilepath, | ||
stats => { | ||
// Not cached the first time | ||
expect(stats.assets[0].name).toBe("bundle.js"); | ||
expect(stats.assets[0].emitted).toBe(true); | ||
|
||
expect(stats.assets[1].name).toMatch(/\w+\.svg$/); | ||
expect(stats.assets[0].emitted).toBe(true); | ||
|
||
helper.runAgain(stats => { | ||
// Cached the second run | ||
expect(stats.assets[0].name).toBe("bundle.js"); | ||
expect(stats.assets[0].emitted).toBe(false); | ||
|
||
expect(stats.assets[1].name).toMatch(/\w+\.svg$/); | ||
expect(stats.assets[0].emitted).toBe(false); | ||
|
||
const svgContent = fs | ||
.readFileSync(tempFixture.svgFilepath) | ||
.toString() | ||
.replace("icon-square-small", "icon-square-smaller"); | ||
|
||
fs.writeFileSync(tempFixture.svgFilepath, svgContent); | ||
|
||
helper.runAgain(stats => { | ||
// Still cached after file modification because loader always returns empty | ||
expect(stats.assets[0].name).toBe("bundle.js"); | ||
expect(stats.assets[0].emitted).toBe(false); | ||
|
||
expect(stats.assets[1].name).toMatch(/\w+\.svg$/); | ||
expect(stats.assets[0].emitted).toBe(false); | ||
|
||
done(); | ||
}, onError); | ||
}, onError); | ||
}, | ||
onError | ||
); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
module.exports = () => "<svg></svg>"; |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
import SVG from './file.svg'; |