@fxri/toolkit 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +51 -4
- package/SPEC.md +3 -2
- package/dist/cli.cjs +12 -12
- package/dist/cli.js +12 -12
- package/dist/index.cjs +12 -12
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +12 -12
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @fxri/toolkit
|
|
2
2
|
|
|
3
|
+
## 1.1.0
|
|
4
|
+
> 2026-09-03 发布
|
|
5
|
+
|
|
6
|
+
### ✨ 新增功能
|
|
7
|
+
|
|
8
|
+
- 新增隐私脱敏能力:落盘记录自由文本时默认对邮箱、手机号、身份证、IPv4、密钥、JWT、内网 URL 做掩码,支持 --no-redact / FX_REDACT / .toolkitrc.json 三档开关与自定义规则;归档任务改为按完成时间降序并规范化 completed;修复 CHANGELOG 日期补全重复插入。
|
|
9
|
+
|
|
3
10
|
## 1.0.2
|
|
4
11
|
> 2026-09-03 发布
|
|
5
12
|
|
package/README.md
CHANGED
|
@@ -68,7 +68,7 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
|
|
|
68
68
|
```typescript
|
|
69
69
|
import {
|
|
70
70
|
listTasks, printTasks, archiveTasks, parseFrontmatter,
|
|
71
|
-
languages, DEFAULT_LANG, localDate, formatChangelogs,
|
|
71
|
+
languages, DEFAULT_LANG, localDate, formatChangelogs, redactText,
|
|
72
72
|
} from "@fxri/toolkit"
|
|
73
73
|
|
|
74
74
|
// 任务管理
|
|
@@ -79,23 +79,70 @@ const result = archiveTasks(".tasks")
|
|
|
79
79
|
// CHANGELOG 格式化(默认中文)
|
|
80
80
|
formatChangelogs(".", localDate(), languages[DEFAULT_LANG])
|
|
81
81
|
formatChangelogs(".", localDate(), languages.en)
|
|
82
|
+
|
|
83
|
+
// 隐私脱敏(printTasks/archiveTasks/formatChangelog(s) 的第 2/4 个参数 redact 默认 true)
|
|
84
|
+
const masked = redactText("联系 tqy@fxri.net", true) // → "联系 t***@***.net"
|
|
82
85
|
```
|
|
83
86
|
|
|
87
|
+
`printTasks` / `archiveTasks` / `formatChangelog` / `formatChangelogs` 均提供可选 `redact` 参数(默认 `true`),传 `false` 可关闭本次脱敏。
|
|
88
|
+
|
|
84
89
|
### 语言扩展
|
|
85
90
|
|
|
86
91
|
新增语言只需在 `languages` 里追加一个映射项:
|
|
87
92
|
|
|
88
93
|
```typescript
|
|
89
94
|
export const languages = {
|
|
90
|
-
zh: { replacements: { "### Major Changes": "### 🚨 重大变更", ... }, deps: "- 更新依赖" },
|
|
91
|
-
en: { replacements: {}, deps: "- Updated dependencies" },
|
|
95
|
+
zh: { replacements: { "### Major Changes": "### 🚨 重大变更", ... }, deps: "- 更新依赖", released: "发布" },
|
|
96
|
+
en: { replacements: {}, deps: "- Updated dependencies", released: "released" },
|
|
92
97
|
// 未来:ja / ko / ...
|
|
93
98
|
}
|
|
94
99
|
```
|
|
95
100
|
|
|
101
|
+
## 🔒 隐私脱敏
|
|
102
|
+
|
|
103
|
+
落盘记录自由文本(任务正文/标题、CHANGELOG 条目)时默认脱敏敏感信息,`owner` 等结构化 frontmatter 字段不脱敏。
|
|
104
|
+
|
|
105
|
+
- **内置规则**:邮箱、手机号、身份证、IPv4、AWS/GitHub/OpenAI/Slack 密钥、JWT、含端口内网 URL
|
|
106
|
+
- **关闭开关**(默认开启,优先级从高到低):
|
|
107
|
+
- CLI 参数 `--no-redact`
|
|
108
|
+
- 环境变量 `FX_REDACT=0`
|
|
109
|
+
- 配置文件 `redact.enabled: false`
|
|
110
|
+
- **自定义规则**:项目根 `.toolkitrc.json`,追加规则(优先于内置)或按 `name` 禁用内置规则:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"redact": {
|
|
115
|
+
"enabled": true,
|
|
116
|
+
"disable": ["手机号"],
|
|
117
|
+
"rules": [
|
|
118
|
+
{ "name": "自定义码", "pattern": "cod-[0-9]{6}", "flags": "i", "replacement": "cod-******" }
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**效果示例**:以上配置下,任务正文 `联系 tqy@fxri.net,电话 13812345678,验证码 COD-123456` 归档后:
|
|
125
|
+
|
|
126
|
+
| 类型 | 原文 | 归档后 |
|
|
127
|
+
| --- | --- | --- |
|
|
128
|
+
| 邮箱(内置) | `tqy@fxri.net` | `t***@***.net` |
|
|
129
|
+
| 手机号(已禁用) | `13812345678` | `13812345678` |
|
|
130
|
+
| 自定义码(自定义,flags i) | `COD-123456` | `cod-******` |
|
|
131
|
+
|
|
96
132
|
## ⚙️ 环境要求
|
|
97
133
|
|
|
98
|
-
- Node.js >= 20
|
|
134
|
+
- Node.js >= 20(正式支持)
|
|
135
|
+
|
|
136
|
+
### 版本兼容性实测
|
|
137
|
+
|
|
138
|
+
| 能力 | Node 20 | Node 18 |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| 安装 | ✅ | ✅(npm 报 EBADENGINE 警告) |
|
|
141
|
+
| tasks(总览 / 归档) | ✅ | ✅ |
|
|
142
|
+
| changelog format(纯格式化) | ✅ | ✅ |
|
|
143
|
+
| changelog init/add/version/publish | ✅ | ❌ |
|
|
144
|
+
|
|
145
|
+
⚠️ Node 18 下依赖 changesets 的 changelog 子命令因上游 `human-id@4`(ESM-only)无法被 `require()`,报 `ERR_REQUIRE_ESM`;属 changesets 生态限制,非本工具代码问题。
|
|
99
146
|
|
|
100
147
|
## 📄 版权信息
|
|
101
148
|
|
package/SPEC.md
CHANGED
|
@@ -60,7 +60,7 @@ scope: app
|
|
|
60
60
|
|
|
61
61
|
### 3.2 内容
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
同一天完成的任务整合进同一文件,**按完成时间降序排序**(最新在前),任务之间用 `---` 分隔:
|
|
64
64
|
|
|
65
65
|
```markdown
|
|
66
66
|
# 20260902 归档
|
|
@@ -87,7 +87,7 @@ scope: app
|
|
|
87
87
|
2. **任务级归档**:`status ∈ {已完成, 已放弃}` 且带 `completed` 的任务可归档。
|
|
88
88
|
3. `待办` / `进行中` / `阻塞` 均不归档。
|
|
89
89
|
4. 归档文件按 `completed` 的日期(`YYYYMMDD`)划分。
|
|
90
|
-
5. 归档文件内任务按 `completed`
|
|
90
|
+
5. 归档文件内任务按 `completed` **降序**排序(最新在前,`YYYY-MM-DD HH:mm` 定宽字符串比较即时间序)。
|
|
91
91
|
|
|
92
92
|
## 5. 其他语言实现要点
|
|
93
93
|
|
|
@@ -98,3 +98,4 @@ scope: app
|
|
|
98
98
|
3. **完成时间提取**:从 frontmatter 的 `completed` 字段读取。
|
|
99
99
|
4. **归档合并**:读取已有归档文件的任务块,与新任务合并后按 `completed` 排序,重写归档文件。
|
|
100
100
|
5. **任务块分隔**:归档文件内任务以 `---` + `## ` 为边界,勿将正文内部的 `## ` 小节误判为任务边界。
|
|
101
|
+
6. **敏感信息脱敏(可选)**:如需保护隐私,可在写归档前对正文自由文本做掩码;`owner` 等结构化字段保留原值。
|
package/dist/cli.cjs
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`);let
|
|
2
|
+
var Q=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,f=Q();var K=require("module"),Y=require("child_process");var M=require("fs"),S=require("path");function T(e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let t={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let a=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),a&&(t[a]=s)}return t}function A(e){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?e.slice(n[0].length):e}var $=require("fs"),y=require("path");function C(e){if(!(0,$.existsSync)(e))return[];let n=[];for(let t of(0,$.readdirSync)(e)){let r=(0,y.join)(e,t);if((0,$.statSync)(r).isDirectory())for(let o of(0,$.readdirSync)(r))o.endsWith(".md")&&n.push((0,y.join)(r,o));else t.endsWith(".md")&&n.push(r)}return n}function W(e){let t=(0,y.basename)(e,(0,y.extname)(e)).match(/^(\d{8})/);return t?t[1]:""}var Z=require("fs"),I=require("path"),V=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],x,R=null;function N(){if(x!==void 0)return x;x=null;try{let e=(0,Z.readFileSync)((0,I.join)(process.cwd(),".toolkitrc.json"),"utf8");x=JSON.parse(e).redact??null}catch{}return x}function ee(){if(R)return R;let e=N(),n=new Set(e?.disable??[]),t=[];for(let r of e?.rules??[])try{t.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return R=[...t,...V.filter(r=>!n.has(r.name))],R}function b(e,n){if(!n||!e)return e;let t=e;for(let r of ee())t=t.replace(r.pattern,r.replacement);return t}function O(e){return!(e.includes("--no-redact")||process.env.FX_REDACT==="0"||N()?.enabled===!1)}function te(e=".tasks"){let n=(0,S.join)(e,"active");return C(n).map(t=>{let r=(0,M.readFileSync)(t,"utf8"),o=T(r),a=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||(0,S.basename)(t,".md");return{file:t,name:(0,S.basename)(t,".md"),date:W(t),title:a,frontmatter:o,body:A(r).trim()}})}function P(e=".tasks",n=!0){let t=te(e);if(t.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let s of t){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
3
|
+
`);let a=0;for(let s of r){let l=o[s]||[];if(l.length!==0){a+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let i of l)console.log(` ${i.date} ${(i.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${b(i.title,n)}`);console.log("")}}console.log(`\u5171 ${a} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var d=require("fs"),m=require("path");var B=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function ne(e,n){let t=(0,m.resolve)(e),r=(0,m.resolve)(n);for(;t!==r&&t.startsWith(r+m.sep);){try{if((0,d.readdirSync)(t).length>0)break;(0,d.rmdirSync)(t)}catch{break}t=(0,m.dirname)(t)}}function G(e){let n=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:e}function re(e){let n=(0,d.readFileSync)(e,"utf8"),t=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)t.push({block:o[0].trim(),completed:o[2].trim()});return t}function J(e=".tasks",n=!0){let t=(0,m.join)(e,"active"),r=(0,m.join)(e,"archive"),o=C(t);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let a=[],s=[];for(let i of o){let g=(0,d.readFileSync)(i,"utf8"),u=T(g);if(!B.includes(u.status))continue;let h=G(u.completed||"");if(!h){s.push((0,m.basename)(i,".md")),console.log(`\u8DF3\u8FC7 ${(0,m.basename)(i,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}a.push({file:i,name:(0,m.basename)(i,".md"),owner:u.owner||"\u672A\u6807\u6CE8",status:u.status||"\u672A\u6807\u6CE8",scope:u.scope||"-",completed:h,body:A(g).trim()})}if(a.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let i of a){let g=i.completed.replace(/-/g,"").slice(0,8);(l[g]||=[]).push(i)}for(let[i,g]of Object.entries(l)){let u=(0,m.join)(r,i.slice(0,6));(0,d.mkdirSync)(u,{recursive:!0});let h=(0,m.join)(u,`${i}.md`),p=(0,d.existsSync)(h)?re(h):[];p.push(...g.map(c=>({block:`## ${c.name}
|
|
4
4
|
|
|
5
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
5
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${c.owner}\u3000\u72B6\u6001\uFF1A${c.status}\u3000\u8303\u56F4\uFF1A${c.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${c.completed}
|
|
6
6
|
|
|
7
|
-
${
|
|
7
|
+
${b(c.body,n)}`,completed:c.completed})));for(let c of p)c.completed=G(c.completed);p.sort((c,U)=>U.completed.localeCompare(c.completed)),(0,d.writeFileSync)(h,`# ${i} \u5F52\u6863
|
|
8
8
|
|
|
9
9
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
10
10
|
|
|
11
|
-
${
|
|
11
|
+
${p.map(c=>c.block).join(`
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
`)}
|
|
16
|
-
`,"utf8");for(let
|
|
16
|
+
`,"utf8");for(let c of g)(0,d.unlinkSync)(c.file);ne((0,m.dirname)(g[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${i}.md`)}return console.log(`\u5171\u5F52\u6863 ${a.length} \u4E2A\u4EFB\u52A1`),{archived:a.length,skipped:s}}var v={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},F="zh";var w=require("fs");var H=require("fs"),j=require("path");function q(e){let n=[],t=new Set(["node_modules",".git","dist"]),r=o=>{let a;try{a=(0,H.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let s of a)if(s.isDirectory()){if(t.has(s.name))continue;r((0,j.join)(o,s.name))}else s.name==="CHANGELOG.md"&&n.push((0,j.join)(o,s.name))};return r(e),n}function L(){let e=new Date,n=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function oe(e,n,t,r=!0){let o=(0,w.readFileSync)(e,"utf8"),a=o.includes(`\r
|
|
17
17
|
`)?`\r
|
|
18
18
|
`:`
|
|
19
|
-
`,
|
|
20
|
-
`);for(let[
|
|
21
|
-
${
|
|
22
|
-
${
|
|
23
|
-
`),
|
|
24
|
-
`);return
|
|
19
|
+
`,s=o.replace(/\r\n/g,`
|
|
20
|
+
`),l=s;for(let[p,c]of Object.entries(t.replacements))l=l.replaceAll(p,c);for(;l.includes(`${t.deps}
|
|
21
|
+
${t.deps}`);)l=l.replace(`${t.deps}
|
|
22
|
+
${t.deps}`,t.deps);for(;;){let p=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(p===l)break;l=p}let i=l.split(`
|
|
23
|
+
`),g=[];for(let p=0;p<i.length;p++)if(g.push(i[p]),/^## \d+\.\d+\.\d+/.test(i[p])){let c=p+1;for(;c<i.length&&i[c].trim()==="";)c++;i[c]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(i[c].trim())||g.push(`> ${n} ${t.released}`)}let u=g.join(`
|
|
24
|
+
`),h=b(u,r);return h!==s?((0,w.writeFileSync)(e,h.replace(/\n/g,a),"utf8"),!0):!1}function _(e,n,t,r=!0){let o=[];for(let a of q(e))oe(a,n,t,r)&&o.push(a);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let a of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${a}`);return o}var se=(0,K.createRequire)(f),ae=se.resolve("@changesets/cli/bin.js"),E=e=>{let n=(0,Y.spawnSync)(process.execPath,[ae,...e],{stdio:"inherit"});n.status!==0&&process.exit(n.status??1)},z=process.argv.slice(2),X=z[0],k=z.slice(1),D=O(z);if(X==="tasks"){let e=k.indexOf("--dir"),n=e>=0&&k[e+1]?k[e+1]:".tasks";(k.find(r=>!r.startsWith("--")&&r!==n)||"list")==="archive"?J(n,D):P(n,D)}else if(X==="changelog"){let e=k.indexOf("--lang"),n=e>=0&&k[e+1]?k[e+1]:F,t=(e>=0?k.filter((o,a)=>a!==e&&a!==e+1):k).filter(o=>o!=="--no-redact"),r=t[0];r==="version"?(E(["version"]),_(".",L(),v[n]??v[F],D)):r==="format"?_(".",L(),v[n]??v[F],D):E(r?t:[])}else console.log("\u7528\u6CD5\uFF1Atoolkit <tasks|changelog> ..."),console.log(" toolkit tasks \u4EFB\u52A1\u603B\u89C8"),console.log(" toolkit tasks archive \u5F52\u6863\u5DF2\u5B8C\u6210\u4EFB\u52A1"),console.log(" toolkit changelog \u521B\u5EFA\u53D8\u66F4\u96C6"),console.log(" toolkit changelog version \u53D1\u7248 + \u591A\u8BED\u8A00\u683C\u5F0F\u5316"),console.log(" toolkit changelog format \u7EAF\u683C\u5F0F\u5316");
|
package/dist/cli.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createRequire as
|
|
3
|
-
`);let
|
|
2
|
+
import{createRequire as ye}from"module";import{spawnSync as be}from"child_process";import{readFileSync as re}from"fs";import{join as oe,basename as O}from"path";function b(e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let t={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let a=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),a&&(t[a]=s)}return t}function x(e){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?e.slice(n[0].length):e}import{existsSync as X,readdirSync as L,statSync as K}from"fs";import{join as _,basename as Y,extname as Q}from"path";function v(e){if(!X(e))return[];let n=[];for(let t of L(e)){let r=_(e,t);if(K(r).isDirectory())for(let o of L(r))o.endsWith(".md")&&n.push(_(r,o));else t.endsWith(".md")&&n.push(r)}return n}function z(e){let t=Y(e,Q(e)).match(/^(\d{8})/);return t?t[1]:""}import{readFileSync as V}from"fs";import{join as ee}from"path";var te=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],$,S=null;function W(){if($!==void 0)return $;$=null;try{let e=V(ee(process.cwd(),".toolkitrc.json"),"utf8");$=JSON.parse(e).redact??null}catch{}return $}function ne(){if(S)return S;let e=W(),n=new Set(e?.disable??[]),t=[];for(let r of e?.rules??[])try{t.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return S=[...t,...te.filter(r=>!n.has(r.name))],S}function k(e,n){if(!n||!e)return e;let t=e;for(let r of ne())t=t.replace(r.pattern,r.replacement);return t}function Z(e){return!(e.includes("--no-redact")||process.env.FX_REDACT==="0"||W()?.enabled===!1)}function se(e=".tasks"){let n=oe(e,"active");return v(n).map(t=>{let r=re(t,"utf8"),o=b(r),a=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||O(t,".md");return{file:t,name:O(t,".md"),date:z(t),title:a,frontmatter:o,body:x(r).trim()}})}function N(e=".tasks",n=!0){let t=se(e);if(t.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let s of t){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
3
|
+
`);let a=0;for(let s of r){let l=o[s]||[];if(l.length!==0){a+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let i of l)console.log(` ${i.date} ${(i.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${k(i.title,n)}`);console.log("")}}console.log(`\u5171 ${a} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as B,writeFileSync as ae,mkdirSync as ie,unlinkSync as ce,existsSync as le,readdirSync as me,rmdirSync as pe}from"fs";import{join as T,basename as R,dirname as G,resolve as U,sep as ge}from"path";var M=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function de(e,n){let t=U(e),r=U(n);for(;t!==r&&t.startsWith(r+ge);){try{if(me(t).length>0)break;pe(t)}catch{break}t=G(t)}}function I(e){let n=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:e}function fe(e){let n=B(e,"utf8"),t=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)t.push({block:o[0].trim(),completed:o[2].trim()});return t}function P(e=".tasks",n=!0){let t=T(e,"active"),r=T(e,"archive"),o=v(t);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let a=[],s=[];for(let i of o){let p=B(i,"utf8"),g=b(p);if(!M.includes(g.status))continue;let d=I(g.completed||"");if(!d){s.push(R(i,".md")),console.log(`\u8DF3\u8FC7 ${R(i,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}a.push({file:i,name:R(i,".md"),owner:g.owner||"\u672A\u6807\u6CE8",status:g.status||"\u672A\u6807\u6CE8",scope:g.scope||"-",completed:d,body:x(p).trim()})}if(a.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let i of a){let p=i.completed.replace(/-/g,"").slice(0,8);(l[p]||=[]).push(i)}for(let[i,p]of Object.entries(l)){let g=T(r,i.slice(0,6));ie(g,{recursive:!0});let d=T(g,`${i}.md`),m=le(d)?fe(d):[];m.push(...p.map(c=>({block:`## ${c.name}
|
|
4
4
|
|
|
5
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
5
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${c.owner}\u3000\u72B6\u6001\uFF1A${c.status}\u3000\u8303\u56F4\uFF1A${c.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${c.completed}
|
|
6
6
|
|
|
7
|
-
${
|
|
7
|
+
${k(c.body,n)}`,completed:c.completed})));for(let c of m)c.completed=I(c.completed);m.sort((c,E)=>E.completed.localeCompare(c.completed)),ae(d,`# ${i} \u5F52\u6863
|
|
8
8
|
|
|
9
9
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
10
10
|
|
|
11
|
-
${
|
|
11
|
+
${m.map(c=>c.block).join(`
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
`)}
|
|
16
|
-
`,"utf8");for(let
|
|
16
|
+
`,"utf8");for(let c of p)ce(c.file);de(G(p[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${p.length} \u4E2A\u4EFB\u52A1 \u2192 ${i}.md`)}return console.log(`\u5171\u5F52\u6863 ${a.length} \u4E2A\u4EFB\u52A1`),{archived:a.length,skipped:s}}var y={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},A="zh";import{readFileSync as he,writeFileSync as ke}from"fs";import{readdirSync as ue}from"fs";import{join as J}from"path";function H(e){let n=[],t=new Set(["node_modules",".git","dist"]),r=o=>{let a;try{a=ue(o,{withFileTypes:!0})}catch{return}for(let s of a)if(s.isDirectory()){if(t.has(s.name))continue;r(J(o,s.name))}else s.name==="CHANGELOG.md"&&n.push(J(o,s.name))};return r(e),n}function F(){let e=new Date,n=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function $e(e,n,t,r=!0){let o=he(e,"utf8"),a=o.includes(`\r
|
|
17
17
|
`)?`\r
|
|
18
18
|
`:`
|
|
19
|
-
`,
|
|
20
|
-
`);for(let[c
|
|
21
|
-
${
|
|
22
|
-
${
|
|
23
|
-
`),
|
|
24
|
-
`);return
|
|
19
|
+
`,s=o.replace(/\r\n/g,`
|
|
20
|
+
`),l=s;for(let[m,c]of Object.entries(t.replacements))l=l.replaceAll(m,c);for(;l.includes(`${t.deps}
|
|
21
|
+
${t.deps}`);)l=l.replace(`${t.deps}
|
|
22
|
+
${t.deps}`,t.deps);for(;;){let m=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===l)break;l=m}let i=l.split(`
|
|
23
|
+
`),p=[];for(let m=0;m<i.length;m++)if(p.push(i[m]),/^## \d+\.\d+\.\d+/.test(i[m])){let c=m+1;for(;c<i.length&&i[c].trim()==="";)c++;i[c]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(i[c].trim())||p.push(`> ${n} ${t.released}`)}let g=p.join(`
|
|
24
|
+
`),d=k(g,r);return d!==s?(ke(e,d.replace(/\n/g,a),"utf8"),!0):!1}function w(e,n,t,r=!0){let o=[];for(let a of H(e))$e(a,n,t,r)&&o.push(a);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let a of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${a}`);return o}var xe=ye(import.meta.url),ve=xe.resolve("@changesets/cli/bin.js"),D=e=>{let n=be(process.execPath,[ve,...e],{stdio:"inherit"});n.status!==0&&process.exit(n.status??1)},j=process.argv.slice(2),q=j[0],h=j.slice(1),C=Z(j);if(q==="tasks"){let e=h.indexOf("--dir"),n=e>=0&&h[e+1]?h[e+1]:".tasks";(h.find(r=>!r.startsWith("--")&&r!==n)||"list")==="archive"?P(n,C):N(n,C)}else if(q==="changelog"){let e=h.indexOf("--lang"),n=e>=0&&h[e+1]?h[e+1]:A,t=(e>=0?h.filter((o,a)=>a!==e&&a!==e+1):h).filter(o=>o!=="--no-redact"),r=t[0];r==="version"?(D(["version"]),w(".",F(),y[n]??y[A],C)):r==="format"?w(".",F(),y[n]??y[A],C):D(r?t:[])}else console.log("\u7528\u6CD5\uFF1Atoolkit <tasks|changelog> ..."),console.log(" toolkit tasks \u4EFB\u52A1\u603B\u89C8"),console.log(" toolkit tasks archive \u5F52\u6863\u5DF2\u5B8C\u6210\u4EFB\u52A1"),console.log(" toolkit changelog \u521B\u5EFA\u53D8\u66F4\u96C6"),console.log(" toolkit changelog version \u53D1\u7248 + \u591A\u8BED\u8A00\u683C\u5F0F\u5316"),console.log(" toolkit changelog format \u7EAF\u683C\u5F0F\u5316");
|
package/dist/index.cjs
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
var
|
|
2
|
-
`);let
|
|
1
|
+
var w=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var X=(e,n)=>{for(var t in n)w(e,t,{get:n[t],enumerable:!0})},K=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of P(n))!H.call(e,o)&&o!==t&&w(e,o,{get:()=>n[o],enumerable:!(r=J(n,o))||r.enumerable});return e};var Y=e=>K(w({},"__esModule",{value:!0}),e);var re={};X(re,{DEFAULT_LANG:()=>ne,DONE_STATUSES:()=>D,archiveTasks:()=>U,collectChangelogs:()=>v,dateFromFileName:()=>C,formatChangelog:()=>L,formatChangelogs:()=>I,languages:()=>te,listTaskFiles:()=>T,listTasks:()=>j,localDate:()=>G,parseArchiveTasks:()=>z,parseFrontmatter:()=>y,printTasks:()=>M,redactText:()=>k,stripFrontmatter:()=>b});module.exports=Y(re);var D=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function y(e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let t={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let c=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),c&&(t[c]=s)}return t}function b(e){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?e.slice(n[0].length):e}var $=require("fs"),x=require("path");function T(e){if(!(0,$.existsSync)(e))return[];let n=[];for(let t of(0,$.readdirSync)(e)){let r=(0,x.join)(e,t);if((0,$.statSync)(r).isDirectory())for(let o of(0,$.readdirSync)(r))o.endsWith(".md")&&n.push((0,x.join)(r,o));else t.endsWith(".md")&&n.push(r)}return n}function C(e){let t=(0,x.basename)(e,(0,x.extname)(e)).match(/^(\d{8})/);return t?t[1]:""}var N=require("fs"),A=require("path");var W=require("fs"),Z=require("path"),q=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],S,F=null;function Q(){if(S!==void 0)return S;S=null;try{let e=(0,W.readFileSync)((0,Z.join)(process.cwd(),".toolkitrc.json"),"utf8");S=JSON.parse(e).redact??null}catch{}return S}function V(){if(F)return F;let e=Q(),n=new Set(e?.disable??[]),t=[];for(let r of e?.rules??[])try{t.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return F=[...t,...q.filter(r=>!n.has(r.name))],F}function k(e,n){if(!n||!e)return e;let t=e;for(let r of V())t=t.replace(r.pattern,r.replacement);return t}function j(e=".tasks"){let n=(0,A.join)(e,"active");return T(n).map(t=>{let r=(0,N.readFileSync)(t,"utf8"),o=y(r),c=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||(0,A.basename)(t,".md");return{file:t,name:(0,A.basename)(t,".md"),date:C(t),title:c,frontmatter:o,body:b(r).trim()}})}function M(e=".tasks",n=!0){let t=j(e);if(t.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let s of t){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
2
|
+
`);let c=0;for(let s of r){let l=o[s]||[];if(l.length!==0){c+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let a of l)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${k(a.title,n)}`);console.log("")}}console.log(`\u5171 ${c} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var d=require("fs"),p=require("path");function ee(e,n){let t=(0,p.resolve)(e),r=(0,p.resolve)(n);for(;t!==r&&t.startsWith(r+p.sep);){try{if((0,d.readdirSync)(t).length>0)break;(0,d.rmdirSync)(t)}catch{break}t=(0,p.dirname)(t)}}function O(e){let n=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:e}function z(e){let n=(0,d.readFileSync)(e,"utf8"),t=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)t.push({block:o[0].trim(),completed:o[2].trim()});return t}function U(e=".tasks",n=!0){let t=(0,p.join)(e,"active"),r=(0,p.join)(e,"archive"),o=T(t);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let c=[],s=[];for(let a of o){let g=(0,d.readFileSync)(a,"utf8"),f=y(g);if(!D.includes(f.status))continue;let u=O(f.completed||"");if(!u){s.push((0,p.basename)(a,".md")),console.log(`\u8DF3\u8FC7 ${(0,p.basename)(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:a,name:(0,p.basename)(a,".md"),owner:f.owner||"\u672A\u6807\u6CE8",status:f.status||"\u672A\u6807\u6CE8",scope:f.scope||"-",completed:u,body:b(g).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let a of c){let g=a.completed.replace(/-/g,"").slice(0,8);(l[g]||=[]).push(a)}for(let[a,g]of Object.entries(l)){let f=(0,p.join)(r,a.slice(0,6));(0,d.mkdirSync)(f,{recursive:!0});let u=(0,p.join)(f,`${a}.md`),m=(0,d.existsSync)(u)?z(u):[];m.push(...g.map(i=>({block:`## ${i.name}
|
|
3
3
|
|
|
4
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
4
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${i.owner}\u3000\u72B6\u6001\uFF1A${i.status}\u3000\u8303\u56F4\uFF1A${i.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${i.completed}
|
|
5
5
|
|
|
6
|
-
${
|
|
6
|
+
${k(i.body,n)}`,completed:i.completed})));for(let i of m)i.completed=O(i.completed);m.sort((i,_)=>_.completed.localeCompare(i.completed)),(0,d.writeFileSync)(u,`# ${a} \u5F52\u6863
|
|
7
7
|
|
|
8
8
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
9
9
|
|
|
10
|
-
${
|
|
10
|
+
${m.map(i=>i.block).join(`
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
`)}
|
|
15
|
-
`,"utf8");for(let
|
|
15
|
+
`,"utf8");for(let i of g)(0,d.unlinkSync)(i.file);ee((0,p.dirname)(g[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:s}}var te={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},ne="zh";var B=require("fs"),E=require("path");function v(e){let n=[],t=new Set(["node_modules",".git","dist"]),r=o=>{let c;try{c=(0,B.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let s of c)if(s.isDirectory()){if(t.has(s.name))continue;r((0,E.join)(o,s.name))}else s.name==="CHANGELOG.md"&&n.push((0,E.join)(o,s.name))};return r(e),n}var R=require("fs");function G(){let e=new Date,n=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function L(e,n,t,r=!0){let o=(0,R.readFileSync)(e,"utf8"),c=o.includes(`\r
|
|
16
16
|
`)?`\r
|
|
17
17
|
`:`
|
|
18
|
-
`,
|
|
19
|
-
`);for(let[
|
|
20
|
-
${t.deps}`);)
|
|
21
|
-
${t.deps}`,t.deps);for(;;){let
|
|
22
|
-
`),
|
|
23
|
-
`);return
|
|
18
|
+
`,s=o.replace(/\r\n/g,`
|
|
19
|
+
`),l=s;for(let[m,i]of Object.entries(t.replacements))l=l.replaceAll(m,i);for(;l.includes(`${t.deps}
|
|
20
|
+
${t.deps}`);)l=l.replace(`${t.deps}
|
|
21
|
+
${t.deps}`,t.deps);for(;;){let m=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===l)break;l=m}let a=l.split(`
|
|
22
|
+
`),g=[];for(let m=0;m<a.length;m++)if(g.push(a[m]),/^## \d+\.\d+\.\d+/.test(a[m])){let i=m+1;for(;i<a.length&&a[i].trim()==="";)i++;a[i]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(a[i].trim())||g.push(`> ${n} ${t.released}`)}let f=g.join(`
|
|
23
|
+
`),u=k(f,r);return u!==s?((0,R.writeFileSync)(e,u.replace(/\n/g,c),"utf8"),!0):!1}function I(e,n,t,r=!0){let o=[];for(let c of v(e))L(c,n,t,r)&&o.push(c);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let c of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${c}`);return o}0&&(module.exports={DEFAULT_LANG,DONE_STATUSES,archiveTasks,collectChangelogs,dateFromFileName,formatChangelog,formatChangelogs,languages,listTaskFiles,listTasks,localDate,parseArchiveTasks,parseFrontmatter,printTasks,redactText,stripFrontmatter});
|
package/dist/index.d.cts
CHANGED
|
@@ -33,10 +33,10 @@ declare function listTaskFiles(dir: string): string[];
|
|
|
33
33
|
declare function dateFromFileName(file: string): string;
|
|
34
34
|
|
|
35
35
|
declare function listTasks(tasksDir?: string): Task[];
|
|
36
|
-
declare function printTasks(tasksDir?: string): void;
|
|
36
|
+
declare function printTasks(tasksDir?: string, redact?: boolean): void;
|
|
37
37
|
|
|
38
38
|
declare function parseArchiveTasks(file: string): ArchiveBlock[];
|
|
39
|
-
declare function archiveTasks(tasksDir?: string): ArchiveResult;
|
|
39
|
+
declare function archiveTasks(tasksDir?: string, redact?: boolean): ArchiveResult;
|
|
40
40
|
|
|
41
41
|
type LanguageMap = Record<string, string>;
|
|
42
42
|
interface ChangelogLanguage {
|
|
@@ -50,7 +50,9 @@ declare const DEFAULT_LANG = "zh";
|
|
|
50
50
|
declare function collectChangelogs(dir: string): string[];
|
|
51
51
|
|
|
52
52
|
declare function localDate(): string;
|
|
53
|
-
declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage): boolean;
|
|
54
|
-
declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage): string[];
|
|
53
|
+
declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage, redact?: boolean): boolean;
|
|
54
|
+
declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage, redact?: boolean): string[];
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
declare function redactText(text: string, enabled: boolean): string;
|
|
57
|
+
|
|
58
|
+
export { type ArchiveBlock, type ArchiveResult, type ChangelogLanguage, DEFAULT_LANG, DONE_STATUSES, type LanguageMap, type Task, type TaskFrontmatter, type TaskStatus, archiveTasks, collectChangelogs, dateFromFileName, formatChangelog, formatChangelogs, languages, listTaskFiles, listTasks, localDate, parseArchiveTasks, parseFrontmatter, printTasks, redactText, stripFrontmatter };
|
package/dist/index.d.ts
CHANGED
|
@@ -33,10 +33,10 @@ declare function listTaskFiles(dir: string): string[];
|
|
|
33
33
|
declare function dateFromFileName(file: string): string;
|
|
34
34
|
|
|
35
35
|
declare function listTasks(tasksDir?: string): Task[];
|
|
36
|
-
declare function printTasks(tasksDir?: string): void;
|
|
36
|
+
declare function printTasks(tasksDir?: string, redact?: boolean): void;
|
|
37
37
|
|
|
38
38
|
declare function parseArchiveTasks(file: string): ArchiveBlock[];
|
|
39
|
-
declare function archiveTasks(tasksDir?: string): ArchiveResult;
|
|
39
|
+
declare function archiveTasks(tasksDir?: string, redact?: boolean): ArchiveResult;
|
|
40
40
|
|
|
41
41
|
type LanguageMap = Record<string, string>;
|
|
42
42
|
interface ChangelogLanguage {
|
|
@@ -50,7 +50,9 @@ declare const DEFAULT_LANG = "zh";
|
|
|
50
50
|
declare function collectChangelogs(dir: string): string[];
|
|
51
51
|
|
|
52
52
|
declare function localDate(): string;
|
|
53
|
-
declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage): boolean;
|
|
54
|
-
declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage): string[];
|
|
53
|
+
declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage, redact?: boolean): boolean;
|
|
54
|
+
declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage, redact?: boolean): string[];
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
declare function redactText(text: string, enabled: boolean): string;
|
|
57
|
+
|
|
58
|
+
export { type ArchiveBlock, type ArchiveResult, type ChangelogLanguage, DEFAULT_LANG, DONE_STATUSES, type LanguageMap, type Task, type TaskFrontmatter, type TaskStatus, archiveTasks, collectChangelogs, dateFromFileName, formatChangelog, formatChangelogs, languages, listTaskFiles, listTasks, localDate, parseArchiveTasks, parseFrontmatter, printTasks, redactText, stripFrontmatter };
|
package/dist/index.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
var
|
|
2
|
-
`);let
|
|
1
|
+
var v=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function k(t){let n=t.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let e={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let c=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),c&&(e[c]=s)}return e}function $(t){let n=t.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?t.slice(n[0].length):t}import{existsSync as M,readdirSync as R,statSync as O}from"fs";import{join as w,basename as U,extname as B}from"path";function x(t){if(!M(t))return[];let n=[];for(let e of R(t)){let r=w(t,e);if(O(r).isDirectory())for(let o of R(r))o.endsWith(".md")&&n.push(w(r,o));else e.endsWith(".md")&&n.push(r)}return n}function S(t){let e=U(t,B(t)).match(/^(\d{8})/);return e?e[1]:""}import{readFileSync as X}from"fs";import{join as K,basename as D}from"path";import{readFileSync as G}from"fs";import{join as I}from"path";var J=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],y,b=null;function P(){if(y!==void 0)return y;y=null;try{let t=G(I(process.cwd(),".toolkitrc.json"),"utf8");y=JSON.parse(t).redact??null}catch{}return y}function H(){if(b)return b;let t=P(),n=new Set(t?.disable??[]),e=[];for(let r of t?.rules??[])try{e.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return b=[...e,...J.filter(r=>!n.has(r.name))],b}function h(t,n){if(!n||!t)return t;let e=t;for(let r of H())e=e.replace(r.pattern,r.replacement);return e}function j(t=".tasks"){let n=K(t,"active");return x(n).map(e=>{let r=X(e,"utf8"),o=k(r),c=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||D(e,".md");return{file:e,name:D(e,".md"),date:S(e),title:c,frontmatter:o,body:$(r).trim()}})}function Y(t=".tasks",n=!0){let e=j(t);if(e.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let s of e){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
2
|
+
`);let c=0;for(let s of r){let l=o[s]||[];if(l.length!==0){c+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let a of l)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${h(a.title,n)}`);console.log("")}}console.log(`\u5171 ${c} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as L,writeFileSync as q,mkdirSync as Q,unlinkSync as V,existsSync as ee,readdirSync as te,rmdirSync as ne}from"fs";import{join as T,basename as A,dirname as _,resolve as z,sep as re}from"path";function oe(t,n){let e=z(t),r=z(n);for(;e!==r&&e.startsWith(r+re);){try{if(te(e).length>0)break;ne(e)}catch{break}e=_(e)}}function E(t){let n=t.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:t}function W(t){let n=L(t,"utf8"),e=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)e.push({block:o[0].trim(),completed:o[2].trim()});return e}function se(t=".tasks",n=!0){let e=T(t,"active"),r=T(t,"archive"),o=x(e);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let c=[],s=[];for(let a of o){let m=L(a,"utf8"),d=k(m);if(!v.includes(d.status))continue;let g=E(d.completed||"");if(!g){s.push(A(a,".md")),console.log(`\u8DF3\u8FC7 ${A(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:a,name:A(a,".md"),owner:d.owner||"\u672A\u6807\u6CE8",status:d.status||"\u672A\u6807\u6CE8",scope:d.scope||"-",completed:g,body:$(m).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let a of c){let m=a.completed.replace(/-/g,"").slice(0,8);(l[m]||=[]).push(a)}for(let[a,m]of Object.entries(l)){let d=T(r,a.slice(0,6));Q(d,{recursive:!0});let g=T(d,`${a}.md`),p=ee(g)?W(g):[];p.push(...m.map(i=>({block:`## ${i.name}
|
|
3
3
|
|
|
4
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
4
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${i.owner}\u3000\u72B6\u6001\uFF1A${i.status}\u3000\u8303\u56F4\uFF1A${i.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${i.completed}
|
|
5
5
|
|
|
6
|
-
${
|
|
6
|
+
${h(i.body,n)}`,completed:i.completed})));for(let i of p)i.completed=E(i.completed);p.sort((i,F)=>F.completed.localeCompare(i.completed)),q(g,`# ${a} \u5F52\u6863
|
|
7
7
|
|
|
8
8
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
9
9
|
|
|
10
|
-
${
|
|
10
|
+
${p.map(i=>i.block).join(`
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
`)}
|
|
15
|
-
`,"utf8");for(let
|
|
15
|
+
`,"utf8");for(let i of m)V(i.file);oe(_(m[0].file),t),console.log(`\u5DF2\u5F52\u6863 ${m.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:s}}var Ne={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},Me="zh";import{readdirSync as ae}from"fs";import{join as Z}from"path";function C(t){let n=[],e=new Set(["node_modules",".git","dist"]),r=o=>{let c;try{c=ae(o,{withFileTypes:!0})}catch{return}for(let s of c)if(s.isDirectory()){if(e.has(s.name))continue;r(Z(o,s.name))}else s.name==="CHANGELOG.md"&&n.push(Z(o,s.name))};return r(t),n}import{readFileSync as ie,writeFileSync as ce}from"fs";function le(){let t=new Date,n=e=>String(e).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`}function N(t,n,e,r=!0){let o=ie(t,"utf8"),c=o.includes(`\r
|
|
16
16
|
`)?`\r
|
|
17
17
|
`:`
|
|
18
|
-
`,
|
|
19
|
-
`);for(let[
|
|
20
|
-
${
|
|
21
|
-
${
|
|
22
|
-
`),
|
|
23
|
-
`);return
|
|
18
|
+
`,s=o.replace(/\r\n/g,`
|
|
19
|
+
`),l=s;for(let[p,i]of Object.entries(e.replacements))l=l.replaceAll(p,i);for(;l.includes(`${e.deps}
|
|
20
|
+
${e.deps}`);)l=l.replace(`${e.deps}
|
|
21
|
+
${e.deps}`,e.deps);for(;;){let p=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(p===l)break;l=p}let a=l.split(`
|
|
22
|
+
`),m=[];for(let p=0;p<a.length;p++)if(m.push(a[p]),/^## \d+\.\d+\.\d+/.test(a[p])){let i=p+1;for(;i<a.length&&a[i].trim()==="";)i++;a[i]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(a[i].trim())||m.push(`> ${n} ${e.released}`)}let d=m.join(`
|
|
23
|
+
`),g=h(d,r);return g!==s?(ce(t,g.replace(/\n/g,c),"utf8"),!0):!1}function pe(t,n,e,r=!0){let o=[];for(let c of C(t))N(c,n,e,r)&&o.push(c);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let c of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${c}`);return o}export{Me as DEFAULT_LANG,v as DONE_STATUSES,se as archiveTasks,C as collectChangelogs,S as dateFromFileName,N as formatChangelog,pe as formatChangelogs,Ne as languages,x as listTaskFiles,j as listTasks,le as localDate,W as parseArchiveTasks,k as parseFrontmatter,Y as printTasks,h as redactText,$ as stripFrontmatter};
|