zengen 0.1.35 → 0.2.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/.github/workflows/bump-version.yml +112 -0
- package/.github/workflows/ci.yml +2 -2
- package/.github/workflows/pages.yml +1 -7
- package/.zen/meta.json +155 -0
- package/.zen/src/en-US/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
- package/.zen/src/en-US/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +75 -0
- package/.zen/src/en-US/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
- package/.zen/src/en-US/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +53 -0
- package/.zen/src/en-US/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +11 -0
- package/.zen/src/en-US/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +61 -0
- package/.zen/src/en-US/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +41 -0
- package/.zen/src/en-US/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
- package/.zen/src/zh-Hans/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
- package/.zen/src/zh-Hans/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +77 -0
- package/.zen/src/zh-Hans/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
- package/.zen/src/zh-Hans/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +55 -0
- package/.zen/src/zh-Hans/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +1 -0
- package/.zen/src/zh-Hans/6ad8db715a1b60613fe934fefb29fa981ecad9b63145593accff144d73b44bde.md +175 -0
- package/.zen/src/zh-Hans/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +63 -0
- package/.zen/src/zh-Hans/a1580f71c6c6c1ff4a314be72d410a8507af2f087d56360c7f5048d349c21953.md +48 -0
- package/.zen/src/zh-Hans/d49012f98c4367b34034063400e2f7826bf0615952210c82396920172d468e2c.md +107 -0
- package/.zen/src/zh-Hans/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +41 -0
- package/.zen/src/zh-Hans/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
- package/assets/templates/default/layout.html +274 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts +8 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts.map +1 -0
- package/dist/ai/extractMetadataFromMarkdown.js +88 -0
- package/dist/ai/extractMetadataFromMarkdown.js.map +1 -0
- package/dist/ai/translateMarkdown.d.ts +8 -0
- package/dist/ai/translateMarkdown.d.ts.map +1 -0
- package/dist/ai/translateMarkdown.js +29 -0
- package/dist/ai/translateMarkdown.js.map +1 -0
- package/dist/build/pipeline.d.ts +6 -0
- package/dist/build/pipeline.d.ts.map +1 -0
- package/dist/build/pipeline.js +218 -0
- package/dist/build/pipeline.js.map +1 -0
- package/dist/cli.js +17 -83
- package/dist/cli.js.map +1 -1
- package/dist/findEntries.d.ts +10 -0
- package/dist/findEntries.d.ts.map +1 -0
- package/dist/findEntries.js +38 -0
- package/dist/findEntries.js.map +1 -0
- package/dist/index.d.ts +1 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -35
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +78 -0
- package/dist/metadata.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/process/extractMetadataByAI.d.ts +5 -0
- package/dist/process/extractMetadataByAI.d.ts.map +1 -0
- package/dist/process/extractMetadataByAI.js +31 -0
- package/dist/process/extractMetadataByAI.js.map +1 -0
- package/dist/process/template.d.ts +5 -0
- package/dist/process/template.d.ts.map +1 -0
- package/dist/process/template.js +188 -0
- package/dist/process/template.js.map +1 -0
- package/dist/scan/files.d.ts +7 -0
- package/dist/scan/files.d.ts.map +1 -0
- package/dist/scan/files.js +54 -0
- package/dist/scan/files.js.map +1 -0
- package/dist/services/openai.d.ts +41 -0
- package/dist/services/openai.d.ts.map +1 -0
- package/dist/services/openai.js +54 -0
- package/dist/services/openai.js.map +1 -0
- package/dist/types.d.ts +26 -46
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/convertMarkdownToHtml.d.ts +7 -0
- package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -0
- package/dist/utils/convertMarkdownToHtml.js +39 -0
- package/dist/utils/convertMarkdownToHtml.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +6 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +22 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/docs/advanced-usage.md +39 -0
- package/docs/deployment/github-pages.md +1 -2
- package/docs/getting-started.md +26 -0
- package/docs/guides/best-practices.md +4 -117
- package/docs/guides/config.md +0 -238
- package/package.json +5 -2
- package/src/ai/extractMetadataFromMarkdown.ts +95 -0
- package/src/ai/translateMarkdown.ts +29 -0
- package/src/build/pipeline.ts +211 -0
- package/src/cli.ts +18 -94
- package/src/findEntries.ts +37 -0
- package/src/index.ts +1 -40
- package/src/metadata.ts +44 -0
- package/src/paths.ts +7 -0
- package/src/process/extractMetadataByAI.ts +29 -0
- package/src/process/template.ts +201 -0
- package/src/scan/files.ts +17 -0
- package/src/services/openai.ts +92 -0
- package/src/types.ts +29 -47
- package/src/utils/convertMarkdownToHtml.ts +32 -0
- package/src/utils/frontmatter.ts +18 -0
- package/test-multilang.js +44 -0
- package/dist/builder.d.ts +0 -46
- package/dist/builder.d.ts.map +0 -1
- package/dist/builder.js +0 -443
- package/dist/builder.js.map +0 -1
- package/dist/gitignore.d.ts +0 -40
- package/dist/gitignore.d.ts.map +0 -1
- package/dist/gitignore.js +0 -184
- package/dist/gitignore.js.map +0 -1
- package/dist/gitignore.test.d.ts +0 -2
- package/dist/gitignore.test.d.ts.map +0 -1
- package/dist/gitignore.test.js +0 -244
- package/dist/gitignore.test.js.map +0 -1
- package/dist/markdown.d.ts +0 -30
- package/dist/markdown.d.ts.map +0 -1
- package/dist/markdown.js +0 -199
- package/dist/markdown.js.map +0 -1
- package/dist/navigation.d.ts +0 -46
- package/dist/navigation.d.ts.map +0 -1
- package/dist/navigation.js +0 -196
- package/dist/navigation.js.map +0 -1
- package/dist/template.d.ts +0 -29
- package/dist/template.d.ts.map +0 -1
- package/dist/template.js +0 -385
- package/dist/template.js.map +0 -1
- package/docs/ci/github-ci-cd.md +0 -127
- package/docs/guides/api.md +0 -277
- package/src/builder.ts +0 -458
- package/src/gitignore.test.ts +0 -253
- package/src/gitignore.ts +0 -173
- package/src/markdown.ts +0 -184
- package/src/navigation.ts +0 -237
- package/src/template.ts +0 -365
package/dist/template.js
DELETED
|
@@ -1,385 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.TemplateEngine = void 0;
|
|
37
|
-
const fs = __importStar(require("fs/promises"));
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
class TemplateEngine {
|
|
40
|
-
constructor() {
|
|
41
|
-
this.defaultTemplate = `<!DOCTYPE html>
|
|
42
|
-
<html lang="zh-CN">
|
|
43
|
-
<head>
|
|
44
|
-
<meta charset="UTF-8">
|
|
45
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
46
|
-
<title>{{title}}</title>
|
|
47
|
-
<style>
|
|
48
|
-
* {
|
|
49
|
-
margin: 0;
|
|
50
|
-
padding: 0;
|
|
51
|
-
box-sizing: border-box;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
body {
|
|
55
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
56
|
-
line-height: 1.6;
|
|
57
|
-
color: #333;
|
|
58
|
-
background: #f8f9fa;
|
|
59
|
-
display: flex;
|
|
60
|
-
min-height: 100vh;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
.sidebar {
|
|
64
|
-
width: 280px;
|
|
65
|
-
background: #fff;
|
|
66
|
-
border-right: 1px solid #e9ecef;
|
|
67
|
-
padding: 2rem 1rem;
|
|
68
|
-
overflow-y: auto;
|
|
69
|
-
position: fixed;
|
|
70
|
-
height: 100vh;
|
|
71
|
-
left: 0;
|
|
72
|
-
top: 0;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.sidebar-header {
|
|
76
|
-
margin-bottom: 2rem;
|
|
77
|
-
padding-bottom: 1rem;
|
|
78
|
-
border-bottom: 1px solid #e9ecef;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.sidebar-header h1 {
|
|
82
|
-
font-size: 1.5rem;
|
|
83
|
-
font-weight: 600;
|
|
84
|
-
color: #212529;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.sidebar-header p {
|
|
88
|
-
color: #6c757d;
|
|
89
|
-
font-size: 0.875rem;
|
|
90
|
-
margin-top: 0.5rem;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
.nav-list {
|
|
94
|
-
list-style: none;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
.nav-item {
|
|
98
|
-
margin-bottom: 0.5rem;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
.nav-link {
|
|
102
|
-
display: block;
|
|
103
|
-
padding: 0.5rem 1rem;
|
|
104
|
-
color: #495057;
|
|
105
|
-
text-decoration: none;
|
|
106
|
-
border-radius: 4px;
|
|
107
|
-
transition: all 0.2s;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.nav-link:hover {
|
|
111
|
-
background: #e9ecef;
|
|
112
|
-
color: #212529;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.nav-link.active {
|
|
116
|
-
background: #007bff;
|
|
117
|
-
color: white;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.nav-submenu {
|
|
121
|
-
list-style: none;
|
|
122
|
-
margin-left: 1rem;
|
|
123
|
-
margin-top: 0.25rem;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.content {
|
|
127
|
-
flex: 1;
|
|
128
|
-
margin-left: 280px;
|
|
129
|
-
padding: 3rem 4rem;
|
|
130
|
-
max-width: 900px;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
.content-header {
|
|
134
|
-
margin-bottom: 2rem;
|
|
135
|
-
padding-bottom: 1rem;
|
|
136
|
-
border-bottom: 1px solid #e9ecef;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
.content-header h1 {
|
|
140
|
-
font-size: 2.5rem;
|
|
141
|
-
font-weight: 700;
|
|
142
|
-
color: #212529;
|
|
143
|
-
margin-bottom: 0.5rem;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
.content-header .meta {
|
|
147
|
-
color: #6c757d;
|
|
148
|
-
font-size: 0.875rem;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
.content-body {
|
|
152
|
-
font-size: 1.125rem;
|
|
153
|
-
line-height: 1.8;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
.content-body h1 {
|
|
157
|
-
font-size: 2rem;
|
|
158
|
-
margin: 2rem 0 1rem;
|
|
159
|
-
color: #212529;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
.content-body h2 {
|
|
163
|
-
font-size: 1.75rem;
|
|
164
|
-
margin: 1.75rem 0 0.875rem;
|
|
165
|
-
color: #343a40;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
.content-body h3 {
|
|
169
|
-
font-size: 1.5rem;
|
|
170
|
-
margin: 1.5rem 0 0.75rem;
|
|
171
|
-
color: #495057;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
.content-body p {
|
|
175
|
-
margin: 1rem 0;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
.content-body ul, .content-body ol {
|
|
179
|
-
margin: 1rem 0 1rem 2rem;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
.content-body li {
|
|
183
|
-
margin: 0.5rem 0;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
.content-body blockquote {
|
|
187
|
-
border-left: 4px solid #007bff;
|
|
188
|
-
padding: 0.5rem 1rem;
|
|
189
|
-
margin: 1rem 0;
|
|
190
|
-
background: #f8f9fa;
|
|
191
|
-
color: #495057;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
.content-body code {
|
|
195
|
-
background: #f8f9fa;
|
|
196
|
-
padding: 0.2rem 0.4rem;
|
|
197
|
-
border-radius: 3px;
|
|
198
|
-
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
|
|
199
|
-
font-size: 0.875em;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
.content-body pre {
|
|
203
|
-
background: #f8f9fa;
|
|
204
|
-
padding: 1rem;
|
|
205
|
-
border-radius: 6px;
|
|
206
|
-
overflow-x: auto;
|
|
207
|
-
margin: 1rem 0;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
.content-body pre code {
|
|
211
|
-
background: none;
|
|
212
|
-
padding: 0;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
.content-body table {
|
|
216
|
-
width: 100%;
|
|
217
|
-
border-collapse: collapse;
|
|
218
|
-
margin: 1rem 0;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
.content-body th, .content-body td {
|
|
222
|
-
border: 1px solid #dee2e6;
|
|
223
|
-
padding: 0.75rem;
|
|
224
|
-
text-align: left;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
.content-body th {
|
|
228
|
-
background: #f8f9fa;
|
|
229
|
-
font-weight: 600;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
.content-body img {
|
|
233
|
-
max-width: 100%;
|
|
234
|
-
height: auto;
|
|
235
|
-
border-radius: 6px;
|
|
236
|
-
margin: 1rem 0;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
.content-body a {
|
|
240
|
-
color: #007bff;
|
|
241
|
-
text-decoration: none;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
.content-body a:hover {
|
|
245
|
-
text-decoration: underline;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
.footer {
|
|
249
|
-
margin-top: 3rem;
|
|
250
|
-
padding-top: 2rem;
|
|
251
|
-
border-top: 1px solid #e9ecef;
|
|
252
|
-
color: #6c757d;
|
|
253
|
-
font-size: 0.875rem;
|
|
254
|
-
text-align: center;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
@media (max-width: 768px) {
|
|
258
|
-
body {
|
|
259
|
-
flex-direction: column;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
.sidebar {
|
|
263
|
-
width: 100%;
|
|
264
|
-
height: auto;
|
|
265
|
-
position: static;
|
|
266
|
-
border-right: none;
|
|
267
|
-
border-bottom: 1px solid #e9ecef;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
.content {
|
|
271
|
-
margin-left: 0;
|
|
272
|
-
padding: 2rem;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
</style>
|
|
276
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css">
|
|
277
|
-
</head>
|
|
278
|
-
<body>
|
|
279
|
-
<nav class="sidebar">
|
|
280
|
-
<div class="sidebar-header">
|
|
281
|
-
<h1>ZEN Documentation</h1>
|
|
282
|
-
<p>A minimalist Markdown documentation site builder</p>
|
|
283
|
-
</div>
|
|
284
|
-
{{navigation}}
|
|
285
|
-
</nav>
|
|
286
|
-
|
|
287
|
-
<main class="content">
|
|
288
|
-
<header class="content-header">
|
|
289
|
-
<h1>{{title}}</h1>
|
|
290
|
-
</header>
|
|
291
|
-
|
|
292
|
-
<article class="content-body">
|
|
293
|
-
{{{content}}}
|
|
294
|
-
</article>
|
|
295
|
-
|
|
296
|
-
<footer class="footer">
|
|
297
|
-
<p>Generated by <strong>ZEN</strong> • <a href="https://github.com/zccz14/ZEN" target="_blank">View on GitHub</a></p>
|
|
298
|
-
</footer>
|
|
299
|
-
</main>
|
|
300
|
-
|
|
301
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
|
|
302
|
-
<script>hljs.highlightAll();</script>
|
|
303
|
-
</body>
|
|
304
|
-
</html>`;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* 生成导航 HTML
|
|
308
|
-
*/
|
|
309
|
-
generateNavigationHtml(navigation, currentPath) {
|
|
310
|
-
const renderItem = (item) => {
|
|
311
|
-
const isActive = currentPath === item.path;
|
|
312
|
-
const activeClass = isActive ? 'active' : '';
|
|
313
|
-
let html = `<li class="nav-item">`;
|
|
314
|
-
html += `<a href="${item.path}" class="nav-link ${activeClass}">${item.title}</a>`;
|
|
315
|
-
if (item.children && item.children.length > 0) {
|
|
316
|
-
html += `<ul class="nav-submenu">`;
|
|
317
|
-
html += item.children.map(child => renderItem(child)).join('');
|
|
318
|
-
html += `</ul>`;
|
|
319
|
-
}
|
|
320
|
-
html += `</li>`;
|
|
321
|
-
return html;
|
|
322
|
-
};
|
|
323
|
-
return `<ul class="nav-list">${navigation.map(item => renderItem(item)).join('')}</ul>`;
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* 简单的模板变量替换
|
|
327
|
-
*/
|
|
328
|
-
renderTemplate(template, data) {
|
|
329
|
-
let result = template;
|
|
330
|
-
// 替换导航
|
|
331
|
-
const navigationHtml = this.generateNavigationHtml(data.navigation, data.currentPath);
|
|
332
|
-
result = result.replace('{{navigation}}', navigationHtml);
|
|
333
|
-
// 替换其他变量 - 使用全局替换
|
|
334
|
-
result = result.replace(/{{title}}/g, data.title || 'Untitled');
|
|
335
|
-
result = result.replace(/{{{content}}}/g, data.content || '');
|
|
336
|
-
return result;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* 渲染模板
|
|
340
|
-
*/
|
|
341
|
-
async render(data, templatePath) {
|
|
342
|
-
let template = this.defaultTemplate;
|
|
343
|
-
if (templatePath) {
|
|
344
|
-
try {
|
|
345
|
-
template = await fs.readFile(templatePath, 'utf-8');
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
console.warn(`Failed to load custom template from ${templatePath}, using default template:`, error);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
return this.renderTemplate(template, data);
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* 从文件信息生成模板数据
|
|
355
|
-
*/
|
|
356
|
-
generateTemplateData(fileInfo, navigation) {
|
|
357
|
-
return {
|
|
358
|
-
title: fileInfo.metadata?.title || fileInfo.name, // 优先使用提取的标题,如果没有则使用文件名
|
|
359
|
-
content: fileInfo.html || '',
|
|
360
|
-
navigation,
|
|
361
|
-
metadata: fileInfo.metadata,
|
|
362
|
-
currentPath: `/${fileInfo.relativePath.replace(/\.md$/, '.html')}`,
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* 生成输出文件路径
|
|
367
|
-
*/
|
|
368
|
-
getOutputPath(fileInfo, outDir) {
|
|
369
|
-
const htmlFileName = `${fileInfo.name}.html`;
|
|
370
|
-
const relativeDir = path.dirname(fileInfo.relativePath);
|
|
371
|
-
return path.join(outDir, relativeDir, htmlFileName);
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* 保存渲染结果到文件
|
|
375
|
-
*/
|
|
376
|
-
async saveToFile(html, outputPath) {
|
|
377
|
-
// 确保目录存在
|
|
378
|
-
const dir = path.dirname(outputPath);
|
|
379
|
-
await fs.mkdir(dir, { recursive: true });
|
|
380
|
-
// 写入文件
|
|
381
|
-
await fs.writeFile(outputPath, html, 'utf-8');
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
exports.TemplateEngine = TemplateEngine;
|
|
385
|
-
//# sourceMappingURL=template.js.map
|
package/dist/template.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
|
package/docs/ci/github-ci-cd.md
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
# GitHub CI/CD 配置指南
|
|
2
|
-
|
|
3
|
-
本文档描述了如何为 zengen 项目配置 GitHub Actions 进行可信发布。
|
|
4
|
-
|
|
5
|
-
## 概述
|
|
6
|
-
|
|
7
|
-
我们配置了三个 GitHub Actions workflows:
|
|
8
|
-
|
|
9
|
-
1. **CI** (`ci.yml`) - 代码质量检查和测试
|
|
10
|
-
2. **Version Management** (`version.yml`) - 版本管理和自动创建 Release
|
|
11
|
-
3. **Publish to npm** (`publish.yml`) - 可信发布到 npm registry
|
|
12
|
-
|
|
13
|
-
## 配置步骤
|
|
14
|
-
|
|
15
|
-
### 1. 设置 npm 认证令牌
|
|
16
|
-
|
|
17
|
-
由于 npm 经典令牌已被撤销,需要使用新的认证方式:
|
|
18
|
-
|
|
19
|
-
#### 选项 A: 使用细粒度访问令牌(推荐)
|
|
20
|
-
|
|
21
|
-
1. 登录 [npmjs.com](https://www.npmjs.com)
|
|
22
|
-
2. 进入 Account Settings → Access Tokens
|
|
23
|
-
3. 点击 "Create New Token"
|
|
24
|
-
4. 选择 "Automation" 类型
|
|
25
|
-
5. 配置权限:
|
|
26
|
-
- 读取和写入包
|
|
27
|
-
- 绕过 2FA(用于自动化工作流)
|
|
28
|
-
6. 设置有效期(最长 90 天)
|
|
29
|
-
7. 复制生成的令牌
|
|
30
|
-
|
|
31
|
-
#### 选项 B: 使用 OIDC 可信发布
|
|
32
|
-
|
|
33
|
-
1. 确保在 GitHub 仓库设置中启用了 OIDC
|
|
34
|
-
2. 配置 npm 以信任 GitHub Actions 的 OIDC 令牌
|
|
35
|
-
|
|
36
|
-
### 2. 配置 GitHub Actions 权限
|
|
37
|
-
|
|
38
|
-
确保仓库有以下权限设置:
|
|
39
|
-
|
|
40
|
-
- Settings → Actions → General
|
|
41
|
-
- Workflow permissions: 选择 "Read and write permissions"
|
|
42
|
-
- 确保启用了 OIDC 支持
|
|
43
|
-
|
|
44
|
-
**注意**:对于 npm OIDC 发布,不需要配置 `NPM_TOKEN` secret。GitHub Actions 会自动使用 OIDC 令牌进行认证。
|
|
45
|
-
|
|
46
|
-
## 工作流程
|
|
47
|
-
|
|
48
|
-
### CI 流程
|
|
49
|
-
|
|
50
|
-
1. 当有 push 到 main 分支或创建 PR 时触发
|
|
51
|
-
2. 在多个 Node.js 版本上运行测试
|
|
52
|
-
3. 执行代码质量检查
|
|
53
|
-
4. 构建包并验证
|
|
54
|
-
|
|
55
|
-
### 版本管理流程
|
|
56
|
-
|
|
57
|
-
1. 当 package.json 版本变更时触发
|
|
58
|
-
2. 自动创建 GitHub Release
|
|
59
|
-
3. 生成基于提交历史的 changelog
|
|
60
|
-
|
|
61
|
-
### 发布流程
|
|
62
|
-
|
|
63
|
-
1. 当创建 GitHub Release 时触发
|
|
64
|
-
2. 使用 OIDC 进行可信认证
|
|
65
|
-
3. 构建并发布到 npm
|
|
66
|
-
4. 生成来源证明(provenance)
|
|
67
|
-
|
|
68
|
-
## 手动发布
|
|
69
|
-
|
|
70
|
-
如果需要手动发布:
|
|
71
|
-
|
|
72
|
-
1. 更新 `package.json` 中的版本号
|
|
73
|
-
2. 提交并推送到 main 分支
|
|
74
|
-
3. 版本管理 workflow 会自动创建 Release
|
|
75
|
-
4. 发布 workflow 会自动发布到 npm
|
|
76
|
-
|
|
77
|
-
或者使用 workflow_dispatch:
|
|
78
|
-
|
|
79
|
-
1. 前往 Actions → Publish to npm
|
|
80
|
-
2. 点击 "Run workflow"
|
|
81
|
-
3. 选择分支并运行
|
|
82
|
-
|
|
83
|
-
## 安全注意事项
|
|
84
|
-
|
|
85
|
-
1. **令牌安全**:
|
|
86
|
-
- 永远不要在代码中硬编码令牌
|
|
87
|
-
- 使用 GitHub Secrets 存储敏感信息
|
|
88
|
-
- 定期轮换令牌
|
|
89
|
-
|
|
90
|
-
2. **OIDC 优势**:
|
|
91
|
-
- 消除长期令牌的管理
|
|
92
|
-
- 自动化的短期会话令牌
|
|
93
|
-
- 更好的安全审计
|
|
94
|
-
|
|
95
|
-
3. **来源证明**:
|
|
96
|
-
- 使用 `--provenance` 标志发布
|
|
97
|
-
- 验证包的构建环境和来源
|
|
98
|
-
- 增加用户信任
|
|
99
|
-
|
|
100
|
-
## 故障排除
|
|
101
|
-
|
|
102
|
-
### 常见问题
|
|
103
|
-
|
|
104
|
-
1. **认证失败**:
|
|
105
|
-
- 确保仓库启用了 OIDC 支持
|
|
106
|
-
- 检查 workflow 中设置了 `permissions: id-token: write`
|
|
107
|
-
- 验证 npm 版本是否支持 OIDC(需要 npm 9.0.0+)
|
|
108
|
-
|
|
109
|
-
2. **版本检测失败**:
|
|
110
|
-
- 确保 `fetch-depth: 0` 以获取完整历史
|
|
111
|
-
- 检查 package.json 格式是否正确
|
|
112
|
-
|
|
113
|
-
3. **构建失败**:
|
|
114
|
-
- 检查 Node.js 版本兼容性
|
|
115
|
-
- 验证 TypeScript 配置
|
|
116
|
-
- 确保所有依赖项已安装
|
|
117
|
-
|
|
118
|
-
### 调试
|
|
119
|
-
|
|
120
|
-
- 查看 GitHub Actions 日志
|
|
121
|
-
- 启用调试日志:在仓库 Settings → Actions → Runner 中设置 secret `ACTIONS_STEP_DEBUG` 为 `true`
|
|
122
|
-
|
|
123
|
-
## 相关链接
|
|
124
|
-
|
|
125
|
-
- [npm 认证变更公告](https://github.blog/changelog/2025-12-09-npm-classic-tokens-revoked-session-based-auth-and-cli-token-management-now-available/)
|
|
126
|
-
- [GitHub Actions npm 发布文档](https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages)
|
|
127
|
-
- [npm 可信发布文档](https://docs.npmjs.com/trusted-publishing-with-oidc)
|