synapse-react-client 4.0.46 → 4.0.47

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 (559) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/aridhia-queries/useSubmitAridhiaDar.js +2 -2
  3. package/dist/aridhia-queries/useSubmitAridhiaDar.js.map +1 -1
  4. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +1 -1
  5. package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
  6. package/dist/components/AccountLevelBadges/AccountLevelBadges.js +1 -1
  7. package/dist/components/AccountLevelBadges/AccountLevelBadges.js.map +1 -1
  8. package/dist/components/AclEditor/AclEditor.test-utils.js +3 -5
  9. package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
  10. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  11. package/dist/components/Aridhia/AridhiaAccessStatus.js +43 -30
  12. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  13. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +6 -2
  14. package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -1
  15. package/dist/components/Aridhia/AridhiaDarStatusPopover.js +101 -31
  16. package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -1
  17. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts +11 -9
  18. package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts.map +1 -1
  19. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +24 -13
  20. package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
  21. package/dist/components/Authentication/LastLoginInfo.js +2 -2
  22. package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
  23. package/dist/components/Authentication/RecoveryCodeForm.js +1 -1
  24. package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
  25. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  26. package/dist/components/Authentication/TOTPForm.d.ts.map +1 -1
  27. package/dist/components/Authentication/TOTPForm.js +3 -3
  28. package/dist/components/Authentication/TOTPForm.js.map +1 -1
  29. package/dist/components/Authentication/index.d.ts +6 -6
  30. package/dist/components/Authentication/index.d.ts.map +1 -1
  31. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js +1 -1
  32. package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
  33. package/dist/components/CardContainer/CardContainer.js +7 -7
  34. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  35. package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js +1 -1
  36. package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js.map +1 -1
  37. package/dist/components/ChallengeSubmission/ChallengeSubmission.d.ts.map +1 -1
  38. package/dist/components/ChallengeSubmission/ChallengeSubmission.js +1 -1
  39. package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
  40. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js +1 -1
  41. package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js.map +1 -1
  42. package/dist/components/CitationPopover/CitationPopoverUtils.js +2 -2
  43. package/dist/components/CitationPopover/CitationPopoverUtils.js.map +1 -1
  44. package/dist/components/CohortBuilder/CohortBuilder.css +1 -0
  45. package/dist/components/CohortBuilder/CohortBuilder.d.ts +35 -0
  46. package/dist/components/CohortBuilder/CohortBuilder.d.ts.map +1 -0
  47. package/dist/components/CohortBuilder/CohortBuilder.js +108 -0
  48. package/dist/components/CohortBuilder/CohortBuilder.js.map +1 -0
  49. package/dist/components/CohortBuilder/CohortBuilder.module.js +10 -0
  50. package/dist/components/CohortBuilder/CohortBuilder.module.js.map +1 -0
  51. package/dist/components/CohortBuilder/CohortBuilder.module.scss +20 -0
  52. package/dist/components/CohortBuilder/CohortFilesPanel.d.ts +16 -0
  53. package/dist/components/CohortBuilder/CohortFilesPanel.d.ts.map +1 -0
  54. package/dist/components/CohortBuilder/CohortFilesPanel.js +124 -0
  55. package/dist/components/CohortBuilder/CohortFilesPanel.js.map +1 -0
  56. package/dist/components/CohortBuilder/cohortHandOff.d.ts +25 -0
  57. package/dist/components/CohortBuilder/cohortHandOff.d.ts.map +1 -0
  58. package/dist/components/CohortBuilder/cohortHandOff.js +26 -0
  59. package/dist/components/CohortBuilder/cohortHandOff.js.map +1 -0
  60. package/dist/components/ColumnFilter/ColumnFilter.d.ts.map +1 -1
  61. package/dist/components/ColumnFilter/ColumnFilter.js +14 -13
  62. package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
  63. package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
  64. package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
  65. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +11 -2
  66. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  67. package/dist/components/DataGrid/columns/AutocompleteColumn.js +115 -109
  68. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  69. package/dist/components/DataGrid/columns/NumberColumn.js +1 -1
  70. package/dist/components/DataGrid/columns/NumberColumn.js.map +1 -1
  71. package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts +20 -0
  72. package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts.map +1 -0
  73. package/dist/components/DataGrid/columns/NumberOrEnumColumn.js +18 -0
  74. package/dist/components/DataGrid/columns/NumberOrEnumColumn.js.map +1 -0
  75. package/dist/components/DataGrid/components/contextMenu.js +3 -3
  76. package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
  77. package/dist/components/DataGrid/hooks/useGridUndoRedo.d.ts.map +1 -1
  78. package/dist/components/DataGrid/hooks/useGridUndoRedo.js +9 -7
  79. package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
  80. package/dist/components/DataGrid/hooks/useStack.d.ts +1 -1
  81. package/dist/components/DataGrid/hooks/useStack.js +2 -2
  82. package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
  83. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  84. package/dist/components/DataGrid/utils/columnFactory.js +47 -42
  85. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  86. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js +7 -7
  87. package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
  88. package/dist/components/DataGrid/utils/json-rx/JsonRx.js +2 -2
  89. package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
  90. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +1 -1
  91. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  92. package/dist/components/DownloadCart/MeetAccessRequirementCard.js +1 -1
  93. package/dist/components/DownloadCart/MeetAccessRequirementCard.js.map +1 -1
  94. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +5 -5
  95. package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
  96. package/dist/components/EntityFinder/details/view/DetailsView.d.ts.map +1 -1
  97. package/dist/components/EntityFinder/details/view/DetailsView.js +4 -4
  98. package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
  99. package/dist/components/EntityHeaderTable/EntityHeaderTable.js +4 -4
  100. package/dist/components/EntityHeaderTable/Filter.d.ts.map +1 -1
  101. package/dist/components/EntityHeaderTable/Filter.js +1 -1
  102. package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
  103. package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
  104. package/dist/components/FeaturedDataTabs/FacetPlotsCard.d.ts.map +1 -1
  105. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +80 -84
  106. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  107. package/dist/components/FormTemplateEditor/FormStructurePanel.js +7 -7
  108. package/dist/components/FormTemplateEditor/StepCard.js +9 -9
  109. package/dist/components/FormTemplateEditor/schemaFieldUtils.js +2 -2
  110. package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -1
  111. package/dist/components/FullTextSearch/FullTextSearch.js +8 -8
  112. package/dist/components/GenericCard/CardUtils.js.map +1 -1
  113. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +1 -1
  114. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -1
  115. package/dist/components/GenericCard/DuoTermTags/duoTerms.js +1 -1
  116. package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -1
  117. package/dist/components/GenericCard/TableRowGenericCard.js +37 -37
  118. package/dist/components/GoalsV3/GoalsV3.js +1 -1
  119. package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
  120. package/dist/components/HexGrid/HexGrid.d.ts +3 -1
  121. package/dist/components/HexGrid/HexGrid.d.ts.map +1 -1
  122. package/dist/components/HexGrid/HexGrid.js +14 -13
  123. package/dist/components/HexGrid/HexGrid.js.map +1 -1
  124. package/dist/components/IconSvg/index.d.ts +1 -1
  125. package/dist/components/IconSvg/index.d.ts.map +1 -1
  126. package/dist/components/IconSvg/index.js.map +1 -1
  127. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.d.ts.map +1 -1
  128. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js +3 -3
  129. package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
  130. package/dist/components/Markdown/MarkdownEditor.js +1 -1
  131. package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
  132. package/dist/components/Markdown/widget/index.d.ts +1 -1
  133. package/dist/components/Markdown/widget/index.d.ts.map +1 -1
  134. package/dist/components/ModalDownload/ModalDownload.d.ts.map +1 -1
  135. package/dist/components/ModalDownload/ModalDownload.js +2 -1
  136. package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
  137. package/dist/components/Plot/BarPlot.js +1 -1
  138. package/dist/components/Plot/BarPlot.js.map +1 -1
  139. package/dist/components/Plot/PlotPanelHeader.d.ts +3 -2
  140. package/dist/components/Plot/PlotPanelHeader.d.ts.map +1 -1
  141. package/dist/components/Plot/PlotPanelHeader.js.map +1 -1
  142. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js +1 -1
  143. package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
  144. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js +1 -1
  145. package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
  146. package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
  147. package/dist/components/ProvenanceGraph/ProvenanceGraph.js +3 -3
  148. package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
  149. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
  150. package/dist/components/QueryBuilder/FilterConditionRow.js +28 -27
  151. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
  152. package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -1
  153. package/dist/components/QueryBuilder/FilterGroupNode.js +91 -75
  154. package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -1
  155. package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -1
  156. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
  157. package/dist/components/QueryBuilder/QueryBuilderControls.js +91 -79
  158. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
  159. package/dist/components/QueryBuilder/QueryBuilderControls.module.js +11 -11
  160. package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -1
  161. package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +2 -0
  162. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +2 -0
  163. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -1
  164. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -1
  165. package/dist/components/QueryBuilder/queryBuilderLimits.d.ts +18 -0
  166. package/dist/components/QueryBuilder/queryBuilderLimits.d.ts.map +1 -0
  167. package/dist/components/QueryBuilder/queryBuilderLimits.js +38 -0
  168. package/dist/components/QueryBuilder/queryBuilderLimits.js.map +1 -0
  169. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +0 -8
  170. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -1
  171. package/dist/components/QueryBuilder/queryBuilderMetadata.js +6 -9
  172. package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -1
  173. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +5 -4
  174. package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
  175. package/dist/components/QueryBuilder/queryBuilderTranslation.js +58 -33
  176. package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
  177. package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -1
  178. package/dist/components/QueryBuilder/useQBCombinedSql.js +4 -4
  179. package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -1
  180. package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts.map +1 -1
  181. package/dist/components/QueryBuilder/useQBValueDisplayName.js +5 -5
  182. package/dist/components/QueryBuilder/useQBValueDisplayName.js.map +1 -1
  183. package/dist/components/QuerySortSelector.js +5 -5
  184. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +21 -21
  185. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  186. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts +20 -0
  187. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts.map +1 -0
  188. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js +50 -0
  189. package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js.map +1 -0
  190. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts +5 -3
  191. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts.map +1 -1
  192. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js +7 -3
  193. package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
  194. package/dist/components/QueryWrapper/downloadListFiles.d.ts +25 -0
  195. package/dist/components/QueryWrapper/downloadListFiles.d.ts.map +1 -0
  196. package/dist/components/QueryWrapper/downloadListFiles.js +39 -0
  197. package/dist/components/QueryWrapper/downloadListFiles.js.map +1 -0
  198. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts +16 -0
  199. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts.map +1 -0
  200. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js +50 -0
  201. package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js.map +1 -0
  202. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts +4 -1
  203. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts.map +1 -1
  204. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js +15 -28
  205. package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js.map +1 -1
  206. package/dist/components/QueryWrapper/useOnQueryDataChange.d.ts.map +1 -1
  207. package/dist/components/QueryWrapper/useOnQueryDataChange.js +7 -6
  208. package/dist/components/QueryWrapper/useOnQueryDataChange.js.map +1 -1
  209. package/dist/components/QueryWrapperErrorBoundary.d.ts +3 -1
  210. package/dist/components/QueryWrapperErrorBoundary.d.ts.map +1 -1
  211. package/dist/components/QueryWrapperErrorBoundary.js +26 -21
  212. package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
  213. package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js +7 -7
  214. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +2 -2
  215. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  216. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +34 -32
  217. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  218. package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js +7 -7
  219. package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
  220. package/dist/components/QueryWrapperPlotNav/UseRowSet.js +12 -12
  221. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  222. package/dist/components/RowDataTable/CategorizedRowDataTable.css +1 -0
  223. package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts +33 -0
  224. package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts.map +1 -0
  225. package/dist/components/RowDataTable/CategorizedRowDataTable.js +64 -0
  226. package/dist/components/RowDataTable/CategorizedRowDataTable.js.map +1 -0
  227. package/dist/components/RowDataTable/CategorizedRowDataTable.module.js +8 -0
  228. package/dist/components/RowDataTable/CategorizedRowDataTable.module.js.map +1 -0
  229. package/dist/components/RowDataTable/CategorizedRowDataTable.module.scss +18 -0
  230. package/dist/components/RowDataTable/RowDataTable.d.ts +13 -0
  231. package/dist/components/RowDataTable/RowDataTable.d.ts.map +1 -1
  232. package/dist/components/RowDataTable/RowDataTable.js +25 -8
  233. package/dist/components/RowDataTable/RowDataTable.js.map +1 -1
  234. package/dist/components/RssFeedCards/RssFeedCards.js +1 -1
  235. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  236. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.d.ts.map +1 -1
  237. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js +2 -2
  238. package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js.map +1 -1
  239. package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js +1 -1
  240. package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js.map +1 -1
  241. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +17 -9
  242. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  243. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +39 -30
  244. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  245. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +24 -24
  246. package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
  247. package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js +8 -8
  248. package/dist/components/SynapseChat/SynapseChatMessage.js +1 -1
  249. package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
  250. package/dist/components/SynapseForm/NavButtons.js.map +1 -1
  251. package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
  252. package/dist/components/SynapseSearchPageResults/HighlightedTypography.js +1 -1
  253. package/dist/components/SynapseSearchPageResults/HighlightedTypography.js.map +1 -1
  254. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.d.ts.map +1 -1
  255. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js +3 -3
  256. package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
  257. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.d.ts.map +1 -1
  258. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +38 -44
  259. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
  260. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js +4 -4
  261. package/dist/components/SynapseTable/SqlEditor.js +7 -7
  262. package/dist/components/SynapseTable/SynapseTable.js +8 -8
  263. package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
  264. package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
  265. package/dist/components/SynapseTable/SynapseTableRenderers.js +73 -72
  266. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  267. package/dist/components/SynapseTable/SynapseTableUtils.js +1 -1
  268. package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
  269. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
  270. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +44 -45
  271. package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
  272. package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js +1 -1
  273. package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js.map +1 -1
  274. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.d.ts.map +1 -1
  275. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +142 -142
  276. package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
  277. package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js +4 -4
  278. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js +12 -12
  279. package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
  280. package/dist/components/SynapseTable/table-top/ColumnSelection.js +6 -6
  281. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts +0 -1
  282. package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts.map +1 -1
  283. package/dist/components/SynapseTable/table-top/DownloadOptions.js +64 -57
  284. package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
  285. package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
  286. package/dist/components/SynapseTable/usePrefetchTableData.js +3 -3
  287. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  288. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
  289. package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
  290. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js +1 -1
  291. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js.map +1 -1
  292. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js +2 -2
  293. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
  294. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +60 -60
  295. package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
  296. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js +1 -1
  297. package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
  298. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js +1 -1
  299. package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
  300. package/dist/components/TanStackTable/StyledTanStackTable.d.ts.map +1 -1
  301. package/dist/components/TanStackTable/StyledTanStackTable.js +1 -4
  302. package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
  303. package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
  304. package/dist/components/TotalQueryResults.js +14 -14
  305. package/dist/components/Webhook/WebhookDashboard.d.ts.map +1 -1
  306. package/dist/components/Webhook/WebhookDashboard.js +2 -2
  307. package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
  308. package/dist/components/download_list/DownloadConfirmationUtils.d.ts +5 -1
  309. package/dist/components/download_list/DownloadConfirmationUtils.d.ts.map +1 -1
  310. package/dist/components/download_list/DownloadConfirmationUtils.js +2 -2
  311. package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
  312. package/dist/components/error/ErrorBanner.d.ts.map +1 -1
  313. package/dist/components/error/ErrorBanner.js +49 -46
  314. package/dist/components/error/ErrorBanner.js.map +1 -1
  315. package/dist/components/file/upload/MultiFileUploadProgress.js +5 -5
  316. package/dist/components/row_renderers/Dataset.d.ts.map +1 -1
  317. package/dist/components/row_renderers/Dataset.js +6 -6
  318. package/dist/components/row_renderers/Dataset.js.map +1 -1
  319. package/dist/components/row_renderers/Funder.js +1 -1
  320. package/dist/components/row_renderers/Funder.js.map +1 -1
  321. package/dist/components/widgets/ElementWithTooltip.d.ts +6 -1
  322. package/dist/components/widgets/ElementWithTooltip.d.ts.map +1 -1
  323. package/dist/components/widgets/ElementWithTooltip.js +22 -14
  324. package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
  325. package/dist/components/widgets/RangeSlider/RangeSlider.d.ts.map +1 -1
  326. package/dist/components/widgets/RangeSlider/RangeSlider.js +1 -1
  327. package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
  328. package/dist/components/widgets/SynapseImage.js +1 -1
  329. package/dist/components/widgets/SynapseImage.js.map +1 -1
  330. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts +16 -5
  331. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
  332. package/dist/components/widgets/facet-nav/FacetNavPanel.js +115 -102
  333. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  334. package/dist/components/widgets/facet-nav/FacetPlotLegendList.d.ts.map +1 -1
  335. package/dist/components/widgets/facet-nav/FacetPlotLegendList.js +4 -2
  336. package/dist/components/widgets/facet-nav/FacetPlotLegendList.js.map +1 -1
  337. package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js +1 -1
  338. package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js.map +1 -1
  339. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts +2 -0
  340. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts.map +1 -1
  341. package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.js.map +1 -1
  342. package/dist/components/widgets/facet-nav/PlotsContainer.d.ts +7 -0
  343. package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
  344. package/dist/components/widgets/facet-nav/PlotsContainer.js +47 -45
  345. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  346. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +4 -4
  347. package/dist/components/widgets/facet-nav/useFacetPlots.d.ts +3 -2
  348. package/dist/components/widgets/facet-nav/useFacetPlots.d.ts.map +1 -1
  349. package/dist/components/widgets/facet-nav/useFacetPlots.js +16 -15
  350. package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
  351. package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js +4 -4
  352. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +2 -2
  353. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  354. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +62 -60
  355. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  356. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -0
  357. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
  358. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +10 -10
  359. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
  360. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
  361. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  362. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +2 -1
  363. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  364. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts +3 -2
  365. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts.map +1 -1
  366. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.js.map +1 -1
  367. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts +3 -2
  368. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
  369. package/dist/components/widgets/query-filter/FacetFilterControls.js +63 -62
  370. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  371. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.d.ts.map +1 -1
  372. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js +30 -29
  373. package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js.map +1 -1
  374. package/dist/components/widgets/query-filter/RangeFacetFilter.js +5 -5
  375. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts +53 -0
  376. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts.map +1 -0
  377. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js +391 -0
  378. package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js.map +1 -0
  379. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts +41 -0
  380. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts.map +1 -0
  381. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js +379 -0
  382. package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js.map +1 -0
  383. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts +26 -0
  384. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts.map +1 -0
  385. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js +112 -0
  386. package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js.map +1 -0
  387. package/dist/mocks/mockAnnotationColumns.d.ts.map +1 -1
  388. package/dist/mocks/mockAnnotationColumns.js +1 -1
  389. package/dist/mocks/mockAnnotationColumns.js.map +1 -1
  390. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +9 -0
  391. package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
  392. package/dist/mocks/msw/handlers/aridhiaHandlers.js +24 -15
  393. package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
  394. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts +21 -2
  395. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts.map +1 -1
  396. package/dist/mocks/msw/handlers/asyncJobHandlers.js +30 -22
  397. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  398. package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts +27 -0
  399. package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts.map +1 -0
  400. package/dist/mocks/msw/handlers/cohortBuilderHandlers.js +158 -0
  401. package/dist/mocks/msw/handlers/cohortBuilderHandlers.js.map +1 -0
  402. package/dist/mocks/msw/handlers/subscriptionHandlers.js +1 -1
  403. package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
  404. package/dist/mocks/msw/handlers/userProfileHandlers.d.ts.map +1 -1
  405. package/dist/mocks/msw/handlers/userProfileHandlers.js +2 -2
  406. package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
  407. package/dist/mocks/query/mockColumnCategoryTable.d.ts +19 -0
  408. package/dist/mocks/query/mockColumnCategoryTable.d.ts.map +1 -0
  409. package/dist/mocks/query/mockColumnCategoryTable.js +188 -0
  410. package/dist/mocks/query/mockColumnCategoryTable.js.map +1 -0
  411. package/dist/stories/ColorPaletteInspector.d.ts.map +1 -1
  412. package/dist/stories/ColorPaletteInspector.js +2 -2
  413. package/dist/stories/ColorPaletteInspector.js.map +1 -1
  414. package/dist/style/components/facet_nav/_facet-nav-panel.scss +8 -0
  415. package/dist/style/main.css +1 -1
  416. package/dist/synapse-queries/auth/useOIDC.js +2 -2
  417. package/dist/synapse-queries/auth/useOIDC.js.map +1 -1
  418. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js +2 -2
  419. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js.map +1 -1
  420. package/dist/synapse-queries/challenge/useChallenge.js +2 -2
  421. package/dist/synapse-queries/challenge/useChallenge.js.map +1 -1
  422. package/dist/synapse-queries/chat/useChat.js +8 -8
  423. package/dist/synapse-queries/chat/useChat.js.map +1 -1
  424. package/dist/synapse-queries/curation/task/useCurationTask.js +10 -10
  425. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  426. package/dist/synapse-queries/dataaccess/useAccessRequirements.js +24 -24
  427. package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
  428. package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js +4 -4
  429. package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js.map +1 -1
  430. package/dist/synapse-queries/dataaccess/useEDuc.js +6 -6
  431. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
  432. package/dist/synapse-queries/dataaccess/useFormTemplate.js +4 -4
  433. package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -1
  434. package/dist/synapse-queries/download/index.js +2 -2
  435. package/dist/synapse-queries/download/useDownloadList.d.ts +5 -0
  436. package/dist/synapse-queries/download/useDownloadList.d.ts.map +1 -1
  437. package/dist/synapse-queries/download/useDownloadList.js +14 -13
  438. package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
  439. package/dist/synapse-queries/entity/useEntity.d.ts.map +1 -1
  440. package/dist/synapse-queries/entity/useEntity.js +20 -20
  441. package/dist/synapse-queries/entity/useEntity.js.map +1 -1
  442. package/dist/synapse-queries/entity/useExportToADWorkbench.d.ts.map +1 -1
  443. package/dist/synapse-queries/entity/useExportToADWorkbench.js +2 -1
  444. package/dist/synapse-queries/entity/useExportToADWorkbench.js.map +1 -1
  445. package/dist/synapse-queries/entity/useExportToCavatica.d.ts.map +1 -1
  446. package/dist/synapse-queries/entity/useExportToCavatica.js +3 -2
  447. package/dist/synapse-queries/entity/useExportToCavatica.js.map +1 -1
  448. package/dist/synapse-queries/entity/useExportToPluto.d.ts.map +1 -1
  449. package/dist/synapse-queries/entity/useExportToPluto.js +2 -1
  450. package/dist/synapse-queries/entity/useExportToPluto.js.map +1 -1
  451. package/dist/synapse-queries/entity/useGetQueryResultBundle.d.ts.map +1 -1
  452. package/dist/synapse-queries/entity/useGetQueryResultBundle.js +4 -7
  453. package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
  454. package/dist/synapse-queries/forum/useReply.js +6 -6
  455. package/dist/synapse-queries/forum/useReply.js.map +1 -1
  456. package/dist/synapse-queries/forum/useThread.js +14 -14
  457. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  458. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js +1 -1
  459. package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
  460. package/dist/synapse-queries/grid/useGridSession.js +4 -4
  461. package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
  462. package/dist/synapse-queries/index.js +177 -176
  463. package/dist/synapse-queries/oauth/useOAuthClient.js +9 -9
  464. package/dist/synapse-queries/oauth/useOAuthClient.js.map +1 -1
  465. package/dist/synapse-queries/portal/usePortal.js +7 -7
  466. package/dist/synapse-queries/portal/usePortal.js.map +1 -1
  467. package/dist/synapse-queries/subscription/useSubscription.js +4 -4
  468. package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
  469. package/dist/synapse-queries/table/useTableUpdateTransaction.js +2 -2
  470. package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
  471. package/dist/synapse-queries/team/useTeam.js +2 -2
  472. package/dist/synapse-queries/team/useTeam.js.map +1 -1
  473. package/dist/synapse-queries/team/useTeamList.d.ts.map +1 -1
  474. package/dist/synapse-queries/team/useTeamList.js +3 -3
  475. package/dist/synapse-queries/team/useTeamList.js.map +1 -1
  476. package/dist/synapse-queries/team/useTeamMembers.js +8 -8
  477. package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
  478. package/dist/synapse-queries/termsOfService/useTermsOfService.js +2 -2
  479. package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
  480. package/dist/synapse-queries/trash/useTrashCan.js +4 -4
  481. package/dist/synapse-queries/trash/useTrashCan.js.map +1 -1
  482. package/dist/synapse-queries/user/useCertificationQuiz.js +2 -2
  483. package/dist/synapse-queries/user/useCertificationQuiz.js.map +1 -1
  484. package/dist/synapse-queries/user/useFavorites.js +4 -4
  485. package/dist/synapse-queries/user/useFavorites.js.map +1 -1
  486. package/dist/synapse-queries/user/useRevokeCertification.js +2 -2
  487. package/dist/synapse-queries/user/useRevokeCertification.js.map +1 -1
  488. package/dist/synapse-queries/wiki/useWiki.js +10 -10
  489. package/dist/synapse-queries/wiki/useWiki.js.map +1 -1
  490. package/dist/tsconfig.build.tsbuildinfo +1 -1
  491. package/dist/utils/ContentTypeUtils.js +4 -4
  492. package/dist/utils/ContentTypeUtils.js.map +1 -1
  493. package/dist/utils/PermissionLevelToAccessType.js +1 -1
  494. package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
  495. package/dist/utils/analytics/useGoogleAnalytics.js +1 -1
  496. package/dist/utils/analytics/useGoogleAnalytics.js.map +1 -1
  497. package/dist/utils/context/DocumentMetadataContext.js +1 -1
  498. package/dist/utils/context/DocumentMetadataContext.js.map +1 -1
  499. package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
  500. package/dist/utils/functions/AccessControlListUtils.js +3 -3
  501. package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
  502. package/dist/utils/functions/ArrayUtils.js +2 -2
  503. package/dist/utils/functions/ArrayUtils.js.map +1 -1
  504. package/dist/utils/functions/FileHandleUtils.js +1 -1
  505. package/dist/utils/functions/FileHandleUtils.js.map +1 -1
  506. package/dist/utils/functions/RegularExpressions.js +1 -1
  507. package/dist/utils/functions/RegularExpressions.js.map +1 -1
  508. package/dist/utils/functions/StringUtils.d.ts.map +1 -1
  509. package/dist/utils/functions/StringUtils.js +1 -2
  510. package/dist/utils/functions/StringUtils.js.map +1 -1
  511. package/dist/utils/functions/deepLinkingUtils.js +2 -2
  512. package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
  513. package/dist/utils/functions/enumerationFacet.d.ts +26 -0
  514. package/dist/utils/functions/enumerationFacet.d.ts.map +1 -0
  515. package/dist/utils/functions/enumerationFacet.js +27 -0
  516. package/dist/utils/functions/enumerationFacet.js.map +1 -0
  517. package/dist/utils/functions/facetCountUtils.d.ts +12 -0
  518. package/dist/utils/functions/facetCountUtils.d.ts.map +1 -0
  519. package/dist/utils/functions/facetCountUtils.js +9 -0
  520. package/dist/utils/functions/facetCountUtils.js.map +1 -0
  521. package/dist/utils/functions/getEndpoint.js.map +1 -1
  522. package/dist/utils/functions/getUserData.js +1 -1
  523. package/dist/utils/functions/getUserData.js.map +1 -1
  524. package/dist/utils/functions/queryUtils.d.ts +1 -1
  525. package/dist/utils/functions/queryUtils.d.ts.map +1 -1
  526. package/dist/utils/functions/queryUtils.js +26 -22
  527. package/dist/utils/functions/queryUtils.js.map +1 -1
  528. package/dist/utils/functions/testDownloadSpeed.d.ts.map +1 -1
  529. package/dist/utils/functions/testDownloadSpeed.js +17 -26
  530. package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
  531. package/dist/utils/functions/unCamelCase.js +1 -1
  532. package/dist/utils/functions/unCamelCase.js.map +1 -1
  533. package/dist/utils/hooks/useGetInfoFromIds.js +5 -5
  534. package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
  535. package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js +1 -1
  536. package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js.map +1 -1
  537. package/dist/utils/hooks/useLogin.d.ts.map +1 -1
  538. package/dist/utils/hooks/useLogin.js +5 -5
  539. package/dist/utils/hooks/useLogin.js.map +1 -1
  540. package/dist/utils/hooks/useUploadFileEntity/useCreateFolderPath.js.map +1 -1
  541. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts +6 -0
  542. package/dist/utils/jsonschema/collectTopLevelProperties.d.ts.map +1 -1
  543. package/dist/utils/jsonschema/collectTopLevelProperties.js +1 -1
  544. package/dist/utils/jsonschema/collectTopLevelProperties.js.map +1 -1
  545. package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts +22 -0
  546. package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts.map +1 -0
  547. package/dist/utils/jsonschema/getNumberOrEnumInfo.js +39 -0
  548. package/dist/utils/jsonschema/getNumberOrEnumInfo.js.map +1 -0
  549. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts +1 -0
  550. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts.map +1 -1
  551. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js +1 -1
  552. package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js.map +1 -1
  553. package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts +5 -0
  554. package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts.map +1 -1
  555. package/dist/utils/jsonschema/getSchemaPropertyInfo.js +30 -15
  556. package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
  557. package/dist/utils/jsonschema/submissionContext.js +2 -2
  558. package/dist/utils/jsonschema/submissionContext.js.map +1 -1
  559. package/package.json +6 -6
@@ -1,16 +1,16 @@
1
1
  //#region src/utils/ContentTypeUtils.ts
2
- var e = /* @__PURE__ */ ".awk,.bat,.btm,.c,.cmd,.cpp,.cxx,.def,.dlg,.dpc,.dpj,.dtd,.h,.hdl,.hpp,.hrc,.html,.hxx,.inc,.ini,.inl,.ins,.ipy,.java,.js,.jsp,.l,.lgt,.ll,.par,.pl,.py,.r,.rc,.rdb,.res,.s,.sbl,.scp,.sh,.sql,.src,.srs,.xml,.xrb,.y,.yaml,.yxx".split(","), t = "text/plain", n = "text/csv", r = "text/tab-separated-values", i = "application/octet-stream", a = [
2
+ var e = new Set(/* @__PURE__ */ ".awk,.bat,.btm,.c,.cmd,.cpp,.cxx,.def,.dlg,.dpc,.dpj,.dtd,.h,.hdl,.hpp,.hrc,.html,.hxx,.inc,.ini,.inl,.ins,.ipy,.java,.js,.jsp,.l,.lgt,.ll,.par,.pl,.py,.r,.rc,.rdb,.res,.s,.sbl,.scp,.sh,.sql,.src,.srs,.xml,.xrb,.y,.yaml,.yxx".split(",")), t = "text/plain", n = "text/csv", r = "text/tab-separated-values", i = "application/octet-stream", a = new Set([
3
3
  ".cwl",
4
4
  ".wdl",
5
5
  ".json"
6
- ];
6
+ ]);
7
7
  function o(t) {
8
8
  let n = !1;
9
9
  if (t != null) {
10
10
  let r = t.lastIndexOf(".");
11
11
  if (r > -1) {
12
12
  let i = t.substring(r).toLowerCase();
13
- n = e.includes(i);
13
+ n = e.has(i);
14
14
  }
15
15
  }
16
16
  return n;
@@ -24,7 +24,7 @@ function s(e) {
24
24
  }
25
25
  function c(e) {
26
26
  let t = !1, n = s(e);
27
- return n != null && (t = a.includes("." + n)), t;
27
+ return n != null && (t = a.has("." + n)), t;
28
28
  }
29
29
  function l(e, a) {
30
30
  let s = e, l = a.toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"ContentTypeUtils.js","names":[],"sources":["../../src/utils/ContentTypeUtils.ts"],"sourcesContent":["// Copied from lib-shared-models ContentTypeUtils.class\n\nconst CODE_EXTENSIONS = [\n '.awk',\n '.bat',\n '.btm',\n '.c',\n '.cmd',\n '.cpp',\n '.cxx',\n '.def',\n '.dlg',\n '.dpc',\n '.dpj',\n '.dtd',\n '.h',\n '.hdl',\n '.hpp',\n '.hrc',\n '.html',\n '.hxx',\n '.inc',\n '.ini',\n '.inl',\n '.ins',\n '.ipy',\n '.java',\n '.js',\n '.jsp',\n '.l',\n '.lgt',\n '.ll',\n '.par',\n '.pl',\n '.py',\n '.r',\n '.rc',\n '.rdb',\n '.res',\n '.s',\n '.sbl',\n '.scp',\n '.sh',\n '.sql',\n '.src',\n '.srs',\n '.xml',\n '.xrb',\n '.y',\n '.yaml',\n '.yxx',\n]\n\nexport const PLAIN_TEXT = 'text/plain'\nexport const TEXT_COMMA_SEPARATED_VALUES = 'text/csv'\nexport const TEXT_TAB_SEPARATED_VALUES = 'text/tab-separated-values'\nexport const APPLICATION_OCTET_STREAM = 'application/octet-stream'\n\nconst WEB_CODE_EXTENSIONS = ['.cwl', '.wdl', '.json']\n\nexport function isRecognizedCodeFileName(fileName: string): boolean {\n let isCodeFile = false\n if (fileName != null) {\n const lastDot = fileName.lastIndexOf('.')\n if (lastDot > -1) {\n const extension = fileName.substring(lastDot).toLowerCase()\n isCodeFile = CODE_EXTENSIONS.includes(extension)\n }\n }\n\n return isCodeFile\n}\n\nfunction getExtension(fileName: string): string | null {\n if (fileName != null) {\n const lastDot = fileName.lastIndexOf('.')\n if (lastDot > -1) {\n return fileName.substring(lastDot + 1).toLowerCase()\n }\n }\n return null\n}\n\nfunction isWebRecognizedCodeFileName(fileName: string): boolean {\n let isPlainText = false\n const extension = getExtension(fileName)\n if (extension != null) {\n isPlainText = WEB_CODE_EXTENSIONS.includes('.' + extension)\n }\n return isPlainText\n}\n\n/**\n * Given an initial Content Type and a file name, returns an appropriate Content\n * Type if the initial value is null or empty. Otherwise, the original Content\n * Type is returned.\n * @param type\n * @param fileName\n */\nexport function fixDefaultContentType(\n type: string | null,\n fileName: string,\n): string {\n let contentType = type\n const lowercaseFilename = fileName.toLowerCase()\n if (type == null || type.trim().length == 0) {\n if (\n isRecognizedCodeFileName(fileName) ||\n isWebRecognizedCodeFileName(fileName) ||\n lowercaseFilename.endsWith('.txt')\n ) {\n contentType = PLAIN_TEXT\n } else if (\n lowercaseFilename.endsWith('.tsv') ||\n lowercaseFilename.endsWith('.tab')\n ) {\n contentType = TEXT_TAB_SEPARATED_VALUES\n } else if (lowercaseFilename.endsWith('.csv')) {\n contentType = TEXT_COMMA_SEPARATED_VALUES\n } else {\n // fall back to the least specific official MIME type...\n contentType = APPLICATION_OCTET_STREAM\n }\n }\n return contentType!\n}\n"],"mappings":";AAEA,IAAM,IAAkB,4PAiDxB,GAEa,IAAa,cACb,IAA8B,YAC9B,IAA4B,6BAC5B,IAA2B,4BAElC,IAAsB;CAAC;CAAQ;CAAQ;AAAO;AAEpD,SAAgB,EAAyB,GAA2B;CAClE,IAAI,IAAa;CACjB,IAAI,KAAY,MAAM;EACpB,IAAM,IAAU,EAAS,YAAY,GAAG;EACxC,IAAI,IAAU,IAAI;GAChB,IAAM,IAAY,EAAS,UAAU,CAAO,EAAE,YAAY;GAC1D,IAAa,EAAgB,SAAS,CAAS;EACjD;CACF;CAEA,OAAO;AACT;AAEA,SAAS,EAAa,GAAiC;CACrD,IAAI,KAAY,MAAM;EACpB,IAAM,IAAU,EAAS,YAAY,GAAG;EACxC,IAAI,IAAU,IACZ,OAAO,EAAS,UAAU,IAAU,CAAC,EAAE,YAAY;CAEvD;CACA,OAAO;AACT;AAEA,SAAS,EAA4B,GAA2B;CAC9D,IAAI,IAAc,IACZ,IAAY,EAAa,CAAQ;CAIvC,OAHI,KAAa,SACf,IAAc,EAAoB,SAAS,MAAM,CAAS,IAErD;AACT;AASA,SAAgB,EACd,GACA,GACQ;CACR,IAAI,IAAc,GACZ,IAAoB,EAAS,YAAY;CAoB/C,QAnBI,KAAQ,QAAQ,EAAK,KAAK,EAAE,UAAU,OACxC,AAeE,IAdA,EAAyB,CAAQ,KACjC,EAA4B,CAAQ,KACpC,EAAkB,SAAS,MAAM,IAEnB,IAEd,EAAkB,SAAS,MAAM,KACjC,EAAkB,SAAS,MAAM,IAEnB,IACL,EAAkB,SAAS,MAAM,IAC5B,IAGA,IAGX;AACT"}
1
+ {"version":3,"file":"ContentTypeUtils.js","names":[],"sources":["../../src/utils/ContentTypeUtils.ts"],"sourcesContent":["// Copied from lib-shared-models ContentTypeUtils.class\n\nconst CODE_EXTENSIONS = new Set([\n '.awk',\n '.bat',\n '.btm',\n '.c',\n '.cmd',\n '.cpp',\n '.cxx',\n '.def',\n '.dlg',\n '.dpc',\n '.dpj',\n '.dtd',\n '.h',\n '.hdl',\n '.hpp',\n '.hrc',\n '.html',\n '.hxx',\n '.inc',\n '.ini',\n '.inl',\n '.ins',\n '.ipy',\n '.java',\n '.js',\n '.jsp',\n '.l',\n '.lgt',\n '.ll',\n '.par',\n '.pl',\n '.py',\n '.r',\n '.rc',\n '.rdb',\n '.res',\n '.s',\n '.sbl',\n '.scp',\n '.sh',\n '.sql',\n '.src',\n '.srs',\n '.xml',\n '.xrb',\n '.y',\n '.yaml',\n '.yxx',\n])\n\nexport const PLAIN_TEXT = 'text/plain'\nexport const TEXT_COMMA_SEPARATED_VALUES = 'text/csv'\nexport const TEXT_TAB_SEPARATED_VALUES = 'text/tab-separated-values'\nexport const APPLICATION_OCTET_STREAM = 'application/octet-stream'\n\nconst WEB_CODE_EXTENSIONS = new Set(['.cwl', '.wdl', '.json'])\n\nexport function isRecognizedCodeFileName(fileName: string): boolean {\n let isCodeFile = false\n if (fileName != null) {\n const lastDot = fileName.lastIndexOf('.')\n if (lastDot > -1) {\n const extension = fileName.substring(lastDot).toLowerCase()\n isCodeFile = CODE_EXTENSIONS.has(extension)\n }\n }\n\n return isCodeFile\n}\n\nfunction getExtension(fileName: string): string | null {\n if (fileName != null) {\n const lastDot = fileName.lastIndexOf('.')\n if (lastDot > -1) {\n return fileName.substring(lastDot + 1).toLowerCase()\n }\n }\n return null\n}\n\nfunction isWebRecognizedCodeFileName(fileName: string): boolean {\n let isPlainText = false\n const extension = getExtension(fileName)\n if (extension != null) {\n isPlainText = WEB_CODE_EXTENSIONS.has('.' + extension)\n }\n return isPlainText\n}\n\n/**\n * Given an initial Content Type and a file name, returns an appropriate Content\n * Type if the initial value is null or empty. Otherwise, the original Content\n * Type is returned.\n * @param type\n * @param fileName\n */\nexport function fixDefaultContentType(\n type: string | null,\n fileName: string,\n): string {\n let contentType = type\n const lowercaseFilename = fileName.toLowerCase()\n if (type == null || type.trim().length == 0) {\n if (\n isRecognizedCodeFileName(fileName) ||\n isWebRecognizedCodeFileName(fileName) ||\n lowercaseFilename.endsWith('.txt')\n ) {\n contentType = PLAIN_TEXT\n } else if (\n lowercaseFilename.endsWith('.tsv') ||\n lowercaseFilename.endsWith('.tab')\n ) {\n contentType = TEXT_TAB_SEPARATED_VALUES\n } else if (lowercaseFilename.endsWith('.csv')) {\n contentType = TEXT_COMMA_SEPARATED_VALUES\n } else {\n // fall back to the least specific official MIME type...\n contentType = APPLICATION_OCTET_STREAM\n }\n }\n return contentType!\n}\n"],"mappings":";AAEA,IAAM,IAAkB,IAAI,IAAI,4PAiDhC,CAAC,GAEY,IAAa,cACb,IAA8B,YAC9B,IAA4B,6BAC5B,IAA2B,4BAElC,IAAsB,IAAI,IAAI;CAAC;CAAQ;CAAQ;AAAO,CAAC;AAE7D,SAAgB,EAAyB,GAA2B;CAClE,IAAI,IAAa;CACjB,IAAI,KAAY,MAAM;EACpB,IAAM,IAAU,EAAS,YAAY,GAAG;EACxC,IAAI,IAAU,IAAI;GAChB,IAAM,IAAY,EAAS,UAAU,CAAO,EAAE,YAAY;GAC1D,IAAa,EAAgB,IAAI,CAAS;EAC5C;CACF;CAEA,OAAO;AACT;AAEA,SAAS,EAAa,GAAiC;CACrD,IAAI,KAAY,MAAM;EACpB,IAAM,IAAU,EAAS,YAAY,GAAG;EACxC,IAAI,IAAU,IACZ,OAAO,EAAS,UAAU,IAAU,CAAC,EAAE,YAAY;CAEvD;CACA,OAAO;AACT;AAEA,SAAS,EAA4B,GAA2B;CAC9D,IAAI,IAAc,IACZ,IAAY,EAAa,CAAQ;CAIvC,OAHI,KAAa,SACf,IAAc,EAAoB,IAAI,MAAM,CAAS,IAEhD;AACT;AASA,SAAgB,EACd,GACA,GACQ;CACR,IAAI,IAAc,GACZ,IAAoB,EAAS,YAAY;CAoB/C,QAnBI,KAAQ,QAAQ,EAAK,KAAK,EAAE,UAAU,OACxC,AAeE,IAdA,EAAyB,CAAQ,KACjC,EAA4B,CAAQ,KACpC,EAAkB,SAAS,MAAM,IAEnB,IAEd,EAAkB,SAAS,MAAM,KACjC,EAAkB,SAAS,MAAM,IAEnB,IACL,EAAkB,SAAS,MAAM,IAC5B,IAGA,IAGX;AACT"}
@@ -47,7 +47,7 @@ var n = /* @__PURE__ */ e({
47
47
  t.READ,
48
48
  t.DELETE
49
49
  ]
50
- }, i = (e) => JSON.stringify(e.sort()), a = (e) => {
50
+ }, i = (e) => JSON.stringify(e.toSorted()), a = (e) => {
51
51
  let t = i(e);
52
52
  return Object.keys(r).find((e) => t === i(r[e]));
53
53
  }, o = (e) => r[e], s = {
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionLevelToAccessType.js","names":[],"sources":["../../src/utils/PermissionLevelToAccessType.ts"],"sourcesContent":["import { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\n\nconst entityPermissionLevels = [\n 'CAN_VIEW',\n 'CAN_DOWNLOAD',\n 'CAN_EDIT',\n 'CAN_EDIT_DELETE',\n 'CAN_ADMINISTER',\n] as const\nexport type EntityPermissionsLevel = (typeof entityPermissionLevels)[number]\n\nconst accessRequirementPermissionLevels = [\n 'CAN_REVIEW_SUBMISSIONS',\n 'IS_EXEMPTION_ELIGIBLE',\n 'CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE',\n] as const\n\nexport type AccessRequirementPermissionsLevel =\n (typeof accessRequirementPermissionLevels)[number]\n\nconst oauthClientPermissionLevels = ['CAN_ADMINISTER_OAUTH_CLIENT'] as const\n\nexport type OAuthClientPermissionsLevel =\n (typeof oauthClientPermissionLevels)[number]\n\nconst portalClientPermissionLevels = ['CAN_ADMINISTER_PORTAL'] as const\n\nexport type PortalClientPermissionsLevel =\n (typeof portalClientPermissionLevels)[number]\n\nexport type PermissionLevel =\n | EntityPermissionsLevel\n | AccessRequirementPermissionsLevel\n | OAuthClientPermissionsLevel\n | PortalClientPermissionsLevel\n\nconst permissionLevelToAccessType: Record<PermissionLevel, ACCESS_TYPE[]> = {\n // Entity\n CAN_VIEW: [ACCESS_TYPE.READ],\n CAN_DOWNLOAD: [ACCESS_TYPE.READ, ACCESS_TYPE.DOWNLOAD],\n CAN_EDIT: [\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DOWNLOAD,\n ACCESS_TYPE.UPDATE,\n ],\n CAN_EDIT_DELETE: [\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DOWNLOAD,\n ACCESS_TYPE.UPDATE,\n ACCESS_TYPE.DELETE,\n ],\n CAN_ADMINISTER: [\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DOWNLOAD,\n ACCESS_TYPE.UPDATE,\n ACCESS_TYPE.DELETE,\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n ACCESS_TYPE.CHANGE_SETTINGS,\n ACCESS_TYPE.MODERATE,\n ],\n\n // Access Requirements\n CAN_REVIEW_SUBMISSIONS: [ACCESS_TYPE.REVIEW_SUBMISSIONS],\n IS_EXEMPTION_ELIGIBLE: [ACCESS_TYPE.EXEMPTION_ELIGIBLE],\n CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE: [\n ACCESS_TYPE.EXEMPTION_ELIGIBLE,\n ACCESS_TYPE.REVIEW_SUBMISSIONS,\n ],\n CAN_ADMINISTER_OAUTH_CLIENT: [\n ACCESS_TYPE.READ,\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n ACCESS_TYPE.DELETE,\n ACCESS_TYPE.UPDATE,\n ],\n CAN_ADMINISTER_PORTAL: [\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.UPDATE,\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DELETE,\n ],\n}\n\nconst prepAccessTypeForComparison = (accessType: ACCESS_TYPE[]) => {\n return JSON.stringify(accessType.sort())\n}\n\nexport const getPermissionLevelFromAccessType = (accessType: ACCESS_TYPE[]) => {\n const lookupValue = prepAccessTypeForComparison(accessType)\n const permissionLevel = Object.keys(permissionLevelToAccessType).find(key => {\n return (\n lookupValue ===\n prepAccessTypeForComparison(\n permissionLevelToAccessType[key as PermissionLevel],\n )\n )\n })\n\n return permissionLevel as PermissionLevel\n}\n\nexport const getAccessTypeFromPermissionLevel = (\n permissionLevel: PermissionLevel,\n) => {\n return permissionLevelToAccessType[permissionLevel]\n}\n\nexport const permissionLevelToLabel: Record<PermissionLevel, string> = {\n // Entity\n CAN_VIEW: 'Can view',\n CAN_DOWNLOAD: 'Can download',\n CAN_EDIT: 'Can edit',\n CAN_EDIT_DELETE: 'Can edit & delete',\n CAN_ADMINISTER: 'Administrator',\n\n // Access requirement\n CAN_REVIEW_SUBMISSIONS: 'Can Review',\n IS_EXEMPTION_ELIGIBLE: 'Exempt Eligible',\n CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE:\n 'Can Review & Exempt Eligible',\n\n // OAuth Client\n CAN_ADMINISTER_OAUTH_CLIENT: 'Administrator',\n\n // Portal\n CAN_ADMINISTER_PORTAL: 'Administrator',\n}\n"],"mappings":";;;;;;;IAoCM,IAAsE;CAE1E,UAAU,CAAC,EAAY,IAAI;CAC3B,cAAc,CAAC,EAAY,MAAM,EAAY,QAAQ;CACrD,UAAU;EACR,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CACA,iBAAiB;EACf,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CACA,gBAAgB;EACd,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CAGA,wBAAwB,CAAC,EAAY,kBAAkB;CACvD,uBAAuB,CAAC,EAAY,kBAAkB;CACtD,kDAAkD,CAChD,EAAY,oBACZ,EAAY,kBACd;CACA,6BAA6B;EAC3B,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CACA,uBAAuB;EACrB,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;AACF,GAEM,KAA+B,MAC5B,KAAK,UAAU,EAAW,KAAK,CAAC,GAG5B,KAAoC,MAA8B;CAC7E,IAAM,IAAc,EAA4B,CAAU;CAU1D,OATwB,OAAO,KAAK,CAA2B,EAAE,MAAK,MAElE,MACA,EACE,EAA4B,EAC9B,CAIG;AACT,GAEa,KACX,MAEO,EAA4B,IAGxB,IAA0D;CAErE,UAAU;CACV,cAAc;CACd,UAAU;CACV,iBAAiB;CACjB,gBAAgB;CAGhB,wBAAwB;CACxB,uBAAuB;CACvB,kDACE;CAGF,6BAA6B;CAG7B,uBAAuB;AACzB"}
1
+ {"version":3,"file":"PermissionLevelToAccessType.js","names":[],"sources":["../../src/utils/PermissionLevelToAccessType.ts"],"sourcesContent":["import { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\n\nconst entityPermissionLevels = [\n 'CAN_VIEW',\n 'CAN_DOWNLOAD',\n 'CAN_EDIT',\n 'CAN_EDIT_DELETE',\n 'CAN_ADMINISTER',\n] as const\nexport type EntityPermissionsLevel = (typeof entityPermissionLevels)[number]\n\nconst accessRequirementPermissionLevels = [\n 'CAN_REVIEW_SUBMISSIONS',\n 'IS_EXEMPTION_ELIGIBLE',\n 'CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE',\n] as const\n\nexport type AccessRequirementPermissionsLevel =\n (typeof accessRequirementPermissionLevels)[number]\n\nconst oauthClientPermissionLevels = ['CAN_ADMINISTER_OAUTH_CLIENT'] as const\n\nexport type OAuthClientPermissionsLevel =\n (typeof oauthClientPermissionLevels)[number]\n\nconst portalClientPermissionLevels = ['CAN_ADMINISTER_PORTAL'] as const\n\nexport type PortalClientPermissionsLevel =\n (typeof portalClientPermissionLevels)[number]\n\nexport type PermissionLevel =\n | EntityPermissionsLevel\n | AccessRequirementPermissionsLevel\n | OAuthClientPermissionsLevel\n | PortalClientPermissionsLevel\n\nconst permissionLevelToAccessType: Record<PermissionLevel, ACCESS_TYPE[]> = {\n // Entity\n CAN_VIEW: [ACCESS_TYPE.READ],\n CAN_DOWNLOAD: [ACCESS_TYPE.READ, ACCESS_TYPE.DOWNLOAD],\n CAN_EDIT: [\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DOWNLOAD,\n ACCESS_TYPE.UPDATE,\n ],\n CAN_EDIT_DELETE: [\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DOWNLOAD,\n ACCESS_TYPE.UPDATE,\n ACCESS_TYPE.DELETE,\n ],\n CAN_ADMINISTER: [\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DOWNLOAD,\n ACCESS_TYPE.UPDATE,\n ACCESS_TYPE.DELETE,\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n ACCESS_TYPE.CHANGE_SETTINGS,\n ACCESS_TYPE.MODERATE,\n ],\n\n // Access Requirements\n CAN_REVIEW_SUBMISSIONS: [ACCESS_TYPE.REVIEW_SUBMISSIONS],\n IS_EXEMPTION_ELIGIBLE: [ACCESS_TYPE.EXEMPTION_ELIGIBLE],\n CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE: [\n ACCESS_TYPE.EXEMPTION_ELIGIBLE,\n ACCESS_TYPE.REVIEW_SUBMISSIONS,\n ],\n CAN_ADMINISTER_OAUTH_CLIENT: [\n ACCESS_TYPE.READ,\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n ACCESS_TYPE.DELETE,\n ACCESS_TYPE.UPDATE,\n ],\n CAN_ADMINISTER_PORTAL: [\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n ACCESS_TYPE.CREATE,\n ACCESS_TYPE.UPDATE,\n ACCESS_TYPE.READ,\n ACCESS_TYPE.DELETE,\n ],\n}\n\nconst prepAccessTypeForComparison = (accessType: ACCESS_TYPE[]) => {\n return JSON.stringify(accessType.toSorted())\n}\n\nexport const getPermissionLevelFromAccessType = (accessType: ACCESS_TYPE[]) => {\n const lookupValue = prepAccessTypeForComparison(accessType)\n const permissionLevel = Object.keys(permissionLevelToAccessType).find(key => {\n return (\n lookupValue ===\n prepAccessTypeForComparison(\n permissionLevelToAccessType[key as PermissionLevel],\n )\n )\n })\n\n return permissionLevel as PermissionLevel\n}\n\nexport const getAccessTypeFromPermissionLevel = (\n permissionLevel: PermissionLevel,\n) => {\n return permissionLevelToAccessType[permissionLevel]\n}\n\nexport const permissionLevelToLabel: Record<PermissionLevel, string> = {\n // Entity\n CAN_VIEW: 'Can view',\n CAN_DOWNLOAD: 'Can download',\n CAN_EDIT: 'Can edit',\n CAN_EDIT_DELETE: 'Can edit & delete',\n CAN_ADMINISTER: 'Administrator',\n\n // Access requirement\n CAN_REVIEW_SUBMISSIONS: 'Can Review',\n IS_EXEMPTION_ELIGIBLE: 'Exempt Eligible',\n CAN_REVIEW_SUBMISSIONS_AND_IS_EXEMPTION_ELIGIBLE:\n 'Can Review & Exempt Eligible',\n\n // OAuth Client\n CAN_ADMINISTER_OAUTH_CLIENT: 'Administrator',\n\n // Portal\n CAN_ADMINISTER_PORTAL: 'Administrator',\n}\n"],"mappings":";;;;;;;IAoCM,IAAsE;CAE1E,UAAU,CAAC,EAAY,IAAI;CAC3B,cAAc,CAAC,EAAY,MAAM,EAAY,QAAQ;CACrD,UAAU;EACR,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CACA,iBAAiB;EACf,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CACA,gBAAgB;EACd,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CAGA,wBAAwB,CAAC,EAAY,kBAAkB;CACvD,uBAAuB,CAAC,EAAY,kBAAkB;CACtD,kDAAkD,CAChD,EAAY,oBACZ,EAAY,kBACd;CACA,6BAA6B;EAC3B,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;CACA,uBAAuB;EACrB,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;CACd;AACF,GAEM,KAA+B,MAC5B,KAAK,UAAU,EAAW,SAAS,CAAC,GAGhC,KAAoC,MAA8B;CAC7E,IAAM,IAAc,EAA4B,CAAU;CAU1D,OATwB,OAAO,KAAK,CAA2B,EAAE,MAAK,MAElE,MACA,EACE,EAA4B,EAC9B,CAIG;AACT,GAEa,KACX,MAEO,EAA4B,IAGxB,IAA0D;CAErE,UAAU;CACV,cAAc;CACd,UAAU;CACV,iBAAiB;CACjB,gBAAgB;CAGhB,wBAAwB;CACxB,uBAAuB;CACvB,kDACE;CAGF,6BAA6B;CAG7B,uBAAuB;AACzB"}
@@ -6,7 +6,7 @@ var n = !1, r = (r = "GTM-KPW4KS62") => {
6
6
  return t(() => {
7
7
  if (i(window.location.hostname, a) && !n) {
8
8
  window.dataLayer = window.dataLayer || [], window.dataLayer.push({
9
- "gtm.start": (/* @__PURE__ */ new Date()).getTime(),
9
+ "gtm.start": Date.now(),
10
10
  event: "gtm.js"
11
11
  });
12
12
  let e = document.getElementsByTagName("script")[0], t = document.createElement("script");
@@ -1 +1 @@
1
- {"version":3,"file":"useGoogleAnalytics.js","names":[],"sources":["../../../src/utils/analytics/useGoogleAnalytics.ts"],"sourcesContent":["import './AnalyticsTypes'\nimport { useEffect } from 'react'\nimport {\n CookiePreference,\n useCookiePreferences,\n} from '../hooks/useCookiePreferences'\n\n// This hook code is globally executed once\nlet isExecuted = false\n\nexport const useGoogleAnalytics = (measurementId: string = 'GTM-KPW4KS62') => {\n const [cookiePreferences] = useCookiePreferences()\n\n useEffect(() => {\n if (\n shouldEnableGoogleAnalytics(\n window.location.hostname,\n cookiePreferences,\n ) &&\n !isExecuted\n ) {\n window.dataLayer = window.dataLayer || []\n\n window.dataLayer.push({\n 'gtm.start': new Date().getTime(),\n event: 'gtm.js',\n })\n const firstScriptElement = document.getElementsByTagName('script')[0]\n const gtmScript = document.createElement('script')\n const dl = `&l=dataLayer`\n gtmScript.async = true\n gtmScript.src =\n 'https://www.googletagmanager.com/gtm.js?id=' + measurementId + dl\n firstScriptElement.parentNode?.insertBefore(gtmScript, firstScriptElement)\n\n isExecuted = true\n }\n }, [cookiePreferences, measurementId])\n\n return isExecuted\n}\n\nexport function shouldEnableGoogleAnalytics(\n hostname: string,\n cookiePreferences: CookiePreference,\n) {\n const isAnalyticsAllowed = cookiePreferences.analyticsAllowed\n\n const isOnSynapseDomain = hostname.endsWith('.synapse.org')\n const isOnTestDomain =\n hostname.includes('localhost.') ||\n hostname.includes('staging.') ||\n hostname.includes('dev.')\n\n return isAnalyticsAllowed && isOnSynapseDomain && !isOnTestDomain\n}\n\nexport default useGoogleAnalytics\n"],"mappings":";;;AAQA,IAAI,IAAa,IAEJ,KAAsB,IAAwB,mBAAmB;CAC5E,IAAM,CAAC,KAAqB,EAAqB;CA4BjD,OA1BA,QAAgB;EACd,IACE,EACE,OAAO,SAAS,UAChB,CACF,KACA,CAAC,GACD;GAGA,AAFA,OAAO,YAAY,OAAO,aAAa,CAAC,GAExC,OAAO,UAAU,KAAK;IACpB,8BAAa,IAAI,KAAK,GAAE,QAAQ;IAChC,OAAO;GACT,CAAC;GACD,IAAM,IAAqB,SAAS,qBAAqB,QAAQ,EAAE,IAC7D,IAAY,SAAS,cAAc,QAAQ;GAOjD,AALA,EAAU,QAAQ,IAClB,EAAU,MACR,gDAAgD,IAAgB,gBAClE,EAAmB,YAAY,aAAa,GAAW,CAAkB,GAEzE,IAAa;EACf;CACF,GAAG,CAAC,GAAmB,CAAa,CAAC,GAE9B;AACT;AAEA,SAAgB,EACd,GACA,GACA;CACA,IAAM,IAAqB,EAAkB,kBAEvC,IAAoB,EAAS,SAAS,cAAc,GACpD,IACJ,EAAS,SAAS,YAAY,KAC9B,EAAS,SAAS,UAAU,KAC5B,EAAS,SAAS,MAAM;CAE1B,OAAO,KAAsB,KAAqB,CAAC;AACrD"}
1
+ {"version":3,"file":"useGoogleAnalytics.js","names":[],"sources":["../../../src/utils/analytics/useGoogleAnalytics.ts"],"sourcesContent":["import './AnalyticsTypes'\nimport { useEffect } from 'react'\nimport {\n CookiePreference,\n useCookiePreferences,\n} from '../hooks/useCookiePreferences'\n\n// This hook code is globally executed once\nlet isExecuted = false\n\nexport const useGoogleAnalytics = (measurementId: string = 'GTM-KPW4KS62') => {\n const [cookiePreferences] = useCookiePreferences()\n\n useEffect(() => {\n if (\n shouldEnableGoogleAnalytics(\n window.location.hostname,\n cookiePreferences,\n ) &&\n !isExecuted\n ) {\n window.dataLayer = window.dataLayer || []\n\n window.dataLayer.push({\n 'gtm.start': Date.now(),\n event: 'gtm.js',\n })\n const firstScriptElement = document.getElementsByTagName('script')[0]\n const gtmScript = document.createElement('script')\n const dl = `&l=dataLayer`\n gtmScript.async = true\n gtmScript.src =\n 'https://www.googletagmanager.com/gtm.js?id=' + measurementId + dl\n firstScriptElement.parentNode?.insertBefore(gtmScript, firstScriptElement)\n\n isExecuted = true\n }\n }, [cookiePreferences, measurementId])\n\n return isExecuted\n}\n\nexport function shouldEnableGoogleAnalytics(\n hostname: string,\n cookiePreferences: CookiePreference,\n) {\n const isAnalyticsAllowed = cookiePreferences.analyticsAllowed\n\n const isOnSynapseDomain = hostname.endsWith('.synapse.org')\n const isOnTestDomain =\n hostname.includes('localhost.') ||\n hostname.includes('staging.') ||\n hostname.includes('dev.')\n\n return isAnalyticsAllowed && isOnSynapseDomain && !isOnTestDomain\n}\n\nexport default useGoogleAnalytics\n"],"mappings":";;;AAQA,IAAI,IAAa,IAEJ,KAAsB,IAAwB,mBAAmB;CAC5E,IAAM,CAAC,KAAqB,EAAqB;CA4BjD,OA1BA,QAAgB;EACd,IACE,EACE,OAAO,SAAS,UAChB,CACF,KACA,CAAC,GACD;GAGA,AAFA,OAAO,YAAY,OAAO,aAAa,CAAC,GAExC,OAAO,UAAU,KAAK;IACpB,aAAa,KAAK,IAAI;IACtB,OAAO;GACT,CAAC;GACD,IAAM,IAAqB,SAAS,qBAAqB,QAAQ,EAAE,IAC7D,IAAY,SAAS,cAAc,QAAQ;GAOjD,AALA,EAAU,QAAQ,IAClB,EAAU,MACR,gDAAgD,IAAgB,gBAClE,EAAmB,YAAY,aAAa,GAAW,CAAkB,GAEzE,IAAa;EACf;CACF,GAAG,CAAC,GAAmB,CAAa,CAAC,GAE9B;AACT;AAEA,SAAgB,EACd,GACA,GACA;CACA,IAAM,IAAqB,EAAkB,kBAEvC,IAAoB,EAAS,SAAS,cAAc,GACpD,IACJ,EAAS,SAAS,YAAY,KAC9B,EAAS,SAAS,UAAU,KAC5B,EAAS,SAAS,MAAM;CAE1B,OAAO,KAAsB,KAAqB,CAAC;AACrD"}
@@ -4,7 +4,7 @@ import s from "lodash-es/noop";
4
4
  //#region src/utils/context/DocumentMetadataContext.tsx
5
5
  var c = e(void 0);
6
6
  function l(e) {
7
- let { children: n, defaultTitle: s, defaultDescription: l } = e, [u, d] = a([]), f = i(() => [...u].sort((e, t) => t.priority - e.priority), [u]), p = t((e) => {
7
+ let { children: n, defaultTitle: s, defaultDescription: l } = e, [u, d] = a([]), f = i(() => [...u].toSorted((e, t) => t.priority - e.priority), [u]), p = t((e) => {
8
8
  let t = {
9
9
  id: Symbol("DocumentMetadataEntry"),
10
10
  title: e.title,
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentMetadataContext.js","names":[],"sources":["../../../src/utils/context/DocumentMetadataContext.tsx"],"sourcesContent":["import {\n PropsWithChildren,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react'\nimport noop from 'lodash-es/noop'\n\nexport type DocumentMetadataRegistration = {\n title?: string\n description?: string\n priority?: number\n}\n\ntype DocumentMetadataContextValue = {\n register: (registration: DocumentMetadataRegistration) => () => void\n}\n\ntype DocumentMetadataProviderProps = PropsWithChildren<{\n defaultTitle?: string\n defaultDescription?: string\n}>\n\ntype MetadataEntry = {\n id: symbol\n title?: string\n description?: string\n priority: number\n}\n\nconst DocumentMetadataContext = createContext<\n DocumentMetadataContextValue | undefined\n>(undefined)\n\nexport function DocumentMetadataProvider(props: DocumentMetadataProviderProps) {\n // Centralizes document.title/meta description writes so consumers can register values\n // with priorities; highest priority wins, then portal defaults\n const { children, defaultTitle, defaultDescription } = props\n const [entries, setEntries] = useState<MetadataEntry[]>([])\n\n // Keep registrations stable between renders and automatically clean up on unmount.\n const sortedEntries = useMemo(\n () => [...entries].sort((a, b) => b.priority - a.priority),\n [entries],\n )\n\n const register = useCallback(\n (registration: DocumentMetadataRegistration) => {\n const entry: MetadataEntry = {\n id: Symbol('DocumentMetadataEntry'),\n title: registration.title,\n description: registration.description,\n priority: registration.priority ?? 0,\n }\n setEntries(current => [...current, entry])\n return () => {\n setEntries(current => current.filter(item => item.id !== entry.id))\n }\n },\n [setEntries],\n )\n\n const contextValue = useMemo<DocumentMetadataContextValue>(\n () => ({ register }),\n [register],\n )\n\n useEffect(() => {\n // Resolve the highest-priority title/description and push them to the DOM.\n const resolvedTitle =\n sortedEntries.find(entry => entry.title !== undefined)?.title ??\n defaultTitle\n\n if (resolvedTitle !== undefined && document.title !== resolvedTitle) {\n document.title = resolvedTitle\n }\n\n const descriptionElement = document.querySelector(\n 'meta[name=\"description\"]',\n )\n if (descriptionElement) {\n const resolvedDescription =\n sortedEntries.find(entry => entry.description !== undefined)\n ?.description ?? defaultDescription\n\n if (\n typeof resolvedDescription === 'string' &&\n descriptionElement.getAttribute('content') !== resolvedDescription\n ) {\n descriptionElement.setAttribute('content', resolvedDescription)\n }\n }\n }, [defaultTitle, defaultDescription, sortedEntries])\n\n return (\n <DocumentMetadataContext.Provider value={contextValue}>\n {children}\n </DocumentMetadataContext.Provider>\n )\n}\n\nexport function useDocumentMetadata(\n registration: DocumentMetadataRegistration,\n) {\n const context = useContext(DocumentMetadataContext)\n const { title, description, priority } = registration\n\n useEffect(() => {\n if (context) {\n return context.register({ title, description, priority })\n }\n return noop\n }, [context, title, description, priority])\n}\n"],"mappings":";;;;AAiCA,IAAM,IAA0B,EAE9B,KAAA,CAAS;AAEX,SAAgB,EAAyB,GAAsC;CAG7E,IAAM,EAAE,aAAU,iBAAc,0BAAuB,GACjD,CAAC,GAAS,KAAc,EAA0B,CAAC,CAAC,GAGpD,IAAgB,QACd,CAAC,GAAG,CAAO,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,GACzD,CAAC,CAAO,CACV,GAEM,IAAW,GACd,MAA+C;EAC9C,IAAM,IAAuB;GAC3B,IAAI,OAAO,uBAAuB;GAClC,OAAO,EAAa;GACpB,aAAa,EAAa;GAC1B,UAAU,EAAa,YAAY;EACrC;EAEA,OADA,GAAW,MAAW,CAAC,GAAG,GAAS,CAAK,CAAC,SAC5B;GACX,GAAW,MAAW,EAAQ,QAAO,MAAQ,EAAK,OAAO,EAAM,EAAE,CAAC;EACpE;CACF,GACA,CAAC,CAAU,CACb,GAEM,IAAe,SACZ,EAAE,YAAS,IAClB,CAAC,CAAQ,CACX;CA6BA,OA3BA,QAAgB;EAEd,IAAM,IACJ,EAAc,MAAK,MAAS,EAAM,UAAU,KAAA,CAAS,GAAG,SACxD;EAEF,AAAI,MAAkB,KAAA,KAAa,SAAS,UAAU,MACpD,SAAS,QAAQ;EAGnB,IAAM,IAAqB,SAAS,cAClC,4BACF;EACA,IAAI,GAAoB;GACtB,IAAM,IACJ,EAAc,MAAK,MAAS,EAAM,gBAAgB,KAAA,CAAS,GACvD,eAAe;GAErB,AACE,OAAO,KAAwB,YAC/B,EAAmB,aAAa,SAAS,MAAM,KAE/C,EAAmB,aAAa,WAAW,CAAmB;EAElE;CACF,GAAG;EAAC;EAAc;EAAoB;CAAa,CAAC,GAGlD,kBAAC,EAAwB,UAAzB;EAAkC,OAAO;EACtC;CAC+B,CAAA;AAEtC;AAEA,SAAgB,EACd,GACA;CACA,IAAM,IAAU,EAAW,CAAuB,GAC5C,EAAE,UAAO,gBAAa,gBAAa;CAEzC,QACM,IACK,EAAQ,SAAS;EAAE;EAAO;EAAa;CAAS,CAAC,IAEnD,GACN;EAAC;EAAS;EAAO;EAAa;CAAQ,CAAC;AAC5C"}
1
+ {"version":3,"file":"DocumentMetadataContext.js","names":[],"sources":["../../../src/utils/context/DocumentMetadataContext.tsx"],"sourcesContent":["import {\n PropsWithChildren,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react'\nimport noop from 'lodash-es/noop'\n\nexport type DocumentMetadataRegistration = {\n title?: string\n description?: string\n priority?: number\n}\n\ntype DocumentMetadataContextValue = {\n register: (registration: DocumentMetadataRegistration) => () => void\n}\n\ntype DocumentMetadataProviderProps = PropsWithChildren<{\n defaultTitle?: string\n defaultDescription?: string\n}>\n\ntype MetadataEntry = {\n id: symbol\n title?: string\n description?: string\n priority: number\n}\n\nconst DocumentMetadataContext = createContext<\n DocumentMetadataContextValue | undefined\n>(undefined)\n\nexport function DocumentMetadataProvider(props: DocumentMetadataProviderProps) {\n // Centralizes document.title/meta description writes so consumers can register values\n // with priorities; highest priority wins, then portal defaults\n const { children, defaultTitle, defaultDescription } = props\n const [entries, setEntries] = useState<MetadataEntry[]>([])\n\n // Keep registrations stable between renders and automatically clean up on unmount.\n const sortedEntries = useMemo(\n () => [...entries].toSorted((a, b) => b.priority - a.priority),\n [entries],\n )\n\n const register = useCallback(\n (registration: DocumentMetadataRegistration) => {\n const entry: MetadataEntry = {\n id: Symbol('DocumentMetadataEntry'),\n title: registration.title,\n description: registration.description,\n priority: registration.priority ?? 0,\n }\n setEntries(current => [...current, entry])\n return () => {\n setEntries(current => current.filter(item => item.id !== entry.id))\n }\n },\n [setEntries],\n )\n\n const contextValue = useMemo<DocumentMetadataContextValue>(\n () => ({ register }),\n [register],\n )\n\n useEffect(() => {\n // Resolve the highest-priority title/description and push them to the DOM.\n const resolvedTitle =\n sortedEntries.find(entry => entry.title !== undefined)?.title ??\n defaultTitle\n\n if (resolvedTitle !== undefined && document.title !== resolvedTitle) {\n document.title = resolvedTitle\n }\n\n const descriptionElement = document.querySelector(\n 'meta[name=\"description\"]',\n )\n if (descriptionElement) {\n const resolvedDescription =\n sortedEntries.find(entry => entry.description !== undefined)\n ?.description ?? defaultDescription\n\n if (\n typeof resolvedDescription === 'string' &&\n descriptionElement.getAttribute('content') !== resolvedDescription\n ) {\n descriptionElement.setAttribute('content', resolvedDescription)\n }\n }\n }, [defaultTitle, defaultDescription, sortedEntries])\n\n return (\n <DocumentMetadataContext.Provider value={contextValue}>\n {children}\n </DocumentMetadataContext.Provider>\n )\n}\n\nexport function useDocumentMetadata(\n registration: DocumentMetadataRegistration,\n) {\n const context = useContext(DocumentMetadataContext)\n const { title, description, priority } = registration\n\n useEffect(() => {\n if (context) {\n return context.register({ title, description, priority })\n }\n return noop\n }, [context, title, description, priority])\n}\n"],"mappings":";;;;AAiCA,IAAM,IAA0B,EAE9B,KAAA,CAAS;AAEX,SAAgB,EAAyB,GAAsC;CAG7E,IAAM,EAAE,aAAU,iBAAc,0BAAuB,GACjD,CAAC,GAAS,KAAc,EAA0B,CAAC,CAAC,GAGpD,IAAgB,QACd,CAAC,GAAG,CAAO,EAAE,UAAU,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,GAC7D,CAAC,CAAO,CACV,GAEM,IAAW,GACd,MAA+C;EAC9C,IAAM,IAAuB;GAC3B,IAAI,OAAO,uBAAuB;GAClC,OAAO,EAAa;GACpB,aAAa,EAAa;GAC1B,UAAU,EAAa,YAAY;EACrC;EAEA,OADA,GAAW,MAAW,CAAC,GAAG,GAAS,CAAK,CAAC,SAC5B;GACX,GAAW,MAAW,EAAQ,QAAO,MAAQ,EAAK,OAAO,EAAM,EAAE,CAAC;EACpE;CACF,GACA,CAAC,CAAU,CACb,GAEM,IAAe,SACZ,EAAE,YAAS,IAClB,CAAC,CAAQ,CACX;CA6BA,OA3BA,QAAgB;EAEd,IAAM,IACJ,EAAc,MAAK,MAAS,EAAM,UAAU,KAAA,CAAS,GAAG,SACxD;EAEF,AAAI,MAAkB,KAAA,KAAa,SAAS,UAAU,MACpD,SAAS,QAAQ;EAGnB,IAAM,IAAqB,SAAS,cAClC,4BACF;EACA,IAAI,GAAoB;GACtB,IAAM,IACJ,EAAc,MAAK,MAAS,EAAM,gBAAgB,KAAA,CAAS,GACvD,eAAe;GAErB,AACE,OAAO,KAAwB,YAC/B,EAAmB,aAAa,SAAS,MAAM,KAE/C,EAAmB,aAAa,WAAW,CAAmB;EAElE;CACF,GAAG;EAAC;EAAc;EAAoB;CAAa,CAAC,GAGlD,kBAAC,EAAwB,UAAzB;EAAkC,OAAO;EACtC;CAC+B,CAAA;AAEtC;AAEA,SAAgB,EACd,GACA;CACA,IAAM,IAAU,EAAW,CAAuB,GAC5C,EAAE,UAAO,gBAAa,gBAAa;CAEzC,QACM,IACK,EAAQ,SAAS;EAAE;EAAO;EAAa;CAAS,CAAC,IAEnD,GACN;EAAC;EAAS;EAAO;EAAa;CAAQ,CAAC;AAC5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccessControlListUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/AccessControlListUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EACL,iBAAiB,EACjB,cAAc,IAAI,2BAA2B,EAC9C,MAAM,kCAAkC,CAAA;AAazC;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,cAAc,EAAE,EACnB,CAAC,EAAE,cAAc,EAAE,WAMpB;AAED,qHAAqH;AACrH,wBAAgB,6BAA6B,CAC3C,iBAAiB,CAAC,EAAE,GAAG,CAAC,2BAA2B,CAAC,GACnD,cAAc,EAAE,CAOlB;AAED,6HAA6H;AAC7H,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,kBAAkB,EAAE,cAAc,EAAE,GACnC,iBAAiB,CASnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAAE,EAChC,eAAe,EAAE;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GACA,OAAO,CAUT;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,cAAc,EAAE,GACrB,cAAc,EAAE,CAgBlB"}
1
+ {"version":3,"file":"AccessControlListUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/AccessControlListUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EACL,iBAAiB,EACjB,cAAc,IAAI,2BAA2B,EAC9C,MAAM,kCAAkC,CAAA;AAazC;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,cAAc,EAAE,EACnB,CAAC,EAAE,cAAc,EAAE,WAMpB;AAED,qHAAqH;AACrH,wBAAgB,6BAA6B,CAC3C,iBAAiB,CAAC,EAAE,GAAG,CAAC,2BAA2B,CAAC,GACnD,cAAc,EAAE,CAOlB;AAED,6HAA6H;AAC7H,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,kBAAkB,EAAE,cAAc,EAAE,GACnC,iBAAiB,CASnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAAE,EAChC,eAAe,EAAE;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GACA,OAAO,CAYT;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,cAAc,EAAE,GACrB,cAAc,EAAE,CAgBlB"}
@@ -21,12 +21,12 @@ function a(e, t) {
21
21
  }))), n;
22
22
  }
23
23
  function o(e, t) {
24
- let n = [
24
+ let n = new Set([
25
25
  t.authenticatedUsers,
26
26
  t.publicGroup,
27
27
  t.anonymousUser
28
- ].filter((e) => e !== void 0);
29
- return e.some((e) => n.includes(String(e.principalId)));
28
+ ].filter((e) => e !== void 0));
29
+ return e.some((e) => n.has(String(e.principalId)));
30
30
  }
31
31
  function s(e) {
32
32
  let t = /* @__PURE__ */ new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"AccessControlListUtils.js","names":[],"sources":["../../../src/utils/functions/AccessControlListUtils.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash-es'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport {\n AccessControlList,\n ResourceAccess as SynapseClientResourceAccess,\n} from '@sage-bionetworks/synapse-client'\n\nfunction sortResourceAccessList(\n resourceAccessList: ResourceAccess[],\n): ResourceAccess[] {\n const clone = cloneDeep(resourceAccessList)\n // Sort the resource access list by principal ID\n clone.sort((a, b) => b.principalId - a.principalId)\n // In each resource access, sort the access type set\n clone.forEach(ra => ra.accessType.sort())\n return clone\n}\n\n/**\n * Compares two objects for equality, ignoring the order of elements in arrays.\n * @param a\n * @param b\n */\nexport function resourceAccessListIsEqual(\n a: ResourceAccess[],\n b: ResourceAccess[],\n) {\n const aSorted = sortResourceAccessList(a)\n const bSorted = sortResourceAccessList(b)\n\n return isEqual(aSorted, bSorted)\n}\n\n/** Conversion utility to go from synapse-client ResourceAccess Set to the SRC SynapseClient ResourceAccess[] type */\nexport function convertResourceAccessSetToSRC(\n resourceAccessSet?: Set<SynapseClientResourceAccess>,\n): ResourceAccess[] {\n return Array.from(resourceAccessSet ?? []).map(item => ({\n principalId: item.principalId ?? -1,\n accessType: Array.isArray(item.accessType)\n ? (item.accessType as ACCESS_TYPE[])\n : (Array.from(item.accessType ?? []) as ACCESS_TYPE[]),\n }))\n}\n\n/** Conversion utility to go from synapse-react-client ResourceAccess[] to the synapse-client ResourceAccess Set in an ACL */\nexport function updateACLWithSRCResourceAccessList(\n acl: AccessControlList | null | undefined,\n resourceAccessList: ResourceAccess[],\n): AccessControlList {\n const newAcl = { ...acl }\n newAcl.resourceAccess = new Set(\n resourceAccessList.map(ra => ({\n principalId: ra.principalId,\n accessType: new Set(ra.accessType),\n })),\n )\n return newAcl\n}\n\n/**\n * Determines if an entity is publicly accessible by checking if any public principals\n * (authenticated users, public group, or anonymous user) have access in the resource access list.\n *\n * @param resourceAccess - The list of resource access entries to check\n * @param realmPrincipals - An object containing the principal IDs for public groups\n * @param realmPrincipals.authenticatedUsers - The principal ID for authenticated users\n * @param realmPrincipals.publicGroup - The principal ID for the public group\n * @param realmPrincipals.anonymousUser - The principal ID for anonymous users\n * @returns true if any public principal has access, false otherwise\n */\nexport function isEntityPublic(\n resourceAccess: ResourceAccess[],\n realmPrincipals: {\n authenticatedUsers?: string\n publicGroup?: string\n anonymousUser?: string\n },\n): boolean {\n const publicPrincipalIds = [\n realmPrincipals.authenticatedUsers,\n realmPrincipals.publicGroup,\n realmPrincipals.anonymousUser,\n ].filter((id): id is string => id !== undefined)\n\n return resourceAccess.some(ra =>\n publicPrincipalIds.includes(String(ra.principalId)),\n )\n}\n\n/**\n * Consolidate access types for duplicate entries for the same principal into a single entry with the union of all access types.\n */\nexport function consolidateResourceAccessList(\n list: ResourceAccess[],\n): ResourceAccess[] {\n const permissionsMap = new Map<number, Set<ACCESS_TYPE>>()\n for (const item of list) {\n const permissions = permissionsMap.get(item.principalId)\n\n if (permissions) {\n item.accessType.forEach(type => permissions.add(type))\n } else {\n permissionsMap.set(item.principalId, new Set(item.accessType))\n }\n }\n\n return Array.from(permissionsMap, ([principalId, accessTypeSet]) => ({\n principalId,\n accessType: Array.from(accessTypeSet),\n }))\n}\n"],"mappings":";;AAOA,SAAS,EACP,GACkB;CAClB,IAAM,IAAQ,EAAU,CAAkB;CAK1C,OAHA,EAAM,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW,GAElD,EAAM,SAAQ,MAAM,EAAG,WAAW,KAAK,CAAC,GACjC;AACT;AAOA,SAAgB,EACd,GACA,GACA;CAIA,OAAO,EAHS,EAAuB,CAGxB,GAFC,EAAuB,CAEf,CAAO;AACjC;AAGA,SAAgB,EACd,GACkB;CAClB,OAAO,MAAM,KAAK,KAAqB,CAAC,CAAC,EAAE,KAAI,OAAS;EACtD,aAAa,EAAK,eAAe;EACjC,YAAY,MAAM,QAAQ,EAAK,UAAU,IACpC,EAAK,aACL,MAAM,KAAK,EAAK,cAAc,CAAC,CAAC;CACvC,EAAE;AACJ;AAGA,SAAgB,EACd,GACA,GACmB;CACnB,IAAM,IAAS,EAAE,GAAG,EAAI;CAOxB,OANA,EAAO,iBAAiB,IAAI,IAC1B,EAAmB,KAAI,OAAO;EAC5B,aAAa,EAAG;EAChB,YAAY,IAAI,IAAI,EAAG,UAAU;CACnC,EAAE,CACJ,GACO;AACT;AAaA,SAAgB,EACd,GACA,GAKS;CACT,IAAM,IAAqB;EACzB,EAAgB;EAChB,EAAgB;EAChB,EAAgB;CAClB,EAAE,QAAQ,MAAqB,MAAO,KAAA,CAAS;CAE/C,OAAO,EAAe,MAAK,MACzB,EAAmB,SAAS,OAAO,EAAG,WAAW,CAAC,CACpD;AACF;AAKA,SAAgB,EACd,GACkB;CAClB,IAAM,oBAAiB,IAAI,IAA8B;CACzD,KAAK,IAAM,KAAQ,GAAM;EACvB,IAAM,IAAc,EAAe,IAAI,EAAK,WAAW;EAEvD,AAAI,IACF,EAAK,WAAW,SAAQ,MAAQ,EAAY,IAAI,CAAI,CAAC,IAErD,EAAe,IAAI,EAAK,aAAa,IAAI,IAAI,EAAK,UAAU,CAAC;CAEjE;CAEA,OAAO,MAAM,KAAK,IAAiB,CAAC,GAAa,QAAoB;EACnE;EACA,YAAY,MAAM,KAAK,CAAa;CACtC,EAAE;AACJ"}
1
+ {"version":3,"file":"AccessControlListUtils.js","names":[],"sources":["../../../src/utils/functions/AccessControlListUtils.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash-es'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport {\n AccessControlList,\n ResourceAccess as SynapseClientResourceAccess,\n} from '@sage-bionetworks/synapse-client'\n\nfunction sortResourceAccessList(\n resourceAccessList: ResourceAccess[],\n): ResourceAccess[] {\n const clone = cloneDeep(resourceAccessList)\n // Sort the resource access list by principal ID\n clone.sort((a, b) => b.principalId - a.principalId)\n // In each resource access, sort the access type set\n clone.forEach(ra => ra.accessType.sort())\n return clone\n}\n\n/**\n * Compares two objects for equality, ignoring the order of elements in arrays.\n * @param a\n * @param b\n */\nexport function resourceAccessListIsEqual(\n a: ResourceAccess[],\n b: ResourceAccess[],\n) {\n const aSorted = sortResourceAccessList(a)\n const bSorted = sortResourceAccessList(b)\n\n return isEqual(aSorted, bSorted)\n}\n\n/** Conversion utility to go from synapse-client ResourceAccess Set to the SRC SynapseClient ResourceAccess[] type */\nexport function convertResourceAccessSetToSRC(\n resourceAccessSet?: Set<SynapseClientResourceAccess>,\n): ResourceAccess[] {\n return Array.from(resourceAccessSet ?? []).map(item => ({\n principalId: item.principalId ?? -1,\n accessType: Array.isArray(item.accessType)\n ? (item.accessType as ACCESS_TYPE[])\n : (Array.from(item.accessType ?? []) as ACCESS_TYPE[]),\n }))\n}\n\n/** Conversion utility to go from synapse-react-client ResourceAccess[] to the synapse-client ResourceAccess Set in an ACL */\nexport function updateACLWithSRCResourceAccessList(\n acl: AccessControlList | null | undefined,\n resourceAccessList: ResourceAccess[],\n): AccessControlList {\n const newAcl = { ...acl }\n newAcl.resourceAccess = new Set(\n resourceAccessList.map(ra => ({\n principalId: ra.principalId,\n accessType: new Set(ra.accessType),\n })),\n )\n return newAcl\n}\n\n/**\n * Determines if an entity is publicly accessible by checking if any public principals\n * (authenticated users, public group, or anonymous user) have access in the resource access list.\n *\n * @param resourceAccess - The list of resource access entries to check\n * @param realmPrincipals - An object containing the principal IDs for public groups\n * @param realmPrincipals.authenticatedUsers - The principal ID for authenticated users\n * @param realmPrincipals.publicGroup - The principal ID for the public group\n * @param realmPrincipals.anonymousUser - The principal ID for anonymous users\n * @returns true if any public principal has access, false otherwise\n */\nexport function isEntityPublic(\n resourceAccess: ResourceAccess[],\n realmPrincipals: {\n authenticatedUsers?: string\n publicGroup?: string\n anonymousUser?: string\n },\n): boolean {\n const publicPrincipalIds = new Set(\n [\n realmPrincipals.authenticatedUsers,\n realmPrincipals.publicGroup,\n realmPrincipals.anonymousUser,\n ].filter((id): id is string => id !== undefined),\n )\n\n return resourceAccess.some(ra =>\n publicPrincipalIds.has(String(ra.principalId)),\n )\n}\n\n/**\n * Consolidate access types for duplicate entries for the same principal into a single entry with the union of all access types.\n */\nexport function consolidateResourceAccessList(\n list: ResourceAccess[],\n): ResourceAccess[] {\n const permissionsMap = new Map<number, Set<ACCESS_TYPE>>()\n for (const item of list) {\n const permissions = permissionsMap.get(item.principalId)\n\n if (permissions) {\n item.accessType.forEach(type => permissions.add(type))\n } else {\n permissionsMap.set(item.principalId, new Set(item.accessType))\n }\n }\n\n return Array.from(permissionsMap, ([principalId, accessTypeSet]) => ({\n principalId,\n accessType: Array.from(accessTypeSet),\n }))\n}\n"],"mappings":";;AAOA,SAAS,EACP,GACkB;CAClB,IAAM,IAAQ,EAAU,CAAkB;CAK1C,OAHA,EAAM,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW,GAElD,EAAM,SAAQ,MAAM,EAAG,WAAW,KAAK,CAAC,GACjC;AACT;AAOA,SAAgB,EACd,GACA,GACA;CAIA,OAAO,EAHS,EAAuB,CAGxB,GAFC,EAAuB,CAEf,CAAO;AACjC;AAGA,SAAgB,EACd,GACkB;CAClB,OAAO,MAAM,KAAK,KAAqB,CAAC,CAAC,EAAE,KAAI,OAAS;EACtD,aAAa,EAAK,eAAe;EACjC,YAAY,MAAM,QAAQ,EAAK,UAAU,IACpC,EAAK,aACL,MAAM,KAAK,EAAK,cAAc,CAAC,CAAC;CACvC,EAAE;AACJ;AAGA,SAAgB,EACd,GACA,GACmB;CACnB,IAAM,IAAS,EAAE,GAAG,EAAI;CAOxB,OANA,EAAO,iBAAiB,IAAI,IAC1B,EAAmB,KAAI,OAAO;EAC5B,aAAa,EAAG;EAChB,YAAY,IAAI,IAAI,EAAG,UAAU;CACnC,EAAE,CACJ,GACO;AACT;AAaA,SAAgB,EACd,GACA,GAKS;CACT,IAAM,IAAqB,IAAI,IAC7B;EACE,EAAgB;EAChB,EAAgB;EAChB,EAAgB;CAClB,EAAE,QAAQ,MAAqB,MAAO,KAAA,CAAS,CACjD;CAEA,OAAO,EAAe,MAAK,MACzB,EAAmB,IAAI,OAAO,EAAG,WAAW,CAAC,CAC/C;AACF;AAKA,SAAgB,EACd,GACkB;CAClB,IAAM,oBAAiB,IAAI,IAA8B;CACzD,KAAK,IAAM,KAAQ,GAAM;EACvB,IAAM,IAAc,EAAe,IAAI,EAAK,WAAW;EAEvD,AAAI,IACF,EAAK,WAAW,SAAQ,MAAQ,EAAY,IAAI,CAAI,CAAC,IAErD,EAAe,IAAI,EAAK,aAAa,IAAI,IAAI,EAAK,UAAU,CAAC;CAEjE;CAEA,OAAO,MAAM,KAAK,IAAiB,CAAC,GAAa,QAAoB;EACnE;EACA,YAAY,MAAM,KAAK,CAAa;CACtC,EAAE;AACJ"}
@@ -4,8 +4,8 @@ import n from "lodash-es/isEqual";
4
4
  import r from "lodash-es/xorWith";
5
5
  //#region src/utils/functions/ArrayUtils.ts
6
6
  function i(n) {
7
- let r = [...n], i = r[r.length - 1];
8
- for (; r.length > 0 && (i === void 0 || typeof i == "object" && t(e(i)));) r.pop(), i = r[r.length - 1];
7
+ let r = [...n], i = r.at(-1);
8
+ for (; r.length > 0 && (i === void 0 || typeof i == "object" && t(e(i)));) r.pop(), i = r.at(-1);
9
9
  return r;
10
10
  }
11
11
  function a(e, t, i = n) {
@@ -1 +1 @@
1
- {"version":3,"file":"ArrayUtils.js","names":[],"sources":["../../../src/utils/functions/ArrayUtils.ts"],"sourcesContent":["import isEmpty from 'lodash-es/isEmpty'\nimport isEqual from 'lodash-es/isEqual'\nimport xorWith from 'lodash-es/xorWith'\nimport { removeUndefined } from './ObjectUtils'\n\n/**\n * Removes trailing undefined elements from an array. Also removes trailing objects that are empty or only keys with\n * undefined values are present.\n */\nexport function removeTrailingUndefinedElements(params: unknown[]): unknown[] {\n const result = [...params]\n let lastElement = result[result.length - 1]\n while (\n result.length > 0 &&\n (lastElement === undefined ||\n // Also remove empty objects or objects where only keys with undefined values are present\n (typeof lastElement === 'object' &&\n isEmpty(removeUndefined(lastElement as Record<string, unknown>))))\n ) {\n result.pop()\n lastElement = result[result.length - 1]\n }\n return result\n}\n\n/**\n * Returns true if an item exists in one array that does not exist in another, using deep comparison by default.\n */\nexport function hasDifference(\n x: Array<unknown>,\n y: Array<unknown>,\n comparator = isEqual,\n): boolean {\n return xorWith(x, y, comparator).length > 0\n}\n\n/** Move the item at `idx` by `direction` (-1 or 1). Returns the same array reference if the move\n * would go out of bounds; otherwise a new array with the item relocated. */\nexport function moveItem<T>(arr: T[], idx: number, direction: -1 | 1): T[] {\n const newIdx = idx + direction\n if (newIdx < 0 || newIdx >= arr.length) return arr\n const next = [...arr]\n const [item] = next.splice(idx, 1)\n next.splice(newIdx, 0, item)\n return next\n}\n"],"mappings":";;;;;AASA,SAAgB,EAAgC,GAA8B;CAC5E,IAAM,IAAS,CAAC,GAAG,CAAM,GACrB,IAAc,EAAO,EAAO,SAAS;CACzC,OACE,EAAO,SAAS,MACf,MAAgB,KAAA,KAEd,OAAO,KAAgB,YACtB,EAAQ,EAAgB,CAAsC,CAAC,KAGnE,AADA,EAAO,IAAI,GACX,IAAc,EAAO,EAAO,SAAS;CAEvC,OAAO;AACT;AAKA,SAAgB,EACd,GACA,GACA,IAAa,GACJ;CACT,OAAO,EAAQ,GAAG,GAAG,CAAU,EAAE,SAAS;AAC5C;AAIA,SAAgB,EAAY,GAAU,GAAa,GAAwB;CACzE,IAAM,IAAS,IAAM;CACrB,IAAI,IAAS,KAAK,KAAU,EAAI,QAAQ,OAAO;CAC/C,IAAM,IAAO,CAAC,GAAG,CAAG,GACd,CAAC,KAAQ,EAAK,OAAO,GAAK,CAAC;CAEjC,OADA,EAAK,OAAO,GAAQ,GAAG,CAAI,GACpB;AACT"}
1
+ {"version":3,"file":"ArrayUtils.js","names":[],"sources":["../../../src/utils/functions/ArrayUtils.ts"],"sourcesContent":["import isEmpty from 'lodash-es/isEmpty'\nimport isEqual from 'lodash-es/isEqual'\nimport xorWith from 'lodash-es/xorWith'\nimport { removeUndefined } from './ObjectUtils'\n\n/**\n * Removes trailing undefined elements from an array. Also removes trailing objects that are empty or only keys with\n * undefined values are present.\n */\nexport function removeTrailingUndefinedElements(params: unknown[]): unknown[] {\n const result = [...params]\n let lastElement = result.at(-1)\n while (\n result.length > 0 &&\n (lastElement === undefined ||\n // Also remove empty objects or objects where only keys with undefined values are present\n (typeof lastElement === 'object' &&\n isEmpty(removeUndefined(lastElement as Record<string, unknown>))))\n ) {\n result.pop()\n lastElement = result.at(-1)\n }\n return result\n}\n\n/**\n * Returns true if an item exists in one array that does not exist in another, using deep comparison by default.\n */\nexport function hasDifference(\n x: Array<unknown>,\n y: Array<unknown>,\n comparator = isEqual,\n): boolean {\n return xorWith(x, y, comparator).length > 0\n}\n\n/** Move the item at `idx` by `direction` (-1 or 1). Returns the same array reference if the move\n * would go out of bounds; otherwise a new array with the item relocated. */\nexport function moveItem<T>(arr: T[], idx: number, direction: -1 | 1): T[] {\n const newIdx = idx + direction\n if (newIdx < 0 || newIdx >= arr.length) return arr\n const next = [...arr]\n const [item] = next.splice(idx, 1)\n next.splice(newIdx, 0, item)\n return next\n}\n"],"mappings":";;;;;AASA,SAAgB,EAAgC,GAA8B;CAC5E,IAAM,IAAS,CAAC,GAAG,CAAM,GACrB,IAAc,EAAO,GAAG,EAAE;CAC9B,OACE,EAAO,SAAS,MACf,MAAgB,KAAA,KAEd,OAAO,KAAgB,YACtB,EAAQ,EAAgB,CAAsC,CAAC,KAGnE,AADA,EAAO,IAAI,GACX,IAAc,EAAO,GAAG,EAAE;CAE5B,OAAO;AACT;AAKA,SAAgB,EACd,GACA,GACA,IAAa,GACJ;CACT,OAAO,EAAQ,GAAG,GAAG,CAAU,EAAE,SAAS;AAC5C;AAIA,SAAgB,EAAY,GAAU,GAAa,GAAwB;CACzE,IAAM,IAAS,IAAM;CACrB,IAAI,IAAS,KAAK,KAAU,EAAI,QAAQ,OAAO;CAC/C,IAAM,IAAO,CAAC,GAAG,CAAG,GACd,CAAC,KAAQ,EAAK,OAAO,GAAK,CAAC;CAEjC,OADA,EAAK,OAAO,GAAQ,GAAG,CAAI,GACpB;AACT"}
@@ -28,7 +28,7 @@ function l(a, o) {
28
28
  }
29
29
  function u(e) {
30
30
  let t;
31
- return e.entityType === o.file && (t = e.fileHandles.filter((t) => t.id === e.entity.dataFileHandleId)[0]), t;
31
+ return e.entityType === o.file && (t = e.fileHandles.find((t) => t.id === e.entity.dataFileHandleId)), t;
32
32
  }
33
33
  function d(e) {
34
34
  let t = "";
@@ -1 +1 @@
1
- {"version":3,"file":"FileHandleUtils.js","names":[],"sources":["../../../src/utils/functions/FileHandleUtils.ts"],"sourcesContent":["import { EntityType, UploadDestination } from '@sage-bionetworks/synapse-client'\nimport {\n CloudProviderFileHandleInterface,\n EntityBundle,\n EXTERNAL_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n ExternalFileHandle,\n ExternalGoogleCloudUploadDestination,\n ExternalObjectStoreFileHandle,\n ExternalObjectStoreUploadDestination,\n ExternalS3UploadDestination,\n ExternalUploadDestination,\n FileEntity,\n FileHandle,\n GOOGLE_CLOUD_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n PROXY_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n ProxyFileHandle,\n S3_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n UploadType,\n} from '@sage-bionetworks/synapse-types'\n\nconst SYNAPSE_STORAGE = 'Synapse Storage'\n\ntype FileHandleStorageInfo =\n | {\n endpoint: string\n bucket: string\n fileKey: string\n }\n | { url: string }\n | { location: string }\n\n/**\n * Returns storage location information for a particular file handle, where the format of the information depends on the type of file handle.\n * @param fileHandle\n */\nexport function getFileHandleStorageInfo(\n fileHandle: FileHandle,\n storageLocationUploadDestination: UploadDestination | undefined,\n): FileHandleStorageInfo {\n switch (fileHandle.concreteType) {\n case EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return {\n endpoint: (fileHandle as ExternalObjectStoreFileHandle).endpointUrl,\n bucket: (fileHandle as ExternalObjectStoreFileHandle).bucket,\n fileKey: (fileHandle as ExternalObjectStoreFileHandle).fileKey,\n }\n case PROXY_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case EXTERNAL_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return {\n url: getStorageLocationName(\n fileHandle,\n storageLocationUploadDestination,\n ),\n }\n case S3_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case GOOGLE_CLOUD_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return {\n location: getStorageLocationName(\n fileHandle,\n storageLocationUploadDestination,\n ),\n }\n default:\n throw new Error(\n `Couldn't determine location name for file handle: ${JSON.stringify(\n fileHandle,\n )}`,\n )\n }\n}\n\n/**\n * Gets the friendly name of a bucket/storage location using the file handle.\n *\n * @param fileHandle\n * @returns\n */\nexport function getStorageLocationName(\n fileHandle: FileHandle,\n storageLocationUploadDestination: UploadDestination | undefined,\n) {\n switch (fileHandle.concreteType) {\n case PROXY_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return (fileHandle as ProxyFileHandle).filePath\n case EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case S3_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case GOOGLE_CLOUD_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n if (storageLocationUploadDestination) {\n return getUploadDestinationString(storageLocationUploadDestination)\n }\n return fileHandle.concreteType ===\n EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE\n ? (fileHandle as ExternalObjectStoreFileHandle).bucket\n : (fileHandle as CloudProviderFileHandleInterface).bucketName\n case EXTERNAL_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return (fileHandle as ExternalFileHandle).externalURL\n default:\n throw new Error(\n `Couldn't determine location name for file handle: ${JSON.stringify(\n fileHandle,\n )}`,\n )\n }\n}\n\n/**\n * Gets the data file handle from an entity bundle.\n * Returns undefined if the entity does not have a data file handle that is visible to the caller.\n * @param entityBundle\n */\nexport function getDataFileHandle(\n entityBundle: EntityBundle,\n): FileHandle | undefined {\n let dataFileHandle: FileHandle | undefined = undefined\n if (entityBundle.entityType === EntityType.file) {\n dataFileHandle = entityBundle.fileHandles.filter(\n fh => fh.id === (entityBundle.entity as FileEntity).dataFileHandleId,\n )[0]\n }\n return dataFileHandle\n}\n\nexport function getUploadDestinationString(\n uploadDestination: UploadDestination,\n) {\n let uploadDestinationString = ''\n if (uploadDestination) {\n switch (uploadDestination.concreteType) {\n case 'org.sagebionetworks.repo.model.file.S3UploadDestination':\n uploadDestinationString = SYNAPSE_STORAGE\n break\n case 'org.sagebionetworks.repo.model.file.ExternalUploadDestination':\n uploadDestinationString = (\n uploadDestination as ExternalUploadDestination\n ).url\n if (uploadDestination.uploadType === UploadType.SFTP) {\n const indexOfLastSlash = uploadDestinationString.lastIndexOf('/')\n if (indexOfLastSlash) {\n uploadDestinationString = uploadDestinationString.substring(\n 0,\n indexOfLastSlash,\n )\n }\n }\n break\n case 'org.sagebionetworks.repo.model.file.ExternalS3UploadDestination':\n uploadDestinationString =\n 's3://' +\n (uploadDestination as ExternalS3UploadDestination).bucket +\n '/'\n if (\n (uploadDestination as ExternalS3UploadDestination).baseKey != null\n ) {\n uploadDestinationString += (\n uploadDestination as ExternalS3UploadDestination\n ).baseKey\n }\n break\n case 'org.sagebionetworks.repo.model.file.ExternalGoogleCloudUploadDestination':\n uploadDestinationString =\n 'gs://' +\n (uploadDestination as ExternalGoogleCloudUploadDestination).bucket +\n '/'\n if (\n (uploadDestination as ExternalGoogleCloudUploadDestination).baseKey !=\n null\n ) {\n uploadDestinationString += (\n uploadDestination as ExternalGoogleCloudUploadDestination\n ).baseKey\n }\n break\n case 'org.sagebionetworks.repo.model.file.ExternalObjectStoreUploadDestination':\n uploadDestinationString =\n (uploadDestination as ExternalObjectStoreUploadDestination)\n .endpointUrl +\n '/' +\n (uploadDestination as ExternalObjectStoreUploadDestination).bucket\n break\n }\n }\n return uploadDestinationString\n}\n"],"mappings":";;;AAqBA,IAAM,IAAkB;AAexB,SAAgB,EACd,GACA,GACuB;CACvB,QAAQ,EAAW,cAAnB;EACE,KAAK,GACH,OAAO;GACL,UAAW,EAA6C;GACxD,QAAS,EAA6C;GACtD,SAAU,EAA6C;EACzD;EACF,KAAK;EACL,KAAK,GACH,OAAO,EACL,KAAK,EACH,GACA,CACF,EACF;EACF,KAAK;EACL,KAAK,GACH,OAAO,EACL,UAAU,EACR,GACA,CACF,EACF;EACF,SACE,MAAU,MACR,qDAAqD,KAAK,UACxD,CACF,GACF;CACJ;AACF;AAQA,SAAgB,EACd,GACA,GACA;CACA,QAAQ,EAAW,cAAnB;EACE,KAAK,GACH,OAAQ,EAA+B;EACzC,KAAK;EACL,KAAK;EACL,KAAK,GAIH,OAHI,IACK,EAA2B,CAAgC,IAE7D,EAAW,iBAChB,IACG,EAA6C,SAC7C,EAAgD;EACvD,KAAK,GACH,OAAQ,EAAkC;EAC5C,SACE,MAAU,MACR,qDAAqD,KAAK,UACxD,CACF,GACF;CACJ;AACF;AAOA,SAAgB,EACd,GACwB;CACxB,IAAI;CAMJ,OALI,EAAa,eAAe,EAAW,SACzC,IAAiB,EAAa,YAAY,QACxC,MAAM,EAAG,OAAQ,EAAa,OAAsB,gBACtD,EAAE,KAEG;AACT;AAEA,SAAgB,EACd,GACA;CACA,IAAI,IAA0B;CAC9B,IAAI,GACF,QAAQ,EAAkB,cAA1B;EACE,KAAK;GACH,IAA0B;GAC1B;EACF,KAAK;GAIH,IAHA,IACE,EACA,KACE,EAAkB,eAAe,EAAW,MAAM;IACpD,IAAM,IAAmB,EAAwB,YAAY,GAAG;IAChE,AAAI,MACF,IAA0B,EAAwB,UAChD,GACA,CACF;GAEJ;GACA;EACF,KAAK;GAKH,AAJA,IACE,UACC,EAAkD,SACnD,KAEC,EAAkD,WAAW,SAE9D,KACE,EACA;GAEJ;EACF,KAAK;GAKH,AAJA,IACE,UACC,EAA2D,SAC5D,KAEC,EAA2D,WAC5D,SAEA,KACE,EACA;GAEJ;EACF,KAAK;GACH,IACG,EACE,cACH,MACC,EAA2D;GAC9D;CACJ;CAEF,OAAO;AACT"}
1
+ {"version":3,"file":"FileHandleUtils.js","names":[],"sources":["../../../src/utils/functions/FileHandleUtils.ts"],"sourcesContent":["import { EntityType, UploadDestination } from '@sage-bionetworks/synapse-client'\nimport {\n CloudProviderFileHandleInterface,\n EntityBundle,\n EXTERNAL_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n ExternalFileHandle,\n ExternalGoogleCloudUploadDestination,\n ExternalObjectStoreFileHandle,\n ExternalObjectStoreUploadDestination,\n ExternalS3UploadDestination,\n ExternalUploadDestination,\n FileEntity,\n FileHandle,\n GOOGLE_CLOUD_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n PROXY_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n ProxyFileHandle,\n S3_FILE_HANDLE_CONCRETE_TYPE_VALUE,\n UploadType,\n} from '@sage-bionetworks/synapse-types'\n\nconst SYNAPSE_STORAGE = 'Synapse Storage'\n\ntype FileHandleStorageInfo =\n | {\n endpoint: string\n bucket: string\n fileKey: string\n }\n | { url: string }\n | { location: string }\n\n/**\n * Returns storage location information for a particular file handle, where the format of the information depends on the type of file handle.\n * @param fileHandle\n */\nexport function getFileHandleStorageInfo(\n fileHandle: FileHandle,\n storageLocationUploadDestination: UploadDestination | undefined,\n): FileHandleStorageInfo {\n switch (fileHandle.concreteType) {\n case EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return {\n endpoint: (fileHandle as ExternalObjectStoreFileHandle).endpointUrl,\n bucket: (fileHandle as ExternalObjectStoreFileHandle).bucket,\n fileKey: (fileHandle as ExternalObjectStoreFileHandle).fileKey,\n }\n case PROXY_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case EXTERNAL_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return {\n url: getStorageLocationName(\n fileHandle,\n storageLocationUploadDestination,\n ),\n }\n case S3_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case GOOGLE_CLOUD_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return {\n location: getStorageLocationName(\n fileHandle,\n storageLocationUploadDestination,\n ),\n }\n default:\n throw new Error(\n `Couldn't determine location name for file handle: ${JSON.stringify(\n fileHandle,\n )}`,\n )\n }\n}\n\n/**\n * Gets the friendly name of a bucket/storage location using the file handle.\n *\n * @param fileHandle\n * @returns\n */\nexport function getStorageLocationName(\n fileHandle: FileHandle,\n storageLocationUploadDestination: UploadDestination | undefined,\n) {\n switch (fileHandle.concreteType) {\n case PROXY_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return (fileHandle as ProxyFileHandle).filePath\n case EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case S3_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n case GOOGLE_CLOUD_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n if (storageLocationUploadDestination) {\n return getUploadDestinationString(storageLocationUploadDestination)\n }\n return fileHandle.concreteType ===\n EXTERNAL_OBJECT_STORE_FILE_HANDLE_CONCRETE_TYPE_VALUE\n ? (fileHandle as ExternalObjectStoreFileHandle).bucket\n : (fileHandle as CloudProviderFileHandleInterface).bucketName\n case EXTERNAL_FILE_HANDLE_CONCRETE_TYPE_VALUE:\n return (fileHandle as ExternalFileHandle).externalURL\n default:\n throw new Error(\n `Couldn't determine location name for file handle: ${JSON.stringify(\n fileHandle,\n )}`,\n )\n }\n}\n\n/**\n * Gets the data file handle from an entity bundle.\n * Returns undefined if the entity does not have a data file handle that is visible to the caller.\n * @param entityBundle\n */\nexport function getDataFileHandle(\n entityBundle: EntityBundle,\n): FileHandle | undefined {\n let dataFileHandle: FileHandle | undefined = undefined\n if (entityBundle.entityType === EntityType.file) {\n dataFileHandle = entityBundle.fileHandles.find(\n fh => fh.id === (entityBundle.entity as FileEntity).dataFileHandleId,\n )\n }\n return dataFileHandle\n}\n\nexport function getUploadDestinationString(\n uploadDestination: UploadDestination,\n) {\n let uploadDestinationString = ''\n if (uploadDestination) {\n switch (uploadDestination.concreteType) {\n case 'org.sagebionetworks.repo.model.file.S3UploadDestination':\n uploadDestinationString = SYNAPSE_STORAGE\n break\n case 'org.sagebionetworks.repo.model.file.ExternalUploadDestination':\n uploadDestinationString = (\n uploadDestination as ExternalUploadDestination\n ).url\n if (uploadDestination.uploadType === UploadType.SFTP) {\n const indexOfLastSlash = uploadDestinationString.lastIndexOf('/')\n if (indexOfLastSlash) {\n uploadDestinationString = uploadDestinationString.substring(\n 0,\n indexOfLastSlash,\n )\n }\n }\n break\n case 'org.sagebionetworks.repo.model.file.ExternalS3UploadDestination':\n uploadDestinationString =\n 's3://' +\n (uploadDestination as ExternalS3UploadDestination).bucket +\n '/'\n if (\n (uploadDestination as ExternalS3UploadDestination).baseKey != null\n ) {\n uploadDestinationString += (\n uploadDestination as ExternalS3UploadDestination\n ).baseKey\n }\n break\n case 'org.sagebionetworks.repo.model.file.ExternalGoogleCloudUploadDestination':\n uploadDestinationString =\n 'gs://' +\n (uploadDestination as ExternalGoogleCloudUploadDestination).bucket +\n '/'\n if (\n (uploadDestination as ExternalGoogleCloudUploadDestination).baseKey !=\n null\n ) {\n uploadDestinationString += (\n uploadDestination as ExternalGoogleCloudUploadDestination\n ).baseKey\n }\n break\n case 'org.sagebionetworks.repo.model.file.ExternalObjectStoreUploadDestination':\n uploadDestinationString =\n (uploadDestination as ExternalObjectStoreUploadDestination)\n .endpointUrl +\n '/' +\n (uploadDestination as ExternalObjectStoreUploadDestination).bucket\n break\n }\n }\n return uploadDestinationString\n}\n"],"mappings":";;;AAqBA,IAAM,IAAkB;AAexB,SAAgB,EACd,GACA,GACuB;CACvB,QAAQ,EAAW,cAAnB;EACE,KAAK,GACH,OAAO;GACL,UAAW,EAA6C;GACxD,QAAS,EAA6C;GACtD,SAAU,EAA6C;EACzD;EACF,KAAK;EACL,KAAK,GACH,OAAO,EACL,KAAK,EACH,GACA,CACF,EACF;EACF,KAAK;EACL,KAAK,GACH,OAAO,EACL,UAAU,EACR,GACA,CACF,EACF;EACF,SACE,MAAU,MACR,qDAAqD,KAAK,UACxD,CACF,GACF;CACJ;AACF;AAQA,SAAgB,EACd,GACA,GACA;CACA,QAAQ,EAAW,cAAnB;EACE,KAAK,GACH,OAAQ,EAA+B;EACzC,KAAK;EACL,KAAK;EACL,KAAK,GAIH,OAHI,IACK,EAA2B,CAAgC,IAE7D,EAAW,iBAChB,IACG,EAA6C,SAC7C,EAAgD;EACvD,KAAK,GACH,OAAQ,EAAkC;EAC5C,SACE,MAAU,MACR,qDAAqD,KAAK,UACxD,CACF,GACF;CACJ;AACF;AAOA,SAAgB,EACd,GACwB;CACxB,IAAI;CAMJ,OALI,EAAa,eAAe,EAAW,SACzC,IAAiB,EAAa,YAAY,MACxC,MAAM,EAAG,OAAQ,EAAa,OAAsB,gBACtD,IAEK;AACT;AAEA,SAAgB,EACd,GACA;CACA,IAAI,IAA0B;CAC9B,IAAI,GACF,QAAQ,EAAkB,cAA1B;EACE,KAAK;GACH,IAA0B;GAC1B;EACF,KAAK;GAIH,IAHA,IACE,EACA,KACE,EAAkB,eAAe,EAAW,MAAM;IACpD,IAAM,IAAmB,EAAwB,YAAY,GAAG;IAChE,AAAI,MACF,IAA0B,EAAwB,UAChD,GACA,CACF;GAEJ;GACA;EACF,KAAK;GAKH,AAJA,IACE,UACC,EAAkD,SACnD,KAEC,EAAkD,WAAW,SAE9D,KACE,EACA;GAEJ;EACF,KAAK;GAKH,AAJA,IACE,UACC,EAA2D,SAC5D,KAEC,EAA2D,WAC5D,SAEA,KACE,EACA;GAEJ;EACF,KAAK;GACH,IACG,EACE,cACH,MACC,EAA2D;GAC9D;CACJ;CAEF,OAAO;AACT"}
@@ -23,7 +23,7 @@ function s(e) {
23
23
  }
24
24
  var c = /\]\(([^)]+)\)/;
25
25
  function l(e) {
26
- return e.match(c)?.[1] ?? e;
26
+ return c.exec(e)?.[1] ?? e;
27
27
  }
28
28
  //#endregion
29
29
  export { r as DOI_REGEX, c as MARKDOWN_LINK_HREF_REGEX, n as RegularExpressions_exports, a as SYNAPSE_ENTITY_ID_REGEX, o as SYNAPSE_ENTITY_ID_TOKEN_REGEX, i as convertDoiToLink, l as extractMarkdownLinkHref, s as parseSynId };
@@ -1 +1 @@
1
- {"version":3,"file":"RegularExpressions.js","names":[],"sources":["../../../src/utils/functions/RegularExpressions.ts"],"sourcesContent":["import { Reference } from '@sage-bionetworks/synapse-types'\nimport { normalizeSynPrefix } from './EntityTypeUtils'\n\n// doi regex here - https://www.crossref.org/blog/dois-and-matching-regular-expressions/\n// note - had to add an escape character for the second and third forward slash in the regex above\nexport const DOI_REGEX = /^10.\\d{4,9}\\/[-._;()/:a-z0-9]+$/i\n\nexport function convertDoiToLink(doi: string) {\n doi = doi.trim()\n if (DOI_REGEX.test(doi)) {\n return `https://dx.doi.org/${doi}`\n }\n return ''\n}\n\n/**\n * Checks for a Synapse ID, with or without a version number.\n * Captures the synId and version number into capture groups.\n *\n * Usage examples:\n * > const result = 'syn123.9'.match(SYNAPSE_ENTITY_ID_REGEX)\n * > result[0]\n * 'syn123.9'\n * > result[1]\n * 'syn123'\n * > result[2]\n * '9'\n */\nexport const SYNAPSE_ENTITY_ID_REGEX = /^(syn\\d+)(?:\\.(\\d+))?$/i\n\n/**\n * Detects a Synapse entity ID token (e.g. `syn12345` or `syn12345.4`) embedded\n * anywhere in a larger string, using word boundaries so ordinary words like\n * `synapse` or `synonyms` don't match. Use `SYNAPSE_ENTITY_ID_REGEX` when\n * validating a whole string, and this pattern when scanning free text.\n */\nexport const SYNAPSE_ENTITY_ID_TOKEN_REGEX = /\\bsyn\\d+(?:\\.\\d+)?\\b/iu\n\n/**\n * Given a Synapse Entity ID of the form `syn123` or `syn123.4`, returns the\n * Reference object containing the entity ID and optional version number.\n * If the ID is not a valid Synapse Entity ID, returns null.\n * @param synId\n */\nexport function parseSynId(synId: string): Reference | null {\n const synIdMatch = SYNAPSE_ENTITY_ID_REGEX.exec(synId)\n if (synIdMatch) {\n return {\n targetId: normalizeSynPrefix(synIdMatch[1]),\n targetVersionNumber: synIdMatch[2] ? parseInt(synIdMatch[2]) : undefined,\n }\n } else {\n return synIdMatch\n }\n}\n\n/**\n * Matches the href portion of a markdown link, e.g. `[label](https://example.com)`\n * captures `https://example.com`.\n */\nexport const MARKDOWN_LINK_HREF_REGEX = /\\]\\(([^)]+)\\)/\n\n/**\n * Given a string that may be a markdown link (e.g. `[label](https://example.com)`),\n * returns the extracted href. If the string is not a markdown link, returns it unchanged.\n */\nexport function extractMarkdownLinkHref(value: string): string {\n return value.match(MARKDOWN_LINK_HREF_REGEX)?.[1] ?? value\n}\n"],"mappings":";;;;;;;;;;;IAKa,IAAY;AAEzB,SAAgB,EAAiB,GAAa;CAK5C,OAJA,IAAM,EAAI,KAAK,GACX,EAAU,KAAK,CAAG,IACb,sBAAsB,MAExB;AACT;AAeA,IAAa,IAA0B,2BAQ1B,IAAgC;AAQ7C,SAAgB,EAAW,GAAiC;CAC1D,IAAM,IAAa,EAAwB,KAAK,CAAK;CAOnD,OANE,KACK;EACL,UAAU,EAAmB,EAAW,EAAE;EAC1C,qBAAqB,EAAW,KAAK,SAAS,EAAW,EAAE,IAAI,KAAA;CACjE;AAIJ;AAMA,IAAa,IAA2B;AAMxC,SAAgB,EAAwB,GAAuB;CAC7D,OAAO,EAAM,MAAM,CAAwB,IAAI,MAAM;AACvD"}
1
+ {"version":3,"file":"RegularExpressions.js","names":[],"sources":["../../../src/utils/functions/RegularExpressions.ts"],"sourcesContent":["import { Reference } from '@sage-bionetworks/synapse-types'\nimport { normalizeSynPrefix } from './EntityTypeUtils'\n\n// doi regex here - https://www.crossref.org/blog/dois-and-matching-regular-expressions/\n// note - had to add an escape character for the second and third forward slash in the regex above\nexport const DOI_REGEX = /^10.\\d{4,9}\\/[-._;()/:a-z0-9]+$/i\n\nexport function convertDoiToLink(doi: string) {\n doi = doi.trim()\n if (DOI_REGEX.test(doi)) {\n return `https://dx.doi.org/${doi}`\n }\n return ''\n}\n\n/**\n * Checks for a Synapse ID, with or without a version number.\n * Captures the synId and version number into capture groups.\n *\n * Usage examples:\n * > const result = 'syn123.9'.match(SYNAPSE_ENTITY_ID_REGEX)\n * > result[0]\n * 'syn123.9'\n * > result[1]\n * 'syn123'\n * > result[2]\n * '9'\n */\nexport const SYNAPSE_ENTITY_ID_REGEX = /^(syn\\d+)(?:\\.(\\d+))?$/i\n\n/**\n * Detects a Synapse entity ID token (e.g. `syn12345` or `syn12345.4`) embedded\n * anywhere in a larger string, using word boundaries so ordinary words like\n * `synapse` or `synonyms` don't match. Use `SYNAPSE_ENTITY_ID_REGEX` when\n * validating a whole string, and this pattern when scanning free text.\n */\nexport const SYNAPSE_ENTITY_ID_TOKEN_REGEX = /\\bsyn\\d+(?:\\.\\d+)?\\b/iu\n\n/**\n * Given a Synapse Entity ID of the form `syn123` or `syn123.4`, returns the\n * Reference object containing the entity ID and optional version number.\n * If the ID is not a valid Synapse Entity ID, returns null.\n * @param synId\n */\nexport function parseSynId(synId: string): Reference | null {\n const synIdMatch = SYNAPSE_ENTITY_ID_REGEX.exec(synId)\n if (synIdMatch) {\n return {\n targetId: normalizeSynPrefix(synIdMatch[1]),\n targetVersionNumber: synIdMatch[2] ? parseInt(synIdMatch[2]) : undefined,\n }\n } else {\n return synIdMatch\n }\n}\n\n/**\n * Matches the href portion of a markdown link, e.g. `[label](https://example.com)`\n * captures `https://example.com`.\n */\nexport const MARKDOWN_LINK_HREF_REGEX = /\\]\\(([^)]+)\\)/\n\n/**\n * Given a string that may be a markdown link (e.g. `[label](https://example.com)`),\n * returns the extracted href. If the string is not a markdown link, returns it unchanged.\n */\nexport function extractMarkdownLinkHref(value: string): string {\n return MARKDOWN_LINK_HREF_REGEX.exec(value)?.[1] ?? value\n}\n"],"mappings":";;;;;;;;;;;IAKa,IAAY;AAEzB,SAAgB,EAAiB,GAAa;CAK5C,OAJA,IAAM,EAAI,KAAK,GACX,EAAU,KAAK,CAAG,IACb,sBAAsB,MAExB;AACT;AAeA,IAAa,IAA0B,2BAQ1B,IAAgC;AAQ7C,SAAgB,EAAW,GAAiC;CAC1D,IAAM,IAAa,EAAwB,KAAK,CAAK;CAOnD,OANE,KACK;EACL,UAAU,EAAmB,EAAW,EAAE;EAC1C,qBAAqB,EAAW,KAAK,SAAS,EAAW,EAAE,IAAI,KAAA;CACjE;AAIJ;AAMA,IAAa,IAA2B;AAMxC,SAAgB,EAAwB,GAAuB;CAC7D,OAAO,EAAyB,KAAK,CAAK,IAAI,MAAM;AACtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"StringUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/StringUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAM,UAK1E;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,UAW3C;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAc9D;AAID,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,sPAqBnD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAczD;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAY,GAAG,MAAM,EAAE,CAEvE"}
1
+ {"version":3,"file":"StringUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/StringUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAM,UAK1E;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CASrD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,UAa3C;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAc9D;AAID,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,sPAqBnD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAczD;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAY,GAAG,MAAM,EAAE,CAEvE"}
@@ -39,8 +39,7 @@ function s(e) {
39
39
  });
40
40
  }
41
41
  function c(e, t) {
42
- let n = e.split(/[\\/]/);
43
- return `${n[n.length - 1].replace(/\.[^/.]+$/, "")}.${t}`;
42
+ return `${e.split(/[\\/]/).at(-1).replace(/\.[^/.]+$/, "")}.${t}`;
44
43
  }
45
44
  function l(e) {
46
45
  let t;
@@ -1 +1 @@
1
- {"version":3,"file":"StringUtils.js","names":[],"sources":["../../../src/utils/functions/StringUtils.ts"],"sourcesContent":["import { parseSynId, SYNAPSE_ENTITY_ID_REGEX } from './RegularExpressions'\n\n/**\n * Truncates a string to be a specified length, then optionally append a suffix.\n */\nexport function truncateString(str: string, maxLength: number, suffix = '…') {\n if (str.length <= maxLength) {\n return str\n }\n return str.substring(0, maxLength) + suffix\n}\n\nexport function hex2ascii(inputString: string): string {\n const hex: string = inputString.toString()\n let str: string = ''\n for (let n = 0; n < hex.length; n += 2) {\n str += String.fromCharCode(parseInt(hex.substring(n, n + 2), 16))\n }\n return str\n}\n\n/**\n * Returns a hash code from a string. Uses Java's String.hashCode() algorithm: https://devdocs.io/openjdk~8/java/lang/string#hashCode--\n * @param {String} str The string to hash.\n * @return {Number} A 32bit integer\n * @see https://stackoverflow.com/a/8831937\n */\nexport function hashCode(str?: string | null) {\n if (str == null) {\n str = ''\n }\n let hash = 0\n for (let i = 0, len = str.length; i < len; i++) {\n const chr = str.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return hash\n}\n\nexport function normalizeNumericId(id: string | number): number {\n if (id == null) {\n return NaN\n }\n if (typeof id === 'number') {\n return id\n }\n if (id.match(SYNAPSE_ENTITY_ID_REGEX)) {\n // parse the ID to remove a possible version suffix ('syn123.4' -> 'syn123')\n const entityId = parseSynId(id)!.targetId\n return parseInt(entityId.substring('syn'.length))\n } else {\n return parseInt(id)\n }\n}\n\n// Used for client-side validation. Note, the server has the final say. Integration tested in ChangePassword.integration.test.tsx\n// See https://github.com/Sage-Bionetworks/Synapse-Repository-Services/blob/develop/services/repository-managers/src/main/java/org/sagebionetworks/repo/manager/password/PasswordValidatorImpl.java#L47 for rules\nexport function validatePassword(newPassword: string) {\n if (newPassword.trim().length < 8) {\n return 'A valid password must be at least 8 characters long'\n }\n const hasLetter = /[a-zA-Z]/.test(newPassword) // Checks for at least one letter\n if (!hasLetter) {\n return 'A valid password must include letters'\n }\n\n const hasNumber = /\\d/.test(newPassword) // Checks for at least one number\n if (!hasNumber) {\n return 'A valid password must include digits (0-9)'\n }\n\n const hasSpecialChar = /[~!@#$%^&*_\\-+=`|\\\\(){}[\\]:;\"'<>,.?/]/.test(\n newPassword,\n ) // Checks for at least one special character\n if (!hasSpecialChar) {\n return 'A valid password must include special characters ~!@#$%^&*_-+=`|\\\\(){}[]:;\"\\'<>,.?/'\n }\n return undefined\n}\n\nexport function copyStringToClipboard(value: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // PORTALS-3571: setTimeout necessary on Safari\n setTimeout(() => {\n // use the Clipboard API\n // https://caniuse.com/mdn-api_clipboard_writetext\n navigator.clipboard.writeText(value).then(resolve).catch(reject)\n }, 0)\n })\n}\n\nexport function replaceFileExtension(\n filePath: string,\n extension: string,\n): string {\n const pathParts = filePath.split(/[\\\\/]/) // split on both '/' and '\\'\n const filename = pathParts[pathParts.length - 1] // last part of path\n const baseName = filename.replace(/\\.[^/.]+$/, '') // remove extension\n return `${baseName}.${extension}`\n}\n\nexport function stringListToArray(input: string): string[] {\n let inputArray: string[]\n\n if (Array.isArray(input)) {\n inputArray = input.map(String)\n } else {\n try {\n const parsed = JSON.parse(input ?? '[]')\n inputArray = Array.isArray(parsed) ? parsed.map(String) : [String(parsed)]\n } catch {\n inputArray = input ? [String(input)] : []\n }\n }\n return inputArray\n}\n\n// Split a value by a separator and remove leading/trailing spaces\nexport function splitAndTrim(value: string, sep: string = ','): string[] {\n return value?.split(sep).map(v => v.trim()) ?? []\n}\n"],"mappings":";;AAKA,SAAgB,EAAe,GAAa,GAAmB,IAAS,KAAK;CAI3E,OAHI,EAAI,UAAU,IACT,IAEF,EAAI,UAAU,GAAG,CAAS,IAAI;AACvC;AAEA,SAAgB,EAAU,GAA6B;CACrD,IAAM,IAAc,EAAY,SAAS,GACrC,IAAc;CAClB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAAK,GACnC,KAAO,OAAO,aAAa,SAAS,EAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;CAElE,OAAO;AACT;AAQA,SAAgB,EAAS,GAAqB;CAC5C,AACE,MAAM;CAER,IAAI,IAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAM,EAAI,QAAQ,IAAI,GAAK,KAAK;EAC9C,IAAM,IAAM,EAAI,WAAW,CAAC;EAE5B,AADA,KAAQ,KAAQ,KAAK,IAAO,GAC5B,KAAQ;CACV;CACA,OAAO;AACT;AAEA,SAAgB,EAAmB,GAA6B;CAC9D,IAAI,KAAM,MACR,OAAO;CAET,IAAI,OAAO,KAAO,UAChB,OAAO;CAET,IAAI,EAAG,MAAM,CAAuB,GAAG;EAErC,IAAM,IAAW,EAAW,CAAE,EAAG;EACjC,OAAO,SAAS,EAAS,UAAU,CAAY,CAAC;CAClD,OACE,OAAO,SAAS,CAAE;AAEtB;AAIA,SAAgB,EAAiB,GAAqB;CACpD,IAAI,EAAY,KAAK,EAAE,SAAS,GAC9B,OAAO;CAGT,IAAI,CADc,WAAW,KAAK,CAC7B,GACH,OAAO;CAIT,IAAI,CADc,KAAK,KAAK,CACvB,GACH,OAAO;CAMT,IAAI,CAHmB,wCAAwC,KAC7D,CAEG,GACH,OAAO;AAGX;AAEA,SAAgB,EAAsB,GAA8B;CAClE,OAAO,IAAI,SAAS,GAAS,MAAW;EAEtC,iBAAiB;GAGf,UAAU,UAAU,UAAU,CAAK,EAAE,KAAK,CAAO,EAAE,MAAM,CAAM;EACjE,GAAG,CAAC;CACN,CAAC;AACH;AAEA,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAY,EAAS,MAAM,OAAO;CAGxC,OAAO,GAFU,EAAU,EAAU,SAAS,GACpB,QAAQ,aAAa,EACrC,EAAS,GAAG;AACxB;AAEA,SAAgB,EAAkB,GAAyB;CACzD,IAAI;CAEJ,IAAI,MAAM,QAAQ,CAAK,GACrB,IAAa,EAAM,IAAI,MAAM;MAE7B,IAAI;EACF,IAAM,IAAS,KAAK,MAAM,KAAS,IAAI;EACvC,IAAa,MAAM,QAAQ,CAAM,IAAI,EAAO,IAAI,MAAM,IAAI,CAAC,OAAO,CAAM,CAAC;CAC3E,QAAQ;EACN,IAAa,IAAQ,CAAC,OAAO,CAAK,CAAC,IAAI,CAAC;CAC1C;CAEF,OAAO;AACT;AAGA,SAAgB,EAAa,GAAe,IAAc,KAAe;CACvE,OAAO,GAAO,MAAM,CAAG,EAAE,KAAI,MAAK,EAAE,KAAK,CAAC,KAAK,CAAC;AAClD"}
1
+ {"version":3,"file":"StringUtils.js","names":[],"sources":["../../../src/utils/functions/StringUtils.ts"],"sourcesContent":["import { parseSynId, SYNAPSE_ENTITY_ID_REGEX } from './RegularExpressions'\n\n/**\n * Truncates a string to be a specified length, then optionally append a suffix.\n */\nexport function truncateString(str: string, maxLength: number, suffix = '…') {\n if (str.length <= maxLength) {\n return str\n }\n return str.substring(0, maxLength) + suffix\n}\n\nexport function hex2ascii(inputString: string): string {\n const hex: string = inputString.toString()\n let str: string = ''\n for (let n = 0; n < hex.length; n += 2) {\n // Each pair is a single byte; fromCodePoint would throw on the NaN that malformed hex produces\n // oxlint-disable-next-line unicorn/prefer-code-point\n str += String.fromCharCode(parseInt(hex.substring(n, n + 2), 16))\n }\n return str\n}\n\n/**\n * Returns a hash code from a string. Uses Java's String.hashCode() algorithm: https://devdocs.io/openjdk~8/java/lang/string#hashCode--\n * @param {String} str The string to hash.\n * @return {Number} A 32bit integer\n * @see https://stackoverflow.com/a/8831937\n */\nexport function hashCode(str?: string | null) {\n if (str == null) {\n str = ''\n }\n let hash = 0\n for (let i = 0, len = str.length; i < len; i++) {\n // Java's String.hashCode() sums UTF-16 code units, so astral characters must not be read as one code point\n // oxlint-disable-next-line unicorn/prefer-code-point\n const chr = str.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return hash\n}\n\nexport function normalizeNumericId(id: string | number): number {\n if (id == null) {\n return NaN\n }\n if (typeof id === 'number') {\n return id\n }\n if (id.match(SYNAPSE_ENTITY_ID_REGEX)) {\n // parse the ID to remove a possible version suffix ('syn123.4' -> 'syn123')\n const entityId = parseSynId(id)!.targetId\n return parseInt(entityId.substring('syn'.length))\n } else {\n return parseInt(id)\n }\n}\n\n// Used for client-side validation. Note, the server has the final say. Integration tested in ChangePassword.integration.test.tsx\n// See https://github.com/Sage-Bionetworks/Synapse-Repository-Services/blob/develop/services/repository-managers/src/main/java/org/sagebionetworks/repo/manager/password/PasswordValidatorImpl.java#L47 for rules\nexport function validatePassword(newPassword: string) {\n if (newPassword.trim().length < 8) {\n return 'A valid password must be at least 8 characters long'\n }\n const hasLetter = /[a-zA-Z]/.test(newPassword) // Checks for at least one letter\n if (!hasLetter) {\n return 'A valid password must include letters'\n }\n\n const hasNumber = /\\d/.test(newPassword) // Checks for at least one number\n if (!hasNumber) {\n return 'A valid password must include digits (0-9)'\n }\n\n const hasSpecialChar = /[~!@#$%^&*_\\-+=`|\\\\(){}[\\]:;\"'<>,.?/]/.test(\n newPassword,\n ) // Checks for at least one special character\n if (!hasSpecialChar) {\n return 'A valid password must include special characters ~!@#$%^&*_-+=`|\\\\(){}[]:;\"\\'<>,.?/'\n }\n return undefined\n}\n\nexport function copyStringToClipboard(value: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // PORTALS-3571: setTimeout necessary on Safari\n setTimeout(() => {\n // use the Clipboard API\n // https://caniuse.com/mdn-api_clipboard_writetext\n navigator.clipboard.writeText(value).then(resolve).catch(reject)\n }, 0)\n })\n}\n\nexport function replaceFileExtension(\n filePath: string,\n extension: string,\n): string {\n const pathParts = filePath.split(/[\\\\/]/) // split on both '/' and '\\'\n const filename = pathParts.at(-1)! // last part of path\n const baseName = filename.replace(/\\.[^/.]+$/, '') // remove extension\n return `${baseName}.${extension}`\n}\n\nexport function stringListToArray(input: string): string[] {\n let inputArray: string[]\n\n if (Array.isArray(input)) {\n inputArray = input.map(String)\n } else {\n try {\n const parsed = JSON.parse(input ?? '[]')\n inputArray = Array.isArray(parsed) ? parsed.map(String) : [String(parsed)]\n } catch {\n inputArray = input ? [String(input)] : []\n }\n }\n return inputArray\n}\n\n// Split a value by a separator and remove leading/trailing spaces\nexport function splitAndTrim(value: string, sep: string = ','): string[] {\n return value?.split(sep).map(v => v.trim()) ?? []\n}\n"],"mappings":";;AAKA,SAAgB,EAAe,GAAa,GAAmB,IAAS,KAAK;CAI3E,OAHI,EAAI,UAAU,IACT,IAEF,EAAI,UAAU,GAAG,CAAS,IAAI;AACvC;AAEA,SAAgB,EAAU,GAA6B;CACrD,IAAM,IAAc,EAAY,SAAS,GACrC,IAAc;CAClB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAAK,GAGnC,KAAO,OAAO,aAAa,SAAS,EAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;CAElE,OAAO;AACT;AAQA,SAAgB,EAAS,GAAqB;CAC5C,AACE,MAAM;CAER,IAAI,IAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAM,EAAI,QAAQ,IAAI,GAAK,KAAK;EAG9C,IAAM,IAAM,EAAI,WAAW,CAAC;EAE5B,AADA,KAAQ,KAAQ,KAAK,IAAO,GAC5B,KAAQ;CACV;CACA,OAAO;AACT;AAEA,SAAgB,EAAmB,GAA6B;CAC9D,IAAI,KAAM,MACR,OAAO;CAET,IAAI,OAAO,KAAO,UAChB,OAAO;CAET,IAAI,EAAG,MAAM,CAAuB,GAAG;EAErC,IAAM,IAAW,EAAW,CAAE,EAAG;EACjC,OAAO,SAAS,EAAS,UAAU,CAAY,CAAC;CAClD,OACE,OAAO,SAAS,CAAE;AAEtB;AAIA,SAAgB,EAAiB,GAAqB;CACpD,IAAI,EAAY,KAAK,EAAE,SAAS,GAC9B,OAAO;CAGT,IAAI,CADc,WAAW,KAAK,CAC7B,GACH,OAAO;CAIT,IAAI,CADc,KAAK,KAAK,CACvB,GACH,OAAO;CAMT,IAAI,CAHmB,wCAAwC,KAC7D,CAEG,GACH,OAAO;AAGX;AAEA,SAAgB,EAAsB,GAA8B;CAClE,OAAO,IAAI,SAAS,GAAS,MAAW;EAEtC,iBAAiB;GAGf,UAAU,UAAU,UAAU,CAAK,EAAE,KAAK,CAAO,EAAE,MAAM,CAAM;EACjE,GAAG,CAAC;CACN,CAAC;AACH;AAEA,SAAgB,EACd,GACA,GACQ;CAIR,OAAO,GAHW,EAAS,MAAM,OAChB,EAAU,GAAG,EACb,EAAS,QAAQ,aAAa,EACrC,EAAS,GAAG;AACxB;AAEA,SAAgB,EAAkB,GAAyB;CACzD,IAAI;CAEJ,IAAI,MAAM,QAAQ,CAAK,GACrB,IAAa,EAAM,IAAI,MAAM;MAE7B,IAAI;EACF,IAAM,IAAS,KAAK,MAAM,KAAS,IAAI;EACvC,IAAa,MAAM,QAAQ,CAAM,IAAI,EAAO,IAAI,MAAM,IAAI,CAAC,OAAO,CAAM,CAAC;CAC3E,QAAQ;EACN,IAAa,IAAQ,CAAC,OAAO,CAAK,CAAC,IAAI,CAAC;CAC1C;CAEF,OAAO;AACT;AAGA,SAAgB,EAAa,GAAe,IAAc,KAAe;CACvE,OAAO,GAAO,MAAM,CAAG,EAAE,KAAI,MAAK,EAAE,KAAK,CAAC,KAAK,CAAC;AAClD"}
@@ -5,12 +5,12 @@ async function n(e) {
5
5
  let t = new TextEncoder().encode(e), n = new CompressionStream("gzip"), r = n.writable.getWriter(), i = new Response(n.readable).arrayBuffer();
6
6
  await r.write(t), await r.close();
7
7
  let a = await i, o = new Uint8Array(a), s = "";
8
- for (let e = 0; e < o.length; e++) s += String.fromCharCode(o[e]);
8
+ for (let e of o) s += String.fromCodePoint(e);
9
9
  return btoa(s);
10
10
  }
11
11
  async function r(e) {
12
12
  let t = atob(e), n = new Uint8Array(t.length);
13
- for (let e = 0; e < t.length; e++) n[e] = t.charCodeAt(e);
13
+ for (let e = 0; e < t.length; e++) n[e] = t.codePointAt(e);
14
14
  let r = new DecompressionStream("gzip"), i = r.writable.getWriter(), a = new Response(r.readable).arrayBuffer();
15
15
  await i.write(n), await i.close();
16
16
  let o = await a;
@@ -1 +1 @@
1
- {"version":3,"file":"deepLinkingUtils.js","names":[],"sources":["../../../src/utils/functions/deepLinkingUtils.ts"],"sourcesContent":["import { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { isEqual } from 'lodash-es'\nimport { parseEntityIdFromSqlStatement } from './SqlFunctions'\n\n/**\n * Compresses a string using the browser's CompressionStream API and returns base64.\n * @param str - The string to compress\n * @returns Base64-encoded compressed string\n */\nasync function compressString(str: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(str)\n\n const compressionStream = new CompressionStream('gzip')\n const writer = compressionStream.writable.getWriter()\n\n // Start consuming from the readable side immediately to prevent backpressure deadlock\n const readPromise = new Response(compressionStream.readable).arrayBuffer()\n\n await writer.write(data)\n await writer.close()\n\n const compressedArrayBuffer = await readPromise\n\n // Convert to base64\n const bytes = new Uint8Array(compressedArrayBuffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\n/**\n * Decompresses a base64-encoded gzip string using the browser's DecompressionStream API.\n * @param base64Str - The base64-encoded compressed string\n * @returns The decompressed string\n */\nasync function decompressString(base64Str: string): Promise<string> {\n // Convert from base64 to Uint8Array\n const binary = atob(base64Str)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n\n const decompressionStream = new DecompressionStream('gzip')\n const writer = decompressionStream.writable.getWriter()\n\n // Start consuming from the readable side immediately to prevent backpressure deadlock\n const readPromise = new Response(decompressionStream.readable).arrayBuffer()\n\n await writer.write(bytes)\n await writer.close()\n\n const decompressedArrayBuffer = await readPromise\n\n const decoder = new TextDecoder()\n return decoder.decode(decompressedArrayBuffer)\n}\n\n//id consists of a component class/function name and it's index\nfunction getComponentSearchHashId(\n componentName: string,\n componentIndex: number,\n): string {\n return `${componentName}${componentIndex}`\n}\n\n/**\n * Computes the difference between the current query and the initial query.\n * Returns only the fields that differ from the initial query.\n * Dynamically handles all fields in the Query type, making it safe for future changes.\n * @param currentQuery - The current query state\n * @param initQuery - The initial query state\n * @returns A partial Query object containing only the differences, or null if queries are equal\n */\nfunction computeQueryDiff(\n currentQuery: Query,\n initQuery: Query,\n): Partial<Query> | null {\n if (isEqual(currentQuery, initQuery)) {\n return null\n }\n\n const diff: Partial<Query> = {}\n\n // Get the union of keys from both currentQuery and initQuery to handle\n // both additions/changes and removals/omissions\n const allKeys = new Set([\n ...Object.keys(currentQuery),\n ...Object.keys(initQuery),\n ]) as Set<keyof Query>\n\n for (const key of allKeys) {\n if (!isEqual(currentQuery[key], initQuery[key])) {\n // Type assertion needed for dynamic key assignment\n // Include currentQuery[key] even if undefined to represent removals\n ;(diff as any)[key] = currentQuery[key]\n }\n }\n\n return Object.keys(diff).length > 0 ? diff : null\n}\n\n/**\n * Applies a query diff to the initial query to reconstruct the current query.\n * @param initQuery - The initial query state\n * @param diff - The partial query containing only the differences\n * @returns The reconstructed query\n */\nfunction applyQueryDiff(initQuery: Query, diff: Partial<Query>): Query {\n return {\n ...initQuery,\n ...diff,\n }\n}\n\n/**\n * Updates the url with the components' new search params. Stores only the\n * differences between currentQuery and initQuery, compressed with gzip and base64-encoded.\n * If the queries are equal, the search param will be removed.\n * @param componentName\n * @param componentIndex\n * @param currentQuery - The current query state, or null to remove the param\n * @param initQuery - The initial query state to compute diff against\n */\nexport async function updateUrlWithNewSearchParam(\n componentName: string,\n componentIndex: number | undefined,\n currentQuery: Query | null,\n initQuery: Query | null,\n): Promise<void> {\n const componentSearchHashId =\n componentIndex !== undefined\n ? getComponentSearchHashId(componentName, componentIndex)\n : componentName\n\n const currentSearch = new URLSearchParams(window.location.search)\n\n if (currentQuery && initQuery) {\n const diff = computeQueryDiff(currentQuery, initQuery)\n if (diff) {\n // Compress the diff and encode as base64\n const jsonString = JSON.stringify(diff)\n const compressed = await compressString(jsonString)\n currentSearch.set(componentSearchHashId, compressed)\n } else {\n // Queries are equal, remove the param\n currentSearch.delete(componentSearchHashId)\n }\n } else {\n // No current query or no init query, remove the param\n currentSearch.delete(componentSearchHashId)\n }\n\n const searchString = currentSearch.toString()\n window.history.replaceState(\n window.history.state,\n '',\n window.location.pathname +\n (Array.from(currentSearch).length > 0\n ? `?${searchString.toString()}`\n : ''),\n )\n}\n\n/**\n * Retrieves a query request from the URL by applying the stored diff to the initial query.\n * @param componentIndex\n * @param initQuery - The initial query to apply the diff to\n * @returns A partial QueryBundleRequest with the reconstructed query, or undefined if no diff is stored\n */\nexport async function getQueryRequestFromLink(\n componentIndex: number,\n initQuery: Query,\n): Promise<Partial<QueryBundleRequest> | undefined> {\n const paramKey = getComponentSearchHashId('qw', componentIndex)\n const searchParamValue = new URLSearchParams(window.location.search).get(\n paramKey,\n )\n\n let queryRequest: Partial<QueryBundleRequest> | undefined = undefined\n if (searchParamValue) {\n try {\n // Decompress and parse the diff from the URL\n const jsonString = await decompressString(searchParamValue)\n const diff = JSON.parse(jsonString) as Partial<Query>\n // Apply the diff to the init query to reconstruct the current query\n const query = applyQueryDiff(initQuery, diff)\n if (query.sql) {\n queryRequest = {\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: parseEntityIdFromSqlStatement(query.sql),\n query,\n }\n }\n } catch (error) {\n console.error('Failed to parse query diff from URL:', error)\n }\n }\n\n // check for legacy search param for backward compatibility, but prioritize the new format if both are present\n const legacyParamKey = getComponentSearchHashId(\n 'QueryWrapper',\n componentIndex,\n )\n const legacySearchParamValue = new URLSearchParams(\n window.location.search,\n ).get(legacyParamKey)\n if (legacySearchParamValue && !queryRequest) {\n try {\n const query = JSON.parse(legacySearchParamValue) as Query\n if (query.sql) {\n queryRequest = {\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: parseEntityIdFromSqlStatement(query.sql),\n query,\n }\n }\n } catch (error) {\n console.error('Failed to parse legacy query from URL:', error)\n }\n }\n return queryRequest\n}\n\n/**\n * Generates a URL with a compressed query diff parameter.\n * @param path - The base path for the URL\n * @param componentIndex - The component index (e.g., 0)\n * @param currentQuery - The query to encode\n * @param initQuery - The initial/default query to compute the diff against\n * @returns A Promise that resolves to the full URL with compressed query parameter\n */\nexport async function generateCompressedQueryURL(\n path: string,\n componentIndex: number,\n currentQuery: Query,\n initQuery: Query,\n): Promise<string> {\n const diff = computeQueryDiff(currentQuery, initQuery)\n if (!diff) {\n // Queries are equal, no need for a parameter\n return path\n }\n\n const jsonString = JSON.stringify(diff)\n const compressed = await compressString(jsonString)\n const paramKey = getComponentSearchHashId('qw', componentIndex)\n\n return `${path}?${paramKey}=${encodeURIComponent(compressed)}`\n}\n"],"mappings":";;;AASA,eAAe,EAAe,GAA8B;CAE1D,IAAM,IAAO,IADO,YACP,EAAQ,OAAO,CAAG,GAEzB,IAAoB,IAAI,kBAAkB,MAAM,GAChD,IAAS,EAAkB,SAAS,UAAU,GAG9C,IAAc,IAAI,SAAS,EAAkB,QAAQ,EAAE,YAAY;CAGzE,AADA,MAAM,EAAO,MAAM,CAAI,GACvB,MAAM,EAAO,MAAM;CAEnB,IAAM,IAAwB,MAAM,GAG9B,IAAQ,IAAI,WAAW,CAAqB,GAC9C,IAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAChC,KAAU,OAAO,aAAa,EAAM,EAAE;CAExC,OAAO,KAAK,CAAM;AACpB;AAOA,eAAe,EAAiB,GAAoC;CAElE,IAAM,IAAS,KAAK,CAAS,GACvB,IAAQ,IAAI,WAAW,EAAO,MAAM;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KACjC,EAAM,KAAK,EAAO,WAAW,CAAC;CAGhC,IAAM,IAAsB,IAAI,oBAAoB,MAAM,GACpD,IAAS,EAAoB,SAAS,UAAU,GAGhD,IAAc,IAAI,SAAS,EAAoB,QAAQ,EAAE,YAAY;CAG3E,AADA,MAAM,EAAO,MAAM,CAAK,GACxB,MAAM,EAAO,MAAM;CAEnB,IAAM,IAA0B,MAAM;CAGtC,OAAO,IADa,YACb,EAAQ,OAAO,CAAuB;AAC/C;AAGA,SAAS,EACP,GACA,GACQ;CACR,OAAO,GAAG,IAAgB;AAC5B;AAUA,SAAS,EACP,GACA,GACuB;CACvB,IAAI,EAAQ,GAAc,CAAS,GACjC,OAAO;CAGT,IAAM,IAAuB,CAAC,GAIxB,IAAU,IAAI,IAAI,CACtB,GAAG,OAAO,KAAK,CAAY,GAC3B,GAAG,OAAO,KAAK,CAAS,CAC1B,CAAC;CAED,KAAK,IAAM,KAAO,GAChB,AAAK,EAAQ,EAAa,IAAM,EAAU,EAAI,MAG3C,EAAc,KAAO,EAAa;CAIvC,OAAO,OAAO,KAAK,CAAI,EAAE,SAAS,IAAI,IAAO;AAC/C;AAQA,SAAS,EAAe,GAAkB,GAA6B;CACrE,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;AAWA,eAAsB,EACpB,GACA,GACA,GACA,GACe;CACf,IAAM,IACJ,MAAmB,KAAA,IAEf,IADA,EAAyB,GAAe,CAAc,GAGtD,IAAgB,IAAI,gBAAgB,OAAO,SAAS,MAAM;CAEhE,IAAI,KAAgB,GAAW;EAC7B,IAAM,IAAO,EAAiB,GAAc,CAAS;EACrD,IAAI,GAAM;GAGR,IAAM,IAAa,MAAM,EADN,KAAK,UAAU,CACM,CAAU;GAClD,EAAc,IAAI,GAAuB,CAAU;EACrD,OAEE,EAAc,OAAO,CAAqB;CAE9C,OAEE,EAAc,OAAO,CAAqB;CAG5C,IAAM,IAAe,EAAc,SAAS;CAC5C,OAAO,QAAQ,aACb,OAAO,QAAQ,OACf,IACA,OAAO,SAAS,YACb,MAAM,KAAK,CAAa,EAAE,SAAS,IAChC,IAAI,EAAa,SAAS,MAC1B,GACR;AACF;AAQA,eAAsB,EACpB,GACA,GACkD;CAClD,IAAM,IAAW,EAAyB,MAAM,CAAc,GACxD,IAAmB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IACnE,CACF,GAEI;CACJ,IAAI,GACF,IAAI;EAEF,IAAM,IAAa,MAAM,EAAiB,CAAgB,GAGpD,IAAQ,EAAe,GAFhB,KAAK,MAAM,CAEgB,CAAI;EAC5C,AAAI,EAAM,QACR,IAAe;GACb,cACE;GACF,UAAU,EAA8B,EAAM,GAAG;GACjD;EACF;CAEJ,SAAS,GAAO;EACd,QAAQ,MAAM,wCAAwC,CAAK;CAC7D;CAIF,IAAM,IAAiB,EACrB,gBACA,CACF,GACM,IAAyB,IAAI,gBACjC,OAAO,SAAS,MAClB,EAAE,IAAI,CAAc;CACpB,IAAI,KAA0B,CAAC,GAC7B,IAAI;EACF,IAAM,IAAQ,KAAK,MAAM,CAAsB;EAC/C,AAAI,EAAM,QACR,IAAe;GACb,cACE;GACF,UAAU,EAA8B,EAAM,GAAG;GACjD;EACF;CAEJ,SAAS,GAAO;EACd,QAAQ,MAAM,0CAA0C,CAAK;CAC/D;CAEF,OAAO;AACT;AAUA,eAAsB,EACpB,GACA,GACA,GACA,GACiB;CACjB,IAAM,IAAO,EAAiB,GAAc,CAAS;CACrD,IAAI,CAAC,GAEH,OAAO;CAIT,IAAM,IAAa,MAAM,EADN,KAAK,UAAU,CACM,CAAU;CAGlD,OAAO,GAAG,EAAK,GAFE,EAAyB,MAAM,CAE9B,EAAS,GAAG,mBAAmB,CAAU;AAC7D"}
1
+ {"version":3,"file":"deepLinkingUtils.js","names":[],"sources":["../../../src/utils/functions/deepLinkingUtils.ts"],"sourcesContent":["import { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { isEqual } from 'lodash-es'\nimport { parseEntityIdFromSqlStatement } from './SqlFunctions'\n\n/**\n * Compresses a string using the browser's CompressionStream API and returns base64.\n * @param str - The string to compress\n * @returns Base64-encoded compressed string\n */\nasync function compressString(str: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(str)\n\n const compressionStream = new CompressionStream('gzip')\n const writer = compressionStream.writable.getWriter()\n\n // Start consuming from the readable side immediately to prevent backpressure deadlock\n const readPromise = new Response(compressionStream.readable).arrayBuffer()\n\n await writer.write(data)\n await writer.close()\n\n const compressedArrayBuffer = await readPromise\n\n // Convert to base64\n const bytes = new Uint8Array(compressedArrayBuffer)\n let binary = ''\n for (const byte of bytes) {\n binary += String.fromCodePoint(byte)\n }\n return btoa(binary)\n}\n\n/**\n * Decompresses a base64-encoded gzip string using the browser's DecompressionStream API.\n * @param base64Str - The base64-encoded compressed string\n * @returns The decompressed string\n */\nasync function decompressString(base64Str: string): Promise<string> {\n // Convert from base64 to Uint8Array\n const binary = atob(base64Str)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.codePointAt(i)!\n }\n\n const decompressionStream = new DecompressionStream('gzip')\n const writer = decompressionStream.writable.getWriter()\n\n // Start consuming from the readable side immediately to prevent backpressure deadlock\n const readPromise = new Response(decompressionStream.readable).arrayBuffer()\n\n await writer.write(bytes)\n await writer.close()\n\n const decompressedArrayBuffer = await readPromise\n\n const decoder = new TextDecoder()\n return decoder.decode(decompressedArrayBuffer)\n}\n\n//id consists of a component class/function name and it's index\nfunction getComponentSearchHashId(\n componentName: string,\n componentIndex: number,\n): string {\n return `${componentName}${componentIndex}`\n}\n\n/**\n * Computes the difference between the current query and the initial query.\n * Returns only the fields that differ from the initial query.\n * Dynamically handles all fields in the Query type, making it safe for future changes.\n * @param currentQuery - The current query state\n * @param initQuery - The initial query state\n * @returns A partial Query object containing only the differences, or null if queries are equal\n */\nfunction computeQueryDiff(\n currentQuery: Query,\n initQuery: Query,\n): Partial<Query> | null {\n if (isEqual(currentQuery, initQuery)) {\n return null\n }\n\n const diff: Partial<Query> = {}\n\n // Get the union of keys from both currentQuery and initQuery to handle\n // both additions/changes and removals/omissions\n const allKeys = new Set([\n ...Object.keys(currentQuery),\n ...Object.keys(initQuery),\n ]) as Set<keyof Query>\n\n for (const key of allKeys) {\n if (!isEqual(currentQuery[key], initQuery[key])) {\n // Type assertion needed for dynamic key assignment\n // Include currentQuery[key] even if undefined to represent removals\n ;(diff as any)[key] = currentQuery[key]\n }\n }\n\n return Object.keys(diff).length > 0 ? diff : null\n}\n\n/**\n * Applies a query diff to the initial query to reconstruct the current query.\n * @param initQuery - The initial query state\n * @param diff - The partial query containing only the differences\n * @returns The reconstructed query\n */\nfunction applyQueryDiff(initQuery: Query, diff: Partial<Query>): Query {\n return {\n ...initQuery,\n ...diff,\n }\n}\n\n/**\n * Updates the url with the components' new search params. Stores only the\n * differences between currentQuery and initQuery, compressed with gzip and base64-encoded.\n * If the queries are equal, the search param will be removed.\n * @param componentName\n * @param componentIndex\n * @param currentQuery - The current query state, or null to remove the param\n * @param initQuery - The initial query state to compute diff against\n */\nexport async function updateUrlWithNewSearchParam(\n componentName: string,\n componentIndex: number | undefined,\n currentQuery: Query | null,\n initQuery: Query | null,\n): Promise<void> {\n const componentSearchHashId =\n componentIndex !== undefined\n ? getComponentSearchHashId(componentName, componentIndex)\n : componentName\n\n const currentSearch = new URLSearchParams(window.location.search)\n\n if (currentQuery && initQuery) {\n const diff = computeQueryDiff(currentQuery, initQuery)\n if (diff) {\n // Compress the diff and encode as base64\n const jsonString = JSON.stringify(diff)\n const compressed = await compressString(jsonString)\n currentSearch.set(componentSearchHashId, compressed)\n } else {\n // Queries are equal, remove the param\n currentSearch.delete(componentSearchHashId)\n }\n } else {\n // No current query or no init query, remove the param\n currentSearch.delete(componentSearchHashId)\n }\n\n const searchString = currentSearch.toString()\n window.history.replaceState(\n window.history.state,\n '',\n window.location.pathname +\n (Array.from(currentSearch).length > 0\n ? `?${searchString.toString()}`\n : ''),\n )\n}\n\n/**\n * Retrieves a query request from the URL by applying the stored diff to the initial query.\n * @param componentIndex\n * @param initQuery - The initial query to apply the diff to\n * @returns A partial QueryBundleRequest with the reconstructed query, or undefined if no diff is stored\n */\nexport async function getQueryRequestFromLink(\n componentIndex: number,\n initQuery: Query,\n): Promise<Partial<QueryBundleRequest> | undefined> {\n const paramKey = getComponentSearchHashId('qw', componentIndex)\n const searchParamValue = new URLSearchParams(window.location.search).get(\n paramKey,\n )\n\n let queryRequest: Partial<QueryBundleRequest> | undefined = undefined\n if (searchParamValue) {\n try {\n // Decompress and parse the diff from the URL\n const jsonString = await decompressString(searchParamValue)\n const diff = JSON.parse(jsonString) as Partial<Query>\n // Apply the diff to the init query to reconstruct the current query\n const query = applyQueryDiff(initQuery, diff)\n if (query.sql) {\n queryRequest = {\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: parseEntityIdFromSqlStatement(query.sql),\n query,\n }\n }\n } catch (error) {\n console.error('Failed to parse query diff from URL:', error)\n }\n }\n\n // check for legacy search param for backward compatibility, but prioritize the new format if both are present\n const legacyParamKey = getComponentSearchHashId(\n 'QueryWrapper',\n componentIndex,\n )\n const legacySearchParamValue = new URLSearchParams(\n window.location.search,\n ).get(legacyParamKey)\n if (legacySearchParamValue && !queryRequest) {\n try {\n const query = JSON.parse(legacySearchParamValue) as Query\n if (query.sql) {\n queryRequest = {\n concreteType:\n 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: parseEntityIdFromSqlStatement(query.sql),\n query,\n }\n }\n } catch (error) {\n console.error('Failed to parse legacy query from URL:', error)\n }\n }\n return queryRequest\n}\n\n/**\n * Generates a URL with a compressed query diff parameter.\n * @param path - The base path for the URL\n * @param componentIndex - The component index (e.g., 0)\n * @param currentQuery - The query to encode\n * @param initQuery - The initial/default query to compute the diff against\n * @returns A Promise that resolves to the full URL with compressed query parameter\n */\nexport async function generateCompressedQueryURL(\n path: string,\n componentIndex: number,\n currentQuery: Query,\n initQuery: Query,\n): Promise<string> {\n const diff = computeQueryDiff(currentQuery, initQuery)\n if (!diff) {\n // Queries are equal, no need for a parameter\n return path\n }\n\n const jsonString = JSON.stringify(diff)\n const compressed = await compressString(jsonString)\n const paramKey = getComponentSearchHashId('qw', componentIndex)\n\n return `${path}?${paramKey}=${encodeURIComponent(compressed)}`\n}\n"],"mappings":";;;AASA,eAAe,EAAe,GAA8B;CAE1D,IAAM,IAAO,IADO,YACP,EAAQ,OAAO,CAAG,GAEzB,IAAoB,IAAI,kBAAkB,MAAM,GAChD,IAAS,EAAkB,SAAS,UAAU,GAG9C,IAAc,IAAI,SAAS,EAAkB,QAAQ,EAAE,YAAY;CAGzE,AADA,MAAM,EAAO,MAAM,CAAI,GACvB,MAAM,EAAO,MAAM;CAEnB,IAAM,IAAwB,MAAM,GAG9B,IAAQ,IAAI,WAAW,CAAqB,GAC9C,IAAS;CACb,KAAK,IAAM,KAAQ,GACjB,KAAU,OAAO,cAAc,CAAI;CAErC,OAAO,KAAK,CAAM;AACpB;AAOA,eAAe,EAAiB,GAAoC;CAElE,IAAM,IAAS,KAAK,CAAS,GACvB,IAAQ,IAAI,WAAW,EAAO,MAAM;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KACjC,EAAM,KAAK,EAAO,YAAY,CAAC;CAGjC,IAAM,IAAsB,IAAI,oBAAoB,MAAM,GACpD,IAAS,EAAoB,SAAS,UAAU,GAGhD,IAAc,IAAI,SAAS,EAAoB,QAAQ,EAAE,YAAY;CAG3E,AADA,MAAM,EAAO,MAAM,CAAK,GACxB,MAAM,EAAO,MAAM;CAEnB,IAAM,IAA0B,MAAM;CAGtC,OAAO,IADa,YACb,EAAQ,OAAO,CAAuB;AAC/C;AAGA,SAAS,EACP,GACA,GACQ;CACR,OAAO,GAAG,IAAgB;AAC5B;AAUA,SAAS,EACP,GACA,GACuB;CACvB,IAAI,EAAQ,GAAc,CAAS,GACjC,OAAO;CAGT,IAAM,IAAuB,CAAC,GAIxB,IAAU,IAAI,IAAI,CACtB,GAAG,OAAO,KAAK,CAAY,GAC3B,GAAG,OAAO,KAAK,CAAS,CAC1B,CAAC;CAED,KAAK,IAAM,KAAO,GAChB,AAAK,EAAQ,EAAa,IAAM,EAAU,EAAI,MAG3C,EAAc,KAAO,EAAa;CAIvC,OAAO,OAAO,KAAK,CAAI,EAAE,SAAS,IAAI,IAAO;AAC/C;AAQA,SAAS,EAAe,GAAkB,GAA6B;CACrE,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;AAWA,eAAsB,EACpB,GACA,GACA,GACA,GACe;CACf,IAAM,IACJ,MAAmB,KAAA,IAEf,IADA,EAAyB,GAAe,CAAc,GAGtD,IAAgB,IAAI,gBAAgB,OAAO,SAAS,MAAM;CAEhE,IAAI,KAAgB,GAAW;EAC7B,IAAM,IAAO,EAAiB,GAAc,CAAS;EACrD,IAAI,GAAM;GAGR,IAAM,IAAa,MAAM,EADN,KAAK,UAAU,CACM,CAAU;GAClD,EAAc,IAAI,GAAuB,CAAU;EACrD,OAEE,EAAc,OAAO,CAAqB;CAE9C,OAEE,EAAc,OAAO,CAAqB;CAG5C,IAAM,IAAe,EAAc,SAAS;CAC5C,OAAO,QAAQ,aACb,OAAO,QAAQ,OACf,IACA,OAAO,SAAS,YACb,MAAM,KAAK,CAAa,EAAE,SAAS,IAChC,IAAI,EAAa,SAAS,MAC1B,GACR;AACF;AAQA,eAAsB,EACpB,GACA,GACkD;CAClD,IAAM,IAAW,EAAyB,MAAM,CAAc,GACxD,IAAmB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IACnE,CACF,GAEI;CACJ,IAAI,GACF,IAAI;EAEF,IAAM,IAAa,MAAM,EAAiB,CAAgB,GAGpD,IAAQ,EAAe,GAFhB,KAAK,MAAM,CAEgB,CAAI;EAC5C,AAAI,EAAM,QACR,IAAe;GACb,cACE;GACF,UAAU,EAA8B,EAAM,GAAG;GACjD;EACF;CAEJ,SAAS,GAAO;EACd,QAAQ,MAAM,wCAAwC,CAAK;CAC7D;CAIF,IAAM,IAAiB,EACrB,gBACA,CACF,GACM,IAAyB,IAAI,gBACjC,OAAO,SAAS,MAClB,EAAE,IAAI,CAAc;CACpB,IAAI,KAA0B,CAAC,GAC7B,IAAI;EACF,IAAM,IAAQ,KAAK,MAAM,CAAsB;EAC/C,AAAI,EAAM,QACR,IAAe;GACb,cACE;GACF,UAAU,EAA8B,EAAM,GAAG;GACjD;EACF;CAEJ,SAAS,GAAO;EACd,QAAQ,MAAM,0CAA0C,CAAK;CAC/D;CAEF,OAAO;AACT;AAUA,eAAsB,EACpB,GACA,GACA,GACA,GACiB;CACjB,IAAM,IAAO,EAAiB,GAAc,CAAS;CACrD,IAAI,CAAC,GAEH,OAAO;CAIT,IAAM,IAAa,MAAM,EADN,KAAK,UAAU,CACM,CAAU;CAGlD,OAAO,GAAG,EAAK,GAFE,EAAyB,MAAM,CAE9B,EAAS,GAAG,mBAAmB,CAAU;AAC7D"}
@@ -0,0 +1,26 @@
1
+ import { FacetColumnResult, FacetColumnResultValueCount } from '@sage-bionetworks/synapse-types';
2
+ /**
3
+ * An enumeration facet as the UI lists it, whether the server returned exact counts (FacetColumnResultValues) or
4
+ * binned counts (FacetColumnResultBinnedValues, from the ROUNDING post-processing algorithm).
5
+ */
6
+ export type EnumerationFacet = {
7
+ columnName: string;
8
+ /** When present, the facet is for the sub-column of `columnName` at this JSON path. */
9
+ jsonPath?: string;
10
+ /**
11
+ * Every returned value. For a binned facet, each count is the midpoint of the value's bin, so a value whose exact
12
+ * count is 0 still has a positive count.
13
+ */
14
+ facetValues: FacetColumnResultValueCount[];
15
+ /** Set for a binned facet: each value's exact count lies within count ± (binSize - 1) / 2. */
16
+ binSize?: number;
17
+ };
18
+ /**
19
+ * Returns the facet as an EnumerationFacet, or undefined for a range facet.
20
+ */
21
+ export declare function getEnumerationFacet(facet: FacetColumnResult): EnumerationFacet | undefined;
22
+ /**
23
+ * The enumeration facets in a list of facets, each as an EnumerationFacet.
24
+ */
25
+ export declare function getEnumerationFacets(facets: readonly FacetColumnResult[] | undefined): EnumerationFacet[];
26
+ //# sourceMappingURL=enumerationFacet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enumerationFacet.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/enumerationFacet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC5B,MAAM,iCAAiC,CAAA;AAExC;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,WAAW,EAAE,2BAA2B,EAAE,CAAA;IAC1C,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,GACvB,gBAAgB,GAAG,SAAS,CAuB9B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,GAC/C,gBAAgB,EAAE,CAEpB"}
@@ -0,0 +1,27 @@
1
+ //#region src/utils/functions/enumerationFacet.ts
2
+ function e(e) {
3
+ switch (e.concreteType) {
4
+ case "org.sagebionetworks.repo.model.table.FacetColumnResultValues": return e;
5
+ case "org.sagebionetworks.repo.model.table.FacetColumnResultBinnedValues": {
6
+ let t = (e.binSize - 1) / 2;
7
+ return {
8
+ columnName: e.columnName,
9
+ jsonPath: e.jsonPath,
10
+ binSize: e.binSize,
11
+ facetValues: e.binnedValues.map(({ value: e, binMin: n, isSelected: r }) => ({
12
+ value: e,
13
+ count: n + t,
14
+ isSelected: r
15
+ }))
16
+ };
17
+ }
18
+ case "org.sagebionetworks.repo.model.table.FacetColumnResultRange": return;
19
+ }
20
+ }
21
+ function t(t) {
22
+ return (t ?? []).flatMap((t) => e(t) ?? []);
23
+ }
24
+ //#endregion
25
+ export { e as getEnumerationFacet, t as getEnumerationFacets };
26
+
27
+ //# sourceMappingURL=enumerationFacet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enumerationFacet.js","names":[],"sources":["../../../src/utils/functions/enumerationFacet.ts"],"sourcesContent":["import {\n FacetColumnResult,\n FacetColumnResultValueCount,\n} from '@sage-bionetworks/synapse-types'\n\n/**\n * An enumeration facet as the UI lists it, whether the server returned exact counts (FacetColumnResultValues) or\n * binned counts (FacetColumnResultBinnedValues, from the ROUNDING post-processing algorithm).\n */\nexport type EnumerationFacet = {\n columnName: string\n /** When present, the facet is for the sub-column of `columnName` at this JSON path. */\n jsonPath?: string\n /**\n * Every returned value. For a binned facet, each count is the midpoint of the value's bin, so a value whose exact\n * count is 0 still has a positive count.\n */\n facetValues: FacetColumnResultValueCount[]\n /** Set for a binned facet: each value's exact count lies within count ± (binSize - 1) / 2. */\n binSize?: number\n}\n\n/**\n * Returns the facet as an EnumerationFacet, or undefined for a range facet.\n */\nexport function getEnumerationFacet(\n facet: FacetColumnResult,\n): EnumerationFacet | undefined {\n switch (facet.concreteType) {\n case 'org.sagebionetworks.repo.model.table.FacetColumnResultValues':\n return facet\n case 'org.sagebionetworks.repo.model.table.FacetColumnResultBinnedValues': {\n // The midpoint of [binMin, binMin + binSize - 1]: counts, plot lengths and sorting err neither high nor low.\n const halfBinWidth = (facet.binSize - 1) / 2\n return {\n columnName: facet.columnName,\n jsonPath: facet.jsonPath,\n binSize: facet.binSize,\n facetValues: facet.binnedValues.map(\n ({ value, binMin, isSelected }) => ({\n value,\n count: binMin + halfBinWidth,\n isSelected,\n }),\n ),\n }\n }\n case 'org.sagebionetworks.repo.model.table.FacetColumnResultRange':\n return undefined\n }\n}\n\n/**\n * The enumeration facets in a list of facets, each as an EnumerationFacet.\n */\nexport function getEnumerationFacets(\n facets: readonly FacetColumnResult[] | undefined,\n): EnumerationFacet[] {\n return (facets ?? []).flatMap(facet => getEnumerationFacet(facet) ?? [])\n}\n"],"mappings":";AAyBA,SAAgB,EACd,GAC8B;CAC9B,QAAQ,EAAM,cAAd;EACE,KAAK,gEACH,OAAO;EACT,KAAK,sEAAsE;GAEzE,IAAM,KAAgB,EAAM,UAAU,KAAK;GAC3C,OAAO;IACL,YAAY,EAAM;IAClB,UAAU,EAAM;IAChB,SAAS,EAAM;IACf,aAAa,EAAM,aAAa,KAC7B,EAAE,UAAO,WAAQ,qBAAkB;KAClC;KACA,OAAO,IAAS;KAChB;IACF,EACF;GACF;EACF;EACA,KAAK,+DACH;CACJ;AACF;AAKA,SAAgB,EACd,GACoB;CACpB,QAAQ,KAAU,CAAC,GAAG,SAAQ,MAAS,EAAoB,CAAK,KAAK,CAAC,CAAC;AACzE"}
@@ -0,0 +1,12 @@
1
+ import { EnumerationFacet } from './enumerationFacet';
2
+ /**
3
+ * Formats a facet value's count for display. Post-processed counts show as approximate, e.g. `≈ 1,202`: a rounded
4
+ * count (a facet with `binSize`, whose counts are bin midpoints; see `getEnumerationFacet`) or a noised count. Exact
5
+ * counts, including counts rounded to a bin size of 1, show as-is.
6
+ *
7
+ * @param count the facet value's count (the bin midpoint for a binned facet)
8
+ * @param facet the facet that the value belongs to
9
+ * @param facetPostProcessingApplied the QueryResultBundle's `facetPostProcessingApplied`
10
+ */
11
+ export declare function formatFacetValueCount(count: number, facet: Pick<EnumerationFacet, 'binSize'>, facetPostProcessingApplied: boolean | undefined): string;
12
+ //# sourceMappingURL=facetCountUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facetCountUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/facetCountUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,EACxC,0BAA0B,EAAE,OAAO,GAAG,SAAS,GAC9C,MAAM,CAKR"}
@@ -0,0 +1,9 @@
1
+ //#region src/utils/functions/facetCountUtils.ts
2
+ function e(e, t, n) {
3
+ let { binSize: r } = t;
4
+ return (r === void 0 ? n : r > 1) ? `≈ ${e.toLocaleString()}` : e.toLocaleString();
5
+ }
6
+ //#endregion
7
+ export { e as formatFacetValueCount };
8
+
9
+ //# sourceMappingURL=facetCountUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facetCountUtils.js","names":[],"sources":["../../../src/utils/functions/facetCountUtils.ts"],"sourcesContent":["import { EnumerationFacet } from './enumerationFacet'\n\n/**\n * Formats a facet value's count for display. Post-processed counts show as approximate, e.g. `≈ 1,202`: a rounded\n * count (a facet with `binSize`, whose counts are bin midpoints; see `getEnumerationFacet`) or a noised count. Exact\n * counts, including counts rounded to a bin size of 1, show as-is.\n *\n * @param count the facet value's count (the bin midpoint for a binned facet)\n * @param facet the facet that the value belongs to\n * @param facetPostProcessingApplied the QueryResultBundle's `facetPostProcessingApplied`\n */\nexport function formatFacetValueCount(\n count: number,\n facet: Pick<EnumerationFacet, 'binSize'>,\n facetPostProcessingApplied: boolean | undefined,\n): string {\n const { binSize } = facet\n const isApproximate =\n binSize === undefined ? Boolean(facetPostProcessingApplied) : binSize > 1\n return isApproximate ? `≈ ${count.toLocaleString()}` : count.toLocaleString()\n}\n"],"mappings":";AAWA,SAAgB,EACd,GACA,GACA,GACQ;CACR,IAAM,EAAE,eAAY;CAGpB,QADE,MAAY,KAAA,IAAoB,IAA8B,IAAU,KACnD,KAAK,EAAM,eAAe,MAAM,EAAM,eAAe;AAC9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"getEndpoint.js","names":[],"sources":["../../../src/utils/functions/getEndpoint.ts"],"sourcesContent":["import {\n SYNAPSE_BACKEND_DEV_URL,\n SYNAPSE_BACKEND_PRODUCTION_URL,\n SYNAPSE_BACKEND_STAGING_URL,\n} from '../SynapseConstants'\n\nexport enum BackendDestinationEnum {\n REPO_ENDPOINT,\n PORTAL_ENDPOINT,\n}\n\n// Encodes the portal and repo service destinations\nexport type EndpointObject = {\n REPO: string\n PORTAL: string\n}\n\nexport const KNOWN_SYNAPSE_ORG_URLS = [\n 'www.synapse.org',\n 'staging.synapse.org',\n 'tst.synapse.org',\n 'dev.synapse.org',\n '127.0.0.1',\n]\n\nexport const getSynapsePortalEndpoint = (hostname: string): string => {\n return KNOWN_SYNAPSE_ORG_URLS.includes(hostname.toLowerCase())\n ? '/'\n : 'https://www.synapse.org/'\n}\nfunction getDefaultSynapsePortal(): string {\n if (typeof window === 'undefined') return getSynapsePortalEndpoint('')\n return getSynapsePortalEndpoint(window.location.hostname)\n}\n\nexport const PRODUCTION_ENDPOINT_CONFIG: EndpointObject = {\n REPO: SYNAPSE_BACKEND_PRODUCTION_URL,\n // Computed lazily via a getter so this object can be imported in Node.js (SSR/pre-render)\n // without crashing on the `window.location.hostname` access.\n get PORTAL() {\n return getDefaultSynapsePortal()\n },\n}\n\n// Given an endpoint will return the specific stack object\nexport const getEndpoint = (endpoint: BackendDestinationEnum): string => {\n let endpoint_config = PRODUCTION_ENDPOINT_CONFIG\n if (typeof window !== 'undefined') {\n // @ts-expect-error if overriding endpoint config\n if (window.SRC_OVERRIDE_ENDPOINT_CONFIG) {\n // @ts-expect-error\n endpoint_config = window.SRC_OVERRIDE_ENDPOINT_CONFIG\n }\n }\n const { PORTAL, REPO } = endpoint_config\n if (!PORTAL || !REPO) {\n throw Error('Error failed to specify endpoints, cannot make call')\n }\n if (endpoint === BackendDestinationEnum.PORTAL_ENDPOINT) {\n return PORTAL\n }\n return REPO\n}\n\nexport type SynapseStack =\n | 'production'\n | 'staging'\n | 'development'\n | 'mock'\n | 'local'\n\nexport const MOCK_REPO_ORIGIN =\n 'https://mock-repo.sagebase.org' satisfies string\nexport const MOCK_PORTAL_ORIGIN =\n 'https://mock-portal.sagebase.org/' satisfies string\n\nexport const STACK_MAP: Record<SynapseStack, EndpointObject> = {\n production: {\n REPO: SYNAPSE_BACKEND_PRODUCTION_URL,\n PORTAL: 'https://www.synapse.org/',\n },\n staging: {\n REPO: SYNAPSE_BACKEND_STAGING_URL,\n PORTAL: 'https://staging.synapse.org/',\n },\n development: {\n REPO: SYNAPSE_BACKEND_DEV_URL,\n PORTAL: 'https://dev.synapse.org/',\n },\n mock: {\n REPO: MOCK_REPO_ORIGIN,\n PORTAL: MOCK_PORTAL_ORIGIN,\n },\n local: {\n REPO: 'http://localhost:8080/services-repository-develop-SNAPSHOT',\n PORTAL: 'http://localhost:8888/',\n },\n}\n"],"mappings":";;AAMA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,EAAA,gBAAA,KAAA,iBACA,EAAA,EAAA,kBAAA,KAAA;AACF,EAAA,CAAA,CAAA,GAQa,IAAyB;CACpC;CACA;CACA;CACA;CACA;AACF,GAEa,KAA4B,MAChC,EAAuB,SAAS,EAAS,YAAY,CAAC,IACzD,MACA;AAEN,SAAS,IAAkC;CAEzC,OAD0C,EAAtC,OAAO,SAAW,MAA6C,KACnC,OAAO,SAAS,QADqB;AAEvE;AAEA,IAAa,IAA6C;CACxD,MAAM;CAGN,IAAI,SAAS;EACX,OAAO,EAAwB;CACjC;AACF,GAGa,KAAe,MAA6C;CACvE,IAAI,IAAkB;CACtB,AAAI,OAAO,SAAW,OAEhB,OAAO,iCAET,IAAkB,OAAO;CAG7B,IAAM,EAAE,WAAQ,YAAS;CACzB,IAAI,CAAC,KAAU,CAAC,GACd,MAAM,MAAM,qDAAqD;CAKnE,OAHI,MAAA,IACK,IAEF;AACT,GASa,IACX,kCACW,IACX,qCAEW,IAAkD;CAC7D,YAAY;EACV,MAAM;EACN,QAAQ;CACV;CACA,SAAS;EACP,MAAM;EACN,QAAQ;CACV;CACA,aAAa;EACX,MAAM;EACN,QAAQ;CACV;CACA,MAAM;EACJ,MAAM;EACN,QAAQ;CACV;CACA,OAAO;EACL,MAAM;EACN,QAAQ;CACV;AACF"}
1
+ {"version":3,"file":"getEndpoint.js","names":[],"sources":["../../../src/utils/functions/getEndpoint.ts"],"sourcesContent":["import {\n SYNAPSE_BACKEND_DEV_URL,\n SYNAPSE_BACKEND_PRODUCTION_URL,\n SYNAPSE_BACKEND_STAGING_URL,\n} from '../SynapseConstants'\n\nexport enum BackendDestinationEnum {\n REPO_ENDPOINT,\n PORTAL_ENDPOINT,\n}\n\n// Encodes the portal and repo service destinations\nexport type EndpointObject = {\n REPO: string\n PORTAL: string\n}\n\nexport const KNOWN_SYNAPSE_ORG_URLS = [\n 'www.synapse.org',\n 'staging.synapse.org',\n 'tst.synapse.org',\n 'dev.synapse.org',\n '127.0.0.1',\n]\n\nexport const getSynapsePortalEndpoint = (hostname: string): string => {\n return KNOWN_SYNAPSE_ORG_URLS.includes(hostname.toLowerCase())\n ? '/'\n : 'https://www.synapse.org/'\n}\nfunction getDefaultSynapsePortal(): string {\n if (typeof window === 'undefined') return getSynapsePortalEndpoint('')\n return getSynapsePortalEndpoint(window.location.hostname)\n}\n\nexport const PRODUCTION_ENDPOINT_CONFIG: EndpointObject = {\n REPO: SYNAPSE_BACKEND_PRODUCTION_URL,\n // Computed lazily via a getter so this object can be imported in Node.js (SSR/pre-render)\n // without crashing on the `window.location.hostname` access.\n get PORTAL() {\n return getDefaultSynapsePortal()\n },\n}\n\n// Given an endpoint will return the specific stack object\nexport const getEndpoint = (endpoint: BackendDestinationEnum): string => {\n let endpoint_config = PRODUCTION_ENDPOINT_CONFIG\n if (typeof window !== 'undefined') {\n // @ts-expect-error if overriding endpoint config\n if (window.SRC_OVERRIDE_ENDPOINT_CONFIG) {\n // @ts-expect-error\n endpoint_config = window.SRC_OVERRIDE_ENDPOINT_CONFIG\n }\n }\n const { PORTAL, REPO } = endpoint_config\n if (!PORTAL || !REPO) {\n throw new Error('Error failed to specify endpoints, cannot make call')\n }\n if (endpoint === BackendDestinationEnum.PORTAL_ENDPOINT) {\n return PORTAL\n }\n return REPO\n}\n\nexport type SynapseStack =\n | 'production'\n | 'staging'\n | 'development'\n | 'mock'\n | 'local'\n\nexport const MOCK_REPO_ORIGIN =\n 'https://mock-repo.sagebase.org' satisfies string\nexport const MOCK_PORTAL_ORIGIN =\n 'https://mock-portal.sagebase.org/' satisfies string\n\nexport const STACK_MAP: Record<SynapseStack, EndpointObject> = {\n production: {\n REPO: SYNAPSE_BACKEND_PRODUCTION_URL,\n PORTAL: 'https://www.synapse.org/',\n },\n staging: {\n REPO: SYNAPSE_BACKEND_STAGING_URL,\n PORTAL: 'https://staging.synapse.org/',\n },\n development: {\n REPO: SYNAPSE_BACKEND_DEV_URL,\n PORTAL: 'https://dev.synapse.org/',\n },\n mock: {\n REPO: MOCK_REPO_ORIGIN,\n PORTAL: MOCK_PORTAL_ORIGIN,\n },\n local: {\n REPO: 'http://localhost:8080/services-repository-develop-SNAPSHOT',\n PORTAL: 'http://localhost:8888/',\n },\n}\n"],"mappings":";;AAMA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,EAAA,gBAAA,KAAA,iBACA,EAAA,EAAA,kBAAA,KAAA;AACF,EAAA,CAAA,CAAA,GAQa,IAAyB;CACpC;CACA;CACA;CACA;CACA;AACF,GAEa,KAA4B,MAChC,EAAuB,SAAS,EAAS,YAAY,CAAC,IACzD,MACA;AAEN,SAAS,IAAkC;CAEzC,OAD0C,EAAtC,OAAO,SAAW,MAA6C,KACnC,OAAO,SAAS,QADqB;AAEvE;AAEA,IAAa,IAA6C;CACxD,MAAM;CAGN,IAAI,SAAS;EACX,OAAO,EAAwB;CACjC;AACF,GAGa,KAAe,MAA6C;CACvE,IAAI,IAAkB;CACtB,AAAI,OAAO,SAAW,OAEhB,OAAO,iCAET,IAAkB,OAAO;CAG7B,IAAM,EAAE,WAAQ,YAAS;CACzB,IAAI,CAAC,KAAU,CAAC,GACd,MAAU,MAAM,qDAAqD;CAKvE,OAHI,MAAA,IACK,IAEF;AACT,GASa,IACX,kCACW,IACX,qCAEW,IAAkD;CAC7D,YAAY;EACV,MAAM;EACN,QAAQ;CACV;CACA,SAAS;EACP,MAAM;EACN,QAAQ;CACV;CACA,aAAa;EACX,MAAM;EACN,QAAQ;CACV;CACA,MAAM;EACJ,MAAM;EACN,QAAQ;CACV;CACA,OAAO;EACL,MAAM;EACN,QAAQ;CACV;AACF"}
@@ -25,7 +25,7 @@ var i = [
25
25
  "orangered",
26
26
  "blueviolet"
27
27
  ], a = (e) => {
28
- let t = e.split("").reduce((e, t) => (e << 5) - e + t.charCodeAt(0) | 0, 0);
28
+ let t = e.split("").reduce((e, t) => (e << 5) - e + t.codePointAt(0) | 0, 0);
29
29
  return Math.abs(t);
30
30
  }, o = (e) => i[a(e) % i.length];
31
31
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"getUserData.js","names":[],"sources":["../../../src/utils/functions/getUserData.ts"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { BackendDestinationEnum, getEndpoint } from './getEndpoint'\n\n/*\n Utility functions for UserCards\n*/\n\nexport async function getUserProfileWithProfilePicAttached(\n principalIds: string[],\n) {\n const userProfiles = await SynapseClient.getUserProfiles(principalIds)\n const profilesWithPictures = userProfiles.list.map(profile => {\n if (profile.profilePicureFileHandleId) {\n return {\n ...profile,\n clientPreSignedURL: `${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/userProfile/${profile.ownerId}/image/preview?redirect=true`,\n }\n } else {\n return profile\n }\n })\n return { list: profilesWithPictures }\n}\n\nconst COLORS: string[] = [\n 'chocolate',\n 'black',\n 'firebrick',\n 'maroon',\n 'olive',\n 'green',\n 'forestgreen',\n 'darkturquoise',\n 'teal',\n 'blue',\n 'navy',\n 'darkmagenta',\n 'purple',\n 'blue',\n 'orangered',\n 'blueviolet',\n]\n\nconst hash = (userName: string) => {\n const val = userName\n .split('')\n .reduce(\n (prevHash, currVal) =>\n ((prevHash << 5) - prevHash + currVal.charCodeAt(0)) | 0,\n 0,\n )\n return Math.abs(val)\n}\n\nexport const getColor = (userName: string) => {\n const hashedUserName = hash(userName)\n return COLORS[hashedUserName % COLORS.length]\n}\n"],"mappings":";;;AAOA,eAAsB,EACpB,GACA;CAcA,OAAO,EAAE,OAZoB,MADF,EAAc,gBAAgB,CAAY,GAC3B,KAAK,KAAI,MAC7C,EAAQ,4BACH;EACL,GAAG;EACH,oBAAoB,GAAG,EACrB,EAAuB,aACzB,EAAE,uBAAuB,EAAQ,QAAQ;CAC3C,IAEO,CAGI,EAAqB;AACtC;AAEA,IAAM,IAAmB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAEM,KAAQ,MAAqB;CACjC,IAAM,IAAM,EACT,MAAM,EAAE,EACR,QACE,GAAU,OACP,KAAY,KAAK,IAAW,EAAQ,WAAW,CAAC,IAAK,GACzD,CACF;CACF,OAAO,KAAK,IAAI,CAAG;AACrB,GAEa,KAAY,MAEhB,EADgB,EAAK,CACd,IAAiB,EAAO"}
1
+ {"version":3,"file":"getUserData.js","names":[],"sources":["../../../src/utils/functions/getUserData.ts"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { BackendDestinationEnum, getEndpoint } from './getEndpoint'\n\n/*\n Utility functions for UserCards\n*/\n\nexport async function getUserProfileWithProfilePicAttached(\n principalIds: string[],\n) {\n const userProfiles = await SynapseClient.getUserProfiles(principalIds)\n const profilesWithPictures = userProfiles.list.map(profile => {\n if (profile.profilePicureFileHandleId) {\n return {\n ...profile,\n clientPreSignedURL: `${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/userProfile/${profile.ownerId}/image/preview?redirect=true`,\n }\n } else {\n return profile\n }\n })\n return { list: profilesWithPictures }\n}\n\nconst COLORS: string[] = [\n 'chocolate',\n 'black',\n 'firebrick',\n 'maroon',\n 'olive',\n 'green',\n 'forestgreen',\n 'darkturquoise',\n 'teal',\n 'blue',\n 'navy',\n 'darkmagenta',\n 'purple',\n 'blue',\n 'orangered',\n 'blueviolet',\n]\n\nconst hash = (userName: string) => {\n const val = userName\n .split('')\n .reduce(\n (prevHash, currVal) =>\n ((prevHash << 5) - prevHash + currVal.codePointAt(0)!) | 0,\n 0,\n )\n return Math.abs(val)\n}\n\nexport const getColor = (userName: string) => {\n const hashedUserName = hash(userName)\n return COLORS[hashedUserName % COLORS.length]\n}\n"],"mappings":";;;AAOA,eAAsB,EACpB,GACA;CAcA,OAAO,EAAE,OAZoB,MADF,EAAc,gBAAgB,CAAY,GAC3B,KAAK,KAAI,MAC7C,EAAQ,4BACH;EACL,GAAG;EACH,oBAAoB,GAAG,EACrB,EAAuB,aACzB,EAAE,uBAAuB,EAAQ,QAAQ;CAC3C,IAEO,CAGI,EAAqB;AACtC;AAEA,IAAM,IAAmB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAEM,KAAQ,MAAqB;CACjC,IAAM,IAAM,EACT,MAAM,EAAE,EACR,QACE,GAAU,OACP,KAAY,KAAK,IAAW,EAAQ,YAAY,CAAC,IAAM,GAC3D,CACF;CACF,OAAO,KAAK,IAAI,CAAG;AACrB,GAEa,KAAY,MAEhB,EADgB,EAAK,CACd,IAAiB,EAAO"}