documentation-hub 5.7.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 (271) hide show
  1. package/.eslintrc.json +43 -0
  2. package/.github/workflows/build.yml +64 -0
  3. package/.github/workflows/ci.yml +39 -0
  4. package/.vscode/extensions.json +3 -0
  5. package/Current.md +97 -0
  6. package/DocHub_Image.png +0 -0
  7. package/README.md +666 -0
  8. package/USER_GUIDE.md +1173 -0
  9. package/Updater.md +311 -0
  10. package/build/256x256.png +0 -0
  11. package/build/512x512.png +0 -0
  12. package/build/app-update.yml +4 -0
  13. package/build/create-icon.js +208 -0
  14. package/build/icon.ico +0 -0
  15. package/build/icon.png +0 -0
  16. package/build/icon_1024x1024.png +0 -0
  17. package/dist/assets/Analytics-BpsG9895.js +1 -0
  18. package/dist/assets/Card-IAZin8kp.js +1 -0
  19. package/dist/assets/CurrentSession-B-rFkHvf.js +12 -0
  20. package/dist/assets/Dashboard-C_5gMb0q.js +1 -0
  21. package/dist/assets/Documents-CqZ25axS.js +1 -0
  22. package/dist/assets/Input-l89xwXBi.js +1 -0
  23. package/dist/assets/Reporting-DqdHJY_a.js +1 -0
  24. package/dist/assets/Search-XNbu5z_3.js +1 -0
  25. package/dist/assets/SessionManager-lH9hZfzH.js +1 -0
  26. package/dist/assets/Sessions-ClZOPYNc.js +1 -0
  27. package/dist/assets/Settings-DUEHGURa.js +11 -0
  28. package/dist/assets/index-8xUe8ptc.js +24 -0
  29. package/dist/assets/index-RYyJqF7O.css +1 -0
  30. package/dist/assets/path-BkOl0AGO.js +1 -0
  31. package/dist/assets/promises-ID_B9S-h.js +1 -0
  32. package/dist/assets/urlHelpers-TvgahX0r.js +1 -0
  33. package/dist/assets/useToast-yRSO1dkm.js +1 -0
  34. package/dist/assets/vendor-charts-RkGK5ROP.js +36 -0
  35. package/dist/assets/vendor-db-l0sNRNKZ.js +1 -0
  36. package/dist/assets/vendor-react-BVZ_anCF.js +4 -0
  37. package/dist/assets/vendor-search-Dw8P0qyA.js +1 -0
  38. package/dist/assets/vendor-ui-BU7NfluV.js +53 -0
  39. package/dist/electron/PowerAutomateApiService-LfW09ZGr.js +147 -0
  40. package/dist/electron/main-CXkNtyv-.js +19789 -0
  41. package/dist/electron/main.js +5 -0
  42. package/dist/electron/preload.js +1 -0
  43. package/dist/icon.png +0 -0
  44. package/dist/index.html +27 -0
  45. package/docs/CODEBASE_ANALYSIS_REPORT.md +309 -0
  46. package/docs/DEBUG_LOGGING_GUIDE.md +244 -0
  47. package/docs/README.md +115 -0
  48. package/docs/TOC_WIRING_GUIDE.md +344 -0
  49. package/docs/analysis/Bullet_Symbol_Bug_Analysis.md +136 -0
  50. package/docs/analysis/DOCXMLATER_ANALYSIS_SUMMARY.txt +169 -0
  51. package/docs/analysis/Document_Processing_Issues_Analysis.md +704 -0
  52. package/docs/analysis/FIELD_PRESERVATION_ANALYSIS.md +1200 -0
  53. package/docs/analysis/INDENTATION_PRESERVE_ANALYSIS.md +181 -0
  54. package/docs/analysis/INDENTATION_PRESERVE_IMPLEMENTATION.md +207 -0
  55. package/docs/analysis/List_Implementation.md +206 -0
  56. package/docs/analysis/List_Implementation_Accuracy_Report.md +366 -0
  57. package/docs/analysis/PROCESSING_OPTIONS_UI_UPDATES.md +220 -0
  58. package/docs/analysis/RefactorStyles.md +852 -0
  59. package/docs/analysis/STYLE_PARAMETER_ENHANCEMENT.md +143 -0
  60. package/docs/analysis/docxmlater-comparison-todo-2025-11-13.md +636 -0
  61. package/docs/analysis/docxmlater-implementation-analysis-2025-11-13.md +340 -0
  62. package/docs/analysis/docxmlater-template_ui-integration-analysis.md +263 -0
  63. package/docs/analysis/github-issues-to-create.md +237 -0
  64. package/docs/api/API_README.md +538 -0
  65. package/docs/api/API_REFERENCE.md +751 -0
  66. package/docs/api/TYPE_DEFINITIONS.md +869 -0
  67. package/docs/architecture/FONT_EMBEDDING_GUIDE.md +318 -0
  68. package/docs/architecture/docxmlater-functions-and-structure.md +726 -0
  69. package/docs/docxmlater-readme.md +1341 -0
  70. package/docs/fixes/EXECUTION_LOG_TEST_BASE.md +573 -0
  71. package/docs/fixes/HYPERLINK_TEXT_SANITIZATION.md +253 -0
  72. package/docs/fixes/README.md +37 -0
  73. package/docs/github-issues/issue-1-body.md +125 -0
  74. package/docs/github-issues/issue-10-body.md +850 -0
  75. package/docs/github-issues/issue-2-body.md +200 -0
  76. package/docs/github-issues/issue-3-body.md +270 -0
  77. package/docs/github-issues/issue-4-body.md +169 -0
  78. package/docs/github-issues/issue-5-body.md +173 -0
  79. package/docs/github-issues/issue-6-body.md +158 -0
  80. package/docs/github-issues/issue-7-body.md +171 -0
  81. package/docs/github-issues/issue-8-body.md +407 -0
  82. package/docs/github-issues/issue-9-body.md +515 -0
  83. package/docs/github-issues/issue-tracker.md +274 -0
  84. package/docs/github-issues/predictive-analysis-2025-10-18.md +2131 -0
  85. package/docs/implementation/List_Framework_Refactor_Plan.md +336 -0
  86. package/docs/implementation/PRIMARY_TEXT_COLOR_FEATURE.md +217 -0
  87. package/docs/implementation/RELEASE_PLAN_v2.1.0.md +362 -0
  88. package/docs/implementation/RefactorStyles.md +588 -0
  89. package/docs/implementation/implement-plan.md +489 -0
  90. package/docs/implementation/missing-helpers-implementation.md +391 -0
  91. package/docs/implementation/refactor-plan.md +520 -0
  92. package/docs/implementation/session-implementation-complete.md +233 -0
  93. package/docs/implementation/session-management-plan.md +250 -0
  94. package/docs/setup-checklist.md +77 -0
  95. package/docs/versions/changelog.md +345 -0
  96. package/electron/customUpdater.ts +656 -0
  97. package/electron/main.ts +2441 -0
  98. package/electron/memoryConfig.ts +187 -0
  99. package/electron/preload.ts +394 -0
  100. package/electron/proxyConfig.ts +340 -0
  101. package/electron/services/BackupService.ts +452 -0
  102. package/electron/services/DictionaryService.ts +402 -0
  103. package/electron/services/LocalDictionaryLookupService.ts +147 -0
  104. package/electron/services/PowerAutomateApiService.ts +231 -0
  105. package/electron/services/SharePointSyncService.ts +474 -0
  106. package/electron/windowsCertStore.ts +427 -0
  107. package/electron/zscalerConfig.ts +381 -0
  108. package/eslint.config.js +92 -0
  109. package/jest.config.js +52 -0
  110. package/package.json +214 -0
  111. package/postcss.config.mjs +6 -0
  112. package/public/icon.png +0 -0
  113. package/publish-release.ps1 +5 -0
  114. package/renovate.json +30 -0
  115. package/src/App.tsx +216 -0
  116. package/src/__mocks__/p-limit.js +12 -0
  117. package/src/__mocks__/styleMock.js +1 -0
  118. package/src/components/common/BugReportButton.tsx +44 -0
  119. package/src/components/common/BugReportDialog.tsx +193 -0
  120. package/src/components/common/Button.tsx +153 -0
  121. package/src/components/common/Card.tsx +86 -0
  122. package/src/components/common/ColorPickerDialog.tsx +177 -0
  123. package/src/components/common/ConfirmDialog.tsx +96 -0
  124. package/src/components/common/DebugConsole.tsx +275 -0
  125. package/src/components/common/EmptyState.tsx +183 -0
  126. package/src/components/common/ErrorBoundary.tsx +98 -0
  127. package/src/components/common/ErrorDetailsDialog.tsx +153 -0
  128. package/src/components/common/ErrorFallback.tsx +218 -0
  129. package/src/components/common/Input.tsx +109 -0
  130. package/src/components/common/Skeleton.tsx +184 -0
  131. package/src/components/common/SplashScreen.tsx +81 -0
  132. package/src/components/common/Toast.tsx +155 -0
  133. package/src/components/common/Tooltip.tsx +79 -0
  134. package/src/components/common/UpdateNotification.tsx +320 -0
  135. package/src/components/comparison/ComparisonWindow.tsx +374 -0
  136. package/src/components/comparison/SideBySideDiff.tsx +486 -0
  137. package/src/components/comparison/index.ts +8 -0
  138. package/src/components/document/DocumentUploader.tsx +288 -0
  139. package/src/components/document/HyperlinkPreview.tsx +430 -0
  140. package/src/components/document/HyperlinkService.md +1484 -0
  141. package/src/components/document/Hyperlink_Technical_Documentation.md +496 -0
  142. package/src/components/document/InlineChangesView.tsx +707 -0
  143. package/src/components/document/ProcessingProgress.tsx +303 -0
  144. package/src/components/document/ProcessingResults.tsx +256 -0
  145. package/src/components/document/TrackedChangesDetail.tsx +530 -0
  146. package/src/components/document/TrackedChangesPanel.tsx +546 -0
  147. package/src/components/document/VirtualDocumentList.tsx +240 -0
  148. package/src/components/editor/DocumentEditor.tsx +723 -0
  149. package/src/components/editor/DocumentEditorModal.tsx +640 -0
  150. package/src/components/editor/EditorQuickActions.tsx +502 -0
  151. package/src/components/editor/EditorToolbar.tsx +312 -0
  152. package/src/components/editor/TableEditor.tsx +926 -0
  153. package/src/components/editor/index.ts +18 -0
  154. package/src/components/layout/Header.tsx +190 -0
  155. package/src/components/layout/Sidebar.tsx +313 -0
  156. package/src/components/layout/TitleBar.tsx +190 -0
  157. package/src/components/navigation/CommandPalette.tsx +233 -0
  158. package/src/components/navigation/KeyboardShortcutsModal.tsx +173 -0
  159. package/src/components/sessions/ChangeItem.tsx +408 -0
  160. package/src/components/sessions/ChangeViewer.tsx +1155 -0
  161. package/src/components/sessions/DocumentComparisonModal.tsx +314 -0
  162. package/src/components/sessions/ProcessingOptions.tsx +297 -0
  163. package/src/components/sessions/ReplacementsTab.tsx +438 -0
  164. package/src/components/sessions/RevisionHandlingOptions.tsx +87 -0
  165. package/src/components/sessions/SessionManager.tsx +188 -0
  166. package/src/components/sessions/StylesEditor.tsx +1335 -0
  167. package/src/components/sessions/TabContainer.tsx +151 -0
  168. package/src/components/sessions/VirtualSessionList.tsx +157 -0
  169. package/src/components/sessions/sessionToProcessorManager.tsx +420 -0
  170. package/src/components/settings/CertificateManager.tsx +410 -0
  171. package/src/components/settings/SegmentedControl.tsx +88 -0
  172. package/src/components/settings/SettingRow.tsx +52 -0
  173. package/src/contexts/GlobalStatsContext.tsx +396 -0
  174. package/src/contexts/SessionContext.tsx +2129 -0
  175. package/src/contexts/ThemeContext.tsx +428 -0
  176. package/src/contexts/UserSettingsContext.tsx +290 -0
  177. package/src/contexts/__tests__/GlobalStatsContext.test.tsx +390 -0
  178. package/src/global.d.ts +273 -0
  179. package/src/hooks/useDocumentQueue.tsx +210 -0
  180. package/src/hooks/useToast.tsx +55 -0
  181. package/src/main.tsx +10 -0
  182. package/src/pages/Analytics.tsx +386 -0
  183. package/src/pages/CurrentSession.tsx +1174 -0
  184. package/src/pages/Dashboard.tsx +319 -0
  185. package/src/pages/Documents.tsx +317 -0
  186. package/src/pages/Projects.tsx +250 -0
  187. package/src/pages/Reporting.tsx +386 -0
  188. package/src/pages/Search.tsx +349 -0
  189. package/src/pages/Sessions.tsx +285 -0
  190. package/src/pages/Settings.tsx +2662 -0
  191. package/src/services/HyperlinkService.ts +1085 -0
  192. package/src/services/document/DocXMLaterProcessor.ts +617 -0
  193. package/src/services/document/DocumentProcessingComparison.ts +856 -0
  194. package/src/services/document/DocumentSnapshotService.ts +575 -0
  195. package/src/services/document/WordDocumentProcessor.ts +10509 -0
  196. package/src/services/document/__tests__/DocXMLaterProcessor.hyperlinks.test.md +311 -0
  197. package/src/services/document/__tests__/WordDocumentProcessor.integration.test.ts +515 -0
  198. package/src/services/document/__tests__/WordDocumentProcessor.test.ts +812 -0
  199. package/src/services/document/blanklines/BlankLineManager.ts +658 -0
  200. package/src/services/document/blanklines/__tests__/paragraphChecks.test.ts +281 -0
  201. package/src/services/document/blanklines/helpers/blankLineInsertion.ts +87 -0
  202. package/src/services/document/blanklines/helpers/blankLineSnapshot.ts +251 -0
  203. package/src/services/document/blanklines/helpers/clearCustom.ts +121 -0
  204. package/src/services/document/blanklines/helpers/contextChecks.ts +117 -0
  205. package/src/services/document/blanklines/helpers/imageChecks.ts +51 -0
  206. package/src/services/document/blanklines/helpers/paragraphChecks.ts +236 -0
  207. package/src/services/document/blanklines/helpers/removeBlanksBetweenListItems.ts +91 -0
  208. package/src/services/document/blanklines/helpers/removeTrailingBlanks.ts +35 -0
  209. package/src/services/document/blanklines/helpers/tableGuards.ts +21 -0
  210. package/src/services/document/blanklines/index.ts +67 -0
  211. package/src/services/document/blanklines/rules/additionRules.ts +337 -0
  212. package/src/services/document/blanklines/rules/indentationRules.ts +317 -0
  213. package/src/services/document/blanklines/rules/removalRules.ts +362 -0
  214. package/src/services/document/blanklines/rules/ruleTypes.ts +92 -0
  215. package/src/services/document/blanklines/types.ts +29 -0
  216. package/src/services/document/helpers/ImageBorderCropper.ts +377 -0
  217. package/src/services/document/helpers/__tests__/whitespace.test.ts +272 -0
  218. package/src/services/document/helpers/whitespace.ts +117 -0
  219. package/src/services/document/list/ListNormalizer.ts +947 -0
  220. package/src/services/document/list/index.ts +45 -0
  221. package/src/services/document/list/list-detection.ts +275 -0
  222. package/src/services/document/list/list-types.ts +162 -0
  223. package/src/services/document/processors/HyperlinkProcessor.ts +370 -0
  224. package/src/services/document/processors/ListProcessor.ts +257 -0
  225. package/src/services/document/processors/StructureProcessor.ts +176 -0
  226. package/src/services/document/processors/StyleProcessor.ts +389 -0
  227. package/src/services/document/processors/TableProcessor.ts +2238 -0
  228. package/src/services/document/processors/__tests__/HyperlinkProcessor.test.ts +314 -0
  229. package/src/services/document/processors/__tests__/ListProcessor.test.ts +291 -0
  230. package/src/services/document/processors/__tests__/StructureProcessor.test.ts +257 -0
  231. package/src/services/document/processors/__tests__/TableProcessor.hlp-tips-bullets.test.ts +459 -0
  232. package/src/services/document/processors/__tests__/TableProcessor.test.ts +1604 -0
  233. package/src/services/document/processors/index.ts +28 -0
  234. package/src/services/document/types/docx-processing.ts +310 -0
  235. package/src/services/editor/EditorActionHandlers.ts +901 -0
  236. package/src/services/editor/index.ts +13 -0
  237. package/src/setupTests.ts +47 -0
  238. package/src/styles/global.css +782 -0
  239. package/src/types/backup.ts +132 -0
  240. package/src/types/dictionary.ts +125 -0
  241. package/src/types/document-processing.ts +331 -0
  242. package/src/types/docxmlater-augments.d.ts +142 -0
  243. package/src/types/editor.ts +280 -0
  244. package/src/types/electron.ts +340 -0
  245. package/src/types/globalStats.ts +155 -0
  246. package/src/types/hyperlink.ts +471 -0
  247. package/src/types/operations.ts +354 -0
  248. package/src/types/session.ts +427 -0
  249. package/src/types/settings.ts +112 -0
  250. package/src/utils/MemoryMonitor.ts +248 -0
  251. package/src/utils/cn.ts +6 -0
  252. package/src/utils/colorConvert.ts +306 -0
  253. package/src/utils/diffUtils.ts +347 -0
  254. package/src/utils/documentUtils.ts +202 -0
  255. package/src/utils/electronGuard.ts +62 -0
  256. package/src/utils/indexedDB.ts +915 -0
  257. package/src/utils/logger.ts +717 -0
  258. package/src/utils/pathSecurity.ts +232 -0
  259. package/src/utils/pathValidator.ts +236 -0
  260. package/src/utils/processingTimeEstimator.ts +153 -0
  261. package/src/utils/safeJsonParse.ts +62 -0
  262. package/src/utils/textSanitizer.ts +162 -0
  263. package/src/utils/urlHelpers.ts +304 -0
  264. package/src/utils/urlPatterns.ts +198 -0
  265. package/src/utils/urlSanitizer.ts +152 -0
  266. package/src/vite-env.d.ts +11 -0
  267. package/tsconfig.electron.json +19 -0
  268. package/tsconfig.json +36 -0
  269. package/tsconfig.node.json +12 -0
  270. package/typedoc.json +45 -0
  271. package/vite.config.ts +152 -0
@@ -0,0 +1,311 @@
1
+ # Test Cases for Enhanced Hyperlink Processing
2
+
3
+ **Status:** To Be Implemented
4
+ **Related Issue:** #004 - Implement docXMLater Built-in Hyperlink Functions
5
+
6
+ ## Test Coverage Needed
7
+
8
+ ### 1. Hyperlinks in Tables
9
+
10
+ ```typescript
11
+ describe('DocXMLaterProcessor - Table Hyperlinks', () => {
12
+ it('should extract hyperlinks from table cells', async () => {
13
+ // Create document with table containing hyperlinks
14
+ const doc = Document.create();
15
+ const table = doc.createTable(2, 2);
16
+ const cell = table.getCell(0, 0);
17
+ const para = cell?.createParagraph();
18
+ para?.addHyperlink(Hyperlink.createExternal('https://example.com', 'Link'));
19
+
20
+ // Extract
21
+ const processor = new DocXMLaterProcessor();
22
+ const hyperlinks = await processor.extractHyperlinks(doc);
23
+
24
+ // Verify
25
+ expect(hyperlinks).toHaveLength(1);
26
+ expect(hyperlinks[0].url).toBe('https://example.com');
27
+ expect(hyperlinks[0].text).toBe('Link');
28
+ });
29
+
30
+ it('should update URLs in table cells', async () => {
31
+ // Create document with table hyperlinks
32
+ const doc = Document.create();
33
+ const table = doc.createTable(1, 1);
34
+ const cell = table.getCell(0, 0);
35
+ const para = cell?.createParagraph();
36
+ para?.addHyperlink(Hyperlink.createExternal('https://old.com', 'Link'));
37
+
38
+ // Update
39
+ const processor = new DocXMLaterProcessor();
40
+ const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
41
+
42
+ // Verify
43
+ expect(result.success).toBe(true);
44
+ expect(result.data?.modifiedHyperlinks).toBe(1);
45
+
46
+ // Extract and verify URL changed
47
+ const hyperlinks = await processor.extractHyperlinks(doc);
48
+ expect(hyperlinks[0].url).toBe('https://new.com');
49
+ });
50
+ });
51
+ ```
52
+
53
+ ### 2. Hyperlinks in Headers
54
+
55
+ ```typescript
56
+ describe('DocXMLaterProcessor - Header Hyperlinks', () => {
57
+ it('should extract hyperlinks from headers', async () => {
58
+ // Create document with header containing hyperlinks
59
+ const doc = Document.create();
60
+ const header = Header.create();
61
+ const para = header.addParagraph();
62
+ para.addHyperlink(Hyperlink.createExternal('https://header.com', 'Header Link'));
63
+ doc.setHeader(header);
64
+
65
+ // Extract
66
+ const processor = new DocXMLaterProcessor();
67
+ const hyperlinks = await processor.extractHyperlinks(doc);
68
+
69
+ // Verify
70
+ expect(hyperlinks).toHaveLength(1);
71
+ expect(hyperlinks[0].url).toBe('https://header.com');
72
+ expect(hyperlinks[0].text).toBe('Header Link');
73
+ });
74
+
75
+ it('should update URLs in headers', async () => {
76
+ // Create document with header hyperlinks
77
+ const doc = Document.create();
78
+ const header = Header.create();
79
+ const para = header.addParagraph();
80
+ para.addHyperlink(Hyperlink.createExternal('https://old-header.com', 'Link'));
81
+ doc.setHeader(header);
82
+
83
+ // Update
84
+ const processor = new DocXMLaterProcessor();
85
+ const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
86
+
87
+ // Verify
88
+ expect(result.success).toBe(true);
89
+ expect(result.data?.modifiedHyperlinks).toBe(1);
90
+ });
91
+ });
92
+ ```
93
+
94
+ ### 3. Hyperlinks in Footers
95
+
96
+ ```typescript
97
+ describe('DocXMLaterProcessor - Footer Hyperlinks', () => {
98
+ it('should extract hyperlinks from footers', async () => {
99
+ // Create document with footer containing hyperlinks
100
+ const doc = Document.create();
101
+ const footer = Footer.create();
102
+ const para = footer.addParagraph();
103
+ para.addHyperlink(Hyperlink.createExternal('https://footer.com', 'Footer Link'));
104
+ doc.setFooter(footer);
105
+
106
+ // Extract
107
+ const processor = new DocXMLaterProcessor();
108
+ const hyperlinks = await processor.extractHyperlinks(doc);
109
+
110
+ // Verify
111
+ expect(hyperlinks).toHaveLength(1);
112
+ expect(hyperlinks[0].url).toBe('https://footer.com');
113
+ });
114
+
115
+ it('should update URLs in footers', async () => {
116
+ // Create document with footer hyperlinks
117
+ const doc = Document.create();
118
+ const footer = Footer.create();
119
+ const para = footer.addParagraph();
120
+ para.addHyperlink(Hyperlink.createExternal('https://old-footer.com', 'Link'));
121
+ doc.setFooter(footer);
122
+
123
+ // Update
124
+ const processor = new DocXMLaterProcessor();
125
+ const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
126
+
127
+ // Verify
128
+ expect(result.success).toBe(true);
129
+ expect(result.data?.modifiedHyperlinks).toBe(1);
130
+ });
131
+ });
132
+ ```
133
+
134
+ ### 4. Comprehensive Coverage
135
+
136
+ ```typescript
137
+ describe('DocXMLaterProcessor - Comprehensive Hyperlink Coverage', () => {
138
+ it('should extract hyperlinks from all document parts', async () => {
139
+ // Create document with hyperlinks in multiple locations
140
+ const doc = Document.create();
141
+
142
+ // Body hyperlink
143
+ doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://body.com', 'Body'));
144
+
145
+ // Table hyperlink
146
+ const table = doc.createTable(1, 1);
147
+ const cell = table.getCell(0, 0);
148
+ cell?.createParagraph().addHyperlink(Hyperlink.createExternal('https://table.com', 'Table'));
149
+
150
+ // Header hyperlink
151
+ const header = Header.create();
152
+ header.addParagraph().addHyperlink(Hyperlink.createExternal('https://header.com', 'Header'));
153
+ doc.setHeader(header);
154
+
155
+ // Footer hyperlink
156
+ const footer = Footer.create();
157
+ footer.addParagraph().addHyperlink(Hyperlink.createExternal('https://footer.com', 'Footer'));
158
+ doc.setFooter(footer);
159
+
160
+ // Extract
161
+ const processor = new DocXMLaterProcessor();
162
+ const hyperlinks = await processor.extractHyperlinks(doc);
163
+
164
+ // Verify all 4 hyperlinks found
165
+ expect(hyperlinks).toHaveLength(4);
166
+ expect(hyperlinks.map((h) => h.url).sort()).toEqual([
167
+ 'https://body.com',
168
+ 'https://footer.com',
169
+ 'https://header.com',
170
+ 'https://table.com',
171
+ ]);
172
+ });
173
+
174
+ it('should update URLs across all document parts in one operation', async () => {
175
+ // Create document with hyperlinks in multiple locations
176
+ const doc = Document.create();
177
+ doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://old1.com', 'Link 1'));
178
+ doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://old2.com', 'Link 2'));
179
+
180
+ const table = doc.createTable(1, 1);
181
+ const cell = table.getCell(0, 0);
182
+ cell?.createParagraph().addHyperlink(Hyperlink.createExternal('https://old3.com', 'Link 3'));
183
+
184
+ // Update all at once
185
+ const processor = new DocXMLaterProcessor();
186
+ const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
187
+
188
+ // Verify all updated
189
+ expect(result.success).toBe(true);
190
+ expect(result.data?.modifiedHyperlinks).toBe(3);
191
+
192
+ // Extract and verify all URLs changed
193
+ const hyperlinks = await processor.extractHyperlinks(doc);
194
+ expect(hyperlinks.every((h) => h.url?.includes('new'))).toBe(true);
195
+ expect(hyperlinks.every((h) => !h.url?.includes('old'))).toBe(true);
196
+ });
197
+ });
198
+ ```
199
+
200
+ ### 5. Performance Benchmarks
201
+
202
+ ```typescript
203
+ describe('DocXMLaterProcessor - Performance', () => {
204
+ it('should be faster than manual extraction for large documents', async () => {
205
+ // Create document with 500 hyperlinks
206
+ const doc = Document.create();
207
+ for (let i = 0; i < 500; i++) {
208
+ doc
209
+ .createParagraph()
210
+ .addHyperlink(Hyperlink.createExternal(`https://example${i}.com`, `Link ${i}`));
211
+ }
212
+
213
+ const processor = new DocXMLaterProcessor();
214
+
215
+ // Measure extraction time
216
+ const start = performance.now();
217
+ const hyperlinks = await processor.extractHyperlinks(doc);
218
+ const duration = performance.now() - start;
219
+
220
+ // Verify
221
+ expect(hyperlinks).toHaveLength(500);
222
+ expect(duration).toBeLessThan(200); // Should be faster than 200ms
223
+ });
224
+
225
+ it('should be faster than manual updates for large documents', async () => {
226
+ // Create document with 500 hyperlinks
227
+ const doc = Document.create();
228
+ for (let i = 0; i < 500; i++) {
229
+ doc
230
+ .createParagraph()
231
+ .addHyperlink(Hyperlink.createExternal(`https://old${i}.com`, `Link ${i}`));
232
+ }
233
+
234
+ const processor = new DocXMLaterProcessor();
235
+
236
+ // Measure update time
237
+ const start = performance.now();
238
+ const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
239
+ const duration = performance.now() - start;
240
+
241
+ // Verify
242
+ expect(result.success).toBe(true);
243
+ expect(result.data?.modifiedHyperlinks).toBe(500);
244
+ expect(duration).toBeLessThan(250); // Should be faster than 250ms
245
+ });
246
+ });
247
+ ```
248
+
249
+ ### 6. Error Handling
250
+
251
+ ```typescript
252
+ describe('DocXMLaterProcessor - Error Handling', () => {
253
+ it('should handle transform errors gracefully', async () => {
254
+ const doc = Document.create();
255
+ doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://valid.com', 'Link'));
256
+
257
+ const processor = new DocXMLaterProcessor();
258
+ const result = await processor.modifyHyperlinks(doc, (url) => {
259
+ throw new Error('Transform failed');
260
+ });
261
+
262
+ // Verify error handled
263
+ expect(result.success).toBe(false);
264
+ expect(result.error).toContain('Failed to modify hyperlinks');
265
+ });
266
+
267
+ it('should preserve document if URL update fails', async () => {
268
+ const doc = Document.create();
269
+ doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://original.com', 'Link'));
270
+
271
+ const processor = new DocXMLaterProcessor();
272
+
273
+ // Try to update with failing transform
274
+ await processor.modifyHyperlinks(doc, (url) => {
275
+ throw new Error('Transform failed');
276
+ });
277
+
278
+ // Verify original URL preserved
279
+ const hyperlinks = await processor.extractHyperlinks(doc);
280
+ expect(hyperlinks[0].url).toBe('https://original.com');
281
+ });
282
+ });
283
+ ```
284
+
285
+ ## Test Implementation Priority
286
+
287
+ 1. **High Priority:**
288
+ - Comprehensive coverage test (all document parts)
289
+ - Table hyperlinks extraction/update
290
+ - Header/footer hyperlinks extraction/update
291
+
292
+ 2. **Medium Priority:**
293
+ - Performance benchmarks
294
+ - Error handling tests
295
+
296
+ 3. **Low Priority:**
297
+ - Edge cases (nested tables, multiple headers/footers)
298
+ - Stress tests (very large documents)
299
+
300
+ ## Notes
301
+
302
+ - These tests require docxmlater v1.15.0 or later
303
+ - Test infrastructure needs to be set up (jest/vitest configuration)
304
+ - Real document testing should be done with integration tests
305
+ - Performance benchmarks are estimates and may vary by system
306
+
307
+ ## Related Files
308
+
309
+ - Implementation: `src/services/document/DocXMLaterProcessor.ts`
310
+ - Existing tests: `src/services/document/__tests__/WordDocumentProcessor.test.ts`
311
+ - Integration tests: `src/services/document/__tests__/WordDocumentProcessor.integration.test.ts`