'use strict';
|
|
const path = require('path');
|
const fs = require('fs');
|
const mkdirp = require('mkdirp');
|
|
const calcHash = require('../lib/hash');
|
const paths = require('../lib/paths');
|
const getFile = require('../lib/get-file');
|
|
const getTargetDir = paths.getTargetDir;
|
const getAssetsPath = paths.getAssetsPath;
|
const normalize = paths.normalize;
|
|
const getHashName = (file, options) =>
|
(options && options.append ? (`${path.basename(file.path, path.extname(file.path))}_`) : '')
|
+ calcHash(file.contents, options)
|
+ path.extname(file.path);
|
|
/**
|
* Copy images from readed from url() to an specific assets destination
|
* (`assetsPath`) and fix url() according to that path.
|
* You can rename the assets by a hash or keep the real filename.
|
*
|
* Option assetsPath is require and is relative to the css destination (`to`)
|
*
|
* @type {PostcssUrl~UrlProcessor}
|
* @param {PostcssUrl~Asset} asset
|
* @param {PostcssUrl~Dir} dir
|
* @param {PostcssUrl~Option} options
|
* @param {PostcssUrl~Decl} decl
|
* @param {Function} warn
|
* @param {Result} result
|
* @param {Function} addDependency
|
*
|
* @returns {String|Undefined}
|
*/
|
module.exports = function processCopy(asset, dir, options, decl, warn, result, addDependency) {
|
if (!options.assetsPath && dir.from === dir.to) {
|
warn('Option `to` of postcss is required, ignoring');
|
|
return;
|
}
|
|
const file = getFile(asset, options, dir, warn);
|
|
if (!file) return;
|
|
const assetRelativePath = options.useHash
|
? getHashName(file, options.hashOptions)
|
: asset.relativePath;
|
|
const targetDir = getTargetDir(dir);
|
const newAssetBaseDir = getAssetsPath(targetDir, options.assetsPath);
|
const newAssetPath = path.join(newAssetBaseDir, assetRelativePath);
|
const newRelativeAssetPath = normalize(
|
path.relative(targetDir, newAssetPath)
|
);
|
|
mkdirp.sync(path.dirname(newAssetPath));
|
|
if (!fs.existsSync(newAssetPath)) {
|
fs.writeFileSync(newAssetPath, file.contents);
|
}
|
|
addDependency(file.path);
|
|
return `${newRelativeAssetPath}${asset.search}${asset.hash}`;
|
};
|