跳到主要内容
版本:1.0.0

Takin API

关于什么是 takin 可以参见 Takin 介绍

Cli

提供给 runner.hooks 的 Cli 实例,可通过 cli.command().option() 追加子命令和选项来干预命令行阶段实现自定义命令

import type { Plugin, Runner } from '@morjs/cli'

export default class MorJSPluginXXX implements Plugin {
name = 'MorJSPluginXXX'

apply(runner: Runner) {
// 可通过该 hook 拿到一个 cli 的实例
runner.hooks.cli.tap(this.name, (cli) => {
// 通过 cli.command 新建一个命令行指令
const command = cli.command(COMMAND_NAME, 'command指令描述')
// 注册 options 选项
command.option(rawName, '选项描述')

// eg: 创建一个名为 gogogo 的命令行指令,并添加 --prod 选项配置
// cli.command('gogogo', 'gogog 命令行').option('--prod', '开启生产模式')
// 那么在终端可运行 mor gogogo 或 mor gogogo --prod 命令行指令
})
}
}

Config

提供基础功能,用户配置支持

  1. 支持自定义配置配置文件的名称,如 mor.config.js
  2. 支持加载 js、ts、mjs、json 四种格式的配置文件
  3. 不同的文件使用不同的方式载入
  4. 支持用户自定义配置文件名称,并指定配置文件的支持类型,默认是 takin.config
  5. 支持通过插件注册配置字段和校验 schema
  6. 支持开启配置数组,并通过用户指定的字段来区分
  7. 支持配置合并(未完成)

logger

MorJS 对于日志进行了约束和定义,提供了一套简洁、美观的固定日志方法,只需引入 logger 即可使用

logger.init(level, options)

用于初始化 logger,多次调用会重复初始化同一个 logger

  • level: 配置日志级别,必填 string 类型,支持 infosuccesswarnerrorsilent,默认值 info
  • options: 通用 logger 配置,必填 object 类型,含四个非必填配置
    • prefix: 日志前缀,非必填 string 类型,目前默认值 [mor]
    • debugPrefix: debug 前缀,非必填 string 类型,目前默认值 MorJS
    • allowClearScreen: 是否清空屏幕,非必填 boolean 类型,目前默认值 true
    • customLogger: 自定义 logger 对象,非必填实例对象,用于取代现有 logger 实例
import { logger } from '@morjs/cli'

logger.init('info', { prefix: '[mor]', debugPrefix: 'mor' })

logger.withOptions(options)

用于返回携带特定 optionslogger 实例,该实例后续的调用都含有已配置的特定 options

  • options: 必填 object 类型,含以下个非必填配置
    • clear: 是否清空当前窗口,非必填 boolean 类型
    • timestamp: 是否携带时间戳,非必填 boolean 类型
    • color: 是否输出颜色,非必填 boolean 类型
    • align: 是否对齐,非必填 boolean 类型
    • symbol: 是否输出 symbol,非必填 booleanstring 类型
    • update: 是否为更新,非必填 boolean 类型
    • depth: 对象层级,非必填nullnumber类型
import { logger } from '@morjs/cli'

const logger = createLogger('info', {
debugPrefix: 'mor',
prefix: `[mor]`
}).withOptions({ color: false, align: true })

logger.info(msg, options)

在控制台打印 info 类型的日志输出

  • msg: 必填 any 类型,显示日志的输出内容
  • options: 非必填 object 类型,配置项与 logger.withOptionsoptions 一致

logger.success(msg, options)

在控制台打印 success 类型的日志输出,参数配置与 logger.info 一致

logger.warn(msg, options)

在控制台打印 warn 类型的日志输出,参数配置与 logger.info 一致

logger.warnOnce(msg, options)

在控制台打印 warnOnce 类型的日志输出,相同内容只会输出一次,参数配置与 logger.info 一致

logger.error(msg, options)

在控制台打印 error 类型的日志输出,参数配置与 logger.info 一致

import { logger } from '@morjs/cli'

logger.info('info 日志输出')
logger.success('success 日志输出')
logger.warn('warn 日志输出')
logger.warnOnce('warnOnce 日志输出,相同信息只输出一次')
logger.warnOnce('warnOnce 日志输出,相同信息只输出一次')
logger.error('error 日志输出')

logger.deprecate(deprecatedMsg, hint, error)

在控制台打印一段 warn 类型的 deprecate 日志输出

  • deprecatedMsg: 必填 any 类型,显示日志的输出内容
  • hint: 必填 any 类型,显示日志内容的提示
  • error: 非必填 object 类型,通用 error 结构
import { logger } from '@morjs/cli'

logger.deprecate('deprecatedMsg 日志输出', 'hint 提示')

logger.debug(msg, ...args)

基于 debug npmdebug 日志输出

import { logger } from '@morjs/cli'

logger.debug('debug 日志输出,仅在开启 debug 时显示')

logger.time(label) & logger.timeEnd(label)

耗时性能日志输出, 需要 logger.time() 配合 logger.timeEnd() 一起使用

  • label: 必填 string 类型,打印同一 label 值从开始到结束之间的耗时,单位 ms

logger.clearScreen(type)

清空当前屏幕

  • type: 配置清屏设置,必填 string 类型,支持 infosuccesswarnerror

logger.hasErrorLogged(error)

当前错误是否已输出,返回一个 boolean

  • error: 非必填 object 类型,通用 error 结构

logger.hasWarned

当前 logger 实例的 hasWarned 项,用于记录是否打印 warn 级别及以上报错日志

logger.hasErrored

当前 logger 实例的 hasErrored 项,用于记录是否打印 error 级别及以上报错日志

logger.options

当前 logger 实例的 options 配置,具体值可参考 logger.withOptionsoptions 配置项

logger.createLoading(msg, options)

可以创建一个 loading 日志对象

  • msg: 必填 any 类型,显示日志的输出内容
  • options: 非必填 object 类型,含四个非必填配置
    • clear: 是否清空当前窗口,非必填 boolean 类型
    • timestamp: 是否携带时间戳,非必填 boolean 类型
    • color: 是否输出颜色,非必填 boolean 类型
    • align: 是否对齐,非必填 boolean 类型
    • symbol: 是否输出 symbol,非必填 booleanstring 类型
    • update: 是否为更新,非必填 boolean 类型
    • depth: 对象层级,非必填 nullnumber 类型

logger.createLoading(msg) 返回携带特定 optionsloadingLogger 的实例对象,该实例对象提供以下几个方法

  • .start(msg): 开始执行 loadingLogger 日志实例对象,并先打印一次 msg 内容
    • msg: 非必填 any 类型,显示日志的输出内容,优先级大于 createLoadingmsg
  • .update(msg): 更新日志的输出内容
    • msg: 必填 any 类型,显示日志的输出内容
  • .stop(): 停止 loadingLogger 日志实例对象的执行
  • .success(msg, opts): 在控制台打印 success 类型的日志输出,参数配置与 logger.info 一致
  • .fail(msg, opts): 在控制台打印 error 类型的日志输出,参数配置与 logger.info 一致
  • .error(msg, opts): 在控制台打印 error 类型的日志输出,参数配置与 logger.info 一致

以下为示例代码:(真实的显示效果应为,每下一行的打印显示会自动替换前一行的显示,这里为了方便截图我在 init 里设置了 allowClearScreenstartupdate 的 icon 是一个类转圈的动效,开发者可以自己尝试看一下效果)

import { logger } from '@morjs/cli'

const loading = logger.createLoading('创建进程日志').start()
try {
setTimeout(() => {
loading.update('当前进度50%')
}, 1500)
setTimeout(() => {
loading.stop()
loading.success('当前进程已完成')
}, 3000)
} catch (err) {
loading.fail(err)
}

logger.table(tableOptions, type, options)

在控制台打印 table 表格类型的日志输出

  • tableOptions: 必填 object 类型
    • head: 表格头的配置信息,string[] 类型
    • rows: 表格内容的配置信息,string[][] 类型
    • colWidths: 表格每列的宽度,number[] 类型
    • colAligns: 表格每列的对齐方式,Array<'left' | 'middle' | 'right'> 类型
    • 其他配置项可查看源码或 typescript 对应注释
  • type: 非必填 string 类型,支持 infosuccesswarnerror
  • options: 非必填 object 类型,配置项与 logger.withOptionsoptions 一致
const table = {
head: ['head1', 'head2', 'head3'],
rows: [
['rows1-1', 'rows1-2', 'rows1-3'],
['rows2-1', 'rows2-2', 'rows2-3'],
['rows3-1', 'rows3-2', 'rows3-3']
],
colWidths: [30, 20, 20]
}
logger.table(table)

downloader

downloader.file.parseOptions(pathOrOptions)

解析 file 链接或选项

  • pathOrOptions: 链接 path 或选项 { path, ...options }
import { downloader } from '@morjs/cli'

downloader.file.parseOptions(pathOrOptions)

downloader.file.supportProtocol(url)

判断是否支持处理当前链接(正则)

  • url: 链接
import { downloader } from '@morjs/cli'

downloader.file.supportProtocol(url) // true / false

downloader.file.getName(fileOptions)

基于 file 链接选项获取名称

  • fileOptions: file 链接选项 { path, ...options }
import { downloader } from '@morjs/cli'

downloader.file.getName(fileOptions)

downloader.file.download(fileOptions, dest)

下载 file 链接到指定目录

  • fileOptions: file 链接选项
  • dest: 指定目录地址
import { downloader } from '@morjs/cli'

downloader.file.download(fileOptions, dest)

downloader.link.parseOptions(pathOrOptions)

解析 link 链接或选项

  • pathOrOptions: 链接或选项
import { downloader } from '@morjs/cli'

downloader.link.parseOptions(pathOrOptions)

downloader.link.supportProtocol(url)

判断是否支持处理当前链接(正则)

  • url: 链接
import { downloader } from '@morjs/cli'

downloader.link.supportProtocol(url) // true / false

downloader.link.getName(linkOptions)

基于 link 链接选项获取名称

  • linkOptions: link 链接选项 { path, ...options }
import { downloader } from '@morjs/cli'

downloader.link.getName(linkOptions)

downloader.link.download(linkOptions, dest)

下载 link 链接到指定目录

  • linkOptions: link 链接选项
  • dest: 指定目录地址
import { downloader } from '@morjs/cli'

downloader.link.download(linkOptions, dest)

downloader.git.addSupportGitSite(siteUrl, siteType)

添加支持的 git 站点

  • siteUrl: 站点地址, 如 github.com
  • siteType: 站点类型, 如 git / gitlab / bitbucket
import { downloader } from '@morjs/cli'

downloader.git.addSupportGitSite(siteUrl, siteType)

downloader.git.getGitHash(repo)

获取 git hash

  • repo: git repo 设置
import { downloader } from '@morjs/cli'

downloader.git.getGitHash(repo)

downloader.git.parseOptions(urlOrOptions)

解析 git 选项或链接

  • urlOrOptions: git 下载链接或选项
import { downloader } from '@morjs/cli'

downloader.git.parseOptions(urlOrOptions)

downloader.git.supportProtocol(url)

判断是否支持处理当前链接

  • url: 链接
import { downloader } from '@morjs/cli'

downloader.git.supportProtocol(url)

downloader.git.getName(options)

从 git 仓库选项中获取名称

  • options: git 仓库选项
import { downloader } from '@morjs/cli'

downloader.git.getName(options)

downloader.git.download(options, dest)

下载 git repo 到指定的目录

  • options: git 选项
  • dest: 下载目录
import { downloader } from '@morjs/cli'

downloader.git.download(options, dest)

downloader.tar.parseOptions(urlOrOptions)

解析 tar 链接或选项

  • urlOrOptions: 链接或选项
import { downloader } from '@morjs/cli'

downloader.tar.parseOptions(urlOrOptions)

downloader.tar.supportProtocol(url)

判断是否支持处理当前链接(正则)

  • url: 链接
import { downloader } from '@morjs/cli'

downloader.tar.supportProtocol(url)

downloader.tar.getName(tarOptions)

基于 tar 压缩包选项获取名称

  • tarOptions: tar 压缩包选项
import { downloader } from '@morjs/cli'

downloader.tar.getName(tarOptions)

downloader.tar.download(tarOptions, dest)

下载 tar 压缩包到指定目录

  • tarOptions: tar 压缩包选项
  • dest: 指定目录地址
import { downloader } from '@morjs/cli'

downloader.tar.download(tarOptions, dest)

downloader.npm.setRegistryUrl(url)

设置自定义 npm registry 地址

  • url: 自定义 npm registry 地址
import { downloader } from '@morjs/cli'

downloader.npm.setRegistryUrl(url)

downloader.npm.getRegistryUrl(scope)

返回 特定 scope 的 npm registry 地址

  • scope: npm 分组
import { downloader } from '@morjs/cli'

downloader.npm.getRegistryUrl(scope)

downloader.npm.parseOptions(urlOrOptions)

解析 npm 链接或选项

  • urlOrOptions: npm 链接或选项
import { downloader } from '@morjs/cli'

downloader.npm.parseOptions(urlOrOptions)

downloader.npm.supportProtocol(url)

判断是否支持处理当前链接

  • url: 链接
import { downloader } from '@morjs/cli'

downloader.npm.supportProtocol(url)

downloader.npm.getName(npmOptions)

从 npm 选项中获取名称

  • npmOptions: npm 选项
import { downloader } from '@morjs/cli'

downloader.npm.getName(npmOptions)

downloader.npm.download(npmOptions, dest)

下载 npm 到指定的目录

  • npmOptions: npm 下载链接或选项
  • dest: 下载目录
import { downloader } from '@morjs/cli'

downloader.npm.download(npmOptions, dest)

downloader.registerDownloader(type, downloader)

注册新的下载器

  • type: 下载器类型
  • downloader: 下载器
import { downloader } from '@morjs/cli'

downloader.npm.registerDownloader(type, downloader)

downloader.getModuleName(type, options)

获取下载模块名称

  • type: 下载类型
  • options: 下载配置
import { downloader } from '@morjs/cli'

downloader.npm.getModuleName(type, options)

downloader.chooseDownloadType(options)

基于下载配置选择下载方式

  • options: 下载配置
import { downloader } from '@morjs/cli'

downloader.chooseDownloadType(options)

downloader.getAllDownloadTypes()

获取所有下载类型

import { downloader } from '@morjs/cli'

downloader.getAllDownloadTypes()

downloader.parseOptions(type, options)

解析下载链接或选项

  • type: 下载类型
  • options: 下载链接或选项
import { downloader } from '@morjs/cli'

downloader.parseOptions(type, options)

downloader.download(type, options, dest)

尝试通过不同的方式下载模块

  • type: 下载方式
  • options: 下载配置
  • dest: 下载地址
import { downloader } from '@morjs/cli'

downloader.download(type, options, dest)

downloader.autoDetectDownloaderTypeAndOptions(url)

基于 url 自动判断支持的下载器类型及下载选项

  • url: 下载链接或地址
import { downloader } from '@morjs/cli'

downloader.autoDetectDownloaderTypeAndOptions(url)

downloader.tryDownloadByUrl(options, dest)

自动基于不同的协议来下载模块

  • options: 下载链接
  • dest: 下载地址
import { downloader } from '@morjs/cli'

downloader.tryDownloadByUrl(options, dest)

utils

封装定义了一些常用方法

asArray(value)

数组转换方法

  • value: 需要转换为数组的值
import { asArray } from '@morjs/cli'

asArray(value)

bundleMjsOrTsFile(cwd, fileName, mjs)

使用 esbuild 读取 ts 或 mjs 文件内容

  • cwd: 当前工作目录
  • fileName: 配置文件路径
  • mjs: 是否为 mjs 文件类型
import { bundleMjsOrTsFile } from '@morjs/cli'

bundleMjsOrTsFile(cwd, fileName, mjs)

isSupportColorModifier()

主要用于 logger 内部,标记是否支持 color modifier 如: bold strikethrough 等

import { isSupportColorModifier } from '@morjs/cli'

isSupportColorModifier()

disableColorModifierSupport()

将标记值改为 false

import { disableColorModifierSupport } from '@morjs/cli'

disableColorModifierSupport()

enableColorModifierSupport()

将标记值改为 true

import { enableColorModifierSupport } from '@morjs/cli'

enableColorModifierSupport()

compose(fns)

组合多个函数为一个,顺序执行

  • fns: 函数列表
import { compose } from '@morjs/cli'

compose(fns)

importJsOrMjsOrTsFromFile(cwd, filePath, isMjs, isTs, tempFilePath, autoDeleteTempFile)

载入并解析 js、mjs 或 ts 文件

import { importJsOrMjsOrTsFromFile } from '@morjs/cli'

importJsOrMjsOrTsFromFile(
cwd,
filePath,
isMjs,
isTs,
tempFilePath,
autoDeleteTempFile
)

interopRequireDefault(obj)

改造传入的对象结构

  • obj: 传入的对象值
import { interopRequireDefault } from '@morjs/cli'

interopRequireDefault(obj)

isObject(value)

判断是否为 object

  • value: 传入的对象值
import { isObject } from '@morjs/cli'

isObject(value)

isUnicodeSupported()

判断是否支持 unicode

import { isUnicodeSupported } from '@morjs/cli'

isUnicodeSupported()

lookupFile(dirs, files, extnames, options)

查找文件

  • dirs: 目录地址
  • files: 文件名
  • extnames: 后缀名
  • options: 查找选项
import { lookupFile } from '@morjs/cli'

lookupFile(dirs, files, extnames, options)

objectEnum(t)

通过数组创建对象 enum

  • t: 静态数组
import { objectEnum } from '@morjs/cli'

objectEnum(t)

readJsonLike(filePath)

读取类 json 文件,支持 json / jsonc / json5 三种格式

  • filePath: 类 json 文件
import { readJsonLike } from '@morjs/cli'

readJsonLike(filePath)

requireResolve(args)

由于 jest 没有办法 mock require.resolve, 需要单独封装方法来解决单测问题

https://github.com/facebook/jest/issues/9543

Generator

用于构建脚手架:

  1. 指定某个模板,支持本地加载或网络加载,支持多种类型
  • 基于 downloader 支持的各种类型:file 文件、git 仓库、link 软链、npm 包、tar 包
  • 下载后会调用 prompts 获取命令行交互结果,把结果作为参数抛给 lodash 的 template 模板里,通过模板 render 生成文件,写入模板到目标文件夹
  1. 自定义模板

deps

takin 本身的依赖库 export 出去,避免重复依赖

chalk

引用自 chalk 的第三方依赖,直接 export 给开发者引用,可用于修改终端输出字符彩色样式

import { chalk } from '@morjs/cli'

chalk()

debug

引用自 debug 的第三方依赖,直接 export 给开发者引用,可用于 logger 的 debug 日志输出,返回一个修饰过的 console.error 函数

import { debug } from '@morjs/cli'

debug()

execa

引用自 execa 的第三方依赖,直接 export 给开发者引用,可用于执行终端进程的库,如 execa.command(git clone ${repo.ssh}${dest})

import { execa } from '@morjs/cli'

execa()

esbuild

引用自 esbuild 的第三方依赖,直接 export 给开发者引用,支持 typescript 和 jsx 的极速打包器,目前提供给 bundleMjsOrTsFile 方法使用

import { esbuild } from '@morjs/cli'

esbuild()

fastGlob

引用自 fast-glob 的第三方依赖,直接 export 给开发者引用,可提供遍历文件系统和返回路径名的方法,目前提供给 generator 使用

import { fastGlob } from '@morjs/cli'

fastGlob()

fsExtra

引用自 fs-extra 的第三方依赖,直接 export 给开发者引用,可用于文件操作,复制、建目录、删除等 fs 扩展操作

import { fsExtra as fs } from '@morjs/cli'

fs()

got

引用自 got 的第三方依赖,直接 export 给开发者引用,可用于支持 promise 的 request 请求,目前提供给 download 使用

import { got } from '@morjs/cli'

got()

json5

引用自 json5 的第三方依赖,直接 export 给开发者引用,可用于支持 json5 格式的文件,提供更精简的 json 格式,去掉了 key 的双引号,同时支持注释

import { json5 } from '@morjs/cli'

json5()

jsoncParser

引用自 jsonc-parser 的第三方依赖,直接 export 给开发者引用,可用于支持 jsonc 格式的文件,用于序列化 jsonc 文件内容

import { jsoncParser } from '@morjs/cli'

jsoncParser()

lodash

引用自 lodash 的第三方依赖,直接 export 给开发者引用,提供大量封装的 js 方法,如「模板插入 template」「深拷贝 cloneDeep」「删除对象属性 omit」「判空 isEmpty」等

import { lodash } from '@morjs/cli'

lodash()

prompts

引用自 prompts 的第三方依赖,直接 export 给开发者引用,可用于创建交互命令行表单,目前提供给 generator 使用获取命令行交互结果

import { prompts } from '@morjs/cli'

prompts()

tapable

引用自 tapable 的第三方依赖,直接 export 给开发者引用,流程管理工具,主要用来串联插件,完善事件流执行

import { tapable } from '@morjs/cli'

tapable()

tarFs

引用自 tar-fs 的第三方依赖,直接 export 给开发者引用,可用于 tar 包的压缩与解压,目前提供给 download 使用

import { tarFs } from '@morjs/cli'

tarFs()

zod

引用自 zod 的第三方依赖,直接 export 给开发者引用,可用于以 typeScript 为基础的模式声明和验证校验手段

import { zod } from '@morjs/cli'

zod()