# @franciscosolis/braces 中文文档

规范地址：https://npmcn.com/package/%40franciscosolis/braces/

版本：3\.1\.1
npm 元数据更新时间：2026-10-09T01:24:47.902Z
中文译文更新时间：2026-11-15T12:03:48.140Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40franciscosolis/braces
原文对照：https://npmcn.com/package/%40franciscosolis/braces/?lang=original
项目主页：https://github.com/Im-Fran/braces
源码仓库：https://github.com/Im-Fran/braces

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：38.8 kB，12 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=8\.3
- 运行依赖：1 个
- 首次发布：2026-10-08T19:08:34.442Z
- 最新版本发布：2026-10-09T01:24:47.542Z
- 近 30 天下载量：23556（2026-10-16 至 2026-11-14，npm 官方下载统计）
- 已发布版本数：5（近 12 个月 5 个）

## 中文简介

类似巴什的牙套扩展,由JavaScript执行. 比起其他的牙套扩张型更安全 完全支持巴什 4.3齿套规格 而不牺牲速度.

## 安装

```sh
npm install @franciscosolis/braces
```

也可以使用：`pnpm add @franciscosolis/braces`、`yarn add @franciscosolis/braces`、`bun add @franciscosolis/braces`

## README

# {布瑞丝}

**用于JavaScript的类似巴什的牙套扩张,并有用于深沉坠机的固定([GHSA-vfj7-8cjw-p6xm (中文(简体) )](https://github.com/advisories/GHSA-vfj7-8cjw-p6xm)) (中文(简体) ).**

[![npm](https://img.shields.io/npm/v/@franciscosolis/braces)](https://www.npmjs.com/package/@franciscosolis/braces) [![CI](https://img.shields.io/github/actions/workflow/status/Im-Fran/braces/ci.yml?branch=dev&label=CI)](https://github.com/Im-Fran/braces/actions/workflows/ci.yml) [![License](https://img.shields.io/github/license/Im-Fran/braces)](https://npmcn.com/package/%40franciscosolis/braces/LICENSE)

* * *

## \* 概览

`@franciscosolis/braces` 是一个维护的叉 [微量匹配/组合](https://github.com/micromatch/braces),用于 `micromatch`, (中文(简体) ), `chokidar`, (中文(简体) ), `fast-glob` 和大部分Npm生态系统。 它会改变模式 `a/{b,c}/d` 或者说 `{01..10}` 输入一个字符串列表(如Bash所做的),或一个紧凑的、可以匹配的正则字符串.

叉子是用来修复的 [GHSA-vfj7-8cjw-p6xm (中文(简体) )](https://github.com/advisories/GHSA-vfj7-8cjw-p6xm) (单位:千美元)[CVE-2026-93687 (英语)](https://www.cve.org/CVERecord?id=CVE-2026-93687)) (中文(简体) ). 深厚的巢穴图案 `maxLength` 限制已耗尽了调用堆栈, 并用未触摸到的程序崩溃 `RangeError`。每个已出版的版本 `braces` 3.0.3以下受影响,上游 [拒绝修补](https://github.com/micromatch/braces/issues/70)。这个叉子将巢穴的深度覆盖在 parser 和 `compile`, (中文(简体) ), `expand` 财务报告和审定财务报表 `stringify` 行走者,包括AST直接通过,并投掷 `SyntaxError` 换句话说.

API 和 `braces` 3.x,所以它能起到倒置替代的作用.

* * *

## \* 特性

-   **Bash 4.3 支架扩张**: 清单(`{a,b}`),顺序(`{1..5}`, (中文(简体) ), `{a..e}`),步骤`{1..10..2}`),零贴(`{01..10}`),筑巢出逃.
-   **编译或扩展**: 默认模式编译为 regex 准备字符串(`a/(b|c)/d`),即使射程大,也保持了"小". 使用 `expand: true` 以获得每个字符串.
-   **在未信任的输入上安全**:对输入长度的限制(`maxLength`),筑巢深度(英语:`maxDepth`)和扩大范围(`rangeLimit`扔出可被接住的错误而不是挂起或坠入.
-   **类型脚本声明** 包括(自3.1.0起).
-   **共同JS和无害环境管理**数字 : `require()` 财务报告和审定财务报表 `import`,包括指名进口(自3.1.0起).
-   **广泛的运行时间支持**: Node.js >= 8.3. 一次运行中的依赖性([填充范围](https://github.com/jonschlinkert/fill-range)) (中文(简体) ).

* * *

## \* 安装

```bash
npm install @franciscosolis/braces
```

### 替换 `braces` 在您的依赖树上

大多数项目得到 `braces` 间接(通过) `micromatch`, (中文(简体) ), `chokidar`(见A/C.5/49/70,附件)。 要将它换成叉子,请在您身上添加一个覆盖 `package.json`。版本保留在 3.x 主要,所以它们符合通常 `^3.0.2` 财务报告和审定财务报表 `^3.0.3` 范围 :

```json
{
  "overrides": {
    "braces": "npm:@franciscosolis/braces@^3.0.5"
  }
}
```

使用 Yarn 时 `resolutions`,并使用 pnpm `pnpm.overrides`,数值相同。 然后重新安装和检查 `npm ls braces`。 。 。 .

* * *

## 使用量

```js
const braces = require('@franciscosolis/braces');
```

```js
// ESM (3.1.0+)
import braces, { expand, compile } from '@franciscosolis/braces';
```

主导出需要一个图案或一系列图案,加上选项,总是返回一个数组.

```js
braces('a/{x,y,z}/b'); //=> ['a/(x|y|z)/b']
braces(['{01..05}', '{a..e}']); //=> ['(0[1-5])', '([a-e])']
braces('a/{x,y,z}/b', { expand: true }); //=> ['a/x/b', 'a/y/b', 'a/z/b']
```

### 编译对扩展

默认模式为 **编译** 变成用于构建正则表达式的字符串。 范围像 `{1..1000000}` 保持短字符串而不是一百万项。 设定 `expand: true`,或打电话 `braces.expand()`得到弦巴什会打印.

```js
braces('a/{001..300}/b'); //=> ['a/(00[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b']
braces.expand('{01..05}'); //=> ['01', '02', '03', '04', '05']
```

### 名单

```js
braces.expand('a/{foo,bar,baz}/*.js'); //=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js']
braces.expand('{a,b}{1,2}'); //=> ['a1', 'a2', 'b1', 'b2']
```

### 顺序和步骤

```js
braces.expand('{1..3}'); //=> ['1', '2', '3']
braces.expand('{4..-4}'); //=> ['4', '3', '2', '1', '0', '-1', '-2', '-3', '-4']
braces.expand('{a..z..3}'); //=> ['a', 'd', 'g', 'j', 'm', 'p', 's', 'v', 'y']
braces('{2..10..2}'); //=> ['(2|4|6|8|10)']
```

### 缠绕

结果保持了从左到右的顺序,没有排序.

```js
braces.expand('a{b,c,/{x,y}}/e'); //=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e']
braces('a/{x,{1..5},y}/c'); //=> ['a/(x|([1-5])|y)/c']
```

### 逃跑

当两个牙套都逃出时,一个图案就留在原地,逃出逗号不是分隔符。 与巴什一样,一个装有牙套的物品没有扩大.

```js
braces.expand('a\\{d,c,b}e'); //=> ['a{d,c,b}e']
braces.expand('a{d\\,c,b}e'); //=> ['ad,ce', 'abe']
braces.expand('a{b}c'); //=> ['a{b}c']
```

* * *

## • API

| 方法 | 回返 | 说明 |
| --- | --- | --- |
| `braces(patterns, options?)` | `string[]` | 编译(或扩展 `expand: true`)一种或多种图案. |
| `braces.compile(pattern | ast, options?)` | `string` | 编译为 regex 准备的字符串 . |
| `braces.expand(pattern | ast, options?)` | `string[]` | 扩展到每个匹配字符串 . |
| `braces.create(pattern, options?)` | `string | string[]` | 电话 `compile`,或 `expand` 何时 `options.expand` 实值 `true`。 。 。 . |
| `braces.parse(pattern, options?)` | 辅助 | 将图案解为 AST . |
| `braces.stringify(pattern | ast, options?)` | `string` | 将 AST 转换为模式 . |

```js
const ast = braces.parse('a/{b,c}');
braces.stringify(ast); //=> 'a/{b,c}'
braces.compile(ast); //=> 'a/(b|c)'
```

* * *

## QQ 选项

| 选项 | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `expand` | `boolean` | `false` | 返回每个被扩展的字符串, 而不是一个 regex 准备的字符串 . |
| `maxLength` | `number` | `10000` | 最大输入长度 。 更长的输入会丢出一个 `SyntaxError`。以上数值 `10000` 被封顶. |
| `maxDepth` | `number` | `100` | 用于字符串和AST的最大嵌入深度 `compile`, (中文(简体) ), `expand` 财务报告和审定财务报表 `stringify`深层输入 `SyntaxError`。以上数值 `100` 被封顶;不是整数的值 `>= 1` 丢出一个 `TypeError`。 。 。 . |
| `rangeLimit` | `number` | `1000` | 扩展时,带这么多项或更多项的区域会扔出一个 `RangeError`启用 `Infinity` 以禁用. |
| `nodupes` | `boolean` | `false` | 从结果中删除重复 . |
| `noempty` | `boolean` | `false` | 从结果中删除空字符串 `expand`。 。 。 . |
| `transform` | `(value, index) => string` |  | 自定义一个范围的每个项目. `value` 是数字区域的数字和字母区域字符代码. |
| `keepEscaping` | `boolean` | `false` | 在结果中保留用于逃跑的后鞭. |
| `keepQuotes` | `boolean` | `false` | 将引用的字符串放在结果中 . |

```js
braces.expand('x/{a..e}/y', {
  transform: (value, index) => String.fromCharCode(value) + index,
}); //=> ['x/a0/y', 'x/b1/y', 'x/c2/y', 'x/d3/y', 'x/e4/y']
```

### 处理不信任的模式

Brace 扩展成倍增长 : `{1..100}{1..100}{1..100}` 扩展到一百万个字符串。 如果用户可以提供模式:

-   倾向于汇编(默认)而不是扩展.
-   保留 `rangeLimit` (低于) `maxLength` 或者说 `maxDepth` 如果可以的话).
-   检查错误 : `SyntaxError` 页:1 `maxLength`编号 :`maxDepth`, (中文(简体) ), `RangeError` 页:1 `rangeLimit`。 。 。 .

```js
try {
  braces('{a,{b,c}}', { maxDepth: 1 });
} catch (err) {
  // SyntaxError: Input nesting depth exceeds max depth (1)
}
```

* * *

## 发展

要求数 **节点.js** 第8.3页 **无**。 。 。 .

```bash
git clone https://github.com/Im-Fran/braces.git
cd braces
npm install
npm test
```

基准 `minimatch` 住在这里 `bench/` 并拥有自己的依附关系:

```bash
cd bench
npm install
node index.js
```

CI在Node.js 8.3至22上进行测试. 从 GitHub 动作发布到 npm [来源](https://docs.npmjs.com/generating-provenance-statements) 当 a `v*` 标记被推出 。 见 [变化](https://npmcn.com/package/%40franciscosolis/braces/CHANGELOG.md) 对于每个版本的变化.

### 跟上上游

分叉跟随上游. 审查并带来上游变化:

```bash
git remote add upstream https://github.com/micromatch/braces.git
git fetch upstream
git log dev..upstream/master
git checkout -b im-fran/chore/sync-upstream origin/dev
git merge upstream/master
```

然后打开一个拉请求 `dev`。总是合并;永远不要将已出版的历史重新定位到上游.

* * *

## 捐款

欢迎提出问题和拉动请求。 分行从 `dev`,添加任何行为变化的测试,确保 `npm test` 通过,并打开一个拉请求进入 `dev`输入 [常规武器委员会](https://www.conventionalcommits.org/)。 。 。 .

不特指此分叉的变动,往往值得提出 [上游](https://github.com/micromatch/braces) 我也一样.

* * *

## • 警卫

请私下报告弱点 [GitHub 安全咨询](https://github.com/Im-Fran/braces/security/advisories/new)而不是在公共问题.

* * *

## • 信贷

`braces` 创建于 **[乔恩·斯林克特](https://github.com/jonschlinkert)**他写了几乎所有的东西, 并保持上游在 [微量匹配/组合](https://github.com/micromatch/braces)没有这项工作,这一分叉就不会存在。 如果对您有用,请考虑主演原作.

上游贡献者包括 [布赖恩·伍德沃德](https://github.com/doowb), (中文(简体) ), [伊兰·尚克](https://github.com/es128), (中文(简体) ), [尤金·夏瑞金](https://github.com/eush77), (中文(简体) ), [(原始内容存档于2017-10-21). hemanth.hm](https://github.com/hemanth), (中文(简体) ), [保罗·米勒](https://github.com/paulmillr), (中文(简体) ), [丹尼斯·马利诺奇金](https://github.com/mrmlnc) 财务报告和审定财务报表 [其他许多](https://github.com/micromatch/braces/graphs/contributors)。 。 。 .

叉子由维护 [弗朗西斯科·索利斯](https://github.com/Im-Fran)。 。 。 .

* * *

## 许可证

释放 [MIT 许可证](https://npmcn.com/package/%40franciscosolis/braces/LICENSE)。 。 。 .

版权由2014年至今,Jon Schlinkert. 版权由2026年至今, Francisco Solis (fork).

* * *

由 Q 制作 [弗兰](https://franciscosolis.cl/)在Jon Schlinkert和牙套贡献者的工作之上.

## 常见问题

### @franciscosolis/braces 是什么？

类似巴什的牙套扩展,由JavaScript执行\. 比起其他的牙套扩张型更安全 完全支持巴什 4\.3齿套规格 而不牺牲速度\.

### 如何安装 @franciscosolis/braces？

在项目目录运行 npm install @franciscosolis/braces，或使用 pnpm add / yarn add / bun add。

### @franciscosolis/braces 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @franciscosolis/braces 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @franciscosolis/braces 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=8\.3。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @franciscosolis/braces 可以商用吗？

@franciscosolis/braces 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @franciscosolis/braces 的下载量有多少？

根据 npm 官方下载统计，@franciscosolis/braces 在 2026/10/16 – 2026/11/14 这 30 天内被下载 23,556 次，日均约 785 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @franciscosolis/braces 还在维护吗？

最新版本 3\.1\.1 发布于 2026/10/09（1 个月前）；至今共发布 5 个版本，其中过去 12 个月发布了 5 个；首次发布于 2026/10/09。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

