# fecode-lint-cli

> 前端编码规范工程化脚手架

Latest version **1.0.0-alpha.0** (published 2024-02-27) · ISC license · 0 weekly downloads

## Install

```sh
npm install fecode-lint-cli
pnpm add fecode-lint-cli
yarn add fecode-lint-cli
bun add fecode-lint-cli
```

Provides the command `fecode-lint-cli`.

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.0-alpha.0 |
| Published | 2024-02-27 |
| First published | 2024-02-27 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | bundled |
| Module format | CommonJS |
| Node | ^12.22.0 \|\| ^14.17.0 \|\| >=16.0.0 |
| Dependencies | 43 |
| Unpacked size | 77.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | zhutianhe |
| Maintainers | zhutianhe |

## Links

- npm: https://www.npmjs.com/package/fecode-lint-cli
- Repository: https://gitee.com/zth136/fecode-spec
- npm.io page: https://npm.io/package/fecode-lint-cli

## Dependencies (43)

- [ejs](https://npm.io/package/ejs.md) ^3.1.5
- [ora](https://npm.io/package/ora.md) ^5.1.0
- [glob](https://npm.io/package/glob.md) ^7.1.6
- [chalk](https://npm.io/package/chalk.md) ^4.1.0
- [execa](https://npm.io/package/execa.md) ^5.0.0
- [husky](https://npm.io/package/husky.md) ^3.1.0
- [eslint](https://npm.io/package/eslint.md) ^8.7.0
- [lodash](https://npm.io/package/lodash.md) ^4.17.20
- [fs-extra](https://npm.io/package/fs-extra.md) ^9.0.1
- [inquirer](https://npm.io/package/inquirer.md) ^7.3.3
- [prettier](https://npm.io/package/prettier.md) ^2.2.1
- [commander](https://npm.io/package/commander.md) ^6.2.1
- [fast-glob](https://npm.io/package/fast-glob.md) ^3.2.11
- [is-docker](https://npm.io/package/is-docker.md) ^2.1.1
- [stylelint](https://npm.io/package/stylelint.md) ^14.3.0
- [strip-ansi](https://npm.io/package/strip-ansi.md) ^6.0.0
- [text-table](https://npm.io/package/text-table.md) ^0.2.0
- [@babel/core](https://npm.io/package/@babel/core.md) ^7.16.0
- [cross-spawn](https://npm.io/package/cross-spawn.md) ^7.0.3
- [markdownlint](https://npm.io/package/markdownlint.md) ^0.25.1
- [terminal-link](https://npm.io/package/terminal-link.md) ^2.1.1
- [command-exists](https://npm.io/package/command-exists.md) ^1.2.9
- [stylelint-scss](https://npm.io/package/stylelint-scss.md) ^4.1.0
- [@commitlint/cli](https://npm.io/package/@commitlint/cli.md) ^16.0.0
- [eslint-config-egg](https://npm.io/package/eslint-config-egg.md) ^10.0.0
- [eslint-plugin-vue](https://npm.io/package/eslint-plugin-vue.md) ^7.3.0
- [vue-eslint-parser](https://npm.io/package/vue-eslint-parser.md) ^7.3.0
- [@babel/preset-react](https://npm.io/package/@babel/preset-react.md) ^7.16.0
- [eslint-plugin-react](https://npm.io/package/eslint-plugin-react.md) ^7.21.5
- [@babel/eslint-parser](https://npm.io/package/@babel/eslint-parser.md) ^7.16.3
- [eslint-plugin-import](https://npm.io/package/eslint-plugin-import.md) ^2.22.1
- [fecode-eslint-config](https://npm.io/package/fecode-eslint-config.md) ^0.0.18
- [eslint-config-prettier](https://npm.io/package/eslint-config-prettier.md) ^8.3.0
- [eslint-plugin-jsx-a11y](https://npm.io/package/eslint-plugin-jsx-a11y.md) ^6.4.1
- [eslint-plugin-prettier](https://npm.io/package/eslint-plugin-prettier.md) ^4.0.0
- [fecode-stylelint-config](https://npm.io/package/fecode-stylelint-config.md) ^0.0.18
- [fecode-commitlint-config](https://npm.io/package/fecode-commitlint-config.md) ^0.0.18
- [@typescript-eslint/parser](https://npm.io/package/@typescript-eslint/parser.md) ^5.0.0
- [eslint-plugin-react-hooks](https://npm.io/package/eslint-plugin-react-hooks.md) ^4.2.0
- [markdownlint-rule-helpers](https://npm.io/package/markdownlint-rule-helpers.md) ^0.13.0
- [fecode-markdownlint-config](https://npm.io/package/fecode-markdownlint-config.md) ^0.0.18
- [@typescript-eslint/eslint-plugin](https://npm.io/package/@typescript-eslint/eslint-plugin.md) ^5.0.0
- [eslint-import-resolver-typescript](https://npm.io/package/eslint-import-resolver-typescript.md) ^2.5.0

## Recent versions

- 1.0.0-alpha.0 (latest) — 2024-02-27
- 0.0.18 — 2024-02-27

## README

# `fecode-lint-cli`

> TODO: description


`fecode-lint-cli` 是前端代码规范工程化的 Lint 工具，可以为项目一键接入规约、一键扫描和修复规约问题，保障项目的编码规范和代码质量。

## 背景

我们引入了多个业界流行的 Linter 作为《阿里巴巴前端规约》的配套，并根据规约内容定制了规则包，它们包括：

| 规约                                                              | Lint 工具                                                  | npm 包                                                                                       |
| ----------------------------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| JavaScript 编码规范 <br/> TypeScript 编码规范 <br/> Node 编码规范 | [ESLint](https://eslint.org/)                              | [fecode-eslint-config](https://www.npmjs.com/package/fecode-eslint-config)             |
| CSS 编码规范                                                      | [stylelint](https://stylelint.io/)                         | [fecode-stylelint-config](https://www.npmjs.com/package/fecode-stylelint-config)       |
| Git 规范                                                          | [commitlint](https://commitlint.js.org/#/)                 | [fecode-commitlint-config](https://www.npmjs.com/package/fecode-commitlint-config)     |
| 文档规范                                                          | [markdownlint](https://github.com/DavidAnson/markdownlint) | [fecode-markdownlint-config](https://www.npmjs.com/package/fecode-markdownlint-config) |

可以看到这些 `Linter` 和规则包众多且零散，全部安装它们会给项目增加十几个依赖，接入和升级成本都比较高。

`fecode-lint-cli` 收敛屏蔽了这些依赖和配置细节，提供简单的 CLI 和 Node.js API，让项目能够一键接入、一键扫描、一键修复、一键升级，并为项目配置 git commit 卡口，降低项目接入规约的成本。

## CLI 使用

### 安装

在终端执行：

```bash
npm install fecode-lint-cli -g
```

安装完成后，可执行 `fecode-lint-cli -h` 以验证安装成功。

### 使用

#### `fecode-lint-cli init`：一键接入

在项目根目录执行 `fecode-lint-cli init`，即可一键接入规约，为项目安装规约 `Lint` 所需的依赖和配置。

具体会做以下事情：

- 安装各种依赖：包括 `Linter` 依赖，如 [ESLint](https://eslint.org/)、[stylelint](https://stylelint.io/)、[commitlint](https://commitlint.js.org/#/)、[markdownlint](https://github.com/DavidAnson/markdownlint) 等；配置依赖，如 [fecode-eslint-config](https://www.npmjs.com/package/fecode-eslint-config)、[fecode-stylelint-config](https://www.npmjs.com/package/fecode-stylelint-config)、[fecode-commitlint-config](https://www.npmjs.com/package/fecode-commitlint-config)、[fecode-markdownlint-config](https://www.npmjs.com/package/fecode-markdownlint-config) 等
- 写入各种配置文件，包括：
  - `.eslintrc.js`、`.eslintignore`：ESLint 配置（继承 `fecode-eslint-config`）及黑名单文件
  - `.stylelintrc.js`、`.stylelintignore`：stylelint 配置（继承 `fecode-stylelint-config`）及黑名单文件
  - `commitlint.config.js`：commitlint 配置（继承 `fecode-commitlint-config`）
  - `.markdownlint.json`、`.markdownlintignore`：`markdownlint` 配置及黑名单文件
  - `.prettierrc.js`：符合规约的 [Prettier 配置](https://prettier.io/docs/en/configuration.html)
  - `.editorconfig`：符合规约的 [editorconfig](https://editorconfig.org/)
  - `.vscode/extensions.json`：写入规约相关的 [VSCode 插件推荐](https://code.visualstudio.com/docs/editor/extension-gallery#_workspace-recommended-extensions)，包括 `ESLint`、`stylelint`、`markdownlint`、`prettier` 等
  - `.vscode/settings.json`：写入规约相关的 [VSCode 设置](https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations)，设置 `ESLint` 和 `stylelint` 插件的 `validate` 及**保存时自动运行 fix**，如果选择使用 `Prettier`，会同时将 `prettier-vscode` 插件设置为各前端语言的 defaultFormatter，并配置**保存时自动格式化**
  - `fecode-lint-cli.config.js`fecode-lint-cli 包的一些配置，如启用的功能等
- 配置 git commit 卡口：使用 [husky](https://www.npmjs.com/package/husky) 设置代码提交卡口，在 git commit 时会运行 `fecode-lint-cli commit-file-scan` 和 `fecode-lint-cli commit-msg-scan` 分别对提交文件和提交信息进行规约检查。`fecode-lint-cli commit-file-scan` 默认仅对 error 问题卡口，如果你想对 warn 问题也卡口，可以增加 `--strict` 参数以开启严格模式

> 注 1：如果项目已经配置过 ESLint、stylelint 等 Linter，执行 `fecode-lint-cli init` 将会提示存在冲突的依赖和配置，并在得到确认后进行覆盖：
>
> 注 2：如果项目的 .vscode/ 目录被 .gitignore 忽略，可以在拉取项目后单独执行 `fecode-lint-cli init --vscode` 命令写入 `.vscode/extensions.json` 和 `.vscode/settings.json` 配置文件

## Node.js API 使用

### 安装

```bash
npm install fecode-lint-cli --save
```

### API

#### init：初始化

- fecode-lint-cli.init(config)：将项目一键接入规约，效果等同于 `fecode-lint-cli init`

示例：

```js
(await encode) -
  fe -
  lint.init({
    eslintType: 'react',
    enableESLint: true,
    enableStylelint: true,
    enableMarkdownlint: true,
    enablePrettier: true,
    disableNpmInstall: false,
  });
```

config 参数如下：

| 参数               | 类型       | 默认值 | 说明                                                                                                                |
| ------------------ | ---------- | ------ | ------------------------------------------------------------------------------------------------------------------- |
| cwd                | string     | -      | 项目绝对路径                                                                                                        |
| eslintType         | ESLintType | -      | 语言和框架类型，如果不配置，等同于 fecode-lint-cli init，控制台会出现选择器，如果配置，控制台就不会出现选择器        |
| enableESLint       | boolean    | true   | 是否启用 ESLint，如果不配置默认值为 true，即默认启用 ESLint                                                         |
| enableStylelint    | boolean    | -      | 是否启用 stylelint，如果不配置，等同于 fecode-lint-cli init，控制台会出现选择器，如果配置，控制台就不会出现选择器    |
| enableMarkdownlint | boolean    | -      | 是否启用 markdownlint，如果不配置，等同于 fecode-lint-cli init，控制台会出现选择器，如果配置，控制台就不会出现选择器 |
| enablePrettier     | boolean    | -      | 是否启用 Prettier                                                                                                   |
| disableNpmInstall  | boolean    | false  | 是否禁用自动在初始化完成后安装依赖                                                                                  |

##### ESLintType

- `default`: JavaScript 项目（未使用 React 和 Vue 的 JS 项目）
- `react`: JavaScript + React 项目
- `vue`: JavaScript + Vue 项目
- `typescript/default`: TypeScript 项目（未使用 React 和 Vue 的 TS 项目）
- `typescript/react`: TypeScript + React 项目
- `typescript/vue`: TypeScript + Vue 项目
- `es5`: ES5 及之前版本的 JavaScript 老项目

## 配置

`fecode-lint-cli` 基于一份配置进行扫描（但你也可以零配置使用），支持的配置参数有：

| 参数                | 类型                    | 默认值 | 说明                                                                                           |
| ------------------- | ----------------------- | ------ | ---------------------------------------------------------------------------------------------- |
| enableESLint        | boolean                 | true   | 是否启用 ESLint                                                                                |
| enableStylelint     | boolean                 | true   | 是否启用 stylelint                                                                             |
| enableMarkdownlint  | boolean                 | true   | 是否启用 markdownlint                                                                          |
| enablePrettier      | boolean                 | -      | 是否启用 Prettier                                                                              |
| eslintOptions       | ESLint.Options          | -      | ESLint 配置项，若未设置将使用执行目录下或内置的默认 eslintrc 和 eslintignore 进行扫描          |
| stylelintOptions    | stylelint.LinterOptions | -      | stylelint 配置项，若未设置将使用执行目录下或内置的默认 stylelintrc 和 stylelintignore 进行扫描 |
| markdownlintOptions | markdownlint.Options    | -      | markdownlint 配置项，若未设置将使用执行目录下或内置的默认 markdownlint 配置文件进行扫描        |

`fecode-lint-cli` 会读取执行目录下的 `fecode-lint-cli.config.js` 作为配置文件。`fecode-lint-cli init` 会在执行目录下新增如下的 `fecode-lint-cli.config.js` 文件：

```js
module.exports = {
  enableESLint: true,
  enableStylelint: true,
  enableMarkdownlint: true,
  enablePrettier: true,
};
```

---
_Source: https://npm.io/package/fecode-lint-cli · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
