UNPKG

@wulechuan/cli-scripts--git-push

Version:

此为吴乐川的《管理【集得】源的辅助性命令行工具集》。 本工具集目前提供了若干可配置的内部工具, 以辅助任何 npm 项目构建适用其环境的命令行实用工具。 而构建出的这些实用工具可一次性将该 npm 项目之代码上推至多个集得源。 本工具集亦随附了这些实用工具的雏形,稍加修改即可运转,颇为方便。 本工具集安装伊始, 其内建的 JavaScript 程序会自动为这些实用工具设计配套的 VSCode 任务, 遂更为方便。 需注意, 本套工具之主体均并非采用 JavaScript 语言族编写, 而是采用

305 lines (232 loc) 10.8 kB
module.exports = { 求当前时间之文本_可用于文件系统之文件名, 将JSON中单个属性或成员配置为新值, 探测采用本工具集的_npm_项目的根文件夹路径, } /** * @typedef {import('chalk').ChalkInstance} 范_粉笔工具 */ /** * @typedef {import('node:path')} 范_路径工具 */ /** * @typedef {import('fs-extra')} 范_文件系统工具之扩展版 */ /** * @returns {string} 时间戳之人类可读文本,且可用于文件系统之文件名(文件夹名)。 */ function 求当前时间之文本_可用于文件系统之文件名 () { return new Date().toLocaleString('zh-cn', { dateStyle: 'long', timeStyle: 'medium', }).replace(/[\s:]/g, '_') } /** * * @param {any} 旧有实体 * @param {any} 拟配置为该实体 * @returns {{ 已有改动: boolean; 新实体: any }} */ functionJSON中单个属性或成员配置为新值 (旧有实体, 拟配置为该实体) { if (typeof 拟配置为该实体 === 'function') { throw new TypeError('tasks.json 中怎么还有函数?') } if (typeof 拟配置为该实体 !== 'object') { return { 已有改动: 旧有实体 !== 拟配置为该实体, 新实体: 拟配置为该实体, } } if (!拟配置为该实体) { // typeof null === 'object' if (旧有实体 === null || 旧有实体 === undefined) { return { 已有改动: false, 新实体: 旧有实体, } } else { return { 已有改动: true, 新实体: null, } } } if (Array.isArray(拟配置为该实体) && Array.isArray(旧有实体) && 拟配置为该实体.length === 旧有实体.length) { return 拟配置为该实体.reduce(( /** @type {ReturnType<将JSON中单个属性或成员配置为新值>} */ 综合结果, 拟配置为该成员, 列表编号 ) => { const 本项之执行结果 = 将JSON中单个属性或成员配置为新值(旧有实体[列表编号], 拟配置为该成员) if (本项之执行结果.已有改动) { 综合结果.已有改动 = true } // 旧有实体[列表编号] = 本项之执行结果.新实体 // 覆盖原始列表 综合结果.新实体.push(本项之执行结果.新实体) return 综合结果 }, { 已有改动: false, // 新实体: 旧有实体, 新实体: [], }) } if (!!旧有实体 && typeof 旧有实体 === 'object' && !Array.isArray(旧有实体)) { return Object.keys(拟配置为该实体).reduce((综合结果, 键) => { const 旧有值 = 旧有实体[键] const 拟配置值 = 拟配置为该实体[键] const 本项之执行结果 = 将JSON中单个属性或成员配置为新值(旧有值, 拟配置值) if (本项之执行结果.已有改动) { 综合结果.已有改动 = true } // 旧有实体[键] = 本项之执行结果.新实体 // 覆盖原始字典 综合结果.新实体[键] = 本项之执行结果.新实体 return 综合结果 }, { 已有改动: false, // 新实体: 旧有实体, 新实体: {}, }) } /** * 至此,可能的情形如下: * - 两个都是数组对象,但长度不等。 * - 一个是非数组对象,另一个不是(哪怕另一个是数组)。 * 策略为直接采用新值,抛弃旧值。 */ return { 已有改动: true, 新实体: 拟配置为该实体, } } /** * @param {object} 配置项集 * @param {范_粉笔工具} 配置项集.粉笔工具 * @param {范_路径工具} 配置项集.路径工具 * @param {范_文件系统工具之扩展版} 配置项集.文件系统工具之扩展版 * * @param {string} 配置项集.本函数之一切消息之前缀 * @param {string} 配置项集.探测之起点之绝对路径 * * @returns {{ 理想的文件夹之完整路径: string; 未成功: boolean; 疑似为本工具集自身的_install_生命周期任务故不必配置命令行脚本: boolean; 找到的_node_modules_之个数: number; 失败之原因: string; }} */ function 探测采用本工具集的_npm_项目的根文件夹路径 ({ 粉笔工具, 路径工具, 文件系统工具之扩展版, 本函数之一切消息之前缀, 探测之起点之绝对路径, } = {}) { /** * @param {string} 待检验的路径 * @returns {boolean} */ function 某路径为真实存在的文件 (待检验的路径) { let 确为文件 = false if (文件系统工具之扩展版.existsSync(待检验的路径)) { const 文件描述符 = 文件系统工具之扩展版.statSync(待检验的路径) if (文件描述符.isFile()) { 确为文件 = true } } console.debug(`\n\n${ 本函数之一切消息之前缀 }\n 某路径为真实存在的文件`, 确为文件, `"${待检验的路径}"`) return 确为文件 } if (typeof 本函数之一切消息之前缀 !== 'string' || !本函数之一切消息之前缀.trim()) { 本函数之一切消息之前缀 = '探测采用某 npm 项目:\n' } const 返回值 = { 未成功: true, 疑似为本工具集自身的_install_生命周期任务故不必配置命令行脚本: false, 理想的文件夹之完整路径: '', 失败之原因: '', 找到的_node_modules_之个数: 0, } if (!探测之起点之绝对路径 || typeof 探测之起点之绝对路径 !== 'string' || !路径工具.isAbsolute(探测之起点之绝对路径)) { console.log(`\n\n${ 本函数之一切消息之前缀 }\n ${ 粉笔工具.red('探测之起点之路径必须是绝对路径。') }`) 返回值.失败之原因 = '探测之起点之路径不是绝对路径。' return 返回值 } if (某路径为真实存在的文件(探测之起点之绝对路径)) { 探测之起点之绝对路径 = 路径工具.dirname(探测之起点之绝对路径) } if (!文件系统工具之扩展版.existsSync(探测之起点之绝对路径)) { console.log(`\n\n${ 本函数之一切消息之前缀 }\n ${ 粉笔工具.red('探测之起点之路径无效。') }`) 返回值.失败之原因 = '探测之起点之路径无效。' return 返回值 } const 各路径片段之列表 = 探测之起点之绝对路径.split(/[\\/]/).filter(路径片段 => !!路径片段) // console.log(各路径片段之列表) const 在最顶层_node_modules_之上的各路径片段 = [] let 找到的_node_modules_之个数 = 0 各路径片段之列表.forEach(路径片段 => { if (路径片段 === 'node_modules') { 找到的_node_modules_之个数++ return } if (找到的_node_modules_之个数 === 0) { 在最顶层_node_modules_之上的各路径片段.push(路径片段) } }) console.debug(`\n\n${ 本函数之一切消息之前缀 }\n 找到的_node_modules_之个数`, 找到的_node_modules_之个数) console.debug(`\n\n${ 本函数之一切消息之前缀 }\n在最顶层_node_modules_之上的各路径片段`, 在最顶层_node_modules_之上的各路径片段) 返回值.找到的_node_modules_之个数 = 找到的_node_modules_之个数 if (找到的_node_modules_之个数 === 0) { console.log(`\n\n${ 本函数之一切消息之前缀 }\n ${ 粉笔工具.yellow(`探测之起点所有的上层文件夹没有任何一个名为 “${粉笔工具.white('node_modules')}”。`) }`) 返回值.失败之原因 = '探测之起点所有的上层文件夹没有任何一个名为“node_modules”。' 返回值.疑似为本工具集自身的_install_生命周期任务故不必配置命令行脚本 = true return 返回值 } else if (找到的_node_modules_之个数 > 1) { console.log(`\n\n${ 本函数之一切消息之前缀 }\n ${ 粉笔工具.yellow(`探测之起点所有的上层诸文件夹中不止一个名为 “${粉笔工具.white('node_modules')}”。`) }`) 返回值.失败之原因 = '探测之起点所有的上层诸文件夹中不止一个名为“node_modules”。' return 返回值 } const 理想的文件夹之完整路径 = 在最顶层_node_modules_之上的各路径片段.join(路径工具.sep) const 理想路径中的_packageJSON_的完整路径 = 路径工具.join(理想的文件夹之完整路径, 'package.json') if (某路径为真实存在的文件(理想路径中的_packageJSON_的完整路径)) { const 采用本工具集之_npm_包之_packageJSON = 文件系统工具之扩展版.readJSONSync(理想路径中的_packageJSON_的完整路径) console.log(`\n\n${ 本函数之一切消息之前缀 }\n ${ 粉笔工具.green('成功探测到采用本工具集之 npm 包。') }\n 名为 "${ 粉笔工具.white(采用本工具集之_npm_包之_packageJSON.name) }"\n 路径为 "${ 粉笔工具.greenBright(理想的文件夹之完整路径) }"`) 返回值.未成功 = false 返回值.理想的文件夹之完整路径 = 理想的文件夹之完整路径 return 返回值 } else { console.log(`\n\n${ 本函数之一切消息之前缀 }\n ${ 粉笔工具.red('虽探测到疑似采用本工具集之 npm 包之根文件夹,') }\n ${ 粉笔工具.red('但其中没有找到 package.json 这一文件。') }`) 返回值.失败之原因 = '虽探测到疑似采用本工具集之 npm 包之根文件夹,但其中没有找到 package.json 这一文件。' return 返回值 } }