@lamberl-lee/file-preview 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/COPYING +674 -0
  2. package/LICENSE +165 -0
  3. package/README.md +165 -0
  4. package/dist/AudioPreview.d.ts +9 -0
  5. package/dist/AudioPreview.js +29 -0
  6. package/dist/AudioPreview.js.map +1 -0
  7. package/dist/CodePreview.d.ts +10 -0
  8. package/dist/CodePreview.js +121 -0
  9. package/dist/CodePreview.js.map +1 -0
  10. package/dist/CsvPreview.d.ts +9 -0
  11. package/dist/CsvPreview.js +117 -0
  12. package/dist/CsvPreview.js.map +1 -0
  13. package/dist/DocxPreview.d.ts +11 -0
  14. package/dist/DocxPreview.js +89 -0
  15. package/dist/DocxPreview.js.map +1 -0
  16. package/dist/EpubPreview.d.ts +9 -0
  17. package/dist/EpubPreview.js +693 -0
  18. package/dist/EpubPreview.js.map +1 -0
  19. package/dist/HtmlPreview.d.ts +9 -0
  20. package/dist/HtmlPreview.js +60 -0
  21. package/dist/HtmlPreview.js.map +1 -0
  22. package/dist/ImagePreview.d.ts +9 -0
  23. package/dist/ImagePreview.js +44 -0
  24. package/dist/ImagePreview.js.map +1 -0
  25. package/dist/LargeFileGate.d.ts +12 -0
  26. package/dist/LargeFileGate.js +88 -0
  27. package/dist/LargeFileGate.js.map +1 -0
  28. package/dist/MarkdownPreview.d.ts +8 -0
  29. package/dist/MarkdownPreview.js +140 -0
  30. package/dist/MarkdownPreview.js.map +1 -0
  31. package/dist/PdfPreview.d.ts +11 -0
  32. package/dist/PdfPreview.js +206 -0
  33. package/dist/PdfPreview.js.map +1 -0
  34. package/dist/PlainTextLargePreview.d.ts +9 -0
  35. package/dist/PlainTextLargePreview.js +62 -0
  36. package/dist/PlainTextLargePreview.js.map +1 -0
  37. package/dist/PluginPreviewRenderer.d.ts +13 -0
  38. package/dist/PluginPreviewRenderer.js +89 -0
  39. package/dist/PluginPreviewRenderer.js.map +1 -0
  40. package/dist/PptxPreview.d.ts +16 -0
  41. package/dist/PptxPreview.js +376 -0
  42. package/dist/PptxPreview.js.map +1 -0
  43. package/dist/PreviewErrorBoundary.d.ts +29 -0
  44. package/dist/PreviewErrorBoundary.js +53 -0
  45. package/dist/PreviewErrorBoundary.js.map +1 -0
  46. package/dist/PreviewFallback.d.ts +18 -0
  47. package/dist/PreviewFallback.js +143 -0
  48. package/dist/PreviewFallback.js.map +1 -0
  49. package/dist/PreviewLoading.d.ts +8 -0
  50. package/dist/PreviewLoading.js +14 -0
  51. package/dist/PreviewLoading.js.map +1 -0
  52. package/dist/RtfPreview.d.ts +10 -0
  53. package/dist/RtfPreview.js +240 -0
  54. package/dist/RtfPreview.js.map +1 -0
  55. package/dist/ShikiSourceView.d.ts +11 -0
  56. package/dist/ShikiSourceView.js +112 -0
  57. package/dist/ShikiSourceView.js.map +1 -0
  58. package/dist/SvgPreview.d.ts +9 -0
  59. package/dist/SvgPreview.js +89 -0
  60. package/dist/SvgPreview.js.map +1 -0
  61. package/dist/TextPreview.d.ts +9 -0
  62. package/dist/TextPreview.js +9 -0
  63. package/dist/TextPreview.js.map +1 -0
  64. package/dist/VideoPreview.d.ts +9 -0
  65. package/dist/VideoPreview.js +18 -0
  66. package/dist/VideoPreview.js.map +1 -0
  67. package/dist/XlsxPreview.d.ts +12 -0
  68. package/dist/XlsxPreview.js +856 -0
  69. package/dist/XlsxPreview.js.map +1 -0
  70. package/dist/ZipPreview.d.ts +9 -0
  71. package/dist/ZipPreview.js +153 -0
  72. package/dist/ZipPreview.js.map +1 -0
  73. package/dist/core/binary.d.ts +10 -0
  74. package/dist/core/binary.js +27 -0
  75. package/dist/core/binary.js.map +1 -0
  76. package/dist/core/config.d.ts +17 -0
  77. package/dist/core/config.js +19 -0
  78. package/dist/core/config.js.map +1 -0
  79. package/dist/core/download.d.ts +5 -0
  80. package/dist/core/download.js +20 -0
  81. package/dist/core/download.js.map +1 -0
  82. package/dist/core/i18n.d.ts +101 -0
  83. package/dist/core/i18n.js +200 -0
  84. package/dist/core/i18n.js.map +1 -0
  85. package/dist/core/plugin.d.ts +38 -0
  86. package/dist/core/plugin.js +46 -0
  87. package/dist/core/plugin.js.map +1 -0
  88. package/dist/core/registry.d.ts +13 -0
  89. package/dist/core/registry.js +33 -0
  90. package/dist/core/registry.js.map +1 -0
  91. package/dist/core/source.d.ts +14 -0
  92. package/dist/core/source.js +131 -0
  93. package/dist/core/source.js.map +1 -0
  94. package/dist/core/types.d.ts +88 -0
  95. package/dist/core/types.js +27 -0
  96. package/dist/core/types.js.map +1 -0
  97. package/dist/hooks/useObjectUrlFromSource.d.ts +9 -0
  98. package/dist/hooks/useObjectUrlFromSource.js +50 -0
  99. package/dist/hooks/useObjectUrlFromSource.js.map +1 -0
  100. package/dist/hooks/useSourceBase64.d.ts +10 -0
  101. package/dist/hooks/useSourceBase64.js +32 -0
  102. package/dist/hooks/useSourceBase64.js.map +1 -0
  103. package/dist/hooks/useSourceText.d.ts +10 -0
  104. package/dist/hooks/useSourceText.js +32 -0
  105. package/dist/hooks/useSourceText.js.map +1 -0
  106. package/dist/icons.d.ts +44 -0
  107. package/dist/icons.js +248 -0
  108. package/dist/icons.js.map +1 -0
  109. package/dist/index.d.ts +36 -0
  110. package/dist/index.js +147 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/limits.d.ts +26 -0
  113. package/dist/limits.js +45 -0
  114. package/dist/limits.js.map +1 -0
  115. package/dist/performance-limits.d.ts +27 -0
  116. package/dist/performance-limits.js +54 -0
  117. package/dist/performance-limits.js.map +1 -0
  118. package/dist/plugins/audio-plugin.d.ts +7 -0
  119. package/dist/plugins/audio-plugin.js +11 -0
  120. package/dist/plugins/audio-plugin.js.map +1 -0
  121. package/dist/plugins/builtin-plugins.d.ts +9 -0
  122. package/dist/plugins/builtin-plugins.js +43 -0
  123. package/dist/plugins/builtin-plugins.js.map +1 -0
  124. package/dist/plugins/csv-plugin.d.ts +7 -0
  125. package/dist/plugins/csv-plugin.js +11 -0
  126. package/dist/plugins/csv-plugin.js.map +1 -0
  127. package/dist/plugins/docx-plugin.d.ts +7 -0
  128. package/dist/plugins/docx-plugin.js +15 -0
  129. package/dist/plugins/docx-plugin.js.map +1 -0
  130. package/dist/plugins/epub-plugin.d.ts +7 -0
  131. package/dist/plugins/epub-plugin.js +15 -0
  132. package/dist/plugins/epub-plugin.js.map +1 -0
  133. package/dist/plugins/html-plugin.d.ts +7 -0
  134. package/dist/plugins/html-plugin.js +11 -0
  135. package/dist/plugins/html-plugin.js.map +1 -0
  136. package/dist/plugins/image-plugin.d.ts +7 -0
  137. package/dist/plugins/image-plugin.js +11 -0
  138. package/dist/plugins/image-plugin.js.map +1 -0
  139. package/dist/plugins/markdown-plugin.d.ts +7 -0
  140. package/dist/plugins/markdown-plugin.js +11 -0
  141. package/dist/plugins/markdown-plugin.js.map +1 -0
  142. package/dist/plugins/pdf-plugin.d.ts +7 -0
  143. package/dist/plugins/pdf-plugin.js +15 -0
  144. package/dist/plugins/pdf-plugin.js.map +1 -0
  145. package/dist/plugins/pptx-plugin.d.ts +7 -0
  146. package/dist/plugins/pptx-plugin.js +15 -0
  147. package/dist/plugins/pptx-plugin.js.map +1 -0
  148. package/dist/plugins/rtf-plugin.d.ts +7 -0
  149. package/dist/plugins/rtf-plugin.js +15 -0
  150. package/dist/plugins/rtf-plugin.js.map +1 -0
  151. package/dist/plugins/source-code-plugin.d.ts +7 -0
  152. package/dist/plugins/source-code-plugin.js +11 -0
  153. package/dist/plugins/source-code-plugin.js.map +1 -0
  154. package/dist/plugins/svg-plugin.d.ts +7 -0
  155. package/dist/plugins/svg-plugin.js +11 -0
  156. package/dist/plugins/svg-plugin.js.map +1 -0
  157. package/dist/plugins/text-plugin.d.ts +7 -0
  158. package/dist/plugins/text-plugin.js +11 -0
  159. package/dist/plugins/text-plugin.js.map +1 -0
  160. package/dist/plugins/video-plugin.d.ts +7 -0
  161. package/dist/plugins/video-plugin.js +11 -0
  162. package/dist/plugins/video-plugin.js.map +1 -0
  163. package/dist/plugins/xlsx-plugin.d.ts +7 -0
  164. package/dist/plugins/xlsx-plugin.js +15 -0
  165. package/dist/plugins/xlsx-plugin.js.map +1 -0
  166. package/dist/plugins/zip-plugin.d.ts +7 -0
  167. package/dist/plugins/zip-plugin.js +15 -0
  168. package/dist/plugins/zip-plugin.js.map +1 -0
  169. package/dist/preview-adapters/AudioPreviewAdapter.d.ts +8 -0
  170. package/dist/preview-adapters/AudioPreviewAdapter.js +31 -0
  171. package/dist/preview-adapters/AudioPreviewAdapter.js.map +1 -0
  172. package/dist/preview-adapters/CsvPreviewAdapter.d.ts +8 -0
  173. package/dist/preview-adapters/CsvPreviewAdapter.js +28 -0
  174. package/dist/preview-adapters/CsvPreviewAdapter.js.map +1 -0
  175. package/dist/preview-adapters/DocxPreviewAdapter.d.ts +8 -0
  176. package/dist/preview-adapters/DocxPreviewAdapter.js +16 -0
  177. package/dist/preview-adapters/DocxPreviewAdapter.js.map +1 -0
  178. package/dist/preview-adapters/EpubPreviewAdapter.d.ts +8 -0
  179. package/dist/preview-adapters/EpubPreviewAdapter.js +28 -0
  180. package/dist/preview-adapters/EpubPreviewAdapter.js.map +1 -0
  181. package/dist/preview-adapters/HtmlPreviewAdapter.d.ts +8 -0
  182. package/dist/preview-adapters/HtmlPreviewAdapter.js +28 -0
  183. package/dist/preview-adapters/HtmlPreviewAdapter.js.map +1 -0
  184. package/dist/preview-adapters/ImagePreviewAdapter.d.ts +8 -0
  185. package/dist/preview-adapters/ImagePreviewAdapter.js +31 -0
  186. package/dist/preview-adapters/ImagePreviewAdapter.js.map +1 -0
  187. package/dist/preview-adapters/MarkdownPreviewAdapter.d.ts +8 -0
  188. package/dist/preview-adapters/MarkdownPreviewAdapter.js +28 -0
  189. package/dist/preview-adapters/MarkdownPreviewAdapter.js.map +1 -0
  190. package/dist/preview-adapters/PdfPreviewAdapter.d.ts +8 -0
  191. package/dist/preview-adapters/PdfPreviewAdapter.js +16 -0
  192. package/dist/preview-adapters/PdfPreviewAdapter.js.map +1 -0
  193. package/dist/preview-adapters/PptxPreviewAdapter.d.ts +8 -0
  194. package/dist/preview-adapters/PptxPreviewAdapter.js +16 -0
  195. package/dist/preview-adapters/PptxPreviewAdapter.js.map +1 -0
  196. package/dist/preview-adapters/RtfPreviewAdapter.d.ts +8 -0
  197. package/dist/preview-adapters/RtfPreviewAdapter.js +54 -0
  198. package/dist/preview-adapters/RtfPreviewAdapter.js.map +1 -0
  199. package/dist/preview-adapters/SourceCodePreviewAdapter.d.ts +8 -0
  200. package/dist/preview-adapters/SourceCodePreviewAdapter.js +35 -0
  201. package/dist/preview-adapters/SourceCodePreviewAdapter.js.map +1 -0
  202. package/dist/preview-adapters/SvgPreviewAdapter.d.ts +8 -0
  203. package/dist/preview-adapters/SvgPreviewAdapter.js +28 -0
  204. package/dist/preview-adapters/SvgPreviewAdapter.js.map +1 -0
  205. package/dist/preview-adapters/TextPreviewAdapter.d.ts +8 -0
  206. package/dist/preview-adapters/TextPreviewAdapter.js +28 -0
  207. package/dist/preview-adapters/TextPreviewAdapter.js.map +1 -0
  208. package/dist/preview-adapters/UnsupportedPluginPreview.d.ts +11 -0
  209. package/dist/preview-adapters/UnsupportedPluginPreview.js +34 -0
  210. package/dist/preview-adapters/UnsupportedPluginPreview.js.map +1 -0
  211. package/dist/preview-adapters/VideoPreviewAdapter.d.ts +8 -0
  212. package/dist/preview-adapters/VideoPreviewAdapter.js +31 -0
  213. package/dist/preview-adapters/VideoPreviewAdapter.js.map +1 -0
  214. package/dist/preview-adapters/XlsxPreviewAdapter.d.ts +8 -0
  215. package/dist/preview-adapters/XlsxPreviewAdapter.js +17 -0
  216. package/dist/preview-adapters/XlsxPreviewAdapter.js.map +1 -0
  217. package/dist/preview-adapters/ZipPreviewAdapter.d.ts +8 -0
  218. package/dist/preview-adapters/ZipPreviewAdapter.js +28 -0
  219. package/dist/preview-adapters/ZipPreviewAdapter.js.map +1 -0
  220. package/dist/remote-url.d.ts +20 -0
  221. package/dist/remote-url.js +478 -0
  222. package/dist/remote-url.js.map +1 -0
  223. package/dist/rtf/load-rtfjs.d.ts +42 -0
  224. package/dist/rtf/load-rtfjs.js +71 -0
  225. package/dist/rtf/load-rtfjs.js.map +1 -0
  226. package/dist/rtf/normalize-codepage.d.ts +33 -0
  227. package/dist/rtf/normalize-codepage.js +88 -0
  228. package/dist/rtf/normalize-codepage.js.map +1 -0
  229. package/dist/shiki.d.ts +35 -0
  230. package/dist/shiki.js +128 -0
  231. package/dist/shiki.js.map +1 -0
  232. package/dist/styles/AudioPreview.css +35 -0
  233. package/dist/styles/CsvPreview.css +106 -0
  234. package/dist/styles/DocxPreview.css +93 -0
  235. package/dist/styles/EpubPreview.css +509 -0
  236. package/dist/styles/HtmlPreview.css +15 -0
  237. package/dist/styles/ImagePreview.css +45 -0
  238. package/dist/styles/LargeFileGate.css +55 -0
  239. package/dist/styles/MarkdownPreview.css +291 -0
  240. package/dist/styles/PdfPreview.css +68 -0
  241. package/dist/styles/PlainTextLargePreview.css +85 -0
  242. package/dist/styles/PluginDebugBar.css +30 -0
  243. package/dist/styles/PptxPreview.css +207 -0
  244. package/dist/styles/PreviewFallback.css +88 -0
  245. package/dist/styles/PreviewLoading.css +13 -0
  246. package/dist/styles/RtfPreview.css +99 -0
  247. package/dist/styles/ShikiSourceView.css +159 -0
  248. package/dist/styles/SvgPreview.css +99 -0
  249. package/dist/styles/VideoPreview.css +19 -0
  250. package/dist/styles/ViewModeBar.css +38 -0
  251. package/dist/styles/XlsxPreview.css +361 -0
  252. package/dist/styles/ZipPreview.css +86 -0
  253. package/dist/styles/base.css +238 -0
  254. package/dist/styles/index.css +39 -0
  255. package/dist/support-status.d.ts +19 -0
  256. package/dist/support-status.js +174 -0
  257. package/dist/support-status.js.map +1 -0
  258. package/dist/utils.d.ts +17 -0
  259. package/dist/utils.js +205 -0
  260. package/dist/utils.js.map +1 -0
  261. package/package.json +125 -0
  262. package/scripts/copy-pdf-worker.mjs +31 -0
  263. package/scripts/copy-rtfjs-bundles.mjs +49 -0
@@ -0,0 +1,19 @@
1
+ import { FileType } from './core/types.js';
2
+
3
+ type PreviewSupportStatus = "plugin-supported" | "legacy-only" | "degraded" | "unsupported";
4
+ type RendererSupportState = "supported" | "degraded" | "unsupported";
5
+ interface PreviewSupportMeta {
6
+ fileType: FileType;
7
+ status: PreviewSupportStatus;
8
+ legacyRenderer: RendererSupportState;
9
+ pluginRenderer: RendererSupportState;
10
+ pluginId: string | null;
11
+ note?: string;
12
+ }
13
+ declare const PREVIEW_SUPPORT_MATRIX: Record<FileType, PreviewSupportMeta>;
14
+ declare function getPreviewSupportMeta(fileType: FileType): PreviewSupportMeta;
15
+ declare function isPluginSupportedFileType(fileType: FileType): boolean;
16
+ declare function isUnsupportedFileType(fileType: FileType): boolean;
17
+ declare function isDegradedFileType(fileType: FileType): boolean;
18
+
19
+ export { PREVIEW_SUPPORT_MATRIX, type PreviewSupportMeta, type PreviewSupportStatus, type RendererSupportState, getPreviewSupportMeta, isDegradedFileType, isPluginSupportedFileType, isUnsupportedFileType };
@@ -0,0 +1,174 @@
1
+ const PREVIEW_SUPPORT_MATRIX = {
2
+ pdf: {
3
+ fileType: "pdf",
4
+ status: "plugin-supported",
5
+ legacyRenderer: "supported",
6
+ pluginRenderer: "supported",
7
+ pluginId: "builtin.pdf"
8
+ },
9
+ code: {
10
+ fileType: "code",
11
+ status: "plugin-supported",
12
+ legacyRenderer: "supported",
13
+ pluginRenderer: "supported",
14
+ pluginId: "builtin.source-code"
15
+ },
16
+ json: {
17
+ fileType: "json",
18
+ status: "plugin-supported",
19
+ legacyRenderer: "supported",
20
+ pluginRenderer: "supported",
21
+ pluginId: "builtin.source-code",
22
+ note: "JSON currently reuses the source-code plugin."
23
+ },
24
+ text: {
25
+ fileType: "text",
26
+ status: "plugin-supported",
27
+ legacyRenderer: "supported",
28
+ pluginRenderer: "supported",
29
+ pluginId: "builtin.text"
30
+ },
31
+ image: {
32
+ fileType: "image",
33
+ status: "plugin-supported",
34
+ legacyRenderer: "supported",
35
+ pluginRenderer: "supported",
36
+ pluginId: "builtin.image"
37
+ },
38
+ audio: {
39
+ fileType: "audio",
40
+ status: "plugin-supported",
41
+ legacyRenderer: "supported",
42
+ pluginRenderer: "supported",
43
+ pluginId: "builtin.audio"
44
+ },
45
+ video: {
46
+ fileType: "video",
47
+ status: "plugin-supported",
48
+ legacyRenderer: "supported",
49
+ pluginRenderer: "supported",
50
+ pluginId: "builtin.video"
51
+ },
52
+ svg: {
53
+ fileType: "svg",
54
+ status: "plugin-supported",
55
+ legacyRenderer: "supported",
56
+ pluginRenderer: "supported",
57
+ pluginId: "builtin.svg"
58
+ },
59
+ csv: {
60
+ fileType: "csv",
61
+ status: "plugin-supported",
62
+ legacyRenderer: "supported",
63
+ pluginRenderer: "supported",
64
+ pluginId: "builtin.csv"
65
+ },
66
+ markdown: {
67
+ fileType: "markdown",
68
+ status: "plugin-supported",
69
+ legacyRenderer: "supported",
70
+ pluginRenderer: "supported",
71
+ pluginId: "builtin.markdown"
72
+ },
73
+ html: {
74
+ fileType: "html",
75
+ status: "plugin-supported",
76
+ legacyRenderer: "supported",
77
+ pluginRenderer: "supported",
78
+ pluginId: "builtin.html"
79
+ },
80
+ rtf: {
81
+ fileType: "rtf",
82
+ status: "plugin-supported",
83
+ legacyRenderer: "supported",
84
+ pluginRenderer: "supported",
85
+ pluginId: "builtin.rtf",
86
+ note: "\u4F7F\u7528 rtf.js \u5BCC\u6587\u672C\u6E32\u67D3\uFF08\u542B WMF/EMF \u77E2\u91CF\u56FE\uFF09 + DOMPurify \u5B89\u5168\u6E05\u6D17 + iframe sandbox \u9694\u79BB\uFF0C\u65E0\u6CD5\u89E3\u6790\u7684\u5185\u5BB9\u81EA\u52A8\u964D\u7EA7\u4E3A\u6587\u672C\u9884\u89C8\u3002"
87
+ },
88
+ zip: {
89
+ fileType: "zip",
90
+ status: "plugin-supported",
91
+ legacyRenderer: "supported",
92
+ pluginRenderer: "supported",
93
+ pluginId: "builtin.zip"
94
+ },
95
+ epub: {
96
+ fileType: "epub",
97
+ status: "plugin-supported",
98
+ legacyRenderer: "supported",
99
+ pluginRenderer: "supported",
100
+ pluginId: "builtin.epub"
101
+ },
102
+ docx: {
103
+ fileType: "docx",
104
+ status: "plugin-supported",
105
+ legacyRenderer: "supported",
106
+ pluginRenderer: "supported",
107
+ pluginId: "builtin.docx"
108
+ },
109
+ pptx: {
110
+ fileType: "pptx",
111
+ status: "plugin-supported",
112
+ legacyRenderer: "supported",
113
+ pluginRenderer: "supported",
114
+ pluginId: "builtin.pptx"
115
+ },
116
+ xlsx: {
117
+ fileType: "xlsx",
118
+ status: "plugin-supported",
119
+ legacyRenderer: "supported",
120
+ pluginRenderer: "supported",
121
+ pluginId: "builtin.xlsx"
122
+ },
123
+ doc: {
124
+ fileType: "doc",
125
+ status: "degraded",
126
+ legacyRenderer: "degraded",
127
+ pluginRenderer: "unsupported",
128
+ pluginId: null,
129
+ note: "\u8BE5\u6587\u4EF6\u4E3A\u65E7\u7248 .doc \u4E8C\u8FDB\u5236\u683C\u5F0F\uFF0C\u5F53\u524D\u6D4F\u89C8\u5668\u7AEF\u9884\u89C8\u4EC5\u652F\u6301 .docx\u3002\u5EFA\u8BAE\u4F7F\u7528 Word \u6216 WPS \u5C06\u6587\u4EF6\u53E6\u5B58\u4E3A .docx \u540E\u91CD\u8BD5\u3002"
130
+ },
131
+ ppt: {
132
+ fileType: "ppt",
133
+ status: "unsupported",
134
+ legacyRenderer: "unsupported",
135
+ pluginRenderer: "unsupported",
136
+ pluginId: null,
137
+ note: "\u8BE5\u6587\u4EF6\u4E3A\u65E7\u7248 .ppt \u4E8C\u8FDB\u5236\u683C\u5F0F\uFF0C\u5F53\u524D\u6D4F\u89C8\u5668\u7AEF\u9884\u89C8\u4EC5\u652F\u6301 .pptx\u3002\u5EFA\u8BAE\u4F7F\u7528 PowerPoint \u6216 WPS \u5C06\u6587\u4EF6\u53E6\u5B58\u4E3A .pptx \u540E\u91CD\u8BD5\u3002"
138
+ },
139
+ xls: {
140
+ fileType: "xls",
141
+ status: "unsupported",
142
+ legacyRenderer: "unsupported",
143
+ pluginRenderer: "unsupported",
144
+ pluginId: null,
145
+ note: "\u8BE5\u6587\u4EF6\u4E3A\u65E7\u7248 .xls \u4E8C\u8FDB\u5236\u683C\u5F0F\uFF0C\u5F53\u524D\u6D4F\u89C8\u5668\u7AEF\u9884\u89C8\u4EC5\u652F\u6301 .xlsx\u3002\u5EFA\u8BAE\u4F7F\u7528 Excel \u6216 WPS \u5C06\u6587\u4EF6\u53E6\u5B58\u4E3A .xlsx \u540E\u91CD\u8BD5\u3002"
146
+ },
147
+ unknown: {
148
+ fileType: "unknown",
149
+ status: "unsupported",
150
+ legacyRenderer: "unsupported",
151
+ pluginRenderer: "unsupported",
152
+ pluginId: null
153
+ }
154
+ };
155
+ function getPreviewSupportMeta(fileType) {
156
+ return PREVIEW_SUPPORT_MATRIX[fileType];
157
+ }
158
+ function isPluginSupportedFileType(fileType) {
159
+ return PREVIEW_SUPPORT_MATRIX[fileType].status === "plugin-supported";
160
+ }
161
+ function isUnsupportedFileType(fileType) {
162
+ return PREVIEW_SUPPORT_MATRIX[fileType].status === "unsupported";
163
+ }
164
+ function isDegradedFileType(fileType) {
165
+ return PREVIEW_SUPPORT_MATRIX[fileType].status === "degraded";
166
+ }
167
+ export {
168
+ PREVIEW_SUPPORT_MATRIX,
169
+ getPreviewSupportMeta,
170
+ isDegradedFileType,
171
+ isPluginSupportedFileType,
172
+ isUnsupportedFileType
173
+ };
174
+ //# sourceMappingURL=support-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/support-status.ts"],"sourcesContent":["import type { FileType } from \"./utils\";\n\nexport type PreviewSupportStatus =\n | \"plugin-supported\"\n | \"legacy-only\"\n | \"degraded\"\n | \"unsupported\";\n\nexport type RendererSupportState = \"supported\" | \"degraded\" | \"unsupported\";\n\nexport interface PreviewSupportMeta {\n fileType: FileType;\n status: PreviewSupportStatus;\n legacyRenderer: RendererSupportState;\n pluginRenderer: RendererSupportState;\n pluginId: string | null;\n note?: string;\n}\n\nexport const PREVIEW_SUPPORT_MATRIX: Record<FileType, PreviewSupportMeta> = {\n pdf: {\n fileType: \"pdf\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.pdf\",\n },\n\n code: {\n fileType: \"code\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.source-code\",\n },\n\n json: {\n fileType: \"json\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.source-code\",\n note: \"JSON currently reuses the source-code plugin.\",\n },\n\n text: {\n fileType: \"text\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.text\",\n },\n\n image: {\n fileType: \"image\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.image\",\n },\n\n audio: {\n fileType: \"audio\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.audio\",\n },\n\n video: {\n fileType: \"video\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.video\",\n },\n\n svg: {\n fileType: \"svg\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.svg\",\n },\n\n csv: {\n fileType: \"csv\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.csv\",\n },\n\n markdown: {\n fileType: \"markdown\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.markdown\",\n },\n\n html: {\n fileType: \"html\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.html\",\n },\n\n rtf: {\n fileType: \"rtf\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.rtf\",\n note: \"使用 rtf.js 富文本渲染(含 WMF/EMF 矢量图) + DOMPurify 安全清洗 + iframe sandbox 隔离,无法解析的内容自动降级为文本预览。\",\n },\n\n zip: {\n fileType: \"zip\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.zip\",\n },\n\n epub: {\n fileType: \"epub\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.epub\",\n },\n\n docx: {\n fileType: \"docx\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.docx\",\n },\n\n pptx: {\n fileType: \"pptx\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.pptx\",\n },\n\n xlsx: {\n fileType: \"xlsx\",\n status: \"plugin-supported\",\n legacyRenderer: \"supported\",\n pluginRenderer: \"supported\",\n pluginId: \"builtin.xlsx\",\n },\n\n doc: {\n fileType: \"doc\",\n status: \"degraded\",\n legacyRenderer: \"degraded\",\n pluginRenderer: \"unsupported\",\n pluginId: null,\n note: \"该文件为旧版 .doc 二进制格式,当前浏览器端预览仅支持 .docx。建议使用 Word 或 WPS 将文件另存为 .docx 后重试。\",\n },\n\n ppt: {\n fileType: \"ppt\",\n status: \"unsupported\",\n legacyRenderer: \"unsupported\",\n pluginRenderer: \"unsupported\",\n pluginId: null,\n note: \"该文件为旧版 .ppt 二进制格式,当前浏览器端预览仅支持 .pptx。建议使用 PowerPoint 或 WPS 将文件另存为 .pptx 后重试。\",\n },\n\n xls: {\n fileType: \"xls\",\n status: \"unsupported\",\n legacyRenderer: \"unsupported\",\n pluginRenderer: \"unsupported\",\n pluginId: null,\n note: \"该文件为旧版 .xls 二进制格式,当前浏览器端预览仅支持 .xlsx。建议使用 Excel 或 WPS 将文件另存为 .xlsx 后重试。\",\n },\n\n unknown: {\n fileType: \"unknown\",\n status: \"unsupported\",\n legacyRenderer: \"unsupported\",\n pluginRenderer: \"unsupported\",\n pluginId: null,\n },\n};\n\nexport function getPreviewSupportMeta(fileType: FileType): PreviewSupportMeta {\n return PREVIEW_SUPPORT_MATRIX[fileType];\n}\n\nexport function isPluginSupportedFileType(fileType: FileType): boolean {\n return PREVIEW_SUPPORT_MATRIX[fileType].status === \"plugin-supported\";\n}\n\nexport function isUnsupportedFileType(fileType: FileType): boolean {\n return PREVIEW_SUPPORT_MATRIX[fileType].status === \"unsupported\";\n}\n\nexport function isDegradedFileType(fileType: FileType): boolean {\n return PREVIEW_SUPPORT_MATRIX[fileType].status === \"degraded\";\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ import { FileType } from './core/types.js';
2
+ export { ALL_FILE_TYPES, FileInfo } from './core/types.js';
3
+
4
+ declare function getFileExtension(filename: string): string;
5
+ declare function detectFileType(filename: string, mimeType: string): FileType;
6
+ declare function getLanguageFromFilename(filename: string): string;
7
+ declare function formatFileSize(bytes: number): string;
8
+ declare function getFileTypeColor(fileType: FileType): string;
9
+ declare function getFileTypeLabel(fileType: FileType): string;
10
+ declare function generateId(): string;
11
+ /**
12
+ * Decode base64 string to Uint8Array.
13
+ * Shared utility used by PDF, DOCX, DOC, PPTX, XLSX, EPUB, ZIP preview components.
14
+ */
15
+ declare function base64ToUint8Array(base64: string): Uint8Array;
16
+
17
+ export { FileType, base64ToUint8Array, detectFileType, formatFileSize, generateId, getFileExtension, getFileTypeColor, getFileTypeLabel, getLanguageFromFilename };
package/dist/utils.js ADDED
@@ -0,0 +1,205 @@
1
+ import { ALL_FILE_TYPES } from "./core/types";
2
+ const CODE_EXTENSIONS = {
3
+ js: "javascript",
4
+ jsx: "jsx",
5
+ ts: "typescript",
6
+ tsx: "tsx",
7
+ py: "python",
8
+ rb: "ruby",
9
+ java: "java",
10
+ c: "c",
11
+ cpp: "cpp",
12
+ cs: "csharp",
13
+ go: "go",
14
+ rs: "rust",
15
+ php: "php",
16
+ swift: "swift",
17
+ kt: "kotlin",
18
+ scala: "scala",
19
+ css: "css",
20
+ scss: "scss",
21
+ less: "less",
22
+ sql: "sql",
23
+ sh: "bash",
24
+ bash: "bash",
25
+ zsh: "bash",
26
+ toml: "toml",
27
+ ini: "ini",
28
+ dockerfile: "dockerfile",
29
+ makefile: "makefile",
30
+ r: "r",
31
+ lua: "lua",
32
+ dart: "dart",
33
+ vue: "html",
34
+ svelte: "html"
35
+ };
36
+ const IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
37
+ "png",
38
+ "jpg",
39
+ "jpeg",
40
+ "gif",
41
+ "bmp",
42
+ "webp",
43
+ "ico",
44
+ "avif"
45
+ ]);
46
+ const VIDEO_EXTENSIONS = /* @__PURE__ */ new Set(["mp4", "webm", "ogg", "mov", "avi"]);
47
+ const AUDIO_EXTENSIONS = /* @__PURE__ */ new Set(["mp3", "wav", "ogg", "flac", "aac", "m4a"]);
48
+ function getFileExtension(filename) {
49
+ const parts = filename.toLowerCase().split(".");
50
+ return parts.length > 1 ? parts[parts.length - 1] : "";
51
+ }
52
+ function detectFileType(filename, mimeType) {
53
+ const ext = getFileExtension(filename);
54
+ const baseName = filename.toLowerCase().split("/").pop() || "";
55
+ if (ext === "pdf" || mimeType === "application/pdf") return "pdf";
56
+ if (["md", "mdx", "markdown"].includes(ext)) return "markdown";
57
+ if (ext === "json" || mimeType === "application/json") return "json";
58
+ if (ext === "csv" || mimeType === "text/csv") return "csv";
59
+ if (ext === "docx" || mimeType === "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
60
+ return "docx";
61
+ if (ext === "doc" || mimeType === "application/msword")
62
+ return "doc";
63
+ if (ext === "pptx" || mimeType === "application/vnd.openxmlformats-officedocument.presentationml.presentation")
64
+ return "pptx";
65
+ if (ext === "ppt" || mimeType === "application/vnd.ms-powerpoint")
66
+ return "ppt";
67
+ if (ext === "xlsx" || mimeType === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
68
+ return "xlsx";
69
+ if (ext === "xls" || mimeType === "application/vnd.ms-excel")
70
+ return "xls";
71
+ if (["html", "htm", "xhtml"].includes(ext) || mimeType === "text/html")
72
+ return "html";
73
+ if (ext === "svg" || mimeType === "image/svg+xml") return "svg";
74
+ if (ext === "zip" || mimeType === "application/zip" || mimeType === "application/x-zip-compressed")
75
+ return "zip";
76
+ if (ext === "rtf" || mimeType === "application/rtf" || mimeType === "text/rtf")
77
+ return "rtf";
78
+ if (ext === "epub" || mimeType === "application/epub+zip") return "epub";
79
+ if (IMAGE_EXTENSIONS.has(ext) || mimeType.startsWith("image/")) return "image";
80
+ if (VIDEO_EXTENSIONS.has(ext) || mimeType.startsWith("video/")) return "video";
81
+ if (AUDIO_EXTENSIONS.has(ext) || mimeType.startsWith("audio/")) return "audio";
82
+ if (CODE_EXTENSIONS[ext]) return "code";
83
+ if ([
84
+ "dockerfile",
85
+ "makefile",
86
+ "gnumakefile",
87
+ "gemfile",
88
+ "rakefile",
89
+ "vagrantfile",
90
+ ".gitignore",
91
+ ".env",
92
+ ".eslintrc",
93
+ ".prettierrc"
94
+ ].includes(baseName))
95
+ return "code";
96
+ if (["yml", "yaml", "xml"].includes(ext)) return "code";
97
+ if (mimeType.startsWith("text/") || [
98
+ "txt",
99
+ "log",
100
+ "conf",
101
+ "cfg",
102
+ "env",
103
+ "gitignore",
104
+ "eslintrc",
105
+ "prettierrc"
106
+ ].includes(ext))
107
+ return "text";
108
+ return "unknown";
109
+ }
110
+ function getLanguageFromFilename(filename) {
111
+ const ext = getFileExtension(filename);
112
+ const codeExts = {
113
+ ...CODE_EXTENSIONS,
114
+ html: "html",
115
+ htm: "html",
116
+ yml: "yaml",
117
+ yaml: "yaml",
118
+ xml: "xml",
119
+ vue: "html",
120
+ svelte: "html"
121
+ };
122
+ return codeExts[ext] || "text";
123
+ }
124
+ function formatFileSize(bytes) {
125
+ if (bytes === 0) return "0 B";
126
+ const k = 1024;
127
+ const sizes = ["B", "KB", "MB", "GB"];
128
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
129
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
130
+ }
131
+ function getFileTypeColor(fileType) {
132
+ const colors = {
133
+ pdf: "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",
134
+ markdown: "bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400",
135
+ json: "bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400",
136
+ code: "bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400",
137
+ docx: "bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-400",
138
+ doc: "bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-400",
139
+ pptx: "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400",
140
+ ppt: "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400",
141
+ xlsx: "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",
142
+ xls: "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",
143
+ html: "bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400",
144
+ zip: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",
145
+ svg: "bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400",
146
+ rtf: "bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400",
147
+ epub: "bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400",
148
+ image: "bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400",
149
+ text: "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",
150
+ csv: "bg-teal-100 text-teal-700 dark:bg-teal-900/30 dark:text-teal-400",
151
+ video: "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400",
152
+ audio: "bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-400",
153
+ unknown: "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"
154
+ };
155
+ return colors[fileType];
156
+ }
157
+ function getFileTypeLabel(fileType) {
158
+ const labels = {
159
+ pdf: "PDF",
160
+ markdown: "Markdown",
161
+ json: "JSON",
162
+ code: "Code",
163
+ docx: "Word",
164
+ doc: "Word",
165
+ pptx: "PPT",
166
+ ppt: "PPT",
167
+ xlsx: "Excel",
168
+ xls: "Excel",
169
+ html: "HTML",
170
+ zip: "ZIP",
171
+ svg: "SVG",
172
+ rtf: "RTF",
173
+ epub: "EPUB",
174
+ image: "Image",
175
+ text: "Text",
176
+ csv: "CSV",
177
+ video: "Video",
178
+ audio: "Audio",
179
+ unknown: "Unknown"
180
+ };
181
+ return labels[fileType];
182
+ }
183
+ function generateId() {
184
+ return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);
185
+ }
186
+ function base64ToUint8Array(base64) {
187
+ const binaryString = atob(base64);
188
+ const bytes = new Uint8Array(binaryString.length);
189
+ for (let i = 0; i < binaryString.length; i++) {
190
+ bytes[i] = binaryString.charCodeAt(i);
191
+ }
192
+ return bytes;
193
+ }
194
+ export {
195
+ ALL_FILE_TYPES,
196
+ base64ToUint8Array,
197
+ detectFileType,
198
+ formatFileSize,
199
+ generateId,
200
+ getFileExtension,
201
+ getFileTypeColor,
202
+ getFileTypeLabel,
203
+ getLanguageFromFilename
204
+ };
205
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["import type { FileType } from \"./core/types\";\nexport type { FileType, FileInfo } from \"./core/types\";\nexport { ALL_FILE_TYPES } from \"./core/types\";\n\nconst CODE_EXTENSIONS: Record<string, string> = {\n js: \"javascript\",\n jsx: \"jsx\",\n ts: \"typescript\",\n tsx: \"tsx\",\n py: \"python\",\n rb: \"ruby\",\n java: \"java\",\n c: \"c\",\n cpp: \"cpp\",\n cs: \"csharp\",\n go: \"go\",\n rs: \"rust\",\n php: \"php\",\n swift: \"swift\",\n kt: \"kotlin\",\n scala: \"scala\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n sql: \"sql\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n toml: \"toml\",\n ini: \"ini\",\n dockerfile: \"dockerfile\",\n makefile: \"makefile\",\n r: \"r\",\n lua: \"lua\",\n dart: \"dart\",\n vue: \"html\",\n svelte: \"html\",\n};\n\nconst IMAGE_EXTENSIONS = new Set([\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"bmp\",\n \"webp\",\n \"ico\",\n \"avif\",\n]);\n\nconst VIDEO_EXTENSIONS = new Set([\"mp4\", \"webm\", \"ogg\", \"mov\", \"avi\"]);\nconst AUDIO_EXTENSIONS = new Set([\"mp3\", \"wav\", \"ogg\", \"flac\", \"aac\", \"m4a\"]);\n\nexport function getFileExtension(filename: string): string {\n const parts = filename.toLowerCase().split(\".\");\n return parts.length > 1 ? parts[parts.length - 1] : \"\";\n}\n\nexport function detectFileType(filename: string, mimeType: string): FileType {\n const ext = getFileExtension(filename);\n const baseName = filename.toLowerCase().split(\"/\").pop() || \"\";\n\n // PDF\n if (ext === \"pdf\" || mimeType === \"application/pdf\") return \"pdf\";\n\n // Markdown\n if ([\"md\", \"mdx\", \"markdown\"].includes(ext)) return \"markdown\";\n\n // JSON\n if (ext === \"json\" || mimeType === \"application/json\") return \"json\";\n\n // CSV\n if (ext === \"csv\" || mimeType === \"text/csv\") return \"csv\";\n\n // DOCX\n if (\n ext === \"docx\" ||\n mimeType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n )\n return \"docx\";\n\n // DOC (legacy Word format)\n if (ext === \"doc\" || mimeType === \"application/msword\")\n return \"doc\";\n\n // PPTX\n if (\n ext === \"pptx\" ||\n mimeType ===\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n )\n return \"pptx\";\n\n // PPT (legacy PowerPoint binary format)\n if (ext === \"ppt\" || mimeType === \"application/vnd.ms-powerpoint\")\n return \"ppt\";\n\n // XLSX\n if (\n ext === \"xlsx\" ||\n mimeType ===\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n )\n return \"xlsx\";\n\n // XLS (legacy Excel binary format)\n if (ext === \"xls\" || mimeType === \"application/vnd.ms-excel\")\n return \"xls\";\n\n // HTML\n if ([\"html\", \"htm\", \"xhtml\"].includes(ext) || mimeType === \"text/html\")\n return \"html\";\n\n // SVG (separate from other images for enhanced preview)\n if (ext === \"svg\" || mimeType === \"image/svg+xml\") return \"svg\";\n\n // ZIP archives\n if (\n ext === \"zip\" ||\n mimeType === \"application/zip\" ||\n mimeType === \"application/x-zip-compressed\"\n )\n return \"zip\";\n\n // RTF\n if (ext === \"rtf\" || mimeType === \"application/rtf\" || mimeType === \"text/rtf\")\n return \"rtf\";\n\n // EPUB\n if (ext === \"epub\" || mimeType === \"application/epub+zip\") return \"epub\";\n\n // Images (non-SVG)\n if (IMAGE_EXTENSIONS.has(ext) || mimeType.startsWith(\"image/\")) return \"image\";\n\n // Videos\n if (VIDEO_EXTENSIONS.has(ext) || mimeType.startsWith(\"video/\")) return \"video\";\n\n // Audio\n if (AUDIO_EXTENSIONS.has(ext) || mimeType.startsWith(\"audio/\")) return \"audio\";\n\n // Code files (check after HTML since .html/.vue/.svelte should be \"html\" type)\n if (CODE_EXTENSIONS[ext]) return \"code\";\n\n if (\n [\n \"dockerfile\",\n \"makefile\",\n \"gnumakefile\",\n \"gemfile\",\n \"rakefile\",\n \"vagrantfile\",\n \".gitignore\",\n \".env\",\n \".eslintrc\",\n \".prettierrc\",\n ].includes(baseName)\n )\n return \"code\";\n\n // YAML / XML get their own code highlighting but are still \"code\" type\n if ([\"yml\", \"yaml\", \"xml\"].includes(ext)) return \"code\";\n\n // Text files\n if (\n mimeType.startsWith(\"text/\") ||\n [\n \"txt\",\n \"log\",\n \"conf\",\n \"cfg\",\n \"env\",\n \"gitignore\",\n \"eslintrc\",\n \"prettierrc\",\n ].includes(ext)\n )\n return \"text\";\n\n return \"unknown\";\n}\n\nexport function getLanguageFromFilename(filename: string): string {\n const ext = getFileExtension(filename);\n // Include HTML/Vue/Svelte here since they use code highlighter\n const codeExts: Record<string, string> = {\n ...CODE_EXTENSIONS,\n html: \"html\",\n htm: \"html\",\n yml: \"yaml\",\n yaml: \"yaml\",\n xml: \"xml\",\n vue: \"html\",\n svelte: \"html\",\n };\n return codeExts[ext] || \"text\";\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\nexport function getFileTypeColor(fileType: FileType): string {\n const colors: Record<FileType, string> = {\n pdf: \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400\",\n markdown: \"bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400\",\n json: \"bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400\",\n code: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400\",\n docx: \"bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-400\",\n doc: \"bg-sky-100 text-sky-700 dark:bg-sky-900/30 dark:text-sky-400\",\n pptx: \"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400\",\n ppt: \"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400\",\n xlsx: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400\",\n xls: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400\",\n html: \"bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400\",\n zip: \"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400\",\n svg: \"bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400\",\n rtf: \"bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400\",\n epub: \"bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400\",\n image: \"bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400\",\n text: \"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400\",\n csv: \"bg-teal-100 text-teal-700 dark:bg-teal-900/30 dark:text-teal-400\",\n video: \"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400\",\n audio: \"bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-400\",\n unknown: \"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400\",\n };\n return colors[fileType];\n}\n\nexport function getFileTypeLabel(fileType: FileType): string {\n const labels: Record<FileType, string> = {\n pdf: \"PDF\",\n markdown: \"Markdown\",\n json: \"JSON\",\n code: \"Code\",\n docx: \"Word\",\n doc: \"Word\",\n pptx: \"PPT\",\n ppt: \"PPT\",\n xlsx: \"Excel\",\n xls: \"Excel\",\n html: \"HTML\",\n zip: \"ZIP\",\n svg: \"SVG\",\n rtf: \"RTF\",\n epub: \"EPUB\",\n image: \"Image\",\n text: \"Text\",\n csv: \"CSV\",\n video: \"Video\",\n audio: \"Audio\",\n unknown: \"Unknown\",\n };\n return labels[fileType];\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substring(2, 9) + Date.now().toString(36);\n}\n\n/**\n * Decode base64 string to Uint8Array.\n * Shared utility used by PDF, DOCX, DOC, PPTX, XLSX, EPUB, ZIP preview components.\n */\nexport function base64ToUint8Array(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,125 @@
1
+ {
2
+ "name": "@lamberl-lee/file-preview",
3
+ "version": "0.2.0",
4
+ "description": "Browser-side file preview toolkit for React — 20+ formats (PDF, DOCX, PPTX, XLSX, EPUB, RTF, code, images, video, audio …) with zero server processing.",
5
+ "keywords": [
6
+ "react",
7
+ "file-preview",
8
+ "pdf",
9
+ "docx",
10
+ "pptx",
11
+ "xlsx",
12
+ "epub",
13
+ "rtf",
14
+ "markdown",
15
+ "code-preview",
16
+ "office",
17
+ "browser"
18
+ ],
19
+ "type": "module",
20
+ "sideEffects": [
21
+ "**/*.css"
22
+ ],
23
+ "author": "CoderLambert",
24
+ "homepage": "https://github.com/CoderLambert/filevista/tree/main/packages/file-preview#readme",
25
+ "bugs": {
26
+ "url": "https://github.com/CoderLambert/filevista/issues"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/CoderLambert/filevista.git",
31
+ "directory": "packages/file-preview"
32
+ },
33
+ "main": "./dist/index.js",
34
+ "module": "./dist/index.js",
35
+ "types": "./dist/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/index.d.ts",
39
+ "import": "./dist/index.js"
40
+ },
41
+ "./styles/index.css": "./dist/styles/index.css",
42
+ "./styles/*.css": "./dist/styles/*.css",
43
+ "./scripts/copy-pdf-worker.mjs": "./scripts/copy-pdf-worker.mjs",
44
+ "./scripts/copy-rtfjs-bundles.mjs": "./scripts/copy-rtfjs-bundles.mjs",
45
+ "./package.json": "./package.json"
46
+ },
47
+ "files": [
48
+ "dist",
49
+ "scripts",
50
+ "README.md",
51
+ "LICENSE",
52
+ "COPYING"
53
+ ],
54
+ "scripts": {
55
+ "build": "tsup",
56
+ "dev": "tsup --watch",
57
+ "typecheck": "tsc --noEmit",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest",
60
+ "copy:pdf-worker": "node scripts/copy-pdf-worker.mjs",
61
+ "copy:rtfjs-bundles": "node scripts/copy-rtfjs-bundles.mjs"
62
+ },
63
+ "peerDependencies": {
64
+ "react": "^18.2.0 || ^19.0.0",
65
+ "react-dom": "^18.2.0 || ^19.0.0",
66
+ "docx-preview": "^0.3.7",
67
+ "exceljs": "^4.4.0",
68
+ "jszip": "^3.10.1",
69
+ "pdfjs-dist": "^4.4.0",
70
+ "pptx-preview": "^1.0.7",
71
+ "rtf.js": "^3.0.9"
72
+ },
73
+ "peerDependenciesMeta": {
74
+ "docx-preview": {
75
+ "optional": true
76
+ },
77
+ "exceljs": {
78
+ "optional": true
79
+ },
80
+ "jszip": {
81
+ "optional": true
82
+ },
83
+ "pdfjs-dist": {
84
+ "optional": true
85
+ },
86
+ "pptx-preview": {
87
+ "optional": true
88
+ },
89
+ "rtf.js": {
90
+ "optional": true
91
+ }
92
+ },
93
+ "dependencies": {
94
+ "dompurify": "^3.4.8",
95
+ "react-markdown": "^10.1.0",
96
+ "remark-gfm": "^4.0.1",
97
+ "shiki": "^4.1.0"
98
+ },
99
+ "devDependencies": {
100
+ "@testing-library/jest-dom": "^6.9.1",
101
+ "@testing-library/react": "^16.3.2",
102
+ "@types/react": "^19.0.0",
103
+ "@types/react-dom": "^19.0.0",
104
+ "docx-preview": "^0.3.7",
105
+ "exceljs": "^4.4.0",
106
+ "jsdom": "^29.1.1",
107
+ "jszip": "^3.10.1",
108
+ "pdfjs-dist": "4.4.168",
109
+ "pptx-preview": "^1.0.7",
110
+ "react": "^19.0.0",
111
+ "react-dom": "^19.0.0",
112
+ "rtf.js": "^3.0.9",
113
+ "tsup": "^8.3.0",
114
+ "typescript": "^5",
115
+ "vitest": "^4.1.8"
116
+ },
117
+ "engines": {
118
+ "node": ">=22"
119
+ },
120
+ "license": "LGPL-3.0-or-later",
121
+ "publishConfig": {
122
+ "access": "public",
123
+ "registry": "https://registry.npmjs.org"
124
+ }
125
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Copy PDF.js worker into public/vendor/pdfjs/.
3
+ *
4
+ * `pdfjs-dist` is an *optional* peer dependency of @lamberl-lee/file-preview.
5
+ * If it's not installed (e.g. the consumer doesn't preview PDF files), this
6
+ * script is a no-op so the postinstall hook stays safe to run unconditionally.
7
+ */
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import { createRequire } from "node:module";
11
+
12
+ const require = createRequire(import.meta.url);
13
+
14
+ let workerPath;
15
+ try {
16
+ workerPath = require.resolve("pdfjs-dist/build/pdf.worker.min.mjs");
17
+ } catch {
18
+ console.log(
19
+ "[@lamberl-lee/file-preview] pdfjs-dist not installed — skipping PDF.js worker copy. " +
20
+ "Add pdfjs-dist to your dependencies to enable PDF preview.",
21
+ );
22
+ process.exit(0);
23
+ }
24
+
25
+ const targetDir = path.resolve("public/vendor/pdfjs");
26
+ const targetPath = path.join(targetDir, "pdf.worker.min.mjs");
27
+
28
+ fs.mkdirSync(targetDir, { recursive: true });
29
+ fs.copyFileSync(workerPath, targetPath);
30
+
31
+ console.log(`Copied PDF.js worker to ${targetPath}`);