okam-build
Version:
The build tool for Okam develop framework
107 lines (90 loc) • 2.93 kB
JavaScript
/**
* @file File change handler
* @author sparkelwhy@gmail.com
*/
;
const path = require('path');
const {colors, Timer} = require('../util');
function compileFile(buildManager, file, releaseFiles) {
let logger = buildManager.logger;
typeof file === 'string' && (file = buildManager.createFile(file));
// check file whether is processed
let processed = releaseFiles.processed;
if (processed[file.path]) {
return;
}
processed[file.path] = true;
file.reset();
logger.debug('compile file', file.path);
releaseFiles.processFileNum += 1;
if (file.isImg) {
file.allowRelease = true;
// xxx: skip image file rebuild to avoid rebuild repeatedly
file.processing || releaseFiles.add(file);
return;
}
// analyse the style file dependence and determine which style file need to recompile
if (file.isStyle && !file.owner) {
// TODO init dep map global to search file by dep effectively
let changeFiles = buildManager.getFilesByDep(file.path);
logger.debug(file.path, 'changeFiles:' + changeFiles.length);
if (changeFiles.length) {
changeFiles.forEach(
item => compileFile(buildManager, item, releaseFiles)
);
return;
}
}
let result = buildManager.compile(file);
if (result) {
buildManager.buildDependencies();
}
}
function rebuildFiles(file, buildManager) {
let timer = new Timer();
timer.start();
let outputFiles = [];
let addReleaseFile = function (file) {
// skip sub file and repeated file
if (!file.owner && !outputFiles.includes(file)) {
outputFiles.push(file);
}
};
let releaseFiles = {
processFileNum: 0,
add: addReleaseFile,
processed: {}
};
buildManager.on('buildFileDone', addReleaseFile);
compileFile(buildManager, file, releaseFiles);
buildManager.removeListener('buildFileDone', addReleaseFile);
if (outputFiles.length) {
let logger = buildManager.logger;
buildManager.release(outputFiles).then(
() => logger.info(
'rebuild',
colors.cyan(releaseFiles.processFileNum),
'files done:',
colors.grey(timer.tick())
)
);
}
}
module.exports = exports = {
fileDel(file, buildManager) {
let dirname = path.dirname(
path.join(buildManager.root, file)
);
buildManager.cache.clearDirFileListInfo(dirname);
},
fileAdd(file, buildManager) {
let dirname = path.dirname(
path.join(buildManager.root, file)
);
buildManager.cache.clearDirFileListInfo(dirname);
rebuildFiles(file, buildManager);
},
fileChange(file, buildManager) {
rebuildFiles(file, buildManager);
}
};