Skip to content

Commit

Permalink
refactor: code (#465)
Browse files Browse the repository at this point in the history
  • Loading branch information
cap-Bernardito committed May 12, 2020
1 parent 0be6470 commit e5e410a
Showing 1 changed file with 128 additions and 137 deletions.
265 changes: 128 additions & 137 deletions src/postProcessPattern.js
Expand Up @@ -14,7 +14,7 @@ import { stat, readFile } from './utils/promisify';

/* eslint-disable no-param-reassign */

export default function postProcessPattern(globalRef, pattern, file) {
export default async function postProcessPattern(globalRef, pattern, file) {
const { logger, compilation, inputFileSystem } = globalRef;

logger.debug(`getting stats for '${file.absoluteFrom}' to write to assets`);
Expand All @@ -23,145 +23,136 @@ export default function postProcessPattern(globalRef, pattern, file) {
? Promise.resolve().then(() => pattern.stats)
: stat(inputFileSystem, file.absoluteFrom);

return getStats.then((stats) => {
// We don't write empty directories
if (stats.isDirectory()) {
logger.debug(
`skipping '${file.absoluteFrom}' because it is empty directory`
);
let stats;

try {
stats = await getStats;
} catch (error) {
compilation.errors.push(error);
return;
}

if (stats.isDirectory()) {
logger.debug(
`skipping '${file.absoluteFrom}' because it is empty directory`
);
}

// If this came from a glob, add it to the file watchlist
if (pattern.fromType === 'glob') {
logger.debug(`add ${file.absoluteFrom} as fileDependencies`);
compilation.fileDependencies.add(file.absoluteFrom);
}

logger.debug(`reading '${file.absoluteFrom}' to write to assets`);

let content;

try {
content = await readFile(inputFileSystem, file.absoluteFrom);
} catch (error) {
compilation.errors.push(error);
return;
}

if (pattern.transform) {
logger.log(`transforming content for '${file.absoluteFrom}'`);

// eslint-disable-next-line no-shadow
const transform = (content, absoluteFrom) =>
pattern.transform(content, absoluteFrom);

if (pattern.cacheTransform) {
if (!globalRef.cacheDir) {
globalRef.cacheDir =
findCacheDir({ name: 'copy-webpack-plugin' }) || os.tmpdir();
}

const cacheKey = pattern.cacheTransform.key
? pattern.cacheTransform.key
: serialize({
name,
version,
pattern,
hash: crypto.createHash('md4').update(content).digest('hex'),
});

try {
const result = await cacache.get(globalRef.cacheDir, cacheKey);

logger.debug(
`getting cached transformation for '${file.absoluteFrom}'`
);

return Promise.resolve();
}
content = result.data;
} catch (e) {
content = await transform(content, file.absoluteFrom);

logger.debug(`caching transformation for '${file.absoluteFrom}'`);

// If this came from a glob, add it to the file watchlist
if (pattern.fromType === 'glob') {
logger.debug(`add ${file.absoluteFrom} as fileDependencies`);
compilation.fileDependencies.add(file.absoluteFrom);
content = await cacache
.put(globalRef.cacheDir, cacheKey, content)
.then(() => content);
}
} else {
content = await transform(content, file.absoluteFrom);
}
}

logger.debug(`reading '${file.absoluteFrom}' to write to assets`);

return readFile(inputFileSystem, file.absoluteFrom)
.then((content) => {
if (pattern.transform) {
logger.log(`transforming content for '${file.absoluteFrom}'`);

// eslint-disable-next-line no-shadow
const transform = (content, absoluteFrom) =>
pattern.transform(content, absoluteFrom);

if (pattern.cacheTransform) {
if (!globalRef.cacheDir) {
globalRef.cacheDir =
findCacheDir({ name: 'copy-webpack-plugin' }) || os.tmpdir();
}

const cacheKey = pattern.cacheTransform.key
? pattern.cacheTransform.key
: serialize({
name,
version,
pattern,
hash: crypto.createHash('md4').update(content).digest('hex'),
});

return cacache.get(globalRef.cacheDir, cacheKey).then(
(result) => {
logger.debug(
`getting cached transformation for '${file.absoluteFrom}'`
);

return result.data;
},
() =>
Promise.resolve()
.then(() => transform(content, file.absoluteFrom))
// eslint-disable-next-line no-shadow
.then((content) => {
logger.debug(
`caching transformation for '${file.absoluteFrom}'`
);

return cacache
.put(globalRef.cacheDir, cacheKey, content)
.then(() => content);
})
);
}

content = transform(content, file.absoluteFrom);
}

return content;
})
.then((content) => {
if (pattern.toType === 'template') {
logger.log(
`interpolating template '${file.webpackTo}' for '${file.relativeFrom}'`
);

// If it doesn't have an extension, remove it from the pattern
// ie. [name].[ext] or [name][ext] both become [name]
if (!path.extname(file.relativeFrom)) {
file.webpackTo = file.webpackTo.replace(/\.?\[ext\]/g, '');
}

file.webpackTo = loaderUtils.interpolateName(
{ resourcePath: file.absoluteFrom },
file.webpackTo,
{
content,
regExp: file.webpackToRegExp,
context: pattern.context,
}
);

// Bug in `loader-utils`, package convert `\\` to `/`, need fix in loader-utils
file.webpackTo = path.normalize(file.webpackTo);
}

return content;
})
.then((content) => {
if (pattern.transformPath) {
logger.log(
`transforming path '${file.webpackTo}' for '${file.absoluteFrom}'`
);

return Promise.resolve()
.then(() =>
pattern.transformPath(file.webpackTo, file.absoluteFrom)
)
.then((newPath) => {
file.webpackTo = newPath;

return content;
});
}

return content;
})
.then((content) => {
const targetPath = normalizePath(file.webpackTo);

if (compilation.assets[targetPath] && !file.force) {
logger.log(`skipping '${file.webpackTo}', because it already exists`);

return;
}

logger.log(
`writing '${file.webpackTo}' to compilation assets from '${file.absoluteFrom}'`
);
if (pattern.toType === 'template') {
logger.log(
`interpolating template '${file.webpackTo}' for '${file.relativeFrom}'`
);

// If it doesn't have an extension, remove it from the pattern
// ie. [name].[ext] or [name][ext] both become [name]
if (!path.extname(file.relativeFrom)) {
file.webpackTo = file.webpackTo.replace(/\.?\[ext\]/g, '');
}

compilation.assets[targetPath] = {
size() {
return stats.size;
},
source() {
return content;
},
};
});
});
file.webpackTo = loaderUtils.interpolateName(
{ resourcePath: file.absoluteFrom },
file.webpackTo,
{
content,
regExp: file.webpackToRegExp,
context: pattern.context,
}
);

// Bug in `loader-utils`, package convert `\\` to `/`, need fix in loader-utils
file.webpackTo = path.normalize(file.webpackTo);
}

if (pattern.transformPath) {
logger.log(
`transforming path '${file.webpackTo}' for '${file.absoluteFrom}'`
);

file.webpackTo = await pattern.transformPath(
file.webpackTo,
file.absoluteFrom
);
}

const targetPath = normalizePath(file.webpackTo);

if (compilation.assets[targetPath] && !file.force) {
logger.log(`skipping '${file.webpackTo}', because it already exists`);

return;
}

logger.log(
`writing '${file.webpackTo}' to compilation assets from '${file.absoluteFrom}'`
);

compilation.assets[targetPath] = {
size() {
return stats.size;
},
source() {
return content;
},
};
}

0 comments on commit e5e410a

Please sign in to comment.