"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;