docxmlater 10.1.3 → 10.1.5
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.
- package/README.md +759 -754
- package/dist/constants/legacyCompatFlags.js +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +50 -50
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +483 -471
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts +9 -9
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +11 -11
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +251 -251
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +15 -15
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +2123 -2155
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js +2 -5
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +3 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +3 -1
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +9 -6
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +18 -17
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +21 -21
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +56 -56
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.js +6 -6
- package/dist/elements/Endnote.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js +6 -7
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +82 -25
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js +2 -2
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.js +6 -6
- package/dist/elements/Footnote.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js +6 -7
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.js +2 -2
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +5 -3
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +134 -76
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +238 -106
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +1 -1
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +24 -24
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +181 -188
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
- package/dist/elements/PropertyChangeTypes.js +6 -6
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.d.ts.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +4 -5
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +40 -48
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -16
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +256 -238
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +36 -11
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +6 -6
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +99 -104
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +11 -11
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +102 -107
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +10 -10
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +105 -106
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +4 -4
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +13 -6
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +3 -5
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +4 -4
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +54 -49
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +1 -3
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +5 -5
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +119 -125
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +9 -9
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts +11 -11
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +219 -247
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -2
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +96 -102
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +6 -6
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js +7 -7
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +23 -7
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.d.ts.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/compatibility-types.js.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/list-types.d.ts +6 -6
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.d.ts +2 -2
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js +97 -101
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +1 -1
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
- package/dist/utils/MoveOperationHelper.js +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js +2 -4
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.d.ts.map +1 -1
- package/dist/utils/RevisionWalker.js +4 -12
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.d.ts.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +23 -12
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts +1 -1
- package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +40 -40
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.d.ts.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.js +1 -1
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +10 -2
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js +21 -23
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +3 -3
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/textDiff.d.ts +1 -1
- package/dist/utils/textDiff.js +8 -8
- package/dist/utils/textDiff.js.map +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +24 -7
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.d.ts.map +1 -1
- package/dist/utils/xmlSanitization.js +3 -3
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +5 -5
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +7 -9
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js +3 -3
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +98 -100
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +61 -66
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +1 -3
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.d.ts +1 -1
- package/dist/zip/ZipWriter.d.ts.map +1 -1
- package/dist/zip/ZipWriter.js +28 -36
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/types.js +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +92 -92
- package/src/__tests__/helper-methods.test.ts +512 -512
- package/src/constants/legacyCompatFlags.ts +138 -138
- package/src/constants/limits.ts +50 -50
- package/src/core/Document.ts +985 -1145
- package/src/core/DocumentContent.ts +461 -467
- package/src/core/DocumentGenerator.ts +1133 -1104
- package/src/core/DocumentIdManager.ts +158 -158
- package/src/core/DocumentParser.ts +2347 -2716
- package/src/core/DocumentValidator.ts +363 -372
- package/src/core/Relationship.ts +367 -367
- package/src/core/RelationshipManager.ts +429 -428
- package/src/elements/AlternateContent.ts +42 -42
- package/src/elements/Bookmark.ts +212 -210
- package/src/elements/BookmarkManager.ts +247 -250
- package/src/elements/Comment.ts +356 -359
- package/src/elements/CommentManager.ts +499 -502
- package/src/elements/CommonTypes.ts +524 -549
- package/src/elements/CustomXml.ts +36 -36
- package/src/elements/Endnote.ts +221 -217
- package/src/elements/EndnoteManager.ts +246 -249
- package/src/elements/Field.ts +1292 -1233
- package/src/elements/FieldHelpers.ts +329 -333
- package/src/elements/FontManager.ts +336 -339
- package/src/elements/Footer.ts +269 -269
- package/src/elements/Footnote.ts +221 -217
- package/src/elements/FootnoteManager.ts +246 -249
- package/src/elements/Header.ts +269 -269
- package/src/elements/HeaderFooterManager.ts +219 -219
- package/src/elements/Hyperlink.ts +1288 -1193
- package/src/elements/Image.ts +1982 -1756
- package/src/elements/ImageManager.ts +437 -432
- package/src/elements/ImageRun.ts +59 -59
- package/src/elements/MathElement.ts +65 -65
- package/src/elements/Paragraph.ts +4347 -4287
- package/src/elements/PreservedElement.ts +53 -53
- package/src/elements/PropertyChangeTypes.ts +458 -442
- package/src/elements/RangeMarker.ts +382 -400
- package/src/elements/Revision.ts +1198 -1217
- package/src/elements/RevisionContent.ts +73 -73
- package/src/elements/RevisionManager.ts +1070 -1070
- package/src/elements/Run.ts +3103 -3073
- package/src/elements/Section.ts +1521 -1421
- package/src/elements/Shape.ts +884 -873
- package/src/elements/StructuredDocumentTag.ts +1176 -1207
- package/src/elements/Table.ts +2468 -2524
- package/src/elements/TableCell.ts +1617 -1621
- package/src/elements/TableGridChange.ts +149 -151
- package/src/elements/TableOfContents.ts +701 -691
- package/src/elements/TableOfContentsElement.ts +89 -89
- package/src/elements/TableRow.ts +960 -929
- package/src/elements/TextBox.ts +766 -768
- package/src/formatting/AbstractNumbering.ts +580 -579
- package/src/formatting/NumberingInstance.ts +295 -299
- package/src/formatting/NumberingLevel.ts +981 -1040
- package/src/formatting/NumberingManager.ts +833 -827
- package/src/formatting/Style.ts +1785 -1879
- package/src/formatting/StylesManager.ts +1090 -1130
- package/src/helpers/CleanupHelper.ts +524 -524
- package/src/images/ImageOptimizer.ts +274 -274
- package/src/index.ts +559 -554
- package/src/managers/DrawingManager.ts +319 -319
- package/src/tracking/DocumentTrackingContext.ts +687 -674
- package/src/tracking/TrackingContext.ts +175 -173
- package/src/types/compatibility-types.ts +49 -49
- package/src/types/formatting.ts +210 -210
- package/src/types/list-types.ts +14 -14
- package/src/types/settings-types.ts +59 -59
- package/src/types/styleConfig.ts +189 -189
- package/src/utils/ChangelogGenerator.ts +1583 -1581
- package/src/utils/CompatibilityUpgrader.ts +235 -237
- package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
- package/src/utils/MoveOperationHelper.ts +233 -238
- package/src/utils/RevisionAwareProcessor.ts +518 -526
- package/src/utils/RevisionWalker.ts +427 -457
- package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
- package/src/utils/ShadingResolver.ts +105 -107
- package/src/utils/acceptRevisions.ts +723 -714
- package/src/utils/cnfStyleDecoder.ts +212 -217
- package/src/utils/corruptionDetection.ts +346 -345
- package/src/utils/dateFormatting.ts +20 -20
- package/src/utils/deepClone.ts +77 -78
- package/src/utils/diagnostics.ts +125 -129
- package/src/utils/errorHandling.ts +80 -80
- package/src/utils/formatting.ts +220 -213
- package/src/utils/list-detection.ts +32 -42
- package/src/utils/logger.ts +412 -404
- package/src/utils/parsingHelpers.ts +190 -190
- package/src/utils/stripTrackedChanges.ts +356 -353
- package/src/utils/textDiff.ts +100 -100
- package/src/utils/units.ts +421 -421
- package/src/utils/validation.ts +553 -542
- package/src/utils/xmlSanitization.ts +179 -182
- package/src/validation/RevisionAutoFixer.ts +541 -542
- package/src/validation/RevisionValidator.ts +470 -460
- package/src/validation/ValidationRules.ts +338 -338
- package/src/validation/index.ts +30 -30
- package/src/xml/XMLBuilder.ts +857 -871
- package/src/xml/XMLParser.ts +877 -919
- package/src/zip/ZipHandler.ts +629 -637
- package/src/zip/ZipReader.ts +295 -299
- package/src/zip/ZipWriter.ts +374 -390
- package/src/zip/types.ts +116 -116
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Date formatting utilities for OOXML XML generation
|
|
3
|
-
*
|
|
4
|
-
* ECMA-376 requires dates in ISO 8601 format WITHOUT milliseconds:
|
|
5
|
-
* Valid: "2024-01-01T12:00:00Z"
|
|
6
|
-
* Invalid: "2024-01-01T12:00:00.000Z" (Word rejects milliseconds in w:date attributes)
|
|
7
|
-
*
|
|
8
|
-
* JavaScript's Date.toISOString() always includes milliseconds (YYYY-MM-DDTHH:mm:ss.sssZ),
|
|
9
|
-
* so we must strip the .sss portion for all w:date attributes in tracked changes.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Formats a Date to ISO 8601 without milliseconds for OOXML w:date attributes.
|
|
14
|
-
*
|
|
15
|
-
* @param date - Date to format
|
|
16
|
-
* @returns ISO 8601 date string without milliseconds (e.g., "2024-01-01T12:00:00Z")
|
|
17
|
-
*/
|
|
18
|
-
export function formatDateForXml(date: Date): string {
|
|
19
|
-
return date.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
20
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Date formatting utilities for OOXML XML generation
|
|
3
|
+
*
|
|
4
|
+
* ECMA-376 requires dates in ISO 8601 format WITHOUT milliseconds:
|
|
5
|
+
* Valid: "2024-01-01T12:00:00Z"
|
|
6
|
+
* Invalid: "2024-01-01T12:00:00.000Z" (Word rejects milliseconds in w:date attributes)
|
|
7
|
+
*
|
|
8
|
+
* JavaScript's Date.toISOString() always includes milliseconds (YYYY-MM-DDTHH:mm:ss.sssZ),
|
|
9
|
+
* so we must strip the .sss portion for all w:date attributes in tracked changes.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Formats a Date to ISO 8601 without milliseconds for OOXML w:date attributes.
|
|
14
|
+
*
|
|
15
|
+
* @param date - Date to format
|
|
16
|
+
* @returns ISO 8601 date string without milliseconds (e.g., "2024-01-01T12:00:00Z")
|
|
17
|
+
*/
|
|
18
|
+
export function formatDateForXml(date: Date): string {
|
|
19
|
+
return date.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
20
|
+
}
|
package/src/utils/deepClone.ts
CHANGED
|
@@ -1,78 +1,77 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deep clone utility for safely cloning objects
|
|
3
|
-
* More efficient and type-safe than JSON.parse(JSON.stringify())
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Deep clone an object using structured cloning
|
|
8
|
-
* Preserves most object types including Date, RegExp, Map, Set, etc.
|
|
9
|
-
*
|
|
10
|
-
* For simple objects (like formatting options), this is more efficient
|
|
11
|
-
* than JSON.parse(JSON.stringify()) and doesn't lose non-serializable values.
|
|
12
|
-
*
|
|
13
|
-
* @param obj - Object to clone
|
|
14
|
-
* @returns Deep cloned copy of the object
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const original = { bold: true, color: "FF0000", date: new Date() };
|
|
19
|
-
* const cloned = deepClone(original);
|
|
20
|
-
* cloned.bold = false;
|
|
21
|
-
* console.log(original.bold); // true (unchanged)
|
|
22
|
-
* console.log(cloned.date instanceof Date); // true (preserved)
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export function deepClone<T>(obj: T): T {
|
|
26
|
-
// Handle primitive types and null
|
|
27
|
-
if (obj === null || typeof obj !== 'object') {
|
|
28
|
-
return obj;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Handle Date
|
|
32
|
-
if (obj instanceof Date) {
|
|
33
|
-
return new Date(obj.getTime()) as T;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Handle Array
|
|
37
|
-
if (Array.isArray(obj)) {
|
|
38
|
-
const arrCopy: unknown[] = [];
|
|
39
|
-
for (let i = 0; i < obj.length; i++) {
|
|
40
|
-
arrCopy[i] = deepClone(obj[i]);
|
|
41
|
-
}
|
|
42
|
-
return arrCopy as T;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Handle Map
|
|
46
|
-
if (obj instanceof Map) {
|
|
47
|
-
const mapCopy = new Map();
|
|
48
|
-
obj.forEach((value, key) => {
|
|
49
|
-
mapCopy.set(deepClone(key), deepClone(value));
|
|
50
|
-
});
|
|
51
|
-
return mapCopy as T;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Handle Set
|
|
55
|
-
if (obj instanceof Set) {
|
|
56
|
-
const setCopy = new Set();
|
|
57
|
-
obj.forEach(value => {
|
|
58
|
-
setCopy.add(deepClone(value));
|
|
59
|
-
});
|
|
60
|
-
return setCopy as T;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Handle RegExp
|
|
64
|
-
if (obj instanceof RegExp) {
|
|
65
|
-
return new RegExp(obj.source, obj.flags) as T;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Handle plain objects
|
|
69
|
-
const objCopy = Object.create(Object.getPrototypeOf(obj)) as Record<string, unknown>;
|
|
70
|
-
for (const key in obj) {
|
|
71
|
-
if (obj.hasOwnProperty(key)) {
|
|
72
|
-
objCopy[key] = deepClone((obj as Record<string, unknown>)[key]);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return objCopy as T;
|
|
77
|
-
}
|
|
78
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Deep clone utility for safely cloning objects
|
|
3
|
+
* More efficient and type-safe than JSON.parse(JSON.stringify())
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Deep clone an object using structured cloning
|
|
8
|
+
* Preserves most object types including Date, RegExp, Map, Set, etc.
|
|
9
|
+
*
|
|
10
|
+
* For simple objects (like formatting options), this is more efficient
|
|
11
|
+
* than JSON.parse(JSON.stringify()) and doesn't lose non-serializable values.
|
|
12
|
+
*
|
|
13
|
+
* @param obj - Object to clone
|
|
14
|
+
* @returns Deep cloned copy of the object
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const original = { bold: true, color: "FF0000", date: new Date() };
|
|
19
|
+
* const cloned = deepClone(original);
|
|
20
|
+
* cloned.bold = false;
|
|
21
|
+
* console.log(original.bold); // true (unchanged)
|
|
22
|
+
* console.log(cloned.date instanceof Date); // true (preserved)
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function deepClone<T>(obj: T): T {
|
|
26
|
+
// Handle primitive types and null
|
|
27
|
+
if (obj === null || typeof obj !== 'object') {
|
|
28
|
+
return obj;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Handle Date
|
|
32
|
+
if (obj instanceof Date) {
|
|
33
|
+
return new Date(obj.getTime()) as T;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Handle Array
|
|
37
|
+
if (Array.isArray(obj)) {
|
|
38
|
+
const arrCopy: unknown[] = [];
|
|
39
|
+
for (let i = 0; i < obj.length; i++) {
|
|
40
|
+
arrCopy[i] = deepClone(obj[i]);
|
|
41
|
+
}
|
|
42
|
+
return arrCopy as T;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Handle Map
|
|
46
|
+
if (obj instanceof Map) {
|
|
47
|
+
const mapCopy = new Map();
|
|
48
|
+
obj.forEach((value, key) => {
|
|
49
|
+
mapCopy.set(deepClone(key), deepClone(value));
|
|
50
|
+
});
|
|
51
|
+
return mapCopy as T;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Handle Set
|
|
55
|
+
if (obj instanceof Set) {
|
|
56
|
+
const setCopy = new Set();
|
|
57
|
+
obj.forEach((value) => {
|
|
58
|
+
setCopy.add(deepClone(value));
|
|
59
|
+
});
|
|
60
|
+
return setCopy as T;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Handle RegExp
|
|
64
|
+
if (obj instanceof RegExp) {
|
|
65
|
+
return new RegExp(obj.source, obj.flags) as T;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Handle plain objects
|
|
69
|
+
const objCopy = Object.create(Object.getPrototypeOf(obj)) as Record<string, unknown>;
|
|
70
|
+
for (const key in obj) {
|
|
71
|
+
if (obj.hasOwnProperty(key)) {
|
|
72
|
+
objCopy[key] = deepClone((obj as Record<string, unknown>)[key]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return objCopy as T;
|
|
77
|
+
}
|
package/src/utils/diagnostics.ts
CHANGED
|
@@ -1,129 +1,125 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diagnostic logging utilities for debugging document processing
|
|
3
|
-
* @module diagnostics
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export interface DiagnosticConfig {
|
|
7
|
-
enabled: boolean;
|
|
8
|
-
logParsing: boolean;
|
|
9
|
-
logSerialization: boolean;
|
|
10
|
-
logTextDirection: boolean;
|
|
11
|
-
verbose: boolean;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const defaultConfig: DiagnosticConfig = {
|
|
15
|
-
enabled: false,
|
|
16
|
-
logParsing: false,
|
|
17
|
-
logSerialization: false,
|
|
18
|
-
logTextDirection: false,
|
|
19
|
-
verbose: false,
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
let config: DiagnosticConfig = { ...defaultConfig };
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Enable diagnostic logging
|
|
26
|
-
*/
|
|
27
|
-
export function enableDiagnostics(options: Partial<DiagnosticConfig> = {}): void {
|
|
28
|
-
config = {
|
|
29
|
-
...defaultConfig,
|
|
30
|
-
enabled: true,
|
|
31
|
-
...options,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Disable diagnostic logging
|
|
37
|
-
*/
|
|
38
|
-
export function disableDiagnostics(): void {
|
|
39
|
-
config = { ...defaultConfig };
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Get current diagnostic configuration
|
|
44
|
-
*/
|
|
45
|
-
export function getDiagnosticConfig(): DiagnosticConfig {
|
|
46
|
-
return { ...config };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Log parsing activity
|
|
51
|
-
*/
|
|
52
|
-
export function logParsing(message: string, data?: unknown): void {
|
|
53
|
-
if (config.enabled && config.logParsing) {
|
|
54
|
-
console.log(`[PARSE] ${message}`, data !== undefined ? data : '');
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Log serialization activity
|
|
60
|
-
*/
|
|
61
|
-
export function logSerialization(message: string, data?: unknown): void {
|
|
62
|
-
if (config.enabled && config.logSerialization) {
|
|
63
|
-
console.log(`[SERIALIZE] ${message}`, data !== undefined ? data : '');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Log text direction properties
|
|
69
|
-
*/
|
|
70
|
-
export function logTextDirection(message: string, data?: unknown): void {
|
|
71
|
-
if (config.enabled && config.logTextDirection) {
|
|
72
|
-
console.log(`[TEXT-DIR] ${message}`, data !== undefined ? data : '');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Log verbose details
|
|
78
|
-
*/
|
|
79
|
-
export function logVerbose(message: string, data?: unknown): void {
|
|
80
|
-
if (config.enabled && config.verbose) {
|
|
81
|
-
console.log(`[VERBOSE] ${message}`, data !== undefined ? data : '');
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Log paragraph content summary
|
|
87
|
-
*/
|
|
88
|
-
export function logParagraphContent(
|
|
89
|
-
source: 'parsing' | 'serialization',
|
|
90
|
-
paraIndex: number,
|
|
91
|
-
runs: { text: string; rtl?: boolean }[],
|
|
92
|
-
bidi?: boolean
|
|
93
|
-
): void {
|
|
94
|
-
if (!config.enabled) return;
|
|
95
|
-
|
|
96
|
-
const logger = source === 'parsing' ? logParsing : logSerialization;
|
|
97
|
-
|
|
98
|
-
logger(`Paragraph ${paraIndex}:`);
|
|
99
|
-
logger(` BiDi: ${bidi !== undefined ? bidi : 'not set'}`);
|
|
100
|
-
logger(` Runs (${runs.length}):`);
|
|
101
|
-
|
|
102
|
-
runs.forEach((run, idx) => {
|
|
103
|
-
const rtlStatus = run.rtl ? ' [RTL]' : '';
|
|
104
|
-
logger(` ${idx + 1}. "${run.text}"${rtlStatus}`);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
const fullText = runs.map(r => r.text).join('');
|
|
108
|
-
logger(` Combined text: "${fullText}"`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Compare text before and after processing
|
|
113
|
-
*/
|
|
114
|
-
export function logTextComparison(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
after
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
} else if (config.verbose) {
|
|
127
|
-
logVerbose(`${label}: Text preserved correctly`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostic logging utilities for debugging document processing
|
|
3
|
+
* @module diagnostics
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface DiagnosticConfig {
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
logParsing: boolean;
|
|
9
|
+
logSerialization: boolean;
|
|
10
|
+
logTextDirection: boolean;
|
|
11
|
+
verbose: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const defaultConfig: DiagnosticConfig = {
|
|
15
|
+
enabled: false,
|
|
16
|
+
logParsing: false,
|
|
17
|
+
logSerialization: false,
|
|
18
|
+
logTextDirection: false,
|
|
19
|
+
verbose: false,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let config: DiagnosticConfig = { ...defaultConfig };
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Enable diagnostic logging
|
|
26
|
+
*/
|
|
27
|
+
export function enableDiagnostics(options: Partial<DiagnosticConfig> = {}): void {
|
|
28
|
+
config = {
|
|
29
|
+
...defaultConfig,
|
|
30
|
+
enabled: true,
|
|
31
|
+
...options,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Disable diagnostic logging
|
|
37
|
+
*/
|
|
38
|
+
export function disableDiagnostics(): void {
|
|
39
|
+
config = { ...defaultConfig };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get current diagnostic configuration
|
|
44
|
+
*/
|
|
45
|
+
export function getDiagnosticConfig(): DiagnosticConfig {
|
|
46
|
+
return { ...config };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Log parsing activity
|
|
51
|
+
*/
|
|
52
|
+
export function logParsing(message: string, data?: unknown): void {
|
|
53
|
+
if (config.enabled && config.logParsing) {
|
|
54
|
+
console.log(`[PARSE] ${message}`, data !== undefined ? data : '');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Log serialization activity
|
|
60
|
+
*/
|
|
61
|
+
export function logSerialization(message: string, data?: unknown): void {
|
|
62
|
+
if (config.enabled && config.logSerialization) {
|
|
63
|
+
console.log(`[SERIALIZE] ${message}`, data !== undefined ? data : '');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Log text direction properties
|
|
69
|
+
*/
|
|
70
|
+
export function logTextDirection(message: string, data?: unknown): void {
|
|
71
|
+
if (config.enabled && config.logTextDirection) {
|
|
72
|
+
console.log(`[TEXT-DIR] ${message}`, data !== undefined ? data : '');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Log verbose details
|
|
78
|
+
*/
|
|
79
|
+
export function logVerbose(message: string, data?: unknown): void {
|
|
80
|
+
if (config.enabled && config.verbose) {
|
|
81
|
+
console.log(`[VERBOSE] ${message}`, data !== undefined ? data : '');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Log paragraph content summary
|
|
87
|
+
*/
|
|
88
|
+
export function logParagraphContent(
|
|
89
|
+
source: 'parsing' | 'serialization',
|
|
90
|
+
paraIndex: number,
|
|
91
|
+
runs: { text: string; rtl?: boolean }[],
|
|
92
|
+
bidi?: boolean
|
|
93
|
+
): void {
|
|
94
|
+
if (!config.enabled) return;
|
|
95
|
+
|
|
96
|
+
const logger = source === 'parsing' ? logParsing : logSerialization;
|
|
97
|
+
|
|
98
|
+
logger(`Paragraph ${paraIndex}:`);
|
|
99
|
+
logger(` BiDi: ${bidi !== undefined ? bidi : 'not set'}`);
|
|
100
|
+
logger(` Runs (${runs.length}):`);
|
|
101
|
+
|
|
102
|
+
runs.forEach((run, idx) => {
|
|
103
|
+
const rtlStatus = run.rtl ? ' [RTL]' : '';
|
|
104
|
+
logger(` ${idx + 1}. "${run.text}"${rtlStatus}`);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const fullText = runs.map((r) => r.text).join('');
|
|
108
|
+
logger(` Combined text: "${fullText}"`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Compare text before and after processing
|
|
113
|
+
*/
|
|
114
|
+
export function logTextComparison(label: string, before: string, after: string): void {
|
|
115
|
+
if (!config.enabled) return;
|
|
116
|
+
|
|
117
|
+
if (before !== after) {
|
|
118
|
+
console.log(`[TEXT-CHANGE] ${label}:`);
|
|
119
|
+
console.log(` Before: "${before}"`);
|
|
120
|
+
console.log(` After: "${after}"`);
|
|
121
|
+
console.log(` MISMATCH DETECTED!`);
|
|
122
|
+
} else if (config.verbose) {
|
|
123
|
+
logVerbose(`${label}: Text preserved correctly`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error handling utilities for consistent error processing
|
|
3
|
-
* Ensures all caught errors are properly typed and handled
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Type guard to check if a value is an Error object
|
|
8
|
-
* @param error - The value to check
|
|
9
|
-
* @returns True if the value is an Error instance
|
|
10
|
-
*/
|
|
11
|
-
export function isError(error: unknown): error is Error {
|
|
12
|
-
return error instanceof Error;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Converts unknown error to Error object
|
|
17
|
-
* Ensures we always have a proper Error with message property
|
|
18
|
-
* @param error - The error to normalize (can be anything)
|
|
19
|
-
* @returns Normalized Error object
|
|
20
|
-
*/
|
|
21
|
-
export function toError(error: unknown): Error {
|
|
22
|
-
if (isError(error)) {
|
|
23
|
-
return error;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Handle string errors
|
|
27
|
-
if (typeof error === 'string') {
|
|
28
|
-
return new Error(error);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Handle objects with message property
|
|
32
|
-
if (error && typeof error === 'object' && 'message' in error) {
|
|
33
|
-
return new Error(String(error.message));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Fallback for any other type
|
|
37
|
-
return new Error(String(error));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Wraps an error with additional context
|
|
42
|
-
* Useful for adding file paths, operation names, etc.
|
|
43
|
-
* @param error - The original error
|
|
44
|
-
* @param context - Additional context to prepend to error message
|
|
45
|
-
* @returns New Error with combined message and original stack
|
|
46
|
-
*/
|
|
47
|
-
export function wrapError(error: unknown, context: string): Error {
|
|
48
|
-
const originalError = toError(error);
|
|
49
|
-
const wrappedError = new Error(`${context}: ${originalError.message}`);
|
|
50
|
-
|
|
51
|
-
// Preserve original stack trace if available
|
|
52
|
-
if (originalError.stack) {
|
|
53
|
-
wrappedError.stack = `${wrappedError.message}\nCaused by: ${originalError.stack}`;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return wrappedError;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Safe error message extraction
|
|
61
|
-
* Returns error message or generic fallback
|
|
62
|
-
* @param error - The error to extract message from
|
|
63
|
-
* @param fallback - Fallback message if extraction fails
|
|
64
|
-
* @returns Error message string
|
|
65
|
-
*/
|
|
66
|
-
export function getErrorMessage(error: unknown, fallback = 'Unknown error occurred'): string {
|
|
67
|
-
if (isError(error)) {
|
|
68
|
-
return error.message;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (typeof error === 'string') {
|
|
72
|
-
return error;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (error && typeof error === 'object' && 'message' in error) {
|
|
76
|
-
return String(error.message);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return fallback;
|
|
80
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Error handling utilities for consistent error processing
|
|
3
|
+
* Ensures all caught errors are properly typed and handled
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Type guard to check if a value is an Error object
|
|
8
|
+
* @param error - The value to check
|
|
9
|
+
* @returns True if the value is an Error instance
|
|
10
|
+
*/
|
|
11
|
+
export function isError(error: unknown): error is Error {
|
|
12
|
+
return error instanceof Error;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Converts unknown error to Error object
|
|
17
|
+
* Ensures we always have a proper Error with message property
|
|
18
|
+
* @param error - The error to normalize (can be anything)
|
|
19
|
+
* @returns Normalized Error object
|
|
20
|
+
*/
|
|
21
|
+
export function toError(error: unknown): Error {
|
|
22
|
+
if (isError(error)) {
|
|
23
|
+
return error;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Handle string errors
|
|
27
|
+
if (typeof error === 'string') {
|
|
28
|
+
return new Error(error);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Handle objects with message property
|
|
32
|
+
if (error && typeof error === 'object' && 'message' in error) {
|
|
33
|
+
return new Error(String(error.message));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Fallback for any other type
|
|
37
|
+
return new Error(String(error));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Wraps an error with additional context
|
|
42
|
+
* Useful for adding file paths, operation names, etc.
|
|
43
|
+
* @param error - The original error
|
|
44
|
+
* @param context - Additional context to prepend to error message
|
|
45
|
+
* @returns New Error with combined message and original stack
|
|
46
|
+
*/
|
|
47
|
+
export function wrapError(error: unknown, context: string): Error {
|
|
48
|
+
const originalError = toError(error);
|
|
49
|
+
const wrappedError = new Error(`${context}: ${originalError.message}`);
|
|
50
|
+
|
|
51
|
+
// Preserve original stack trace if available
|
|
52
|
+
if (originalError.stack) {
|
|
53
|
+
wrappedError.stack = `${wrappedError.message}\nCaused by: ${originalError.stack}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return wrappedError;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Safe error message extraction
|
|
61
|
+
* Returns error message or generic fallback
|
|
62
|
+
* @param error - The error to extract message from
|
|
63
|
+
* @param fallback - Fallback message if extraction fails
|
|
64
|
+
* @returns Error message string
|
|
65
|
+
*/
|
|
66
|
+
export function getErrorMessage(error: unknown, fallback = 'Unknown error occurred'): string {
|
|
67
|
+
if (isError(error)) {
|
|
68
|
+
return error.message;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (typeof error === 'string') {
|
|
72
|
+
return error;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (error && typeof error === 'object' && 'message' in error) {
|
|
76
|
+
return String(error.message);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return fallback;
|
|
80
|
+
}
|