@l1yp/file-viewer 0.1.1 → 0.1.2

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 (431) hide show
  1. package/README.md +1 -0
  2. package/dist/FileViewer.js +2 -0
  3. package/dist/FileViewer.js.map +1 -0
  4. package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  5. package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  6. package/dist/components/AppxViewer.js +2 -0
  7. package/dist/components/AppxViewer.js.map +1 -0
  8. package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  9. package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  10. package/dist/components/ArchiveBrowser.js +2 -0
  11. package/dist/components/ArchiveBrowser.js.map +1 -0
  12. package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  13. package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  14. package/dist/components/AudioViewer.js +2 -0
  15. package/dist/components/AudioViewer.js.map +1 -0
  16. package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  17. package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  18. package/dist/components/BinObjBrowser.js +2 -0
  19. package/dist/components/BinObjBrowser.js.map +1 -0
  20. package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  21. package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  22. package/dist/components/CertViewer.js +2 -0
  23. package/dist/components/CertViewer.js.map +1 -0
  24. package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  25. package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  26. package/dist/components/ClassViewer.js +2 -0
  27. package/dist/components/ClassViewer.js.map +1 -0
  28. package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  29. package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  30. package/dist/components/CodeBlock.js +2 -0
  31. package/dist/components/CodeBlock.js.map +1 -0
  32. package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
  33. package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
  34. package/dist/components/CodeView.js +2 -0
  35. package/dist/components/CodeView.js.map +1 -0
  36. package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js +2 -0
  37. package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  38. package/dist/components/CsvViewer.js +2 -0
  39. package/dist/components/CsvViewer.js.map +1 -0
  40. package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  41. package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  42. package/dist/components/DicomViewer.js +2 -0
  43. package/dist/components/DicomViewer.js.map +1 -0
  44. package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  45. package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  46. package/dist/components/DocxNavigationPane.js +2 -0
  47. package/dist/components/DocxNavigationPane.js.map +1 -0
  48. package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js +2 -0
  49. package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  50. package/dist/components/DocxViewer.js +2 -0
  51. package/dist/components/DocxViewer.js.map +1 -0
  52. package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  53. package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  54. package/dist/components/DrawioViewer.js +2 -0
  55. package/dist/components/DrawioViewer.js.map +1 -0
  56. package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  57. package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  58. package/dist/components/DxfViewer.js +2 -0
  59. package/dist/components/DxfViewer.js.map +1 -0
  60. package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  61. package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  62. package/dist/components/EbookViewer.js +2 -0
  63. package/dist/components/EbookViewer.js.map +1 -0
  64. package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  65. package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  66. package/dist/components/EmlViewer.js +2 -0
  67. package/dist/components/EmlViewer.js.map +1 -0
  68. package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  69. package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  70. package/dist/components/EplViewer.js +2 -0
  71. package/dist/components/EplViewer.js.map +1 -0
  72. package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  73. package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  74. package/dist/components/FileViewerBody.js +2 -0
  75. package/dist/components/FileViewerBody.js.map +1 -0
  76. package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js +2 -0
  77. package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js.map +1 -0
  78. package/dist/components/FileViewerPanel.js +2 -0
  79. package/dist/components/FileViewerPanel.js.map +1 -0
  80. package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js +2 -0
  81. package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  82. package/dist/components/FontViewer.js +2 -0
  83. package/dist/components/FontViewer.js.map +1 -0
  84. package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  85. package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  86. package/dist/components/FrontmatterCard.js +2 -0
  87. package/dist/components/FrontmatterCard.js.map +1 -0
  88. package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js +2 -0
  89. package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  90. package/dist/components/GeoViewer.js +2 -0
  91. package/dist/components/GeoViewer.js.map +1 -0
  92. package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  93. package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  94. package/dist/components/HarViewer.js +2 -0
  95. package/dist/components/HarViewer.js.map +1 -0
  96. package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  97. package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  98. package/dist/components/HexViewer.js +2 -0
  99. package/dist/components/HexViewer.js.map +1 -0
  100. package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  101. package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  102. package/dist/components/HprofViewer.js +2 -0
  103. package/dist/components/HprofViewer.js.map +1 -0
  104. package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  105. package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  106. package/dist/components/ImageLightbox.js +2 -0
  107. package/dist/components/ImageLightbox.js.map +1 -0
  108. package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js +2 -0
  109. package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  110. package/dist/components/InlineText.js +2 -0
  111. package/dist/components/InlineText.js.map +1 -0
  112. package/dist/components/JksViewer.js +2 -0
  113. package/dist/components/JksViewer.js.map +1 -0
  114. package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  115. package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  116. package/dist/components/JsonlViewer.js +2 -0
  117. package/dist/components/JsonlViewer.js.map +1 -0
  118. package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  119. package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  120. package/dist/components/LogViewer.js +2 -0
  121. package/dist/components/LogViewer.js.map +1 -0
  122. package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  123. package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  124. package/dist/components/LrcViewer.js +2 -0
  125. package/dist/components/LrcViewer.js.map +1 -0
  126. package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  127. package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  128. package/dist/components/MarkdownTable.js +2 -0
  129. package/dist/components/MarkdownTable.js.map +1 -0
  130. package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js +2 -0
  131. package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  132. package/dist/components/MarkdownText.js +2 -0
  133. package/dist/components/MarkdownText.js.map +1 -0
  134. package/dist/components/MhtViewer.js +2 -0
  135. package/dist/components/MhtViewer.js.map +1 -0
  136. package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  137. package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/components/MindMapView.js +2 -0
  139. package/dist/components/MindMapView.js.map +1 -0
  140. package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js +2 -0
  141. package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  142. package/dist/components/MissingDependency.js +2 -0
  143. package/dist/components/MissingDependency.js.map +1 -0
  144. package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js +2 -0
  145. package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js.map +1 -0
  146. package/dist/components/ModelViewer.js +2 -0
  147. package/dist/components/ModelViewer.js.map +1 -0
  148. package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  149. package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  150. package/dist/components/MsiViewer.js +2 -0
  151. package/dist/components/MsiViewer.js.map +1 -0
  152. package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  153. package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  154. package/dist/components/NotebookViewer.js +2 -0
  155. package/dist/components/NotebookViewer.js.map +1 -0
  156. package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  157. package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  158. package/dist/components/PdfViewer.js +2 -0
  159. package/dist/components/PdfViewer.js.map +1 -0
  160. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  161. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  162. package/dist/components/PptxNavigationPane.js +2 -0
  163. package/dist/components/PptxNavigationPane.js.map +1 -0
  164. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js +2 -0
  165. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  166. package/dist/components/PptxViewer.js +3 -1
  167. package/dist/components/PptxViewer.js.map +1 -0
  168. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js +55 -49
  169. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  170. package/dist/components/PsdViewer.js +2 -0
  171. package/dist/components/PsdViewer.js.map +1 -0
  172. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  173. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  174. package/dist/components/QmcAudioViewer.js +2 -0
  175. package/dist/components/QmcAudioViewer.js.map +1 -0
  176. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  177. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  178. package/dist/components/RasterViewer.js +2 -0
  179. package/dist/components/RasterViewer.js.map +1 -0
  180. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  181. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  182. package/dist/components/RtfViewer.js +2 -0
  183. package/dist/components/RtfViewer.js.map +1 -0
  184. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  185. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  186. package/dist/components/SevenZipBrowser.js +2 -0
  187. package/dist/components/SevenZipBrowser.js.map +1 -0
  188. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  189. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  190. package/dist/components/SqliteViewer.js +2 -0
  191. package/dist/components/SqliteViewer.js.map +1 -0
  192. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  193. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  194. package/dist/components/SubtitleViewer.js +2 -0
  195. package/dist/components/SubtitleViewer.js.map +1 -0
  196. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  197. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  198. package/dist/components/XlsxChart.js +2 -0
  199. package/dist/components/XlsxChart.js.map +1 -0
  200. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js +2 -0
  201. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  202. package/dist/components/XlsxViewer.js +2 -0
  203. package/dist/components/XlsxViewer.js.map +1 -0
  204. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  205. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  206. package/dist/components/XmindViewer.js +2 -0
  207. package/dist/components/XmindViewer.js.map +1 -0
  208. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  209. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  210. package/dist/components/ZipBrowser.js +2 -0
  211. package/dist/components/ZipBrowser.js.map +1 -0
  212. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  213. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  214. package/dist/components/ZoomImage.js +2 -0
  215. package/dist/components/ZoomImage.js.map +1 -0
  216. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js +2 -0
  217. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js.map +1 -0
  218. package/dist/components/epl/EplCodeBlock.js +2 -0
  219. package/dist/components/epl/EplCodeBlock.js.map +1 -0
  220. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
  221. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
  222. package/dist/components/epl/EplDoc.js +2 -0
  223. package/dist/components/epl/EplDoc.js.map +1 -0
  224. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js +2 -0
  225. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js.map +1 -0
  226. package/dist/components/epl/EplMethod.js +2 -0
  227. package/dist/components/epl/EplMethod.js.map +1 -0
  228. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js +2 -0
  229. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js.map +1 -0
  230. package/dist/components/epl/EplResource.js +2 -0
  231. package/dist/components/epl/EplResource.js.map +1 -0
  232. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js +2 -0
  233. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js.map +1 -0
  234. package/dist/components/epl/EplTree.js +2 -0
  235. package/dist/components/epl/EplTree.js.map +1 -0
  236. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js +2 -0
  237. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js.map +1 -0
  238. package/dist/components/epl/EplVarTable.js +2 -0
  239. package/dist/components/epl/EplVarTable.js.map +1 -0
  240. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js +2 -0
  241. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  242. package/dist/components/epl/numbering.js +2 -0
  243. package/dist/components/epl/numbering.js.map +1 -0
  244. package/dist/components/icons/Icon.js +2 -0
  245. package/dist/components/icons/Icon.js.map +1 -0
  246. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js +2 -0
  247. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js.map +1 -0
  248. package/dist/components/icons/iconPaths.js +2 -0
  249. package/dist/components/icons/iconPaths.js.map +1 -0
  250. package/dist/components/optionalViewer.js +2 -0
  251. package/dist/components/optionalViewer.js.map +1 -0
  252. package/dist/components/ui/ClampBlock.js +2 -0
  253. package/dist/components/ui/ClampBlock.js.map +1 -0
  254. package/dist/composables/useElementNavigation.js +2 -0
  255. package/dist/composables/useElementNavigation.js.map +1 -0
  256. package/dist/composables/useFileViewer.js +2 -0
  257. package/dist/composables/useFileViewer.js.map +1 -0
  258. package/dist/composables/useLightbox.js +2 -0
  259. package/dist/composables/useLightbox.js.map +1 -0
  260. package/dist/composables/useLogRules.js +2 -0
  261. package/dist/composables/useLogRules.js.map +1 -0
  262. package/dist/lib/aes.js +2 -0
  263. package/dist/lib/aes.js.map +1 -0
  264. package/dist/lib/appx.js +2 -0
  265. package/dist/lib/appx.js.map +1 -0
  266. package/dist/lib/archiveHtml.js +2 -0
  267. package/dist/lib/archiveHtml.js.map +1 -0
  268. package/dist/lib/asn1.js +2 -0
  269. package/dist/lib/asn1.js.map +1 -0
  270. package/dist/lib/binobj.js +2 -0
  271. package/dist/lib/binobj.js.map +1 -0
  272. package/dist/lib/brotli.js +2 -0
  273. package/dist/lib/brotli.js.map +1 -0
  274. package/dist/lib/bzip2.js +2 -0
  275. package/dist/lib/bzip2.js.map +1 -0
  276. package/dist/lib/classfile.js +2 -0
  277. package/dist/lib/classfile.js.map +1 -0
  278. package/dist/lib/codePreview.js +2 -0
  279. package/dist/lib/codePreview.js.map +1 -0
  280. package/dist/lib/codefold.js +2 -0
  281. package/dist/lib/codefold.js.map +1 -0
  282. package/dist/lib/codeformat.js +2 -0
  283. package/dist/lib/codeformat.js.map +1 -0
  284. package/dist/lib/csv.js +2 -0
  285. package/dist/lib/csv.js.map +1 -0
  286. package/dist/lib/des.js +2 -0
  287. package/dist/lib/des.js.map +1 -0
  288. package/dist/lib/diagram.js +2 -0
  289. package/dist/lib/diagram.js.map +1 -0
  290. package/dist/lib/dicom.js +2 -0
  291. package/dist/lib/dicom.js.map +1 -0
  292. package/dist/lib/dicomCodecs.js +2 -0
  293. package/dist/lib/dicomCodecs.js.map +1 -0
  294. package/dist/lib/dicomRender.js +2 -0
  295. package/dist/lib/dicomRender.js.map +1 -0
  296. package/dist/lib/docxNavigation.js +2 -0
  297. package/dist/lib/docxNavigation.js.map +1 -0
  298. package/dist/lib/dxf.js +2 -0
  299. package/dist/lib/dxf.js.map +1 -0
  300. package/dist/lib/eml.js +2 -0
  301. package/dist/lib/eml.js.map +1 -0
  302. package/dist/lib/encoding.js +2 -0
  303. package/dist/lib/encoding.js.map +1 -0
  304. package/dist/lib/epl/code/codeDataParser.js +2 -0
  305. package/dist/lib/epl/code/codeDataParser.js.map +1 -0
  306. package/dist/lib/epl/code/codeLines.js +2 -0
  307. package/dist/lib/epl/code/codeLines.js.map +1 -0
  308. package/dist/lib/epl/code/textCode.js +2 -0
  309. package/dist/lib/epl/code/textCode.js.map +1 -0
  310. package/dist/lib/epl/eplDocument.js +2 -0
  311. package/dist/lib/epl/eplDocument.js.map +1 -0
  312. package/dist/lib/epl/imageList.js +2 -0
  313. package/dist/lib/epl/imageList.js.map +1 -0
  314. package/dist/lib/epl/index.js +2 -0
  315. package/dist/lib/epl/index.js.map +1 -0
  316. package/dist/lib/epl/io/binaryReader.js +2 -0
  317. package/dist/lib/epl/io/binaryReader.js.map +1 -0
  318. package/dist/lib/epl/io/encoding.js +2 -0
  319. package/dist/lib/epl/io/encoding.js.map +1 -0
  320. package/dist/lib/epl/model/eplSystemId.js +2 -0
  321. package/dist/lib/epl/model/eplSystemId.js.map +1 -0
  322. package/dist/lib/epl/names/eplLibData.js +2 -0
  323. package/dist/lib/epl/names/eplLibData.js.map +1 -0
  324. package/dist/lib/epl/names/idToNameMap.js +2 -0
  325. package/dist/lib/epl/names/idToNameMap.js.map +1 -0
  326. package/dist/lib/epl/names/libNameProvider.js +2 -0
  327. package/dist/lib/epl/names/libNameProvider.js.map +1 -0
  328. package/dist/lib/epl/program.js +2 -0
  329. package/dist/lib/epl/program.js.map +1 -0
  330. package/dist/lib/epl/projectFileReader.js +2 -0
  331. package/dist/lib/epl/projectFileReader.js.map +1 -0
  332. package/dist/lib/fb2.js +2 -0
  333. package/dist/lib/fb2.js.map +1 -0
  334. package/dist/lib/fileType.js +2 -0
  335. package/dist/lib/fileType.js.map +1 -0
  336. package/dist/lib/fonts.js +2 -0
  337. package/dist/lib/fonts.js.map +1 -0
  338. package/dist/lib/format.js +2 -0
  339. package/dist/lib/format.js.map +1 -0
  340. package/dist/lib/frontmatter.js +2 -0
  341. package/dist/lib/frontmatter.js.map +1 -0
  342. package/dist/lib/geo.js +2 -0
  343. package/dist/lib/geo.js.map +1 -0
  344. package/dist/lib/har.js +2 -0
  345. package/dist/lib/har.js.map +1 -0
  346. package/dist/lib/highlight.js +2 -0
  347. package/dist/lib/highlight.js.map +1 -0
  348. package/dist/lib/highlightLangs.js +2 -0
  349. package/dist/lib/highlightLangs.js.map +1 -0
  350. package/dist/lib/hprof.js +2 -0
  351. package/dist/lib/hprof.js.map +1 -0
  352. package/dist/lib/ipynb.js +2 -0
  353. package/dist/lib/ipynb.js.map +1 -0
  354. package/dist/lib/jks.js +2 -0
  355. package/dist/lib/jks.js.map +1 -0
  356. package/dist/lib/jsonl.js +2 -0
  357. package/dist/lib/jsonl.js.map +1 -0
  358. package/dist/lib/lrc.js +2 -0
  359. package/dist/lib/lrc.js.map +1 -0
  360. package/dist/lib/lzma.js +2 -0
  361. package/dist/lib/lzma.js.map +1 -0
  362. package/dist/lib/markdown/blocks.js +2 -0
  363. package/dist/lib/markdown/blocks.js.map +1 -0
  364. package/dist/lib/markdown/inline.js +2 -0
  365. package/dist/lib/markdown/inline.js.map +1 -0
  366. package/dist/lib/markdown/math.js +2 -0
  367. package/dist/lib/markdown/math.js.map +1 -0
  368. package/dist/lib/markdown/segmentize.js +2 -0
  369. package/dist/lib/markdown/segmentize.js.map +1 -0
  370. package/dist/lib/markdown/styles.js +2 -0
  371. package/dist/lib/markdown/styles.js.map +1 -0
  372. package/dist/lib/mht.js +2 -0
  373. package/dist/lib/mht.js.map +1 -0
  374. package/dist/lib/midi.js +2 -0
  375. package/dist/lib/midi.js.map +1 -0
  376. package/dist/lib/mime.js +2 -0
  377. package/dist/lib/mime.js.map +1 -0
  378. package/dist/lib/mindmap.js +2 -0
  379. package/dist/lib/mindmap.js.map +1 -0
  380. package/dist/lib/mobi.js +2 -0
  381. package/dist/lib/mobi.js.map +1 -0
  382. package/dist/lib/msi.js +2 -0
  383. package/dist/lib/msi.js.map +1 -0
  384. package/dist/lib/optionalDep.js +2 -0
  385. package/dist/lib/optionalDep.js.map +1 -0
  386. package/dist/lib/pkcs12.js +2 -0
  387. package/dist/lib/pkcs12.js.map +1 -0
  388. package/dist/lib/pptxNavigation.js +2 -0
  389. package/dist/lib/pptxNavigation.js.map +1 -0
  390. package/dist/lib/qmc.js +2 -0
  391. package/dist/lib/qmc.js.map +1 -0
  392. package/dist/lib/rar.js +2 -0
  393. package/dist/lib/rar.js.map +1 -0
  394. package/dist/lib/rawPreview.js +2 -0
  395. package/dist/lib/rawPreview.js.map +1 -0
  396. package/dist/lib/rc2.js +2 -0
  397. package/dist/lib/rc2.js.map +1 -0
  398. package/dist/lib/resolveInput.js +2 -0
  399. package/dist/lib/resolveInput.js.map +1 -0
  400. package/dist/lib/rtf.js +2 -0
  401. package/dist/lib/rtf.js.map +1 -0
  402. package/dist/lib/sevenZip.js +2 -0
  403. package/dist/lib/sevenZip.js.map +1 -0
  404. package/dist/lib/sha1.js +2 -0
  405. package/dist/lib/sha1.js.map +1 -0
  406. package/dist/lib/sha256.js +2 -0
  407. package/dist/lib/sha256.js.map +1 -0
  408. package/dist/lib/speechAudio.js +2 -0
  409. package/dist/lib/speechAudio.js.map +1 -0
  410. package/dist/lib/sqlite.js +2 -0
  411. package/dist/lib/sqlite.js.map +1 -0
  412. package/dist/lib/subtitle.js +2 -0
  413. package/dist/lib/subtitle.js.map +1 -0
  414. package/dist/lib/tarball.js +2 -0
  415. package/dist/lib/tarball.js.map +1 -0
  416. package/dist/lib/viewerFormats.js +2 -0
  417. package/dist/lib/viewerFormats.js.map +1 -0
  418. package/dist/lib/viewerKind.js +2 -0
  419. package/dist/lib/viewerKind.js.map +1 -0
  420. package/dist/lib/x509.js +2 -0
  421. package/dist/lib/x509.js.map +1 -0
  422. package/dist/lib/xlsx.js +2 -0
  423. package/dist/lib/xlsx.js.map +1 -0
  424. package/dist/lib/xlsxCharts.js +2 -0
  425. package/dist/lib/xlsxCharts.js.map +1 -0
  426. package/dist/lib/xmind.js +2 -0
  427. package/dist/lib/xmind.js.map +1 -0
  428. package/dist/lib/zip.js +2 -0
  429. package/dist/lib/zip.js.map +1 -0
  430. package/dist/style.css +1 -1
  431. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aes.js","names":[],"sources":["../../src/lib/aes.ts"],"sourcesContent":["/**\n * Compact AES shared by the in-browser archive viewers — no dependency, no WASM.\n *\n * The FORWARD cipher drives CTR mode (WinZip-AES ZIP extraction, see {@link lib/zip.ts}); the INVERSE\n * cipher drives CBC decryption (AES-256 encrypted 7z extraction, see {@link lib/sevenZip.ts}). The S-box is\n * generated from the GF(2^8) affine transform (not tabled); the inverse S-box and the GF multiplies for\n * InvMixColumns are derived from it. Key derivation (PBKDF2 / SHA-256) stays in each caller via WebCrypto —\n * this module is pure block/mode math and stays synchronous.\n *\n * State layout is column-major: byte `s[4*col + row]`, matching the AES spec's column words. Encrypt and\n * decrypt share the key schedule and AddRoundKey; only Sub/Shift/Mix differ (forward vs inverse).\n */\n\n// S-box generated from the affine transform over GF(2^8).\nconst SBOX = /* @__PURE__ */ (() => {\n const sbox = new Uint8Array(256)\n const rotl8 = (x: number, s: number): number => ((x << s) | (x >> (8 - s))) & 0xff\n let p = 1\n let q = 1\n do {\n p = (p ^ (p << 1) ^ (p & 0x80 ? 0x11b : 0)) & 0xff\n q ^= q << 1\n q ^= q << 2\n q ^= q << 4\n q &= 0xff\n if (q & 0x80) q ^= 0x09\n q &= 0xff\n sbox[p] = (q ^ rotl8(q, 1) ^ rotl8(q, 2) ^ rotl8(q, 3) ^ rotl8(q, 4) ^ 0x63) & 0xff\n } while (p !== 1)\n sbox[0] = 0x63\n return sbox\n})()\n// Inverse S-box: INV_SBOX[SBOX[i]] = i.\nconst INV_SBOX = /* @__PURE__ */ (() => {\n const inv = new Uint8Array(256)\n for (let i = 0; i < 256; i++) inv[SBOX[i]] = i\n return inv\n})()\nconst RCON = new Uint8Array([0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c])\nconst xtime = (a: number): number => ((a << 1) ^ (a & 0x80 ? 0x11b : 0)) & 0xff\n// GF(2^8) multiply (peasant) — only InvMixColumns needs the {09,0b,0d,0e} multiplies.\nfunction gmul(a: number, b: number): number {\n let p = 0\n for (let i = 0; i < 8 && b; i++) {\n if (b & 1) p ^= a\n const hi = a & 0x80\n a = (a << 1) & 0xff\n if (hi) a ^= 0x1b\n b >>= 1\n }\n return p & 0xff\n}\n\n/** Expand a 16/24/32-byte key into the round-key word schedule. */\nexport function aesKeySchedule(key: Uint8Array): Uint32Array {\n const Nk = key.length / 4\n const Nr = Nk + 6\n const w = new Uint32Array(4 * (Nr + 1))\n for (let i = 0; i < Nk; i++) {\n w[i] =\n ((key[4 * i] << 24) | (key[4 * i + 1] << 16) | (key[4 * i + 2] << 8) | key[4 * i + 3]) >>> 0\n }\n const sub = (x: number): number =>\n ((SBOX[(x >>> 24) & 0xff] << 24) |\n (SBOX[(x >>> 16) & 0xff] << 16) |\n (SBOX[(x >>> 8) & 0xff] << 8) |\n SBOX[x & 0xff]) >>>\n 0\n const rot = (x: number): number => ((x << 8) | (x >>> 24)) >>> 0\n for (let i = Nk; i < w.length; i++) {\n let t = w[i - 1]\n if (i % Nk === 0) t = (sub(rot(t)) ^ (RCON[i / Nk - 1] << 24)) >>> 0\n else if (Nk > 6 && i % Nk === 4) t = sub(t)\n w[i] = (w[i - Nk] ^ t) >>> 0\n }\n return w\n}\n\nfunction addRoundKey(s: Uint8Array, w: Uint32Array, round: number): void {\n for (let c = 0; c < 4; c++) {\n const k = w[round * 4 + c]\n s[4 * c] ^= (k >>> 24) & 0xff\n s[4 * c + 1] ^= (k >>> 16) & 0xff\n s[4 * c + 2] ^= (k >>> 8) & 0xff\n s[4 * c + 3] ^= k & 0xff\n }\n}\n\n/** Encrypt one 16-byte block in place into `out` (forward cipher). */\nexport function aesEncryptBlock(w: Uint32Array, block: Uint8Array, out: Uint8Array): void {\n const Nr = w.length / 4 - 1\n const s = out\n s.set(block)\n addRoundKey(s, w, 0)\n for (let round = 1; round <= Nr; round++) {\n for (let i = 0; i < 16; i++) s[i] = SBOX[s[i]]\n // ShiftRows (row r rotates LEFT by r)\n let tmp = s[1]\n s[1] = s[5]\n s[5] = s[9]\n s[9] = s[13]\n s[13] = tmp\n tmp = s[2]\n s[2] = s[10]\n s[10] = tmp\n tmp = s[6]\n s[6] = s[14]\n s[14] = tmp\n tmp = s[15]\n s[15] = s[11]\n s[11] = s[7]\n s[7] = s[3]\n s[3] = tmp\n if (round < Nr) {\n for (let c = 0; c < 4; c++) {\n const i = 4 * c\n const a0 = s[i]\n const a1 = s[i + 1]\n const a2 = s[i + 2]\n const a3 = s[i + 3]\n const t = a0 ^ a1 ^ a2 ^ a3\n s[i] ^= t ^ xtime(a0 ^ a1)\n s[i + 1] ^= t ^ xtime(a1 ^ a2)\n s[i + 2] ^= t ^ xtime(a2 ^ a3)\n s[i + 3] ^= t ^ xtime(a3 ^ a0)\n }\n }\n addRoundKey(s, w, round)\n }\n}\n\n/** Decrypt one 16-byte block in place into `out` (inverse cipher). */\nexport function aesDecryptBlock(w: Uint32Array, block: Uint8Array, out: Uint8Array): void {\n const Nr = w.length / 4 - 1\n const s = out\n s.set(block)\n addRoundKey(s, w, Nr)\n for (let round = Nr - 1; round >= 0; round--) {\n // InvShiftRows (row r rotates RIGHT by r)\n let tmp = s[13]\n s[13] = s[9]\n s[9] = s[5]\n s[5] = s[1]\n s[1] = tmp\n tmp = s[2]\n s[2] = s[10]\n s[10] = tmp\n tmp = s[6]\n s[6] = s[14]\n s[14] = tmp\n tmp = s[3]\n s[3] = s[7]\n s[7] = s[11]\n s[11] = s[15]\n s[15] = tmp\n for (let i = 0; i < 16; i++) s[i] = INV_SBOX[s[i]]\n addRoundKey(s, w, round)\n if (round > 0) {\n for (let c = 0; c < 4; c++) {\n const i = 4 * c\n const a0 = s[i]\n const a1 = s[i + 1]\n const a2 = s[i + 2]\n const a3 = s[i + 3]\n s[i] = gmul(a0, 14) ^ gmul(a1, 11) ^ gmul(a2, 13) ^ gmul(a3, 9)\n s[i + 1] = gmul(a0, 9) ^ gmul(a1, 14) ^ gmul(a2, 11) ^ gmul(a3, 13)\n s[i + 2] = gmul(a0, 13) ^ gmul(a1, 9) ^ gmul(a2, 14) ^ gmul(a3, 11)\n s[i + 3] = gmul(a0, 11) ^ gmul(a1, 13) ^ gmul(a2, 9) ^ gmul(a3, 14)\n }\n }\n }\n}\n\n/** WinZip AES-CTR keystream (counter is a 16-byte LITTLE-endian integer starting at 1) XORed over `data`. */\nexport function aesCtrXor(key: Uint8Array, data: Uint8Array): Uint8Array {\n const w = aesKeySchedule(key)\n const out = new Uint8Array(data.length)\n const counter = new Uint8Array(16)\n const ks = new Uint8Array(16)\n let block = 1\n for (let off = 0; off < data.length; off += 16) {\n let v = block++\n for (let i = 0; i < 8; i++) {\n counter[i] = v & 0xff\n v = Math.floor(v / 256)\n }\n aesEncryptBlock(w, counter, ks)\n const n = Math.min(16, data.length - off)\n for (let i = 0; i < n; i++) out[off + i] = data[off + i] ^ ks[i]\n }\n return out\n}\n\n/**\n * AES-CBC decrypt (no padding removal — 7z stores the real output length separately and its ciphertext is a\n * whole number of blocks). `iv` is 16 bytes; only full 16-byte blocks of `data` are processed.\n */\nexport function aesCbcDecrypt(key: Uint8Array, iv: Uint8Array, data: Uint8Array): Uint8Array {\n const w = aesKeySchedule(key)\n const n = data.length - (data.length % 16)\n const out = new Uint8Array(n)\n const dec = new Uint8Array(16)\n const prev = new Uint8Array(16)\n prev.set(iv.subarray(0, 16))\n for (let off = 0; off < n; off += 16) {\n const block = data.subarray(off, off + 16)\n aesDecryptBlock(w, block, dec)\n for (let i = 0; i < 16; i++) out[off + i] = dec[i] ^ prev[i]\n prev.set(block)\n }\n return out\n}\n"],"mappings":"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"}
package/dist/lib/appx.js CHANGED
@@ -110,3 +110,5 @@ function l(e, t) {
110
110
  }
111
111
  //#endregion
112
112
  export { n as NotAppxError, r as parseAppx };
113
+
114
+ //# sourceMappingURL=appx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appx.js","names":[],"sources":["../../src/lib/appx.ts"],"sourcesContent":["/**\n * In-browser APPX / MSIX package reader — no dependency beyond the project's own ZIP reader.\n *\n * An `.appx`/`.msix` (and `.appxbundle`/`.msixbundle`) is NOT a PE and NOT an OLE compound file — it's an\n * **OPC ZIP archive** (the same container `.docx`/`.jar` use). Its metadata lives in an XML manifest inside:\n * - a single package: `AppxManifest.xml` — `<Identity>` (name/version/arch/publisher), `<Properties>`\n * (display + publisher names), `<Dependencies>` (target OS + package deps), `<Capabilities>`,\n * `<Applications>`, and the declared `<Resources>` languages.\n * - a bundle: `AppxMetadata/AppxBundleManifest.xml` — `<Identity>` + the list of contained `<Package>`s.\n *\n * We decompress just the manifest with the project's ZIP reader (lib/zip.ts — browser-native DEFLATE) and\n * read the fields with the DOM (namespace-agnostic local-name matching, since real manifests sprinkle uap/\n * rescap/wincap prefixes). The manifest structure was checked against a real Microsoft Store `.appx`.\n *\n * Used by AppxViewer (the side viewer's APPX mode): the bytes come from the same download endpoint as any\n * other file, are unzipped + parsed entirely client-side, and never leave the browser.\n */\n\nimport { readZip, extractZipEntry, type ZipEntry } from '@/lib/zip'\n\nexport interface AppxVersionRef {\n name: string\n minVersion?: string\n maxVersionTested?: string\n publisher?: string\n}\nexport interface AppxApp {\n id: string\n displayName?: string\n description?: string\n}\nexport interface AppxBundlePackage {\n type?: string\n architecture?: string\n version?: string\n fileName?: string\n}\n\nexport interface AppxInfo {\n kind: 'package' | 'bundle'\n /** Identity (`<Identity>`): the package family identity. */\n name?: string\n version?: string\n architecture?: string\n /** Raw publisher distinguished name, e.g. \"CN=Microsoft Corporation, …\". */\n publisher?: string\n /** `<Properties>` display fields (DisplayName may be an `ms-resource:…` reference we can't resolve here). */\n displayName?: string\n publisherDisplayName?: string\n description?: string\n /** `<Dependencies>`: target OS families + package dependencies. */\n targetDeviceFamilies: AppxVersionRef[]\n packageDependencies: AppxVersionRef[]\n /** `<Capabilities>` declared capability names (restricted/device ones included). */\n capabilities: string[]\n /** `<Applications>` entry points. */\n applications: AppxApp[]\n /** Declared resource languages (`<Resources><Resource Language=…>`). */\n languages: string[]\n /** For a bundle: the contained packages. */\n bundlePackages: AppxBundlePackage[]\n /** Number of files in the archive. */\n fileCount: number\n notes: string[]\n}\n\n/** Thrown when the bytes aren't an APPX/MSIX (not a zip, or no manifest inside). */\nexport class NotAppxError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NotAppxError'\n }\n}\n\nexport async function parseAppx(buf: ArrayBuffer): Promise<AppxInfo> {\n let entries: ZipEntry[]\n try {\n entries = readZip(buf)\n } catch {\n throw new NotAppxError('不是有效的 APPX/MSIX(无法读取 ZIP 容器)')\n }\n const find = (path: string): ZipEntry | undefined =>\n entries.find((e) => e.path.toLowerCase() === path.toLowerCase())\n const pkgEntry = find('AppxManifest.xml')\n const bundleEntry = find('AppxMetadata/AppxBundleManifest.xml') ?? find('AppxBundleManifest.xml')\n const manifestEntry = pkgEntry ?? bundleEntry\n if (!manifestEntry) {\n throw new NotAppxError('未找到 AppxManifest.xml(不是 APPX/MSIX 包)')\n }\n\n const bytes = await extractZipEntry(buf, manifestEntry)\n const xml = new TextDecoder('utf-8').decode(bytes)\n const doc = new DOMParser().parseFromString(xml, 'application/xml')\n if (doc.getElementsByTagName('parsererror').length > 0) {\n throw new NotAppxError('AppxManifest.xml 解析失败(XML 无效)')\n }\n const fileCount = entries.filter((e) => !e.isDir).length\n return pkgEntry ? parsePackage(doc, fileCount) : parseBundle(doc, fileCount)\n}\n\n// ── DOM helpers (namespace-agnostic: match by localName, since prefixes vary uap/uap4/rescap/wincap/…) ──\nfunction byLocal(root: Element | Document, local: string): Element[] {\n const all = root.getElementsByTagName('*')\n const out: Element[] = []\n for (let i = 0; i < all.length; i++) if (all[i].localName === local) out.push(all[i])\n return out\n}\nfunction firstLocal(root: Element | Document | null, local: string): Element | null {\n if (!root) return null\n const all = root.getElementsByTagName('*')\n for (let i = 0; i < all.length; i++) if (all[i].localName === local) return all[i]\n return null\n}\nfunction attr(el: Element | null, name: string): string | undefined {\n const v = el?.getAttribute(name)\n return v == null || v === '' ? undefined : v\n}\nfunction textOf(root: Element | null, local: string): string | undefined {\n const t = firstLocal(root, local)?.textContent?.trim()\n return t ? t : undefined\n}\n\nfunction parsePackage(doc: Document, fileCount: number): AppxInfo {\n const identity = firstLocal(doc, 'Identity')\n const props = firstLocal(doc, 'Properties')\n\n const targetDeviceFamilies = byLocal(doc, 'TargetDeviceFamily').map((e) => ({\n name: attr(e, 'Name') ?? '',\n minVersion: attr(e, 'MinVersion'),\n maxVersionTested: attr(e, 'MaxVersionTested'),\n }))\n const packageDependencies = byLocal(doc, 'PackageDependency').map((e) => ({\n name: attr(e, 'Name') ?? '',\n minVersion: attr(e, 'MinVersion'),\n publisher: attr(e, 'Publisher'),\n }))\n\n // Capabilities: any child of <Capabilities> carrying a Name (Capability / rescap:Capability / DeviceCapability…).\n const capabilities: string[] = []\n const capsRoot = firstLocal(doc, 'Capabilities')\n if (capsRoot) {\n const kids = capsRoot.getElementsByTagName('*')\n for (let i = 0; i < kids.length; i++) {\n const n = attr(kids[i], 'Name')\n if (n && !capabilities.includes(n)) capabilities.push(n)\n }\n }\n\n const applications = byLocal(doc, 'Application').map((a) => {\n const ve = firstLocal(a, 'VisualElements')\n return {\n id: attr(a, 'Id') ?? '',\n displayName: attr(ve, 'DisplayName'),\n description: attr(ve, 'Description'),\n }\n })\n\n const languages: string[] = []\n for (const r of byLocal(doc, 'Resource')) {\n const l = attr(r, 'Language')\n if (l && !languages.includes(l)) languages.push(l)\n }\n\n return {\n kind: 'package',\n name: attr(identity, 'Name'),\n version: attr(identity, 'Version'),\n architecture: attr(identity, 'ProcessorArchitecture'),\n publisher: attr(identity, 'Publisher'),\n displayName: textOf(props, 'DisplayName'),\n publisherDisplayName: textOf(props, 'PublisherDisplayName'),\n description: textOf(props, 'Description'),\n targetDeviceFamilies,\n packageDependencies,\n capabilities,\n applications,\n languages,\n bundlePackages: [],\n fileCount,\n notes: [],\n }\n}\n\nfunction parseBundle(doc: Document, fileCount: number): AppxInfo {\n const identity = firstLocal(doc, 'Identity')\n // A bundle manifest lists its contained packages; skip the <Resources> (per-package language slivers).\n const bundlePackages = byLocal(doc, 'Package').map((p) => ({\n type: attr(p, 'Type'),\n architecture: attr(p, 'Architecture'),\n version: attr(p, 'Version'),\n fileName: attr(p, 'FileName'),\n }))\n return {\n kind: 'bundle',\n name: attr(identity, 'Name'),\n version: attr(identity, 'Version'),\n architecture: undefined,\n publisher: attr(identity, 'Publisher'),\n targetDeviceFamilies: [],\n packageDependencies: [],\n capabilities: [],\n applications: [],\n languages: [],\n bundlePackages,\n fileCount,\n notes: [],\n }\n}\n"],"mappings":"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"}
@@ -373,3 +373,5 @@ async function C(e) {
373
373
  }
374
374
  //#endregion
375
375
  export { C as buildArchiveHtmlPreview };
376
+
377
+ //# sourceMappingURL=archiveHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archiveHtml.js","names":[],"sources":["../../src/lib/archiveHtml.ts"],"sourcesContent":["/**\n * Build a renderable HTML document from one entry inside an archive.\n *\n * A selected ZIP entry normally gets a single `blob:` URL. That is enough for the HTML bytes themselves, but\n * relative references such as `./assets/app.js` and `./styles/site.css` have nowhere to resolve: blob URLs have\n * no archive directory behind them. This module treats the archive's flat entry list as a tiny read-only web\n * root, extracts only resources referenced by the selected document, and rewrites those references to `data:`\n * URLs before the document reaches FileViewerBody's sandboxed iframe.\n *\n * `data:` is deliberate rather than `blob:`. FileViewerBody's opt-in interactive iframe uses `allow-scripts`\n * WITHOUT `allow-same-origin`, giving it an opaque origin. Chromium correctly refuses subresource blob URLs\n * minted by the parent from that opaque frame, while data URLs remain loadable. Scripts therefore still run\n * only after the existing explicit opt-in, but both inert CSS/image preview and interactive JS work reliably.\n */\n\nimport { decodeTextSniff } from '@/lib/encoding'\nimport { fileExt } from '@/lib/fileType'\nimport { bytesToBinary } from '@/lib/mime'\n\nexport interface ArchiveHtmlEntry {\n path: string\n name: string\n size: number\n isDir: boolean\n}\n\nexport interface ArchiveHtmlPreviewOptions<T extends ArchiveHtmlEntry> {\n html: string\n documentPath: string\n entries: readonly T[]\n loadEntry: (entry: T) => Uint8Array | Promise<Uint8Array>\n /** Maximum number of distinct dependency entries automatically extracted. */\n maxResources?: number\n /** Maximum declared/decoded bytes across automatically extracted dependencies. */\n maxTotalBytes?: number\n /** Maximum declared/decoded bytes for one dependency. */\n maxEntryBytes?: number\n}\n\nexport interface ArchiveHtmlPreview {\n html: string\n loadedResources: number\n skippedResources: number\n}\n\ntype ResourceKind = 'raw' | 'css' | 'module' | 'html'\n\nconst DEFAULT_MAX_RESOURCES = 512\nconst DEFAULT_MAX_TOTAL_BYTES = 64 * 1024 * 1024\nconst DEFAULT_MAX_ENTRY_BYTES = 32 * 1024 * 1024\n\nconst MIME_BY_EXT: Record<string, string> = {\n css: 'text/css',\n js: 'text/javascript',\n mjs: 'text/javascript',\n cjs: 'text/javascript',\n json: 'application/json',\n map: 'application/json',\n wasm: 'application/wasm',\n html: 'text/html',\n htm: 'text/html',\n xhtml: 'application/xhtml+xml',\n xml: 'application/xml',\n svg: 'image/svg+xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n avif: 'image/avif',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n opus: 'audio/opus',\n flac: 'audio/flac',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n woff: 'font/woff',\n woff2: 'font/woff2',\n ttf: 'font/ttf',\n otf: 'font/otf',\n eot: 'application/vnd.ms-fontobject',\n txt: 'text/plain',\n}\n\nfunction mimeForName(name: string): string {\n return MIME_BY_EXT[fileExt(name)] ?? 'application/octet-stream'\n}\n\nfunction dataUrl(bytes: Uint8Array, contentType: string): string {\n return `data:${contentType};base64,${btoa(bytesToBinary(bytes))}`\n}\n\nfunction stripQueryAndHash(ref: string): string {\n const end = ref.search(/[?#]/)\n return end < 0 ? ref : ref.slice(0, end)\n}\n\nfunction decodePath(path: string): string {\n try {\n return decodeURIComponent(path)\n } catch {\n return path\n }\n}\n\nfunction normalizePath(path: string): string | null {\n const out: string[] = []\n for (const part of decodePath(path).replace(/\\\\/g, '/').split('/')) {\n if (!part || part === '.') continue\n if (part === '..') {\n if (!out.length) return null\n out.pop()\n continue\n }\n out.push(part)\n }\n return out.join('/')\n}\n\nfunction dirOf(path: string): string {\n const i = path.lastIndexOf('/')\n return i < 0 ? '' : path.slice(0, i)\n}\n\nfunction isExternalOrInlineReference(ref: string): boolean {\n const s = ref.trim()\n return (\n !s ||\n s.startsWith('#') ||\n s.startsWith('?') ||\n s.startsWith('//') ||\n /^[a-z][a-z\\d+.-]*:/i.test(s)\n )\n}\n\n/**\n * Index archive entries and resolve an HTML/CSS/JS reference against the entry containing it.\n *\n * Root-relative references first target the real archive root, then the selected document's top-level wrapper\n * directory (the usual `site/index.html` ZIP layout). A case-insensitive fallback handles archives produced on\n * Windows without changing the exact-match preference of case-sensitive ZIP paths.\n */\nfunction archiveReferenceCandidates(ref: string, basePath: string): string[] {\n if (isExternalOrInlineReference(ref)) return []\n const bare = stripQueryAndHash(ref.trim())\n if (!bare) return []\n const cleanBase = normalizePath(basePath) ?? ''\n const baseDir = dirOf(cleanBase)\n const raw = bare.replace(/\\\\/g, '/')\n const candidates: string[] = []\n\n if (raw.startsWith('/')) {\n const rootPath = normalizePath(raw.slice(1))\n if (rootPath) candidates.push(rootPath)\n const wrapper = cleanBase.split('/')[0]\n if (wrapper && cleanBase.includes('/') && rootPath) {\n const wrapped = normalizePath(`${wrapper}/${rootPath}`)\n if (wrapped) candidates.push(wrapped)\n }\n if (baseDir && rootPath) {\n const local = normalizePath(`${baseDir}/${rootPath}`)\n if (local) candidates.push(local)\n }\n } else {\n const relative = normalizePath(baseDir ? `${baseDir}/${raw}` : raw)\n if (relative) candidates.push(relative)\n }\n return candidates\n}\n\nexport function createArchiveEntryResolver<T extends ArchiveHtmlEntry>(entries: readonly T[]) {\n const exact = new Map<string, T>()\n const folded = new Map<string, T | null>()\n for (const entry of entries) {\n if (entry.isDir) continue\n const path = normalizePath(entry.path)\n if (!path) continue\n exact.set(path, entry)\n const key = path.toLocaleLowerCase()\n if (!folded.has(key)) folded.set(key, entry)\n else folded.set(key, null)\n }\n\n const lookup = (path: string): T | undefined => {\n const hit = exact.get(path)\n if (hit) return hit\n return folded.get(path.toLocaleLowerCase()) ?? undefined\n }\n\n return (ref: string, basePath: string): T | undefined => {\n for (const candidate of archiveReferenceCandidates(ref, basePath)) {\n const hit = lookup(candidate)\n if (hit) return hit\n }\n return undefined\n }\n}\n\nasync function replaceAsync(\n input: string,\n pattern: RegExp,\n replacement: (match: RegExpExecArray) => string | Promise<string>,\n): Promise<string> {\n const flags = pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g'\n const re = new RegExp(pattern.source, flags)\n let out = ''\n let cursor = 0\n let match: RegExpExecArray | null\n while ((match = re.exec(input)) !== null) {\n out += input.slice(cursor, match.index)\n out += await replacement(match)\n cursor = match.index + match[0].length\n if (match[0].length === 0) re.lastIndex++\n }\n return out + input.slice(cursor)\n}\n\n/** Rewrite CSS `@import` and `url(...)` references through an async archive resource resolver. */\nexport async function rewriteArchiveCssReferences(\n css: string,\n resolve: (ref: string, kind: 'css' | 'raw') => string | null | Promise<string | null>,\n): Promise<string> {\n let out = await replaceAsync(\n css,\n /@import\\s+(?:url\\(\\s*)?(['\"]?)([^'\"\\s)]+)\\1\\s*\\)?/gi,\n async (match) => {\n const url = await resolve(match[2], 'css')\n return url ? `@import url(\"${url}\")` : match[0]\n },\n )\n out = await replaceAsync(out, /url\\(\\s*(['\"]?)([^'\")]+)\\1\\s*\\)/gi, async (match) => {\n const url = await resolve(match[2].trim(), 'raw')\n return url ? `url(\"${url}\")` : match[0]\n })\n return out\n}\n\n/** Best-effort rewrite for static/dynamic ESM imports and `new URL(x, import.meta.url)` assets. */\nexport async function rewriteArchiveModuleReferences(\n source: string,\n resolve: (ref: string, kind: 'module' | 'raw') => string | null | Promise<string | null>,\n): Promise<string> {\n // Bundler output is commonly whitespace-free (`import{a}from\"./chunk.js\"`, `export*from\"./chunk.js\"`).\n // Keep `from` declarations and side-effect imports as separate passes: this covers both authored and minified\n // ESM without confusing dynamic `import(...)` / `import.meta` with a quoted static specifier.\n let out = await replaceAsync(\n source,\n /\\b((?:import|export)[^'\";]*?\\bfrom\\s*)(['\"])([^'\"]+)\\2/g,\n async (match) => {\n const url = await resolve(match[3], 'module')\n return url ? `${match[1]}${match[2]}${url}${match[2]}` : match[0]\n },\n )\n out = await replaceAsync(out, /\\b(import\\s*)(['\"])([^'\"]+)\\2/g, async (match) => {\n const url = await resolve(match[3], 'module')\n return url ? `${match[1]}${match[2]}${url}${match[2]}` : match[0]\n })\n out = await replaceAsync(out, /\\b(import\\s*\\(\\s*)(['\"])([^'\"]+)\\2(\\s*\\))/g, async (match) => {\n const url = await resolve(match[3], 'module')\n return url ? `${match[1]}${match[2]}${url}${match[2]}${match[4]}` : match[0]\n })\n out = await replaceAsync(\n out,\n /\\bnew\\s+URL\\(\\s*(['\"])([^'\"]+)\\1\\s*,\\s*import\\.meta\\.url\\s*\\)/g,\n async (match) => {\n const url = await resolve(match[2], 'raw')\n return url ? `new URL(${JSON.stringify(url)})` : match[0]\n },\n )\n return out\n}\n\ntype ImportMapAddress = string | null\ntype ImportMapEntries = Record<string, ImportMapAddress>\n\ninterface ParsedArchiveImportMap {\n imports: ImportMapEntries\n scopes: Record<string, ImportMapEntries>\n}\n\ninterface ArchiveImportMapContext {\n id: number\n documentPath: string\n resolve: ReturnType<typeof createArchiveImportMapResolver>\n}\n\nfunction parseArchiveImportMaps(sources: readonly string[]): ParsedArchiveImportMap {\n const imports: ImportMapEntries = {}\n const scopes: Record<string, ImportMapEntries> = {}\n for (const source of sources) {\n try {\n const value: unknown = JSON.parse(source)\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue\n const map = value as Record<string, unknown>\n if (map.imports && typeof map.imports === 'object' && !Array.isArray(map.imports)) {\n for (const [key, address] of Object.entries(map.imports)) {\n if (!(key in imports) && (typeof address === 'string' || address === null)) {\n imports[key] = address\n }\n }\n }\n if (map.scopes && typeof map.scopes === 'object' && !Array.isArray(map.scopes)) {\n for (const [scope, rawEntries] of Object.entries(map.scopes)) {\n if (!rawEntries || typeof rawEntries !== 'object' || Array.isArray(rawEntries)) continue\n const entries = (scopes[scope] ??= {})\n for (const [key, address] of Object.entries(rawEntries)) {\n if (!(key in entries) && (typeof address === 'string' || address === null)) {\n entries[key] = address\n }\n }\n }\n }\n } catch {\n // The browser will report malformed import maps; leave them untouched and continue the HTML preview.\n }\n }\n return { imports, scopes }\n}\n\nfunction mappedAddress(entries: ImportMapEntries, specifier: string): string | null | undefined {\n if (Object.prototype.hasOwnProperty.call(entries, specifier)) return entries[specifier]\n let best = ''\n for (const key of Object.keys(entries)) {\n if (key.endsWith('/') && specifier.startsWith(key) && key.length > best.length) best = key\n }\n if (!best) return undefined\n const address = entries[best]\n if (address === null || !address.endsWith('/')) return null\n return address + specifier.slice(best.length)\n}\n\n/** Resolve bare ESM specifiers against inline import maps while paths still refer to archive entries. */\nexport function createArchiveImportMapResolver(sources: readonly string[], documentPath: string) {\n const map = parseArchiveImportMaps(sources)\n return (specifier: string, referrerPath: string): string | null | undefined => {\n let scoped: { prefix: string; entries: ImportMapEntries } | undefined\n for (const [scope, entries] of Object.entries(map.scopes)) {\n for (const prefix of archiveReferenceCandidates(scope, documentPath)) {\n const normalized = prefix.replace(/\\/$/, '')\n if (\n (referrerPath === normalized || referrerPath.startsWith(`${normalized}/`)) &&\n (!scoped || normalized.length > scoped.prefix.length)\n ) {\n scoped = { prefix: normalized, entries }\n }\n }\n }\n const scopedAddress = scoped ? mappedAddress(scoped.entries, specifier) : undefined\n return scopedAddress !== undefined ? scopedAddress : mappedAddress(map.imports, specifier)\n }\n}\n\nfunction kindForReference(entry: ArchiveHtmlEntry, requested: ResourceKind): ResourceKind {\n if (requested !== 'module') return requested\n const ext = fileExt(entry.name)\n if (ext === 'css') return 'css'\n if (ext === 'html' || ext === 'htm' || ext === 'xhtml') return 'html'\n return ext === 'js' || ext === 'mjs' || ext === 'cjs' ? 'module' : 'raw'\n}\n\n/**\n * Resolve one archive HTML entry plus its reachable dependencies into a complete iframe document.\n * Browser-only: DOMParser parses inertly; it neither executes scripts nor fetches the original references.\n */\nexport async function buildArchiveHtmlPreview<T extends ArchiveHtmlEntry>(\n options: ArchiveHtmlPreviewOptions<T>,\n): Promise<ArchiveHtmlPreview> {\n const resolveEntry = createArchiveEntryResolver(options.entries)\n const maxResources = options.maxResources ?? DEFAULT_MAX_RESOURCES\n const maxTotalBytes = options.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES\n const maxEntryBytes = options.maxEntryBytes ?? DEFAULT_MAX_ENTRY_BYTES\n const byteCache = new Map<T, Promise<Uint8Array | null>>()\n const urlCache = new Map<string, Promise<string | null>>()\n const building = new Set<string>()\n let importMapContextId = 0\n let claimedBytes = 0\n let loadedResources = 0\n let skippedResources = 0\n\n const loadBytes = (entry: T): Promise<Uint8Array | null> => {\n const cached = byteCache.get(entry)\n if (cached) return cached\n const work = (async (): Promise<Uint8Array | null> => {\n if (\n byteCache.size >= maxResources ||\n entry.size > maxEntryBytes ||\n claimedBytes + entry.size > maxTotalBytes\n ) {\n skippedResources++\n return null\n }\n claimedBytes += entry.size\n try {\n const bytes = await options.loadEntry(entry)\n if (\n bytes.byteLength > maxEntryBytes ||\n claimedBytes - entry.size + bytes.byteLength > maxTotalBytes\n ) {\n skippedResources++\n return null\n }\n claimedBytes += bytes.byteLength - entry.size\n loadedResources++\n return bytes\n } catch {\n skippedResources++\n return null\n }\n })()\n byteCache.set(entry, work)\n return work\n }\n\n const resourceUrl = async (\n entry: T,\n requested: ResourceKind,\n importMap?: ArchiveImportMapContext,\n ): Promise<string | null> => {\n const kind = kindForReference(entry, requested)\n const key = `${entry.path}\\u0000${kind}\\u0000${kind === 'module' ? (importMap?.id ?? '') : ''}`\n if (building.has(key)) return null // cyclic CSS/module imports keep that edge unchanged instead of deadlocking\n const cached = urlCache.get(key)\n if (cached) return cached\n building.add(key)\n const work = (async (): Promise<string | null> => {\n const bytes = await loadBytes(entry)\n if (!bytes) return null\n if (kind === 'css') {\n const css = await rewriteArchiveCssReferences(\n decodeTextSniff(bytes),\n async (ref, refKind) => {\n const dependency = resolveEntry(ref, entry.path)\n return dependency ? resourceUrl(dependency, refKind, importMap) : null\n },\n )\n return dataUrl(new TextEncoder().encode(css), 'text/css')\n }\n if (kind === 'module') {\n const js = await rewriteArchiveModuleReferences(\n decodeTextSniff(bytes),\n async (ref, refKind) => urlForReference(ref, entry.path, refKind, importMap),\n )\n return dataUrl(new TextEncoder().encode(js), 'text/javascript')\n }\n if (kind === 'html') {\n const html = await rewriteDocument(decodeTextSniff(bytes), entry.path)\n return dataUrl(new TextEncoder().encode(html), 'text/html')\n }\n return dataUrl(bytes, mimeForName(entry.name))\n })().finally(() => building.delete(key))\n urlCache.set(key, work)\n return work\n }\n\n const urlForReference = async (\n ref: string,\n basePath: string,\n kind: ResourceKind,\n importMap?: ArchiveImportMapContext,\n ): Promise<string | null> => {\n let address = ref\n let addressBase = basePath\n if (kind === 'module' && importMap) {\n const mapped = importMap.resolve(ref, basePath)\n if (mapped === null) return null\n if (mapped !== undefined) {\n address = mapped\n addressBase = importMap.documentPath\n if (isExternalOrInlineReference(address)) return address\n }\n }\n const entry = resolveEntry(address, addressBase)\n if (!entry) return null\n const url = await resourceUrl(entry, kind, importMap)\n if (!url) return null\n const hash = address.indexOf('#')\n return hash < 0 ? url : url + address.slice(hash)\n }\n\n const rewriteSrcset = async (srcset: string, basePath: string): Promise<string> => {\n const parts = srcset.split(',')\n const rewritten: string[] = []\n for (const part of parts) {\n const segment = part.trim()\n if (!segment) continue\n const fields = segment.split(/\\s+/)\n const url = await urlForReference(fields[0], basePath, 'raw')\n if (url) fields[0] = url\n rewritten.push(fields.join(' '))\n }\n return rewritten.join(', ')\n }\n\n const rewriteDocument = async (html: string, documentPath: string): Promise<string> => {\n const doc = new DOMParser().parseFromString(html, 'text/html')\n const importMapElements = Array.from(\n doc.querySelectorAll<HTMLScriptElement>('script[type=\"importmap\"]:not([src])'),\n )\n const importMap: ArchiveImportMapContext = {\n id: ++importMapContextId,\n documentPath,\n resolve: createArchiveImportMapResolver(\n importMapElements.map((element) => element.textContent ?? ''),\n documentPath,\n ),\n }\n\n // The selected archive directory is the base. A document-supplied base would point outside that virtual\n // tree, and a supplied CSP could block the safe data URLs; FileViewerBody injects the authoritative CSP.\n doc.querySelectorAll('base').forEach((element) => element.remove())\n doc.querySelectorAll('meta[http-equiv]').forEach((element) => {\n const directive = (element.getAttribute('http-equiv') ?? '').toLocaleLowerCase()\n if (directive === 'content-security-policy' || directive === 'refresh') element.remove()\n })\n\n for (const element of Array.from(doc.querySelectorAll('link[href]'))) {\n const ref = element.getAttribute('href')\n if (!ref) continue\n const rel = (element.getAttribute('rel') ?? '').toLocaleLowerCase().split(/\\s+/)\n const kind: ResourceKind = rel.includes('stylesheet')\n ? 'css'\n : rel.includes('modulepreload')\n ? 'module'\n : 'raw'\n const url = await urlForReference(ref, documentPath, kind, importMap)\n if (url) {\n element.setAttribute('href', url)\n if (kind === 'css' || kind === 'module') element.removeAttribute('integrity')\n }\n }\n\n for (const element of Array.from(doc.querySelectorAll('script[src]'))) {\n const ref = element.getAttribute('src')\n if (!ref) continue\n const kind =\n (element.getAttribute('type') ?? '').toLocaleLowerCase() === 'module' ? 'module' : 'raw'\n const url = await urlForReference(ref, documentPath, kind, importMap)\n if (url) {\n element.setAttribute('src', url)\n if (kind === 'module') element.removeAttribute('integrity')\n }\n }\n for (const element of Array.from(doc.querySelectorAll('script[type=\"module\"]:not([src])'))) {\n element.textContent = await rewriteArchiveModuleReferences(\n element.textContent ?? '',\n async (ref, kind) => urlForReference(ref, documentPath, kind, importMap),\n )\n }\n // A blob-backed preview has no hierarchical base, so relative import-map addresses are normalized to null\n // by the browser. All literal imports have already been resolved through this map and rewritten above;\n // remove the now-redundant maps instead of letting those null entries block bare module specifiers.\n importMapElements.forEach((element) => element.remove())\n\n const attributes: Array<[string, string, ResourceKind]> = [\n ['img[src]', 'src', 'raw'],\n ['input[type=\"image\"][src]', 'src', 'raw'],\n ['source[src]', 'src', 'raw'],\n ['video[src]', 'src', 'raw'],\n ['video[poster]', 'poster', 'raw'],\n ['audio[src]', 'src', 'raw'],\n ['track[src]', 'src', 'raw'],\n ['embed[src]', 'src', 'raw'],\n ['object[data]', 'data', 'raw'],\n ['iframe[src]', 'src', 'html'],\n ['image[href]', 'href', 'raw'],\n ['use[href]', 'href', 'raw'],\n ]\n for (const [selector, attribute, kind] of attributes) {\n for (const element of Array.from(doc.querySelectorAll(selector))) {\n const ref = element.getAttribute(attribute)\n if (!ref) continue\n const url = await urlForReference(ref, documentPath, kind)\n if (url) element.setAttribute(attribute, url)\n }\n }\n for (const element of Array.from(doc.querySelectorAll('image, use'))) {\n const ref = element.getAttribute('xlink:href')\n if (!ref) continue\n const url = await urlForReference(ref, documentPath, 'raw')\n if (url) element.setAttribute('xlink:href', url)\n }\n\n for (const element of Array.from(doc.querySelectorAll('img[srcset], source[srcset]'))) {\n const srcset = element.getAttribute('srcset')\n if (srcset) element.setAttribute('srcset', await rewriteSrcset(srcset, documentPath))\n }\n for (const element of Array.from(doc.querySelectorAll('[style]'))) {\n const style = element.getAttribute('style')\n if (!style) continue\n element.setAttribute(\n 'style',\n await rewriteArchiveCssReferences(style, async (ref, kind) =>\n urlForReference(ref, documentPath, kind),\n ),\n )\n }\n for (const element of Array.from(doc.querySelectorAll('style'))) {\n element.textContent = await rewriteArchiveCssReferences(\n element.textContent ?? '',\n async (ref, kind) => urlForReference(ref, documentPath, kind),\n )\n }\n\n return '<!doctype html>\\n' + doc.documentElement.outerHTML\n }\n\n return {\n html: await rewriteDocument(options.html, options.documentPath),\n loadedResources,\n skippedResources,\n }\n}\n"],"mappings":"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"}
package/dist/lib/asn1.js CHANGED
@@ -120,3 +120,5 @@ function l(t) {
120
120
  }
121
121
  //#endregion
122
122
  export { e as TAG, s as asn1String, l as asn1Time, o as bytesToHex, t as decodeAsn1, a as oidToString, i as tagName };
123
+
124
+ //# sourceMappingURL=asn1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asn1.js","names":[],"sources":["../../src/lib/asn1.ts"],"sourcesContent":["/**\n * Minimal, zero-dependency ASN.1 DER decoder for the certificate viewer (lib/x509.ts + CertViewer.vue).\n *\n * Decodes the tag/length/value tree; constructed types recurse. Enough to walk X.509 / PKCS#10 / PKCS#7 /\n * PKCS#12 structures and render a generic, collapsible structure tree. It is NOT a validator — it tolerates\n * and surfaces partial / malformed input (bailing on no-progress) rather than throwing, so a weird file shows\n * what could be decoded instead of a blank error.\n */\n\nexport interface Asn1Node {\n tagClass: number // 0 universal, 1 application, 2 context-specific, 3 private\n constructed: boolean\n tagNumber: number // tag number (universal types: 2=INTEGER, 6=OID, 16=SEQUENCE, …)\n start: number // offset of this TLV's first byte within the buffer\n headerLen: number // bytes of tag + length\n length: number // content length in bytes\n content: Uint8Array // the V (content) bytes\n children: Asn1Node[] // decoded sub-nodes (constructed types only)\n}\n\nexport const TAG = {\n BOOLEAN: 1,\n INTEGER: 2,\n BIT_STRING: 3,\n OCTET_STRING: 4,\n NULL: 5,\n OID: 6,\n UTF8String: 12,\n SEQUENCE: 16,\n SET: 17,\n PrintableString: 19,\n IA5String: 22,\n UTCTime: 23,\n GeneralizedTime: 24,\n} as const\n\n/** Decode every TLV in [start, end) into a forest of nodes. */\nexport function decodeAsn1(buf: Uint8Array, start = 0, end = buf.length): Asn1Node[] {\n const out: Asn1Node[] = []\n let i = start\n while (i < end) {\n const node = decodeOne(buf, i, end)\n if (!node) break\n out.push(node)\n const next = node.start + node.headerLen + node.length\n if (next <= i) break // no progress on malformed input — stop rather than spin\n i = next\n }\n return out\n}\n\nfunction decodeOne(buf: Uint8Array, start: number, end: number): Asn1Node | null {\n let i = start\n if (i >= end) return null\n const first = buf[i++]\n const tagClass = first >> 6\n const constructed = (first & 0x20) !== 0\n let tagNumber = first & 0x1f\n if (tagNumber === 0x1f) {\n // high-tag-number form: base-128 continuation bytes\n tagNumber = 0\n while (i < end) {\n const b = buf[i++]\n tagNumber = (tagNumber << 7) | (b & 0x7f)\n if ((b & 0x80) === 0) break\n }\n }\n if (i >= end) return null\n let len = buf[i++]\n if (len & 0x80) {\n const numBytes = len & 0x7f\n if (numBytes === 0 || numBytes > 4 || i + numBytes > end) {\n // indefinite or oversized length — not valid DER; take the rest as content\n len = end - i\n } else {\n len = 0\n for (let k = 0; k < numBytes; k++) len = len * 256 + buf[i++]\n }\n }\n const contentStart = i\n const contentEnd = Math.min(end, contentStart + len)\n const node: Asn1Node = {\n tagClass,\n constructed,\n tagNumber,\n start,\n headerLen: contentStart - start,\n length: contentEnd - contentStart,\n content: buf.subarray(contentStart, contentEnd),\n children: [],\n }\n if (constructed) node.children = decodeAsn1(buf, contentStart, contentEnd)\n return node\n}\n\nconst UNIVERSAL_NAMES: Record<number, string> = {\n 1: 'BOOLEAN',\n 2: 'INTEGER',\n 3: 'BIT STRING',\n 4: 'OCTET STRING',\n 5: 'NULL',\n 6: 'OBJECT IDENTIFIER',\n 10: 'ENUMERATED',\n 12: 'UTF8String',\n 13: 'RELATIVE-OID',\n 16: 'SEQUENCE',\n 17: 'SET',\n 18: 'NumericString',\n 19: 'PrintableString',\n 20: 'TeletexString',\n 22: 'IA5String',\n 23: 'UTCTime',\n 24: 'GeneralizedTime',\n 26: 'VisibleString',\n 27: 'GeneralString',\n 28: 'UniversalString',\n 30: 'BMPString',\n}\n\n/** Display name for a node's tag (universal type name, or `[n]` for context-specific). */\nexport function tagName(node: Asn1Node): string {\n if (node.tagClass === 2) return `[${node.tagNumber}]`\n if (node.tagClass === 1) return `APPLICATION ${node.tagNumber}`\n if (node.tagClass === 3) return `PRIVATE ${node.tagNumber}`\n return UNIVERSAL_NAMES[node.tagNumber] ?? `TAG ${node.tagNumber}`\n}\n\n/** Decode OID content bytes → dotted-decimal string. */\nexport function oidToString(bytes: Uint8Array): string {\n if (!bytes.length) return ''\n const parts: number[] = [Math.floor(bytes[0] / 40), bytes[0] % 40]\n let val = 0\n for (let i = 1; i < bytes.length; i++) {\n val = val * 128 + (bytes[i] & 0x7f)\n if ((bytes[i] & 0x80) === 0) {\n parts.push(val)\n val = 0\n }\n }\n return parts.join('.')\n}\n\nexport function bytesToHex(bytes: Uint8Array, sep = ''): string {\n let s = ''\n for (let i = 0; i < bytes.length; i++) {\n s += bytes[i].toString(16).padStart(2, '0')\n if (sep && i < bytes.length - 1) s += sep\n }\n return s\n}\n\n/** Decode a string-typed node's content as UTF-8 text (falls back to hex for odd bytes). */\nexport function asn1String(node: Asn1Node): string {\n try {\n return new TextDecoder('utf-8').decode(node.content)\n } catch {\n return bytesToHex(node.content)\n }\n}\n\nfunction buildTime(\n year: number,\n mo: string,\n d: string,\n h: string,\n mi: string,\n s?: string,\n): { text: string; ms: number } {\n const ms = Date.UTC(\n year,\n parseInt(mo, 10) - 1,\n parseInt(d, 10),\n parseInt(h, 10),\n parseInt(mi, 10),\n s ? parseInt(s, 10) : 0,\n )\n return { text: `${year}-${mo}-${d} ${h}:${mi}:${s ?? '00'} UTC`, ms }\n}\n\n/** Decode a UTCTime / GeneralizedTime node → human text + epoch ms, or null if unparseable. */\nexport function asn1Time(node: Asn1Node): { text: string; ms: number } | null {\n const s = new TextDecoder('latin1').decode(node.content).trim()\n if (node.tagNumber === TAG.UTCTime) {\n const m = s.match(/^(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})?/)\n if (!m) return null\n const yy = parseInt(m[1], 10)\n return buildTime(yy < 50 ? 2000 + yy : 1900 + yy, m[2], m[3], m[4], m[5], m[6])\n }\n const m = s.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})?/)\n if (!m) return null\n return buildTime(parseInt(m[1], 10), m[2], m[3], m[4], m[5], m[6])\n}\n"],"mappings":"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"}
@@ -428,3 +428,5 @@ function H(e) {
428
428
  }
429
429
  //#endregion
430
430
  export { e as UnsupportedBinaryError, D as parseBinObj };
431
+
432
+ //# sourceMappingURL=binobj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binobj.js","names":[],"sources":["../../src/lib/binobj.ts"],"sourcesContent":["/**\n * Minimal in-browser ELF / PE symbol reader — no dependency, no WASM.\n *\n * Parses just enough of the container to list its *function symbols* — name, virtual address, and\n * (when the table records it) size. Mirrors {@link lib/zip.ts}: hand-rolled structural parsing over a\n * DataView, decoding only what conversation artifacts actually ship — `.so` shared objects (ELF) and\n * `.dll` libraries (PE). It deliberately does NOT disassemble: turning machine code into mnemonics\n * needs a real engine (Capstone/WASM), which is out of scope for this \"what functions are in here?\" view.\n *\n * - ELF: walks the section table and reads `.symtab` (full symbols) or, when stripped, `.dynsym`\n * (dynamic/exported symbols only), keeping the `STT_FUNC`/`STT_GNU_IFUNC` entries that are\n * defined in this object (not undefined imports).\n * - PE: reads the export directory — the only symbols a DLL normally carries without a separate PDB.\n *\n * Beyond symbols it also lifts human-facing METADATA (see {@link BinMeta}):\n * - ELF: header type/ABI/entry, the program interpreter (PT_INTERP), and the dynamic section's SONAME /\n * NEEDED libraries / RPATH-RUNPATH, plus the GNU build-id note.\n * - PE: the COFF/optional-header subsystem + kind + link time, and — parsed from the resource directory —\n * the VS_VERSIONINFO strings (company / product / version / copyright …) and the embedded ICON, which\n * is repackaged into a tiny .ico and surfaced as a data URL for inline display.\n *\n * Used by BinObjBrowser (the side viewer's binary-object mode): the bytes come from the same download\n * endpoint as any other file, are parsed entirely client-side, and never leave the browser.\n */\n\nexport type BinObjFormat = 'elf' | 'pe'\n\n/** A human-facing metadata row (label + value) shown above the symbol list. */\nexport interface BinMeta {\n label: string\n value: string\n}\n\nexport interface BinSymbol {\n /** Symbol name as stored — NOT demangled (C++ names stay mangled, e.g. `_ZN3foo3barEv`). */\n name: string\n /** Virtual address (ELF `st_value`) or RVA (PE export). For a PIC `.so` this is a load-base offset. */\n address: number\n /** Size in bytes when the table records it (ELF `st_size`); undefined for PE exports. */\n size?: number\n /** Symbol kind: ELF type lowercased (`func` / `ifunc`), or `export` for PE. */\n kind: string\n /** ELF binding (`local` / `global` / `weak`); undefined for PE. */\n bind?: string\n /** Where it came from: `.symtab` / `.dynsym` (ELF) or `export` (PE). */\n source: string\n /** PE export ordinal (Base + index), when applicable. */\n ordinal?: number\n}\n\nexport interface BinObjInfo {\n format: BinObjFormat\n /** Human architecture label, e.g. `x86-64`, `aarch64`, `i386`, `arm`. */\n arch: string\n bits: 32 | 64\n endian: 'le' | 'be'\n /** True when no full symbol table was available (ELF: only `.dynsym`; PE: always — exports only). */\n stripped: boolean\n /** Defined function symbols, sorted by address. */\n symbols: BinSymbol[]\n /** Human note explaining an empty/partial list (e.g. fully stripped, or a PE with no exports). */\n note?: string\n /** Human-facing metadata rows (ELF header/dynamic, PE version-info), shown as a card above the symbols. */\n meta: BinMeta[]\n /** PE icon repackaged as a tiny .ico and encoded as a data URL, when an icon resource was decoded. */\n iconDataUrl?: string\n}\n\n/** Thrown when the bytes aren't a recognized ELF or PE container. */\nexport class UnsupportedBinaryError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'UnsupportedBinaryError'\n }\n}\n\n// ── ELF constants ───────────────────────────────────────────────────────────────────────────────\nconst SHT_SYMTAB = 2\nconst SHT_DYNSYM = 11\nconst STT_FUNC = 2\nconst STT_GNU_IFUNC = 10\nconst SHN_UNDEF = 0\n\n// e_machine → label (only the families likely to show up as conversation artifacts; others fall back).\nconst ELF_MACHINE: Record<number, string> = {\n 0x02: 'sparc',\n 0x03: 'i386',\n 0x08: 'mips',\n 0x14: 'ppc',\n 0x15: 'ppc64',\n 0x16: 's390',\n 0x28: 'arm',\n 0x2a: 'sh',\n 0x32: 'ia-64',\n 0x3e: 'x86-64',\n 0xb7: 'aarch64',\n 0xf3: 'riscv',\n}\n\n// PE Machine → label.\nconst PE_MACHINE: Record<number, string> = {\n 0x014c: 'i386',\n 0x0166: 'mips',\n 0x01c0: 'arm',\n 0x01c4: 'arm-thumb2',\n 0x0200: 'ia-64',\n 0x5064: 'riscv64',\n 0x8664: 'x86-64',\n 0xaa64: 'aarch64',\n}\n\nconst ELF_BIND: Record<number, string> = { 0: 'local', 1: 'global', 2: 'weak' }\nconst ELF_TYPE: Record<number, string> = { [STT_FUNC]: 'func', [STT_GNU_IFUNC]: 'ifunc' }\n\n// ELF metadata constants.\nconst SHT_DYNAMIC = 6\nconst PT_INTERP = 3\nconst PT_NOTE = 4\nconst DT_NULL = 0\nconst DT_NEEDED = 1\nconst DT_SONAME = 14\nconst DT_RPATH = 15\nconst DT_RUNPATH = 29\nconst NT_GNU_BUILD_ID = 3\nconst ELF_ET: Record<number, string> = {\n 1: '可重定位 (REL)',\n 2: '可执行 (EXEC)',\n 3: '共享对象 (DYN/PIE)',\n 4: '核心转储 (CORE)',\n}\nconst ELF_OSABI: Record<number, string> = {\n 0: 'System V',\n 1: 'HP-UX',\n 2: 'NetBSD',\n 3: 'Linux',\n 6: 'Solaris',\n 7: 'AIX',\n 9: 'FreeBSD',\n 12: 'OpenBSD',\n}\n\n// PE metadata constants.\nconst PE_SUBSYSTEM: Record<number, string> = {\n 1: 'Native',\n 2: 'Windows GUI',\n 3: 'Windows 控制台',\n 5: 'OS/2 控制台',\n 7: 'POSIX 控制台',\n 9: 'Windows CE GUI',\n 10: 'EFI 应用',\n 11: 'EFI 启动驱动',\n 12: 'EFI 运行时驱动',\n 13: 'EFI ROM',\n 14: 'Xbox',\n}\nconst RT_ICON = 3\nconst RT_GROUP_ICON = 14\nconst RT_VERSION = 16\n// VS_VERSIONINFO string keys → Chinese labels (unknown keys are shown verbatim).\nconst PE_VERSION_LABELS: Record<string, string> = {\n CompanyName: '公司',\n FileDescription: '描述',\n FileVersion: '文件版本',\n InternalName: '内部名称',\n LegalCopyright: '版权',\n OriginalFilename: '原始文件名',\n ProductName: '产品',\n ProductVersion: '产品版本',\n Comments: '备注',\n LegalTrademarks: '商标',\n}\n\n/**\n * Bounds-checked little/big-endian reader over the file bytes. Reads that fall outside the buffer throw\n * (DataView's own RangeError) and are caught by the caller — a truncated/corrupt file surfaces as an\n * error rather than silently mis-parsed garbage. 64-bit fields are returned as Number (addresses/offsets\n * in real shared libraries sit far below 2^53; precision loss isn't a practical concern here).\n */\nclass Reader {\n private dv: DataView\n constructor(\n readonly buf: ArrayBuffer,\n readonly le: boolean,\n ) {\n this.dv = new DataView(buf)\n }\n get length(): number {\n return this.dv.byteLength\n }\n u8(off: number): number {\n return this.dv.getUint8(off)\n }\n u16(off: number): number {\n return this.dv.getUint16(off, this.le)\n }\n u32(off: number): number {\n return this.dv.getUint32(off, this.le)\n }\n u64(off: number): number {\n return Number(this.dv.getBigUint64(off, this.le))\n }\n /** NUL-terminated UTF-8 string at an absolute file offset (empty if the offset is out of range). */\n str(off: number): string {\n if (off < 0 || off >= this.length) return ''\n let end = off\n while (end < this.length && this.dv.getUint8(end) !== 0) end++\n return new TextDecoder('utf-8').decode(new Uint8Array(this.buf, off, end - off))\n }\n /** Copy `len` bytes at `off` into a fresh Uint8Array (clamped to the buffer; empty if out of range). */\n slice(off: number, len: number): Uint8Array {\n if (off < 0 || off >= this.length || len <= 0) return new Uint8Array(0)\n const end = Math.min(this.length, off + len)\n return new Uint8Array(this.buf.slice(off, end))\n }\n /** NUL-terminated UTF-16LE string starting at `off`, reading at most `maxBytes` (for PE resource keys). */\n utf16(off: number, maxBytes: number): string {\n const end = Math.min(this.length, off + maxBytes)\n let s = ''\n for (let p = off; p + 1 < end; p += 2) {\n const c = this.dv.getUint16(p, true)\n if (c === 0) break\n s += String.fromCharCode(c)\n }\n return s\n }\n}\n\n/** Recognize the container by magic and dispatch. Throws {@link UnsupportedBinaryError} otherwise. */\nexport function parseBinObj(buf: ArrayBuffer): BinObjInfo {\n if (buf.byteLength < 64) throw new UnsupportedBinaryError('文件过小,不是有效的 ELF/PE')\n const dv = new DataView(buf)\n // ELF: 0x7F 'E' 'L' 'F'\n if (dv.getUint32(0, false) === 0x7f454c46) return parseElf(buf)\n // PE: starts with DOS 'MZ' (0x4D 0x5A), real header at e_lfanew.\n if (dv.getUint8(0) === 0x4d && dv.getUint8(1) === 0x5a) return parsePe(buf)\n throw new UnsupportedBinaryError('无法识别的二进制格式(既不是 ELF 也不是 PE)')\n}\n\n// ── ELF ───────────────────────────────────────────────────────────────────────────────────────\nfunction parseElf(buf: ArrayBuffer): BinObjInfo {\n const ident = new DataView(buf)\n const eiClass = ident.getUint8(4) // 1 = 32-bit, 2 = 64-bit\n const eiData = ident.getUint8(5) // 1 = little-endian, 2 = big-endian\n if (eiClass !== 1 && eiClass !== 2) throw new UnsupportedBinaryError('未知 ELF 位宽')\n const bits: 32 | 64 = eiClass === 2 ? 64 : 32\n const le = eiData !== 2\n const r = new Reader(buf, le)\n\n const machine = r.u16(18)\n const arch = ELF_MACHINE[machine] ?? `0x${machine.toString(16)}`\n\n // Section header table location (offsets differ by class).\n const shoff = bits === 64 ? r.u64(40) : r.u32(32)\n const shentsize = r.u16(bits === 64 ? 58 : 46)\n const shnum = r.u16(bits === 64 ? 60 : 48)\n\n const base = (i: number) => shoff + i * shentsize\n interface Section {\n type: number\n offset: number\n size: number\n link: number\n entsize: number\n }\n const sections: Section[] = []\n for (let i = 0; i < shnum; i++) {\n const o = base(i)\n sections.push({\n type: r.u32(o + 4),\n offset: bits === 64 ? r.u64(o + 24) : r.u32(o + 16),\n size: bits === 64 ? r.u64(o + 32) : r.u32(o + 20),\n link: r.u32(o + (bits === 64 ? 40 : 24)),\n entsize: bits === 64 ? r.u64(o + 56) : r.u32(o + 36),\n })\n }\n\n // Prefer the full .symtab; fall back to .dynsym (exports only) — that fallback means \"stripped\".\n const symtab = sections.find((s) => s.type === SHT_SYMTAB)\n const dynsym = sections.find((s) => s.type === SHT_DYNSYM)\n const table = symtab ?? dynsym\n const stripped = !symtab\n // Metadata is best-effort: never let a malformed header/dynamic section abort the symbol listing.\n let meta: BinMeta[] = []\n try {\n meta = elfMeta(r, bits, sections)\n } catch {\n /* metadata unavailable — keep the symbols */\n }\n const info: BinObjInfo = {\n format: 'elf',\n arch,\n bits,\n endian: le ? 'le' : 'be',\n stripped,\n symbols: [],\n meta,\n }\n if (!table) {\n info.note = '未找到符号表(.symtab/.dynsym 均缺失,文件被完全剥离)'\n return info\n }\n const strtab = sections[table.link]\n if (!strtab) {\n info.note = '符号表缺少关联的字符串表'\n return info\n }\n\n const symSize = table.entsize || (bits === 64 ? 24 : 16)\n const count = Math.floor(table.size / symSize)\n const symbols: BinSymbol[] = []\n for (let i = 0; i < count; i++) {\n const o = table.offset + i * symSize\n let stName: number, stInfo: number, stShndx: number, stValue: number, stSize: number\n if (bits === 64) {\n stName = r.u32(o)\n stInfo = r.u8(o + 4)\n stShndx = r.u16(o + 6)\n stValue = r.u64(o + 8)\n stSize = r.u64(o + 16)\n } else {\n stName = r.u32(o)\n stValue = r.u32(o + 4)\n stSize = r.u32(o + 8)\n stInfo = r.u8(o + 12)\n stShndx = r.u16(o + 14)\n }\n const type = stInfo & 0xf\n if (type !== STT_FUNC && type !== STT_GNU_IFUNC) continue\n if (stShndx === SHN_UNDEF) continue // undefined import, not defined in this object\n if (stName === 0) continue\n const name = r.str(strtab.offset + stName)\n if (!name) continue\n symbols.push({\n name,\n address: stValue,\n size: stSize || undefined,\n kind: ELF_TYPE[type] ?? 'func',\n bind: ELF_BIND[stInfo >> 4],\n source: symtab ? '.symtab' : '.dynsym',\n })\n }\n symbols.sort((a, b) => a.address - b.address || a.name.localeCompare(b.name))\n info.symbols = symbols\n if (!symbols.length) info.note = stripped ? '动态符号表中没有已定义的函数' : '未找到函数符号'\n return info\n}\n\n// ── ELF metadata (header / interpreter / dynamic / build-id) ─────────────────────────────────────\ninterface ElfSectionRef {\n type: number\n offset: number\n size: number\n link: number\n entsize: number\n}\nconst align4 = (n: number): number => (n + 3) & ~3\n\nfunction elfMeta(r: Reader, bits: 32 | 64, sections: ElfSectionRef[]): BinMeta[] {\n const eType = r.u16(16)\n const osabi = r.u8(7)\n const entry = bits === 64 ? r.u64(24) : r.u32(24)\n\n // Program headers → PT_INTERP (the dynamic linker) and PT_NOTE (the GNU build-id).\n const phoff = bits === 64 ? r.u64(32) : r.u32(28)\n const phentsize = r.u16(bits === 64 ? 54 : 42)\n const phnum = r.u16(bits === 64 ? 56 : 44)\n let interp = ''\n let buildId = ''\n if (phoff && phnum && phentsize >= (bits === 64 ? 56 : 32)) {\n for (let i = 0; i < phnum; i++) {\n const o = phoff + i * phentsize\n const pType = r.u32(o)\n const pOff = bits === 64 ? r.u64(o + 8) : r.u32(o + 4)\n if (pType === PT_INTERP) {\n interp = r.str(pOff).trim()\n } else if (pType === PT_NOTE && !buildId) {\n const pSz = bits === 64 ? r.u64(o + 32) : r.u32(o + 16)\n buildId = elfBuildId(r, pOff, pSz)\n }\n }\n }\n\n // Dynamic section → SONAME / NEEDED / RPATH (names live in the linked .dynstr string table).\n let soname = ''\n let rpath = ''\n const needed: string[] = []\n const dyn = sections.find((s) => s.type === SHT_DYNAMIC)\n if (dyn) {\n const dynstr = sections[dyn.link]\n const strBase = dynstr ? dynstr.offset : 0\n const esz = dyn.entsize || (bits === 64 ? 16 : 8)\n const count = Math.floor(dyn.size / esz)\n for (let i = 0; i < count; i++) {\n const o = dyn.offset + i * esz\n const tag = bits === 64 ? r.u64(o) : r.u32(o)\n const val = bits === 64 ? r.u64(o + 8) : r.u32(o + 4)\n if (tag === DT_NULL) break\n if (tag === DT_NEEDED) {\n const n = r.str(strBase + val)\n if (n) needed.push(n)\n } else if (tag === DT_SONAME) {\n soname = r.str(strBase + val)\n } else if (tag === DT_RPATH || tag === DT_RUNPATH) {\n rpath = r.str(strBase + val)\n }\n }\n }\n\n const meta: BinMeta[] = [\n { label: '类型', value: ELF_ET[eType] ?? `0x${eType.toString(16)}` },\n { label: 'ABI', value: ELF_OSABI[osabi] ?? `0x${osabi.toString(16)}` },\n { label: '入口', value: `0x${entry.toString(16)}` },\n ]\n if (interp) meta.push({ label: '解释器', value: interp })\n if (soname) meta.push({ label: 'SONAME', value: soname })\n if (needed.length) meta.push({ label: `依赖 (${needed.length})`, value: needed.join(', ') })\n if (rpath) meta.push({ label: 'RPATH', value: rpath })\n if (buildId) meta.push({ label: '构建 ID', value: buildId })\n return meta\n}\n\n// Scan a PT_NOTE segment for the NT_GNU_BUILD_ID note (owner \"GNU\"); returns its hex digest or ''.\nfunction elfBuildId(r: Reader, off: number, size: number): string {\n let p = off\n const end = off + size\n while (p + 12 <= end) {\n const namesz = r.u32(p)\n const descsz = r.u32(p + 4)\n const ntype = r.u32(p + 8)\n const name = namesz ? r.str(p + 12) : ''\n const descOff = p + 12 + align4(namesz)\n if (ntype === NT_GNU_BUILD_ID && name === 'GNU' && descsz > 0) {\n return Array.from(r.slice(descOff, descsz))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n const next = descOff + align4(descsz)\n if (next <= p) break\n p = next\n }\n return ''\n}\n\n// ── PE ──────────────────────────────────────────────────────────────────────────────────────────\nfunction parsePe(buf: ArrayBuffer): BinObjInfo {\n const r = new Reader(buf, true) // PE is always little-endian\n const peOff = r.u32(0x3c) // e_lfanew\n if (r.u32(peOff) !== 0x00004550) throw new UnsupportedBinaryError('缺少 PE 签名') // 'PE\\0\\0'\n\n const coff = peOff + 4\n const machine = r.u16(coff)\n const arch = PE_MACHINE[machine] ?? `0x${machine.toString(16)}`\n const numSections = r.u16(coff + 2)\n const timeStamp = r.u32(coff + 8)\n const characteristics = r.u16(coff + 18)\n const optSize = r.u16(coff + 16)\n const opt = coff + 20\n\n const magic = r.u16(opt) // 0x10b = PE32, 0x20b = PE32+\n const bits: 32 | 64 = magic === 0x20b ? 64 : 32\n const info: BinObjInfo = {\n format: 'pe',\n arch,\n bits,\n endian: 'le',\n stripped: true, // a PE without a PDB exposes only its export table\n symbols: [],\n meta: [],\n }\n if (optSize === 0) {\n info.note = '该 PE 无可选头'\n return info\n }\n\n // Section table → RVA-to-file-offset map (shared by the resource + export parsers below).\n const secs: { va: number; vsize: number; raw: number; rawSize: number }[] = []\n const secBase = opt + optSize\n for (let i = 0; i < numSections; i++) {\n const o = secBase + i * 40\n secs.push({\n vsize: r.u32(o + 8),\n va: r.u32(o + 12),\n rawSize: r.u32(o + 16),\n raw: r.u32(o + 20),\n })\n }\n const toOffset = (rva: number): number | null => {\n for (const s of secs) {\n const span = Math.max(s.vsize, s.rawSize)\n if (rva >= s.va && rva < s.va + span) return rva - s.va + s.raw\n }\n return null\n }\n\n // ── header metadata ──\n info.meta.push({\n label: '类型',\n value: characteristics & 0x2000 ? '动态链接库 (DLL)' : '可执行文件 (EXE)',\n })\n const subsystem = r.u16(opt + 68) // same offset for PE32 / PE32+ (fields align after SectionAlignment@32)\n info.meta.push({\n label: '子系统',\n value: PE_SUBSYSTEM[subsystem] ?? `0x${subsystem.toString(16)}`,\n })\n info.meta.push({ label: '入口', value: `0x${r.u32(opt + 16).toString(16)}` })\n const imageBase = bits === 64 ? r.u64(opt + 24) : r.u32(opt + 28)\n info.meta.push({ label: '镜像基址', value: `0x${imageBase.toString(16)}` })\n if (timeStamp > 0 && timeStamp < 0xffffffff) {\n info.meta.push({ label: '链接时间', value: peTime(timeStamp) })\n }\n\n // ── version-info + icon (from the resource directory = data directory[2]) ──\n const dataDir = opt + (bits === 64 ? 112 : 96)\n const resBase = (() => {\n const rva = r.u32(dataDir + 16)\n return rva ? toOffset(rva) : null\n })()\n if (resBase != null) {\n try {\n for (const [k, v] of peVersionInfo(r, resBase, toOffset)) {\n info.meta.push({ label: PE_VERSION_LABELS[k] ?? k, value: v })\n }\n } catch {\n /* malformed version resource — skip */\n }\n try {\n const icon = peIcon(r, resBase, toOffset)\n if (icon) info.iconDataUrl = icon\n } catch {\n /* malformed icon resource — skip */\n }\n }\n\n // ── exports (data directory[0]) ──\n const exportRva = r.u32(dataDir)\n if (!exportRva) {\n info.note = '该 PE 没有导出表(无导出函数)'\n return info\n }\n const expOff = toOffset(exportRva)\n if (expOff == null) {\n info.note = '导出表 RVA 无法定位'\n return info\n }\n const ordinalBase = r.u32(expOff + 16)\n const numNames = r.u32(expOff + 24)\n const addrFuncs = toOffset(r.u32(expOff + 28))\n const addrNames = toOffset(r.u32(expOff + 32))\n const addrOrdinals = toOffset(r.u32(expOff + 36))\n if (addrFuncs == null || addrNames == null || addrOrdinals == null) {\n info.note = '导出表结构无法定位'\n return info\n }\n\n const symbols: BinSymbol[] = []\n for (let i = 0; i < numNames; i++) {\n const nameRva = r.u32(addrNames + i * 4)\n const nameOff = toOffset(nameRva)\n const name = nameOff != null ? r.str(nameOff) : ''\n if (!name) continue\n const idx = r.u16(addrOrdinals + i * 2) // unbiased index into the EAT\n const funcRva = r.u32(addrFuncs + idx * 4)\n symbols.push({\n name,\n address: funcRva,\n kind: 'export',\n source: 'export',\n ordinal: ordinalBase + idx,\n })\n }\n symbols.sort((a, b) => a.address - b.address || a.name.localeCompare(b.name))\n info.symbols = symbols\n if (!symbols.length && !info.note) info.note = '导出表中没有具名函数'\n return info\n}\n\n// PE TimeDateStamp (epoch seconds) → \"YYYY-MM-DD\" UTC. (Reproducible builds may store a hash, not a date.)\nfunction peTime(ts: number): string {\n return new Date(ts * 1000).toISOString().slice(0, 10)\n}\n\ntype ToOffset = (rva: number) => number | null\ninterface ResEntry {\n id: number\n named: boolean\n isDir: boolean\n offset: number // relative to the resource section base\n}\n// Entries of one IMAGE_RESOURCE_DIRECTORY at `dirOff` (absolute file offset).\nfunction resEntries(r: Reader, dirOff: number): ResEntry[] {\n const named = r.u16(dirOff + 12)\n const ids = r.u16(dirOff + 14)\n const out: ResEntry[] = []\n for (let i = 0; i < named + ids; i++) {\n const e = dirOff + 16 + i * 8\n const nameField = r.u32(e)\n const offField = r.u32(e + 4)\n out.push({\n id: nameField & 0x7fffffff,\n named: (nameField & 0x80000000) !== 0,\n isDir: (offField & 0x80000000) !== 0,\n offset: offField & 0x7fffffff,\n })\n }\n return out\n}\n// Read an IMAGE_RESOURCE_DATA_ENTRY (OffsetToData is an RVA) → its file offset + size.\nfunction resData(\n r: Reader,\n entryOff: number,\n toOffset: ToOffset,\n): { off: number; size: number } | null {\n const fo = toOffset(r.u32(entryOff))\n if (fo == null) return null\n return { off: fo, size: r.u32(entryOff + 4) }\n}\n// Walk Type → (matching id, or first) → first language → data entry, for a resource type.\nfunction findResource(\n r: Reader,\n resBase: number,\n typeId: number,\n wantId: number | null,\n toOffset: ToOffset,\n): { off: number; size: number } | null {\n const t = resEntries(r, resBase).find((e) => !e.named && e.id === typeId && e.isDir)\n if (!t) return null\n const names = resEntries(r, resBase + t.offset)\n const n = wantId == null ? names[0] : names.find((e) => !e.named && e.id === wantId)\n if (!n) return null\n let dataEntryOff = resBase + n.offset\n if (n.isDir) {\n const lang = resEntries(r, resBase + n.offset)[0]\n if (!lang || lang.isDir) return null\n dataEntryOff = resBase + lang.offset\n }\n return resData(r, dataEntryOff, toOffset)\n}\n\n// VS_VERSIONINFO string table → [key, value] pairs (CompanyName, ProductName, FileVersion, …).\nfunction peVersionInfo(r: Reader, resBase: number, toOffset: ToOffset): [string, string][] {\n const data = findResource(r, resBase, RT_VERSION, null, toOffset)\n if (!data) return []\n return parseVersionInfo(r, data.off, data.size)\n}\n\n// Read one VS_VERSIONINFO node header at `p`: key, value span, and where its children begin.\nfunction versionNode(\n r: Reader,\n p: number,\n): {\n key: string\n length: number\n valOff: number\n valLen: number\n wType: number\n childOff: number\n} {\n const length = r.u16(p)\n const valueLen = r.u16(p + 2)\n const wType = r.u16(p + 4)\n const key = r.utf16(p + 6, 512)\n const valOff = align4(p + 6 + (key.length + 1) * 2)\n const valLen = wType === 1 ? valueLen * 2 : valueLen // text values count WCHARs, binary counts bytes\n return { key, length, valOff, valLen, wType, childOff: align4(valOff + valLen) }\n}\n\nfunction parseVersionInfo(r: Reader, base: number, size: number): [string, string][] {\n const out: [string, string][] = []\n const end = base + size\n const root = versionNode(r, base)\n if (root.key !== 'VS_VERSION_INFO' || root.length === 0) return out\n const rootEnd = Math.min(end, base + root.length)\n let c = root.childOff\n while (c + 6 <= rootEnd) {\n const block = versionNode(r, c)\n if (block.length === 0) break\n if (block.key === 'StringFileInfo') {\n const sfiEnd = Math.min(rootEnd, c + block.length)\n let st = block.childOff\n while (st + 6 <= sfiEnd) {\n const table = versionNode(r, st)\n if (table.length === 0) break\n const tEnd = Math.min(sfiEnd, st + table.length)\n let s = table.childOff\n while (s + 6 <= tEnd) {\n const str = versionNode(r, s)\n if (str.length === 0) break\n const value = str.wType === 1 ? r.utf16(str.valOff, str.valLen + 2).trim() : ''\n if (str.key && value) out.push([str.key, value])\n s = align4(s + str.length)\n }\n st = align4(st + table.length)\n }\n break // the first StringFileInfo (one language) is enough for a summary\n }\n c = align4(c + block.length)\n }\n return out\n}\n\n// Decode the embedded application icon: pick the best entry from the RT_GROUP_ICON directory, find its RT_ICON\n// image, and repackage it as a one-image .ico (the RT_ICON payload — PNG or DIB — drops straight into the .ico\n// image slot), returned as a data URL for inline <img> display.\nfunction peIcon(r: Reader, resBase: number, toOffset: ToOffset): string | null {\n const group = findResource(r, resBase, RT_GROUP_ICON, null, toOffset)\n if (!group) return null\n const count = r.u16(group.off + 4)\n if (!count) return null\n let bestEntry = -1\n let bestScore = -1\n for (let i = 0; i < count; i++) {\n const e = group.off + 6 + i * 14\n const w = r.u8(e) || 256\n const h = r.u8(e + 1) || 256\n const score = w * h * 1000 + r.u16(e + 6) // area, tie-broken by bit depth\n if (score > bestScore) {\n bestScore = score\n bestEntry = i\n }\n }\n if (bestEntry < 0) return null\n const be = group.off + 6 + bestEntry * 14\n const entry = {\n w: r.u8(be),\n h: r.u8(be + 1),\n colorCount: r.u8(be + 2),\n planes: r.u16(be + 4),\n bitCount: r.u16(be + 6),\n bytesInRes: r.u32(be + 8),\n iconId: r.u16(be + 12),\n }\n const iconData = findResource(r, resBase, RT_ICON, entry.iconId, toOffset)\n if (!iconData) return null\n const img = r.slice(iconData.off, Math.min(iconData.size, entry.bytesInRes || iconData.size))\n if (!img.length) return null\n // A modern RT_ICON payload is often a PNG (esp. for 256px+ icons). The .ico container's width/height\n // fields are single bytes (max 256), so a 512×512 PNG wrapped in an .ico renders BLANK in browsers\n // (Chrome rejects PNG-in-.ico above 256px). Serve a PNG payload directly as a raw PNG data URL — no\n // size limit, decoded natively. Only the legacy DIB payloads need the .ico wrapper to be interpretable.\n const isPng =\n img.length > 8 && img[0] === 0x89 && img[1] === 0x50 && img[2] === 0x4e && img[3] === 0x47\n if (isPng) return `data:image/png;base64,${bytesToBase64(img)}`\n return `data:image/x-icon;base64,${bytesToBase64(buildIco(entry, img))}`\n}\n\n// Wrap a single icon image (RT_ICON payload) in a minimal .ico container.\nfunction buildIco(\n e: { w: number; h: number; colorCount: number; planes: number; bitCount: number },\n img: Uint8Array,\n): Uint8Array {\n const header = 6 + 16\n const out = new Uint8Array(header + img.length)\n const dv = new DataView(out.buffer)\n dv.setUint16(2, 1, true) // type = icon\n dv.setUint16(4, 1, true) // one image\n out[6] = e.w & 0xff\n out[7] = e.h & 0xff\n out[8] = e.colorCount & 0xff\n dv.setUint16(10, e.planes, true)\n dv.setUint16(12, e.bitCount, true)\n dv.setUint32(14, img.length, true)\n dv.setUint32(18, header, true)\n out.set(img, header)\n return out\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let bin = ''\n const CHUNK = 0x8000\n for (let i = 0; i < bytes.length; i += CHUNK) {\n bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK))\n }\n return btoa(bin)\n}\n"],"mappings":"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"}
@@ -14,3 +14,5 @@ async function a(e) {
14
14
  }
15
15
  //#endregion
16
16
  export { a as brotliDecode };
17
+
18
+ //# sourceMappingURL=brotli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brotli.js","names":[],"sources":["../../src/lib/brotli.ts"],"sourcesContent":["/**\n * In-browser Brotli decompression, wrapping the WASM decoder (brotli-dec-wasm).\n *\n * Browsers ship native gzip/deflate (DecompressionStream) but NOT Brotli, and a faithful Brotli decoder is\n * far too large to hand-roll (it carries a ~120KB static dictionary plus context modeling). So — like rar —\n * this leans on a compiled WASM decoder: brotli-dec-wasm's `web` (wasm-bindgen) build, decode-only, ~250KB.\n * The wasm is fetched as a same-origin asset (Vite emits it via the `?url` import) and instantiated from the\n * fetched bytes (no streaming, so the server's wasm MIME type is irrelevant). Pulled in lazily by\n * {@link lib/tarball} only when a `.br` / `.tar.br` is actually opened.\n *\n * Brotli is a raw stream with no magic bytes, so callers route to it by extension, not by sniffing.\n */\n\nimport init, { decompress } from 'brotli-dec-wasm/web'\n// Vite emits the decoder wasm as a hashed, same-origin asset and gives us its URL.\nimport brotliWasmUrl from 'brotli-dec-wasm/web/bg.wasm?url'\n\nlet ready: Promise<unknown> | null = null\n\n/** Fetch + instantiate the wasm once (cached across calls). */\nfunction ensureReady(): Promise<unknown> {\n if (!ready) {\n ready = (async () => {\n const res = await fetch(brotliWasmUrl)\n if (!res.ok) throw new Error(`无法加载 brotli wasm(HTTP ${res.status})`)\n await init({ module_or_path: await res.arrayBuffer() })\n })()\n }\n return ready\n}\n\n/** Decompress a complete Brotli stream into its raw bytes. */\nexport async function brotliDecode(data: Uint8Array): Promise<Uint8Array> {\n await ensureReady()\n return decompress(data)\n}\n"],"mappings":";;;AAiBA,IAAI,IAAiC;AAGrC,SAAS,IAAgC;CAQvC,OAPA,AACE,OAAS,YAAY;EACnB,IAAM,IAAM,MAAM,MAAM,CAAa;EACrC,IAAI,CAAC,EAAI,IAAI,MAAU,MAAM,yBAAyB,EAAI,OAAO,EAAE;EACnE,MAAM,EAAK,EAAE,gBAAgB,MAAM,EAAI,YAAY,EAAE,CAAC;CACxD,EAAA,CAAG,GAEE;AACT;AAGA,eAAsB,EAAa,GAAuC;CAExE,OADA,MAAM,EAAY,GACX,EAAW,CAAI;AACxB"}
package/dist/lib/bzip2.js CHANGED
@@ -159,3 +159,5 @@ function d(i) {
159
159
  }
160
160
  //#endregion
161
161
  export { d as bzip2Decode };
162
+
163
+ //# sourceMappingURL=bzip2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bzip2.js","names":[],"sources":["../../src/lib/bzip2.ts"],"sourcesContent":["/**\n * Minimal in-browser bzip2 decoder — no dependency, no WASM.\n *\n * Browsers ship a native gzip/deflate inflate (DecompressionStream) but nothing for bzip2's Burrows–Wheeler\n * pipeline, so — like {@link lib/lzma} does for 7z — the tar-family reader ({@link lib/tarball}) carries its\n * own. This is a from-scratch port of the bzip2 block format (the algorithm Julian Seward's reference\n * `bzip2`/libbzip2 implements): a bit reader, canonical-Huffman group tables, the MTF + RLE2 symbol decode,\n * the inverse Burrows–Wheeler transform, and the final RLE1 run expansion.\n *\n * One synchronous entry point, {@link bzip2Decode}, returns the full decompressed bytes. Randomized blocks\n * (a pre-0.9.5 quirk modern bzip2 never emits) and malformed streams are surfaced as errors.\n */\n\nconst BLOCK_MAGIC_HI = 0x314159 // 0x314159265359 (\"pi\"), split into two 24-bit halves for the bit reader\nconst BLOCK_MAGIC_LO = 0x265359\nconst EOS_MAGIC_HI = 0x177245 // 0x177245385090 (\"sqrt pi\") — end of stream\nconst EOS_MAGIC_LO = 0x385090\n\nconst RUNA = 0\nconst RUNB = 1\n\n/** MSB-first bit reader over the packed stream (reads past the end as zero). */\nclass BitReader {\n private pos = 0\n private buf = 0\n private count = 0\n constructor(private readonly data: Uint8Array) {}\n\n bit(): number {\n if (this.count === 0) {\n this.buf = this.pos < this.data.length ? this.data[this.pos++] : 0\n this.count = 8\n }\n this.count--\n return (this.buf >> this.count) & 1\n }\n\n /** Read `n` bits (n ≤ 24 stays within 2^31; callers split wider reads into halves). */\n bits(n: number): number {\n let v = 0\n for (let i = 0; i < n; i++) v = (v << 1) | this.bit()\n return v\n }\n}\n\n// Per-group canonical Huffman decode tables (libbzip2's limit/base/perm scheme).\ninterface HuffTable {\n minLen: number\n maxLen: number\n limit: Int32Array\n base: Int32Array\n perm: Int32Array\n}\n\nfunction buildHuffTable(lengths: Uint8Array, alphaSize: number): HuffTable {\n let minLen = 32\n let maxLen = 0\n for (let i = 0; i < alphaSize; i++) {\n if (lengths[i] > maxLen) maxLen = lengths[i]\n if (lengths[i] < minLen) minLen = lengths[i]\n }\n const perm = new Int32Array(alphaSize)\n let pp = 0\n for (let len = minLen; len <= maxLen; len++) {\n for (let sym = 0; sym < alphaSize; sym++) if (lengths[sym] === len) perm[pp++] = sym\n }\n const base = new Int32Array(maxLen + 2)\n for (let i = 0; i < alphaSize; i++) base[lengths[i] + 1]++\n for (let i = 1; i < base.length; i++) base[i] += base[i - 1]\n const limit = new Int32Array(maxLen + 2)\n let vec = 0\n for (let len = minLen; len <= maxLen; len++) {\n vec += base[len + 1] - base[len]\n limit[len] = vec - 1\n vec <<= 1\n }\n for (let len = minLen + 1; len <= maxLen; len++) {\n base[len] = ((limit[len - 1] + 1) << 1) - base[len]\n }\n return { minLen, maxLen, limit, base, perm }\n}\n\nfunction decodeSym(br: BitReader, t: HuffTable): number {\n let len = t.minLen\n let vec = br.bits(len)\n while (len <= t.maxLen && vec > t.limit[len]) {\n len++\n vec = (vec << 1) | br.bit()\n }\n return t.perm[vec - t.base[len]]\n}\n\n/** Decode one bzip2 block's bytes (after the block magic has been consumed). */\nfunction decodeBlock(br: BitReader, blockSize: number): Uint8Array {\n br.bits(16) // block CRC (high), discarded — we don't verify\n br.bits(16) // block CRC (low)\n if (br.bit() !== 0) throw new Error('不支持随机化的 bzip2 块')\n const origPtr = br.bits(24)\n\n // ── symbol map: which byte values occur in this block ──\n const used16 = br.bits(16)\n const symMap: number[] = []\n for (let i = 0; i < 16; i++) {\n if ((used16 & (0x8000 >> i)) !== 0) {\n const bits16 = br.bits(16)\n for (let j = 0; j < 16; j++) {\n if ((bits16 & (0x8000 >> j)) !== 0) symMap.push(i * 16 + j)\n }\n }\n }\n const numSyms = symMap.length\n if (numSyms === 0) throw new Error('bzip2 块符号表为空')\n const alphaSize = numSyms + 2 // RUNA, RUNB, …syms…, EOB\n const eob = alphaSize - 1\n\n // ── Huffman group selectors (MTF-encoded over group indices) ──\n const numGroups = br.bits(3)\n if (numGroups < 2 || numGroups > 6) throw new Error('bzip2 Huffman 组数非法')\n const numSelectors = br.bits(15)\n const groupPos = new Int32Array(numGroups)\n for (let i = 0; i < numGroups; i++) groupPos[i] = i\n const selectors = new Uint8Array(numSelectors)\n for (let i = 0; i < numSelectors; i++) {\n let j = 0\n while (br.bit() === 1) {\n j++\n if (j >= numGroups) throw new Error('bzip2 选择器越界')\n }\n // move group j to front of the MTF list\n const v = groupPos[j]\n for (let k = j; k > 0; k--) groupPos[k] = groupPos[k - 1]\n groupPos[0] = v\n selectors[i] = v\n }\n\n // ── per-group Huffman code lengths (5-bit start + delta unary) ──\n const tables: HuffTable[] = []\n for (let g = 0; g < numGroups; g++) {\n const lengths = new Uint8Array(alphaSize)\n let len = br.bits(5)\n for (let s = 0; s < alphaSize; s++) {\n for (;;) {\n if (len < 1 || len > 20) throw new Error('bzip2 码长非法')\n if (br.bit() === 0) break\n if (br.bit() === 0) len++\n else len--\n }\n lengths[s] = len\n }\n tables.push(buildHuffTable(lengths, alphaSize))\n }\n\n // ── MTF + RLE2 decode → BWT last column (bytes stored in tt's low 8 bits) ──\n const tt = new Uint32Array(blockSize)\n const unzftab = new Int32Array(256)\n const mtf = symMap.slice() // MTF list of byte values, front = index 0\n let nblock = 0\n let groupNo = -1\n let groupCount = 0\n let table: HuffTable = tables[0]\n const nextSym = (): number => {\n if (groupCount === 0) {\n groupNo++\n if (groupNo >= numSelectors) throw new Error('bzip2 选择器不足')\n groupCount = 50\n table = tables[selectors[groupNo]]\n }\n groupCount--\n return decodeSym(br, table)\n }\n\n let sym = nextSym()\n while (sym !== eob) {\n if (sym === RUNA || sym === RUNB) {\n // run-length of the byte currently at the MTF front, in bijective base-2\n let es = -1\n let N = 1\n do {\n if (sym === RUNA) es += N\n else es += N << 1\n N <<= 1\n sym = nextSym()\n } while (sym === RUNA || sym === RUNB)\n es++\n const b = mtf[0]\n unzftab[b] += es\n if (nblock + es > blockSize) throw new Error('bzip2 块溢出')\n while (es-- > 0) tt[nblock++] = b\n continue\n }\n // sym in 2..eob-1: MTF index (sym-1); fetch that byte value and move it to front\n const idx = sym - 1\n const b = mtf[idx]\n for (let k = idx; k > 0; k--) mtf[k] = mtf[k - 1]\n mtf[0] = b\n unzftab[b]++\n if (nblock >= blockSize) throw new Error('bzip2 块溢出')\n tt[nblock++] = b\n sym = nextSym()\n }\n if (origPtr >= nblock) throw new Error('bzip2 origPtr 越界')\n\n // ── inverse Burrows–Wheeler transform (libbzip2's tt[] pointer walk) ──\n const cftab = new Int32Array(257)\n for (let i = 0; i < 256; i++) cftab[i + 1] = unzftab[i]\n for (let i = 1; i <= 256; i++) cftab[i] += cftab[i - 1]\n for (let i = 0; i < nblock; i++) {\n const b = tt[i] & 0xff\n tt[cftab[b]] |= i << 8\n cftab[b]++\n }\n let tPos = tt[origPtr] >>> 8\n const bwt = new Uint8Array(nblock)\n for (let i = 0; i < nblock; i++) {\n tPos = tt[tPos]\n bwt[i] = tPos & 0xff\n tPos >>>= 8\n }\n\n // ── final RLE1: 4 equal bytes are followed by a count byte of extra repeats ──\n const out = new GrowBuffer(nblock)\n let i = 0\n while (i < nblock) {\n const b = bwt[i]\n let run = 1\n while (i + run < nblock && run < 4 && bwt[i + run] === b) run++\n out.pushRepeat(b, run)\n i += run\n if (run === 4) {\n const extra = bwt[i]\n out.pushRepeat(b, extra)\n i++\n }\n }\n return out.slice()\n}\n\n/** A Uint8Array that doubles its backing store on demand (RLE1 can expand a block beyond its size). */\nclass GrowBuffer {\n private buf: Uint8Array\n private len = 0\n constructor(hint: number) {\n this.buf = new Uint8Array(Math.max(64, hint))\n }\n private ensure(extra: number): void {\n const need = this.len + extra\n if (need <= this.buf.length) return\n let cap = this.buf.length * 2\n while (cap < need) cap *= 2\n const next = new Uint8Array(cap)\n next.set(this.buf.subarray(0, this.len))\n this.buf = next\n }\n pushRepeat(byte: number, count: number): void {\n if (count <= 0) return\n this.ensure(count)\n this.buf.fill(byte, this.len, this.len + count)\n this.len += count\n }\n slice(): Uint8Array {\n return this.buf.slice(0, this.len)\n }\n}\n\n/** Decode a complete bzip2 stream (\"BZh\" + level + one or more blocks) into its raw bytes. */\nexport function bzip2Decode(data: Uint8Array): Uint8Array {\n if (data.length < 4 || data[0] !== 0x42 || data[1] !== 0x5a || data[2] !== 0x68) {\n throw new Error('不是有效的 bzip2 文件')\n }\n const level = data[3] - 0x30\n if (level < 1 || level > 9) throw new Error('bzip2 块大小非法')\n const blockSize = level * 100000\n const br = new BitReader(data.subarray(4))\n\n const blocks: Uint8Array[] = []\n for (;;) {\n const hi = br.bits(24)\n const lo = br.bits(24)\n if (hi === EOS_MAGIC_HI && lo === EOS_MAGIC_LO) break\n if (hi !== BLOCK_MAGIC_HI || lo !== BLOCK_MAGIC_LO) throw new Error('bzip2 块标记损坏')\n blocks.push(decodeBlock(br, blockSize + 10)) // +10: BWT may overshoot the nominal block size slightly\n }\n\n let total = 0\n for (const b of blocks) total += b.length\n const out = new Uint8Array(total)\n let off = 0\n for (const b of blocks) {\n out.set(b, off)\n off += b.length\n }\n return out\n}\n"],"mappings":"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"}
@@ -208,3 +208,5 @@ function r(r) {
208
208
  }
209
209
  //#endregion
210
210
  export { e as NotClassFileError, r as parseClass };
211
+
212
+ //# sourceMappingURL=classfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classfile.js","names":[],"sources":["../../src/lib/classfile.ts"],"sourcesContent":["/**\n * Minimal in-browser Java `.class` STRUCTURE reader — no dependency, no decompilation.\n *\n * Mirrors {@link lib/binobj.ts}: hand-rolled big-endian parsing over a DataView, reading only the structural\n * tables a `javap`-style listing needs — the constant pool, the field table, and the method table. It does\n * NOT reconstruct method bodies (that's a real decompiler — control-flow recovery, expression rebuilding,\n * out of scope). The whole thing is \"read a few length-prefixed tables and translate type descriptors\".\n *\n * What it surfaces (see {@link ClassInfo}): the class signature (modifiers + kind + this/super/interfaces),\n * the bytecode version, every field (modifiers + type + name), and every method (modifiers + return + params),\n * plus — when the class was compiled with `javac -g` — each method's local variables (from the Code attribute's\n * LocalVariableTable). Faithfully ported from the project's verified reference parser (docs/java class\n * decompile.md), validated byte-for-byte against an OpenJDK 21 compiled class.\n *\n * Used by ClassViewer (the side viewer's `.class` mode): bytes come from the same download endpoint as any\n * other file, are parsed entirely client-side, and never leave the browser.\n */\n\nexport interface ClassField {\n name: string\n /** Human type from the field descriptor (`Ljava/lang/String;` → `String`, `[I` → `int[]`). Generics erased. */\n type: string\n /** Access modifiers in source order: `public`/`private`/`protected`/`static`/`final`/`volatile`/`transient`. */\n flags: string[]\n}\n\nexport interface ClassLocal {\n name: string\n type: string\n /** Local-variable slot index (slot 0 of an instance method is `this`). */\n slot: number\n}\n\nexport interface ClassMethod {\n /** Method name; `<init>` is the constructor, `<clinit>` the static initializer. */\n name: string\n /** Parameter types (descriptor-decoded, generics erased). */\n params: string[]\n /** Return type. */\n ret: string\n flags: string[]\n /** Local variables (from Code/LocalVariableTable, `javac -g` only); null when the table is absent. */\n locals: ClassLocal[] | null\n}\n\nexport type ClassKind = 'class' | 'interface' | 'enum' | '@interface'\n\nexport interface ClassInfo {\n majorVersion: number\n minorVersion: number\n /** `\"major.minor\"` raw bytecode version (e.g. `\"65.0\"`). */\n version: string\n /** Friendly platform label derived from the major version (e.g. `\"Java 21\"`). */\n javaLabel: string\n /** Whether it's a class / interface / enum / annotation (`@interface`). */\n kind: ClassKind\n /** Class-level modifiers that aren't implied by {@link kind} (e.g. `[\"public\", \"final\"]`). */\n modifiers: string[]\n /** Fully-qualified name of this class (`demo.Sample`). */\n thisClass: string | null\n /** Fully-qualified superclass (`java.lang.Object`); null only for `java.lang.Object` itself. */\n superClass: string | null\n /** Fully-qualified implemented interfaces (for an interface: its extended interfaces). */\n interfaces: string[]\n fields: ClassField[]\n methods: ClassMethod[]\n}\n\n/** Thrown when the bytes aren't a Java class file (magic mismatch). */\nexport class NotClassFileError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NotClassFileError'\n }\n}\n\n// One constant-pool entry. Only Utf8 (`str`) and Class (`nameIndex`) are needed to list fields/methods, but\n// EVERY tag must still be read so the cursor stays aligned (Long/Double notoriously occupy two slots).\ninterface CpEntry {\n tag: number\n str?: string\n nameIndex?: number\n}\n\nconst PRIM: Record<string, string> = {\n B: 'byte',\n C: 'char',\n D: 'double',\n F: 'float',\n I: 'int',\n J: 'long',\n S: 'short',\n Z: 'boolean',\n V: 'void',\n}\n\n// Major bytecode version → platform label. 49+ map linearly (49 = Java 5 … 65 = Java 21); 45-48 are the\n// pre-1.5 `1.x` line. Unknown/future majors fall back to the raw number.\nfunction javaLabel(major: number): string {\n if (major >= 49) return `Java ${major - 44}`\n const legacy: Record<number, string> = {\n 45: 'Java 1.1',\n 46: 'Java 1.2',\n 47: 'Java 1.3',\n 48: 'Java 1.4',\n }\n return legacy[major] ?? `主版本 ${major}`\n}\n\n/**\n * Parse a `.class` file's structure. Input is an ArrayBuffer/Uint8Array of the file bytes. Throws\n * {@link NotClassFileError} on a magic mismatch; a truncated/corrupt file surfaces as a generic RangeError\n * (DataView bounds) for the caller to report.\n */\nexport function parseClass(input: ArrayBuffer | Uint8Array): ClassInfo {\n const u8 = input instanceof Uint8Array ? input : new Uint8Array(input)\n const dv = new DataView(u8.buffer, u8.byteOffset, u8.byteLength)\n let p = 0\n const u1 = (): number => dv.getUint8(p++)\n const u2 = (): number => {\n const v = dv.getUint16(p)\n p += 2\n return v\n }\n const u4 = (): number => {\n const v = dv.getUint32(p)\n p += 4\n return v\n }\n\n if (u8.byteLength < 10 || dv.getUint32(0) !== 0xcafebabe) {\n throw new NotClassFileError('不是有效的 .class 文件(magic 不匹配 0xCAFEBABE)')\n }\n p = 4\n const minor = u2()\n const major = u2()\n\n // ---- Constant pool (1-indexed; count-1 real entries) ----\n const cpCount = u2()\n const cp: (CpEntry | undefined)[] = [] // 1-indexed, sparse (assigned by slot below)\n const dec = new TextDecoder('utf-8')\n for (let i = 1; i < cpCount; i++) {\n const tag = u1()\n switch (tag) {\n case 1: {\n // Utf8\n const len = u2()\n const b = u8.subarray(p, p + len)\n p += len\n cp[i] = { tag, str: dec.decode(b) }\n break\n }\n case 7: // Class → name_index (the only ref we resolve)\n cp[i] = { tag, nameIndex: u2() }\n break\n case 8: // String\n case 16: // MethodType\n case 19: // Module\n case 20: // Package\n cp[i] = { tag }\n u2()\n break\n case 9: // Fieldref\n case 10: // Methodref\n case 11: // InterfaceMethodref\n case 12: // NameAndType\n case 17: // Dynamic\n case 18: // InvokeDynamic\n cp[i] = { tag }\n u2()\n u2()\n break\n case 3: // Integer\n case 4: // Float\n cp[i] = { tag }\n u4()\n break\n case 5: // Long — occupies TWO pool slots\n case 6: // Double — occupies TWO pool slots\n cp[i] = { tag }\n u4()\n u4()\n i++\n break\n case 15: // MethodHandle: u1 kind + u2 index\n cp[i] = { tag }\n u1()\n u2()\n break\n default:\n throw new NotClassFileError(`未知常量池标签 ${tag} @${i}`)\n }\n }\n\n const utf8 = (i: number): string => cp[i]?.str ?? ''\n const className = (i: number): string | null =>\n i === 0 ? null : utf8(cp[i]?.nameIndex ?? 0).replace(/\\//g, '.')\n\n // ---- Type-descriptor decoding ----\n function readType(d: string, pos: number): { type: string; next: number } {\n let arr = 0\n while (d[pos] === '[') {\n arr++\n pos++\n }\n const c = d[pos++] ?? ''\n let base: string\n if (PRIM[c]) {\n base = PRIM[c]\n } else if (c === 'L') {\n let n = ''\n while (pos < d.length && d[pos] !== ';') n += d[pos++]\n pos++ // consume ';'\n base = n.replace(/\\//g, '.').replace(/^java\\.lang\\./, '')\n } else {\n base = c\n }\n return { type: base + '[]'.repeat(arr), next: pos }\n }\n const fieldType = (d: string): string => readType(d, 0).type\n function methodSig(d: string): { params: string[]; ret: string } {\n let pos = 1 // skip '('\n const params: string[] = []\n while (pos < d.length && d[pos] !== ')') {\n const r = readType(d, pos)\n params.push(r.type)\n pos = r.next\n }\n return { params, ret: readType(d, pos + 1).type }\n }\n\n // ---- Access flags (same bit, different meaning on field vs method) ----\n const memberFlags = (f: number, kind: 'field' | 'method'): string[] => {\n const M: [number, string][] = [\n [0x0001, 'public'],\n [0x0002, 'private'],\n [0x0004, 'protected'],\n [0x0008, 'static'],\n [0x0010, 'final'],\n [0x0040, kind === 'field' ? 'volatile' : 'bridge'],\n [0x0080, kind === 'field' ? 'transient' : 'varargs'],\n [0x0100, 'native'],\n [0x0400, 'abstract'],\n [0x0800, 'strictfp'],\n ]\n return M.filter(([b]) => (f & b) !== 0).map(([, n]) => n)\n }\n\n // ---- Class header ----\n const accessFlags = u2()\n const thisClass = className(u2())\n const superClass = className(u2())\n const ifaceCount = u2()\n const interfaces: string[] = []\n for (let i = 0; i < ifaceCount; i++) {\n const n = className(u2())\n if (n) interfaces.push(n)\n }\n\n // Generic attribute skip — record name + body position, advance by the declared length. Unknown attributes\n // are skipped wholesale (this is what makes the parser forward-compatible).\n interface AttrRef {\n name: string\n start: number\n len: number\n }\n const readAttributes = (): AttrRef[] => {\n const n = u2()\n const out: AttrRef[] = []\n for (let i = 0; i < n; i++) {\n const nameIdx = u2()\n const len = u4()\n out.push({ name: utf8(nameIdx), start: p, len })\n p += len\n }\n return out\n }\n\n // ---- Fields ----\n const fieldCount = u2()\n const fields: ClassField[] = []\n for (let i = 0; i < fieldCount; i++) {\n const flags = u2()\n const nameIdx = u2()\n const descIdx = u2()\n readAttributes()\n fields.push({\n name: utf8(nameIdx),\n type: fieldType(utf8(descIdx)),\n flags: memberFlags(flags, 'field'),\n })\n }\n\n // ---- Methods (also lifting local-variable names out of the Code attribute) ----\n const methodCount = u2()\n const methods: ClassMethod[] = []\n for (let i = 0; i < methodCount; i++) {\n const flags = u2()\n const nameIdx = u2()\n const descIdx = u2()\n const attrs = readAttributes()\n const sig = methodSig(utf8(descIdx))\n let locals: ClassLocal[] | null = null\n const code = attrs.find((a) => a.name === 'Code')\n if (code) {\n // Code: max_stack u2, max_locals u2, code_length u4, code[], exception_table_length u2,\n // exceptions[8*n], attributes_count u2, attributes...\n let q = code.start\n const r2 = (): number => {\n const v = dv.getUint16(q)\n q += 2\n return v\n }\n const r4 = (): number => {\n const v = dv.getUint32(q)\n q += 4\n return v\n }\n r2() // max_stack\n r2() // max_locals\n const codeLen = r4()\n q += codeLen\n const excLen = r2()\n q += excLen * 8\n const nAttr = r2()\n for (let k = 0; k < nAttr; k++) {\n const an = utf8(r2())\n const al = r4()\n const aStart = q\n if (an === 'LocalVariableTable') {\n // Each entry: start_pc u2, length u2, name_index u2, descriptor_index u2, index u2.\n const cnt = dv.getUint16(q)\n let qq = q + 2\n locals = []\n for (let v = 0; v < cnt; v++) {\n qq += 4 // skip start_pc, length\n const nm = dv.getUint16(qq)\n qq += 2\n const ds = dv.getUint16(qq)\n qq += 2\n const sl = dv.getUint16(qq)\n qq += 2\n locals.push({ name: utf8(nm), type: fieldType(utf8(ds)), slot: sl })\n }\n }\n q = aStart + al\n }\n }\n methods.push({\n name: utf8(nameIdx),\n params: sig.params,\n ret: sig.ret,\n flags: memberFlags(flags, 'method'),\n locals,\n })\n }\n\n // ---- Class kind + class-level modifiers (from access_flags) ----\n const ACC_FINAL = 0x0010\n const ACC_INTERFACE = 0x0200\n const ACC_ABSTRACT = 0x0400\n const ACC_ANNOTATION = 0x2000\n const ACC_ENUM = 0x4000\n let kind: ClassKind = 'class'\n if (accessFlags & ACC_ANNOTATION) kind = '@interface'\n else if (accessFlags & ACC_INTERFACE) kind = 'interface'\n else if (accessFlags & ACC_ENUM) kind = 'enum'\n const modifiers: string[] = []\n if (accessFlags & 0x0001) modifiers.push('public')\n // `final`/`abstract` are only meaningful (and non-redundant) on a plain class.\n if (kind === 'class' && accessFlags & ACC_FINAL) modifiers.push('final')\n if (kind === 'class' && accessFlags & ACC_ABSTRACT) modifiers.push('abstract')\n\n return {\n majorVersion: major,\n minorVersion: minor,\n version: `${major}.${minor}`,\n javaLabel: javaLabel(major),\n kind,\n modifiers,\n thisClass,\n superClass,\n interfaces,\n fields,\n methods,\n }\n}\n"],"mappings":"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"}
@@ -25,3 +25,5 @@ function n(n) {
25
25
  }
26
26
  //#endregion
27
27
  export { n as codePreview };
28
+
29
+ //# sourceMappingURL=codePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codePreview.js","names":[],"sources":["../../src/lib/codePreview.ts"],"sourcesContent":["import type { ViewerFile } from '@/composables/useFileViewer'\n\n/**\n * Live-preview support for fenced code blocks. A markdown/html/svg fence can be \"run\" in the side\n * viewer (FileViewerPanel) with the code itself as inline content — no file, no fetch. This is the\n * code-block twin of fileType.ts's {@link isHtmlFile}/{@link isSvgFile}: same render modes, but the\n * input is a fence info-string language token (` ```html `) rather than a filename + mime.\n */\nexport interface CodePreview {\n /** Synthesized extension for the viewer header (also a sensible name for its download/copy label). */\n ext: string\n /** ViewerFile fields that pick the render mode: `lang` (source-view highlighting) + html/svg flags. */\n fields: Pick<ViewerFile, 'lang' | 'html' | 'svg'>\n}\n\nconst HTML_LANGS = new Set(['html', 'htm', 'xhtml'])\nconst MARKDOWN_LANGS = new Set(['markdown', 'md'])\n\n/**\n * Map a fenced code block's language to a side-viewer preview, or null when it has no live preview\n * (most languages — no Run button). Mirrors FileViewerPanel's render modes:\n * - html/htm/xhtml → sandboxed iframe (lang 'xml' so the source toggle still highlights);\n * - svg → picture (data-URL <img>, scripts never run) (lang 'xml' for source);\n * - markdown/md → rendered document.\n * Only the first info-string token matters, so ` ```html linenums ` still previews as HTML.\n */\nexport function codePreview(lang: string | undefined): CodePreview | null {\n const l = (lang || '').trim().toLowerCase().split(/\\s+/)[0]\n if (HTML_LANGS.has(l)) return { ext: 'html', fields: { lang: 'xml', html: true } }\n if (l === 'svg') return { ext: 'svg', fields: { lang: 'xml', svg: true } }\n if (MARKDOWN_LANGS.has(l)) return { ext: 'md', fields: { lang: 'markdown' } }\n return null\n}\n"],"mappings":";AAeA,IAAM,IAAa,IAAI,IAAI;CAAC;CAAQ;CAAO;AAAO,CAAC,GAC7C,IAAiB,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC;AAUjD,SAAgB,EAAY,GAA8C;CACxE,IAAM,KAAK,KAAQ,GAAA,CAAI,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;CAIzD,OAHI,EAAW,IAAI,CAAC,IAAU;EAAE,KAAK;EAAQ,QAAQ;GAAE,MAAM;GAAO,MAAM;EAAK;CAAE,IAC7E,MAAM,QAAc;EAAE,KAAK;EAAO,QAAQ;GAAE,MAAM;GAAO,KAAK;EAAK;CAAE,IACrE,EAAe,IAAI,CAAC,IAAU;EAAE,KAAK;EAAM,QAAQ,EAAE,MAAM,WAAW;CAAE,IACrE;AACT"}
@@ -28,3 +28,5 @@ function t(e, t) {
28
28
  }
29
29
  //#endregion
30
30
  export { e as computeFoldRegions };
31
+
32
+ //# sourceMappingURL=codefold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codefold.js","names":[],"sources":["../../src/lib/codefold.ts"],"sourcesContent":["/**\n * Indentation-based code folding for the source viewer (CodeView.vue).\n *\n * Deliberately language-AGNOSTIC: a foldable region is a header line followed by a run of more-deeply-indented\n * lines (blank lines inside the run don't break it). This covers the requested languages — yaml / json / xml /\n * html / java / kotlin / python / ts / js — because their block structure is mirrored in indentation, with no\n * per-language parser or wasm grammar to ship (the codebase's hand-rolled, zero-dependency house style; a\n * tree-sitter approach would mean bundling a runtime + a grammar per language). Minified or single-line files\n * simply have nothing to fold.\n *\n * Returns a map of header line index (0-based) → the LAST line index belonging to its block, so folding the\n * header hides lines header+1 … end (inclusive). Tabs are expanded to `tabSize` columns for the comparison.\n */\nexport function computeFoldRegions(code: string, tabSize = 2): Map<number, number> {\n const lines = code.split('\\n')\n const indent = lines.map((l) => indentOf(l, tabSize)) // -1 for a blank / whitespace-only line\n const regions = new Map<number, number>()\n for (let i = 0; i < lines.length; i++) {\n if (indent[i] < 0) continue\n let end = i\n let j = i + 1\n while (j < lines.length) {\n if (indent[j] < 0) {\n j++ // blank line: part of the block only if a deeper line follows — keep scanning, don't extend `end`\n continue\n }\n if (indent[j] > indent[i]) {\n end = j\n j++\n } else {\n break\n }\n }\n if (end > i) regions.set(i, end)\n }\n return regions\n}\n\n// Leading-whitespace width in columns (tabs → next multiple of tabSize), or -1 for a blank line.\nfunction indentOf(line: string, tabSize: number): number {\n let col = 0\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (c === ' ') col++\n else if (c === '\\t') col += tabSize - (col % tabSize)\n else return col\n }\n return -1\n}\n"],"mappings":";AAaA,SAAgB,EAAmB,GAAc,IAAU,GAAwB;CACjF,IAAM,IAAQ,EAAK,MAAM,IAAI,GACvB,IAAS,EAAM,KAAK,MAAM,EAAS,GAAG,CAAO,CAAC,GAC9C,oBAAU,IAAI,IAAoB;CACxC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAI,EAAO,KAAK,GAAG;EACnB,IAAI,IAAM,GACN,IAAI,IAAI;EACZ,OAAO,IAAI,EAAM,SAAQ;GACvB,IAAI,EAAO,KAAK,GAAG;IACjB;IACA;GACF;GACA,IAAI,EAAO,KAAK,EAAO,IAErB,AADA,IAAM,GACN;QAEA;EAEJ;EACA,AAAI,IAAM,KAAG,EAAQ,IAAI,GAAG,CAAG;CACjC;CACA,OAAO;AACT;AAGA,SAAS,EAAS,GAAc,GAAyB;CACvD,IAAI,IAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;EACpC,IAAM,IAAI,EAAK;EACf,IAAI,MAAM,KAAK;OACV,IAAI,MAAM,KAAM,KAAO,IAAW,IAAM;OACxC,OAAO;CACd;CACA,OAAO;AACT"}
@@ -128,3 +128,5 @@ async function c(e, t) {
128
128
  }
129
129
  //#endregion
130
130
  export { o as canFormat, c as formatCode };
131
+
132
+ //# sourceMappingURL=codeformat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeformat.js","names":[],"sources":["../../src/lib/codeformat.ts"],"sourcesContent":["/**\n * On-demand code formatting for the source viewer (CodeView), powered by Prettier — loaded LAZILY: the library\n * and the one language plugin needed are dynamic-imported only when the user clicks 格式化, so they never weigh\n * on the main bundle. Covers the languages Prettier can parse in the browser: js/jsx, ts/tsx, json/json5,\n * css/scss/less, html/vue, xml/svg (via @prettier/plugin-xml), yaml, markdown, graphql. Other languages\n * (python/java/kotlin/go/…) have no in-browser Prettier parser, so {@link canFormat} returns false and the\n * button is hidden — consistent with the codebase's \"be honest about what's supported\" stance.\n *\n * The parser is chosen from the file EXTENSION first (precise — .html, .vue and .xml all collapse to hljs lang\n * 'xml'), falling back to the hljs language id when no filename is available.\n */\n\ntype PluginId =\n | 'babel'\n | 'estree'\n | 'typescript'\n | 'postcss'\n | 'html'\n | 'yaml'\n | 'markdown'\n | 'graphql'\n | 'xml'\n\ninterface Spec {\n parser: string\n plugins: PluginId[]\n}\n\n// estree is Prettier's shared printer for the babel/typescript ASTs (json reuses the babel parser).\nconst JS: Spec = { parser: 'babel', plugins: ['babel', 'estree'] }\nconst TS: Spec = { parser: 'typescript', plugins: ['typescript', 'estree'] }\nconst JSON_SPEC: Spec = { parser: 'json', plugins: ['babel', 'estree'] }\n\n// Extension → spec (preferred — most precise).\nconst BY_EXT: Record<string, Spec> = {\n js: JS,\n mjs: JS,\n cjs: JS,\n jsx: JS,\n ts: TS,\n mts: TS,\n cts: TS,\n tsx: TS,\n json: JSON_SPEC,\n jsonc: JSON_SPEC,\n json5: { parser: 'json5', plugins: ['babel', 'estree'] },\n css: { parser: 'css', plugins: ['postcss'] },\n scss: { parser: 'scss', plugins: ['postcss'] },\n sass: { parser: 'scss', plugins: ['postcss'] },\n less: { parser: 'less', plugins: ['postcss'] },\n html: { parser: 'html', plugins: ['html'] },\n htm: { parser: 'html', plugins: ['html'] },\n vue: { parser: 'vue', plugins: ['html'] },\n xml: { parser: 'xml', plugins: ['xml'] },\n svg: { parser: 'xml', plugins: ['xml'] },\n yaml: { parser: 'yaml', plugins: ['yaml'] },\n yml: { parser: 'yaml', plugins: ['yaml'] },\n md: { parser: 'markdown', plugins: ['markdown'] },\n markdown: { parser: 'markdown', plugins: ['markdown'] },\n graphql: { parser: 'graphql', plugins: ['graphql'] },\n gql: { parser: 'graphql', plugins: ['graphql'] },\n}\n\n// hljs language id → spec (fallback when there's no filename). 'xml' defaults to the xml parser, which is safe\n// for any markup; a precise .html/.vue file matches by extension above before this is consulted.\nconst BY_LANG: Record<string, Spec> = {\n javascript: JS,\n typescript: TS,\n json: JSON_SPEC,\n css: BY_EXT.css,\n scss: BY_EXT.scss,\n less: BY_EXT.less,\n yaml: BY_EXT.yaml,\n markdown: BY_EXT.md,\n graphql: BY_EXT.graphql,\n xml: BY_EXT.xml,\n}\n\nfunction specFor(ext: string, lang: string): Spec | null {\n return BY_EXT[ext] ?? BY_LANG[lang] ?? null\n}\n\n/** Whether the source viewer should offer a 格式化 button for this file (Prettier can parse it in-browser). */\nexport function canFormat(ext: string, lang: string): boolean {\n return specFor(ext, lang) != null\n}\n\nfunction loadPlugin(id: PluginId): Promise<unknown> {\n switch (id) {\n case 'babel':\n return import('prettier/plugins/babel')\n case 'estree':\n return import('prettier/plugins/estree')\n case 'typescript':\n return import('prettier/plugins/typescript')\n case 'postcss':\n return import('prettier/plugins/postcss')\n case 'html':\n return import('prettier/plugins/html')\n case 'yaml':\n return import('prettier/plugins/yaml')\n case 'markdown':\n return import('prettier/plugins/markdown')\n case 'graphql':\n return import('prettier/plugins/graphql')\n case 'xml':\n return import('@prettier/plugin-xml')\n }\n}\n\n/**\n * Format `code` with Prettier, picking the parser by extension (preferred) or hljs lang. Throws if the type is\n * unsupported or the source doesn't parse (the caller surfaces a brief \"格式化失败\" and keeps the original).\n */\nexport async function formatCode(\n code: string,\n opts: { ext: string; lang: string },\n): Promise<string> {\n const spec = specFor(opts.ext, opts.lang)\n if (!spec) throw new Error('该类型暂不支持格式化')\n const [standalone, ...mods] = await Promise.all([\n import('prettier/standalone'),\n ...spec.plugins.map(loadPlugin),\n ])\n // Core plugins are used as the imported namespace; @prettier/plugin-xml exposes the plugin as a default export.\n const plugins = mods.map((m) => (m as { default?: unknown }).default ?? m)\n // `xmlWhitespaceSensitivity` is an @prettier/plugin-xml option (not in Prettier's core Options type, hence the\n // cast); it relaxes the plugin's default strict mode so xml/svg actually re-indent. Ignored by other parsers.\n const options = {\n parser: spec.parser,\n plugins,\n printWidth: 100,\n tabWidth: 2,\n xmlWhitespaceSensitivity: 'ignore',\n } as Parameters<typeof standalone.format>[1]\n return standalone.format(code, options)\n}\n"],"mappings":";AA6BA,IAAM,IAAW;CAAE,QAAQ;CAAS,SAAS,CAAC,SAAS,QAAQ;AAAE,GAC3D,IAAW;CAAE,QAAQ;CAAc,SAAS,CAAC,cAAc,QAAQ;AAAE,GACrE,IAAkB;CAAE,QAAQ;CAAQ,SAAS,CAAC,SAAS,QAAQ;AAAE,GAGjE,IAA+B;CACnC,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;EAAE,QAAQ;EAAS,SAAS,CAAC,SAAS,QAAQ;CAAE;CACvD,KAAK;EAAE,QAAQ;EAAO,SAAS,CAAC,SAAS;CAAE;CAC3C,MAAM;EAAE,QAAQ;EAAQ,SAAS,CAAC,SAAS;CAAE;CAC7C,MAAM;EAAE,QAAQ;EAAQ,SAAS,CAAC,SAAS;CAAE;CAC7C,MAAM;EAAE,QAAQ;EAAQ,SAAS,CAAC,SAAS;CAAE;CAC7C,MAAM;EAAE,QAAQ;EAAQ,SAAS,CAAC,MAAM;CAAE;CAC1C,KAAK;EAAE,QAAQ;EAAQ,SAAS,CAAC,MAAM;CAAE;CACzC,KAAK;EAAE,QAAQ;EAAO,SAAS,CAAC,MAAM;CAAE;CACxC,KAAK;EAAE,QAAQ;EAAO,SAAS,CAAC,KAAK;CAAE;CACvC,KAAK;EAAE,QAAQ;EAAO,SAAS,CAAC,KAAK;CAAE;CACvC,MAAM;EAAE,QAAQ;EAAQ,SAAS,CAAC,MAAM;CAAE;CAC1C,KAAK;EAAE,QAAQ;EAAQ,SAAS,CAAC,MAAM;CAAE;CACzC,IAAI;EAAE,QAAQ;EAAY,SAAS,CAAC,UAAU;CAAE;CAChD,UAAU;EAAE,QAAQ;EAAY,SAAS,CAAC,UAAU;CAAE;CACtD,SAAS;EAAE,QAAQ;EAAW,SAAS,CAAC,SAAS;CAAE;CACnD,KAAK;EAAE,QAAQ;EAAW,SAAS,CAAC,SAAS;CAAE;AACjD,GAIM,IAAgC;CACpC,YAAY;CACZ,YAAY;CACZ,MAAM;CACN,KAAK,EAAO;CACZ,MAAM,EAAO;CACb,MAAM,EAAO;CACb,MAAM,EAAO;CACb,UAAU,EAAO;CACjB,SAAS,EAAO;CAChB,KAAK,EAAO;AACd;AAEA,SAAS,EAAQ,GAAa,GAA2B;CACvD,OAAO,EAAO,MAAQ,EAAQ,MAAS;AACzC;AAGA,SAAgB,EAAU,GAAa,GAAuB;CAC5D,OAAO,EAAQ,GAAK,CAAI,KAAK;AAC/B;AAEA,SAAS,EAAW,GAAgC;CAClD,QAAQ,GAAR;EACE,KAAK,SACH,OAAO,OAAO;EAChB,KAAK,UACH,OAAO,OAAO;EAChB,KAAK,cACH,OAAO,OAAO;EAChB,KAAK,WACH,OAAO,OAAO;EAChB,KAAK,QACH,OAAO,OAAO;EAChB,KAAK,QACH,OAAO,OAAO;EAChB,KAAK,YACH,OAAO,OAAO;EAChB,KAAK,WACH,OAAO,OAAO;EAChB,KAAK,OACH,OAAO,OAAO;CAClB;AACF;AAMA,eAAsB,EACpB,GACA,GACiB;CACjB,IAAM,IAAO,EAAQ,EAAK,KAAK,EAAK,IAAI;CACxC,IAAI,CAAC,GAAM,MAAU,MAAM,YAAY;CACvC,IAAM,CAAC,GAAY,GAAG,KAAQ,MAAM,QAAQ,IAAI,CAC9C,OAAO,wBACP,GAAG,EAAK,QAAQ,IAAI,CAAU,CAChC,CAAC,GAEK,IAAU,EAAK,KAAK,MAAO,EAA4B,WAAW,CAAC,GAGnE,IAAU;EACd,QAAQ,EAAK;EACb;EACA,YAAY;EACZ,UAAU;EACV,0BAA0B;CAC5B;CACA,OAAO,EAAW,OAAO,GAAM,CAAO;AACxC"}
package/dist/lib/csv.js CHANGED
@@ -72,3 +72,5 @@ function r(e, t) {
72
72
  }
73
73
  //#endregion
74
74
  export { r as parseCsv };
75
+
76
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","names":[],"sources":["../../src/lib/csv.ts"],"sourcesContent":["/**\n * Hand-rolled, zero-dependency CSV / TSV parser for the side viewer's table preview.\n *\n * Implements RFC 4180 quoting: a field may be wrapped in double quotes; a literal quote inside such a field is\n * written doubled (`\"\"` → `\"`); a quoted field may contain the delimiter, CR, and LF. Outside quotes, fields\n * split on the delimiter and rows on CRLF / LF / lone CR. The delimiter is the tab for `.tsv`, otherwise sniffed\n * (comma / semicolon / tab / pipe — whichever occurs most on the first line, counted OUTSIDE quotes), so\n * European `;`-separated files and tab files both render correctly. A leading UTF-8 BOM is stripped.\n *\n * The viewer (CsvViewer.vue) renders the rows as a table; cell text is escaped by Vue on render, so embedded\n * markup is inert. We never trust the stored content_type — detection is extension-driven (see isCsvFile).\n */\n\nexport interface ParsedCsv {\n rows: string[][]\n delimiter: string\n /** Widest row's column count (shorter rows are padded with empty cells when rendered). */\n cols: number\n}\n\nconst DELIMS = [',', ';', '\\t', '|']\n\n// Count a candidate delimiter on a line, ignoring occurrences inside quoted fields (and doubled quotes).\nfunction countOutsideQuotes(line: string, delim: string): number {\n let n = 0\n let inQuotes = false\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (c === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n i++ // doubled quote inside a quoted field — skip both\n continue\n }\n inQuotes = !inQuotes\n } else if (c === delim && !inQuotes) {\n n++\n }\n }\n return n\n}\n\nfunction pickDelimiter(text: string, ext?: string): string {\n if (ext === 'tsv' || ext === 'tab') return '\\t'\n const nl = text.indexOf('\\n')\n const firstLine = (nl >= 0 ? text.slice(0, nl) : text).slice(0, 4096)\n let best = ','\n let bestCount = -1\n for (const d of DELIMS) {\n const c = countOutsideQuotes(firstLine, d)\n if (c > bestCount) {\n bestCount = c\n best = d\n }\n }\n return best\n}\n\nexport function parseCsv(text: string, ext?: string): ParsedCsv {\n const src = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text\n const delimiter = pickDelimiter(src, ext)\n const rows: string[][] = []\n let row: string[] = []\n let field = ''\n let inQuotes = false\n let started = false // saw any char on the current row? (so a final row break doesn't add a blank row)\n const n = src.length\n let i = 0\n\n const endRow = (): void => {\n row.push(field)\n rows.push(row)\n row = []\n field = ''\n started = false\n }\n\n while (i < n) {\n const c = src[i]\n if (inQuotes) {\n if (c === '\"') {\n if (src[i + 1] === '\"') {\n field += '\"' // escaped quote\n i += 2\n continue\n }\n inQuotes = false\n i++\n continue\n }\n field += c\n i++\n continue\n }\n if (c === '\"' && field === '') {\n // A quote only opens a quoted field at field start; a mid-field quote is treated as a literal char.\n inQuotes = true\n started = true\n i++\n continue\n }\n if (c === delimiter) {\n row.push(field)\n field = ''\n started = true\n i++\n continue\n }\n if (c === '\\n') {\n endRow()\n i++\n continue\n }\n if (c === '\\r') {\n endRow()\n if (src[i + 1] === '\\n') i += 2\n else i++\n continue\n }\n field += c\n started = true\n i++\n }\n // Flush the trailing field/row — unless the input ended exactly on a row break (nothing pending).\n if (started || field !== '' || row.length > 0) {\n row.push(field)\n rows.push(row)\n }\n\n const cols = rows.reduce((m, r) => Math.max(m, r.length), 0)\n return { rows, delimiter, cols }\n}\n"],"mappings":";AAoBA,IAAM,IAAS;CAAC;CAAK;CAAK;CAAM;AAAG;AAGnC,SAAS,EAAmB,GAAc,GAAuB;CAC/D,IAAI,IAAI,GACJ,IAAW;CACf,KAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;EACpC,IAAM,IAAI,EAAK;EACf,IAAI,MAAM,MAAK;GACb,IAAI,KAAY,EAAK,IAAI,OAAO,MAAK;IACnC;IACA;GACF;GACA,IAAW,CAAC;EACd,OAAO,AAAI,MAAM,KAAS,CAAC,KACzB;CAEJ;CACA,OAAO;AACT;AAEA,SAAS,EAAc,GAAc,GAAsB;CACzD,IAAI,MAAQ,SAAS,MAAQ,OAAO,OAAO;CAC3C,IAAM,IAAK,EAAK,QAAQ,IAAI,GACtB,KAAa,KAAM,IAAI,EAAK,MAAM,GAAG,CAAE,IAAI,EAAA,CAAM,MAAM,GAAG,IAAI,GAChE,IAAO,KACP,IAAY;CAChB,KAAK,IAAM,KAAK,GAAQ;EACtB,IAAM,IAAI,EAAmB,GAAW,CAAC;EACzC,AAAI,IAAI,MACN,IAAY,GACZ,IAAO;CAEX;CACA,OAAO;AACT;AAEA,SAAgB,EAAS,GAAc,GAAyB;CAC9D,IAAM,IAAM,EAAK,WAAW,CAAC,MAAM,QAAS,EAAK,MAAM,CAAC,IAAI,GACtD,IAAY,EAAc,GAAK,CAAG,GAClC,IAAmB,CAAC,GACtB,IAAgB,CAAC,GACjB,IAAQ,IACR,IAAW,IACX,IAAU,IACR,IAAI,EAAI,QACV,IAAI,GAEF,UAAqB;EAKzB,AAJA,EAAI,KAAK,CAAK,GACd,EAAK,KAAK,CAAG,GACb,IAAM,CAAC,GACP,IAAQ,IACR,IAAU;CACZ;CAEA,OAAO,IAAI,IAAG;EACZ,IAAM,IAAI,EAAI;EACd,IAAI,GAAU;GACZ,IAAI,MAAM,MAAK;IACb,IAAI,EAAI,IAAI,OAAO,MAAK;KAEtB,AADA,KAAS,MACT,KAAK;KACL;IACF;IAEA,AADA,IAAW,IACX;IACA;GACF;GAEA,AADA,KAAS,GACT;GACA;EACF;EACA,IAAI,MAAM,QAAO,MAAU,IAAI;GAI7B,AAFA,IAAW,IACX,IAAU,IACV;GACA;EACF;EACA,IAAI,MAAM,GAAW;GAInB,AAHA,EAAI,KAAK,CAAK,GACd,IAAQ,IACR,IAAU,IACV;GACA;EACF;EACA,IAAI,MAAM,MAAM;GAEd,AADA,EAAO,GACP;GACA;EACF;EACA,IAAI,MAAM,MAAM;GAEd,AADA,EAAO,GACH,EAAI,IAAI,OAAO,OAAM,KAAK,IACzB;GACL;EACF;EAGA,AAFA,KAAS,GACT,IAAU,IACV;CACF;CAQA,QANI,KAAW,MAAU,MAAM,EAAI,SAAS,OAC1C,EAAI,KAAK,CAAK,GACd,EAAK,KAAK,CAAG,IAIR;EAAE;EAAM;EAAW,MADb,EAAK,QAAQ,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,CAChC;CAAK;AACjC"}
package/dist/lib/des.js CHANGED
@@ -926,3 +926,5 @@ function h(e, t, n) {
926
926
  }
927
927
  //#endregion
928
928
  export { h as tripleDesCbcDecrypt };
929
+
930
+ //# sourceMappingURL=des.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"des.js","names":[],"sources":["../../src/lib/des.ts"],"sourcesContent":["/**\n * Compact DES / Triple-DES (FIPS 46-3) — no dependency, no WASM.\n *\n * Needed for legacy PKCS#12 keystores (see lib/pkcs12.ts): the private key is stored in a\n * pkcs8ShroudedKeyBag encrypted with `pbeWithSHA1And3-KeyTripleDES-CBC`, and WebCrypto ships no DES. This is\n * decrypt-oriented (that's all the viewer needs) but the block cipher is symmetric, so an encrypt helper is\n * exposed too (Triple-DES EDE needs a middle DES *encrypt* during decryption). DES is long obsolete — used\n * here ONLY to read existing keystores, never for new encryption.\n *\n * Implementation is the textbook bit-permutation form (clear + obviously correct); keystores are a few KB, so\n * the per-block array churn is irrelevant.\n */\n\n// ── FIPS 46-3 permutation tables (1-indexed positions) ────────────────────────────────────────────\n// prettier-ignore\nconst IP = [\n 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,\n 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,\n 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,\n 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7,\n]\n// prettier-ignore\nconst FP = [\n 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,\n 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,\n 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,\n 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25,\n]\n// prettier-ignore\nconst E = [\n 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,\n 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1,\n]\n// prettier-ignore\nconst P = [\n 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,\n 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25,\n]\n// prettier-ignore\nconst PC1 = [\n 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3,\n 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37,\n 29, 21, 13, 5, 28, 20, 12, 4,\n]\n// prettier-ignore\nconst PC2 = [\n 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,\n 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32,\n]\nconst SHIFTS = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]\n// prettier-ignore\nconst SBOX: number[][] = [\n [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,\n 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13],\n [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,\n 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9],\n [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,\n 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12],\n [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,\n 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14],\n [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,\n 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3],\n [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,\n 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13],\n [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,\n 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12],\n [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,\n 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11],\n]\n\ntype Bits = number[]\n\nfunction bytesToBits(bytes: Uint8Array): Bits {\n const bits: Bits = []\n for (const b of bytes) for (let i = 7; i >= 0; i--) bits.push((b >> i) & 1)\n return bits\n}\nfunction bitsToBytes(bits: Bits): Uint8Array {\n const out = new Uint8Array(bits.length >> 3)\n for (let i = 0; i < out.length; i++) {\n let v = 0\n for (let j = 0; j < 8; j++) v = (v << 1) | bits[i * 8 + j]\n out[i] = v\n }\n return out\n}\nfunction permute(input: Bits, table: number[]): Bits {\n return table.map((pos) => input[pos - 1])\n}\n\n/** 16 round subkeys (each 48 bits) from an 8-byte DES key. */\nfunction desSubkeys(key8: Uint8Array): Bits[] {\n const cd = permute(bytesToBits(key8), PC1) // 56 bits\n let c = cd.slice(0, 28)\n let d = cd.slice(28, 56)\n const keys: Bits[] = []\n for (let i = 0; i < 16; i++) {\n const s = SHIFTS[i]\n c = c.slice(s).concat(c.slice(0, s))\n d = d.slice(s).concat(d.slice(0, s))\n keys.push(permute(c.concat(d), PC2))\n }\n return keys\n}\n\nfunction feistel(r: Bits, k: Bits): Bits {\n const x = permute(r, E) // 48 bits\n for (let i = 0; i < 48; i++) x[i] ^= k[i]\n const out: Bits = []\n for (let i = 0; i < 8; i++) {\n const o = i * 6\n const row = (x[o] << 1) | x[o + 5]\n const col = (x[o + 1] << 3) | (x[o + 2] << 2) | (x[o + 3] << 1) | x[o + 4]\n const val = SBOX[i][row * 16 + col]\n out.push((val >> 3) & 1, (val >> 2) & 1, (val >> 1) & 1, val & 1)\n }\n return permute(out, P)\n}\n\n/** One 8-byte DES block through `subkeys` (already in application order — reverse them for decryption). */\nfunction desBlock(block8: Uint8Array, subkeys: Bits[]): Uint8Array {\n const bits = permute(bytesToBits(block8), IP)\n let l = bits.slice(0, 32)\n let r = bits.slice(32, 64)\n for (let i = 0; i < 16; i++) {\n const f = feistel(r, subkeys[i])\n const nr = l.map((b, j) => b ^ f[j])\n l = r\n r = nr\n }\n return bitsToBytes(permute(r.concat(l), FP)) // preoutput is R16 ‖ L16 (swapped)\n}\n\n/** A prepared DES key: forward (encrypt) and reversed (decrypt) subkey orders. */\ninterface DesKey {\n enc: Bits[]\n dec: Bits[]\n}\nfunction prepare(key8: Uint8Array): DesKey {\n const sk = desSubkeys(key8)\n return { enc: sk, dec: sk.slice().reverse() }\n}\n\n/**\n * Triple-DES (EDE) CBC decrypt, no padding removal (the caller strips PKCS#7). `key` is 24 bytes\n * (K1‖K2‖K3) or 16 bytes (2-key: K3=K1); `iv` is 8 bytes; `data` must be a whole number of 8-byte blocks.\n */\nexport function tripleDesCbcDecrypt(key: Uint8Array, iv: Uint8Array, data: Uint8Array): Uint8Array {\n const k1 = prepare(key.subarray(0, 8))\n const k2 = prepare(key.subarray(8, 16))\n const k3 = key.length >= 24 ? prepare(key.subarray(16, 24)) : k1\n const n = data.length - (data.length % 8)\n const out = new Uint8Array(n)\n const prev = new Uint8Array(8)\n prev.set(iv.subarray(0, 8))\n for (let off = 0; off < n; off += 8) {\n const block = data.subarray(off, off + 8)\n // EDE decrypt: P = D_K1(E_K2(D_K3(C)))\n const x = desBlock(desBlock(desBlock(block, k3.dec), k2.enc), k1.dec)\n for (let i = 0; i < 8; i++) out[off + i] = x[i] ^ prev[i]\n prev.set(block)\n }\n return out\n}\n"],"mappings":"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AAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;CAAC;CAC3G;EAAC;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAI;EAAG;EAAI;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAG;EAAI;EAAI;EAAI;EAAI;EACzG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAI;EAAI;EAAG;EAAG;EAAI;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAI;EAAG;EAAG;CAAE;CAC3G;EAAC;EAAG;EAAI;EAAI;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAI;EAAI;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAI;EAAI;EACzG;EAAI;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAI;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAG;CAAE;CAC3G;EAAC;EAAG;EAAI;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAI;EAAG;EAAI;EAAI;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAG;EAAG;EACzG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAI;EAAG;EAAG;EAAI;EAAG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAI;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;CAAC;CAC3G;EAAC;EAAI;EAAG;EAAI;EAAI;EAAG;EAAG;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAG;EAAG;EAAI;EAAI;EAAI;EAAG;EAAG;EAAG;EAAI;EAAG;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAI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"}
@@ -477,3 +477,5 @@ function J(e, t, n, r, a) {
477
477
  }
478
478
  //#endregion
479
479
  export { t as isDiagramFile, n as renderDiagram };
480
+
481
+ //# sourceMappingURL=diagram.js.map