czon 0.7.2 → 0.7.4

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.
@@ -57,13 +57,6 @@ async function applyConfig(options) {
57
57
  console.log(`🌐 Target languages: ${options.langs.join(', ')}`);
58
58
  metadata_1.MetaData.options.langs = options.langs;
59
59
  }
60
- if (options.baseUrl !== undefined) {
61
- metadata_1.MetaData.options.baseUrl = options.baseUrl;
62
- }
63
- if (options.siteTitle !== undefined) {
64
- console.log(`🏷️ Site title: ${options.siteTitle}`);
65
- metadata_1.MetaData.options.siteTitle = options.siteTitle;
66
- }
67
60
  }
68
61
  /**
69
62
  * 构建管道(函数组合)
@@ -120,11 +113,11 @@ async function buildPipeline(options) {
120
113
  // 生成 robots.txt
121
114
  await (0, robots_1.generateRobotsTxt)();
122
115
  // 生成 sitemap.xml
123
- if (metadata_1.MetaData.options.baseUrl) {
124
- await (0, sitemap_1.generateSitemap)(metadata_1.MetaData.options.baseUrl);
116
+ if (metadata_1.MetaData.options.site?.baseUrl) {
117
+ await (0, sitemap_1.generateSitemap)(metadata_1.MetaData.options.site.baseUrl);
125
118
  }
126
119
  else {
127
- console.log('ℹ️ Skipping sitemap generation (--baseUrl not provided)');
120
+ console.log('ℹ️ Skipping sitemap generation (site.baseUrl not configured)');
128
121
  }
129
122
  }
130
123
  /**
@@ -105,7 +105,7 @@ Disallow:
105
105
  User-agent: KHTML, like Gecko
106
106
  Disallow:
107
107
 
108
- ${metadata_1.MetaData.options.baseUrl ? `Sitemap: ${path.join(metadata_1.MetaData.options.baseUrl, 'sitemap.xml')}` : ''}
108
+ ${metadata_1.MetaData.options.site?.baseUrl ? `Sitemap: ${path.join(metadata_1.MetaData.options.site.baseUrl, 'sitemap.xml')}` : ''}
109
109
  `;
110
110
  const robotsPath = path.join(paths_1.CZON_DIST_DIR, 'robots.txt');
111
111
  await (0, writeFile_1.writeFile)(robotsPath, robotsTxtContent);
package/dist/cli.js CHANGED
@@ -166,19 +166,11 @@ class BuildCommand extends clipanion_1.Command {
166
166
  this.lang = clipanion_1.Option.Array('--lang', {
167
167
  description: 'Target languages for translation (e.g., en-US, ja-JP)',
168
168
  });
169
- this.baseUrl = clipanion_1.Option.String('--baseUrl', {
170
- description: 'Base URL for sitemap generation (e.g., https://yoursite.com). If not provided, sitemap will not be generated.',
171
- });
172
- this.siteTitle = clipanion_1.Option.String('--siteTitle', {
173
- description: 'Site title to replace "CZON" in the header (e.g., "My Docs")',
174
- });
175
169
  }
176
170
  async execute() {
177
171
  try {
178
172
  await (0, pipeline_1.buildSite)({
179
173
  langs: this.lang,
180
- baseUrl: this.baseUrl,
181
- siteTitle: this.siteTitle,
182
174
  });
183
175
  return 0;
184
176
  }
@@ -198,8 +190,6 @@ BuildCommand.usage = clipanion_1.Command.Usage({
198
190
  Examples:
199
191
  $ czon build
200
192
  $ czon build --lang en-US --lang ja-JP (translate to English and Japanese)
201
- $ czon build --baseUrl https://yoursite.com (generate sitemap.xml)
202
- $ czon build --siteTitle "My Docs" (replace "CZON" in header)
203
193
  `,
204
194
  });
205
195
  // 创建 CLI 应用
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ContentPage = void 0;
7
7
  const node_path_1 = require("node:path");
8
8
  const react_1 = __importDefault(require("react"));
9
+ const Analytics_1 = require("./components/Analytics");
9
10
  const ContentMeta_1 = require("./components/ContentMeta");
10
11
  const CZONFooter_1 = require("./components/CZONFooter");
11
12
  const CZONHeader_1 = require("./components/CZONHeader");
@@ -33,6 +34,7 @@ const ContentPage = props => {
33
34
  react_1.default.createElement("title", null, title),
34
35
  react_1.default.createElement("link", { rel: "icon", href: faviconUrl, type: "image/x-icon" }),
35
36
  react_1.default.createElement("meta", { name: "description", content: `tags: ${tags.join(', ')}` }),
37
+ react_1.default.createElement(Analytics_1.Analytics, { ctx: props.ctx }),
36
38
  react_1.default.createElement("script", { src: (0, resourceMap_1.getResourceUrlFrom)(props.ctx.path, 'tailwindcss.js') }),
37
39
  react_1.default.createElement("style", null, style_1.style),
38
40
  react_1.default.createElement("script", { dangerouslySetInnerHTML: {
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.IndexPage = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const sortBy_1 = require("../utils/sortBy");
9
+ const Analytics_1 = require("./components/Analytics");
9
10
  const ContentMeta_1 = require("./components/ContentMeta");
10
11
  const CZONFooter_1 = require("./components/CZONFooter");
11
12
  const CZONHeader_1 = require("./components/CZONHeader");
@@ -29,6 +30,7 @@ const IndexPage = props => {
29
30
  react_1.default.createElement("link", { rel: "icon", href: faviconUrl, type: "image/x-icon" }),
30
31
  react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
31
32
  react_1.default.createElement("meta", { name: "description", content: `Index page for language ${props.lang}` }),
33
+ react_1.default.createElement(Analytics_1.Analytics, { ctx: props.ctx }),
32
34
  react_1.default.createElement("script", { src: (0, resourceMap_1.getResourceUrlFrom)(props.ctx.path, 'tailwindcss.js') }),
33
35
  react_1.default.createElement("style", null, style_1.style),
34
36
  react_1.default.createElement("script", { dangerouslySetInnerHTML: {
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RootPage = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const languages_1 = require("../languages");
9
+ const Analytics_1 = require("./components/Analytics");
9
10
  const resourceMap_1 = require("./resourceMap");
10
11
  // /index.html 的根页面
11
12
  // 需要实现多语言选择,自动重定向到用户浏览器语言对应的首页
@@ -27,6 +28,7 @@ const RootPage = props => {
27
28
  react_1.default.createElement("title", null, "CZON Multilingual Site Navigator"),
28
29
  react_1.default.createElement("link", { rel: "icon", href: faviconUrl, type: "image/x-icon" }),
29
30
  react_1.default.createElement("meta", { name: "description", content: "Select your preferred language to explore our content." }),
31
+ react_1.default.createElement(Analytics_1.Analytics, { ctx: props.ctx }),
30
32
  props.ctx.site.options.langs.map(lang => (react_1.default.createElement("link", { key: lang, rel: "alternate", hrefLang: lang, href: `${lang}/index.html` }))),
31
33
  react_1.default.createElement("link", { rel: "alternate", hrefLang: "x-default", href: `${props.ctx.site.options.langs[0]}/index.html` }),
32
34
  react_1.default.createElement("script", { dangerouslySetInnerHTML: {
@@ -0,0 +1,40 @@
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.Analytics = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ /**
9
+ * Google Analytics and Microsoft Clarity integration component.
10
+ * Renders tracking scripts in <head> when IDs are configured.
11
+ */
12
+ const Analytics = ({ ctx }) => {
13
+ const gaID = ctx.site.options.site?.gaID;
14
+ const clarityID = ctx.site.options.site?.clarityID;
15
+ if (!gaID && !clarityID) {
16
+ return null;
17
+ }
18
+ return (react_1.default.createElement(react_1.default.Fragment, null,
19
+ gaID && (react_1.default.createElement(react_1.default.Fragment, null,
20
+ react_1.default.createElement("script", { async: true, src: `https://www.googletagmanager.com/gtag/js?id=${gaID}` }),
21
+ react_1.default.createElement("script", { dangerouslySetInnerHTML: {
22
+ __html: `
23
+ window.dataLayer = window.dataLayer || [];
24
+ function gtag(){dataLayer.push(arguments);}
25
+ gtag('js', new Date());
26
+ gtag('config', '${gaID}');
27
+ `,
28
+ } }))),
29
+ clarityID && (react_1.default.createElement("script", { dangerouslySetInnerHTML: {
30
+ __html: `
31
+ (function(c,l,a,r,i,t,y){
32
+ c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
33
+ t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
34
+ y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
35
+ })(window, document, "clarity", "script", "${clarityID}");
36
+ `,
37
+ } }))));
38
+ };
39
+ exports.Analytics = Analytics;
40
+ //# sourceMappingURL=Analytics.js.map
@@ -10,7 +10,7 @@ const LanguageSwitch_1 = require("./LanguageSwitch");
10
10
  const CZONHeader = props => {
11
11
  return (react_1.default.createElement("header", { className: "czon-header py-4 border-b flex justify-between items-center px-6" },
12
12
  react_1.default.createElement("h1", { className: "text-2xl font-bold" },
13
- react_1.default.createElement("a", { href: "index.html" }, props.ctx.site.options.siteTitle ?? 'CZON')),
13
+ react_1.default.createElement("a", { href: "index.html" }, props.ctx.site.options.site?.title ?? 'CZON')),
14
14
  react_1.default.createElement("div", { className: "flex items-center gap-4" },
15
15
  react_1.default.createElement(DarkModeSwitch_1.DarkModeSwitch, null),
16
16
  props.lang && react_1.default.createElement(LanguageSwitch_1.LanguageSwitch, { ctx: props.ctx, lang: props.lang, file: props.file }))));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "czon",
3
- "version": "0.7.2",
3
+ "version": "0.7.4",
4
4
  "description": "CZON - AI enhanced Markdown content engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",