npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@agds/node-utils

v1.0.18

Published

agds系统内部node工具函数库

Readme

@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界面

文档查看:[email protected]:agile-development-system/node-utils
@agds/[email protected] /Users/jinyang/code/ads/node-utils/node_modules/@agds/node-utils

许可证

MIT License Copyright (c) 2021 锦阳

请维护者喝杯咖啡

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