diff --git a/packages/tdesign-miniprogram/example/pages/home/home.wxml b/packages/tdesign-miniprogram/example/pages/home/home.wxml
index 9697d79c7..1553c88eb 100644
--- a/packages/tdesign-miniprogram/example/pages/home/home.wxml
+++ b/packages/tdesign-miniprogram/example/pages/home/home.wxml
@@ -1,4 +1,4 @@
-
+
-
-
+
+
@@ -55,7 +55,7 @@ export default defineComponent({
mounted() {
this.docType = this.$route.meta.docType;
- this.$refs.tdDocSearch.docsearchInfo = { indexName: 'tdesign_doc_vue_mobile' };
+ // this.$refs.tdDocSearch.docsearchInfo = { indexName: 'tdesign_doc_vue_mobile' };
this.$refs.tdDocAside.routerList = docsMap[this.$route?.meta?.lang || 'zh'];
this.$refs.tdDocAside.onchange = ({ detail }) => {
if (this.$route.path === detail) return;
@@ -90,7 +90,7 @@ export default defineComponent({
this.version = options[0].value;
}
- this.$refs.tdSelect.options = options;
+ // this.$refs.tdSelect.options = options;
});
},
initThemeGenerator() {
diff --git a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/components.ts b/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/components.ts
deleted file mode 100644
index cd019ed10..000000000
--- a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/components.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-/**
- * 不符合帕斯卡命名规范的组件映射
- */
-export const NON_PASCAL_CASE_NAMES: Record = {
- qrcode: 'QRCode',
-};
-
-export const WEB_COMPONENT_MAP: Record = {
- affix: ['Affix'],
- alert: ['Alert'],
- anchor: ['Anchor', 'AnchorItem', 'AnchorTarget'],
- 'auto-complete': ['AutoComplete', 'HighlightOption'],
- avatar: ['Avatar', 'AvatarGroup'],
- 'back-top': ['BackTop'],
- badge: ['Badge'],
- breadcrumb: ['Breadcrumb', 'BreadcrumbItem'],
- button: ['Button'],
- calendar: ['Calendar'],
- card: ['Card'],
- cascader: ['Cascader', 'CascaderPanel'],
- checkbox: ['Checkbox', 'CheckboxGroup'],
- collapse: ['Collapse', 'CollapsePanel'],
- 'color-picker': ['ColorPicker', 'ColorPickerPanel'],
- comment: ['Comment'],
- 'config-provider': ['ConfigProvider'],
- 'date-picker': [
- 'DatePicker',
- 'DatePickerPanel',
- 'DateRangePicker',
- 'DateRangePickerPanel',
- ],
- descriptions: ['Descriptions', 'DescriptionsItem'],
- dialog: ['Dialog', 'DialogPlugin'],
- divider: ['Divider'],
- drawer: ['Drawer', 'DrawerPlugin'],
- dropdown: ['Dropdown', 'DropdownItem', 'DropdownMenu'],
- empty: ['Empty'],
- form: ['Form', 'FormItem', 'FormList'],
- grid: ['Row', 'Col'],
- guide: ['Guide'],
- icon: ['Icon'],
- image: ['Image'],
- 'image-viewer': ['ImageViewer'],
- input: ['Input', 'InputGroup'],
- 'input-adornment': ['InputAdornment'],
- 'input-number': ['InputNumber'],
- layout: ['Layout', 'Aside', 'Content', 'Footer', 'Header'],
- link: ['Link'],
- list: ['List', 'ListItem', 'ListItemMeta'],
- loading: ['Loading', 'LoadingPlugin'],
- menu: ['Menu', 'MenuGroup', 'MenuItem', 'HeadMenu', 'Submenu'],
- message: ['Message', 'MessagePlugin'],
- notification: ['Notification', 'NotifyPlugin'],
- pagination: ['Pagination', 'PaginationMini'],
- popconfirm: ['Popconfirm'],
- popup: ['Popup'],
- progress: ['Progress'],
- qrcode: ['QRCode'],
- radio: ['Radio', 'RadioButton', 'RadioGroup'],
- 'range-input': ['RangeInput', 'RangeInputPopup'],
- rate: ['Rate'],
- select: ['Select', 'Option', 'OptionGroup'],
- 'select-input': ['SelectInput'],
- skeleton: ['Skeleton'],
- slider: ['Slider', 'SliderButton'],
- space: ['Space'],
- statistic: ['Statistic'],
- steps: ['Steps', 'StepItem'],
- 'sticky-tool': ['StickyTool', 'StickyItem'],
- switch: ['Switch'],
- swiper: ['Swiper', 'SwiperItem'],
- table: ['Table', 'BaseTable', 'EnhancedTable', 'PrimaryTable'],
- tabs: ['Tabs', 'TabPanel'],
- tag: ['Tag', 'CheckTag', 'CheckTagGroup'],
- 'tag-input': ['TagInput'],
- textarea: ['Textarea'],
- 'time-picker': ['TimePicker', 'TimePickerPanel', 'TimeRangePicker'],
- timeline: ['Timeline', 'TimelineItem'],
- tooltip: ['Tooltip', 'TooltipLite'],
- transfer: ['Transfer'],
- tree: ['Tree'],
- 'tree-select': ['TreeSelect'],
- typography: ['Typography', 'Text', 'Title', 'Paragraph'],
- upload: ['Upload'],
- watermark: ['Watermark'],
-};
-
-export const MOBILE_COMPONENT_MAP: Record = {
- 'action-sheet': ['ActionSheet'],
- avatar: ['Avatar', 'AvatarGroup'],
- 'back-top': ['BackTop'],
- badge: ['Badge'],
- button: ['Button'],
- calendar: ['Calendar'],
- cascader: ['Cascader'],
- cell: ['Cell', 'CellGroup'],
- checkbox: ['Checkbox', 'CheckboxGroup'],
- collapse: ['Collapse', 'CollapsePanel'],
- 'color-picker': ['ColorPicker'],
- 'config-provider': ['ConfigProvider'],
- 'count-down': ['CountDown'],
- 'date-time-picker': ['DateTimePicker'],
- dialog: ['Dialog', 'DialogPlugin'],
- divider: ['Divider'],
- drawer: ['Drawer'],
- 'dropdown-menu': ['DropdownMenu', 'DropdownItem'],
- empty: ['Empty'],
- fab: ['Fab'],
- footer: ['Footer'],
- form: ['Form', 'FormItem'],
- grid: ['Grid', 'GridItem'],
- guide: ['Guide'],
- icon: ['Icon'],
- image: ['Image'],
- 'image-viewer': ['ImageViewer'],
- indexes: ['Indexes', 'IndexesAnchor'],
- input: ['Input'],
- layout: ['Row', 'Col'],
- link: ['Link'],
- list: ['List'],
- loading: ['Loading', 'LoadingPlugin'],
- message: ['Message', 'MessagePlugin'],
- navbar: ['Navbar'],
- 'notice-bar': ['NoticeBar'],
- overlay: ['Overlay'],
- picker: ['Picker'],
- popover: ['Popover'],
- popup: ['Popup'],
- progress: ['Progress'],
- 'pull-down-refresh': ['PullDownRefresh'],
- qrcode: ['QRCode'],
- radio: ['Radio', 'RadioGroup'],
- rate: ['Rate'],
- result: ['Result'],
- search: ['Search'],
- 'side-bar': ['SideBar', 'SideBarItem'],
- skeleton: ['Skeleton'],
- slider: ['Slider'],
- stepper: ['Stepper'],
- steps: ['Steps', 'StepItem'],
- sticky: ['Sticky'],
- 'swipe-cell': ['SwipeCell'],
- swiper: ['Swiper', 'SwiperItem'],
- switch: ['Switch'],
- 'tab-bar': ['TabBar', 'TabBarItem'],
- table: ['Table'],
- tabs: ['Tabs', 'TabPanel'],
- tag: ['Tag', 'CheckTag'],
- textarea: ['Textarea'],
- toast: ['Toast'],
- 'tree-select': ['TreeSelect'],
- upload: ['Upload'],
-};
-
-export const CHAT_COMPONENT_MAP: Record = {
- chat: [
- 'Chat',
- 'ChatItem',
- 'ChatInput',
- 'ChatContent',
- 'ChatReasoning',
- 'ChatAction',
- 'ChatLoading',
- 'ChatSender',
- ],
-};
diff --git a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/index.ts b/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/index.ts
deleted file mode 100644
index 7c9123287..000000000
--- a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/index.ts
+++ /dev/null
@@ -1,194 +0,0 @@
-/* eslint-disable no-console */
-/* eslint-disable no-use-before-define */
-import { promises } from 'fs';
-import { mapToParentName } from './libs';
-import type { ComponentLog, ComponentLogMap, LogItem, Logs, LogType, Platform, VersionLog } from './types';
-
-export const LOG_TYPES = ['🚨 Breaking Changes', '🚀 Features', '🐞 Bug Fixes'] as const;
-
-let targetPlatform: Platform = 'web';
-
-export default async function generateChangelogJson(changelogPath: string, platform: Platform) {
- try {
- const logMd = await promises.readFile(changelogPath, 'utf-8');
- targetPlatform = platform;
- const detailedLogs = parseMd2Json(logMd);
- const compMap = formatJson2CompMap(detailedLogs);
- console.log('\x1b[32m%s\x1b[0m', '✅ Sync CHANGELOG.md to changelog.json');
- return compMap;
- } catch (error) {
- console.error('\x1b[31m%s\x1b[0m', '❌ Fail to generate changelog.json', '\x1b[33m', error);
- return {};
- }
-}
-
-/**
- * 将整份 Markdown 先根据版本号拆分
- */
-function parseMd2Json(logMd: string) {
- const headerRegex = /^\s*##\s*🌈\s*(\d+\.\d+\.\d+)\s+`(\d{4}-\d{2}-\d{2})`\s*$/gm;
- const matches = Array.from(logMd.matchAll(headerRegex));
-
- const logs = matches.map((match, i) => {
- const version = match[1];
- const date = match[2];
-
- const start = match.index + match[0].length;
- const end = i < matches.length - 1 ? matches[i + 1].index : logMd.length;
- const log = logMd.slice(start, end).trim();
-
- return {
- version,
- date,
- log: parseLogByType(log),
- };
- });
-
- return logs;
-}
-
-/**
- * 进一步根据指定的变更类型拆分
- */
-function parseLogByType(logBlock: string) {
- const logs: Logs = {};
-
- LOG_TYPES.forEach((type) => {
- const typeRegex = new RegExp(`### ${type}\\r?\\n([\\s\\S]+?)(?=### |$)`, 'g');
- const matches = Array.from(logBlock.matchAll(typeRegex));
-
- if (matches.length > 0) {
- const logBlock = matches.map((match) => match[1]).join('\n');
- const entries = extractLogEntries(logBlock);
- logs[type] = groupLogByComponent(entries);
- }
- });
-
- return logs;
-}
-
-/**
- * 获取每种变更类型里面的每一段日志
- * - case 1: 单独一行 -> 作为一条
- * - case 2: 存在父子列表 -> 使用换行符,合并为一条
- */
-function extractLogEntries(logBlock: string) {
- const lines = logBlock.split('\n').filter((line) => line.trim() !== '');
- const logs: string[] = [];
-
- let currEntry = '';
- for (let i = 0; i < lines.length; i++) {
- const line = lines[i].trim();
-
- // 跳过空行
- if (!line) continue;
-
- // 是否为子项(短横线前面有空格)
- const isChildEntry = /^\s+-/.test(lines[i]);
-
- // 是否为父项(直接以短横线开头)
- const isParentEntry = line.startsWith('-') && !isChildEntry;
-
- if (isParentEntry) {
- // 如果是父项,保存之前的日志
- if (currEntry) {
- logs.push(currEntry.trim());
- }
- // 开始新项,去掉开头的 -
- currEntry = line.substring(1).trim();
- } else if (isChildEntry) {
- // 如果是子项,添加到当前项中
- const childContent = line.replace(/^\s*-\s*/, '').trim();
- currEntry += `\n${childContent}`;
- }
- }
-
- // 处理最后一项
- logs.push(currEntry.trim());
- return logs;
-}
-
-/**
- * 根据每一条日志提及的组件名,将其归类
- */
-function groupLogByComponent(entries: string[]) {
- const logs: LogItem[] = [];
-
- entries.forEach((entry) => {
- const nameRegex = /`([^`]+)`:/;
- const match = entry.match(nameRegex);
- if (!match) return;
-
- const rawName = match[1];
- const compName = mapToParentName(rawName, targetPlatform);
- if (!compName) return;
-
- // 当前日志为父组件,去掉前缀
- if (rawName === compName) {
- const logWithoutPrefix = entry.replace(nameRegex, '').trim();
- const lines = logWithoutPrefix.split('\n').map((line) => line.trim());
- const isGroupedLog = lines[0].startsWith('@');
- // 首行存在 @用户名 -> 同一个PR
- if (isGroupedLog) {
- // 整体插入,渲染为列表
- logs.push({ component: compName, description: logWithoutPrefix });
- } else {
- // 每一行渲染为单独的日志项
- lines.forEach((line) => {
- logs.push({ component: compName, description: line });
- });
- }
- } else {
- // 子组件保留前缀,且整体插入
- logs.push({ component: compName, description: entry });
- }
- });
-
- return logs;
-}
-
-/**
- * 将解析后的日志 JSON 转换为以组件名作为 key 的映射格式
- */
-function formatJson2CompMap(logJson: VersionLog[]) {
- const compMap: ComponentLogMap = {};
-
- logJson.forEach((entry) => {
- const { version, date, log } = entry;
-
- (Object.keys(log) as LogType[]).forEach((type) => {
- log[type]?.forEach((item: LogItem) => {
- const { component, description } = item;
-
- if (!compMap[component]) {
- compMap[component] = [];
- }
-
- // 查找当前组件的版本记录
- let versionEntry = compMap[component].find(
- (v) => v.version === version
- );
-
- if (!versionEntry) {
- versionEntry = {
- version,
- date,
- } as ComponentLog;
- compMap[component].push(versionEntry);
- }
-
- if (!versionEntry[type]) {
- versionEntry[type] = [];
- }
- versionEntry[type].push(description);
- });
- });
- });
-
- // 按组件名字母顺序排序
- const sortedCompMap = Object.keys(compMap)
- .sort((a, b) => a.localeCompare(b))
- .reduce((acc, key) => ({ ...acc, [key]: compMap[key] }), {});
-
- return sortedCompMap as ComponentLogMap;
-}
diff --git a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/libs.ts b/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/libs.ts
deleted file mode 100644
index a40ccb1e9..000000000
--- a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/libs.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { MOBILE_COMPONENT_MAP, NON_PASCAL_CASE_NAMES, WEB_COMPONENT_MAP } from './components';
-import type { Platform } from './types';
-
-export const convert2PascalCase = (name: string) => name
- .split('-')
- .map(part => part.charAt(0).toUpperCase() + part.slice(1))
- .join('');
-
-export const COMPONENT_MAPS = {
- web: WEB_COMPONENT_MAP,
- mobile: MOBILE_COMPONENT_MAP,
-};
-
-export const mapToParentName = (name: string, platform: Platform) => {
- const targetMap = COMPONENT_MAPS[platform];
-
- const found = Object.entries(targetMap).find(([_, values]) => values.includes(name));
-
- // 返回父组件名
- if (found) return NON_PASCAL_CASE_NAMES[found[0]] || convert2PascalCase(found[0]);
-
- return null;
-};
diff --git a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/types.ts b/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/types.ts
deleted file mode 100644
index f7ec876be..000000000
--- a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json-core/types.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { LOG_TYPES } from '.';
-
-export type Platform = 'web' | 'mobile';
-
-export type LogType = typeof LOG_TYPES[number];
-
-type LogMetadata = {
- version: string;
- date: string;
-};
-
-export type LogItem = {
- component: string;
- description: string;
-};
-
-export type Logs = {
- [K in LogType]?: LogItem[];
-};
-
-export type VersionLog = LogMetadata & {
- log: Logs;
-};
-
-export type ComponentLog = LogMetadata & {
- [K in LogType]?: string[];
-};
-
-export type ComponentLogMap = Record;
diff --git a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json/index.js b/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json/index.js
index 5e48e3d9a..f606eaf5e 100644
--- a/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json/index.js
+++ b/packages/tdesign-uniapp-chat/site/web/plugins/changelog-to-json/index.js
@@ -1,9 +1,9 @@
import { promises } from 'fs';
import path from 'path';
-import generateChangelogJson from '../changelog-to-json-core';
+import generateChangelogJson from '../../../../../common/docs/plugins/changelog-to-json';
-const outputPath = path.resolve(__dirname, '../../../../_site/changelog.json');
+const outputPath = path.resolve(__dirname, '../../../dist/changelog.json');
const changelogPath = path.resolve(__dirname, '../../../../CHANGELOG.md');
export default function changelog2Json() {
@@ -16,7 +16,7 @@ export default function changelog2Json() {
configureServer(server) {
// 开发模式时拦截请求
server.middlewares.use('/changelog.json', async (_, res) => {
- const json = await generateChangelogJson(changelogPath, 'mobile');
+ const json = await generateChangelogJson(changelogPath, 'chat');
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify(json));
});
@@ -24,7 +24,7 @@ export default function changelog2Json() {
async closeBundle() {
// 生产构建时写入物理文件
if (config.env.PROD || config.env.MODE === 'preview') {
- const json = await generateChangelogJson(changelogPath, 'mobile');
+ const json = await generateChangelogJson(changelogPath, 'chat');
await promises.writeFile(outputPath, JSON.stringify(json));
}
},
diff --git a/packages/tdesign-uniapp-chat/site/web/plugins/plugin-tdoc/md-to-vue.js b/packages/tdesign-uniapp-chat/site/web/plugins/plugin-tdoc/md-to-vue.js
index 22fd1911b..9f25cf767 100644
--- a/packages/tdesign-uniapp-chat/site/web/plugins/plugin-tdoc/md-to-vue.js
+++ b/packages/tdesign-uniapp-chat/site/web/plugins/plugin-tdoc/md-to-vue.js
@@ -46,6 +46,8 @@ export default function mdToVue(options) {
slot="doc-header"
ref="tdDocHeader"
platform="mobile"
+ changelog="false"
+ changelogEn="false"
spline="${mdSegment.spline}"
component-name="${mdSegment.isComponent ? mdSegment.componentName : ''}"
>
diff --git a/packages/tdesign-uniapp/site/web/app.vue b/packages/tdesign-uniapp/site/web/app.vue
index 489f5b42e..64d67d140 100644
--- a/packages/tdesign-uniapp/site/web/app.vue
+++ b/packages/tdesign-uniapp/site/web/app.vue
@@ -1,8 +1,8 @@
-
-
+
+
@@ -55,7 +55,7 @@ export default defineComponent({
mounted() {
this.docType = this.$route.meta.docType;
- this.$refs.tdDocSearch.docsearchInfo = { indexName: 'tdesign_doc_vue_mobile' };
+ // this.$refs.tdDocSearch.docsearchInfo = { indexName: 'tdesign_doc_vue_mobile' };
this.$refs.tdDocAside.routerList = docsMap[this.$route?.meta?.lang || 'zh'];
this.$refs.tdDocAside.onchange = ({ detail }) => {
if (this.$route.path === detail) return;
@@ -90,7 +90,7 @@ export default defineComponent({
this.version = options[0].value;
}
- this.$refs.tdSelect.options = options;
+ // this.$refs.tdSelect.options = options;
});
},
initThemeGenerator() {
diff --git a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/components.ts b/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/components.ts
deleted file mode 100644
index cd019ed10..000000000
--- a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/components.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-/**
- * 不符合帕斯卡命名规范的组件映射
- */
-export const NON_PASCAL_CASE_NAMES: Record = {
- qrcode: 'QRCode',
-};
-
-export const WEB_COMPONENT_MAP: Record = {
- affix: ['Affix'],
- alert: ['Alert'],
- anchor: ['Anchor', 'AnchorItem', 'AnchorTarget'],
- 'auto-complete': ['AutoComplete', 'HighlightOption'],
- avatar: ['Avatar', 'AvatarGroup'],
- 'back-top': ['BackTop'],
- badge: ['Badge'],
- breadcrumb: ['Breadcrumb', 'BreadcrumbItem'],
- button: ['Button'],
- calendar: ['Calendar'],
- card: ['Card'],
- cascader: ['Cascader', 'CascaderPanel'],
- checkbox: ['Checkbox', 'CheckboxGroup'],
- collapse: ['Collapse', 'CollapsePanel'],
- 'color-picker': ['ColorPicker', 'ColorPickerPanel'],
- comment: ['Comment'],
- 'config-provider': ['ConfigProvider'],
- 'date-picker': [
- 'DatePicker',
- 'DatePickerPanel',
- 'DateRangePicker',
- 'DateRangePickerPanel',
- ],
- descriptions: ['Descriptions', 'DescriptionsItem'],
- dialog: ['Dialog', 'DialogPlugin'],
- divider: ['Divider'],
- drawer: ['Drawer', 'DrawerPlugin'],
- dropdown: ['Dropdown', 'DropdownItem', 'DropdownMenu'],
- empty: ['Empty'],
- form: ['Form', 'FormItem', 'FormList'],
- grid: ['Row', 'Col'],
- guide: ['Guide'],
- icon: ['Icon'],
- image: ['Image'],
- 'image-viewer': ['ImageViewer'],
- input: ['Input', 'InputGroup'],
- 'input-adornment': ['InputAdornment'],
- 'input-number': ['InputNumber'],
- layout: ['Layout', 'Aside', 'Content', 'Footer', 'Header'],
- link: ['Link'],
- list: ['List', 'ListItem', 'ListItemMeta'],
- loading: ['Loading', 'LoadingPlugin'],
- menu: ['Menu', 'MenuGroup', 'MenuItem', 'HeadMenu', 'Submenu'],
- message: ['Message', 'MessagePlugin'],
- notification: ['Notification', 'NotifyPlugin'],
- pagination: ['Pagination', 'PaginationMini'],
- popconfirm: ['Popconfirm'],
- popup: ['Popup'],
- progress: ['Progress'],
- qrcode: ['QRCode'],
- radio: ['Radio', 'RadioButton', 'RadioGroup'],
- 'range-input': ['RangeInput', 'RangeInputPopup'],
- rate: ['Rate'],
- select: ['Select', 'Option', 'OptionGroup'],
- 'select-input': ['SelectInput'],
- skeleton: ['Skeleton'],
- slider: ['Slider', 'SliderButton'],
- space: ['Space'],
- statistic: ['Statistic'],
- steps: ['Steps', 'StepItem'],
- 'sticky-tool': ['StickyTool', 'StickyItem'],
- switch: ['Switch'],
- swiper: ['Swiper', 'SwiperItem'],
- table: ['Table', 'BaseTable', 'EnhancedTable', 'PrimaryTable'],
- tabs: ['Tabs', 'TabPanel'],
- tag: ['Tag', 'CheckTag', 'CheckTagGroup'],
- 'tag-input': ['TagInput'],
- textarea: ['Textarea'],
- 'time-picker': ['TimePicker', 'TimePickerPanel', 'TimeRangePicker'],
- timeline: ['Timeline', 'TimelineItem'],
- tooltip: ['Tooltip', 'TooltipLite'],
- transfer: ['Transfer'],
- tree: ['Tree'],
- 'tree-select': ['TreeSelect'],
- typography: ['Typography', 'Text', 'Title', 'Paragraph'],
- upload: ['Upload'],
- watermark: ['Watermark'],
-};
-
-export const MOBILE_COMPONENT_MAP: Record = {
- 'action-sheet': ['ActionSheet'],
- avatar: ['Avatar', 'AvatarGroup'],
- 'back-top': ['BackTop'],
- badge: ['Badge'],
- button: ['Button'],
- calendar: ['Calendar'],
- cascader: ['Cascader'],
- cell: ['Cell', 'CellGroup'],
- checkbox: ['Checkbox', 'CheckboxGroup'],
- collapse: ['Collapse', 'CollapsePanel'],
- 'color-picker': ['ColorPicker'],
- 'config-provider': ['ConfigProvider'],
- 'count-down': ['CountDown'],
- 'date-time-picker': ['DateTimePicker'],
- dialog: ['Dialog', 'DialogPlugin'],
- divider: ['Divider'],
- drawer: ['Drawer'],
- 'dropdown-menu': ['DropdownMenu', 'DropdownItem'],
- empty: ['Empty'],
- fab: ['Fab'],
- footer: ['Footer'],
- form: ['Form', 'FormItem'],
- grid: ['Grid', 'GridItem'],
- guide: ['Guide'],
- icon: ['Icon'],
- image: ['Image'],
- 'image-viewer': ['ImageViewer'],
- indexes: ['Indexes', 'IndexesAnchor'],
- input: ['Input'],
- layout: ['Row', 'Col'],
- link: ['Link'],
- list: ['List'],
- loading: ['Loading', 'LoadingPlugin'],
- message: ['Message', 'MessagePlugin'],
- navbar: ['Navbar'],
- 'notice-bar': ['NoticeBar'],
- overlay: ['Overlay'],
- picker: ['Picker'],
- popover: ['Popover'],
- popup: ['Popup'],
- progress: ['Progress'],
- 'pull-down-refresh': ['PullDownRefresh'],
- qrcode: ['QRCode'],
- radio: ['Radio', 'RadioGroup'],
- rate: ['Rate'],
- result: ['Result'],
- search: ['Search'],
- 'side-bar': ['SideBar', 'SideBarItem'],
- skeleton: ['Skeleton'],
- slider: ['Slider'],
- stepper: ['Stepper'],
- steps: ['Steps', 'StepItem'],
- sticky: ['Sticky'],
- 'swipe-cell': ['SwipeCell'],
- swiper: ['Swiper', 'SwiperItem'],
- switch: ['Switch'],
- 'tab-bar': ['TabBar', 'TabBarItem'],
- table: ['Table'],
- tabs: ['Tabs', 'TabPanel'],
- tag: ['Tag', 'CheckTag'],
- textarea: ['Textarea'],
- toast: ['Toast'],
- 'tree-select': ['TreeSelect'],
- upload: ['Upload'],
-};
-
-export const CHAT_COMPONENT_MAP: Record = {
- chat: [
- 'Chat',
- 'ChatItem',
- 'ChatInput',
- 'ChatContent',
- 'ChatReasoning',
- 'ChatAction',
- 'ChatLoading',
- 'ChatSender',
- ],
-};
diff --git a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/index.ts b/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/index.ts
deleted file mode 100644
index 7c9123287..000000000
--- a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/index.ts
+++ /dev/null
@@ -1,194 +0,0 @@
-/* eslint-disable no-console */
-/* eslint-disable no-use-before-define */
-import { promises } from 'fs';
-import { mapToParentName } from './libs';
-import type { ComponentLog, ComponentLogMap, LogItem, Logs, LogType, Platform, VersionLog } from './types';
-
-export const LOG_TYPES = ['🚨 Breaking Changes', '🚀 Features', '🐞 Bug Fixes'] as const;
-
-let targetPlatform: Platform = 'web';
-
-export default async function generateChangelogJson(changelogPath: string, platform: Platform) {
- try {
- const logMd = await promises.readFile(changelogPath, 'utf-8');
- targetPlatform = platform;
- const detailedLogs = parseMd2Json(logMd);
- const compMap = formatJson2CompMap(detailedLogs);
- console.log('\x1b[32m%s\x1b[0m', '✅ Sync CHANGELOG.md to changelog.json');
- return compMap;
- } catch (error) {
- console.error('\x1b[31m%s\x1b[0m', '❌ Fail to generate changelog.json', '\x1b[33m', error);
- return {};
- }
-}
-
-/**
- * 将整份 Markdown 先根据版本号拆分
- */
-function parseMd2Json(logMd: string) {
- const headerRegex = /^\s*##\s*🌈\s*(\d+\.\d+\.\d+)\s+`(\d{4}-\d{2}-\d{2})`\s*$/gm;
- const matches = Array.from(logMd.matchAll(headerRegex));
-
- const logs = matches.map((match, i) => {
- const version = match[1];
- const date = match[2];
-
- const start = match.index + match[0].length;
- const end = i < matches.length - 1 ? matches[i + 1].index : logMd.length;
- const log = logMd.slice(start, end).trim();
-
- return {
- version,
- date,
- log: parseLogByType(log),
- };
- });
-
- return logs;
-}
-
-/**
- * 进一步根据指定的变更类型拆分
- */
-function parseLogByType(logBlock: string) {
- const logs: Logs = {};
-
- LOG_TYPES.forEach((type) => {
- const typeRegex = new RegExp(`### ${type}\\r?\\n([\\s\\S]+?)(?=### |$)`, 'g');
- const matches = Array.from(logBlock.matchAll(typeRegex));
-
- if (matches.length > 0) {
- const logBlock = matches.map((match) => match[1]).join('\n');
- const entries = extractLogEntries(logBlock);
- logs[type] = groupLogByComponent(entries);
- }
- });
-
- return logs;
-}
-
-/**
- * 获取每种变更类型里面的每一段日志
- * - case 1: 单独一行 -> 作为一条
- * - case 2: 存在父子列表 -> 使用换行符,合并为一条
- */
-function extractLogEntries(logBlock: string) {
- const lines = logBlock.split('\n').filter((line) => line.trim() !== '');
- const logs: string[] = [];
-
- let currEntry = '';
- for (let i = 0; i < lines.length; i++) {
- const line = lines[i].trim();
-
- // 跳过空行
- if (!line) continue;
-
- // 是否为子项(短横线前面有空格)
- const isChildEntry = /^\s+-/.test(lines[i]);
-
- // 是否为父项(直接以短横线开头)
- const isParentEntry = line.startsWith('-') && !isChildEntry;
-
- if (isParentEntry) {
- // 如果是父项,保存之前的日志
- if (currEntry) {
- logs.push(currEntry.trim());
- }
- // 开始新项,去掉开头的 -
- currEntry = line.substring(1).trim();
- } else if (isChildEntry) {
- // 如果是子项,添加到当前项中
- const childContent = line.replace(/^\s*-\s*/, '').trim();
- currEntry += `\n${childContent}`;
- }
- }
-
- // 处理最后一项
- logs.push(currEntry.trim());
- return logs;
-}
-
-/**
- * 根据每一条日志提及的组件名,将其归类
- */
-function groupLogByComponent(entries: string[]) {
- const logs: LogItem[] = [];
-
- entries.forEach((entry) => {
- const nameRegex = /`([^`]+)`:/;
- const match = entry.match(nameRegex);
- if (!match) return;
-
- const rawName = match[1];
- const compName = mapToParentName(rawName, targetPlatform);
- if (!compName) return;
-
- // 当前日志为父组件,去掉前缀
- if (rawName === compName) {
- const logWithoutPrefix = entry.replace(nameRegex, '').trim();
- const lines = logWithoutPrefix.split('\n').map((line) => line.trim());
- const isGroupedLog = lines[0].startsWith('@');
- // 首行存在 @用户名 -> 同一个PR
- if (isGroupedLog) {
- // 整体插入,渲染为列表
- logs.push({ component: compName, description: logWithoutPrefix });
- } else {
- // 每一行渲染为单独的日志项
- lines.forEach((line) => {
- logs.push({ component: compName, description: line });
- });
- }
- } else {
- // 子组件保留前缀,且整体插入
- logs.push({ component: compName, description: entry });
- }
- });
-
- return logs;
-}
-
-/**
- * 将解析后的日志 JSON 转换为以组件名作为 key 的映射格式
- */
-function formatJson2CompMap(logJson: VersionLog[]) {
- const compMap: ComponentLogMap = {};
-
- logJson.forEach((entry) => {
- const { version, date, log } = entry;
-
- (Object.keys(log) as LogType[]).forEach((type) => {
- log[type]?.forEach((item: LogItem) => {
- const { component, description } = item;
-
- if (!compMap[component]) {
- compMap[component] = [];
- }
-
- // 查找当前组件的版本记录
- let versionEntry = compMap[component].find(
- (v) => v.version === version
- );
-
- if (!versionEntry) {
- versionEntry = {
- version,
- date,
- } as ComponentLog;
- compMap[component].push(versionEntry);
- }
-
- if (!versionEntry[type]) {
- versionEntry[type] = [];
- }
- versionEntry[type].push(description);
- });
- });
- });
-
- // 按组件名字母顺序排序
- const sortedCompMap = Object.keys(compMap)
- .sort((a, b) => a.localeCompare(b))
- .reduce((acc, key) => ({ ...acc, [key]: compMap[key] }), {});
-
- return sortedCompMap as ComponentLogMap;
-}
diff --git a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/libs.ts b/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/libs.ts
deleted file mode 100644
index a40ccb1e9..000000000
--- a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/libs.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { MOBILE_COMPONENT_MAP, NON_PASCAL_CASE_NAMES, WEB_COMPONENT_MAP } from './components';
-import type { Platform } from './types';
-
-export const convert2PascalCase = (name: string) => name
- .split('-')
- .map(part => part.charAt(0).toUpperCase() + part.slice(1))
- .join('');
-
-export const COMPONENT_MAPS = {
- web: WEB_COMPONENT_MAP,
- mobile: MOBILE_COMPONENT_MAP,
-};
-
-export const mapToParentName = (name: string, platform: Platform) => {
- const targetMap = COMPONENT_MAPS[platform];
-
- const found = Object.entries(targetMap).find(([_, values]) => values.includes(name));
-
- // 返回父组件名
- if (found) return NON_PASCAL_CASE_NAMES[found[0]] || convert2PascalCase(found[0]);
-
- return null;
-};
diff --git a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/types.ts b/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/types.ts
deleted file mode 100644
index f7ec876be..000000000
--- a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json-core/types.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { LOG_TYPES } from '.';
-
-export type Platform = 'web' | 'mobile';
-
-export type LogType = typeof LOG_TYPES[number];
-
-type LogMetadata = {
- version: string;
- date: string;
-};
-
-export type LogItem = {
- component: string;
- description: string;
-};
-
-export type Logs = {
- [K in LogType]?: LogItem[];
-};
-
-export type VersionLog = LogMetadata & {
- log: Logs;
-};
-
-export type ComponentLog = LogMetadata & {
- [K in LogType]?: string[];
-};
-
-export type ComponentLogMap = Record;
diff --git a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json/index.js b/packages/tdesign-uniapp/site/web/plugins/changelog-to-json/index.js
index 5e48e3d9a..29367ae9d 100644
--- a/packages/tdesign-uniapp/site/web/plugins/changelog-to-json/index.js
+++ b/packages/tdesign-uniapp/site/web/plugins/changelog-to-json/index.js
@@ -1,9 +1,9 @@
import { promises } from 'fs';
import path from 'path';
-import generateChangelogJson from '../changelog-to-json-core';
+import generateChangelogJson from '../../../../../common/docs/plugins/changelog-to-json';
-const outputPath = path.resolve(__dirname, '../../../../_site/changelog.json');
+const outputPath = path.resolve(__dirname, '../../../dist/changelog.json');
const changelogPath = path.resolve(__dirname, '../../../../CHANGELOG.md');
export default function changelog2Json() {
diff --git a/packages/tdesign-uniapp/site/web/plugins/plugin-tdoc/md-to-vue.js b/packages/tdesign-uniapp/site/web/plugins/plugin-tdoc/md-to-vue.js
index bdd3d70bb..a0ba11627 100644
--- a/packages/tdesign-uniapp/site/web/plugins/plugin-tdoc/md-to-vue.js
+++ b/packages/tdesign-uniapp/site/web/plugins/plugin-tdoc/md-to-vue.js
@@ -46,6 +46,8 @@ export default function mdToVue(options) {
slot="doc-header"
ref="tdDocHeader"
platform="mobile"
+ changelog="false"
+ changelogEn="false"
spline="${mdSegment.spline}"
component-name="${mdSegment.isComponent ? mdSegment.componentName : ''}"
>