1 Star 0 Fork 0

agile-development-system/node-utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

logo

@agds/node-utils

版本 :1.0.18

agds系统内部node工具函数库

快速开始

安装

npm i @agds/node-utils

引入

const utils = require('@agds/node-utils');
const { ConvName, FastPath, FastFs, Notice, PresetUtils, GitUtils, NpmUtils, CmdUtils } = utils;

导出

module.exports = { ConvName, FastPath, FastFs, Notice, PresetUtils, GitUtils };

代码演示

const { expect, test, describe } = require('@jest/globals');
const { ConvName, FastFs, FastPath, Notice, PresetUtils, CmdUtils, GitUtils, NpmUtils } = require('@agds/node-utils');
const path = require('path');
const fs = require('fs-extra');
describe('ConvName', () => {
    test('ConvName.initName', () => {
        const convName = ConvName.initName('ConvName-test');
        expect(convName).toMatchObject({
            lineName: 'conv-name-test',
            humpName: 'ConvNameTest',
            lowerHumpName: 'convNameTest',
        });
    });
    test('class ConvName', () => {
        const convName = new ConvName('ConvName-test');
        expect(convName).toMatchObject({
            lineName: 'conv-name-test',
            humpName: 'ConvNameTest',
            lowerHumpName: 'convNameTest',
        });
    });
    test('ConvName.toLine', () => {
        const name = ConvName.toLine('ConvName-test');
        expect(name).toBe('conv-name-test');
    });
    test('ConvName.toLowerHump', () => {
        const name = ConvName.toLowerHump('ConvName-test');
        expect(name).toBe('convNameTest');
    });
    test('ConvName.toUpperHump', () => {
        const name = ConvName.toUpperHump('ConvName-test');
        expect(name).toBe('ConvNameTest');
    });
});

const testText = 'Test';
describe('FastFs', () => {
    test('FastFs.writeFile', async () => {
        const pathName = path.join(__dirname, '.temp/FastFs.writeFile.test');
        await FastFs.writeFile(pathName, testText);
        expect(fs.readFileSync(pathName, { encoding: 'utf-8' })).toBe(testText);
    });
    test('FastFs.writeFileSync', () => {
        const pathName = path.join(__dirname, '.temp/FastFs.writeFileSync.test');
        FastFs.writeFileSync(pathName, testText);
        expect(fs.readFileSync(pathName, { encoding: 'utf-8' })).toBe(testText);
    });
    const statPathName = path.join(__dirname, '../__mock__/index.js');
    const statFalsePathName = path.join(__dirname, '../__mock__/index.jst');

    test('FastFs.getPathStat', async () => {
        const res = await FastFs.getPathStat(statPathName);
        expect(res).toBe(true);
    });
    test('FastFs.getPathStat false', async () => {
        const res = await FastFs.getPathStat(statFalsePathName);
        expect(res).toBe(false);
    });
    test('FastFs.getPathStatSync', () => {
        const res = FastFs.getPathStatSync(statPathName);
        expect(res).toBe(true);
    });
    test('FastFs.getPathStatSync false', () => {
        const res = FastFs.getPathStatSync(statFalsePathName);
        expect(res).toBe(false);
    });
    const obj = {
        a: 'a',
        b: 1,
    };
    test('FastFs.writeJsonFormat&FastFs.readJson', async () => {
        const pathName = path.join(__dirname, '.temp/FastFs.writeJsonFormat.json');
        await FastFs.writeJsonFormat(pathName, obj);
        expect(await FastFs.readJson(pathName)).toMatchObject(obj);
    });
    test('FastFs.writeJsonFormatSync&FastFs.readJsonSync', () => {
        const pathName = path.join(__dirname, '.temp/FastFs.writeJsonFormatSync.json');
        FastFs.writeJsonFormatSync(pathName, obj);
        expect(FastFs.readJsonSync(pathName)).toMatchObject(obj);
    });
    const json = require('../__mock__/json.json');
    const jsonPathName = path.join(__dirname, '../__mock__/json.json');
    test('FastFs.readJson', async () => {
        const res = await FastFs.readJson(jsonPathName);
        expect(res).toMatchObject(json);
    });
    test('FastFs.readJsonSync', () => {
        const res = FastFs.readJsonSync(jsonPathName);
        expect(res).toMatchObject(json);
    });
    test('FastFs parseJson error', () => {
        const jsonPathName = path.join(__dirname, '../__mock__/index.js');
        try {
            FastFs.readJsonSync(jsonPathName);
        } catch (error) {
            expect(error.message).toMatch(jsonPathName);
        }
    });
    test('FastFs.sortDependencies', () => {
        FastFs.sortDependencies(path.join(__dirname, '../__mock__/test-package.json'));
        expect(true).toBe(true);
    });
});

describe('FastPath', () => {
    test('FastPath.getCwdPath', () => {
        const res = FastPath.getCwdPath('package.json');
        expect(typeof res === 'string').toBe(true);
    });
    test('FastPath.getHomePath', () => {
        const res = FastPath.getHomePath('cache');
        expect(typeof res === 'string').toBe(true);
    });
    test('FastPath.getagdsHomePath', () => {
        const res = FastPath.getAgdsHomePath('cache');
        expect(typeof res === 'string').toBe(true);
    });
    test('FastPath.convPath', () => {
        const res = FastPath.convPath(__dirname, 'cache');
        expect(typeof res === 'string').toBe(true);
    });
    test('FastPath.convPath root', () => {
        const res = FastPath.convPath(__dirname, '/cache');
        expect(typeof res === 'string').toBe(true);
    });
});
describe('Notice', () => {
    const onConsoleOut = (logMethod, cb, out) => new Promise(resolve => {
        const log = console[logMethod];
        console[logMethod] = function () {
            // log.apply(console, arguments);
            cb.apply(null, arguments);
            resolve();
            console[logMethod] = log;
        };
        out();
    });
    test('Notice.success', () => {
        return onConsoleOut('log', (res) => {
            expect(JSON.stringify(res)).toBe('"\\u001b[42m\\u001b[30m SUCCESS \\u001b[39m\\u001b[49m\\u001b[32m 成功信息\\u001b[39m"');
        }, () => Notice.success('成功信息'));
    });
    test('Notice.error', () => {
        return onConsoleOut('error', (res) => {
            expect(JSON.stringify(res)).toBe('"\\u001b[41m ERROR \\u001b[49m\\u001b[31m 错误信息\\u001b[39m"');
        }, () => Notice.error('错误信息'));
    });
    test('Notice.warn', () => {
        return onConsoleOut('warn', (res) => {
            expect(JSON.stringify(res)).toBe('"\\u001b[43m\\u001b[30m WARN \\u001b[39m\\u001b[49m\\u001b[33m 警告信息\\u001b[39m"');
        }, () => Notice.warn('警告信息'));
    });
    test('Notice.info', () => {
        return onConsoleOut('info', (res) => {
            expect(JSON.stringify(res)).toBe('"\\u001b[44m\\u001b[30m INFO \\u001b[39m\\u001b[49m\\u001b[36m 普通信息\\u001b[39m"');
        }, () => Notice.info('普通信息'));
    });
    test('Notice.getStr', () => {
        const res = Notice.getStr('info', '普通信息颜色文字');
        expect(JSON.stringify(res)).toBe('"\\u001b[36m普通信息颜色文字\\u001b[39m"');
    });
    test('Notice.getBoldStr', () => {
        const res = Notice.getBoldStr('blue', '普通信息颜色文字');
        expect(JSON.stringify(res)).toBe('"\\u001b[1m\\u001b[34m普通信息颜色文字\\u001b[39m\\u001b[22m"');
    });
});

describe('PresetUtils', () => {
    const config = {
        presets: [{
            e: 'e',
            b: ['b'],
            c: 'c',
        }],
        a: 'a',
        c: 'd',
        b: [
            'a',
            'c',
        ],
        modify: (_config) => {
            delete _config.c;
        },
    };
    test('PresetUtils.getDeepPreset', async () => {
        const res = await PresetUtils.getDeepPreset(config);
        expect(res).toMatchObject([
            { e: 'e', b: ['b'], c: 'c' },
            { presets: [{ e: 'e', b: ['b'], c: 'c' }], a: 'a', c: 'd', b: ['a', 'c'] },
        ]);
    });
    test('PresetUtils.getDeepPresetMerge', async () => {
        const res = await PresetUtils.getDeepPresetMerge(config);
        expect(res).toMatchObject({ a: 'a', b: ['b', 'a', 'c'], c: 'd', e: 'e' });
    });
    test('PresetUtils.getDeepPresetMergeAndModify', async () => {
        const res = await PresetUtils.getDeepPresetMergeAndModify(config);
        expect(res).toMatchObject({ a: 'a', b: ['b', 'a', 'c'], e: 'e' });
    });
});

describe('CmdUtils', () => {

    test('CmdUtils.runCommand', () => {
        return CmdUtils.runCommand('cat', [path.join(__dirname, '../__mock__/test-package.json')]).then(() => {
            expect(true).toBe(true);
        });
    });
    test('CmdUtils.runCommand error', () => {
        return CmdUtils.runCommand('aaa').catch((e) => {
            expect(e.message).toMatch('aaa' + '执行失败');
        });
    });
});

describe('GitUtils', () => {
    test('GitUtils.getUser', () => {
        const user = GitUtils.getUser();
        expect(Object.values(user).map(v => typeof v).join(' ')).toBe(new Array(3).fill('string').join(' '));
    });
});

describe('NpmUtils', () => {
    const packageName = '@agds/node-utils';
    const version = '1.0.14';
    test('NpmUtils.getRegistry', () => {
        const res = NpmUtils.getRegistry();
        expect(typeof res).toBe('string');
    });
});

API文档

nodeUtils

nodeUtils.CmdParser

基于commander.js封装的命令行解析工具库

性质: nodeUtils的静态class

CmdParser.optionParseByConfig(program, config)

基于config配置Command实例

性质: CmdParser的静态方法

参数 类型 描述
program Command command实例
config CmdConfig 命令行解析配置

CmdConfig : object

命令行解析配置

性质: optionParseByConfig的类型声明

属性

属性 类型 描述
cmd string 作为插件时为子命令名称,单独使用时agds-<cmd>为命令行程序名称
desc string 描述
alias string 此命令的别名,只在插件调用时有效
opts Array.<OptConfig> option配置项描述
args Array.<ArgConfig> option配置项描述

OptConfig : object

命令行option解析配置

性质: optionParseByConfig的类型声明

属性

属性 类型 描述
opt string option字段配置
desc string 描述
default string | boolean 默认值
required boolean 是否是必填参数

ArgConfig : object

命令行option解析配置

性质: optionParseByConfig的类型声明

属性

属性 类型 描述
arg string option字段配置
desc string 描述
default string | boolean 默认值

CmdParser.cmdParser(options) ⇒ Command

基于配置文件的命令行解析器

性质: CmdParser的静态方法

参数 类型 描述
options object 函数参数
options.root string 当前命令行npm包根目录
[options.isCore] boolean 是否是@agds/cli调用
[options.cmd] string 命令名称,命令调用必填

nodeUtils.CmdUtils

运行命令行的工具集

性质: nodeUtils的静态class

CmdUtils.installDependencies(options, prod, [executable]) ⇒ Promise.<void>

在项目中执行 npm install

性质: CmdUtils的静态方法

参数 类型 默认值 描述
options module:child_process~SpawnOptions spawn函数的选项参数
prod boolean 是否只下载生产依赖
[executable] 'npm' | 'yarn' | string npm 依赖下载工具,可选值:'npm','yarn'或其他node包管理命令

CmdUtils.runCommand(cmd, args, options) ⇒ Promise.<void>

生成一个子进程并运行指定的命令 默认情况下,运行在CWD和'inherit'的stdio 选项与node的child_process.spawn相同

性质: CmdUtils的静态方法

参数 类型 描述
cmd string 命令
args Array.<string> 参数数组
options module:child_process~SpawnOptions spawn函数的选项参数

nodeUtils.ConvName

名称处理工具类,命名格式转换

性质: nodeUtils的静态class

new ConvName(name)

获取三种名称转换结果的集合

参数 类型 描述
name stirng 名称文本

convName.lineName : string

横杠名称

性质: ConvName的instance属性

convName.humpName : string

大驼峰名称

性质: ConvName的instance属性

convName.lowerHumpName : string

小驼峰名称

性质: ConvName的instance属性

ConvName.toUpperHump(name) ⇒ string

横杠转大驼峰

性质: ConvName的静态方法

参数 类型 描述
name string 名称文本

ConvName.toLowerHump(name) ⇒ string

横杠转小驼峰

性质: ConvName的静态方法

参数 类型 描述
name string 名称文本

ConvName.toLine(name) ⇒ string

驼峰转换横杠

性质: ConvName的静态方法

参数 类型 描述
name string 名称文本

ConvName.initName(name) ⇒ ConvName

获取驼峰和横杠名称

性质: ConvName的静态方法

参数 类型 描述
name string 名称文本

nodeUtils.FastFs

文件系统操作类,集合了几个使用频率较高的文件操作函数

性质: nodeUtils的静态class

FastFs.writeFile(filename, data) ⇒ Promise.<void>

异步写入数据,不存在的路径自动创建

性质: FastFs的静态方法

参数 类型 描述
filename fs.PathLike 文件名
data object 写入的数据(对象)

FastFs.writeFileSync(filename, data) ⇒ void

同步写入数据,不存在的路径自动创建

性质: FastFs的静态方法

参数 类型 描述
filename fs.PathLike 文件名
data object 写入的数据(对象)

FastFs.getPathStat(path) ⇒ Promise.<boolean>

异步获取路径是否存在

性质: FastFs的静态方法

参数 类型 描述
path fs.PathLike 路径

FastFs.getPathStatSync(path) ⇒ boolean

同步获取路径是否存在

性质: FastFs的静态方法

参数 类型 描述
path fs.PathLike 路径

FastFs.writeJsonFormat(filename, data, [space]) ⇒ Promise

异步写入符合.json格式的json文件

性质: FastFs的静态方法

参数 类型 默认值 描述
filename fs.PathLike 文件路径
data any 需要写入的数据
[space] string | number 2 指定缩进用的空白字符串

FastFs.writeJsonFormatSync(filename, data, [space]) ⇒ void

同步写入符合.json格式的json文件

性质: FastFs的静态方法

参数 类型 默认值 描述
filename fs.PathLike 文件路径
data any 需要写入的数据
[space] string | number 2 指定缩进用的空白字符串

FastFs.readJson(filename) ⇒ Promise.<object>

异步读取json文件

性质: FastFs的静态方法

参数 类型 描述
filename fs.PathLike json文件路径

FastFs.readJsonSync(filename) ⇒ object

同步读取json文件

性质: FastFs的静态方法

参数 类型 描述
filename fs.PathLike json文件路径

FastFs.sortDependencies(packageJsonFile)

对packageJson的依赖对象进行key的排序

性质: FastFs的静态方法

参数 类型 描述
packageJsonFile string packageJson文件绝对路径

nodeUtils.FastPath

路径工具类,快速获取各类node常用路径,每个方法要求路径都不是绝对路径 如果是绝对路径,就按照绝对路径拼接

性质: nodeUtils的静态class

FastPath.getCwdPath(...paths) ⇒ string

获取运行目录加路径的绝对路径

性质: FastPath的静态方法

参数 类型 描述
...paths string 路径

FastPath.getHomePath(...paths) ⇒ string

获取用户目录加路径的绝对路径

性质: FastPath的静态方法

参数 类型 描述
...paths string 路径

FastPath.getAgdsHomePath(...paths) ⇒ string

获取用户目录加路径的绝对路径

性质: FastPath的静态方法

参数 类型 描述
...paths string 路径

FastPath.convPath(basePath, paths) ⇒ string

基于基础路径拼接追加路径,如果追加路径数组第一个路径是绝对路径,忽略基础路径直接拼接返回
是其他函数的依赖函数

性质: FastPath的静态方法

参数 类型 描述
basePath string 基础路径
paths Array.<string> 追加路径数组

nodeUtils.GitUtils

Git工具集合

性质: nodeUtils的静态class

GitUtils.gcHasMsg() ⇒ boolean

判断git commit是否传入-m参数 配合yorkie使用,不支持识别husky

性质: GitUtils的静态方法

GitUtils.getUser() ⇒ UserObj

获取当前git用户名称

性质: GitUtils的静态方法 返回值: UserObj - git用户名对象

UserObj : object

git用户名对象

性质: getUser的类型声明

属性

属性 类型 描述
name string 名字
email string 电子邮箱
all string {name}<{email}>

nodeUtils.Notice

基于chalk封装的控制台输出静态函数类

性质: nodeUtils的静态class

ChalkType : 'success' | 'error' | 'warn' | 'info' | string

chalk类型以及别名

性质: Notice的类型声明

Notice.success(msg) ⇒ void

控制台输出成功信息

性质: Notice的静态方法

参数 类型 描述
msg string 成功信息

Notice.error(msg) ⇒ void

控制台输出错误信息

性质: Notice的静态方法

参数 类型 描述
msg string 错误信息文本

Notice.warn(msg) ⇒ void

控制台输出警告信息

性质: Notice的静态方法

参数 类型 描述
msg string 警告信息文本

Notice.info(msg) ⇒ void

控制台输出信息

性质: Notice的静态方法

参数 类型 描述
msg string 信息文本

Notice.getStr(type, msg) ⇒ chalk

获取各种颜色的字体

性质: Notice的静态方法

参数 类型 描述
type ChalkType chalk类型
msg string 文本

Notice.getBoldStr(type, msg) ⇒ chalk

获取各种颜色的粗体字体

性质: Notice的静态方法

参数 类型 描述
type ChalkType chalk类型
msg string 文本

nodeUtils.NpmUtils

npm工具集合

性质: nodeUtils的静态class

NpmUtils.getRegistry() ⇒ string

获取当前项目的npm镜像地址

性质: NpmUtils的静态方法

NpmUtils.getPackageInfo(packageName, [version]) ⇒ Promise

获取npm包的所有版本的所有信息

性质: NpmUtils的静态方法

参数 类型 描述
packageName string 包名
[version] string 版本或tag

NpmUtils.getPackageInfoWithVersion(packageName, [version]) ⇒ Promise

获取指定版本包信息

性质: NpmUtils的静态方法 返回值: Promise - 对应版本包信息

参数 类型 默认值 描述
packageName string 包名
[version] string "latest" 版本或者版本tag

NpmUtils.downloadPackage(options) ⇒ string

下载npm包到本地

性质: NpmUtils的静态方法 返回值: string - 包下载的本地路径

参数 类型 描述
options object 下载配置
options.outputDir string 输出目录
options.packageName string 包名
[options.version] string 版本或者版本tag
[options.autoInstall] boolean | InstallOption 自动下载npm包依赖或者自动下载配置

InstallOption : object

下载配置

性质: downloadPackage的类型声明

属性

属性 类型 默认值 描述
[prod] boolean true 是否只下载生产依赖

nodeUtils.PresetUtils

支持presets预设的配置生成工具

性质: nodeUtils的静态class

Config : object

支持preset的配置对象

性质: PresetUtils的类型声明

属性

属性 类型 描述
presets Array.<Config> 预设配置数组
modify ConfigModify 将默认配置和preset合并后生成的config再次处理的钩子

ConfigModify ⇒ Config

性质: PresetUtils的类型声明

参数 类型 描述
config Config 将默认配置和preset合并后生成的config

PresetUtils.getDeepPreset(config) ⇒ Promise.<Array.<Config>>

递归获取配置对象presets数组,返回一维数组

性质: PresetUtils的静态方法

参数 类型 描述
config Config 配置对象

PresetUtils.getDeepPresetMerge(config) ⇒ Config

递归获取配置对象presets数组,并使用merge合并

性质: PresetUtils的静态方法

参数 类型 描述
config Config 配置对象

PresetUtils.getDeepPresetMergeAndModify(config) ⇒ Config

递归获取配置对象presets数组,并使用merge合并,最后调用config.modify函数

性质: PresetUtils的静态方法

参数 类型 描述
config Config 配置对象

命令行使用文档

Usage: agds-gc-has-msg [options]

判断git commit命令是否传入-m参数

Options:
  -v,--version  查看版本号
  -h, --help    查看帮助信息

配合git hooks【prepare-commit-msg】和【commitizen】使用,避免git commit已经传入-m参数时调用commitizen界面

文档查看:git@gitee.com:agile-development-system/node-utils
@agds/node-utils@1.0.16 /Users/jinyang/code/ads/node-utils/node_modules/@agds/node-utils

如何使用

package.json下的gitHooks['prepare-commit-msg']下配合commitizen使用,git生命周期插件必须是yorkie

"gitHooks": {
+    "prepare-commit-msg": "agds-gc-has-msg && exec < /dev/tty && git cz --hook || true"
},

许可证

MIT License Copyright (c) 2021 锦阳

请维护者喝杯咖啡

加入钉钉群讨论或加入开发

MIT License Copyright (c) 2021 锦阳 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

暂无描述 展开 收起
README
MIT
取消

发行版

暂无发行版

贡献者 (1)

全部

近期动态

3年多前推送了新的提交到 master 分支,f5fdda5...79e06eb
3年多前推送了新的提交到 master 分支,7605bf5...f5fdda5
3年多前推送了新的提交到 master 分支,7936add...7605bf5
3年多前推送了新的提交到 master 分支,65dfb62...7936add
3年多前推送了新的提交到 master 分支,a02dd3d...65dfb62
加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/agile-development-system/node-utils.git
git@gitee.com:agile-development-system/node-utils.git
agile-development-system
node-utils
node-utils
master

搜索帮助