okam-build
Version:
The build tool for Okam develop framework
91 lines (78 loc) • 2.33 kB
JavaScript
/**
* @file Replacement processor
* @author sparklewhy@gmail.com
*/
;
const strUtil = require('../util').string;
function replaceContent(str, match, replacement) {
if (match === replacement) {
return str;
}
if (typeof match === 'string') {
// by default replace all matched content if the match is string
while (str.indexOf(match) !== -1) {
str = str.replace(match, replacement);
}
}
else {
str = str.replace(match, replacement);
}
return str;
}
function doReplacement(content, rules, file) {
const server = require('../server').getInstance();
let tplData = {};
if (server) {
tplData.devServer = server.getHost();
}
let result = content;
if (Array.isArray(rules)) {
rules.forEach(item => {
if (typeof item === 'function') {
result = item(result, file.path);
}
else if (typeof item === 'object') {
let {match, replace} = item;
replace = strUtil.format(replace, tplData, false);
result = replaceContent(result, match, replace);
}
});
}
else if (typeof rules === 'object') {
Object.keys(rules).forEach(k => {
let value = rules[k];
if (typeof value !== 'string') {
value = '' + value;
}
let replace = strUtil.format(value, tplData, false);
result = replaceContent(result, k, replace);
});
}
return result;
}
/**
* Replacement the file content using the given pattern
*
* @param {Object} file the file to process
* @param {Object} options the compile options
* @return {{content: string}}
*/
function process(file, options) {
let content = file.content.toString();
let {config: rules, logger} = options;
let result = content;
try {
result = doReplacement(content, rules || [], file);
}
catch (ex) {
let tip;
if (ex === 'devServer') {
tip = ', please execute `npm run dev:server` script or start with `--server` option';
}
logger.error('unknown replacement variable:', ex + (tip || ''));
}
return {
content: result
};
}
module.exports = exports = process;