@tnotesjs/core 0.0.6 → 0.0.8

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 (116) hide show
  1. package/README.md +87 -84
  2. package/dist/{chunk-JDVN2QYW.js → chunk-JUMVJKWV.js} +615 -614
  3. package/dist/cli/index.js +125 -125
  4. package/dist/vitepress/config/index.js +184 -210
  5. package/package.json +15 -3
  6. package/types/config.ts +61 -61
  7. package/types/index.ts +11 -11
  8. package/types/note.ts +33 -33
  9. package/types/shims.d.ts +3 -4
  10. package/vitepress/assets/icons/icon__check.svg +3 -3
  11. package/vitepress/assets/icons/icon__clipboard.svg +7 -7
  12. package/vitepress/assets/icons/icon__close.svg +1 -1
  13. package/vitepress/assets/icons/icon__collapse.svg +1 -1
  14. package/vitepress/assets/icons/icon__confirm.svg +1 -1
  15. package/vitepress/assets/icons/icon__copy.svg +4 -4
  16. package/vitepress/assets/icons/icon__focus.svg +1 -1
  17. package/vitepress/assets/icons/icon__fold.svg +3 -3
  18. package/vitepress/assets/icons/icon__folder.svg +1 -1
  19. package/vitepress/assets/icons/icon__fullscreen.svg +1 -1
  20. package/vitepress/assets/icons/icon__fullscreen_exit.svg +1 -1
  21. package/vitepress/assets/icons/icon__github.svg +3 -3
  22. package/vitepress/assets/icons/icon__mindmap.svg +1 -1
  23. package/vitepress/assets/icons/icon__next.svg +1 -1
  24. package/vitepress/assets/icons/icon__number_gray.svg +1 -1
  25. package/vitepress/assets/icons/icon__number_purple.svg +1 -1
  26. package/vitepress/assets/icons/icon__prev.svg +1 -1
  27. package/vitepress/assets/icons/icon__restore.svg +1 -1
  28. package/vitepress/assets/icons/icon__rotate.svg +4 -4
  29. package/vitepress/assets/icons/icon__search.svg +1 -1
  30. package/vitepress/assets/icons/icon__sidebar_collapsed.svg +1 -1
  31. package/vitepress/assets/icons/icon__sidebar_opened.svg +1 -1
  32. package/vitepress/assets/icons/icon__totop.svg +5 -5
  33. package/vitepress/assets/icons/icon__vscode.svg +5 -5
  34. package/vitepress/assets/icons/icon__zoom_fit.svg +1 -1
  35. package/vitepress/assets/icons/icon__zoom_in.svg +1 -1
  36. package/vitepress/assets/icons/icon__zoom_out.svg +1 -1
  37. package/vitepress/assets/icons/icon__zoom_reset.svg +1 -1
  38. package/vitepress/assets/icons/index.ts +38 -38
  39. package/vitepress/components/BilibiliOutsidePlayer/BilibiliOutsidePlayer.vue +20 -20
  40. package/vitepress/components/CodeBlockFullscreen/CodeBlockFullscreen.vue +373 -372
  41. package/vitepress/components/CodeBlockFullscreen/index.ts +115 -114
  42. package/vitepress/components/CodeBlockFullscreen/styles.css +64 -64
  43. package/vitepress/components/Discussions/Discussions.module.scss +32 -32
  44. package/vitepress/components/Discussions/Discussions.vue +211 -210
  45. package/vitepress/components/EnWordList/EnWordList.module.scss +124 -124
  46. package/vitepress/components/EnWordList/EnWordList.vue +543 -542
  47. package/vitepress/components/EnWordList/RightClickMenu.module.scss +22 -22
  48. package/vitepress/components/EnWordList/RightClickMenu.vue +66 -66
  49. package/vitepress/components/Footprints/Footprints.module.scss +93 -93
  50. package/vitepress/components/Footprints/Footprints.vue +377 -377
  51. package/vitepress/components/Layout/AboutModal.module.scss +233 -233
  52. package/vitepress/components/Layout/AboutModal.vue +105 -105
  53. package/vitepress/components/Layout/AboutPanel.vue +270 -265
  54. package/vitepress/components/Layout/ContentCollapse.vue +603 -602
  55. package/vitepress/components/Layout/CustomSidebar.vue +608 -605
  56. package/vitepress/components/Layout/DocBeforeControls.vue +149 -139
  57. package/vitepress/components/Layout/DocFooter.vue +233 -232
  58. package/vitepress/components/Layout/ImagePreview.module.scss +201 -201
  59. package/vitepress/components/Layout/ImagePreview.vue +281 -280
  60. package/vitepress/components/Layout/Layout.module.scss +661 -661
  61. package/vitepress/components/Layout/Layout.vue +539 -542
  62. package/vitepress/components/Layout/NoteStatus.vue +140 -139
  63. package/vitepress/components/Layout/SidebarItems.vue +267 -262
  64. package/vitepress/components/Layout/SidebarNavBefore.vue +92 -92
  65. package/vitepress/components/Layout/Swiper.vue +167 -167
  66. package/vitepress/components/Layout/ToggleFullContent.module.scss +11 -11
  67. package/vitepress/components/Layout/ToggleFullContent.vue +35 -34
  68. package/vitepress/components/Layout/ToggleSidebar.module.scss +11 -11
  69. package/vitepress/components/Layout/ToggleSidebar.vue +36 -35
  70. package/vitepress/components/Layout/composables/useCollapseControl.ts +88 -88
  71. package/vitepress/components/Layout/composables/useNoteConfig.ts +119 -121
  72. package/vitepress/components/Layout/composables/useNoteSave.ts +173 -172
  73. package/vitepress/components/Layout/composables/useNoteValidation.ts +85 -85
  74. package/vitepress/components/Layout/composables/useRedirect.ts +113 -110
  75. package/vitepress/components/Layout/composables/useVSCodeIntegration.ts +86 -83
  76. package/vitepress/components/Layout/homeReadme.data.ts +124 -124
  77. package/vitepress/components/LoadingPage/LoadingPage.vue +192 -192
  78. package/vitepress/components/MarkMap/MarkMap.module.scss +159 -159
  79. package/vitepress/components/MarkMap/MarkMap.vue +405 -404
  80. package/vitepress/components/Mermaid/Mermaid.module.scss +275 -275
  81. package/vitepress/components/Mermaid/Mermaid.vue +365 -363
  82. package/vitepress/components/NotesTable/NotesTable.module.scss +77 -77
  83. package/vitepress/components/NotesTable/NotesTable.vue +98 -97
  84. package/vitepress/components/NotesTable/README.md +67 -67
  85. package/vitepress/components/Settings/Settings.module.scss +433 -433
  86. package/vitepress/components/Settings/Settings.vue +306 -305
  87. package/vitepress/components/SidebarCard/MindMapView.vue +484 -483
  88. package/vitepress/components/SidebarCard/NotesTrendChart.vue +108 -108
  89. package/vitepress/components/SidebarCard/SidebarCard.vue +946 -948
  90. package/vitepress/components/Tooltip/Tooltip.vue +70 -70
  91. package/vitepress/components/constants.ts +91 -91
  92. package/vitepress/components/notesConfig.data.ts +73 -73
  93. package/vitepress/components/sidebar.data.ts +59 -59
  94. package/vitepress/components/tnotes-config.data.ts +21 -21
  95. package/vitepress/components/utils.ts +26 -26
  96. package/vitepress/config/index.ts +160 -146
  97. package/vitepress/configs/constants.ts +26 -26
  98. package/vitepress/configs/head.config.ts +25 -24
  99. package/vitepress/configs/index.ts +9 -9
  100. package/vitepress/configs/markdown-it.d.ts +23 -20
  101. package/vitepress/configs/markdown.config.ts +366 -365
  102. package/vitepress/configs/theme.config.ts +108 -108
  103. package/vitepress/plugins/buildProgressPlugin.ts +434 -470
  104. package/vitepress/plugins/getNoteByConfigIdPlugin.ts +107 -106
  105. package/vitepress/plugins/renameNotePlugin.ts +60 -59
  106. package/vitepress/plugins/updateConfigPlugin.ts +63 -62
  107. package/vitepress/theme/index.ts +95 -93
  108. package/vitepress/theme/styles/base.scss +50 -50
  109. package/vitepress/theme/styles/components/404.scss +31 -31
  110. package/vitepress/theme/styles/components/collapse.scss +175 -175
  111. package/vitepress/theme/styles/components/markmap.scss +101 -101
  112. package/vitepress/theme/styles/components/swiper.scss +255 -255
  113. package/vitepress/theme/styles/index.scss +25 -25
  114. package/vitepress/theme/styles/layout.scss +62 -62
  115. package/vitepress/theme/styles/utilities.scss +39 -39
  116. package/vitepress/theme/styles/vitepress-override.scss +25 -25
@@ -1,107 +1,108 @@
1
- /**
2
- * .vitepress/tnotes/vitepress/plugins/getNoteByConfigIdPlugin.ts
3
- *
4
- * VitePress 插件 - 根据 configId 查询笔记信息
5
- */
6
- import type { PluginOption } from 'vite'
7
- import { NoteIndexCache } from '../../core'
1
+ /**
2
+ * .vitepress/tnotes/vitepress/plugins/getNoteByConfigIdPlugin.ts
3
+ *
4
+ * VitePress 插件 - 根据 configId 查询笔记信息
5
+ */
6
+ import { NoteIndexCache } from '../../core'
8
7
  import { logger } from '../../utils'
9
-
10
- export function getNoteByConfigIdPlugin(): PluginOption {
11
- return {
12
- name: 'tnotes-get-note-by-config-id',
13
-
14
- configureServer(server) {
15
- // 添加中间件处理查询请求
16
- server.middlewares.use(async (req, res, next) => {
17
- if (
18
- req.url?.startsWith('/__tnotes_get_note?') &&
19
- req.method === 'GET'
20
- ) {
21
- try {
22
- // 解析查询参数
23
- const url = new URL(req.url, `http://${req.headers.host}`)
24
- const configId = url.searchParams.get('configId')
25
-
26
- if (!configId) {
27
- res.statusCode = 400
28
- res.setHeader('Content-Type', 'application/json')
29
- res.end(
30
- JSON.stringify({
31
- success: false,
32
- error: 'Missing configId parameter',
33
- }),
34
- )
35
- return
36
- }
37
-
38
- // 确保笔记索引缓存已初始化
39
- const noteIndexCache = NoteIndexCache.getInstance()
40
- if (!noteIndexCache.isInitialized()) {
41
- res.statusCode = 503
42
- res.setHeader('Content-Type', 'application/json')
43
- res.end(
44
- JSON.stringify({
45
- success: false,
46
- error: 'Service not initialized',
47
- }),
48
- )
49
- return
50
- }
51
-
52
- // 从索引缓存中查询笔记
53
- const noteItem = noteIndexCache.getByConfigId(configId)
54
-
55
- if (!noteItem) {
56
- // 笔记不存在或已被删除
57
- res.statusCode = 200
58
- res.setHeader('Content-Type', 'application/json')
59
- res.end(
60
- JSON.stringify({
61
- success: true,
62
- found: false,
63
- data: null,
64
- }),
65
- )
66
- return
67
- }
68
-
69
- // 返回笔记信息
70
- res.statusCode = 200
71
- res.setHeader('Content-Type', 'application/json')
72
- res.end(
73
- JSON.stringify({
74
- success: true,
75
- found: true,
76
- data: {
77
- noteIndex: noteItem.noteIndex,
78
- folderName: noteItem.folderName,
79
- // 构建笔记的完整 URL(包含 README)
80
- url: `/notes/${encodeURIComponent(
81
- noteItem.folderName,
82
- )}/README`,
83
- },
84
- }),
85
- )
86
-
87
- logger.debug(
88
- `查询笔记: configId=${configId}, noteIndex=${noteItem.noteIndex}`,
89
- )
90
- } catch (error) {
91
- logger.error('查询笔记失败:', error)
92
- res.statusCode = 500
93
- res.setHeader('Content-Type', 'application/json')
94
- res.end(
95
- JSON.stringify({
96
- success: false,
97
- error: error instanceof Error ? error.message : String(error),
98
- }),
99
- )
100
- }
101
- } else {
102
- next()
103
- }
104
- })
105
- },
106
- }
107
- }
8
+
9
+ import type { PluginOption } from 'vite'
10
+
11
+ export function getNoteByConfigIdPlugin(): PluginOption {
12
+ return {
13
+ name: 'tnotes-get-note-by-config-id',
14
+
15
+ configureServer(server) {
16
+ // 添加中间件处理查询请求
17
+ server.middlewares.use(async (req, res, next) => {
18
+ if (
19
+ req.url?.startsWith('/__tnotes_get_note?') &&
20
+ req.method === 'GET'
21
+ ) {
22
+ try {
23
+ // 解析查询参数
24
+ const url = new URL(req.url, `http://${req.headers.host}`)
25
+ const configId = url.searchParams.get('configId')
26
+
27
+ if (!configId) {
28
+ res.statusCode = 400
29
+ res.setHeader('Content-Type', 'application/json')
30
+ res.end(
31
+ JSON.stringify({
32
+ success: false,
33
+ error: 'Missing configId parameter',
34
+ }),
35
+ )
36
+ return
37
+ }
38
+
39
+ // 确保笔记索引缓存已初始化
40
+ const noteIndexCache = NoteIndexCache.getInstance()
41
+ if (!noteIndexCache.isInitialized()) {
42
+ res.statusCode = 503
43
+ res.setHeader('Content-Type', 'application/json')
44
+ res.end(
45
+ JSON.stringify({
46
+ success: false,
47
+ error: 'Service not initialized',
48
+ }),
49
+ )
50
+ return
51
+ }
52
+
53
+ // 从索引缓存中查询笔记
54
+ const noteItem = noteIndexCache.getByConfigId(configId)
55
+
56
+ if (!noteItem) {
57
+ // 笔记不存在或已被删除
58
+ res.statusCode = 200
59
+ res.setHeader('Content-Type', 'application/json')
60
+ res.end(
61
+ JSON.stringify({
62
+ success: true,
63
+ found: false,
64
+ data: null,
65
+ }),
66
+ )
67
+ return
68
+ }
69
+
70
+ // 返回笔记信息
71
+ res.statusCode = 200
72
+ res.setHeader('Content-Type', 'application/json')
73
+ res.end(
74
+ JSON.stringify({
75
+ success: true,
76
+ found: true,
77
+ data: {
78
+ noteIndex: noteItem.noteIndex,
79
+ folderName: noteItem.folderName,
80
+ // 构建笔记的完整 URL(包含 README)
81
+ url: `/notes/${encodeURIComponent(
82
+ noteItem.folderName,
83
+ )}/README`,
84
+ },
85
+ }),
86
+ )
87
+
88
+ logger.debug(
89
+ `查询笔记: configId=${configId}, noteIndex=${noteItem.noteIndex}`,
90
+ )
91
+ } catch (error) {
92
+ logger.error('查询笔记失败:', error)
93
+ res.statusCode = 500
94
+ res.setHeader('Content-Type', 'application/json')
95
+ res.end(
96
+ JSON.stringify({
97
+ success: false,
98
+ error: error instanceof Error ? error.message : String(error),
99
+ }),
100
+ )
101
+ }
102
+ } else {
103
+ next()
104
+ }
105
+ })
106
+ },
107
+ }
108
+ }
@@ -1,60 +1,61 @@
1
- /**
2
- * .vitepress/tnotes/vitepress/plugins/renameNotePlugin.ts
3
- *
4
- * Vite 插件 - 处理笔记重命名请求
5
- */
6
- import type { PluginOption } from 'vite'
1
+ /**
2
+ * .vitepress/tnotes/vitepress/plugins/renameNotePlugin.ts
3
+ *
4
+ * Vite 插件 - 处理笔记重命名请求
5
+ */
7
6
  import { RenameNoteCommand } from '../../commands/note/RenameNoteCommand'
8
-
9
- export function renameNotePlugin(): PluginOption {
10
- const renameCommand = new RenameNoteCommand()
11
-
12
- return {
13
- name: 'tnotes-rename-note',
14
- configureServer(server) {
15
- server.middlewares.use(async (req, res, next) => {
16
- // 只处理 POST 请求到 /__tnotes_rename_note
17
- if (req.url === '/__tnotes_rename_note' && req.method === 'POST') {
18
- let body = ''
19
-
20
- req.on('data', (chunk) => {
21
- body += chunk.toString()
22
- })
23
-
24
- req.on('end', async () => {
25
- try {
26
- const { noteIndex, newTitle } = JSON.parse(body)
27
-
28
- if (!noteIndex || !newTitle) {
29
- res.statusCode = 400
30
- res.end('Missing noteIndex or newTitle')
31
- return
32
- }
33
-
34
- // 执行重命名
35
- const startTime = Date.now()
36
- await renameCommand.renameNote({ noteIndex, newTitle })
37
- const duration = Date.now() - startTime
38
-
39
- res.statusCode = 200
40
- res.setHeader('Content-Type', 'application/json')
41
- res.end(
42
- JSON.stringify({
43
- success: true,
44
- duration,
45
- newTitle,
46
- message: '重命名完成',
47
- })
48
- )
49
- } catch (error) {
50
- res.statusCode = 500
51
- res.end(error instanceof Error ? error.message : 'Rename failed')
52
- }
53
- })
54
- } else {
55
- next()
56
- }
57
- })
58
- },
59
- }
60
- }
7
+
8
+ import type { PluginOption } from 'vite'
9
+
10
+ export function renameNotePlugin(): PluginOption {
11
+ const renameCommand = new RenameNoteCommand()
12
+
13
+ return {
14
+ name: 'tnotes-rename-note',
15
+ configureServer(server) {
16
+ server.middlewares.use(async (req, res, next) => {
17
+ // 只处理 POST 请求到 /__tnotes_rename_note
18
+ if (req.url === '/__tnotes_rename_note' && req.method === 'POST') {
19
+ let body = ''
20
+
21
+ req.on('data', (chunk) => {
22
+ body += chunk.toString()
23
+ })
24
+
25
+ req.on('end', async () => {
26
+ try {
27
+ const { noteIndex, newTitle } = JSON.parse(body)
28
+
29
+ if (!noteIndex || !newTitle) {
30
+ res.statusCode = 400
31
+ res.end('Missing noteIndex or newTitle')
32
+ return
33
+ }
34
+
35
+ // 执行重命名
36
+ const startTime = Date.now()
37
+ await renameCommand.renameNote({ noteIndex, newTitle })
38
+ const duration = Date.now() - startTime
39
+
40
+ res.statusCode = 200
41
+ res.setHeader('Content-Type', 'application/json')
42
+ res.end(
43
+ JSON.stringify({
44
+ success: true,
45
+ duration,
46
+ newTitle,
47
+ message: '重命名完成',
48
+ })
49
+ )
50
+ } catch (error) {
51
+ res.statusCode = 500
52
+ res.end(error instanceof Error ? error.message : 'Rename failed')
53
+ }
54
+ })
55
+ } else {
56
+ next()
57
+ }
58
+ })
59
+ },
60
+ }
61
+ }
@@ -1,63 +1,64 @@
1
- /**
2
- * .vitepress/tnotes/vitepress/plugins/updateConfigPlugin.ts
3
- *
4
- * VitePress 插件 - 处理笔记配置更新请求
5
- */
6
- import type { PluginOption } from 'vite'
1
+ /**
2
+ * .vitepress/tnotes/vitepress/plugins/updateConfigPlugin.ts
3
+ *
4
+ * VitePress 插件 - 处理笔记配置更新请求
5
+ */
7
6
  import { UpdateNoteConfigCommand } from '../../commands/note/UpdateNoteConfigCommand'
8
-
9
- export function updateConfigPlugin(): PluginOption {
10
- let updateCommand: UpdateNoteConfigCommand
11
-
12
- return {
13
- name: 'tnotes-update-config',
14
-
15
- configureServer(server) {
16
- updateCommand = new UpdateNoteConfigCommand()
17
-
18
- // 添加中间件处理配置更新请求
19
- server.middlewares.use(async (req, res, next) => {
20
- if (req.url === '/__tnotes_update_config' && req.method === 'POST') {
21
- let body = ''
22
-
23
- req.on('data', (chunk) => {
24
- body += chunk.toString()
25
- })
26
-
27
- req.on('end', async () => {
28
- try {
29
- const data = JSON.parse(body)
30
- const { noteIndex, config } = data
31
-
32
- if (!noteIndex || !config) {
33
- res.statusCode = 400
34
- res.end('Missing noteIndex or config')
35
- return
36
- }
37
-
38
- // 调用命令更新配置
39
- await updateCommand.updateConfig({
40
- noteIndex,
41
- config: {
42
- done: config.done,
43
- enableDiscussions: config.enableDiscussions,
44
- description: config.description,
45
- },
46
- })
47
-
48
- res.statusCode = 200
49
- res.setHeader('Content-Type', 'application/json')
50
- res.end(JSON.stringify({ success: true }))
51
- } catch (error) {
52
- console.error('更新配置失败:', error)
53
- res.statusCode = 500
54
- res.end(error instanceof Error ? error.message : String(error))
55
- }
56
- })
57
- } else {
58
- next()
59
- }
60
- })
61
- },
62
- }
63
- }
7
+
8
+ import type { PluginOption } from 'vite'
9
+
10
+ export function updateConfigPlugin(): PluginOption {
11
+ let updateCommand: UpdateNoteConfigCommand
12
+
13
+ return {
14
+ name: 'tnotes-update-config',
15
+
16
+ configureServer(server) {
17
+ updateCommand = new UpdateNoteConfigCommand()
18
+
19
+ // 添加中间件处理配置更新请求
20
+ server.middlewares.use(async (req, res, next) => {
21
+ if (req.url === '/__tnotes_update_config' && req.method === 'POST') {
22
+ let body = ''
23
+
24
+ req.on('data', (chunk) => {
25
+ body += chunk.toString()
26
+ })
27
+
28
+ req.on('end', async () => {
29
+ try {
30
+ const data = JSON.parse(body)
31
+ const { noteIndex, config } = data
32
+
33
+ if (!noteIndex || !config) {
34
+ res.statusCode = 400
35
+ res.end('Missing noteIndex or config')
36
+ return
37
+ }
38
+
39
+ // 调用命令更新配置
40
+ await updateCommand.updateConfig({
41
+ noteIndex,
42
+ config: {
43
+ done: config.done,
44
+ enableDiscussions: config.enableDiscussions,
45
+ description: config.description,
46
+ },
47
+ })
48
+
49
+ res.statusCode = 200
50
+ res.setHeader('Content-Type', 'application/json')
51
+ res.end(JSON.stringify({ success: true }))
52
+ } catch (error) {
53
+ console.error('更新配置失败:', error)
54
+ res.statusCode = 500
55
+ res.end(error instanceof Error ? error.message : String(error))
56
+ }
57
+ })
58
+ } else {
59
+ next()
60
+ }
61
+ })
62
+ },
63
+ }
64
+ }