nsgm-cli
Version:
A CLI tool to run Next/Style-components and Graphql/Mysql fullstack project
120 lines (119 loc) • 5.78 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteFiles = exports.createFiles = exports.initFiles = void 0;
const path_1 = __importDefault(require("path"));
const shelljs_1 = __importDefault(require("shelljs"));
const utils_1 = require("./utils");
const constants_1 = require("./constants");
const project_config_1 = require("./utils/project-config");
const generate_init_1 = require("./generate_init");
const generate_create_1 = require("./generate_create");
const generate_delete_1 = require("./generate_delete");
// 常量提取
const NPM_INSTALL_FLAGS = '--legacy-peer-deps';
// 辅助函数
const normalizeDirectory = (dictionary) => {
// 禁止绝对路径,强制所有生成目录都在 cwd 下
if (!dictionary || dictionary === '/' || dictionary.trim() === '') {
return '.';
}
return dictionary.trim();
};
const installNpmPackages = (targetDir) => {
try {
const prefix = targetDir ? `cd ${targetDir} && ` : '';
console.log('Installing all dependencies from package.json...');
const installResult = shelljs_1.default.exec(`${prefix}npm install ${NPM_INSTALL_FLAGS}`);
return installResult.code === 0;
}
catch (error) {
console.error('Failed to install npm packages:', error);
return false;
}
};
const updateProjectFiles = (projectName, destPackagePath, destPublicHealthCheckPath, skipPackageUpdate = false) => {
try {
const cleanProjectName = path_1.default.basename(projectName);
if (!skipPackageUpdate) {
console.log(`Updating project name to: ${cleanProjectName}`);
shelljs_1.default.sed('-i', /nsgm-cli-project/g, `${cleanProjectName}-project`, destPackagePath);
}
shelljs_1.default.sed('-i', /NSGM-CLI/g, cleanProjectName, destPublicHealthCheckPath);
return true;
}
catch (error) {
console.error('Failed to update project files:', error);
return false;
}
};
/**
* 初始化项目文件和目录结构
* @param dictionary 目标目录名称,空字符串表示当前目录
* @param upgradeFlag 是否为升级模式,升级模式下不会安装依赖
* @param projectConfig 项目配置信息(可选)
*/
const initFiles = (dictionary, upgradeFlag = false, projectConfig) => {
if (constants_1.isLocal) {
upgradeFlag = false;
}
const normalizedDictionary = normalizeDirectory(dictionary);
let newDestFolder = constants_1.destFolder;
if (normalizedDictionary !== '.') {
newDestFolder = path_1.default.join(constants_1.destFolder, normalizedDictionary);
(0, utils_1.mkdirSync)(newDestFolder);
}
console.log('initFiles', normalizedDictionary === '.' ? '.' : normalizedDictionary, upgradeFlag);
(0, generate_init_1.initClientFiles)(normalizedDictionary, newDestFolder, upgradeFlag);
(0, generate_init_1.initPagesFiles)(normalizedDictionary, newDestFolder, upgradeFlag);
(0, generate_init_1.initServerFiles)(normalizedDictionary, newDestFolder, upgradeFlag);
const { destPublicHealthCheckPath } = (0, generate_init_1.initPublicFiles)(normalizedDictionary, newDestFolder, upgradeFlag);
(0, generate_init_1.initScriptsFiles)(normalizedDictionary, newDestFolder);
const { destPackagePath } = (0, generate_init_1.initRootFiles)(normalizedDictionary, newDestFolder);
(0, generate_init_1.initTestFiles)(normalizedDictionary, newDestFolder);
(0, generate_init_1.initTypesFiles)(normalizedDictionary, newDestFolder);
// 如果提供了项目配置,应用到生成的文件中
if (projectConfig) {
console.log('应用项目配置...');
(0, project_config_1.applyProjectConfig)(newDestFolder, projectConfig);
}
const installFlag = !upgradeFlag && (!constants_1.isLocal || dictionary.indexOf('..') !== -1);
if (installFlag) {
const projectName = normalizedDictionary !== '.' ? normalizedDictionary : path_1.default.basename(constants_1.destFolder);
// 如果有项目配置,跳过 package.json 的默认更新,因为 applyProjectConfig 已经处理了
const skipPackageUpdate = !!projectConfig;
const updateSuccess = updateProjectFiles(projectName, destPackagePath, destPublicHealthCheckPath, skipPackageUpdate);
const installSuccess = installNpmPackages(normalizedDictionary !== '.' ? normalizedDictionary : undefined);
if (!updateSuccess || !installSuccess) {
console.warn('Some operations failed during project initialization');
}
}
console.log('initFiles finished');
};
exports.initFiles = initFiles;
/**
* 创建控制器相关文件
* @param controller 控制器名称
* @param action 动作名称
* @param dictionary 目标目录名称,空字符串表示当前目录
* @param fields 字段定义数组
*/
const createFiles = (controller, action, dictionary = '', fields) => {
const normalizedDictionary = normalizeDirectory(dictionary);
(0, generate_create_1.createFiles)(controller, action, normalizedDictionary, fields);
};
exports.createFiles = createFiles;
/**
* 删除控制器相关文件
* @param controller 控制器名称
* @param action 动作名称
* @param deleteDBFlag 是否删除数据库相关文件
* @param dictionary 目标目录名称,空字符串表示当前目录
*/
const deleteFiles = (controller, action, deleteDBFlag = false, dictionary = '') => {
const normalizedDictionary = normalizeDirectory(dictionary);
(0, generate_delete_1.deleteFiles)(controller, action, deleteDBFlag, normalizedDictionary);
};
exports.deleteFiles = deleteFiles;