oak-cli/lib/server/analysis.js

77 lines
3.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.analysis = void 0;
const tslib_1 = require("tslib");
const fs_1 = tslib_1.__importDefault(require("fs"));
const path_1 = tslib_1.__importDefault(require("path"));
/**
* 分析项目中的模块
* @param dir 项目目录
* @param output 输出目录
*/
const analysis = (dir, config) => {
const BuiltinModule = require("module");
// 兼容一些模拟环境下的 module 构造函数
const Module = module.constructor.length > 1 ? module.constructor : BuiltinModule;
// 保存原始的 _resolveFilename 方法
const oldResolveFilename = Module._resolveFilename;
const successImported = new Set();
// 重写 _resolveFilename 方法
Module._resolveFilename = function (request, // 模块请求路径
parent, // 调用方模块
isMain, // 是否是主模块
rFoptions // 解析选项
) {
// 调用原始的 _resolveFilename 方法
const filename = oldResolveFilename.call(this, request, parent, isMain, rFoptions);
// 记录成功导入的模块
successImported.add(filename);
// 返回解析后的模块路径
return filename;
};
const filterProjectModules = (modulePath) => {
if (config.includeNodeModules) {
return modulePath.includes(dir);
}
return modulePath.includes(dir) && !modulePath.includes('node_modules');
};
/**
* 将所有的文件复制到指定目录,并保持目录结构
* @param files 文件列表 string[]
* @param dest 目标目录
* @param root 原目录的根目录
*/
const copyFiles = (files, dest, root) => {
files.forEach(file => {
const relativePath = path_1.default.relative(root, file);
const destPath = path_1.default.join(dest, relativePath);
fs_1.default.mkdirSync(path_1.default.dirname(destPath), { recursive: true });
fs_1.default.copyFileSync(file, destPath);
});
};
const { watch } = require("./watch");
watch(dir).then(s => {
setTimeout(() => {
console.log('shutting down...');
s().then(() => {
console.log('server stoped');
// 把导入成功的输出
const project = Array.from(successImported).filter(filterProjectModules);
// 添加本地的scripts下的所有文件和package.json
const scriptsDir = path_1.default.join(dir, 'scripts');
const pkgPath = path_1.default.join(dir, 'package.json');
const files = fs_1.default.readdirSync(scriptsDir);
const scriptFiles = files.map(file => path_1.default.join(scriptsDir, file));
project.push(pkgPath, ...scriptFiles);
// 复制文件
const dest = path_1.default.join(dir, config.outputDir);
fs_1.default.mkdirSync(dest, { recursive: true });
copyFiles(project, dest, dir);
console.warn('分析结果以项目启动所需依赖为准如果涉及动态导入请设计routine在项目启动时进行加载');
process.exit(0);
});
}, 1000);
});
};
exports.analysis = analysis;