@franciscosolis/braces

中文文档
3.1.1发布于 2026/10/09MITTypeScriptESM + CJS构建来源已验证近 30 天下载 2.4万

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

中文使用文档
文档目录19 节
  1. * 概览
  2. * 特性
  3. * 安装
  4. 替换 braces 在您的依赖树上
  5. 使用量
  6. 编译对扩展
  7. 名单
  8. 顺序和步骤
  9. 缠绕
  10. 逃跑
  11. • API
  12. QQ 选项
  13. 处理不信任的模式
  14. 发展
  15. 跟上上游
  16. 捐款
  17. • 警卫
  18. • 信贷
  19. 许可证

{布瑞丝}

用于JavaScript的类似巴什的牙套扩张,并有用于深沉坠机的固定(GHSA-vfj7-8cjw-p6xm (中文(简体) )) (中文(简体) ).

npm CI License


* 概览

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

叉子是用来修复的 GHSA-vfj7-8cjw-p6xm (中文(简体) ) (单位:千美元)CVE-2026-93687 (英语)) (中文(简体) ). 深厚的巢穴图案 maxLength 限制已耗尽了调用堆栈, 并用未触摸到的程序崩溃 RangeError。每个已出版的版本 braces 3.0.3以下受影响,上游 拒绝修补。这个叉子将巢穴的深度覆盖在 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. 一次运行中的依赖性(填充范围) (中文(简体) ).

* 安装

npm install @franciscosolis/braces

替换 braces 在您的依赖树上

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

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

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


使用量

const braces = require('@franciscosolis/braces');
// ESM (3.1.0+)
import braces, { expand, compile } from '@franciscosolis/braces';

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

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()得到弦巴什会打印.

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']

名单

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']

顺序和步骤

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)']

缠绕

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

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']

逃跑

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

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 转换为模式 .
const ast = braces.parse('a/{b,c}');
braces.stringify(ast); //=> 'a/{b,c}'
braces.compile(ast); //=> 'a/(b|c)'

QQ 选项

选项类型默认说明
expandbooleanfalse返回每个被扩展的字符串, 而不是一个 regex 准备的字符串 .
maxLengthnumber10000最大输入长度 。 更长的输入会丢出一个 SyntaxError。以上数值 10000 被封顶.
maxDepthnumber100用于字符串和AST的最大嵌入深度 compile, (中文(简体) ), expand 财务报告和审定财务报表 stringify深层输入 SyntaxError。以上数值 100 被封顶;不是整数的值 >= 1 丢出一个 TypeError。 。 。 .
rangeLimitnumber1000扩展时,带这么多项或更多项的区域会扔出一个 RangeError启用 Infinity 以禁用.
nodupesbooleanfalse从结果中删除重复 .
noemptybooleanfalse从结果中删除空字符串 expand。 。 。 .
transform(value, index) => string自定义一个范围的每个项目. value 是数字区域的数字和字母区域字符代码.
keepEscapingbooleanfalse在结果中保留用于逃跑的后鞭.
keepQuotesbooleanfalse将引用的字符串放在结果中 .
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。 。 。 .
try {
  braces('{a,{b,c}}', { maxDepth: 1 });
} catch (err) {
  // SyntaxError: Input nesting depth exceeds max depth (1)
}

发展

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

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

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

cd bench
npm install
node index.js

CI在Node.js 8.3至22上进行测试. 从 GitHub 动作发布到 npm 来源 当 a v* 标记被推出 。 见 变化 对于每个版本的变化.

跟上上游

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

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输入 常规武器委员会。 。 。 .

不特指此分叉的变动,往往值得提出 上游 我也一样.


• 警卫

请私下报告弱点 GitHub 安全咨询而不是在公共问题.


• 信贷

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

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

叉子由维护 弗朗西斯科·索利斯。 。 。 .


许可证

释放 MIT 许可证。 。 。 .

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


由 Q 制作 弗兰在Jon Schlinkert和牙套贡献者的工作之上.

版本与发布记录

@franciscosolis/braces 共发布 5 个版本,首次发布于 2026/10/09;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.1.1latest2026/10/091 个月前
3.1.02026/10/091 个月前
3.0.62026/10/091 个月前
3.0.52026/10/091 个月前
0.0.0-stage2026/10/091 个月前

关于 @franciscosolis/braces 的常见问题

@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 和提交记录判断。