const fs = require('fs-extra');
|
const path = require('path');
|
const { addExtension } = require('./utils.js');
|
const { MpComponentFileExtension, WxMpFileExtension } = require('./constant.js');
|
const CollectDependency = require('./collect-dependency.js');
|
|
const extToCollectMethodName = {
|
[WxMpFileExtension.js]: 'getJsDeps',
|
[WxMpFileExtension.wxs]: 'getJsDeps',
|
[WxMpFileExtension.wxss]: 'getWxCssDeps',
|
[WxMpFileExtension.wxml]: 'getWxHtmlDeps',
|
[WxMpFileExtension.json]: 'getJsonDeps',
|
};
|
|
class Depend {
|
constructor (context, readFileSync, existsSync) {
|
this.existsSync = existsSync || fs.existsSync.bind(fs);
|
this.readFileSync = readFileSync || fs.readFileSync.bind(fs);
|
this.componentLogicFiles = new Set();
|
this.files = new Set();
|
this.context = context;
|
this.allComponents = new Set();
|
this.collectDependency = new CollectDependency(context, this.readFileSync, this.existsSync, this.addExtension.bind(this));
|
}
|
|
addExtension (filePath, ext = '') {
|
if (ext === WxMpFileExtension.json) {
|
this.allComponents.add(filePath);
|
}
|
return `${filePath}.${ext}`;
|
}
|
|
// 将文件添加到树中
|
addToTree (filePath) {
|
filePath = path.resolve(filePath);
|
if (this.files.has(filePath)) {
|
return;
|
}
|
this.files.add(filePath);
|
const deps = this.getDeps(filePath) || [];
|
deps.forEach(dep => this.addToTree(dep));
|
}
|
|
getDeps (filePath) {
|
const extension = path.extname(filePath).slice(1);
|
const collectMethod = extToCollectMethodName[extension];
|
if (!collectMethod) {
|
return [];
|
}
|
|
const files = this.collectDependency[collectMethod](filePath);
|
const logicFiles = files.filter(filePath => filePath.endsWith(WxMpFileExtension.js));
|
logicFiles.forEach(logicFile => this.componentLogicFiles.add(logicFile));
|
return files;
|
}
|
|
getDepsByPageOrComponentPath (absPath) {
|
MpComponentFileExtension.forEach(ext => {
|
const filePath = this.addExtension(absPath, ext);
|
if (this.existsSync(filePath)) {
|
if (ext === WxMpFileExtension.js) {
|
this.componentLogicFiles.add(filePath);
|
}
|
this.addToTree(filePath);
|
}
|
});
|
}
|
|
getDepsByComponents (components) {
|
components.forEach(page => {
|
// 获取绝对地址
|
const absPath = path.join(this.context, page);
|
this.getDepsByPageOrComponentPath(absPath);
|
});
|
|
return this.files;
|
}
|
}
|
|
module.exports = Depend;
|