@x15ventures/x15-ui-library 3.18.0 → 3.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/THIRD_PARTY_LICENSES.md +11182 -0
  2. package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
  3. package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
  4. package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
  5. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js +27 -12
  6. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  7. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  8. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  9. package/dist/cjs/components/design/dialog/dialog.css +4 -0
  10. package/dist/cjs/components/design/logos/LogoLink.js +2 -1
  11. package/dist/cjs/components/design/logos/LogoLink.js.map +1 -1
  12. package/dist/cjs/components/design/logos/VentureLogo.js +2 -1
  13. package/dist/cjs/components/design/logos/VentureLogo.js.map +1 -1
  14. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js +2 -2
  15. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  16. package/dist/cjs/components/design/skeleton/Skeleton.js +15 -5
  17. package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -1
  18. package/dist/cjs/components/design/themeLoader/ThemeLoader.js +1 -1
  19. package/dist/cjs/components/design/themeLoader/ThemeLoader.js.map +1 -1
  20. package/dist/cjs/components/form/buttons/SimpleButton.js +3 -1
  21. package/dist/cjs/components/form/buttons/SimpleButton.js.map +1 -1
  22. package/dist/cjs/components/form/buttons/button.interface.js.map +1 -1
  23. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  24. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  25. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +64 -19
  26. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  27. package/dist/cjs/components/navigation/link/Link.js +2 -1
  28. package/dist/cjs/components/navigation/link/Link.js.map +1 -1
  29. package/dist/cjs/components/testing/devToolbar/DevToolbar.js +5 -3
  30. package/dist/cjs/components/testing/devToolbar/DevToolbar.js.map +1 -1
  31. package/dist/cjs/constants/fileUploadTypes.js +9 -4
  32. package/dist/cjs/constants/fileUploadTypes.js.map +1 -1
  33. package/dist/cjs/helpers/dateHelpers.js +34 -23
  34. package/dist/cjs/helpers/dateHelpers.js.map +1 -1
  35. package/dist/cjs/helpers/fileHelpers.js +58 -0
  36. package/dist/cjs/helpers/fileHelpers.js.map +1 -0
  37. package/dist/cjs/helpers/index.js +44 -0
  38. package/dist/cjs/helpers/index.js.map +1 -1
  39. package/dist/cjs/helpers/interactionsHelper.js +8 -1
  40. package/dist/cjs/helpers/interactionsHelper.js.map +1 -1
  41. package/dist/cjs/helpers/objectHelpers.js +23 -9
  42. package/dist/cjs/helpers/objectHelpers.js.map +1 -1
  43. package/dist/cjs/helpers/stringHelpers.js +61 -5
  44. package/dist/cjs/helpers/stringHelpers.js.map +1 -1
  45. package/dist/cjs/helpers/urlHelpers.js +48 -0
  46. package/dist/cjs/helpers/urlHelpers.js.map +1 -0
  47. package/dist/cjs/index.js +191 -0
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/package.json +3 -305
  50. package/dist/cjs/styles/index.css +18 -0
  51. package/dist/cjs/styles/variables/cssVars/_designVariables.css +18 -0
  52. package/dist/cjs/widgets/documentComments/DocumentComments.js +305 -0
  53. package/dist/cjs/widgets/documentComments/DocumentComments.js.map +1 -0
  54. package/dist/cjs/widgets/documentComments/_documentCommentsVariables.css +0 -0
  55. package/dist/cjs/widgets/documentComments/documentComments.css +107 -0
  56. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js +6 -0
  57. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  58. package/dist/cjs/widgets/documentComments/index.js +19 -0
  59. package/dist/cjs/widgets/documentComments/index.js.map +1 -0
  60. package/dist/cjs/widgets/documentComparer/DocumentComparer.js +309 -0
  61. package/dist/cjs/widgets/documentComparer/DocumentComparer.js.map +1 -0
  62. package/dist/cjs/widgets/documentComparer/_documentComparerVariables.css +0 -0
  63. package/dist/cjs/widgets/documentComparer/documentComparer.css +117 -0
  64. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js +6 -0
  65. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  66. package/dist/cjs/widgets/documentComparer/index.js +19 -0
  67. package/dist/cjs/widgets/documentComparer/index.js.map +1 -0
  68. package/dist/cjs/widgets/documentEditor/DocumentEditor.js +142 -0
  69. package/dist/cjs/widgets/documentEditor/DocumentEditor.js.map +1 -0
  70. package/dist/cjs/widgets/documentEditor/_documentEditorVariables.css +0 -0
  71. package/dist/cjs/widgets/documentEditor/documentEditor.css +33 -0
  72. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js +6 -0
  73. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  74. package/dist/cjs/widgets/documentEditor/index.js +19 -0
  75. package/dist/cjs/widgets/documentEditor/index.js.map +1 -0
  76. package/dist/cjs/widgets/documentViewer/DocumentViewer.js +206 -0
  77. package/dist/cjs/widgets/documentViewer/DocumentViewer.js.map +1 -0
  78. package/dist/cjs/widgets/documentViewer/_documentViewerVariables.css +0 -0
  79. package/dist/cjs/widgets/documentViewer/documentViewer.css +82 -0
  80. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js +6 -0
  81. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  82. package/dist/cjs/widgets/documentViewer/index.js +19 -0
  83. package/dist/cjs/widgets/documentViewer/index.js.map +1 -0
  84. package/dist/cjs/widgets/index.js +126 -0
  85. package/dist/cjs/widgets/index.js.map +1 -1
  86. package/dist/cjs/widgets/shared/documents/ToggleGroup.js +32 -0
  87. package/dist/cjs/widgets/shared/documents/ToggleGroup.js.map +1 -0
  88. package/dist/cjs/widgets/shared/documents/_documentVariables.css +0 -0
  89. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js +279 -0
  90. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  91. package/dist/cjs/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  92. package/dist/cjs/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  93. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js +21 -0
  94. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  95. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js +67 -0
  96. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  97. package/dist/cjs/widgets/shared/documents/annotations/index.js +39 -0
  98. package/dist/cjs/widgets/shared/documents/annotations/index.js.map +1 -0
  99. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js +112 -0
  100. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  101. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js +160 -0
  102. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  103. package/dist/cjs/widgets/shared/documents/documentHelpers.js +186 -0
  104. package/dist/cjs/widgets/shared/documents/documentHelpers.js.map +1 -0
  105. package/dist/cjs/widgets/shared/documents/documents.interfaces.js +6 -0
  106. package/dist/cjs/widgets/shared/documents/documents.interfaces.js.map +1 -0
  107. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +73 -0
  108. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  109. package/dist/cjs/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  110. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +114 -0
  111. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  112. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  113. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +6 -0
  114. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  115. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js +19 -0
  116. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  117. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +200 -0
  118. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  119. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  120. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  121. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +6 -0
  122. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  123. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +179 -0
  124. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  125. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +278 -0
  126. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  127. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +208 -0
  128. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  129. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +85 -0
  130. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  131. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  132. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  133. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +64 -0
  134. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  135. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +6 -0
  136. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  137. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +71 -0
  138. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  139. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +192 -0
  140. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  141. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +86 -0
  142. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  143. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +38 -0
  144. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  145. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +49 -0
  146. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  147. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +214 -0
  148. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  149. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +112 -0
  150. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  151. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js +68 -0
  152. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  153. package/dist/cjs/widgets/shared/documents/index.js +50 -0
  154. package/dist/cjs/widgets/shared/documents/index.js.map +1 -0
  155. package/dist/cjs/widgets/shared/documents/toggleGroup.css +8 -0
  156. package/dist/cjs/widgets/shared/documents/useDocumentContent.js +222 -0
  157. package/dist/cjs/widgets/shared/documents/useDocumentContent.js.map +1 -0
  158. package/dist/components/design/banners/pageBanner/PageBanner.d.ts.map +1 -1
  159. package/dist/components/design/card/cardHeader/CardHeaderItem.d.ts.map +1 -1
  160. package/dist/components/design/logos/LogoLink.d.ts.map +1 -1
  161. package/dist/components/design/logos/VentureLogo.d.ts.map +1 -1
  162. package/dist/components/design/skeleton/Skeleton.d.ts +1 -1
  163. package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -1
  164. package/dist/components/design/themeLoader/ThemeLoader.d.ts.map +1 -1
  165. package/dist/components/form/buttons/SimpleButton.d.ts.map +1 -1
  166. package/dist/components/form/buttons/button.interface.d.ts +1 -0
  167. package/dist/components/form/buttons/button.interface.d.ts.map +1 -1
  168. package/dist/components/form/buttons/userPicButton/UserPicButton.d.ts.map +1 -1
  169. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
  170. package/dist/components/navigation/link/Link.d.ts.map +1 -1
  171. package/dist/components/testing/devToolbar/DevToolbar.d.ts.map +1 -1
  172. package/dist/constants/fileUploadTypes.d.ts.map +1 -1
  173. package/dist/esm/autoGenerated/libraryThemes.js +12 -12
  174. package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
  175. package/dist/esm/autoGenerated/libraryThemes.json +12 -12
  176. package/dist/esm/components/design/banners/pageBanner/PageBanner.js +27 -12
  177. package/dist/esm/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  178. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  179. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  180. package/dist/esm/components/design/dialog/dialog.css +4 -0
  181. package/dist/esm/components/design/logos/LogoLink.js +2 -1
  182. package/dist/esm/components/design/logos/LogoLink.js.map +1 -1
  183. package/dist/esm/components/design/logos/VentureLogo.js +2 -1
  184. package/dist/esm/components/design/logos/VentureLogo.js.map +1 -1
  185. package/dist/esm/components/design/revealMore/RevealMoreBelow.js +1 -1
  186. package/dist/esm/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  187. package/dist/esm/components/design/skeleton/Skeleton.js +15 -5
  188. package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -1
  189. package/dist/esm/components/design/themeLoader/ThemeLoader.js +1 -1
  190. package/dist/esm/components/design/themeLoader/ThemeLoader.js.map +1 -1
  191. package/dist/esm/components/form/buttons/SimpleButton.js +3 -1
  192. package/dist/esm/components/form/buttons/SimpleButton.js.map +1 -1
  193. package/dist/esm/components/form/buttons/button.interface.js.map +1 -1
  194. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  195. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  196. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +65 -19
  197. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  198. package/dist/esm/components/navigation/link/Link.js +2 -1
  199. package/dist/esm/components/navigation/link/Link.js.map +1 -1
  200. package/dist/esm/components/testing/devToolbar/DevToolbar.js +5 -3
  201. package/dist/esm/components/testing/devToolbar/DevToolbar.js.map +1 -1
  202. package/dist/esm/constants/fileUploadTypes.js +9 -4
  203. package/dist/esm/constants/fileUploadTypes.js.map +1 -1
  204. package/dist/esm/helpers/dateHelpers.js +34 -23
  205. package/dist/esm/helpers/dateHelpers.js.map +1 -1
  206. package/dist/esm/helpers/fileHelpers.js +48 -0
  207. package/dist/esm/helpers/fileHelpers.js.map +1 -0
  208. package/dist/esm/helpers/index.js +2 -0
  209. package/dist/esm/helpers/index.js.map +1 -1
  210. package/dist/esm/helpers/interactionsHelper.js +5 -0
  211. package/dist/esm/helpers/interactionsHelper.js.map +1 -1
  212. package/dist/esm/helpers/objectHelpers.js +23 -9
  213. package/dist/esm/helpers/objectHelpers.js.map +1 -1
  214. package/dist/esm/helpers/stringHelpers.js +61 -5
  215. package/dist/esm/helpers/stringHelpers.js.map +1 -1
  216. package/dist/esm/helpers/urlHelpers.js +40 -0
  217. package/dist/esm/helpers/urlHelpers.js.map +1 -0
  218. package/dist/esm/index.js +3 -1
  219. package/dist/esm/index.js.map +1 -1
  220. package/dist/esm/package.json +2 -304
  221. package/dist/esm/styles/index.css +18 -0
  222. package/dist/esm/styles/variables/cssVars/_designVariables.css +18 -0
  223. package/dist/esm/widgets/documentComments/DocumentComments.js +298 -0
  224. package/dist/esm/widgets/documentComments/DocumentComments.js.map +1 -0
  225. package/dist/esm/widgets/documentComments/_documentCommentsVariables.css +0 -0
  226. package/dist/esm/widgets/documentComments/documentComments.css +107 -0
  227. package/dist/esm/widgets/documentComments/documentComments.interfaces.js +2 -0
  228. package/dist/esm/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  229. package/dist/esm/widgets/documentComments/index.js +2 -0
  230. package/dist/esm/widgets/documentComments/index.js.map +1 -0
  231. package/dist/esm/widgets/documentComparer/DocumentComparer.js +301 -0
  232. package/dist/esm/widgets/documentComparer/DocumentComparer.js.map +1 -0
  233. package/dist/esm/widgets/documentComparer/_documentComparerVariables.css +0 -0
  234. package/dist/esm/widgets/documentComparer/documentComparer.css +117 -0
  235. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js +2 -0
  236. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  237. package/dist/esm/widgets/documentComparer/index.js +2 -0
  238. package/dist/esm/widgets/documentComparer/index.js.map +1 -0
  239. package/dist/esm/widgets/documentEditor/DocumentEditor.js +135 -0
  240. package/dist/esm/widgets/documentEditor/DocumentEditor.js.map +1 -0
  241. package/dist/esm/widgets/documentEditor/_documentEditorVariables.css +0 -0
  242. package/dist/esm/widgets/documentEditor/documentEditor.css +33 -0
  243. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js +2 -0
  244. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  245. package/dist/esm/widgets/documentEditor/index.js +2 -0
  246. package/dist/esm/widgets/documentEditor/index.js.map +1 -0
  247. package/dist/esm/widgets/documentViewer/DocumentViewer.js +198 -0
  248. package/dist/esm/widgets/documentViewer/DocumentViewer.js.map +1 -0
  249. package/dist/esm/widgets/documentViewer/_documentViewerVariables.css +0 -0
  250. package/dist/esm/widgets/documentViewer/documentViewer.css +82 -0
  251. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js +2 -0
  252. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  253. package/dist/esm/widgets/documentViewer/index.js +2 -0
  254. package/dist/esm/widgets/documentViewer/index.js.map +1 -0
  255. package/dist/esm/widgets/index.js +6 -0
  256. package/dist/esm/widgets/index.js.map +1 -1
  257. package/dist/esm/widgets/shared/documents/ToggleGroup.js +24 -0
  258. package/dist/esm/widgets/shared/documents/ToggleGroup.js.map +1 -0
  259. package/dist/esm/widgets/shared/documents/_documentVariables.css +0 -0
  260. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js +273 -0
  261. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  262. package/dist/esm/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  263. package/dist/esm/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  264. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js +14 -0
  265. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  266. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js +58 -0
  267. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  268. package/dist/esm/widgets/shared/documents/annotations/index.js +4 -0
  269. package/dist/esm/widgets/shared/documents/annotations/index.js.map +1 -0
  270. package/dist/esm/widgets/shared/documents/annotations/textIndex.js +103 -0
  271. package/dist/esm/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  272. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js +150 -0
  273. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  274. package/dist/esm/widgets/shared/documents/documentHelpers.js +168 -0
  275. package/dist/esm/widgets/shared/documents/documentHelpers.js.map +1 -0
  276. package/dist/esm/widgets/shared/documents/documents.interfaces.js +2 -0
  277. package/dist/esm/widgets/shared/documents/documents.interfaces.js.map +1 -0
  278. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +65 -0
  279. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  280. package/dist/esm/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  281. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +102 -0
  282. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  283. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  284. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +2 -0
  285. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  286. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js +13 -0
  287. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  288. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +191 -0
  289. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  290. package/dist/esm/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  291. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  292. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +2 -0
  293. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  294. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +170 -0
  295. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  296. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +270 -0
  297. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  298. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +198 -0
  299. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  300. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +76 -0
  301. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  302. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  303. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  304. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +5 -0
  305. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  306. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +2 -0
  307. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  308. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +64 -0
  309. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  310. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +182 -0
  311. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  312. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +78 -0
  313. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  314. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +30 -0
  315. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  316. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +41 -0
  317. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  318. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +207 -0
  319. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  320. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +105 -0
  321. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  322. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js +57 -0
  323. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  324. package/dist/esm/widgets/shared/documents/index.js +3 -0
  325. package/dist/esm/widgets/shared/documents/index.js.map +1 -0
  326. package/dist/esm/widgets/shared/documents/toggleGroup.css +8 -0
  327. package/dist/esm/widgets/shared/documents/useDocumentContent.js +215 -0
  328. package/dist/esm/widgets/shared/documents/useDocumentContent.js.map +1 -0
  329. package/dist/helpers/dateHelpers.d.ts.map +1 -1
  330. package/dist/helpers/fileHelpers.d.ts +5 -0
  331. package/dist/helpers/fileHelpers.d.ts.map +1 -0
  332. package/dist/helpers/index.d.ts +3 -0
  333. package/dist/helpers/index.d.ts.map +1 -1
  334. package/dist/helpers/interactionsHelper.d.ts +2 -0
  335. package/dist/helpers/interactionsHelper.d.ts.map +1 -1
  336. package/dist/helpers/objectHelpers.d.ts.map +1 -1
  337. package/dist/helpers/stringHelpers.d.ts.map +1 -1
  338. package/dist/helpers/urlHelpers.d.ts +3 -0
  339. package/dist/helpers/urlHelpers.d.ts.map +1 -0
  340. package/dist/index.d.ts +5 -2
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/package.json +42 -28
  343. package/dist/widgets/documentComments/DocumentComments.d.ts +7 -0
  344. package/dist/widgets/documentComments/DocumentComments.d.ts.map +1 -0
  345. package/dist/widgets/documentComments/documentComments.interfaces.d.ts +57 -0
  346. package/dist/widgets/documentComments/documentComments.interfaces.d.ts.map +1 -0
  347. package/dist/widgets/documentComments/index.d.ts +3 -0
  348. package/dist/widgets/documentComments/index.d.ts.map +1 -0
  349. package/dist/widgets/documentComparer/DocumentComparer.d.ts +7 -0
  350. package/dist/widgets/documentComparer/DocumentComparer.d.ts.map +1 -0
  351. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts +78 -0
  352. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts.map +1 -0
  353. package/dist/widgets/documentComparer/index.d.ts +3 -0
  354. package/dist/widgets/documentComparer/index.d.ts.map +1 -0
  355. package/dist/widgets/documentEditor/DocumentEditor.d.ts +7 -0
  356. package/dist/widgets/documentEditor/DocumentEditor.d.ts.map +1 -0
  357. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts +40 -0
  358. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts.map +1 -0
  359. package/dist/widgets/documentEditor/index.d.ts +3 -0
  360. package/dist/widgets/documentEditor/index.d.ts.map +1 -0
  361. package/dist/widgets/documentViewer/DocumentViewer.d.ts +7 -0
  362. package/dist/widgets/documentViewer/DocumentViewer.d.ts.map +1 -0
  363. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts +47 -0
  364. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts.map +1 -0
  365. package/dist/widgets/documentViewer/index.d.ts +3 -0
  366. package/dist/widgets/documentViewer/index.d.ts.map +1 -0
  367. package/dist/widgets/index.d.ts +12 -0
  368. package/dist/widgets/index.d.ts.map +1 -1
  369. package/dist/widgets/shared/documents/ToggleGroup.d.ts +15 -0
  370. package/dist/widgets/shared/documents/ToggleGroup.d.ts.map +1 -0
  371. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts +27 -0
  372. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts.map +1 -0
  373. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts +43 -0
  374. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts.map +1 -0
  375. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts +12 -0
  376. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts.map +1 -0
  377. package/dist/widgets/shared/documents/annotations/index.d.ts +6 -0
  378. package/dist/widgets/shared/documents/annotations/index.d.ts.map +1 -0
  379. package/dist/widgets/shared/documents/annotations/textIndex.d.ts +16 -0
  380. package/dist/widgets/shared/documents/annotations/textIndex.d.ts.map +1 -0
  381. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts +15 -0
  382. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts.map +1 -0
  383. package/dist/widgets/shared/documents/documentHelpers.d.ts +14 -0
  384. package/dist/widgets/shared/documents/documentHelpers.d.ts.map +1 -0
  385. package/dist/widgets/shared/documents/documents.interfaces.d.ts +20 -0
  386. package/dist/widgets/shared/documents/documents.interfaces.d.ts.map +1 -0
  387. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts +6 -0
  388. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts.map +1 -0
  389. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts +25 -0
  390. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts.map +1 -0
  391. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts +17 -0
  392. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts.map +1 -0
  393. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts +5 -0
  394. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts.map +1 -0
  395. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts +8 -0
  396. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts.map +1 -0
  397. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts +23 -0
  398. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts.map +1 -0
  399. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts +12 -0
  400. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts.map +1 -0
  401. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts +8 -0
  402. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts.map +1 -0
  403. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts +32 -0
  404. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts.map +1 -0
  405. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts +12 -0
  406. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts.map +1 -0
  407. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts +7 -0
  408. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts.map +1 -0
  409. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts +16 -0
  410. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts.map +1 -0
  411. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts +3 -0
  412. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts.map +1 -0
  413. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts +6 -0
  414. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts.map +1 -0
  415. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts +3 -0
  416. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts.map +1 -0
  417. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts +8 -0
  418. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts.map +1 -0
  419. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts +11 -0
  420. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts.map +1 -0
  421. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts +7 -0
  422. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts.map +1 -0
  423. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts +3 -0
  424. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts.map +1 -0
  425. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts +21 -0
  426. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts.map +1 -0
  427. package/dist/widgets/shared/documents/index.d.ts +5 -0
  428. package/dist/widgets/shared/documents/index.d.ts.map +1 -0
  429. package/dist/widgets/shared/documents/useDocumentContent.d.ts +11 -0
  430. package/dist/widgets/shared/documents/useDocumentContent.d.ts.map +1 -0
  431. package/package.json +42 -28
  432. package/readme.md +49 -2
  433. package/dist/components/design/dialog/Dialog.test.d.ts +0 -5
  434. package/dist/components/design/dialog/Dialog.test.d.ts.map +0 -1
  435. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts +0 -5
  436. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts.map +0 -1
  437. package/dist/components/design/tooltip/Tooltip.test.d.ts +0 -2
  438. package/dist/components/design/tooltip/Tooltip.test.d.ts.map +0 -1
  439. package/dist/components/form/buttons/SimpleButton.test.d.ts +0 -5
  440. package/dist/components/form/buttons/SimpleButton.test.d.ts.map +0 -1
  441. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts +0 -5
  442. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts.map +0 -1
  443. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +0 -5
  444. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +0 -1
  445. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts +0 -5
  446. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts.map +0 -1
  447. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts +0 -5
  448. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts.map +0 -1
  449. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts +0 -5
  450. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts.map +0 -1
  451. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts +0 -5
  452. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts.map +0 -1
  453. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +0 -5
  454. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +0 -1
  455. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts +0 -5
  456. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts.map +0 -1
  457. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts +0 -5
  458. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts.map +0 -1
  459. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +0 -5
  460. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +0 -1
  461. package/dist/components/form/validation/ValidationMessages.test.d.ts +0 -5
  462. package/dist/components/form/validation/ValidationMessages.test.d.ts.map +0 -1
  463. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts +0 -2
  464. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts.map +0 -1
  465. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts +0 -5
  466. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts.map +0 -1
  467. package/dist/helpers/ageHelpers.test.d.ts +0 -2
  468. package/dist/helpers/ageHelpers.test.d.ts.map +0 -1
  469. package/dist/helpers/dateHelpers.test.d.ts +0 -2
  470. package/dist/helpers/dateHelpers.test.d.ts.map +0 -1
  471. package/dist/helpers/formatters.test.d.ts +0 -5
  472. package/dist/helpers/formatters.test.d.ts.map +0 -1
  473. package/dist/helpers/iconHelpers.test.d.ts +0 -5
  474. package/dist/helpers/iconHelpers.test.d.ts.map +0 -1
  475. package/dist/helpers/numberHelpers.test.d.ts +0 -5
  476. package/dist/helpers/numberHelpers.test.d.ts.map +0 -1
  477. package/dist/helpers/objectHelpers.test.d.ts +0 -2
  478. package/dist/helpers/objectHelpers.test.d.ts.map +0 -1
  479. package/dist/helpers/stringHelpers.test.d.ts +0 -2
  480. package/dist/helpers/stringHelpers.test.d.ts.map +0 -1
  481. package/dist/hooks/InteractiveHostFocus.test.d.ts +0 -5
  482. package/dist/hooks/InteractiveHostFocus.test.d.ts.map +0 -1
  483. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts +0 -5
  484. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DragAndDropFileUpload.js","names":["React","useCallback","useEffect","useMemo","useRef","useState","arrowUpFromBracket","useFormContext","renderIcon","HookFormWrapper","Spinner","FormFieldLabel","InputFile","ValidationMessages","generateButtonClass","FileAttachmentsList","DEFAULT_UPLOAD_FILE_EXTENSIONS","DEFAULT_UPLOAD_FILE_TYPES","BLACKLISTED_FILE_TYPES","DragAndDropFileUpload","props","createElement","formContext","DragAndDropFileUploadField","label","field","showSpinner","fileDisplayStyle","fileListSettings","fileList","validation","customContent","customCssClasses","labelStyle","labelAsButtonStyles","color","variant","labelUploadIcon","multiple","restrictionsTxt","validFiles","extensions","fileTypes","maxFileCount","maxFileSize","onFilesChange","setValue","trigger","activeFileList","setFileList","isTouched","setIsTouched","isDragActive","setIsDragActive","inputId","id","inputElRef","dialogOpenRef","current","document","getElementById","onFocus","noneSelected","files","length","name","window","addEventListener","removeEventListener","supportedFileTypes","join","validateAndCommit","validated","filter","file","ext","split","pop","toLowerCase","isBlacklisted","includes","isValidExt","isValidSize","size","clipped","slice","shouldValidate","shouldDirty","shouldTouch","handleFileInputChange","event","target","Array","from","handleDrop","dropped","handleFilesEdited","wrapperCssClass","wrapper","position","labelProps","isRequired","required","labelStyleAsButtonClasses","cssClass","buttonStyle","hideLabel","hide","labelCssClass","className","onDragOver","e","preventDefault","onDragLeave","currentTarget","onDrop","dataTransfer","labelId","htmlFor","onClick","type","defaultValue","accept","onInput","map","index","key","customFileListSettings","onFilesRemoved","onFilesEdited"],"sources":["../../../../../../../../../src/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.tsx"],"sourcesContent":["'use client';\n\nimport React, { FormEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { arrowUpFromBracket } from '@x15ventures/x15-ui-library-icons/iconDefinitions';\nimport { useFormContext } from 'react-hook-form';\nimport { renderIcon } from '../../../../../../../helpers/iconHelpers';\nimport { HookFormWrapper } from '../../../../../hookFormWrapper/HookFormWrapper';\nimport { Spinner } from '../../../../../../design/spinner/Spinner';\nimport { FormFieldLabel } from '../../../../subComponents/labels/FormFieldLabel';\nimport { InputFile } from '../../../../subComponents/inputs/file/InputFile';\nimport { ValidationMessages } from '../../../../../validation/ValidationMessages';\nimport { generateButtonClass } from '../../../../../buttons/button.helpers';\nimport { FileAttachmentsList } from '../fileAttachmentList/FileAttachmentsList';\nimport { DragAndDropFileUploadProps } from '../fileInputProps';\nimport {\n DEFAULT_UPLOAD_FILE_EXTENSIONS,\n DEFAULT_UPLOAD_FILE_TYPES,\n BLACKLISTED_FILE_TYPES\n} from '../../../../../../../constants';\n\nimport './dragAndDropFileUpload.scss';\n\nexport const DragAndDropFileUpload: React.FC<DragAndDropFileUploadProps> = (props) => (\n <HookFormWrapper formContext={ props.formContext }>\n <DragAndDropFileUploadField { ...props } />\n </HookFormWrapper>\n);\n\nconst DragAndDropFileUploadField: React.FC<DragAndDropFileUploadProps> = (\n {\n label,\n field,\n showSpinner,\n fileDisplayStyle = 'names',\n fileListSettings,\n fileList,\n validation,\n customContent,\n customCssClasses,\n labelStyle = 'dragArea',\n labelAsButtonStyles = { color: 'primary', variant: 'outline' },\n labelUploadIcon = arrowUpFromBracket,\n multiple = false,\n restrictionsTxt = '',\n validFiles = {\n extensions: DEFAULT_UPLOAD_FILE_EXTENSIONS,\n fileTypes: DEFAULT_UPLOAD_FILE_TYPES,\n maxFileCount: 5,\n maxFileSize: 52428800 // 50 MB\n },\n onFilesChange = () => {}\n }\n) => {\n const { setValue, trigger } = useFormContext();\n\n const [activeFileList, setFileList] = useState<File[]>(fileList || []);\n const [isTouched, setIsTouched] = useState(false);\n const [isDragActive, setIsDragActive] = useState(false);\n\n const inputId = field.id;\n const inputElRef = useRef<HTMLInputElement | null>(null);\n const dialogOpenRef = useRef(false);\n\n useEffect(() => {\n inputElRef.current = document.getElementById(inputId) as HTMLInputElement | null;\n }, [inputId]);\n\n // Detect “Cancel” -> dialog closes, window regains focus, but input had no change.\n useEffect(() => {\n const onFocus = () => {\n if (!dialogOpenRef.current) { return; }\n dialogOpenRef.current = false;\n const noneSelected = !inputElRef.current?.files?.length;\n if (noneSelected) {\n // Trigger React Hook Form validators (e.g., required)\n trigger(field.name);\n }\n };\n window.addEventListener('focus', onFocus);\n return () => window.removeEventListener('focus', onFocus);\n }, [trigger, field.name]);\n\n const supportedFileTypes = useMemo(\n () => validFiles?.fileTypes?.join(', ') || '',\n [validFiles?.fileTypes]\n );\n\n const validateAndCommit = useCallback(\n (files: File[]) => {\n // basic validations\n const validated = files.filter((file) => {\n const ext = file.name.split('.').pop()?.toLowerCase() || '';\n const isBlacklisted = BLACKLISTED_FILE_TYPES.includes(ext);\n const isValidExt = validFiles.extensions ? validFiles.extensions.includes(ext) : true;\n const isValidSize = validFiles.maxFileSize ? file.size <= validFiles.maxFileSize : true;\n return !isBlacklisted && isValidExt && isValidSize;\n });\n\n const clipped = validFiles.maxFileCount\n ? validated.slice(0, validFiles.maxFileCount)\n : validated;\n\n setFileList(clipped);\n setIsTouched(true);\n\n setValue(field.name, clipped.length ? clipped : null, {\n shouldValidate: true,\n shouldDirty: true,\n shouldTouch: true\n });\n\n onFilesChange(clipped);\n },\n [field.name, onFilesChange, setValue, fileDisplayStyle, validFiles]\n );\n\n const handleFileInputChange = useCallback((event: FormEvent<HTMLInputElement>) => {\n const target = event.target as HTMLInputElement;\n const files = Array.from(target.files ?? []);\n validateAndCommit(files);\n trigger(field.name);\n dialogOpenRef.current = false;\n }, [trigger, field.name, validateAndCommit]);\n\n const handleDrop = useCallback((dropped: File[]) => {\n validateAndCommit(dropped);\n trigger(field.name);\n }, [trigger, field.name, validateAndCommit]);\n\n const handleFilesEdited = useCallback((files: File[]) => {\n // No need to validate again as they were already validated\n // Changes may include renaming or removing files\n setFileList(files);\n setValue(field.name, files.length > 0 ? files : null, {\n shouldValidate: true,\n shouldDirty: true,\n shouldTouch: true\n });\n onFilesChange(files);\n }, [field.name, setValue, onFilesChange]);\n\n const wrapperCssClass = `\n formField \n dragAndDropFileUpload \n ${ fileDisplayStyle === 'list' ? 'withFileList' : '' } \n ${ labelStyle || '' }Style \n ${ customCssClasses?.wrapper || '' } \n ${ isTouched ? 'touched' : '' } \n ${ typeof validation !== 'undefined' ? 'withValidation' : '' } \n ${ label?.position === 'inset' ? 'insetLabel' : '' } \n ${ isDragActive ? 'isDragActive' : '' }\n `;\n\n const labelProps = {\n ...label,\n inputId: inputId,\n isRequired: validation && typeof validation.required !== 'undefined',\n customContent\n };\n\n const labelStyleAsButtonClasses = generateButtonClass({\n cssClass: 'button dragAndDropFileUploadButtonLabel',\n buttonStyle: labelAsButtonStyles,\n hideLabel: label.hide\n });\n\n const labelCssClass = `\n ${ labelStyle === 'button' ? labelStyleAsButtonClasses : '' }\n ${ customCssClasses?.label || '' } \n ${ showSpinner ? 'withSpinner' : '' } \n ${ label.hide ? 'hiddenLabel' : '' }\n `;\n\n return (\n <div\n className={ wrapperCssClass }\n onDragOver={ (e) => {\n e.preventDefault();\n if (!isDragActive) setIsDragActive(true);\n } }\n onDragLeave={ (e) => {\n if (e.currentTarget === e.target) setIsDragActive(false);\n } }\n onDrop={ (e) => {\n e.preventDefault();\n setIsDragActive(false);\n const files = Array.from(e.dataTransfer?.files ?? []);\n handleDrop(files);\n } }\n >\n <label\n id={ label.labelId || `${ inputId }_label` }\n className={ labelCssClass }\n htmlFor={ inputId }\n onClick={ () => { dialogOpenRef.current = true; } }\n >\n <span className=\"dragAndDropFileUploadLabel\">\n { renderIcon(labelUploadIcon) }\n <FormFieldLabel { ...labelProps } />\n { restrictionsTxt && <span className=\"fileRestrictionsText\">{ restrictionsTxt }</span> }\n </span>\n\n <span className=\"inputContainer\">\n <InputFile\n {\n ...{\n label,\n field: {\n ...field,\n type: 'file',\n id: inputId, // ensure we can query it by id\n defaultValue: '',\n multiple,\n accept: supportedFileTypes,\n onInput: (event: FormEvent<HTMLInputElement>) => {\n handleFileInputChange(event);\n }\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n }\n />\n </span>\n\n { showSpinner && <Spinner /> }\n\n { fileDisplayStyle === 'names' && activeFileList.length > 0 && (\n <span className=\"uploadedFileNames\">\n { activeFileList.map((file, index) => (\n <small key={ index } className=\"uploadedFileName\">\n { file.name }{ index < activeFileList.length - 1 ? ', ' : '' }\n </small>\n )) }\n </span>\n ) }\n\n <ValidationMessages name={ field.name } validation={ validation } />\n </label>\n\n { fileDisplayStyle === 'list' && activeFileList.length > 0 && (\n <FileAttachmentsList\n customFileListSettings={ fileListSettings }\n files={ activeFileList }\n onFilesRemoved={ handleFilesEdited }\n onFilesEdited={ handleFilesEdited }\n />\n ) }\n </div>\n );\n};\n\nexport default { DragAndDropFileUpload };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DragAndDropFileUpload.js","names":["React","useCallback","useEffect","useMemo","useRef","useState","arrowUpFromBracket","useFormContext","getFileExtension","renderIcon","HookFormWrapper","Spinner","FormFieldLabel","InputFile","ValidationMessages","generateButtonClass","FileAttachmentsList","DEFAULT_UPLOAD_FILE_EXTENSIONS","DEFAULT_UPLOAD_FILE_TYPES","BLACKLISTED_FILE_TYPES","getUploadExtension","fileName","startsWith","DEFAULT_VALID_FILES","extensions","fileTypes","maxFileCount","maxFileSize","resolveValidFiles","customValidFiles","customisesTypes","matchesFileTypes","file","extension","name","mimeType","type","toLowerCase","some","token","normalised","trim","slice","endsWith","DragAndDropFileUpload","props","createElement","formContext","DragAndDropFileUploadField","label","field","showSpinner","fileDisplayStyle","fileListSettings","fileList","validation","customContent","customCssClasses","labelStyle","labelAsButtonStyles","color","variant","labelUploadIcon","multiple","restrictionsTxt","validFiles","onFilesChange","setValue","trigger","activeFileList","setFileList","isTouched","setIsTouched","isDragActive","setIsDragActive","inputId","id","inputElRef","dialogOpenRef","current","document","getElementById","onFocus","noneSelected","files","length","window","addEventListener","removeEventListener","supportedFileTypes","join","isFileAllowed","ext","isBlacklisted","includes","isValidExt","isValidSize","size","validateAndCommit","validated","filter","clipped","shouldValidate","shouldDirty","shouldTouch","handleFileInputChange","event","target","Array","from","handleDrop","dropped","handleFilesEdited","editedFiles","wrapperCssClass","wrapper","position","labelProps","isRequired","required","labelStyleAsButtonClasses","cssClass","buttonStyle","hideLabel","hide","labelCssClass","className","onDragOver","e","preventDefault","onDragLeave","currentTarget","onDrop","dataTransfer","labelId","htmlFor","onClick","defaultValue","accept","onInput","map","index","key","customFileListSettings","onFilesRemoved","onFilesEdited"],"sources":["../../../../../../../../../src/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.tsx"],"sourcesContent":["'use client';\n\nimport React, { FormEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { arrowUpFromBracket } from '@x15ventures/x15-ui-library-icons/iconDefinitions';\nimport { useFormContext } from 'react-hook-form';\nimport { getFileExtension } from '../../../../../../../helpers/fileHelpers';\nimport { renderIcon } from '../../../../../../../helpers/iconHelpers';\nimport { HookFormWrapper } from '../../../../../hookFormWrapper/HookFormWrapper';\nimport { Spinner } from '../../../../../../design/spinner/Spinner';\nimport { FormFieldLabel } from '../../../../subComponents/labels/FormFieldLabel';\nimport { InputFile } from '../../../../subComponents/inputs/file/InputFile';\nimport { ValidationMessages } from '../../../../../validation/ValidationMessages';\nimport { generateButtonClass } from '../../../../../buttons/button.helpers';\nimport { FileAttachmentsList } from '../fileAttachmentList/FileAttachmentsList';\nimport { DragAndDropFileUploadProps } from '../fileInputProps';\nimport {\n DEFAULT_UPLOAD_FILE_EXTENSIONS,\n DEFAULT_UPLOAD_FILE_TYPES,\n BLACKLISTED_FILE_TYPES\n} from '../../../../../../../constants';\n\nimport './dragAndDropFileUpload.scss';\n\n// A dot-file such as `.exe` has no extension by convention, but its name is still checked as one so\n// it cannot slip past the blacklist.\nconst getUploadExtension = (fileName: string): string =>\n getFileExtension(fileName.startsWith('.') ? `upload${ fileName }` : fileName);\n\ntype ValidFiles = NonNullable<DragAndDropFileUploadProps['validFiles']>;\n\nconst DEFAULT_VALID_FILES: ValidFiles = {\n extensions: DEFAULT_UPLOAD_FILE_EXTENSIONS,\n fileTypes: DEFAULT_UPLOAD_FILE_TYPES,\n maxFileCount: 5,\n maxFileSize: 52428800 // 50 MB\n};\n\n/*\n Limits-only configurations keep the default type restrictions. Once either `extensions` or\n `fileTypes` is supplied (even as undefined), both are taken from the configuration so the picker\n filter and the validation cannot disagree.\n */\nconst resolveValidFiles = (customValidFiles?: ValidFiles): ValidFiles => {\n if (!customValidFiles) {\n return DEFAULT_VALID_FILES;\n }\n const customisesTypes = 'extensions' in customValidFiles || 'fileTypes' in customValidFiles;\n return customisesTypes\n ? {\n ...DEFAULT_VALID_FILES,\n ...customValidFiles,\n extensions: customValidFiles.extensions,\n fileTypes: customValidFiles.fileTypes\n }\n : { ...DEFAULT_VALID_FILES, ...customValidFiles };\n};\n\n// Matches a file against `accept`-style tokens: `.ext`, `type/*` or an exact MIME type.\nconst matchesFileTypes = (file: File, fileTypes: string[]): boolean => {\n const extension = getUploadExtension(file.name);\n const mimeType = file.type.toLowerCase();\n return fileTypes.some((token) => {\n const normalised = token.trim().toLowerCase();\n if (normalised.startsWith('.')) {\n return normalised.slice(1) === extension;\n }\n if (normalised.endsWith('/*')) {\n return mimeType.startsWith(normalised.slice(0, -1));\n }\n return normalised !== '' && normalised === mimeType;\n });\n};\n\nexport const DragAndDropFileUpload: React.FC<DragAndDropFileUploadProps> = (props) => (\n <HookFormWrapper formContext={ props.formContext }>\n <DragAndDropFileUploadField { ...props } />\n </HookFormWrapper>\n);\n\nconst DragAndDropFileUploadField: React.FC<DragAndDropFileUploadProps> = (\n {\n label,\n field,\n showSpinner,\n fileDisplayStyle = 'names',\n fileListSettings,\n fileList,\n validation,\n customContent,\n customCssClasses,\n labelStyle = 'dragArea',\n labelAsButtonStyles = { color: 'primary', variant: 'outline' },\n labelUploadIcon = arrowUpFromBracket,\n multiple = false,\n restrictionsTxt = '',\n validFiles: customValidFiles,\n onFilesChange = () => {}\n }\n) => {\n const validFiles = useMemo(() => resolveValidFiles(customValidFiles), [customValidFiles]);\n const { setValue, trigger } = useFormContext();\n\n const [activeFileList, setFileList] = useState<File[]>(fileList || []);\n const [isTouched, setIsTouched] = useState(false);\n const [isDragActive, setIsDragActive] = useState(false);\n\n const inputId = field.id;\n const inputElRef = useRef<HTMLInputElement | null>(null);\n const dialogOpenRef = useRef(false);\n\n useEffect(() => {\n inputElRef.current = document.getElementById(inputId) as HTMLInputElement | null;\n }, [inputId]);\n\n // Detect “Cancel” -> dialog closes, window regains focus, but input had no change.\n useEffect(() => {\n const onFocus = () => {\n if (!dialogOpenRef.current) { return; }\n dialogOpenRef.current = false;\n const noneSelected = !inputElRef.current?.files?.length;\n if (noneSelected) {\n // Trigger React Hook Form validators (e.g., required)\n trigger(field.name);\n }\n };\n window.addEventListener('focus', onFocus);\n return () => window.removeEventListener('focus', onFocus);\n }, [trigger, field.name]);\n\n const supportedFileTypes = useMemo(\n () => validFiles?.fileTypes?.join(', ') || '',\n [validFiles?.fileTypes]\n );\n\n const isFileAllowed = useCallback((file: File) => {\n const ext = getUploadExtension(file.name);\n const isBlacklisted = BLACKLISTED_FILE_TYPES.includes(ext);\n // Without an extension allowlist, the picker's file types are enforced so dropped files obey them too.\n const isValidExt = validFiles.extensions\n ? validFiles.extensions.includes(ext)\n : validFiles.fileTypes?.length ? matchesFileTypes(file, validFiles.fileTypes) : true;\n const isValidSize = validFiles.maxFileSize ? file.size <= validFiles.maxFileSize : true;\n return !isBlacklisted && isValidExt && isValidSize;\n }, [validFiles]);\n\n const validateAndCommit = useCallback(\n (files: File[]) => {\n const validated = files.filter(isFileAllowed);\n\n const clipped = validFiles.maxFileCount\n ? validated.slice(0, validFiles.maxFileCount)\n : validated;\n\n setFileList(clipped);\n setIsTouched(true);\n\n setValue(field.name, clipped.length ? clipped : null, {\n shouldValidate: true,\n shouldDirty: true,\n shouldTouch: true\n });\n\n onFilesChange(clipped);\n },\n [field.name, onFilesChange, setValue, isFileAllowed, validFiles]\n );\n\n const handleFileInputChange = useCallback((event: FormEvent<HTMLInputElement>) => {\n const target = event.target as HTMLInputElement;\n const files = Array.from(target.files ?? []);\n validateAndCommit(files);\n trigger(field.name);\n dialogOpenRef.current = false;\n }, [trigger, field.name, validateAndCommit]);\n\n const handleDrop = useCallback((dropped: File[]) => {\n validateAndCommit(dropped);\n trigger(field.name);\n }, [trigger, field.name, validateAndCommit]);\n\n const handleFilesEdited = useCallback((editedFiles: File[]) => {\n // Edits may rename files, so they are checked again: renaming `notes.txt` to `notes.exe` must not\n // get past the extension rules the original name passed.\n const files = editedFiles.filter(isFileAllowed);\n setFileList(files);\n setValue(field.name, files.length > 0 ? files : null, {\n shouldValidate: true,\n shouldDirty: true,\n shouldTouch: true\n });\n onFilesChange(files);\n }, [field.name, setValue, onFilesChange, isFileAllowed]);\n\n const wrapperCssClass = `\n formField \n dragAndDropFileUpload \n ${ fileDisplayStyle === 'list' ? 'withFileList' : '' } \n ${ labelStyle || '' }Style \n ${ customCssClasses?.wrapper || '' } \n ${ isTouched ? 'touched' : '' } \n ${ typeof validation !== 'undefined' ? 'withValidation' : '' } \n ${ label?.position === 'inset' ? 'insetLabel' : '' } \n ${ isDragActive ? 'isDragActive' : '' }\n `;\n\n const labelProps = {\n ...label,\n inputId: inputId,\n isRequired: validation && typeof validation.required !== 'undefined',\n customContent\n };\n\n const labelStyleAsButtonClasses = generateButtonClass({\n cssClass: 'button dragAndDropFileUploadButtonLabel',\n buttonStyle: labelAsButtonStyles,\n hideLabel: label.hide\n });\n\n const labelCssClass = `\n ${ labelStyle === 'button' ? labelStyleAsButtonClasses : '' }\n ${ customCssClasses?.label || '' } \n ${ showSpinner ? 'withSpinner' : '' } \n ${ label.hide ? 'hiddenLabel' : '' }\n `;\n\n return (\n <div\n className={ wrapperCssClass }\n onDragOver={ (e) => {\n e.preventDefault();\n if (!isDragActive) setIsDragActive(true);\n } }\n onDragLeave={ (e) => {\n if (e.currentTarget === e.target) setIsDragActive(false);\n } }\n onDrop={ (e) => {\n e.preventDefault();\n setIsDragActive(false);\n const files = Array.from(e.dataTransfer?.files ?? []);\n handleDrop(files);\n } }\n >\n <label\n id={ label.labelId || `${ inputId }_label` }\n className={ labelCssClass }\n htmlFor={ inputId }\n onClick={ () => { dialogOpenRef.current = true; } }\n >\n <span className=\"dragAndDropFileUploadLabel\">\n { renderIcon(labelUploadIcon) }\n <FormFieldLabel { ...labelProps } />\n { restrictionsTxt && <span className=\"fileRestrictionsText\">{ restrictionsTxt }</span> }\n </span>\n\n <span className=\"inputContainer\">\n <InputFile\n {\n ...{\n label,\n field: {\n ...field,\n type: 'file',\n id: inputId, // ensure we can query it by id\n defaultValue: '',\n multiple,\n accept: supportedFileTypes,\n onInput: (event: FormEvent<HTMLInputElement>) => {\n handleFileInputChange(event);\n }\n },\n validation,\n showSpinner,\n customCssClasses,\n customContent\n }\n }\n />\n </span>\n\n { showSpinner && <Spinner /> }\n\n { fileDisplayStyle === 'names' && activeFileList.length > 0 && (\n <span className=\"uploadedFileNames\">\n { activeFileList.map((file, index) => (\n <small key={ index } className=\"uploadedFileName\">\n { file.name }{ index < activeFileList.length - 1 ? ', ' : '' }\n </small>\n )) }\n </span>\n ) }\n\n <ValidationMessages name={ field.name } validation={ validation } />\n </label>\n\n { fileDisplayStyle === 'list' && activeFileList.length > 0 && (\n <FileAttachmentsList\n customFileListSettings={ fileListSettings }\n files={ activeFileList }\n onFilesRemoved={ handleFilesEdited }\n onFilesEdited={ handleFilesEdited }\n />\n ) }\n </div>\n );\n};\n\nexport default { DragAndDropFileUpload };\n"],"mappings":"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","ignoreList":[]}
@@ -1,13 +1,14 @@
1
1
  'use client';
2
2
 
3
3
  import React from 'react';
4
+ import { getSafeLinkHref } from '../../../helpers/urlHelpers';
4
5
  export const Link = ({
5
6
  href,
6
7
  label,
7
8
  target = '_self',
8
9
  customCssClass = ''
9
10
  }) => /*#__PURE__*/React.createElement("a", {
10
- href: href,
11
+ href: getSafeLinkHref(href),
11
12
  title: label,
12
13
  target: target,
13
14
  className: `link ${customCssClass}`,
@@ -1 +1 @@
1
- {"version":3,"file":"Link.js","names":["React","Link","href","label","target","customCssClass","createElement","title","className","rel","undefined"],"sources":["../../../../../src/components/navigation/link/Link.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nexport interface LinkProps {\n href: string;\n label: string;\n target?: '_self' | '_blank' | '_parent' | '_top';\n customCssClass?: string;\n}\n\nexport const Link: React.FC<LinkProps> = ({\n href,\n label,\n target = '_self',\n customCssClass = ''\n}) => (\n <a\n href={ href }\n title={ label }\n target={ target }\n className={ `link ${ customCssClass }` }\n rel={ target === '_blank' ? 'noopener noreferrer' : undefined }\n >\n { label }\n </a>\n);\n\nexport default Link;"],"mappings":"AAAA,YAAY;;AAEZ,OAAOA,KAAK,MAAM,OAAO;AASzB,OAAO,MAAMC,IAAyB,GAAGA,CAAC;EACxCC,IAAI;EACJC,KAAK;EACLC,MAAM,GAAG,OAAO;EAChBC,cAAc,GAAG;AACnB,CAAC,kBACCL,KAAA,CAAAM,aAAA;EACEJ,IAAI,EAAGA,IAAM;EACbK,KAAK,EAAGJ,KAAO;EACfC,MAAM,EAAGA,MAAQ;EACjBI,SAAS,EAAG,QAASH,cAAc,EAAK;EACxCI,GAAG,EAAGL,MAAM,KAAK,QAAQ,GAAG,qBAAqB,GAAGM;AAAW,GAE7DP,KACD,CACJ;AAED,eAAeF,IAAI","ignoreList":[]}
1
+ {"version":3,"file":"Link.js","names":["React","getSafeLinkHref","Link","href","label","target","customCssClass","createElement","title","className","rel","undefined"],"sources":["../../../../../src/components/navigation/link/Link.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport { getSafeLinkHref } from '../../../helpers/urlHelpers';\n\nexport interface LinkProps {\n href: string;\n label: string;\n target?: '_self' | '_blank' | '_parent' | '_top';\n customCssClass?: string;\n}\n\nexport const Link: React.FC<LinkProps> = ({\n href,\n label,\n target = '_self',\n customCssClass = ''\n}) => (\n <a\n href={ getSafeLinkHref(href) }\n title={ label }\n target={ target }\n className={ `link ${ customCssClass }` }\n rel={ target === '_blank' ? 'noopener noreferrer' : undefined }\n >\n { label }\n </a>\n);\n\nexport default Link;"],"mappings":"AAAA,YAAY;;AAEZ,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,6BAA6B;AAS7D,OAAO,MAAMC,IAAyB,GAAGA,CAAC;EACxCC,IAAI;EACJC,KAAK;EACLC,MAAM,GAAG,OAAO;EAChBC,cAAc,GAAG;AACnB,CAAC,kBACCN,KAAA,CAAAO,aAAA;EACEJ,IAAI,EAAGF,eAAe,CAACE,IAAI,CAAG;EAC9BK,KAAK,EAAGJ,KAAO;EACfC,MAAM,EAAGA,MAAQ;EACjBI,SAAS,EAAG,QAASH,cAAc,EAAK;EACxCI,GAAG,EAAGL,MAAM,KAAK,QAAQ,GAAG,qBAAqB,GAAGM;AAAW,GAE7DP,KACD,CACJ;AAED,eAAeF,IAAI","ignoreList":[]}
@@ -4,8 +4,10 @@ import React, { useContext } from 'react';
4
4
  import { ThemeSwitch } from '../themeSwitch/ThemeSwitch';
5
5
  import { UserContext } from '../../../contextProviders/userContext/UserContextProvider';
6
6
  import { SimpleButton } from '../../form/buttons/SimpleButton';
7
- import './devToolbar.css';
8
7
  import { SidePanel } from '../../design/sidePanel/SidePanel';
8
+
9
+ // @ts-ignore SCSS side-effect imports are handled by the bundler.
10
+ import './devToolbar.css';
9
11
  export const DevToolbar = () => {
10
12
  const context = useContext(UserContext);
11
13
  const env = process.env.NODE_ENV;
@@ -36,8 +38,8 @@ export const DevToolbar = () => {
36
38
  }
37
39
  }
38
40
  }
39
- } catch (e) {
40
- console.error('Could not access stylesheet:', e);
41
+ } catch {
42
+ console.warn('Could not access stylesheet.');
41
43
  }
42
44
  }
43
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolbar.js","names":["React","useContext","ThemeSwitch","UserContext","SimpleButton","SidePanel","DevToolbar","context","env","process","NODE_ENV","handleThemeChange","newTheme","applyThemeChange","listThemeCssVariables","stylesheets","document","styleSheets","i","length","stylesheet","ownerNode","id","includes","rules","cssRules","j","rule","CSSStyleRule","selectorText","k","style","prop","startsWith","console","log","getPropertyValue","trim","e","error","createElement","open","size","position","panelLabel","className","onThemeChangeAction","cssClass","label","onClickHandler"],"sources":["../../../../../src/components/testing/devToolbar/DevToolbar.tsx"],"sourcesContent":["'use client';\n\nimport React, { useContext } from 'react';\nimport { ThemeSwitch } from '../themeSwitch/ThemeSwitch';\nimport { UserContext } from '../../../contextProviders/userContext/UserContextProvider';\nimport { SimpleButton } from '../../form/buttons/SimpleButton';\n\nimport './devToolbar.scss';\nimport { SidePanel } from '../../design/sidePanel/SidePanel';\n\nexport const DevToolbar: React.FC = () => {\n const context = useContext(UserContext);\n\n const env = process.env.NODE_ENV;\n\n const handleThemeChange = (newTheme: string) => {\n if (context && context?.applyThemeChange) {\n context.applyThemeChange(newTheme);\n }\n };\n\n const listThemeCssVariables = () => {\n const stylesheets = document.styleSheets;\n\n // Loop through all stylesheets\n for (let i = 0; i < stylesheets.length; i += 1) {\n const stylesheet = stylesheets[i];\n\n if (stylesheet && stylesheet.ownerNode && 'id' in stylesheet.ownerNode && stylesheet.ownerNode.id.includes('x15-ui-library-theme')) {\n try {\n const rules = stylesheet.cssRules || stylesheet.rules;\n for (let j = 0; j < rules.length; j += 1) {\n const rule = rules[j];\n\n if (rule instanceof CSSStyleRule) {\n if (rule.selectorText === ':root') {\n for (let k = 0; k < rule.style.length; k += 1) {\n const prop = rule.style[k];\n if (prop.startsWith('--')) {\n console.log(`${ prop }: ${ rule.style.getPropertyValue(prop).trim() }`);\n }\n }\n }\n }\n }\n } catch (e) {\n console.error('Could not access stylesheet:', e);\n }\n }\n }\n };\n\n return (\n <SidePanel {\n ...{\n id: 'devToolbar',\n open: true,\n size: 's',\n position: 'top',\n panelLabel: 'dev toolbar'\n }\n }\n >\n <aside className=\"devToolbar\">\n <div>Environment: { env }</div>\n <ThemeSwitch onThemeChangeAction={ handleThemeChange } />\n <SimpleButton cssClass=\"button primary compact\" label=\"List css variables\" id=\"devCssTool\" onClickHandler={ listThemeCssVariables } />\n </aside>\n </SidePanel>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DevToolbar.js","names":["React","useContext","ThemeSwitch","UserContext","SimpleButton","SidePanel","DevToolbar","context","env","process","NODE_ENV","handleThemeChange","newTheme","applyThemeChange","listThemeCssVariables","stylesheets","document","styleSheets","i","length","stylesheet","ownerNode","id","includes","rules","cssRules","j","rule","CSSStyleRule","selectorText","k","style","prop","startsWith","console","log","getPropertyValue","trim","warn","createElement","open","size","position","panelLabel","className","onThemeChangeAction","cssClass","label","onClickHandler"],"sources":["../../../../../src/components/testing/devToolbar/DevToolbar.tsx"],"sourcesContent":["'use client';\n\nimport React, { useContext } from 'react';\nimport { ThemeSwitch } from '../themeSwitch/ThemeSwitch';\nimport { UserContext } from '../../../contextProviders/userContext/UserContextProvider';\nimport { SimpleButton } from '../../form/buttons/SimpleButton';\nimport { SidePanel } from '../../design/sidePanel/SidePanel';\n\n// @ts-ignore SCSS side-effect imports are handled by the bundler.\nimport './devToolbar.scss';\n\nexport const DevToolbar: React.FC = () => {\n const context = useContext(UserContext);\n\n const env = process.env.NODE_ENV;\n\n const handleThemeChange = (newTheme: string) => {\n if (context && context?.applyThemeChange) {\n context.applyThemeChange(newTheme);\n }\n };\n\n const listThemeCssVariables = () => {\n const stylesheets = document.styleSheets;\n\n // Loop through all stylesheets\n for (let i = 0; i < stylesheets.length; i += 1) {\n const stylesheet = stylesheets[i];\n\n if (stylesheet && stylesheet.ownerNode && 'id' in stylesheet.ownerNode && stylesheet.ownerNode.id.includes('x15-ui-library-theme')) {\n try {\n const rules = stylesheet.cssRules || stylesheet.rules;\n for (let j = 0; j < rules.length; j += 1) {\n const rule = rules[j];\n\n if (rule instanceof CSSStyleRule) {\n if (rule.selectorText === ':root') {\n for (let k = 0; k < rule.style.length; k += 1) {\n const prop = rule.style[k];\n if (prop.startsWith('--')) {\n console.log(`${ prop }: ${ rule.style.getPropertyValue(prop).trim() }`);\n }\n }\n }\n }\n }\n } catch {\n console.warn('Could not access stylesheet.');\n }\n }\n }\n };\n\n return (\n <SidePanel {\n ...{\n id: 'devToolbar',\n open: true,\n size: 's',\n position: 'top',\n panelLabel: 'dev toolbar'\n }\n }\n >\n <aside className=\"devToolbar\">\n <div>Environment: { env }</div>\n <ThemeSwitch onThemeChangeAction={ handleThemeChange } />\n <SimpleButton cssClass=\"button primary compact\" label=\"List css variables\" id=\"devCssTool\" onClickHandler={ listThemeCssVariables } />\n </aside>\n </SidePanel>\n );\n};\n"],"mappings":"AAAA,YAAY;;AAEZ,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,SAASC,WAAW,QAAQ,4BAA4B;AACxD,SAASC,WAAW,QAAQ,2DAA2D;AACvF,SAASC,YAAY,QAAQ,iCAAiC;AAC9D,SAASC,SAAS,QAAQ,kCAAkC;;AAE5D;AACA,OAAO,mBAAmB;AAE1B,OAAO,MAAMC,UAAoB,GAAGA,CAAA,KAAM;EACxC,MAAMC,OAAO,GAAGN,UAAU,CAACE,WAAW,CAAC;EAEvC,MAAMK,GAAG,GAAGC,OAAO,CAACD,GAAG,CAACE,QAAQ;EAEhC,MAAMC,iBAAiB,GAAIC,QAAgB,IAAK;IAC9C,IAAIL,OAAO,IAAIA,OAAO,EAAEM,gBAAgB,EAAE;MACxCN,OAAO,CAACM,gBAAgB,CAACD,QAAQ,CAAC;IACpC;EACF,CAAC;EAED,MAAME,qBAAqB,GAAGA,CAAA,KAAM;IAClC,MAAMC,WAAW,GAAGC,QAAQ,CAACC,WAAW;;IAExC;IACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,WAAW,CAACI,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MAC9C,MAAME,UAAU,GAAGL,WAAW,CAACG,CAAC,CAAC;MAEjC,IAAIE,UAAU,IAAIA,UAAU,CAACC,SAAS,IAAI,IAAI,IAAID,UAAU,CAACC,SAAS,IAAID,UAAU,CAACC,SAAS,CAACC,EAAE,CAACC,QAAQ,CAAC,sBAAsB,CAAC,EAAE;QAClI,IAAI;UACF,MAAMC,KAAK,GAAGJ,UAAU,CAACK,QAAQ,IAAIL,UAAU,CAACI,KAAK;UACrD,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,CAACL,MAAM,EAAEO,CAAC,IAAI,CAAC,EAAE;YACxC,MAAMC,IAAI,GAAGH,KAAK,CAACE,CAAC,CAAC;YAErB,IAAIC,IAAI,YAAYC,YAAY,EAAE;cAChC,IAAID,IAAI,CAACE,YAAY,KAAK,OAAO,EAAE;gBACjC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,IAAI,CAACI,KAAK,CAACZ,MAAM,EAAEW,CAAC,IAAI,CAAC,EAAE;kBAC7C,MAAME,IAAI,GAAGL,IAAI,CAACI,KAAK,CAACD,CAAC,CAAC;kBAC1B,IAAIE,IAAI,CAACC,UAAU,CAAC,IAAI,CAAC,EAAE;oBACzBC,OAAO,CAACC,GAAG,CAAC,GAAIH,IAAI,KAAOL,IAAI,CAACI,KAAK,CAACK,gBAAgB,CAACJ,IAAI,CAAC,CAACK,IAAI,CAAC,CAAC,EAAG,CAAC;kBACzE;gBACF;cACF;YACF;UACF;QACF,CAAC,CAAC,MAAM;UACNH,OAAO,CAACI,IAAI,CAAC,8BAA8B,CAAC;QAC9C;MACF;IACF;EACF,CAAC;EAED,oBACEtC,KAAA,CAAAuC,aAAA,CAAClC,SAAS;IAENiB,EAAE,EAAE,YAAY;IAChBkB,IAAI,EAAE,IAAI;IACVC,IAAI,EAAE,GAAG;IACTC,QAAQ,EAAE,KAAK;IACfC,UAAU,EAAE;EAAa,gBAI3B3C,KAAA,CAAAuC,aAAA;IAAOK,SAAS,EAAC;EAAY,gBAC3B5C,KAAA,CAAAuC,aAAA,cAAK,eAAa,EAAE/B,GAAU,CAAC,eAC/BR,KAAA,CAAAuC,aAAA,CAACrC,WAAW;IAAC2C,mBAAmB,EAAGlC;EAAmB,CAAE,CAAC,eACzDX,KAAA,CAAAuC,aAAA,CAACnC,YAAY;IAAC0C,QAAQ,EAAC,wBAAwB;IAACC,KAAK,EAAC,oBAAoB;IAACzB,EAAE,EAAC,YAAY;IAAC0B,cAAc,EAAGlC;EAAuB,CAAE,CAChI,CACE,CAAC;AAEhB,CAAC","ignoreList":[]}
@@ -1,12 +1,17 @@
1
1
  export const BLACKLISTED_FILE_TYPES = [
2
2
  // Executable files
3
- 'exe', 'msi', 'msp', 'com', 'dll', 'ocx', 'sys', 'hta',
3
+ 'exe', 'msi', 'msp', 'com', 'dll', 'ocx', 'sys', 'hta', 'scr', 'pif', 'cpl', 'msc', 'mst', 'jar', 'gadget', 'application', 'appx', 'appxbundle', 'msix', 'msixbundle',
4
4
  // Batch, script or config files
5
- 'sh', 'cmd', 'bat', 'ps1', 'ps2', 'ini', 'config',
5
+ 'sh', 'cmd', 'bat', 'ps1', 'ps2', 'psm1', 'psd1', 'ps1xml', 'js', 'jse', 'vbs', 'vbe', 'wsf', 'wsh', 'ws', 'reg', 'inf', 'ini', 'config',
6
+ // Help files and disk images, which can carry or mount executables
7
+ 'chm', 'iso', 'img', 'vhd', 'vhdx',
6
8
  // Shortcuts
7
9
  'lnk', 'url', 'scf'];
8
- export const DEFAULT_UPLOAD_FILE_TYPES = ['.json', '.xml', '.csv', 'image/png', 'image/jpeg', 'image/gif', 'image/svg+xml', 'text/plain', 'text/markdown', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/pdf'];
9
- export const DEFAULT_UPLOAD_FILE_EXTENSIONS = ['json', 'xml', 'csv', 'png', 'jpg', 'jpeg', 'gif', 'svg', 'txt', 'md', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'];
10
+
11
+ // SVG is deliberately absent from the defaults: an SVG can carry script, which runs if the app later
12
+ // serves the upload from its own origin. Apps that need SVG uploads can opt in through validFiles.
13
+ export const DEFAULT_UPLOAD_FILE_TYPES = ['.json', '.xml', '.csv', '.eml', 'image/png', 'image/jpeg', 'image/gif', 'text/plain', 'text/markdown', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/pdf'];
14
+ export const DEFAULT_UPLOAD_FILE_EXTENSIONS = ['json', 'xml', 'csv', 'eml', 'png', 'jpg', 'jpeg', 'gif', 'txt', 'md', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'];
10
15
  export default {
11
16
  BLACKLISTED_FILE_TYPES,
12
17
  DEFAULT_UPLOAD_FILE_TYPES,
@@ -1 +1 @@
1
- {"version":3,"file":"fileUploadTypes.js","names":["BLACKLISTED_FILE_TYPES","DEFAULT_UPLOAD_FILE_TYPES","DEFAULT_UPLOAD_FILE_EXTENSIONS"],"sources":["../../../src/constants/fileUploadTypes.ts"],"sourcesContent":["export const BLACKLISTED_FILE_TYPES = [\n // Executable files\n 'exe',\n 'msi',\n 'msp',\n 'com',\n 'dll',\n 'ocx',\n 'sys',\n 'hta',\n // Batch, script or config files\n 'sh',\n 'cmd',\n 'bat',\n 'ps1',\n 'ps2',\n 'ini',\n 'config',\n // Shortcuts\n 'lnk',\n 'url',\n 'scf',\n];\n\nexport const DEFAULT_UPLOAD_FILE_TYPES = [\n '.json',\n '.xml',\n '.csv',\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/svg+xml',\n 'text/plain',\n 'text/markdown',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/pdf'\n];\n\nexport const DEFAULT_UPLOAD_FILE_EXTENSIONS = [\n 'json',\n 'xml',\n 'csv',\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'svg',\n 'txt',\n 'md',\n 'doc',\n 'docx',\n 'xls',\n 'xlsx',\n 'ppt',\n 'pptx',\n 'pdf'\n];\n\nexport default {\n BLACKLISTED_FILE_TYPES,\n DEFAULT_UPLOAD_FILE_TYPES,\n DEFAULT_UPLOAD_FILE_EXTENSIONS\n};\n"],"mappings":"AAAA,OAAO,MAAMA,sBAAsB,GAAG;AACpC;AACA,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK;AACL;AACA,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ;AACR;AACA,KAAK,EACL,KAAK,EACL,KAAK,CACN;AAED,OAAO,MAAMC,yBAAyB,GAAG,CACvC,OAAO,EACP,MAAM,EACN,MAAM,EACN,WAAW,EACX,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,yEAAyE,EACzE,0BAA0B,EAC1B,mEAAmE,EACnE,+BAA+B,EAC/B,2EAA2E,EAC3E,iBAAiB,CAClB;AAED,OAAO,MAAMC,8BAA8B,GAAG,CAC5C,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,KAAK,CACN;AAED,eAAe;EACbF,sBAAsB;EACtBC,yBAAyB;EACzBC;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"fileUploadTypes.js","names":["BLACKLISTED_FILE_TYPES","DEFAULT_UPLOAD_FILE_TYPES","DEFAULT_UPLOAD_FILE_EXTENSIONS"],"sources":["../../../src/constants/fileUploadTypes.ts"],"sourcesContent":["export const BLACKLISTED_FILE_TYPES = [\n // Executable files\n 'exe',\n 'msi',\n 'msp',\n 'com',\n 'dll',\n 'ocx',\n 'sys',\n 'hta',\n 'scr',\n 'pif',\n 'cpl',\n 'msc',\n 'mst',\n 'jar',\n 'gadget',\n 'application',\n 'appx',\n 'appxbundle',\n 'msix',\n 'msixbundle',\n // Batch, script or config files\n 'sh',\n 'cmd',\n 'bat',\n 'ps1',\n 'ps2',\n 'psm1',\n 'psd1',\n 'ps1xml',\n 'js',\n 'jse',\n 'vbs',\n 'vbe',\n 'wsf',\n 'wsh',\n 'ws',\n 'reg',\n 'inf',\n 'ini',\n 'config',\n // Help files and disk images, which can carry or mount executables\n 'chm',\n 'iso',\n 'img',\n 'vhd',\n 'vhdx',\n // Shortcuts\n 'lnk',\n 'url',\n 'scf',\n];\n\n// SVG is deliberately absent from the defaults: an SVG can carry script, which runs if the app later\n// serves the upload from its own origin. Apps that need SVG uploads can opt in through validFiles.\nexport const DEFAULT_UPLOAD_FILE_TYPES = [\n '.json',\n '.xml',\n '.csv',\n '.eml',\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'text/plain',\n 'text/markdown',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/pdf'\n];\n\nexport const DEFAULT_UPLOAD_FILE_EXTENSIONS = [\n 'json',\n 'xml',\n 'csv',\n 'eml',\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'txt',\n 'md',\n 'doc',\n 'docx',\n 'xls',\n 'xlsx',\n 'ppt',\n 'pptx',\n 'pdf'\n];\n\nexport default {\n BLACKLISTED_FILE_TYPES,\n DEFAULT_UPLOAD_FILE_TYPES,\n DEFAULT_UPLOAD_FILE_EXTENSIONS\n};\n"],"mappings":"AAAA,OAAO,MAAMA,sBAAsB,GAAG;AACpC;AACA,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,aAAa,EACb,MAAM,EACN,YAAY,EACZ,MAAM,EACN,YAAY;AACZ;AACA,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ;AACR;AACA,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM;AACN;AACA,KAAK,EACL,KAAK,EACL,KAAK,CACN;;AAED;AACA;AACA,OAAO,MAAMC,yBAAyB,GAAG,CACvC,OAAO,EACP,MAAM,EACN,MAAM,EACN,MAAM,EACN,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,yEAAyE,EACzE,0BAA0B,EAC1B,mEAAmE,EACnE,+BAA+B,EAC/B,2EAA2E,EAC3E,iBAAiB,CAClB;AAED,OAAO,MAAMC,8BAA8B,GAAG,CAC5C,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,KAAK,CACN;AAED,eAAe;EACbF,sBAAsB;EACtBC,yBAAyB;EACzBC;AACF,CAAC","ignoreList":[]}
@@ -1,9 +1,17 @@
1
+ const parseDate = value => {
2
+ const parsedDate = new Date(value instanceof Date ? value.getTime() : value);
3
+ return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;
4
+ };
5
+ const logInvalidDate = () => {
6
+ console.error('Invalid date format');
7
+ return null;
8
+ };
9
+
1
10
  // Returns format 2022-09-06 for the 6th of September 2022
2
11
  export const dateToShortIsoString = date => {
3
- const newDate = new Date(date);
4
- if (Number.isNaN(newDate.getDate())) {
5
- console.error('Invalid date format');
6
- return null;
12
+ const newDate = parseDate(date);
13
+ if (!newDate) {
14
+ return logInvalidDate();
7
15
  }
8
16
  newDate.setTime(newDate.getTime() - newDate.getTimezoneOffset() * 60000);
9
17
  return newDate.toISOString().substring(0, 10);
@@ -14,18 +22,22 @@ export const isValidDate = (dateString, minDate) => {
14
22
  if (!dateString) {
15
23
  return false;
16
24
  }
17
- const newDate = new Date(dateString);
18
- const isValidMinDate = !minDate || newDate.getTime() >= new Date(minDate).getTime();
19
- const isValidDate = newDate.toString() !== 'Invalid Date' && !Number.isNaN(newDate.getDate()) && isValidMinDate;
20
- return isValidDate;
25
+ const newDate = parseDate(dateString);
26
+ if (!newDate) {
27
+ return false;
28
+ }
29
+ if (!minDate) {
30
+ return true;
31
+ }
32
+ const minimumDate = parseDate(minDate);
33
+ return minimumDate !== null && newDate.getTime() >= minimumDate.getTime();
21
34
  };
22
35
 
23
36
  // Returns format 06 Sep 2022
24
37
  export const dateToShortReadableDate = (date, locale = 'en-AU') => {
25
- const newDate = new Date(date);
26
- if (Number.isNaN(newDate.getDate())) {
27
- console.error('Invalid date format');
28
- return null;
38
+ const newDate = parseDate(date);
39
+ if (!newDate) {
40
+ return logInvalidDate();
29
41
  }
30
42
  return newDate.toLocaleDateString(locale, {
31
43
  day: '2-digit',
@@ -36,26 +48,25 @@ export const dateToShortReadableDate = (date, locale = 'en-AU') => {
36
48
 
37
49
  // Returns format Sep
38
50
  export const dateToShortReadableMonth = date => {
39
- const newDate = new Date(date);
40
- newDate.setDate(5); // Set to 5 to avoid timezone issues. If set to 1, for some timezones when it is converted to UTC it jumps to the day before which is the previous month
41
- if (Number.isNaN(newDate.getDate())) {
42
- console.error('Invalid date format');
43
- return null;
51
+ const newDate = parseDate(date);
52
+ if (!newDate) {
53
+ return logInvalidDate();
44
54
  }
55
+ newDate.setDate(5); // Set to 5 to avoid timezone issues. If set to 1, for some timezones when it is converted to UTC it jumps to the day before which is the previous month
56
+
45
57
  return newDate.toUTCString().substring(8, 11);
46
58
  };
47
59
  export const timeStampToShortReadableDate = (timestamp, locale = 'en-AU') => {
48
- const newDate = new Date(timestamp);
49
- if (!Number.isNaN(newDate.getDate())) {
60
+ const newDate = parseDate(timestamp);
61
+ if (newDate) {
50
62
  return dateToShortReadableDate(newDate, locale);
51
63
  }
52
64
  return timestamp;
53
65
  };
54
66
  export const dateToReadableTime = (date, locale = 'en-AU') => {
55
- const newDate = new Date(date);
56
- if (Number.isNaN(newDate.getDate())) {
57
- console.error('Invalid date format');
58
- return null;
67
+ const newDate = parseDate(date);
68
+ if (!newDate) {
69
+ return logInvalidDate();
59
70
  }
60
71
  const readableTime = newDate.toLocaleTimeString(locale, {
61
72
  hour: '2-digit',
@@ -1 +1 @@
1
- {"version":3,"file":"dateHelpers.js","names":["dateToShortIsoString","date","newDate","Date","Number","isNaN","getDate","console","error","setTime","getTime","getTimezoneOffset","toISOString","substring","isValidDate","dateString","minDate","isValidMinDate","toString","dateToShortReadableDate","locale","toLocaleDateString","day","month","year","dateToShortReadableMonth","setDate","toUTCString","timeStampToShortReadableDate","timestamp","dateToReadableTime","readableTime","toLocaleTimeString","hour","minute","hour12","replace","dateToShortReadableDateTime","readableDate","getLastDateOfMonth","getFullYear","getMonth","daysSince","currentDate","diffInMs","Math","abs","diffInDays"],"sources":["../../../src/helpers/dateHelpers.ts"],"sourcesContent":[" \n\n// Returns format 2022-09-06 for the 6th of September 2022\nexport const dateToShortIsoString = (date: Date | string): string | null => {\n const newDate = new Date(date);\n if (Number.isNaN(newDate.getDate())) {\n console.error('Invalid date format');\n return null;\n }\n\n newDate.setTime(newDate.getTime() - newDate.getTimezoneOffset() * 60000);\n return newDate.toISOString().substring(0, 10);\n};\n\n// https://stackoverflow.com/questions/7445328/check-if-a-string-is-a-date-value\nexport const isValidDate = (dateString: string | number | null | undefined, minDate?: string): boolean => {\n if (!dateString) {\n return false;\n }\n\n const newDate = new Date(dateString);\n const isValidMinDate = !minDate || newDate.getTime() >= new Date(minDate).getTime();\n\n const isValidDate = newDate.toString() !== 'Invalid Date'\n && !Number.isNaN(newDate.getDate())\n && isValidMinDate;\n\n return isValidDate;\n};\n\n// Returns format 06 Sep 2022\nexport const dateToShortReadableDate = (date: Date | string | number, locale: string = 'en-AU'): string | null => {\n const newDate = new Date(date);\n if (Number.isNaN(newDate.getDate())) {\n console.error('Invalid date format');\n return null;\n }\n\n return newDate.toLocaleDateString(locale, {\n day: '2-digit',\n month: 'short',\n year: 'numeric'\n });\n};\n\n// Returns format Sep\nexport const dateToShortReadableMonth = (date: Date | string | number): string | null => {\n const newDate = new Date(date);\n newDate.setDate(5); // Set to 5 to avoid timezone issues. If set to 1, for some timezones when it is converted to UTC it jumps to the day before which is the previous month\n if (Number.isNaN(newDate.getDate())) {\n console.error('Invalid date format');\n return null;\n }\n\n return newDate.toUTCString().substring(8, 11);\n};\n\nexport const timeStampToShortReadableDate = (timestamp: string | number, locale: string = 'en-AU'): string | number | null | undefined => {\n const newDate = new Date(timestamp);\n if (!Number.isNaN(newDate.getDate())) {\n return dateToShortReadableDate(newDate, locale);\n }\n return timestamp;\n};\n\nexport const dateToReadableTime = (date: Date | string | number, locale: string = 'en-AU'): string | null => {\n const newDate = new Date(date);\n if (Number.isNaN(newDate.getDate())) {\n console.error('Invalid date format');\n return null;\n }\n\n const readableTime = newDate.toLocaleTimeString(locale, {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n }).replace(/^0|\\s+/g, '');\n\n return readableTime;\n};\n\nexport const dateToShortReadableDateTime = (date: Date | string | number, locale: string = 'en-AU'): string | null => {\n const readableDate = dateToShortReadableDate(date, locale);\n const readableTime = dateToReadableTime(date, locale);\n return `${ readableDate } ${ readableTime }`;\n};\n\nexport const getLastDateOfMonth = (date: Date) => new Date(date.getFullYear(), date.getMonth() + 1, 0);\n\nexport const daysSince = (date: Date) => {\n const currentDate: Date = new Date();\n const diffInMs = Math.abs(currentDate.getTime() - date.getTime());\n\n const diffInDays = diffInMs / (1000 * 60 * 60 * 24);\n\n return diffInDays;\n};\n\nexport default {\n dateToShortIsoString,\n isValidDate,\n dateToShortReadableDate,\n dateToShortReadableMonth,\n timeStampToShortReadableDate,\n dateToReadableTime,\n dateToShortReadableDateTime,\n getLastDateOfMonth,\n daysSince\n};"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"dateHelpers.js","names":["parseDate","value","parsedDate","Date","getTime","Number","isNaN","logInvalidDate","console","error","dateToShortIsoString","date","newDate","setTime","getTimezoneOffset","toISOString","substring","isValidDate","dateString","minDate","minimumDate","dateToShortReadableDate","locale","toLocaleDateString","day","month","year","dateToShortReadableMonth","setDate","toUTCString","timeStampToShortReadableDate","timestamp","dateToReadableTime","readableTime","toLocaleTimeString","hour","minute","hour12","replace","dateToShortReadableDateTime","readableDate","getLastDateOfMonth","getFullYear","getMonth","daysSince","currentDate","diffInMs","Math","abs","diffInDays"],"sources":["../../../src/helpers/dateHelpers.ts"],"sourcesContent":[" \n\nconst parseDate = (value: Date | string | number): Date | null => {\n const parsedDate = new Date(value instanceof Date ? value.getTime() : value);\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n};\n\nconst logInvalidDate = (): null => {\n console.error('Invalid date format');\n return null;\n};\n\n// Returns format 2022-09-06 for the 6th of September 2022\nexport const dateToShortIsoString = (date: Date | string): string | null => {\n const newDate = parseDate(date);\n if (!newDate) {\n return logInvalidDate();\n }\n\n newDate.setTime(newDate.getTime() - newDate.getTimezoneOffset() * 60000);\n return newDate.toISOString().substring(0, 10);\n};\n\n// https://stackoverflow.com/questions/7445328/check-if-a-string-is-a-date-value\nexport const isValidDate = (dateString: string | number | null | undefined, minDate?: string): boolean => {\n if (!dateString) {\n return false;\n }\n\n const newDate = parseDate(dateString);\n if (!newDate) {\n return false;\n }\n if (!minDate) {\n return true;\n }\n\n const minimumDate = parseDate(minDate);\n return minimumDate !== null && newDate.getTime() >= minimumDate.getTime();\n};\n\n// Returns format 06 Sep 2022\nexport const dateToShortReadableDate = (date: Date | string | number, locale: string = 'en-AU'): string | null => {\n const newDate = parseDate(date);\n if (!newDate) {\n return logInvalidDate();\n }\n\n return newDate.toLocaleDateString(locale, {\n day: '2-digit',\n month: 'short',\n year: 'numeric'\n });\n};\n\n// Returns format Sep\nexport const dateToShortReadableMonth = (date: Date | string | number): string | null => {\n const newDate = parseDate(date);\n if (!newDate) {\n return logInvalidDate();\n }\n newDate.setDate(5); // Set to 5 to avoid timezone issues. If set to 1, for some timezones when it is converted to UTC it jumps to the day before which is the previous month\n\n return newDate.toUTCString().substring(8, 11);\n};\n\nexport const timeStampToShortReadableDate = (timestamp: string | number, locale: string = 'en-AU'): string | number | null | undefined => {\n const newDate = parseDate(timestamp);\n if (newDate) {\n return dateToShortReadableDate(newDate, locale);\n }\n return timestamp;\n};\n\nexport const dateToReadableTime = (date: Date | string | number, locale: string = 'en-AU'): string | null => {\n const newDate = parseDate(date);\n if (!newDate) {\n return logInvalidDate();\n }\n\n const readableTime = newDate.toLocaleTimeString(locale, {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n }).replace(/^0|\\s+/g, '');\n\n return readableTime;\n};\n\nexport const dateToShortReadableDateTime = (date: Date | string | number, locale: string = 'en-AU'): string | null => {\n const readableDate = dateToShortReadableDate(date, locale);\n const readableTime = dateToReadableTime(date, locale);\n return `${ readableDate } ${ readableTime }`;\n};\n\nexport const getLastDateOfMonth = (date: Date) => new Date(date.getFullYear(), date.getMonth() + 1, 0);\n\nexport const daysSince = (date: Date) => {\n const currentDate: Date = new Date();\n const diffInMs = Math.abs(currentDate.getTime() - date.getTime());\n\n const diffInDays = diffInMs / (1000 * 60 * 60 * 24);\n\n return diffInDays;\n};\n\nexport default {\n dateToShortIsoString,\n isValidDate,\n dateToShortReadableDate,\n dateToShortReadableMonth,\n timeStampToShortReadableDate,\n dateToReadableTime,\n dateToShortReadableDateTime,\n getLastDateOfMonth,\n daysSince\n};"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,48 @@
1
+ /*
2
+ Returns the lower-case extension of a file name or path. `?` and `#` are ordinary characters in
3
+ file names, so `payload#.exe` is an `exe`. Trailing dots and spaces are ignored, as Windows drops
4
+ them when saving, so `payload.exe.` is an `exe` too. Names without an extension (including
5
+ dot-files such as `.env`) return an empty string. For URLs use getUrlExtension.
6
+ */
7
+ export const getFileExtension = fileName => {
8
+ const name = (fileName.split(/[/\\]/).pop() ?? '').replace(/[.\s]+$/, '');
9
+ const dotIndex = name.lastIndexOf('.');
10
+ return dotIndex > 0 ? name.slice(dotIndex + 1).toLowerCase() : '';
11
+ };
12
+
13
+ // Any fixed origin works: it only lets relative URLs parse, and only the pathname is inspected.
14
+ const URL_PARSE_BASE = 'http://localhost/';
15
+
16
+ /*
17
+ Returns the lower-case extension of a URL's path, ignoring the host, query string and fragment, so
18
+ `https://files.example.md` has no extension. Relative URLs are supported.
19
+ */
20
+ export const getUrlExtension = url => {
21
+ let pathname;
22
+ try {
23
+ pathname = new URL(url, URL_PARSE_BASE).pathname;
24
+ } catch {
25
+ pathname = url.split(/[?#]/)[0];
26
+ }
27
+ try {
28
+ pathname = decodeURIComponent(pathname);
29
+ } catch {
30
+ // Malformed percent-encoding is left as-is.
31
+ }
32
+ return getFileExtension(pathname);
33
+ };
34
+
35
+ // FileReader rather than Blob.text()/arrayBuffer(), which older browsers and jsdom lack.
36
+ const readFile = (file, asText) => new Promise((resolve, reject) => {
37
+ const reader = new FileReader();
38
+ reader.onload = () => resolve(reader.result);
39
+ reader.onerror = () => reject(reader.error ?? new Error('The file could not be read.'));
40
+ if (asText) {
41
+ reader.readAsText(file);
42
+ } else {
43
+ reader.readAsArrayBuffer(file);
44
+ }
45
+ });
46
+ export const readFileAsText = file => readFile(file, true);
47
+ export const readFileAsArrayBuffer = file => readFile(file, false);
48
+ //# sourceMappingURL=fileHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileHelpers.js","names":["getFileExtension","fileName","name","split","pop","replace","dotIndex","lastIndexOf","slice","toLowerCase","URL_PARSE_BASE","getUrlExtension","url","pathname","URL","decodeURIComponent","readFile","file","asText","Promise","resolve","reject","reader","FileReader","onload","result","onerror","error","Error","readAsText","readAsArrayBuffer","readFileAsText","readFileAsArrayBuffer"],"sources":["../../../src/helpers/fileHelpers.ts"],"sourcesContent":["/*\n Returns the lower-case extension of a file name or path. `?` and `#` are ordinary characters in\n file names, so `payload#.exe` is an `exe`. Trailing dots and spaces are ignored, as Windows drops\n them when saving, so `payload.exe.` is an `exe` too. Names without an extension (including\n dot-files such as `.env`) return an empty string. For URLs use getUrlExtension.\n */\nexport const getFileExtension = (fileName: string): string => {\n const name = (fileName.split(/[/\\\\]/).pop() ?? '').replace(/[.\\s]+$/, '');\n const dotIndex = name.lastIndexOf('.');\n return dotIndex > 0 ? name.slice(dotIndex + 1).toLowerCase() : '';\n};\n\n// Any fixed origin works: it only lets relative URLs parse, and only the pathname is inspected.\nconst URL_PARSE_BASE = 'http://localhost/';\n\n/*\n Returns the lower-case extension of a URL's path, ignoring the host, query string and fragment, so\n `https://files.example.md` has no extension. Relative URLs are supported.\n */\nexport const getUrlExtension = (url: string): string => {\n let pathname: string;\n try {\n pathname = new URL(url, URL_PARSE_BASE).pathname;\n } catch {\n pathname = url.split(/[?#]/)[0];\n }\n try {\n pathname = decodeURIComponent(pathname);\n } catch {\n // Malformed percent-encoding is left as-is.\n }\n return getFileExtension(pathname);\n};\n\n// FileReader rather than Blob.text()/arrayBuffer(), which older browsers and jsdom lack.\nconst readFile = <T extends string | ArrayBuffer>(file: Blob, asText: boolean): Promise<T> => new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as T);\n reader.onerror = () => reject(reader.error ?? new Error('The file could not be read.'));\n if (asText) {\n reader.readAsText(file);\n } else {\n reader.readAsArrayBuffer(file);\n }\n});\n\nexport const readFileAsText = (file: Blob): Promise<string> => readFile<string>(file, true);\n\nexport const readFileAsArrayBuffer = (file: Blob): Promise<ArrayBuffer> => readFile<ArrayBuffer>(file, false);\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,gBAAgB,GAAIC,QAAgB,IAAa;EAC5D,MAAMC,IAAI,GAAG,CAACD,QAAQ,CAACE,KAAK,CAAC,OAAO,CAAC,CAACC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAEC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;EACzE,MAAMC,QAAQ,GAAGJ,IAAI,CAACK,WAAW,CAAC,GAAG,CAAC;EACtC,OAAOD,QAAQ,GAAG,CAAC,GAAGJ,IAAI,CAACM,KAAK,CAACF,QAAQ,GAAG,CAAC,CAAC,CAACG,WAAW,CAAC,CAAC,GAAG,EAAE;AACnE,CAAC;;AAED;AACA,MAAMC,cAAc,GAAG,mBAAmB;;AAE1C;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAIC,GAAW,IAAa;EACtD,IAAIC,QAAgB;EACpB,IAAI;IACFA,QAAQ,GAAG,IAAIC,GAAG,CAACF,GAAG,EAAEF,cAAc,CAAC,CAACG,QAAQ;EAClD,CAAC,CAAC,MAAM;IACNA,QAAQ,GAAGD,GAAG,CAACT,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;EACjC;EACA,IAAI;IACFU,QAAQ,GAAGE,kBAAkB,CAACF,QAAQ,CAAC;EACzC,CAAC,CAAC,MAAM;IACN;EAAA;EAEF,OAAOb,gBAAgB,CAACa,QAAQ,CAAC;AACnC,CAAC;;AAED;AACA,MAAMG,QAAQ,GAAGA,CAAiCC,IAAU,EAAEC,MAAe,KAAiB,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;EAC7H,MAAMC,MAAM,GAAG,IAAIC,UAAU,CAAC,CAAC;EAC/BD,MAAM,CAACE,MAAM,GAAG,MAAMJ,OAAO,CAACE,MAAM,CAACG,MAAW,CAAC;EACjDH,MAAM,CAACI,OAAO,GAAG,MAAML,MAAM,CAACC,MAAM,CAACK,KAAK,IAAI,IAAIC,KAAK,CAAC,6BAA6B,CAAC,CAAC;EACvF,IAAIV,MAAM,EAAE;IACVI,MAAM,CAACO,UAAU,CAACZ,IAAI,CAAC;EACzB,CAAC,MAAM;IACLK,MAAM,CAACQ,iBAAiB,CAACb,IAAI,CAAC;EAChC;AACF,CAAC,CAAC;AAEF,OAAO,MAAMc,cAAc,GAAId,IAAU,IAAsBD,QAAQ,CAASC,IAAI,EAAE,IAAI,CAAC;AAE3F,OAAO,MAAMe,qBAAqB,GAAIf,IAAU,IAA2BD,QAAQ,CAAcC,IAAI,EAAE,KAAK,CAAC","ignoreList":[]}
@@ -3,6 +3,8 @@ export { binaryFindInArray, addAndSortArray, moveItemInArrayMutate, moveItemInAr
3
3
  export { transformPlacesData, extractNamePieces } from './dataHelpers';
4
4
  export { dateToShortIsoString, isValidDate, dateToShortReadableDate, dateToShortReadableMonth, timeStampToShortReadableDate, dateToReadableTime, dateToShortReadableDateTime, getLastDateOfMonth, daysSince } from './dateHelpers';
5
5
  export { USER_CURRENCY, intlCurrencyFormatter, intlNumberFormatter, formatNumberForLocale, formatAsCurrencyForLocale, getNumberAbbreviation, formatRoundedNumberWithAbbreviation, formatNumberWithAbbreviation, formatNumberForChartAxis, formatAsSimpleCurrencyForChartAxis, formatAsInternationalCurrencyForChartAxis, formatAsCurrencyWithAbbreviation, formatFileSize } from './formatters';
6
+ export { getFileExtension, getUrlExtension, readFileAsText, readFileAsArrayBuffer } from './fileHelpers';
7
+ export { prefersReducedMotion, getPreferredScrollBehavior, getScrollSettings } from './interactionsHelper';
6
8
  export { getRandomNumberBelow, getRandomBetweenInclusive, getRandomBetweenExclusive, hashCode, roundToDecimal, formatNumberToMinDigits, formatDigitalTime } from './numberHelpers';
7
9
  export { richTextParser, capitalize, capitalizeFirstLetter, lowerCaseFirstLetter, getCharacterCount, clampToGraphemeMax, useAnInsteadOfA, splitCamelCase, pluralize, pluralizeIfNeeded, getInitialsOrAcronym } from './stringHelpers';
8
10
  export { objectsAreTheSame, isAnObject, createCompareValueOverride, isReactElement, isNonElementObject, isPlainObject, deepMergeObjects, overrideMergeObjects, makeInheritanceObject, updateNestedProperty, filterObject, getArrayOfObjectKeys, getArrayOfReadableObjectKeys, getBranchFromPath, deepRemoveProps } from './objectHelpers';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getMinAge","getMaxAge","getMinAndMaxAges","validateBirthdate","isDateEntryComplete","getAgeInWeeks","getAgeInYears","binaryFindInArray","addAndSortArray","moveItemInArrayMutate","moveItemInArrayCopy","getRandomItemFromArray","getItemIndexWithinArray","getRoundedMedian","getMostOccurringBoolean","cssClassesArrayToString","transformPlacesData","extractNamePieces","dateToShortIsoString","isValidDate","dateToShortReadableDate","dateToShortReadableMonth","timeStampToShortReadableDate","dateToReadableTime","dateToShortReadableDateTime","getLastDateOfMonth","daysSince","USER_CURRENCY","intlCurrencyFormatter","intlNumberFormatter","formatNumberForLocale","formatAsCurrencyForLocale","getNumberAbbreviation","formatRoundedNumberWithAbbreviation","formatNumberWithAbbreviation","formatNumberForChartAxis","formatAsSimpleCurrencyForChartAxis","formatAsInternationalCurrencyForChartAxis","formatAsCurrencyWithAbbreviation","formatFileSize","getRandomNumberBelow","getRandomBetweenInclusive","getRandomBetweenExclusive","hashCode","roundToDecimal","formatNumberToMinDigits","formatDigitalTime","richTextParser","capitalize","capitalizeFirstLetter","lowerCaseFirstLetter","getCharacterCount","clampToGraphemeMax","useAnInsteadOfA","splitCamelCase","pluralize","pluralizeIfNeeded","getInitialsOrAcronym","objectsAreTheSame","isAnObject","createCompareValueOverride","isReactElement","isNonElementObject","isPlainObject","deepMergeObjects","overrideMergeObjects","makeInheritanceObject","updateNestedProperty","filterObject","getArrayOfObjectKeys","getArrayOfReadableObjectKeys","getBranchFromPath","deepRemoveProps","renderIcon","isSvgIconDefinition","isIconProps","isEmptyIconSource"],"sources":["../../../src/helpers/index.ts"],"sourcesContent":["export {\n getMinAge,\n getMaxAge,\n getMinAndMaxAges,\n validateBirthdate,\n isDateEntryComplete,\n getAgeInWeeks,\n getAgeInYears\n} from './ageHelpers';\n\nexport {\n binaryFindInArray,\n addAndSortArray,\n moveItemInArrayMutate,\n moveItemInArrayCopy,\n getRandomItemFromArray,\n getItemIndexWithinArray,\n getRoundedMedian,\n getMostOccurringBoolean,\n cssClassesArrayToString\n} from './arrayHelpers';\n\nexport {\n transformPlacesData,\n extractNamePieces\n} from './dataHelpers';\nexport type { NamePieces } from './dataHelpers';\n\nexport {\n dateToShortIsoString,\n isValidDate,\n dateToShortReadableDate,\n dateToShortReadableMonth,\n timeStampToShortReadableDate,\n dateToReadableTime,\n dateToShortReadableDateTime,\n getLastDateOfMonth,\n daysSince\n} from './dateHelpers';\n\nexport {\n USER_CURRENCY,\n intlCurrencyFormatter,\n intlNumberFormatter,\n formatNumberForLocale,\n formatAsCurrencyForLocale,\n getNumberAbbreviation,\n formatRoundedNumberWithAbbreviation,\n formatNumberWithAbbreviation,\n formatNumberForChartAxis,\n formatAsSimpleCurrencyForChartAxis,\n formatAsInternationalCurrencyForChartAxis,\n formatAsCurrencyWithAbbreviation,\n formatFileSize\n} from './formatters';\n\nexport {\n getRandomNumberBelow,\n getRandomBetweenInclusive,\n getRandomBetweenExclusive,\n hashCode,\n roundToDecimal,\n formatNumberToMinDigits,\n formatDigitalTime\n} from './numberHelpers';\n\nexport {\n richTextParser,\n capitalize,\n capitalizeFirstLetter,\n lowerCaseFirstLetter,\n getCharacterCount,\n clampToGraphemeMax,\n useAnInsteadOfA,\n splitCamelCase,\n pluralize,\n pluralizeIfNeeded,\n getInitialsOrAcronym\n} from './stringHelpers';\n\nexport {\n objectsAreTheSame,\n isAnObject,\n createCompareValueOverride,\n isReactElement,\n isNonElementObject,\n isPlainObject,\n deepMergeObjects,\n overrideMergeObjects,\n makeInheritanceObject,\n updateNestedProperty,\n filterObject,\n getArrayOfObjectKeys,\n getArrayOfReadableObjectKeys,\n getBranchFromPath,\n deepRemoveProps\n} from './objectHelpers';\nexport type {\n DeepMergeObjectsArgs,\n MakeInheritanceObjectArgs,\n UpdateNestedPropertyArgs\n} from './objectHelpers';\n\nexport {\n renderIcon,\n isSvgIconDefinition,\n isIconProps,\n isEmptyIconSource\n} from './iconHelpers';\nexport type {\n IconSource,\n RenderIconOptions,\n SvgIconDefinition,\n SvgIconSize\n} from './iconHelpers';\n"],"mappings":"AAAA,SACEA,SAAS,EACTC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,mBAAmB,EACnBC,aAAa,EACbC,aAAa,QACR,cAAc;AAErB,SACEC,iBAAiB,EACjBC,eAAe,EACfC,qBAAqB,EACrBC,mBAAmB,EACnBC,sBAAsB,EACtBC,uBAAuB,EACvBC,gBAAgB,EAChBC,uBAAuB,EACvBC,uBAAuB,QAClB,gBAAgB;AAEvB,SACEC,mBAAmB,EACnBC,iBAAiB,QACZ,eAAe;AAGtB,SACEC,oBAAoB,EACpBC,WAAW,EACXC,uBAAuB,EACvBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,kBAAkB,EAClBC,2BAA2B,EAC3BC,kBAAkB,EAClBC,SAAS,QACJ,eAAe;AAEtB,SACEC,aAAa,EACbC,qBAAqB,EACrBC,mBAAmB,EACnBC,qBAAqB,EACrBC,yBAAyB,EACzBC,qBAAqB,EACrBC,mCAAmC,EACnCC,4BAA4B,EAC5BC,wBAAwB,EACxBC,kCAAkC,EAClCC,yCAAyC,EACzCC,gCAAgC,EAChCC,cAAc,QACT,cAAc;AAErB,SACEC,oBAAoB,EACpBC,yBAAyB,EACzBC,yBAAyB,EACzBC,QAAQ,EACRC,cAAc,EACdC,uBAAuB,EACvBC,iBAAiB,QACZ,iBAAiB;AAExB,SACEC,cAAc,EACdC,UAAU,EACVC,qBAAqB,EACrBC,oBAAoB,EACpBC,iBAAiB,EACjBC,kBAAkB,EAClBC,eAAe,EACfC,cAAc,EACdC,SAAS,EACTC,iBAAiB,EACjBC,oBAAoB,QACf,iBAAiB;AAExB,SACEC,iBAAiB,EACjBC,UAAU,EACVC,0BAA0B,EAC1BC,cAAc,EACdC,kBAAkB,EAClBC,aAAa,EACbC,gBAAgB,EAChBC,oBAAoB,EACpBC,qBAAqB,EACrBC,oBAAoB,EACpBC,YAAY,EACZC,oBAAoB,EACpBC,4BAA4B,EAC5BC,iBAAiB,EACjBC,eAAe,QACV,iBAAiB;AAOxB,SACEC,UAAU,EACVC,mBAAmB,EACnBC,WAAW,EACXC,iBAAiB,QACZ,eAAe","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["getMinAge","getMaxAge","getMinAndMaxAges","validateBirthdate","isDateEntryComplete","getAgeInWeeks","getAgeInYears","binaryFindInArray","addAndSortArray","moveItemInArrayMutate","moveItemInArrayCopy","getRandomItemFromArray","getItemIndexWithinArray","getRoundedMedian","getMostOccurringBoolean","cssClassesArrayToString","transformPlacesData","extractNamePieces","dateToShortIsoString","isValidDate","dateToShortReadableDate","dateToShortReadableMonth","timeStampToShortReadableDate","dateToReadableTime","dateToShortReadableDateTime","getLastDateOfMonth","daysSince","USER_CURRENCY","intlCurrencyFormatter","intlNumberFormatter","formatNumberForLocale","formatAsCurrencyForLocale","getNumberAbbreviation","formatRoundedNumberWithAbbreviation","formatNumberWithAbbreviation","formatNumberForChartAxis","formatAsSimpleCurrencyForChartAxis","formatAsInternationalCurrencyForChartAxis","formatAsCurrencyWithAbbreviation","formatFileSize","getFileExtension","getUrlExtension","readFileAsText","readFileAsArrayBuffer","prefersReducedMotion","getPreferredScrollBehavior","getScrollSettings","getRandomNumberBelow","getRandomBetweenInclusive","getRandomBetweenExclusive","hashCode","roundToDecimal","formatNumberToMinDigits","formatDigitalTime","richTextParser","capitalize","capitalizeFirstLetter","lowerCaseFirstLetter","getCharacterCount","clampToGraphemeMax","useAnInsteadOfA","splitCamelCase","pluralize","pluralizeIfNeeded","getInitialsOrAcronym","objectsAreTheSame","isAnObject","createCompareValueOverride","isReactElement","isNonElementObject","isPlainObject","deepMergeObjects","overrideMergeObjects","makeInheritanceObject","updateNestedProperty","filterObject","getArrayOfObjectKeys","getArrayOfReadableObjectKeys","getBranchFromPath","deepRemoveProps","renderIcon","isSvgIconDefinition","isIconProps","isEmptyIconSource"],"sources":["../../../src/helpers/index.ts"],"sourcesContent":["export {\n getMinAge,\n getMaxAge,\n getMinAndMaxAges,\n validateBirthdate,\n isDateEntryComplete,\n getAgeInWeeks,\n getAgeInYears\n} from './ageHelpers';\n\nexport {\n binaryFindInArray,\n addAndSortArray,\n moveItemInArrayMutate,\n moveItemInArrayCopy,\n getRandomItemFromArray,\n getItemIndexWithinArray,\n getRoundedMedian,\n getMostOccurringBoolean,\n cssClassesArrayToString\n} from './arrayHelpers';\n\nexport {\n transformPlacesData,\n extractNamePieces\n} from './dataHelpers';\nexport type { NamePieces } from './dataHelpers';\n\nexport {\n dateToShortIsoString,\n isValidDate,\n dateToShortReadableDate,\n dateToShortReadableMonth,\n timeStampToShortReadableDate,\n dateToReadableTime,\n dateToShortReadableDateTime,\n getLastDateOfMonth,\n daysSince\n} from './dateHelpers';\n\nexport {\n USER_CURRENCY,\n intlCurrencyFormatter,\n intlNumberFormatter,\n formatNumberForLocale,\n formatAsCurrencyForLocale,\n getNumberAbbreviation,\n formatRoundedNumberWithAbbreviation,\n formatNumberWithAbbreviation,\n formatNumberForChartAxis,\n formatAsSimpleCurrencyForChartAxis,\n formatAsInternationalCurrencyForChartAxis,\n formatAsCurrencyWithAbbreviation,\n formatFileSize\n} from './formatters';\n\nexport {\n getFileExtension,\n getUrlExtension,\n readFileAsText,\n readFileAsArrayBuffer\n} from './fileHelpers';\n\nexport {\n prefersReducedMotion,\n getPreferredScrollBehavior,\n getScrollSettings\n} from './interactionsHelper';\nexport type { ScrollSettings } from './interactionsHelper';\n\nexport {\n getRandomNumberBelow,\n getRandomBetweenInclusive,\n getRandomBetweenExclusive,\n hashCode,\n roundToDecimal,\n formatNumberToMinDigits,\n formatDigitalTime\n} from './numberHelpers';\n\nexport {\n richTextParser,\n capitalize,\n capitalizeFirstLetter,\n lowerCaseFirstLetter,\n getCharacterCount,\n clampToGraphemeMax,\n useAnInsteadOfA,\n splitCamelCase,\n pluralize,\n pluralizeIfNeeded,\n getInitialsOrAcronym\n} from './stringHelpers';\n\nexport {\n objectsAreTheSame,\n isAnObject,\n createCompareValueOverride,\n isReactElement,\n isNonElementObject,\n isPlainObject,\n deepMergeObjects,\n overrideMergeObjects,\n makeInheritanceObject,\n updateNestedProperty,\n filterObject,\n getArrayOfObjectKeys,\n getArrayOfReadableObjectKeys,\n getBranchFromPath,\n deepRemoveProps\n} from './objectHelpers';\nexport type {\n DeepMergeObjectsArgs,\n MakeInheritanceObjectArgs,\n UpdateNestedPropertyArgs\n} from './objectHelpers';\n\nexport {\n renderIcon,\n isSvgIconDefinition,\n isIconProps,\n isEmptyIconSource\n} from './iconHelpers';\nexport type {\n IconSource,\n RenderIconOptions,\n SvgIconDefinition,\n SvgIconSize\n} from './iconHelpers';\n"],"mappings":"AAAA,SACEA,SAAS,EACTC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,mBAAmB,EACnBC,aAAa,EACbC,aAAa,QACR,cAAc;AAErB,SACEC,iBAAiB,EACjBC,eAAe,EACfC,qBAAqB,EACrBC,mBAAmB,EACnBC,sBAAsB,EACtBC,uBAAuB,EACvBC,gBAAgB,EAChBC,uBAAuB,EACvBC,uBAAuB,QAClB,gBAAgB;AAEvB,SACEC,mBAAmB,EACnBC,iBAAiB,QACZ,eAAe;AAGtB,SACEC,oBAAoB,EACpBC,WAAW,EACXC,uBAAuB,EACvBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,kBAAkB,EAClBC,2BAA2B,EAC3BC,kBAAkB,EAClBC,SAAS,QACJ,eAAe;AAEtB,SACEC,aAAa,EACbC,qBAAqB,EACrBC,mBAAmB,EACnBC,qBAAqB,EACrBC,yBAAyB,EACzBC,qBAAqB,EACrBC,mCAAmC,EACnCC,4BAA4B,EAC5BC,wBAAwB,EACxBC,kCAAkC,EAClCC,yCAAyC,EACzCC,gCAAgC,EAChCC,cAAc,QACT,cAAc;AAErB,SACEC,gBAAgB,EAChBC,eAAe,EACfC,cAAc,EACdC,qBAAqB,QAChB,eAAe;AAEtB,SACEC,oBAAoB,EACpBC,0BAA0B,EAC1BC,iBAAiB,QACZ,sBAAsB;AAG7B,SACEC,oBAAoB,EACpBC,yBAAyB,EACzBC,yBAAyB,EACzBC,QAAQ,EACRC,cAAc,EACdC,uBAAuB,EACvBC,iBAAiB,QACZ,iBAAiB;AAExB,SACEC,cAAc,EACdC,UAAU,EACVC,qBAAqB,EACrBC,oBAAoB,EACpBC,iBAAiB,EACjBC,kBAAkB,EAClBC,eAAe,EACfC,cAAc,EACdC,SAAS,EACTC,iBAAiB,EACjBC,oBAAoB,QACf,iBAAiB;AAExB,SACEC,iBAAiB,EACjBC,UAAU,EACVC,0BAA0B,EAC1BC,cAAc,EACdC,kBAAkB,EAClBC,aAAa,EACbC,gBAAgB,EAChBC,oBAAoB,EACpBC,qBAAqB,EACrBC,oBAAoB,EACpBC,YAAY,EACZC,oBAAoB,EACpBC,4BAA4B,EAC5BC,iBAAiB,EACjBC,eAAe,QACV,iBAAiB;AAOxB,SACEC,UAAU,EACVC,mBAAmB,EACnBC,WAAW,EACXC,iBAAiB,QACZ,eAAe","ignoreList":[]}
@@ -1,3 +1,8 @@
1
+ // True when the user has asked the operating system to minimise non-essential motion.
2
+ export const prefersReducedMotion = () => typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches === true;
3
+
4
+ // Scroll behaviour for scrollIntoView / scrollTo that respects the reduced-motion preference.
5
+ export const getPreferredScrollBehavior = () => prefersReducedMotion() ? 'auto' : 'smooth';
1
6
  export const getScrollSettings = event => {
2
7
  const domNode = event.target;
3
8
  const {
@@ -1 +1 @@
1
- {"version":3,"file":"interactionsHelper.js","names":["getScrollSettings","event","domNode","target","scrollHeight","clientHeight","scrollLeft","scrollTop","scrollWidth","clientWidth","hasVerticalScroller","hasHorizontalScroller","scrollerAtBottom","scrollerAtTop","scrollerAtLeft","scrollerAtRight"],"sources":["../../../src/helpers/interactionsHelper.ts"],"sourcesContent":["export interface ScrollSettings {\n scrollHeight: number;\n clientHeight: number;\n scrollLeft: number;\n scrollTop: number;\n scrollWidth: number;\n clientWidth: number;\n hasVerticalScroller: boolean;\n hasHorizontalScroller: boolean;\n scrollerAtBottom: boolean;\n scrollerAtTop: boolean;\n scrollerAtLeft: boolean;\n scrollerAtRight: boolean;\n event: Event;\n}\n\nexport const getScrollSettings = (event: Event): ScrollSettings => {\n const domNode = event.target as HTMLElement;\n\n const {\n scrollHeight,\n clientHeight,\n scrollLeft,\n scrollTop,\n scrollWidth,\n clientWidth\n } = domNode;\n\n const hasVerticalScroller = scrollHeight > clientHeight;\n const hasHorizontalScroller = scrollWidth > clientWidth;\n\n const scrollerAtBottom = scrollTop + clientHeight + 100 >= scrollHeight;\n const scrollerAtTop = scrollTop <= 0;\n const scrollerAtLeft = scrollLeft <= 0;\n const scrollerAtRight = scrollLeft + clientWidth + 100 >= scrollWidth;\n\n return {\n scrollHeight,\n scrollLeft,\n clientHeight,\n clientWidth,\n hasVerticalScroller,\n hasHorizontalScroller,\n scrollTop,\n scrollWidth,\n scrollerAtBottom,\n scrollerAtTop,\n scrollerAtLeft,\n scrollerAtRight,\n event\n } as ScrollSettings;\n};\n"],"mappings":"AAgBA,OAAO,MAAMA,iBAAiB,GAAIC,KAAY,IAAqB;EACjE,MAAMC,OAAO,GAAGD,KAAK,CAACE,MAAqB;EAE3C,MAAM;IACJC,YAAY;IACZC,YAAY;IACZC,UAAU;IACVC,SAAS;IACTC,WAAW;IACXC;EACF,CAAC,GAAGP,OAAO;EAEX,MAAMQ,mBAAmB,GAAGN,YAAY,GAAGC,YAAY;EACvD,MAAMM,qBAAqB,GAAGH,WAAW,GAAGC,WAAW;EAEvD,MAAMG,gBAAgB,GAAGL,SAAS,GAAGF,YAAY,GAAG,GAAG,IAAID,YAAY;EACvE,MAAMS,aAAa,GAAGN,SAAS,IAAI,CAAC;EACpC,MAAMO,cAAc,GAAGR,UAAU,IAAI,CAAC;EACtC,MAAMS,eAAe,GAAGT,UAAU,GAAGG,WAAW,GAAG,GAAG,IAAID,WAAW;EAErE,OAAO;IACLJ,YAAY;IACZE,UAAU;IACVD,YAAY;IACZI,WAAW;IACXC,mBAAmB;IACnBC,qBAAqB;IACrBJ,SAAS;IACTC,WAAW;IACXI,gBAAgB;IAChBC,aAAa;IACbC,cAAc;IACdC,eAAe;IACfd;EACF,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"interactionsHelper.js","names":["prefersReducedMotion","window","matchMedia","matches","getPreferredScrollBehavior","getScrollSettings","event","domNode","target","scrollHeight","clientHeight","scrollLeft","scrollTop","scrollWidth","clientWidth","hasVerticalScroller","hasHorizontalScroller","scrollerAtBottom","scrollerAtTop","scrollerAtLeft","scrollerAtRight"],"sources":["../../../src/helpers/interactionsHelper.ts"],"sourcesContent":["// True when the user has asked the operating system to minimise non-essential motion.\nexport const prefersReducedMotion = (): boolean =>\n typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches === true;\n\n// Scroll behaviour for scrollIntoView / scrollTo that respects the reduced-motion preference.\nexport const getPreferredScrollBehavior = (): ScrollBehavior => (prefersReducedMotion() ? 'auto' : 'smooth');\n\nexport interface ScrollSettings {\n scrollHeight: number;\n clientHeight: number;\n scrollLeft: number;\n scrollTop: number;\n scrollWidth: number;\n clientWidth: number;\n hasVerticalScroller: boolean;\n hasHorizontalScroller: boolean;\n scrollerAtBottom: boolean;\n scrollerAtTop: boolean;\n scrollerAtLeft: boolean;\n scrollerAtRight: boolean;\n event: Event;\n}\n\nexport const getScrollSettings = (event: Event): ScrollSettings => {\n const domNode = event.target as HTMLElement;\n\n const {\n scrollHeight,\n clientHeight,\n scrollLeft,\n scrollTop,\n scrollWidth,\n clientWidth\n } = domNode;\n\n const hasVerticalScroller = scrollHeight > clientHeight;\n const hasHorizontalScroller = scrollWidth > clientWidth;\n\n const scrollerAtBottom = scrollTop + clientHeight + 100 >= scrollHeight;\n const scrollerAtTop = scrollTop <= 0;\n const scrollerAtLeft = scrollLeft <= 0;\n const scrollerAtRight = scrollLeft + clientWidth + 100 >= scrollWidth;\n\n return {\n scrollHeight,\n scrollLeft,\n clientHeight,\n clientWidth,\n hasVerticalScroller,\n hasHorizontalScroller,\n scrollTop,\n scrollWidth,\n scrollerAtBottom,\n scrollerAtTop,\n scrollerAtLeft,\n scrollerAtRight,\n event\n } as ScrollSettings;\n};\n"],"mappings":"AAAA;AACA,OAAO,MAAMA,oBAAoB,GAAGA,CAAA,KAClC,OAAOC,MAAM,KAAK,WAAW,IAAIA,MAAM,CAACC,UAAU,GAAG,kCAAkC,CAAC,CAACC,OAAO,KAAK,IAAI;;AAE3G;AACA,OAAO,MAAMC,0BAA0B,GAAGA,CAAA,KAAuBJ,oBAAoB,CAAC,CAAC,GAAG,MAAM,GAAG,QAAS;AAkB5G,OAAO,MAAMK,iBAAiB,GAAIC,KAAY,IAAqB;EACjE,MAAMC,OAAO,GAAGD,KAAK,CAACE,MAAqB;EAE3C,MAAM;IACJC,YAAY;IACZC,YAAY;IACZC,UAAU;IACVC,SAAS;IACTC,WAAW;IACXC;EACF,CAAC,GAAGP,OAAO;EAEX,MAAMQ,mBAAmB,GAAGN,YAAY,GAAGC,YAAY;EACvD,MAAMM,qBAAqB,GAAGH,WAAW,GAAGC,WAAW;EAEvD,MAAMG,gBAAgB,GAAGL,SAAS,GAAGF,YAAY,GAAG,GAAG,IAAID,YAAY;EACvE,MAAMS,aAAa,GAAGN,SAAS,IAAI,CAAC;EACpC,MAAMO,cAAc,GAAGR,UAAU,IAAI,CAAC;EACtC,MAAMS,eAAe,GAAGT,UAAU,GAAGG,WAAW,GAAG,GAAG,IAAID,WAAW;EAErE,OAAO;IACLJ,YAAY;IACZE,UAAU;IACVD,YAAY;IACZI,WAAW;IACXC,mBAAmB;IACnBC,qBAAqB;IACrBJ,SAAS;IACTC,WAAW;IACXI,gBAAgB;IAChBC,aAAa;IACbC,cAAc;IACdC,eAAe;IACfd;EACF,CAAC;AACH,CAAC","ignoreList":[]}
@@ -123,25 +123,39 @@ export const makeInheritanceObject = ({
123
123
  });
124
124
  return `{${inheritanceObjectPieces.join(', ')}}`;
125
125
  };
126
+ // Path segments that would reach an object's prototype rather than its own data.
127
+ const PROTOTYPE_PATH_SEGMENTS = new Set(['__proto__', 'prototype', 'constructor']);
128
+
129
+ /*
130
+ Sets a value at a dot-separated path, creating any missing intermediate objects. Paths often come
131
+ from form field names or JSON keys, so segments that would reach a prototype are rejected:
132
+ otherwise "__proto__.isAdmin" would set isAdmin on every object in the application.
133
+ */
126
134
  export const updateNestedProperty = ({
127
135
  jsonObject,
128
136
  propertyPath,
129
137
  newValue
130
138
  }) => {
131
139
  const pathPieces = propertyPath.split('.');
132
- const numPieces = pathPieces.length;
133
- if (numPieces === 1) {
134
- jsonObject[propertyPath] = newValue;
135
- return jsonObject;
140
+ if (pathPieces.some(piece => PROTOTYPE_PATH_SEGMENTS.has(piece))) {
141
+ throw new TypeError(`Refusing to update a prototype through the path "${propertyPath}".`);
136
142
  }
137
143
  let currentBranch = jsonObject;
138
- pathPieces.forEach((piece, index) => {
139
- if (index === numPieces - 1) {
140
- currentBranch[piece] = newValue;
141
- } else if (currentBranch[piece]) {
142
- currentBranch = currentBranch[piece];
144
+ pathPieces.slice(0, -1).forEach(piece => {
145
+ const descriptor = Object.getOwnPropertyDescriptor(currentBranch, piece);
146
+ let nextBranch = descriptor?.value;
147
+ if (!descriptor || typeof nextBranch !== 'object' || nextBranch === null) {
148
+ nextBranch = {};
149
+ Object.defineProperty(currentBranch, piece, {
150
+ value: nextBranch,
151
+ writable: true,
152
+ enumerable: true,
153
+ configurable: true
154
+ });
143
155
  }
156
+ currentBranch = nextBranch;
144
157
  });
158
+ currentBranch[pathPieces[pathPieces.length - 1]] = newValue;
145
159
  return jsonObject;
146
160
  };
147
161
  export const filterObject = (jsonObject, filter) => {