Skip to content

Commit bc2833e

Browse files
refactor: fix cache (#549)
1 parent 87a8486 commit bc2833e

File tree

6 files changed

+745
-514
lines changed

6 files changed

+745
-514
lines changed

package-lock.json

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"npm-run-all": "^4.1.5",
8080
"prettier": "^2.1.2",
8181
"standard-version": "^9.0.0",
82-
"webpack": "^5.3.0"
82+
"webpack": "^5.3.2"
8383
},
8484
"keywords": [
8585
"webpack",

src/index.js

Lines changed: 118 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,14 @@ class CopyPlugin {
8787
});
8888
}
8989

90-
static async runPattern(compiler, compilation, logger, cache, inputPattern) {
90+
static async runPattern(
91+
compiler,
92+
compilation,
93+
logger,
94+
cache,
95+
inputPattern,
96+
index
97+
) {
9198
const pattern =
9299
typeof inputPattern === 'string'
93100
? { from: inputPattern }
@@ -357,7 +364,10 @@ class CopyPlugin {
357364
logger.debug(`getting cache for '${absoluteFilename}'...`);
358365

359366
try {
360-
cacheEntry = await cache.getPromise(sourceFilename, null);
367+
cacheEntry = await cache.getPromise(
368+
`${sourceFilename}|${index}`,
369+
null
370+
);
361371
} catch (error) {
362372
compilation.errors.push(error);
363373

@@ -417,71 +427,6 @@ class CopyPlugin {
417427

418428
logger.debug(`read '${absoluteFilename}'`);
419429

420-
if (pattern.transform) {
421-
logger.log(`transforming content for '${absoluteFilename}'...`);
422-
423-
if (pattern.cacheTransform) {
424-
const cacheDirectory = pattern.cacheTransform.directory
425-
? pattern.cacheTransform.directory
426-
: typeof pattern.cacheTransform === 'string'
427-
? pattern.cacheTransform
428-
: findCacheDir({ name: 'copy-webpack-plugin' }) ||
429-
os.tmpdir();
430-
let defaultCacheKeys = {
431-
version,
432-
transform: pattern.transform,
433-
contentHash: crypto
434-
.createHash('md4')
435-
.update(data)
436-
.digest('hex'),
437-
};
438-
439-
defaultCacheKeys =
440-
typeof pattern.cacheTransform.keys === 'function'
441-
? await pattern.cacheTransform.keys(
442-
defaultCacheKeys,
443-
absoluteFilename
444-
)
445-
: {
446-
...defaultCacheKeys,
447-
...pattern.cacheTransform.keys,
448-
};
449-
450-
const cacheKeys = serialize(defaultCacheKeys);
451-
452-
try {
453-
logger.debug(
454-
`getting transformation cache for '${absoluteFilename}'...`
455-
);
456-
457-
const cachedResult = await cacache.get(
458-
cacheDirectory,
459-
cacheKeys
460-
);
461-
462-
({ data } = cachedResult);
463-
} catch (_ignoreError) {
464-
logger.debug(
465-
`no transformation cache for '${absoluteFilename}'...`
466-
);
467-
468-
data = await pattern.transform(data, absoluteFilename);
469-
470-
logger.debug(
471-
`caching transformation for '${absoluteFilename}'`
472-
);
473-
474-
await cacache.put(cacheDirectory, cacheKeys, data);
475-
476-
logger.debug(
477-
`cached transformation for '${absoluteFilename}'`
478-
);
479-
}
480-
} else {
481-
data = await pattern.transform(data, absoluteFilename);
482-
}
483-
}
484-
485430
result.source = new RawSource(data);
486431

487432
if (cache) {
@@ -506,7 +451,7 @@ class CopyPlugin {
506451
logger.debug(`storing cache for '${absoluteFilename}'...`);
507452

508453
try {
509-
await cache.storePromise(sourceFilename, null, {
454+
await cache.storePromise(`${sourceFilename}|${index}`, null, {
510455
source: result.source,
511456
snapshot,
512457
});
@@ -521,6 +466,108 @@ class CopyPlugin {
521466
}
522467
}
523468

469+
if (pattern.transform) {
470+
logger.log(`transforming content for '${absoluteFilename}'...`);
471+
472+
const buffer = result.source.source();
473+
474+
if (pattern.cacheTransform) {
475+
const defaultCacheKeys = {
476+
version,
477+
sourceFilename,
478+
transform: pattern.transform,
479+
contentHash: crypto
480+
.createHash('md4')
481+
.update(buffer)
482+
.digest('hex'),
483+
index,
484+
};
485+
const cacheKeys = `transform|${serialize(
486+
typeof pattern.cacheTransform.keys === 'function'
487+
? await pattern.cacheTransform.keys(
488+
defaultCacheKeys,
489+
absoluteFilename
490+
)
491+
: { ...defaultCacheKeys, ...pattern.cacheTransform.keys }
492+
)}`;
493+
494+
let cacheItem;
495+
let cacheDirectory;
496+
497+
logger.debug(
498+
`getting transformation cache for '${absoluteFilename}'...`
499+
);
500+
501+
// webpack@5 API
502+
if (cache) {
503+
cacheItem = cache.getItemCache(
504+
cacheKeys,
505+
cache.getLazyHashedEtag(result.source)
506+
);
507+
508+
result.source = await cacheItem.getPromise();
509+
} else {
510+
cacheDirectory = pattern.cacheTransform.directory
511+
? pattern.cacheTransform.directory
512+
: typeof pattern.cacheTransform === 'string'
513+
? pattern.cacheTransform
514+
: findCacheDir({ name: 'copy-webpack-plugin' }) ||
515+
os.tmpdir();
516+
517+
let cached;
518+
519+
try {
520+
cached = await cacache.get(cacheDirectory, cacheKeys);
521+
} catch (error) {
522+
logger.debug(
523+
`no transformation cache for '${absoluteFilename}'...`
524+
);
525+
}
526+
527+
// eslint-disable-next-line no-undefined
528+
result.source = cached ? new RawSource(cached.data) : undefined;
529+
}
530+
531+
logger.debug(
532+
result.source
533+
? `found transformation cache for '${absoluteFilename}'`
534+
: `no transformation cache for '${absoluteFilename}'`
535+
);
536+
537+
if (!result.source) {
538+
const transformed = await pattern.transform(
539+
buffer,
540+
absoluteFilename
541+
);
542+
543+
result.source = new RawSource(transformed);
544+
545+
logger.debug(
546+
`caching transformation for '${absoluteFilename}'...`
547+
);
548+
549+
// webpack@5 API
550+
if (cache) {
551+
await cacheItem.storePromise(result.source);
552+
} else {
553+
try {
554+
await cacache.put(cacheDirectory, cacheKeys, transformed);
555+
} catch (error) {
556+
compilation.errors.push(error);
557+
558+
return;
559+
}
560+
}
561+
562+
logger.debug(`cached transformation for '${absoluteFilename}'`);
563+
}
564+
} else {
565+
result.source = new RawSource(
566+
await pattern.transform(buffer, absoluteFilename)
567+
);
568+
}
569+
}
570+
524571
if (pattern.toType === 'template') {
525572
logger.log(
526573
`interpolating template '${filename}' for '${sourceFilename}'...`
@@ -615,14 +662,15 @@ class CopyPlugin {
615662

616663
try {
617664
assets = await Promise.all(
618-
this.patterns.map((item) =>
665+
this.patterns.map((item, index) =>
619666
limit(async () =>
620667
CopyPlugin.runPattern(
621668
compiler,
622669
compilation,
623670
logger,
624671
cache,
625-
item
672+
item,
673+
index
626674
)
627675
)
628676
)

0 commit comments

Comments
 (0)