* 概览
@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 选项
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
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 | 将引用的字符串放在结果中 . |
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页:1maxLength编号 :maxDepth, (中文(简体) ),RangeError页:1rangeLimit。 。 。 .
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).