@webywz/breathing-github-profile 1.0.0 → 1.0.2
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/README.md +16 -24
- package/dist/cli.js +32 -31
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- package/dist/config.js.map +1 -1
- package/dist/generator.js +4 -4
- package/dist/generator.js.map +1 -1
- package/dist/github.d.ts +4 -0
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +11 -2
- package/dist/github.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +20 -0
- package/dist/version.js.map +1 -0
- package/examples/README.md +23 -1
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -7,10 +7,7 @@
|
|
|
7
7
|
[](https://github.com/webywz/breathing-github-profile/actions/workflows/test.yml)
|
|
8
8
|
[](./LICENSE)
|
|
9
9
|
|
|
10
|
-
Package: `@webywz/breathing-github-profile` · CLI binary: `breathing-profile` · Node 18+
|
|
11
|
-
|
|
12
|
-
> Not on the npm registry yet. Install from GitHub until the first publish.
|
|
13
|
-
> 尚未发布到 npm,请先从 GitHub 安装。
|
|
10
|
+
Package: `@webywz/breathing-github-profile` · CLI binary: `breathing-profile` · Node.js 18.18+
|
|
14
11
|
|
|
15
12
|
---
|
|
16
13
|
|
|
@@ -32,30 +29,25 @@ Live example: [webywz/webywz](https://github.com/webywz/webywz).
|
|
|
32
29
|
## Install · 安装
|
|
33
30
|
|
|
34
31
|
```bash
|
|
35
|
-
npm
|
|
32
|
+
npm i -g @webywz/breathing-github-profile
|
|
36
33
|
npx breathing-profile --help
|
|
34
|
+
# or without a global install:
|
|
35
|
+
npx @webywz/breathing-github-profile --help
|
|
37
36
|
```
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
git clone https://github.com/webywz/breathing-github-profile.git
|
|
43
|
-
cd breathing-github-profile
|
|
44
|
-
npm install
|
|
45
|
-
npm run build
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
One-shot without a local clone:
|
|
38
|
+
One-shot without installing globally:
|
|
49
39
|
|
|
50
40
|
```bash
|
|
51
|
-
npx --yes
|
|
41
|
+
npx --yes @webywz/breathing-github-profile generate -c config.yml -o README.md
|
|
52
42
|
```
|
|
53
43
|
|
|
54
|
-
|
|
44
|
+
From source (develop):
|
|
55
45
|
|
|
56
46
|
```bash
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
git clone https://github.com/webywz/breathing-github-profile.git
|
|
48
|
+
cd breathing-github-profile
|
|
49
|
+
npm install
|
|
50
|
+
npm run build
|
|
59
51
|
```
|
|
60
52
|
|
|
61
53
|
---
|
|
@@ -110,7 +102,7 @@ npx breathing-profile validate -c config.yml
|
|
|
110
102
|
| `refresh` | Rewrite marker sections only | 只刷新标记区 |
|
|
111
103
|
| `validate` | Check the config file | 校验配置 |
|
|
112
104
|
|
|
113
|
-
Optional: set `GITHUB_TOKEN` (or use `secrets.GITHUB_TOKEN` in Actions) for higher API rate limits.
|
|
105
|
+
Optional: set `GITHUB_TOKEN` or `GH_TOKEN` (or use `secrets.GITHUB_TOKEN` in Actions) for higher API rate limits.
|
|
114
106
|
|
|
115
107
|
---
|
|
116
108
|
|
|
@@ -121,7 +113,7 @@ Optional: set `GITHUB_TOKEN` (or use `secrets.GITHUB_TOKEN` in Actions) for high
|
|
|
121
113
|
| Field | Type | Required | Notes |
|
|
122
114
|
| --- | --- | --- | --- |
|
|
123
115
|
| `username` | string | yes | GitHub login |
|
|
124
|
-
| `intro.zh` / `intro.en` | string | one of zh/en |
|
|
116
|
+
| `intro.zh` / `intro.en` | string | one of zh/en (non-empty) | zh-only, en-only, or both · 仅中文 / 仅英文 / 双语均可 |
|
|
125
117
|
| `featuredRepos` | string[] | no | Pinned repo names |
|
|
126
118
|
| `sections` | Section[] | no | Ordered sections |
|
|
127
119
|
| `style` | StyleConfig | no | Theme / layout knobs |
|
|
@@ -198,7 +190,7 @@ jobs:
|
|
|
198
190
|
- uses: actions/setup-node@v4
|
|
199
191
|
with:
|
|
200
192
|
node-version: '20'
|
|
201
|
-
- run: npm
|
|
193
|
+
- run: npm i @webywz/breathing-github-profile@1.0.2
|
|
202
194
|
- name: Refresh README
|
|
203
195
|
env:
|
|
204
196
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -228,7 +220,7 @@ import {
|
|
|
228
220
|
} from '@webywz/breathing-github-profile';
|
|
229
221
|
|
|
230
222
|
const config = loadConfig('config.yml');
|
|
231
|
-
const client = new GitHubClient(process.env.GITHUB_TOKEN);
|
|
223
|
+
const client = new GitHubClient(process.env.GITHUB_TOKEN || process.env.GH_TOKEN);
|
|
232
224
|
const data = await client.getProfileData(config.username);
|
|
233
225
|
const readme = new ReadmeGenerator(config, data).generate();
|
|
234
226
|
```
|
|
@@ -266,7 +258,7 @@ examples/ sample configs
|
|
|
266
258
|
|
|
267
259
|
## FAQ · 常见问题
|
|
268
260
|
|
|
269
|
-
**Rate limits?** Set `GITHUB_TOKEN`. Actions already injects `secrets.GITHUB_TOKEN`.
|
|
261
|
+
**Rate limits?** Set `GITHUB_TOKEN` or `GH_TOKEN`. Actions already injects `secrets.GITHUB_TOKEN`.
|
|
270
262
|
|
|
271
263
|
**Only update part of the README?** Use `refresh`, not `generate`.
|
|
272
264
|
|
package/dist/cli.js
CHANGED
|
@@ -12,27 +12,28 @@ const path_1 = require("path");
|
|
|
12
12
|
const config_1 = require("./config");
|
|
13
13
|
const github_1 = require("./github");
|
|
14
14
|
const generator_1 = require("./generator");
|
|
15
|
+
const version_1 = require("./version");
|
|
15
16
|
const program = new commander_1.Command();
|
|
16
17
|
program
|
|
17
18
|
.name('breathing-profile')
|
|
18
|
-
.description('
|
|
19
|
-
.version(
|
|
19
|
+
.description('Living GitHub profile README generator · 会呼吸的 GitHub profile README 生成器')
|
|
20
|
+
.version((0, version_1.readPackageVersion)());
|
|
20
21
|
program
|
|
21
22
|
.command('generate')
|
|
22
|
-
.description('
|
|
23
|
-
.option('-c, --config <path>', '配置文件路径', 'config.yml')
|
|
24
|
-
.option('-o, --output <path>', '输出文件路径', 'README.md')
|
|
23
|
+
.description('Generate a full README · 生成完整 README.md')
|
|
24
|
+
.option('-c, --config <path>', 'Config path · 配置文件路径', 'config.yml')
|
|
25
|
+
.option('-o, --output <path>', 'Output path · 输出文件路径', 'README.md')
|
|
25
26
|
.action(async (options) => {
|
|
26
|
-
const spinner = (0, ora_1.default)('正在生成 README...').start();
|
|
27
|
+
const spinner = (0, ora_1.default)('Generating README… · 正在生成 README...').start();
|
|
27
28
|
try {
|
|
28
29
|
if (!(0, fs_1.existsSync)(options.config)) {
|
|
29
|
-
throw new Error(
|
|
30
|
+
throw new Error(`Config not found / 配置文件不存在: ${options.config}`);
|
|
30
31
|
}
|
|
31
32
|
const config = (0, config_1.loadConfig)(options.config);
|
|
32
33
|
const client = new github_1.GitHubClient();
|
|
33
|
-
spinner.text =
|
|
34
|
+
spinner.text = `Fetching GitHub data for ${config.username}… · 正在获取数据...`;
|
|
34
35
|
const data = await client.getProfileData(config.username);
|
|
35
|
-
spinner.text = '正在生成 README 内容...';
|
|
36
|
+
spinner.text = 'Writing README… · 正在生成 README 内容...';
|
|
36
37
|
const generator = new generator_1.ReadmeGenerator(config, data);
|
|
37
38
|
const readme = generator.generate();
|
|
38
39
|
(0, fs_1.writeFileSync)(options.output, readme, 'utf-8');
|
|
@@ -41,34 +42,34 @@ program
|
|
|
41
42
|
(0, fs_1.mkdirSync)(dataDir, { recursive: true });
|
|
42
43
|
}
|
|
43
44
|
(0, fs_1.writeFileSync)((0, path_1.join)(dataDir, 'profile.json'), JSON.stringify(data, null, 2), 'utf-8');
|
|
44
|
-
spinner.succeed(chalk_1.default.green(`✓ README 已生成: ${options.output}`));
|
|
45
|
-
console.log(chalk_1.default.gray(`
|
|
45
|
+
spinner.succeed(chalk_1.default.green(`✓ README written / 已生成: ${options.output}`));
|
|
46
|
+
console.log(chalk_1.default.gray(` Data saved / 数据已保存: ${(0, path_1.join)(dataDir, 'profile.json')}`));
|
|
46
47
|
}
|
|
47
48
|
catch (error) {
|
|
48
|
-
spinner.fail(chalk_1.default.red('生成失败'));
|
|
49
|
-
console.error(chalk_1.default.red(
|
|
49
|
+
spinner.fail(chalk_1.default.red('Generate failed / 生成失败'));
|
|
50
|
+
console.error(chalk_1.default.red(`Error / 错误: ${error.message}`));
|
|
50
51
|
process.exit(1);
|
|
51
52
|
}
|
|
52
53
|
});
|
|
53
54
|
program
|
|
54
55
|
.command('refresh')
|
|
55
|
-
.description('
|
|
56
|
-
.option('-c, --config <path>', '配置文件路径', 'config.yml')
|
|
57
|
-
.option('-r, --readme <path>', 'README 文件路径', 'README.md')
|
|
56
|
+
.description('Refresh marker sections only · 只刷新 README 标记部分')
|
|
57
|
+
.option('-c, --config <path>', 'Config path · 配置文件路径', 'config.yml')
|
|
58
|
+
.option('-r, --readme <path>', 'README path · README 文件路径', 'README.md')
|
|
58
59
|
.action(async (options) => {
|
|
59
|
-
const spinner = (0, ora_1.default)('正在刷新 README...').start();
|
|
60
|
+
const spinner = (0, ora_1.default)('Refreshing README… · 正在刷新 README...').start();
|
|
60
61
|
try {
|
|
61
62
|
if (!(0, fs_1.existsSync)(options.config)) {
|
|
62
|
-
throw new Error(
|
|
63
|
+
throw new Error(`Config not found / 配置文件不存在: ${options.config}`);
|
|
63
64
|
}
|
|
64
65
|
if (!(0, fs_1.existsSync)(options.readme)) {
|
|
65
|
-
throw new Error(`README 文件不存在: ${options.readme}`);
|
|
66
|
+
throw new Error(`README not found / README 文件不存在: ${options.readme}`);
|
|
66
67
|
}
|
|
67
68
|
const config = (0, config_1.loadConfig)(options.config);
|
|
68
69
|
const client = new github_1.GitHubClient();
|
|
69
|
-
spinner.text =
|
|
70
|
+
spinner.text = `Fetching GitHub data for ${config.username}… · 正在获取数据...`;
|
|
70
71
|
const data = await client.getProfileData(config.username);
|
|
71
|
-
spinner.text = '正在更新 README 标记部分...';
|
|
72
|
+
spinner.text = 'Updating markers… · 正在更新 README 标记部分...';
|
|
72
73
|
const existingReadme = (0, fs_1.readFileSync)(options.readme, 'utf-8');
|
|
73
74
|
const markerSections = (config.sections || []).map(section => {
|
|
74
75
|
const marker = section.marker || section.type.toUpperCase();
|
|
@@ -91,31 +92,31 @@ program
|
|
|
91
92
|
(0, fs_1.mkdirSync)(dataDir, { recursive: true });
|
|
92
93
|
}
|
|
93
94
|
(0, fs_1.writeFileSync)((0, path_1.join)(dataDir, 'profile.json'), JSON.stringify(data, null, 2), 'utf-8');
|
|
94
|
-
spinner.succeed(chalk_1.default.green(`✓ README 已刷新: ${options.readme}`));
|
|
95
|
-
console.log(chalk_1.default.gray(`
|
|
95
|
+
spinner.succeed(chalk_1.default.green(`✓ README refreshed / 已刷新: ${options.readme}`));
|
|
96
|
+
console.log(chalk_1.default.gray(` Data saved / 数据已保存: ${(0, path_1.join)(dataDir, 'profile.json')}`));
|
|
96
97
|
}
|
|
97
98
|
catch (error) {
|
|
98
|
-
spinner.fail(chalk_1.default.red('刷新失败'));
|
|
99
|
-
console.error(chalk_1.default.red(
|
|
99
|
+
spinner.fail(chalk_1.default.red('Refresh failed / 刷新失败'));
|
|
100
|
+
console.error(chalk_1.default.red(`Error / 错误: ${error.message}`));
|
|
100
101
|
process.exit(1);
|
|
101
102
|
}
|
|
102
103
|
});
|
|
103
104
|
program
|
|
104
105
|
.command('validate')
|
|
105
|
-
.description('验证配置文件')
|
|
106
|
-
.option('-c, --config <path>', '配置文件路径', 'config.yml')
|
|
106
|
+
.description('Validate config file · 验证配置文件')
|
|
107
|
+
.option('-c, --config <path>', 'Config path · 配置文件路径', 'config.yml')
|
|
107
108
|
.action(async (options) => {
|
|
108
109
|
try {
|
|
109
110
|
if (!(0, fs_1.existsSync)(options.config)) {
|
|
110
|
-
throw new Error(
|
|
111
|
+
throw new Error(`Config not found / 配置文件不存在: ${options.config}`);
|
|
111
112
|
}
|
|
112
113
|
const config = (0, config_1.loadConfig)(options.config);
|
|
113
|
-
console.log(chalk_1.default.green('✓ 配置文件有效'));
|
|
114
|
-
console.log(chalk_1.default.gray('\
|
|
114
|
+
console.log(chalk_1.default.green('✓ Config valid / 配置文件有效'));
|
|
115
|
+
console.log(chalk_1.default.gray('\nConfig / 配置内容:'));
|
|
115
116
|
console.log(JSON.stringify(config, null, 2));
|
|
116
117
|
}
|
|
117
118
|
catch (error) {
|
|
118
|
-
console.error(chalk_1.default.red(`✗
|
|
119
|
+
console.error(chalk_1.default.red(`✗ Invalid config / 配置无效: ${error.message}`));
|
|
119
120
|
process.exit(1);
|
|
120
121
|
}
|
|
121
122
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,2BAAwE;AACxE,+BAA4B;AAC5B,qCAAsC;AACtC,qCAAwC;AACxC,2CAAmE;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAc5D;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAc5D;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAkC1D;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAazD"}
|
package/dist/config.js
CHANGED
|
@@ -20,6 +20,9 @@ function loadConfig(configPath) {
|
|
|
20
20
|
validateConfig(config);
|
|
21
21
|
return config;
|
|
22
22
|
}
|
|
23
|
+
function hasIntroText(value) {
|
|
24
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
25
|
+
}
|
|
23
26
|
function validateConfig(config) {
|
|
24
27
|
if (!config.username || typeof config.username !== 'string') {
|
|
25
28
|
throw new Error('配置中必须包含有效的 username 字段');
|
|
@@ -27,8 +30,9 @@ function validateConfig(config) {
|
|
|
27
30
|
if (!config.intro || typeof config.intro !== 'object') {
|
|
28
31
|
throw new Error('配置中必须包含 intro 对象');
|
|
29
32
|
}
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
// Blank / whitespace-only strings count as missing; zh-only or en-only is OK.
|
|
34
|
+
if (!hasIntroText(config.intro.zh) && !hasIntroText(config.intro.en)) {
|
|
35
|
+
throw new Error('intro must include at least one non-empty zh or en / intro 必须至少包含非空的 zh 或 en 字段');
|
|
32
36
|
}
|
|
33
37
|
if (config.featuredRepos && !Array.isArray(config.featuredRepos)) {
|
|
34
38
|
throw new Error('featuredRepos 必须是数组');
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAIA,gCAcC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/generator.js
CHANGED
|
@@ -30,15 +30,15 @@ class ReadmeGenerator {
|
|
|
30
30
|
generateIntro() {
|
|
31
31
|
const { intro } = this.config;
|
|
32
32
|
const parts = [];
|
|
33
|
-
if (intro.zh) {
|
|
33
|
+
if (intro.zh?.trim()) {
|
|
34
34
|
parts.push(`## 👨💻 关于我
|
|
35
35
|
|
|
36
|
-
${intro.zh}`);
|
|
36
|
+
${intro.zh.trim()}`);
|
|
37
37
|
}
|
|
38
|
-
if (intro.en) {
|
|
38
|
+
if (intro.en?.trim()) {
|
|
39
39
|
parts.push(`## 👨💻 About Me
|
|
40
40
|
|
|
41
|
-
${intro.en}`);
|
|
41
|
+
${intro.en.trim()}`);
|
|
42
42
|
}
|
|
43
43
|
return parts.join('\n\n');
|
|
44
44
|
}
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;;AAoKA,kDAyBC;AA3LD,MAAa,eAAe;IAC1B,YACU,MAAqB,EACrB,IAAiB;QADjB,WAAM,GAAN,MAAM,CAAe;QACrB,SAAI,GAAJ,IAAI,CAAa;IACxB,CAAC;IAEJ,QAAQ;QACN,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC3C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAErC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAEO,cAAc;QACpB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,OAAO,mBAAmB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;;;cAGvC,IAAI,CAAC,UAAU,mCAAmC,IAAI,CAAC,KAAK;OACnE,CAAC;IACN,CAAC;IAEO,aAAa;QACnB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/github.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { GitHubUser, GitHubRepo, ProfileData } from './types';
|
|
2
|
+
/** Resolve token: explicit arg, then GITHUB_TOKEN, then GH_TOKEN. */
|
|
3
|
+
export declare function resolveGithubToken(explicit?: string): string | undefined;
|
|
2
4
|
export declare class GitHubClient {
|
|
3
5
|
private token?;
|
|
4
6
|
private baseUrl;
|
|
5
7
|
constructor(token?: string);
|
|
8
|
+
/** Exposed for tests / callers that need to know if auth is set. */
|
|
9
|
+
get authToken(): string | undefined;
|
|
6
10
|
private fetch;
|
|
7
11
|
getUser(username: string): Promise<GitHubUser>;
|
|
8
12
|
getRepos(username: string): Promise<GitHubRepo[]>;
|
package/dist/github.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9D,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAA4B;gBAE/B,KAAK,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9D,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExE;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAA4B;gBAE/B,KAAK,CAAC,EAAE,MAAM;IAI1B,oEAAoE;IACpE,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;YAEa,KAAK;IAmBb,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAqBjD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA4B7D"}
|
package/dist/github.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GitHubClient = void 0;
|
|
4
|
+
exports.resolveGithubToken = resolveGithubToken;
|
|
5
|
+
/** Resolve token: explicit arg, then GITHUB_TOKEN, then GH_TOKEN. */
|
|
6
|
+
function resolveGithubToken(explicit) {
|
|
7
|
+
return explicit || process.env.GITHUB_TOKEN || process.env.GH_TOKEN || undefined;
|
|
8
|
+
}
|
|
4
9
|
class GitHubClient {
|
|
5
10
|
constructor(token) {
|
|
6
11
|
this.baseUrl = 'https://api.github.com';
|
|
7
|
-
this.token = token
|
|
12
|
+
this.token = resolveGithubToken(token);
|
|
13
|
+
}
|
|
14
|
+
/** Exposed for tests / callers that need to know if auth is set. */
|
|
15
|
+
get authToken() {
|
|
16
|
+
return this.token;
|
|
8
17
|
}
|
|
9
18
|
async fetch(endpoint) {
|
|
10
19
|
const headers = {
|
|
@@ -16,7 +25,7 @@ class GitHubClient {
|
|
|
16
25
|
}
|
|
17
26
|
const response = await fetch(`${this.baseUrl}${endpoint}`, { headers });
|
|
18
27
|
if (!response.ok) {
|
|
19
|
-
throw new Error(`GitHub API
|
|
28
|
+
throw new Error(`GitHub API 错误 / GitHub API error: ${response.status} ${response.statusText}`);
|
|
20
29
|
}
|
|
21
30
|
return response.json();
|
|
22
31
|
}
|
package/dist/github.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { ProfileConfig, ProfileData, GitHubUser, GitHubRepo, Section, StyleConfig } from './types';
|
|
2
2
|
export { loadConfig, validateConfig, getDefaultConfig } from './config';
|
|
3
|
-
export { GitHubClient } from './github';
|
|
3
|
+
export { GitHubClient, resolveGithubToken } from './github';
|
|
4
4
|
export { ReadmeGenerator, updateReadmeMarkers } from './generator';
|
|
5
|
+
export { readPackageVersion } from './version';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.updateReadmeMarkers = exports.ReadmeGenerator = exports.GitHubClient = exports.getDefaultConfig = exports.validateConfig = exports.loadConfig = void 0;
|
|
3
|
+
exports.readPackageVersion = exports.updateReadmeMarkers = exports.ReadmeGenerator = exports.resolveGithubToken = exports.GitHubClient = exports.getDefaultConfig = exports.validateConfig = exports.loadConfig = void 0;
|
|
4
4
|
var config_1 = require("./config");
|
|
5
5
|
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
|
|
6
6
|
Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return config_1.validateConfig; } });
|
|
7
7
|
Object.defineProperty(exports, "getDefaultConfig", { enumerable: true, get: function () { return config_1.getDefaultConfig; } });
|
|
8
8
|
var github_1 = require("./github");
|
|
9
9
|
Object.defineProperty(exports, "GitHubClient", { enumerable: true, get: function () { return github_1.GitHubClient; } });
|
|
10
|
+
Object.defineProperty(exports, "resolveGithubToken", { enumerable: true, get: function () { return github_1.resolveGithubToken; } });
|
|
10
11
|
var generator_1 = require("./generator");
|
|
11
12
|
Object.defineProperty(exports, "ReadmeGenerator", { enumerable: true, get: function () { return generator_1.ReadmeGenerator; } });
|
|
12
13
|
Object.defineProperty(exports, "updateReadmeMarkers", { enumerable: true, get: function () { return generator_1.updateReadmeMarkers; } });
|
|
14
|
+
var version_1 = require("./version");
|
|
15
|
+
Object.defineProperty(exports, "readPackageVersion", { enumerable: true, get: function () { return version_1.readPackageVersion; } });
|
|
13
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,mCAAwE;AAA/D,oGAAA,UAAU,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AACrD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,mCAAwE;AAA/D,oGAAA,UAAU,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AACrD,mCAA4D;AAAnD,sGAAA,YAAY,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AACzC,yCAAmE;AAA1D,4GAAA,eAAe,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAC7C,qCAA+C;AAAtC,6GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAGA,gGAAgG;AAChG,wBAAgB,kBAAkB,IAAI,MAAM,CAW3C"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readPackageVersion = readPackageVersion;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
/** Read version from package.json (works from src/ via tsx/jest and from dist/ after build). */
|
|
7
|
+
function readPackageVersion() {
|
|
8
|
+
try {
|
|
9
|
+
const pkgPath = (0, path_1.join)(__dirname, '..', 'package.json');
|
|
10
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, 'utf-8'));
|
|
11
|
+
if (typeof pkg.version === 'string' && pkg.version.length > 0) {
|
|
12
|
+
return pkg.version;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// fall through
|
|
17
|
+
}
|
|
18
|
+
return '0.0.0';
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;AAIA,gDAWC;AAfD,2BAAkC;AAClC,+BAA4B;AAE5B,gGAAgG;AAChG,SAAgB,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAyB,CAAC;QAC/E,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,OAAO,GAAG,CAAC,OAAO,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/examples/README.md
CHANGED
|
@@ -97,10 +97,32 @@ npm run refresh -- -c examples/webywz.yml -r examples/demo.md
|
|
|
97
97
|

|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
+
#### custom · contrib-aquarium embed
|
|
101
|
+
|
|
102
|
+
`custom` 也可嵌入外部 SVG。用 [contrib-aquarium](https://github.com/webywz/contrib-aquarium) 生成鱼缸,再用 `--width` 写入展示宽(viewBox 固定等比,鱼不会被压扁):
|
|
103
|
+
|
|
104
|
+
A `custom` section can also embed an external SVG. Generate a tank with [contrib-aquarium](https://github.com/webywz/contrib-aquarium), pass `--width` for display size (viewBox stays proportional so fish are not squashed):
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npx contrib-aquarium@0.1.2 generate --user YOUR_LOGIN --out assets/aquarium.svg --width 640
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```yaml
|
|
111
|
+
- type: custom
|
|
112
|
+
marker: AQUARIUM
|
|
113
|
+
title: 🐠 Contribution aquarium
|
|
114
|
+
content: |
|
|
115
|
+
<p align="center">
|
|
116
|
+
<img src="assets/aquarium.svg" width="640" alt="contribution aquarium" />
|
|
117
|
+
</p>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
把生成步骤放进 daily-refresh(Action 输入 `width: "640"`),与 README `<img width>` 对齐即可。 · Put the generate step in daily-refresh (`width: "640"`) so it matches the README `<img width>`.
|
|
121
|
+
|
|
100
122
|
## 💡 提示
|
|
101
123
|
|
|
102
124
|
1. **标记名称**: 确保每个章节的 `marker` 唯一
|
|
103
|
-
2. **GitHub Token**: 设置 `GITHUB_TOKEN` 环境变量以避免 API 速率限制
|
|
125
|
+
2. **GitHub Token**: 设置 `GITHUB_TOKEN` 或 `GH_TOKEN` 环境变量以避免 API 速率限制
|
|
104
126
|
3. **精选仓库**: 使用 `featuredRepos` 手动选择要展示的项目
|
|
105
127
|
4. **自定义样式**: 在 `custom` 章节中使用 HTML 和 Markdown
|
|
106
128
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webywz/breathing-github-profile",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "可复用的活跃 GitHub profile README 生成器,支持每日自动刷新",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -30,7 +30,9 @@
|
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"files": [
|
|
32
32
|
"dist",
|
|
33
|
-
"examples"
|
|
33
|
+
"examples",
|
|
34
|
+
"README.md",
|
|
35
|
+
"LICENSE"
|
|
34
36
|
],
|
|
35
37
|
"dependencies": {
|
|
36
38
|
"yaml": "^2.3.4",
|
|
@@ -50,7 +52,7 @@
|
|
|
50
52
|
"tsx": "^4.7.0"
|
|
51
53
|
},
|
|
52
54
|
"engines": {
|
|
53
|
-
"node": ">=
|
|
55
|
+
"node": ">=18.18.0"
|
|
54
56
|
},
|
|
55
57
|
"publishConfig": {
|
|
56
58
|
"access": "public"
|