zengen 0.1.36 → 0.2.1

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.
Files changed (150) hide show
  1. package/.github/workflows/pages.yml +1 -1
  2. package/.zen/meta.json +112 -32
  3. package/.zen/src/en-US/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
  4. package/.zen/src/en-US/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +75 -0
  5. package/.zen/src/en-US/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
  6. package/.zen/src/en-US/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +53 -0
  7. package/.zen/src/en-US/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +11 -0
  8. package/.zen/src/en-US/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +61 -0
  9. package/.zen/src/en-US/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +40 -0
  10. package/.zen/src/en-US/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
  11. package/.zen/src/zh-Hans/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
  12. package/.zen/src/zh-Hans/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +77 -0
  13. package/.zen/src/zh-Hans/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
  14. package/.zen/src/zh-Hans/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +55 -0
  15. package/.zen/src/zh-Hans/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +11 -0
  16. package/.zen/src/zh-Hans/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +63 -0
  17. package/.zen/src/zh-Hans/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +40 -0
  18. package/.zen/src/zh-Hans/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
  19. package/assets/templates/default/layout.html +274 -0
  20. package/dist/ai/extractMetadataFromMarkdown.d.ts +8 -0
  21. package/dist/ai/extractMetadataFromMarkdown.d.ts.map +1 -0
  22. package/dist/ai/extractMetadataFromMarkdown.js +88 -0
  23. package/dist/ai/extractMetadataFromMarkdown.js.map +1 -0
  24. package/dist/ai/translateMarkdown.d.ts +8 -0
  25. package/dist/ai/translateMarkdown.d.ts.map +1 -0
  26. package/dist/ai/translateMarkdown.js +29 -0
  27. package/dist/ai/translateMarkdown.js.map +1 -0
  28. package/dist/build/pipeline.d.ts +6 -0
  29. package/dist/build/pipeline.d.ts.map +1 -0
  30. package/dist/build/pipeline.js +219 -0
  31. package/dist/build/pipeline.js.map +1 -0
  32. package/dist/cli.js +10 -118
  33. package/dist/cli.js.map +1 -1
  34. package/dist/findEntries.d.ts +10 -0
  35. package/dist/findEntries.d.ts.map +1 -0
  36. package/dist/findEntries.js +38 -0
  37. package/dist/findEntries.js.map +1 -0
  38. package/dist/index.d.ts +1 -32
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -35
  41. package/dist/index.js.map +1 -1
  42. package/dist/metadata.d.ts +14 -0
  43. package/dist/metadata.d.ts.map +1 -0
  44. package/dist/metadata.js +78 -0
  45. package/dist/metadata.js.map +1 -0
  46. package/dist/paths.d.ts +6 -0
  47. package/dist/paths.d.ts.map +1 -0
  48. package/dist/paths.js +10 -0
  49. package/dist/paths.js.map +1 -0
  50. package/dist/process/extractMetadataByAI.d.ts +5 -0
  51. package/dist/process/extractMetadataByAI.d.ts.map +1 -0
  52. package/dist/process/extractMetadataByAI.js +31 -0
  53. package/dist/process/extractMetadataByAI.js.map +1 -0
  54. package/dist/process/template.d.ts +5 -0
  55. package/dist/process/template.d.ts.map +1 -0
  56. package/dist/process/template.js +188 -0
  57. package/dist/process/template.js.map +1 -0
  58. package/dist/scan/files.d.ts +7 -0
  59. package/dist/scan/files.d.ts.map +1 -0
  60. package/dist/scan/files.js +54 -0
  61. package/dist/scan/files.js.map +1 -0
  62. package/dist/services/openai.d.ts +41 -0
  63. package/dist/services/openai.d.ts.map +1 -0
  64. package/dist/services/openai.js +54 -0
  65. package/dist/services/openai.js.map +1 -0
  66. package/dist/types.d.ts +16 -67
  67. package/dist/types.d.ts.map +1 -1
  68. package/dist/utils/convertMarkdownToHtml.d.ts +7 -0
  69. package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -0
  70. package/dist/utils/convertMarkdownToHtml.js +39 -0
  71. package/dist/utils/convertMarkdownToHtml.js.map +1 -0
  72. package/dist/utils/frontmatter.d.ts +6 -0
  73. package/dist/utils/frontmatter.d.ts.map +1 -0
  74. package/dist/utils/frontmatter.js +22 -0
  75. package/dist/utils/frontmatter.js.map +1 -0
  76. package/docs/deployment/github-pages.md +1 -2
  77. package/docs/guides/best-practices.md +4 -4
  78. package/docs/guides/config.md +0 -5
  79. package/package.json +4 -2
  80. package/src/ai/extractMetadataFromMarkdown.ts +95 -0
  81. package/src/ai/translateMarkdown.ts +29 -0
  82. package/src/build/pipeline.ts +217 -0
  83. package/src/cli.ts +10 -132
  84. package/src/findEntries.ts +37 -0
  85. package/src/index.ts +1 -40
  86. package/src/metadata.ts +44 -0
  87. package/src/paths.ts +7 -0
  88. package/src/process/extractMetadataByAI.ts +31 -0
  89. package/src/process/template.ts +201 -0
  90. package/src/scan/files.ts +17 -0
  91. package/src/services/openai.ts +92 -0
  92. package/src/types.ts +18 -72
  93. package/src/utils/convertMarkdownToHtml.ts +32 -0
  94. package/src/utils/frontmatter.ts +18 -0
  95. package/.zen/translations.json +0 -51
  96. package/dist/ai-client.d.ts +0 -34
  97. package/dist/ai-client.d.ts.map +0 -1
  98. package/dist/ai-client.js +0 -180
  99. package/dist/ai-client.js.map +0 -1
  100. package/dist/ai-processor.d.ts +0 -51
  101. package/dist/ai-processor.d.ts.map +0 -1
  102. package/dist/ai-processor.js +0 -215
  103. package/dist/ai-processor.js.map +0 -1
  104. package/dist/ai-service.d.ts +0 -79
  105. package/dist/ai-service.d.ts.map +0 -1
  106. package/dist/ai-service.js +0 -257
  107. package/dist/ai-service.js.map +0 -1
  108. package/dist/builder.d.ts +0 -70
  109. package/dist/builder.d.ts.map +0 -1
  110. package/dist/builder.js +0 -854
  111. package/dist/builder.js.map +0 -1
  112. package/dist/gitignore.d.ts +0 -41
  113. package/dist/gitignore.d.ts.map +0 -1
  114. package/dist/gitignore.js +0 -202
  115. package/dist/gitignore.js.map +0 -1
  116. package/dist/gitignore.test.d.ts +0 -2
  117. package/dist/gitignore.test.d.ts.map +0 -1
  118. package/dist/gitignore.test.js +0 -309
  119. package/dist/gitignore.test.js.map +0 -1
  120. package/dist/markdown.d.ts +0 -35
  121. package/dist/markdown.d.ts.map +0 -1
  122. package/dist/markdown.js +0 -221
  123. package/dist/markdown.js.map +0 -1
  124. package/dist/navigation.d.ts +0 -46
  125. package/dist/navigation.d.ts.map +0 -1
  126. package/dist/navigation.js +0 -196
  127. package/dist/navigation.js.map +0 -1
  128. package/dist/scanner.d.ts +0 -26
  129. package/dist/scanner.d.ts.map +0 -1
  130. package/dist/scanner.js +0 -190
  131. package/dist/scanner.js.map +0 -1
  132. package/dist/template.d.ts +0 -33
  133. package/dist/template.d.ts.map +0 -1
  134. package/dist/template.js +0 -434
  135. package/dist/template.js.map +0 -1
  136. package/dist/translation-service.d.ts +0 -72
  137. package/dist/translation-service.d.ts.map +0 -1
  138. package/dist/translation-service.js +0 -291
  139. package/dist/translation-service.js.map +0 -1
  140. package/src/ai-client.ts +0 -227
  141. package/src/ai-processor.ts +0 -243
  142. package/src/ai-service.ts +0 -281
  143. package/src/builder.ts +0 -991
  144. package/src/gitignore.test.ts +0 -318
  145. package/src/gitignore.ts +0 -193
  146. package/src/markdown.ts +0 -212
  147. package/src/navigation.ts +0 -237
  148. package/src/scanner.ts +0 -180
  149. package/src/template.ts +0 -425
  150. package/src/translation-service.ts +0 -350
@@ -0,0 +1,6 @@
1
+ export declare const INPUT_DIR: string;
2
+ export declare const ZEN_DIR: string;
3
+ export declare const ZEN_DIST_DIR: string;
4
+ export declare const ZEN_SRC_DIR: string;
5
+ export declare const ZEN_META_PATH: string;
6
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,QAAgB,CAAC;AACvC,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,YAAY,QAAwB,CAAC;AAClD,eAAO,MAAM,WAAW,QAAuB,CAAC;AAChD,eAAO,MAAM,aAAa,QAA6B,CAAC"}
package/dist/paths.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZEN_META_PATH = exports.ZEN_SRC_DIR = exports.ZEN_DIST_DIR = exports.ZEN_DIR = exports.INPUT_DIR = void 0;
4
+ const path_1 = require("path");
5
+ exports.INPUT_DIR = process.cwd();
6
+ exports.ZEN_DIR = (0, path_1.join)(process.cwd(), '.zen');
7
+ exports.ZEN_DIST_DIR = (0, path_1.join)(exports.ZEN_DIR, 'dist');
8
+ exports.ZEN_SRC_DIR = (0, path_1.join)(exports.ZEN_DIR, 'src');
9
+ exports.ZEN_META_PATH = (0, path_1.join)(exports.ZEN_DIR, 'meta.json');
10
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAEf,QAAA,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC1B,QAAA,OAAO,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AACtC,QAAA,YAAY,GAAG,IAAA,WAAI,EAAC,eAAO,EAAE,MAAM,CAAC,CAAC;AACrC,QAAA,WAAW,GAAG,IAAA,WAAI,EAAC,eAAO,EAAE,KAAK,CAAC,CAAC;AACnC,QAAA,aAAa,GAAG,IAAA,WAAI,EAAC,eAAO,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 运行 AI 元数据提取
3
+ */
4
+ export declare function extractMetadataByAI(): Promise<void>;
5
+ //# sourceMappingURL=extractMetadataByAI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractMetadataByAI.d.ts","sourceRoot":"","sources":["../../src/process/extractMetadataByAI.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBzD"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractMetadataByAI = extractMetadataByAI;
4
+ const promises_1 = require("fs/promises");
5
+ const extractMetadataFromMarkdown_1 = require("../ai/extractMetadataFromMarkdown");
6
+ const metadata_1 = require("../metadata");
7
+ /**
8
+ * 运行 AI 元数据提取
9
+ */
10
+ async function extractMetadataByAI() {
11
+ const { files } = metadata_1.MetaData;
12
+ if (metadata_1.MetaData.options.verbose)
13
+ console.log(`🤖 Running AI metadata extraction...`);
14
+ console.log(`🤖 Processing ${files.length} files with AI...`);
15
+ await Promise.all(files.map(async (file) => {
16
+ try {
17
+ if (file.metadata) {
18
+ console.info(`ℹ️ Skipping ${file.path}, already has metadata`);
19
+ return;
20
+ }
21
+ const content = await (0, promises_1.readFile)(file.path, 'utf-8');
22
+ file.metadata = await (0, extractMetadataFromMarkdown_1.extractMetadataFromMarkdown)(content);
23
+ console.log(`✅ Extracted AI metadata for ${file.path}`, file.metadata.tokens_used);
24
+ }
25
+ catch (error) {
26
+ console.error(`⚠️ Failed to process file ${file.path}:`, error);
27
+ }
28
+ }));
29
+ console.log(`✅ AI processing completed for ${files.length} files`);
30
+ }
31
+ //# sourceMappingURL=extractMetadataByAI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractMetadataByAI.js","sourceRoot":"","sources":["../../src/process/extractMetadataByAI.ts"],"names":[],"mappings":";;AAOA,kDAuBC;AA9BD,0CAAuC;AACvC,mFAAgF;AAChF,0CAAuC;AAEvC;;GAEG;AACI,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAQ,CAAC;IAE3B,IAAI,mBAAQ,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAE9D,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACrB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAA,yDAA2B,EAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 渲染模板并保存文件
3
+ */
4
+ export declare function renderTemplates(): Promise<void>;
5
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"AA8JA;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCrD"}
@@ -0,0 +1,188 @@
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.renderTemplates = renderTemplates;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const metadata_1 = require("../metadata");
40
+ const paths_1 = require("../paths");
41
+ const convertMarkdownToHtml_1 = require("../utils/convertMarkdownToHtml");
42
+ const frontmatter_1 = require("../utils/frontmatter");
43
+ const langNames = {
44
+ 'zh-Hans': '简体中文',
45
+ 'en-US': 'English',
46
+ 'ja-JP': '日本語',
47
+ 'ko-KR': '한국어',
48
+ };
49
+ /**
50
+ * 生成语言切换器 HTML
51
+ * @param currentLang 当前语言
52
+ * @param availableLangs 可用语言列表
53
+ * @returns 语言切换器 HTML 字符串
54
+ */
55
+ function generateLanguageSwitcher(templateData) {
56
+ const { options: { langs = [], baseUrl = '/' }, } = metadata_1.MetaData;
57
+ const items = langs
58
+ .map(lang => {
59
+ const langName = langNames[lang] || lang;
60
+ const isCurrent = lang === templateData.lang;
61
+ const activeClass = isCurrent ? 'active' : '';
62
+ return `<li class="lang-item ${activeClass}">
63
+ <a href="${path.join(baseUrl, lang, templateData.file.hash + '.html')}" class="lang-link">${langName}</a>
64
+ </li>`;
65
+ })
66
+ .join('');
67
+ return `<div class="language-switcher">
68
+ <span class="lang-label">Language:</span>
69
+ <ul class="lang-list">${items}</ul>
70
+ </div>`;
71
+ }
72
+ /**
73
+ * 生成导航 HTML
74
+ * @param navigation 导航树
75
+ * @param currentPath 当前路径(可选,用于高亮当前页面)
76
+ * @returns 导航 HTML 字符串
77
+ */
78
+ async function generateNavigationHtml(data) {
79
+ const { files, options: { baseUrl = '/' }, } = metadata_1.MetaData;
80
+ const navigation = await Promise.all(files.map(async (file) => {
81
+ const content = await fs.readFile(path.join(paths_1.ZEN_SRC_DIR, data.lang, file.hash + '.md'), 'utf-8');
82
+ const { frontmatter } = (0, frontmatter_1.parseFrontmatter)(content);
83
+ const title = frontmatter.title || file.metadata?.title || file.path; // 优先使用提取的标题
84
+ return {
85
+ title,
86
+ path: path.join(baseUrl, data.lang, file.hash + '.html'),
87
+ isActive: data.file.hash === file.hash,
88
+ };
89
+ }));
90
+ navigation.sort((a, b) => a.title.localeCompare(b.title));
91
+ return `<ul class="nav-list">${navigation
92
+ .map(item => {
93
+ const activeClass = item.isActive ? 'active' : '';
94
+ let html = `<li class="nav-item">`;
95
+ html += `<a href="${item.path}" class="nav-link ${activeClass}">${item.title}</a>`;
96
+ html += `</li>`;
97
+ return html;
98
+ })
99
+ .join('')}</ul>`;
100
+ }
101
+ /**
102
+ * 简单的模板变量替换
103
+ * @param template 模板字符串
104
+ * @param data 模板数据
105
+ * @returns 渲染后的 HTML 字符串
106
+ */
107
+ async function renderTemplate(template, data) {
108
+ const { options: { langs = [] }, } = metadata_1.MetaData;
109
+ const markdownContent = data.content;
110
+ const { frontmatter, body } = (0, frontmatter_1.parseFrontmatter)(markdownContent);
111
+ const htmlContent = (0, convertMarkdownToHtml_1.convertMarkdownToHtml)(body);
112
+ let result = template;
113
+ // 替换导航
114
+ const navigationHtml = await generateNavigationHtml(data);
115
+ result = result.replace(/{{navigation}}/g, navigationHtml);
116
+ // 替换其他变量 - 使用全局替换
117
+ result = result.replace(/{{title}}/g, frontmatter.title || 'Untitled');
118
+ result = result.replace(/{{content}}/g, htmlContent);
119
+ // 替换元数据变量
120
+ if (frontmatter) {
121
+ result = result.replace(/{{summary}}/g, frontmatter.summary || '');
122
+ result = result.replace(/{{tags}}/g, frontmatter.tags?.join(', ') || '');
123
+ result = result.replace(/{{inferred_date}}/g, frontmatter.inferred_date || '');
124
+ result = result.replace(/{{inferred_lang}}/g, frontmatter.inferred_lang || '');
125
+ }
126
+ // 替换语言相关变量
127
+ result = result.replace(/{{lang}}/g, data.lang || '');
128
+ if (langs && langs.length > 1 && data.lang) {
129
+ const langSwitcher = generateLanguageSwitcher(data);
130
+ result = result.replace('{{language_switcher}}', langSwitcher);
131
+ }
132
+ return result;
133
+ }
134
+ const renderRedirectTemplate = async (from, to) => {
135
+ const { options: { baseUrl = '/' }, } = metadata_1.MetaData;
136
+ const toURL = path.join(baseUrl, to);
137
+ const html = `<!DOCTYPE html>
138
+ <html lang="en">
139
+ <head>
140
+ <meta charset="UTF-8">
141
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
142
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
143
+ <meta http-equiv="refresh" content="0; url=${toURL}">
144
+ <title>Redirecting...</title>
145
+ </head>
146
+ <body>
147
+ <p>Redirecting to <a href="${toURL}">${toURL}</a></p>
148
+ </body>
149
+ </html>`;
150
+ const targetPath = path.join(paths_1.ZEN_DIST_DIR, from);
151
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
152
+ await fs.writeFile(targetPath, html, 'utf-8');
153
+ };
154
+ /**
155
+ * 渲染模板并保存文件
156
+ */
157
+ async function renderTemplates() {
158
+ const { files, options: { langs, verbose }, } = metadata_1.MetaData;
159
+ if (verbose)
160
+ console.log(`⚡ Processing files...`);
161
+ const layoutTemplate = await fs.readFile(path.join(__dirname, '../../assets/templates/default/layout.html'), 'utf-8');
162
+ for (const file of files) {
163
+ for (const lang of langs || []) {
164
+ console.info(`📄 Preparing file for language: ${file.path} [${file.hash}] [${lang}]`);
165
+ const targetPath = path.join(paths_1.ZEN_DIST_DIR, lang, file.hash + '.html');
166
+ const content = await fs.readFile(path.join(paths_1.ZEN_SRC_DIR, lang, file.hash + '.md'), 'utf-8');
167
+ try {
168
+ const html = await renderTemplate(layoutTemplate, {
169
+ file,
170
+ content,
171
+ lang,
172
+ });
173
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
174
+ await fs.writeFile(targetPath, html, 'utf-8');
175
+ if (verbose)
176
+ console.log(`✅ Rendered: ${targetPath}`);
177
+ }
178
+ catch (error) {
179
+ console.error(`❌ Failed to render ${file.path}:`, error);
180
+ }
181
+ }
182
+ }
183
+ for (const lang of langs || []) {
184
+ await renderRedirectTemplate(path.join(lang, 'index.html'), path.join(lang, files[0].hash + '.html'));
185
+ }
186
+ await renderRedirectTemplate('index.html', path.join(langs?.[0] || 'en-US', 'index.html'));
187
+ }
188
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/process/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 计算文件内容的 SHA256 哈希值
3
+ * @param filePath 文件路径
4
+ * @returns 文件的哈希值,如果读取失败则返回空字符串
5
+ */
6
+ export declare function calculateFileHash(filePath: string): Promise<string>;
7
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/scan/files.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQzE"}
@@ -0,0 +1,54 @@
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.calculateFileHash = calculateFileHash;
37
+ const crypto = __importStar(require("crypto"));
38
+ const fs = __importStar(require("fs/promises"));
39
+ /**
40
+ * 计算文件内容的 SHA256 哈希值
41
+ * @param filePath 文件路径
42
+ * @returns 文件的哈希值,如果读取失败则返回空字符串
43
+ */
44
+ async function calculateFileHash(filePath) {
45
+ try {
46
+ const content = await fs.readFile(filePath, 'utf-8');
47
+ return crypto.createHash('sha256').update(content).digest('hex');
48
+ }
49
+ catch (error) {
50
+ console.warn(`⚠️ Failed to calculate hash for ${filePath}:`, error);
51
+ return '';
52
+ }
53
+ }
54
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/scan/files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,8CAQC;AAhBD,+CAAiC;AACjC,gDAAkC;AAElC;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * OpenAI 消息接口
3
+ */
4
+ export interface OpenAIMessage {
5
+ role: 'system' | 'user' | 'assistant';
6
+ content: string;
7
+ }
8
+ /**
9
+ * OpenAI 响应接口
10
+ */
11
+ export interface OpenAIResponse {
12
+ id: string;
13
+ object: string;
14
+ created: number;
15
+ model: string;
16
+ choices: Array<{
17
+ index: number;
18
+ message: {
19
+ role: string;
20
+ content: string;
21
+ };
22
+ finish_reason: string;
23
+ }>;
24
+ usage: {
25
+ prompt_tokens: number;
26
+ completion_tokens: number;
27
+ total_tokens: number;
28
+ };
29
+ }
30
+ /**
31
+ * 使用 OpenAI API 补全消息
32
+ * @param messages 消息数组
33
+ * @param options 可选配置
34
+ * @returns Promise<OpenAIResponse> 返回完整的OpenAI响应
35
+ */
36
+ export declare const completeMessages: (messages: OpenAIMessage[], options?: {
37
+ response_format?: {
38
+ type: "json_object" | "text";
39
+ };
40
+ }) => Promise<OpenAIResponse>;
41
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/services/openai.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAC3B,UAAU,aAAa,EAAE,EACzB,UAAU;IACR,eAAe,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAAA;KAAE,CAAC;CACpD,KACA,OAAO,CAAC,cAAc,CAiDxB,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.completeMessages = void 0;
4
+ /**
5
+ * 使用 OpenAI API 补全消息
6
+ * @param messages 消息数组
7
+ * @param options 可选配置
8
+ * @returns Promise<OpenAIResponse> 返回完整的OpenAI响应
9
+ */
10
+ const completeMessages = async (messages, options) => {
11
+ // 从环境变量读取配置
12
+ const apiKey = process.env.OPENAI_API_KEY || '';
13
+ const baseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';
14
+ const model = process.env.OPENAI_MODEL || 'gpt-3.5-turbo';
15
+ if (!apiKey) {
16
+ throw new Error('OPENAI_API_KEY environment variable is not set');
17
+ }
18
+ try {
19
+ const requestBody = {
20
+ model,
21
+ messages,
22
+ temperature: 0, // 总是设置为 0,提取内容不需要随机性
23
+ // 不设置 max_tokens,让API自动决定
24
+ };
25
+ // 添加可选的response_format
26
+ if (options?.response_format) {
27
+ requestBody.response_format = options.response_format;
28
+ }
29
+ const response = await fetch(`${baseUrl}/chat/completions`, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'Content-Type': 'application/json',
33
+ Authorization: `Bearer ${apiKey}`,
34
+ },
35
+ body: JSON.stringify(requestBody),
36
+ });
37
+ if (!response.ok) {
38
+ const errorText = await response.text();
39
+ throw new Error(`OpenAI API error (${response.status}): ${errorText}`);
40
+ }
41
+ const data = await response.json();
42
+ // 验证响应
43
+ if (!data.choices?.[0]?.message?.content?.trim()) {
44
+ throw new Error('Empty response from OpenAI API');
45
+ }
46
+ return data;
47
+ }
48
+ catch (error) {
49
+ console.error('❌ Failed to call OpenAI API:', error);
50
+ throw error;
51
+ }
52
+ };
53
+ exports.completeMessages = completeMessages;
54
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/services/openai.ts"],"names":[],"mappings":";;;AA+BA;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,KAAK,EACnC,QAAyB,EACzB,OAEC,EACwB,EAAE;IAC3B,YAAY;IACZ,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,2BAA2B,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC;IAE1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAQ;YACvB,KAAK;YACL,QAAQ;YACR,WAAW,EAAE,CAAC,EAAE,qBAAqB;YACrC,0BAA0B;SAC3B,CAAC;QAEF,uBAAuB;QACvB,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;YAC7B,WAAW,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAmB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnD,OAAO;QACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAtDW,QAAA,gBAAgB,oBAsD3B"}
package/dist/types.d.ts CHANGED
@@ -1,33 +1,25 @@
1
+ /**
2
+ * 单个文件的元数据缓存项
3
+ */
4
+ export interface FileMetaData {
5
+ hash: string;
6
+ path: string;
7
+ metadata?: AIMetadata;
8
+ }
9
+ /**
10
+ * .zen/meta.json 文件结构
11
+ */
12
+ export interface MetaDataStore {
13
+ version: string;
14
+ options: BuildOptions;
15
+ files: FileMetaData[];
16
+ }
1
17
  export interface BuildOptions {
2
- srcDir: string;
3
- outDir: string;
4
18
  template?: string;
5
- watch?: boolean;
6
19
  verbose?: boolean;
7
- serve?: boolean;
8
- port?: number;
9
- host?: string;
10
20
  baseUrl?: string;
11
21
  langs?: string[];
12
22
  }
13
- export interface ScannedFile {
14
- path: string;
15
- name: string;
16
- ext: string;
17
- hash?: string;
18
- }
19
- export interface FileInfo {
20
- path: string;
21
- name: string;
22
- ext: string;
23
- content: string;
24
- html?: string;
25
- metadata?: {
26
- title: string;
27
- };
28
- hash?: string;
29
- aiMetadata?: AIMetadata;
30
- }
31
23
  export interface AIMetadata {
32
24
  title: string;
33
25
  summary: string;
@@ -40,47 +32,4 @@ export interface AIMetadata {
40
32
  total: number;
41
33
  };
42
34
  }
43
- export interface NavigationItem {
44
- title: string;
45
- path: string;
46
- children?: NavigationItem[];
47
- }
48
- export interface TemplateData {
49
- title: string;
50
- content: string;
51
- navigation: NavigationItem[];
52
- metadata?: AIMetadata;
53
- currentPath?: string;
54
- lang?: string;
55
- availableLangs?: string[];
56
- }
57
- export interface MarkdownProcessor {
58
- beforeParse?(content: string, fileInfo: FileInfo): string | Promise<string>;
59
- afterParse?(html: string, fileInfo: FileInfo): string | Promise<string>;
60
- }
61
- export interface ZenConfig {
62
- srcDir?: string;
63
- outDir?: string;
64
- template?: string;
65
- baseUrl?: string;
66
- i18n?: {
67
- sourceLang: string;
68
- targetLangs: string[];
69
- apiKey?: string;
70
- };
71
- ai?: {
72
- enabled?: boolean;
73
- model?: string;
74
- temperature?: number;
75
- maxTokens?: number;
76
- };
77
- processors?: MarkdownProcessor[];
78
- includePattern?: string;
79
- excludePattern?: string;
80
- }
81
- export interface MultiLangBuildOptions extends BuildOptions {
82
- langs: string[];
83
- useMetaData?: boolean;
84
- filterOrphans?: boolean;
85
- }
86
35
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 将 Markdown 内容转换为 HTML
3
+ * @param mdContent Markdown 内容字符串
4
+ * @returns 转换后的 HTML 字符串
5
+ */
6
+ export declare const convertMarkdownToHtml: (mdContent: string) => string;
7
+ //# sourceMappingURL=convertMarkdownToHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertMarkdownToHtml.d.ts","sourceRoot":"","sources":["../../src/utils/convertMarkdownToHtml.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,KAAG,MAEzD,CAAC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.convertMarkdownToHtml = void 0;
7
+ const marked_1 = require("marked");
8
+ const highlight_js_1 = __importDefault(require("highlight.js"));
9
+ // 配置 marked 使用 highlight.js 进行代码高亮
10
+ marked_1.marked.setOptions({
11
+ highlight: function (code, lang) {
12
+ if (lang && highlight_js_1.default.getLanguage(lang)) {
13
+ try {
14
+ return highlight_js_1.default.highlight(code, { language: lang }).value;
15
+ }
16
+ catch (err) {
17
+ console.warn(`Failed to highlight code with language ${lang}:`, err);
18
+ }
19
+ }
20
+ return highlight_js_1.default.highlightAuto(code).value;
21
+ },
22
+ pedantic: false,
23
+ gfm: true,
24
+ breaks: false,
25
+ sanitize: false,
26
+ smartLists: true,
27
+ smartypants: false,
28
+ xhtml: false,
29
+ });
30
+ /**
31
+ * 将 Markdown 内容转换为 HTML
32
+ * @param mdContent Markdown 内容字符串
33
+ * @returns 转换后的 HTML 字符串
34
+ */
35
+ const convertMarkdownToHtml = (mdContent) => {
36
+ return marked_1.marked.parse(mdContent);
37
+ };
38
+ exports.convertMarkdownToHtml = convertMarkdownToHtml;
39
+ //# sourceMappingURL=convertMarkdownToHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertMarkdownToHtml.js","sourceRoot":"","sources":["../../src/utils/convertMarkdownToHtml.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAgC;AAChC,gEAAgC;AAEhC,mCAAmC;AACnC,eAAM,CAAC,UAAU,CAAC;IAChB,SAAS,EAAE,UAAU,IAAY,EAAE,IAAY;QAC7C,IAAI,IAAI,IAAI,sBAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,OAAO,sBAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,0CAA0C,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,OAAO,sBAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;IACxC,CAAC;IACD,QAAQ,EAAE,KAAK;IACf,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,KAAK;IAClB,KAAK,EAAE,KAAK;CACN,CAAC,CAAC;AAEV;;;;GAIG;AACI,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAU,EAAE;IACjE,OAAO,eAAM,CAAC,KAAK,CAAC,SAAS,CAAW,CAAC;AAC3C,CAAC,CAAC;AAFW,QAAA,qBAAqB,yBAEhC"}
@@ -0,0 +1,6 @@
1
+ export declare const parseFrontmatter: (content: string) => {
2
+ frontmatter: any;
3
+ body: string;
4
+ };
5
+ export declare const updateFrontmatter: (content: string, newFrontmatter: any) => string;
6
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG;IAAE,WAAW,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CASlF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,gBAAgB,GAAG,KAAG,MAIxE,CAAC"}