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
@@ -0,0 +1,379 @@
1
+ import "../../utils/SynapseConstants.js";
2
+ import { DATA_REFERENCE_COLUMN_NAME as e, PARTICIPANT_ID_COLUMN_NAME as t, REFERENCE_TYPE_COLUMN_NAME as n, STUDY_COLUMN_NAME as r } from "./cohortBuilderMockProfiles.js";
3
+ import { createSeededRandom as i } from "./cohortBuilderSyntheticData.js";
4
+ import { ColumnMultiValueFunction as a, ColumnSingleValueFilterOperator as o } from "@sage-bionetworks/synapse-types";
5
+ //#region src/mocks/cohortBuilder/cohortBuilderMockQueryEngine.ts
6
+ var s = 403, c = 403, l = "id", u = "name", d = "2026-10-01T00:00:00.000Z", f = 1e3, p = class extends Error {
7
+ status;
8
+ body;
9
+ constructor(e, t) {
10
+ super(t.reason), this.status = e, this.body = t;
11
+ }
12
+ };
13
+ function m(e) {
14
+ return new p(400, {
15
+ concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
16
+ reason: e
17
+ });
18
+ }
19
+ function h(e) {
20
+ let { profile: i, dataAttributeNames: a } = e, o = 1, s = (e, t, n) => ({
21
+ id: String(o++),
22
+ name: e,
23
+ columnType: t,
24
+ facetType: n ? "enumeration" : void 0
25
+ });
26
+ return {
27
+ participants: [
28
+ s(t, "STRING", !1),
29
+ s(r, "STRING", !0),
30
+ ...i.participantAttributes.map((e) => s(e.name, "STRING", !0)),
31
+ ...a.map((e) => s(e, "STRING_LIST", !0))
32
+ ],
33
+ dataReferences: [
34
+ s(l, "ENTITYID", !1),
35
+ s(u, "STRING", !1),
36
+ s(n, "STRING", !0),
37
+ s(r, "STRING", !0),
38
+ ...a.map((e) => s(e, "STRING", !0))
39
+ ]
40
+ };
41
+ }
42
+ function g(e) {
43
+ let t = e.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`).replaceAll("%", ".*").replaceAll("_", ".");
44
+ return RegExp(`^${t}$`, "i");
45
+ }
46
+ function _(e, t) {
47
+ let n = Number(e), r = Number(t);
48
+ return Number.isFinite(n) && Number.isFinite(r) ? n - r : String(e).localeCompare(String(t));
49
+ }
50
+ function v(e, t, n) {
51
+ switch (t) {
52
+ case o.EQUAL:
53
+ case o.IN: return n.includes(String(e));
54
+ case o.LIKE: return n.some((t) => g(t).test(String(e)));
55
+ case o.NOT_EQUAL: return n.every((t) => String(e) !== t);
56
+ case o.GREATER_THAN: return _(e, n[0]) > 0;
57
+ case o.GREATER_THAN_OR_EQUAL: return _(e, n[0]) >= 0;
58
+ case o.LESS_THAN: return _(e, n[0]) < 0;
59
+ case o.LESS_THAN_OR_EQUAL: return _(e, n[0]) <= 0;
60
+ case o.BETWEEN: return _(e, n[0]) >= 0 && _(e, n[1]) <= 0;
61
+ default: throw m(`Unsupported operator: ${t}`);
62
+ }
63
+ }
64
+ function y(e, t) {
65
+ if (!(t.columnName in e)) throw m(`Column does not exist: ${t.columnName}`);
66
+ let n = e[t.columnName], r = Array.isArray(n) ? n.length === 0 : n === "";
67
+ return t.operator === o.IS_NULL ? r : t.operator === o.IS_NOT_NULL ? !r : (Array.isArray(n) ? n : [n]).some((e) => v(e, t.operator, t.values));
68
+ }
69
+ function b(e, t, n) {
70
+ if (!n.listColumnNames.has(t.columnName)) throw m(`${t.function} can only be used on a multi-value (list) column: ${t.columnName}`);
71
+ let r = e[t.columnName];
72
+ return t.function === a.HAS_LIKE ? t.values.some((e) => r.some((t) => g(e).test(t))) : r.some((e) => t.values.includes(e));
73
+ }
74
+ function x(e, t, n) {
75
+ if (!(t.columnName in e)) throw m(`Column does not exist: ${t.columnName}`);
76
+ return n.cohortValues.get(t.cohortName)?.has(String(e[t.columnName])) ?? !1;
77
+ }
78
+ function S(e, t, n) {
79
+ switch (t.concreteType) {
80
+ case "org.sagebionetworks.repo.model.table.FilterGroup": {
81
+ let r = t.children ?? [], i = t.operator === "OR" ? r.some((t) => S(e, t, n)) : r.every((t) => S(e, t, n));
82
+ return t.not ? !i : i;
83
+ }
84
+ case "org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter": return y(e, t);
85
+ case "org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter": return b(e, t, n);
86
+ case "org.sagebionetworks.repo.model.table.ColumnCohortFilter": return x(e, t, n);
87
+ default: throw m(`The Cohort Builder mock does not support ${t.concreteType}`);
88
+ }
89
+ }
90
+ function C(e, t) {
91
+ let n = e[t.columnName], r = Array.isArray(n) ? n : [n];
92
+ return t.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnValuesRequest" ? r.some((e) => t.facetValues.includes(String(e))) : r.some((e) => (t.min === void 0 || _(e, t.min) >= 0) && (t.max === void 0 || _(e, t.max) <= 0));
93
+ }
94
+ function w(e, n) {
95
+ let i = /* @__PURE__ */ new Map();
96
+ for (let n of e) {
97
+ let e = n[t], r = i.get(e);
98
+ r ? r.push(n) : i.set(e, [n]);
99
+ }
100
+ return Array.from(i.values(), (e) => {
101
+ let i = e[0], a = {
102
+ [t]: i[t],
103
+ [r]: i[r]
104
+ };
105
+ for (let e of n.profile.participantAttributes) a[e.name] = i[e.name];
106
+ for (let t of n.dataAttributeNames) a[t] = Array.from(new Set(e.map((e) => e[t]))).sort((e, t) => e.localeCompare(t));
107
+ return a;
108
+ });
109
+ }
110
+ function T(t, i) {
111
+ let a = new Set(t.map((t) => t[e]));
112
+ return Array.from(a, (e) => {
113
+ let t = i.references.get(e);
114
+ return {
115
+ [l]: t.id,
116
+ [u]: t.name,
117
+ [n]: t.referenceType,
118
+ [r]: t.study,
119
+ ...t.attributes
120
+ };
121
+ });
122
+ }
123
+ function E(e) {
124
+ let t = 2166136261;
125
+ for (let n of e) t ^= n.codePointAt(0), t = Math.imul(t, 16777619);
126
+ return t >>> 0;
127
+ }
128
+ function D(e, t, n) {
129
+ let r = i(E(n))() - .5, a = -(1 / t) * Math.sign(r) * Math.log(1 - 2 * Math.abs(r));
130
+ return Math.max(0, Math.round(e + a));
131
+ }
132
+ function O(e, t) {
133
+ let n = /* @__PURE__ */ new Map();
134
+ for (let r of e) {
135
+ let e = r[t], i = typeof e == "object" ? e : [String(e)];
136
+ for (let e of i) n.set(e, (n.get(e) ?? 0) + 1);
137
+ }
138
+ return n;
139
+ }
140
+ function k(e, t, n, r, i) {
141
+ let a = Array.from(t).sort(([e, t], [n, r]) => r - t || e.localeCompare(n)), o = r?.facetPostProcessingConfig, s = o?.parameters;
142
+ if (o?.algorithm === "ROUNDING" && s?.concreteType === "org.sagebionetworks.repo.model.FacetRoundingParameters") {
143
+ let t = s.roundTo ?? 1;
144
+ return {
145
+ concreteType: "org.sagebionetworks.repo.model.table.FacetColumnResultBinnedValues",
146
+ columnName: e,
147
+ facetType: "enumeration",
148
+ binSize: t,
149
+ binnedValues: a.map(([e, r]) => ({
150
+ value: e,
151
+ binMin: Math.floor(r / t) * t,
152
+ isSelected: n.includes(e)
153
+ }))
154
+ };
155
+ }
156
+ let c = o?.algorithm === "NOISE" && s?.concreteType === "org.sagebionetworks.repo.model.FacetNoiseParameters" ? s.epsilon ?? 1 : void 0;
157
+ return {
158
+ concreteType: "org.sagebionetworks.repo.model.table.FacetColumnResultValues",
159
+ columnName: e,
160
+ facetType: "enumeration",
161
+ facetValues: a.map(([t, r]) => ({
162
+ value: t,
163
+ count: c === void 0 ? r : D(r, c, `${i}\u0000${e}\u0000${t}`),
164
+ isSelected: n.includes(t)
165
+ }))
166
+ };
167
+ }
168
+ function A(e) {
169
+ return `'${e.replaceAll("'", "''")}'`;
170
+ }
171
+ var j = {
172
+ EQUAL: "=",
173
+ NOT_EQUAL: "<>",
174
+ GREATER_THAN: ">",
175
+ GREATER_THAN_OR_EQUAL: ">=",
176
+ LESS_THAN: "<",
177
+ LESS_THAN_OR_EQUAL: "<=",
178
+ LIKE: "LIKE"
179
+ };
180
+ function M(e) {
181
+ switch (e.concreteType) {
182
+ case "org.sagebionetworks.repo.model.table.FilterGroup": {
183
+ let t = (e.children ?? []).map(M).join(` ${e.operator ?? "AND"} `);
184
+ return `${e.not ? "NOT " : ""}(${t})`;
185
+ }
186
+ case "org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter": {
187
+ let t = `"${e.columnName}"`;
188
+ switch (e.operator) {
189
+ case o.IN: return `${t} IN (${e.values.map(A).join(", ")})`;
190
+ case o.IS_NULL: return `${t} IS NULL`;
191
+ case o.IS_NOT_NULL: return `${t} IS NOT NULL`;
192
+ case o.BETWEEN: return `${t} BETWEEN ${A(e.values[0])} AND ${A(e.values[1])}`;
193
+ default: {
194
+ let n = j[e.operator], r = e.values.map((e) => `${t} ${n} ${A(e)}`);
195
+ return r.length === 1 ? r[0] : `(${r.join(" OR ")})`;
196
+ }
197
+ }
198
+ }
199
+ case "org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter": return `"${e.columnName}" ${e.function} (${e.values.map(A).join(", ")})`;
200
+ case "org.sagebionetworks.repo.model.table.ColumnCohortFilter": return `"${e.columnName}" IN COHORT(${e.cohortName})`;
201
+ default: return "";
202
+ }
203
+ }
204
+ function N(e, t) {
205
+ return !t || t.length === 0 ? e : [...e].sort((e, n) => {
206
+ for (let { column: r, direction: i } of t) {
207
+ let t = (e) => Array.isArray(e) ? e.join(",") : e, a = _(t(e[r]), t(n[r]));
208
+ if (a !== 0) return i === "DESC" ? -a : a;
209
+ }
210
+ return 0;
211
+ });
212
+ }
213
+ function P(e, t) {
214
+ if (t === e.participantsVirtualTableId) return "PARTICIPANTS";
215
+ if (t === e.dataVirtualTableId) return "DATA";
216
+ throw new p(404, {
217
+ concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
218
+ reason: `The Cohort Builder mock has no table ${t}`
219
+ });
220
+ }
221
+ function F(e, t, n) {
222
+ return n === "FULL" ? t.aggregateDataPreview : {
223
+ suppressionThreshold: e.suppressionThreshold,
224
+ countSuppressionStrategy: e.countSuppressionStrategy,
225
+ facetPostProcessingConfig: e.facetPostProcessingConfig
226
+ };
227
+ }
228
+ function I(e, t, n) {
229
+ if (n && e === "PARTICIPANTS" && t & 1) throw new p(403, {
230
+ concreteType: "org.sagebionetworks.repo.model.table.RowSuppressionErrorResponse",
231
+ reason: "Row results are withheld because the query projects a quasi-identifier column. Re-run the query without requesting row results.",
232
+ errorCode: "ROW_SUPPRESSED",
233
+ rowSuppressionReasonCode: "QID_PROJECTED"
234
+ });
235
+ }
236
+ function L(e, t) {
237
+ if (!t) return;
238
+ let n = t.suppressionThreshold;
239
+ if (e > 0 && e < n) throw new p(403, {
240
+ concreteType: "org.sagebionetworks.repo.model.table.BelowThresholdErrorResponse",
241
+ reason: `The number of records matched by this query is below the minimum threshold of ${n} required to return a result.`,
242
+ errorCode: "BELOW_THRESHOLD",
243
+ suppressionThreshold: n
244
+ });
245
+ }
246
+ function R(e, t, n, r) {
247
+ let i = n.additionalFilters ?? [], a = n.selectedFacets ?? [], o = i.filter((e) => e.isDefiningCondition), s = i.filter((e) => !e.isDefiningCondition), c = {
248
+ ...r,
249
+ listColumnNames: /* @__PURE__ */ new Set()
250
+ }, l = e.materialRows.filter((e) => o.every((t) => S(e, t, c))), u = t === "PARTICIPANTS" ? w(l, e) : T(l, e), d = (e) => u.filter((t) => s.every((e) => S(t, e, r)) && a.every((n) => n.columnName === e || C(t, n)));
251
+ return {
252
+ rows: d(),
253
+ ignoringFacetSelection: d
254
+ };
255
+ }
256
+ function z(e, t, n, r, i) {
257
+ let a = i.offset ?? 0;
258
+ return {
259
+ concreteType: "org.sagebionetworks.repo.model.table.QueryResult",
260
+ queryResults: {
261
+ concreteType: "org.sagebionetworks.repo.model.table.RowSet",
262
+ tableId: e,
263
+ headers: n,
264
+ rows: N(r, i.sort).slice(a, a + (i.limit ?? r.length)).map((e) => ({ values: t.map(({ name: t }) => {
265
+ let n = e[t];
266
+ return Array.isArray(n) ? JSON.stringify(n) : String(n);
267
+ }) }))
268
+ }
269
+ };
270
+ }
271
+ function B(e, t, n, r) {
272
+ let i = t.selectedFacets ?? [], a = JSON.stringify([t.additionalFilters ?? [], i]);
273
+ return e.filter((e) => e.facetType === "enumeration").map(({ name: e }) => {
274
+ let t = i.find((t) => t.columnName === e);
275
+ return k(e, O(n.ignoringFacetSelection(e), e), t?.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnValuesRequest" ? t.facetValues : [], r, a);
276
+ });
277
+ }
278
+ function V(e, t) {
279
+ let n = t.map(M).filter(Boolean);
280
+ return `SELECT * FROM ${e}${n.length > 0 ? ` WHERE ${n.join(" AND ")}` : ""}`;
281
+ }
282
+ var H = 1e4, U = 5, W = /^[A-Za-z_]\w*$/, G = /^\s*SELECT\s+(\w+)\s+FROM\s+(syn\d+)\s*$/i;
283
+ function K(e, t = !1) {
284
+ return e.flatMap((e) => {
285
+ let n = t || e.isDefiningCondition === !0;
286
+ return e.concreteType === "org.sagebionetworks.repo.model.table.FilterGroup" ? K(e.children ?? [], n) : e.concreteType === "org.sagebionetworks.repo.model.table.ColumnCohortFilter" ? [{
287
+ filter: e,
288
+ isDefining: n
289
+ }] : [];
290
+ });
291
+ }
292
+ function q(e, t) {
293
+ let { name: n, query: r } = t;
294
+ if ((r.cohorts?.length ?? 0) > 0 || K(r.additionalFilters ?? []).length > 0) throw m(`Cohort '${n}' cannot reference other cohorts.`);
295
+ if ((r.sort?.length ?? 0) > 0 || r.limit !== void 0 || r.offset !== void 0) throw m(`Cohort '${n}' cannot use sort, limit or offset.`);
296
+ let i = G.exec(r.sql);
297
+ if (!i) throw m(`Cohort '${n}' must select exactly one plain column from a single table.`);
298
+ let [, a, o] = i, s = P(e.profile, o), c = h(e)[s === "PARTICIPANTS" ? "participants" : "dataReferences"], l = c.find((e) => e.name === a);
299
+ if (!l?.columnType || l.columnType.endsWith("_LIST")) throw m(`Cohort '${n}' must select a non-list column of ${o}: ${a}`);
300
+ return {
301
+ name: n,
302
+ query: r,
303
+ perspective: s,
304
+ columnName: a,
305
+ columnType: l.columnType,
306
+ columnModels: c
307
+ };
308
+ }
309
+ function J(e, t, n, r, i) {
310
+ let { rows: a } = R(e, t.perspective, t.query, {
311
+ listColumnNames: new Set(t.columnModels.filter((e) => e.columnType?.endsWith("_LIST")).map((e) => e.name)),
312
+ cohortValues: /* @__PURE__ */ new Map()
313
+ }), o = new Set(a.map((e) => String(e[t.columnName])));
314
+ if (o.size > i) throw new p(400, {
315
+ concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
316
+ reason: `Cohort '${t.name}' exceeds the maximum of ${i} values.`,
317
+ errorCode: "COHORT_TOO_LARGE"
318
+ });
319
+ return r === "AGGREGATE_ONLY" && L(o.size, F(e.profile, n, r)), o;
320
+ }
321
+ function Y(e, t, n, r, i) {
322
+ let { filter: a, isDefining: o } = t, s = e.materialRows.length > 0 && a.columnName in e.materialRows[0] ? "STRING" : void 0, c = o ? s : r.find((e) => e.name === a.columnName)?.columnType;
323
+ if (c === void 0) throw m(`Column does not exist: ${a.columnName}`);
324
+ if (c !== n.columnType) throw m(`The column type of cohort '${a.cohortName}' (${n.columnType}) does not match ${a.columnName} (${c}).`);
325
+ let l = a.columnName === "individualId" || e.profile.participantAttributes.some((e) => e.name === a.columnName && e.isQuasiIdentifier);
326
+ if (i === "AGGREGATE_ONLY" && !l) throw new p(403, {
327
+ concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
328
+ reason: `A cohort from an aggregate-only source can only filter a quasi-identifier column, and ${a.columnName} is not one.`
329
+ });
330
+ }
331
+ function X(e, t, n, r, i) {
332
+ let a = t.query.cohorts ?? [], o = K(t.query.additionalFilters ?? []);
333
+ if (a.length > U) throw m(`A query can define at most ${U} cohorts.`);
334
+ let s = /* @__PURE__ */ new Set();
335
+ for (let { name: e } of a) {
336
+ if (!W.test(e)) throw m(`Cohort name must be a simple identifier: ${e}`);
337
+ if (s.has(e)) throw m(`Cohort names must be unique: ${e}`);
338
+ s.add(e);
339
+ }
340
+ let c = new Set(o.map((e) => e.filter.cohortName));
341
+ for (let e of c) if (!s.has(e)) throw m(`Cohort is not defined: ${e}`);
342
+ for (let e of s) if (!c.has(e)) throw m(`Cohort is defined but never referenced: ${e}`);
343
+ let l = new Map(a.map((t) => [t.name, q(e, t)]));
344
+ for (let t of o) Y(e, t, l.get(t.filter.cohortName), r, n);
345
+ return new Map(Array.from(l, ([r, a]) => [r, J(e, a, t, n, i)]));
346
+ }
347
+ function Z(e, t, n, r) {
348
+ let i = P(e.profile, t.entityId), a = h(e)[i === "PARTICIPANTS" ? "participants" : "dataReferences"], o = new Set(a.filter((e) => e.columnType?.endsWith("_LIST")).map((e) => e.name)), s = t.partMask ?? 0, { query: c } = t, l = F(e.profile, t, n);
349
+ I(i, s, l !== void 0);
350
+ let u = R(e, i, c, {
351
+ listColumnNames: o,
352
+ cohortValues: X(e, t, n, a, r.maxCohortValues ?? 1e4)
353
+ });
354
+ L(u.rows.length, l);
355
+ let p = { concreteType: "org.sagebionetworks.repo.model.table.QueryResultBundle" }, m = a.map(({ id: e, name: t, columnType: n }) => ({
356
+ id: e,
357
+ name: t,
358
+ columnType: n
359
+ }));
360
+ return s & 1 && (p.queryResult = z(t.entityId, a, m, u.rows, c)), s & 2 && (p.queryCount = u.rows.length), s & 4 && (p.selectColumns = m), s & 8 && (p.maxRowsPerPage = f), s & 16 && (p.columnModels = a), s & 32 && (p.facets = B(a, c, u, l), p.facetPostProcessingApplied = l?.facetPostProcessingConfig !== void 0), s & 128 && (p.lastUpdatedOn = d), s & 256 && (p.combinedSql = V(t.entityId, c.additionalFilters ?? [])), p;
361
+ }
362
+ function Q(e, t, n, r = {}) {
363
+ try {
364
+ return {
365
+ status: 200,
366
+ body: Z(e, t, n, r)
367
+ };
368
+ } catch (e) {
369
+ if (e instanceof p) return {
370
+ status: e.status,
371
+ body: e.body
372
+ };
373
+ throw e;
374
+ }
375
+ }
376
+ //#endregion
377
+ export { s as MOCK_BELOW_THRESHOLD_HTTP_STATUS, H as MOCK_MAX_COHORT_VALUES, c as MOCK_ROW_SUPPRESSED_HTTP_STATUS, h as getCohortBuilderColumnModels, Q as runCohortBuilderMockQuery };
378
+
379
+ //# sourceMappingURL=cohortBuilderMockQueryEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohortBuilderMockQueryEngine.js","names":[],"sources":["../../../src/mocks/cohortBuilder/cohortBuilderMockQueryEngine.ts"],"sourcesContent":["import {\n BUNDLE_MASK_COMBINED_SQL,\n BUNDLE_MASK_LAST_UPDATED_ON,\n BUNDLE_MASK_QUERY_COLUMN_MODELS,\n BUNDLE_MASK_QUERY_COUNT,\n BUNDLE_MASK_QUERY_FACETS,\n BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE,\n BUNDLE_MASK_QUERY_RESULTS,\n BUNDLE_MASK_QUERY_SELECT_COLUMNS,\n} from '@/utils/SynapseConstants'\nimport { AggregateDataConfiguration } from '@sage-bionetworks/synapse-client/generated/models/AggregateDataConfiguration'\nimport { BelowThresholdErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/BelowThresholdErrorResponse'\nimport { ColumnModel } from '@sage-bionetworks/synapse-client/generated/models/ColumnModel'\nimport { ErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/ErrorResponse'\nimport { FacetColumnResult } from '@sage-bionetworks/synapse-client/generated/models/FacetColumnResult'\nimport { QueryResultBundle } from '@sage-bionetworks/synapse-client/generated/models/QueryResultBundle'\nimport { RowSuppressionErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/RowSuppressionErrorResponse'\nimport { TableQueryResult } from '@sage-bionetworks/synapse-client/generated/models/TableQueryResult'\nimport { TableSelectColumn } from '@sage-bionetworks/synapse-client/generated/models/TableSelectColumn'\nimport {\n CohortDefinition,\n ColumnCohortFilter,\n ColumnMultiValueFunction,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueFilterOperator,\n ColumnSingleValueQueryFilter,\n FacetColumnRequest,\n Query,\n QueryBundleRequest,\n QueryFilter,\n SortItem,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CohortBuilderMockProfile,\n DATA_REFERENCE_COLUMN_NAME,\n PARTICIPANT_ID_COLUMN_NAME,\n REFERENCE_TYPE_COLUMN_NAME,\n STUDY_COLUMN_NAME,\n} from './cohortBuilderMockProfiles'\nimport {\n CohortBuilderSyntheticData,\n createSeededRandom,\n MaterialRow,\n} from './cohortBuilderSyntheticData'\n\n/**\n * Which access tier the mocked caller has on the participants source:\n * - `FULL`: the caller met the access requirement (exact results, rows allowed).\n * - `AGGREGATE_ONLY`: authenticated but unapproved (count gate, post-processed\n * facets, no participant rows).\n */\nexport type CohortBuilderAccess = 'FULL' | 'AGGREGATE_ONLY'\n\nexport type CohortBuilderMockErrorBody =\n | ErrorResponse\n | BelowThresholdErrorResponse\n | RowSuppressionErrorResponse\n\nexport type CohortBuilderMockQueryResult =\n | { status: 200; body: QueryResultBundle }\n | { status: number; body: CohortBuilderMockErrorBody }\n\nexport const MOCK_BELOW_THRESHOLD_HTTP_STATUS = 403\nexport const MOCK_ROW_SUPPRESSED_HTTP_STATUS = 403\n\nconst DATA_VIRTUAL_TABLE_ID_COLUMN_NAME = 'id'\nconst DATA_VIRTUAL_TABLE_NAME_COLUMN_NAME = 'name'\nconst MOCK_LAST_UPDATED_ON = '2026-10-01T00:00:00.000Z'\nconst MOCK_MAX_ROWS_PER_PAGE = 1000\n\ntype CellValue = string | number | readonly string[]\ntype VirtualTableRow = Readonly<Record<string, CellValue>>\ntype Perspective = 'PARTICIPANTS' | 'DATA'\n\nclass MockQueryError extends Error {\n constructor(\n readonly status: number,\n readonly body: CohortBuilderMockErrorBody,\n ) {\n super(body.reason)\n }\n}\n\nfunction invalidQuery(reason: string): MockQueryError {\n return new MockQueryError(400, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason,\n })\n}\n\n/** Column models of both VirtualTables, derived from the synthetic data's profile. */\nexport function getCohortBuilderColumnModels(data: CohortBuilderSyntheticData) {\n const { profile, dataAttributeNames } = data\n let nextColumnId = 1\n const column = (\n name: string,\n columnType: ColumnModel['columnType'],\n isFaceted: boolean,\n ): ColumnModel => ({\n id: String(nextColumnId++),\n name,\n columnType,\n facetType: isFaceted ? 'enumeration' : undefined,\n })\n const participants: ColumnModel[] = [\n column(PARTICIPANT_ID_COLUMN_NAME, 'STRING', false),\n column(STUDY_COLUMN_NAME, 'STRING', true),\n ...profile.participantAttributes.map(attribute =>\n column(attribute.name, 'STRING', true),\n ),\n ...dataAttributeNames.map(name => column(name, 'STRING_LIST', true)),\n ]\n const dataReferences: ColumnModel[] = [\n column(DATA_VIRTUAL_TABLE_ID_COLUMN_NAME, 'ENTITYID', false),\n column(DATA_VIRTUAL_TABLE_NAME_COLUMN_NAME, 'STRING', false),\n column(REFERENCE_TYPE_COLUMN_NAME, 'STRING', true),\n column(STUDY_COLUMN_NAME, 'STRING', true),\n ...dataAttributeNames.map(name => column(name, 'STRING', true)),\n ]\n return { participants, dataReferences }\n}\n\n// -----------------------------------------------------------------------------\n// Filter evaluation\n// -----------------------------------------------------------------------------\n\nfunction likeToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n .replaceAll('%', '.*')\n .replaceAll('_', '.')\n return new RegExp(`^${escaped}$`, 'i')\n}\n\nfunction compareCellValues(a: string | number, b: string | number): number {\n const aNumber = Number(a)\n const bNumber = Number(b)\n if (Number.isFinite(aNumber) && Number.isFinite(bNumber)) {\n return aNumber - bNumber\n }\n return String(a).localeCompare(String(b))\n}\n\nfunction singleValueMatches(\n value: string | number,\n operator: ColumnSingleValueFilterOperator,\n values: readonly string[],\n): boolean {\n switch (operator) {\n case ColumnSingleValueFilterOperator.EQUAL:\n case ColumnSingleValueFilterOperator.IN:\n return values.includes(String(value))\n case ColumnSingleValueFilterOperator.LIKE:\n return values.some(pattern => likeToRegExp(pattern).test(String(value)))\n case ColumnSingleValueFilterOperator.NOT_EQUAL:\n return values.every(v => String(value) !== v)\n case ColumnSingleValueFilterOperator.GREATER_THAN:\n return compareCellValues(value, values[0]) > 0\n case ColumnSingleValueFilterOperator.GREATER_THAN_OR_EQUAL:\n return compareCellValues(value, values[0]) >= 0\n case ColumnSingleValueFilterOperator.LESS_THAN:\n return compareCellValues(value, values[0]) < 0\n case ColumnSingleValueFilterOperator.LESS_THAN_OR_EQUAL:\n return compareCellValues(value, values[0]) <= 0\n case ColumnSingleValueFilterOperator.BETWEEN:\n return (\n compareCellValues(value, values[0]) >= 0 &&\n compareCellValues(value, values[1]) <= 0\n )\n default:\n throw invalidQuery(`Unsupported operator: ${operator}`)\n }\n}\n\nfunction singleValueFilterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: ColumnSingleValueQueryFilter,\n): boolean {\n if (!(filter.columnName in row)) {\n throw invalidQuery(`Column does not exist: ${filter.columnName}`)\n }\n const cell = row[filter.columnName]\n const isEmpty = Array.isArray(cell) ? cell.length === 0 : cell === ''\n if (filter.operator === ColumnSingleValueFilterOperator.IS_NULL) {\n return isEmpty\n }\n if (filter.operator === ColumnSingleValueFilterOperator.IS_NOT_NULL) {\n return !isEmpty\n }\n const cellValues: readonly (string | number)[] = Array.isArray(cell)\n ? cell\n : [cell as string | number]\n return cellValues.some(value =>\n singleValueMatches(value, filter.operator, filter.values),\n )\n}\n\n/** What a filter needs beyond the row: which columns are lists, and the resolved values of each request-scoped cohort. */\ntype FilterContext = {\n listColumnNames: ReadonlySet<string>\n cohortValues: ReadonlyMap<string, ReadonlySet<string>>\n}\n\nfunction multiValueFilterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: ColumnMultiValueFunctionQueryFilter,\n context: FilterContext,\n): boolean {\n if (!context.listColumnNames.has(filter.columnName)) {\n throw invalidQuery(\n `${filter.function} can only be used on a multi-value (list) column: ${filter.columnName}`,\n )\n }\n const cell = row[filter.columnName] as readonly string[]\n if (filter.function === ColumnMultiValueFunction.HAS_LIKE) {\n return filter.values.some(pattern =>\n cell.some(value => likeToRegExp(pattern).test(value)),\n )\n }\n return cell.some(value => filter.values.includes(value))\n}\n\nfunction cohortFilterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: ColumnCohortFilter,\n context: FilterContext,\n): boolean {\n // A plain cohort filter must name a column of the queried table; a defining one is evaluated on MATERIAL rows.\n if (!(filter.columnName in row)) {\n throw invalidQuery(`Column does not exist: ${filter.columnName}`)\n }\n // An empty cohort expands to IN (NULL), which matches nothing.\n return (\n context.cohortValues\n .get(filter.cohortName)\n ?.has(String(row[filter.columnName])) ?? false\n )\n}\n\n/** Evaluates a query filter against one row. */\nfunction filterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: QueryFilter,\n context: FilterContext,\n): boolean {\n switch (filter.concreteType) {\n case 'org.sagebionetworks.repo.model.table.FilterGroup': {\n const children = filter.children ?? []\n const matches =\n filter.operator === 'OR'\n ? children.some(child => filterMatches(row, child, context))\n : children.every(child => filterMatches(row, child, context))\n return filter.not ? !matches : matches\n }\n case 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter':\n return singleValueFilterMatches(row, filter)\n case 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter':\n return multiValueFilterMatches(row, filter, context)\n case 'org.sagebionetworks.repo.model.table.ColumnCohortFilter':\n return cohortFilterMatches(row, filter, context)\n default:\n throw invalidQuery(\n `The Cohort Builder mock does not support ${filter.concreteType}`,\n )\n }\n}\n\nfunction facetSelectionMatches(\n row: VirtualTableRow,\n selection: FacetColumnRequest,\n): boolean {\n const cell = row[selection.columnName]\n const cellValues: readonly (string | number)[] = Array.isArray(cell)\n ? cell\n : [cell as string | number]\n if (\n selection.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest'\n ) {\n return cellValues.some(value =>\n selection.facetValues.includes(String(value)),\n )\n }\n return cellValues.some(\n value =>\n (selection.min === undefined ||\n compareCellValues(value, selection.min) >= 0) &&\n (selection.max === undefined ||\n compareCellValues(value, selection.max) <= 0),\n )\n}\n\n// -----------------------------------------------------------------------------\n// VirtualTable materialization (the defining SQL's GROUP BY)\n// -----------------------------------------------------------------------------\n\nfunction groupByParticipant(\n rows: readonly MaterialRow[],\n data: CohortBuilderSyntheticData,\n): VirtualTableRow[] {\n const byParticipant = new Map<string, MaterialRow[]>()\n for (const row of rows) {\n const participantId = row[PARTICIPANT_ID_COLUMN_NAME]\n const group = byParticipant.get(participantId)\n if (group) {\n group.push(row)\n } else {\n byParticipant.set(participantId, [row])\n }\n }\n return Array.from(byParticipant.values(), group => {\n const first = group[0]\n const participantRow: Record<string, CellValue> = {\n [PARTICIPANT_ID_COLUMN_NAME]: first[PARTICIPANT_ID_COLUMN_NAME],\n [STUDY_COLUMN_NAME]: first[STUDY_COLUMN_NAME],\n }\n for (const attribute of data.profile.participantAttributes) {\n participantRow[attribute.name] = first[attribute.name]\n }\n for (const name of data.dataAttributeNames) {\n participantRow[name] = Array.from(\n new Set(group.map(row => row[name])),\n ).sort((a, b) => a.localeCompare(b))\n }\n return participantRow\n })\n}\n\nfunction groupByDataReference(\n rows: readonly MaterialRow[],\n data: CohortBuilderSyntheticData,\n): VirtualTableRow[] {\n const referenceIds = new Set(rows.map(row => row[DATA_REFERENCE_COLUMN_NAME]))\n return Array.from(referenceIds, referenceId => {\n const reference = data.references.get(referenceId)!\n return {\n [DATA_VIRTUAL_TABLE_ID_COLUMN_NAME]: reference.id,\n [DATA_VIRTUAL_TABLE_NAME_COLUMN_NAME]: reference.name,\n [REFERENCE_TYPE_COLUMN_NAME]: reference.referenceType,\n [STUDY_COLUMN_NAME]: reference.study,\n ...reference.attributes,\n }\n })\n}\n\n// -----------------------------------------------------------------------------\n// Facets and post-processing\n// -----------------------------------------------------------------------------\n\nfunction hashString(value: string): number {\n // FNV-1a, 32-bit\n let hash = 0x811c9dc5\n for (const character of value) {\n hash ^= character.codePointAt(0)!\n hash = Math.imul(hash, 0x01000193)\n }\n return hash >>> 0\n}\n\n/**\n * Adds Laplace noise (scale 1/epsilon) and clamps at zero, like the backend's\n * NOISE algorithm. The mock derives the noise from `noiseKey` so a re-render of\n * the same query shows the same counts; the backend re-samples per execution.\n */\nfunction addLaplaceNoise(\n count: number,\n epsilon: number,\n noiseKey: string,\n): number {\n const u = createSeededRandom(hashString(noiseKey))() - 0.5\n const noise = -(1 / epsilon) * Math.sign(u) * Math.log(1 - 2 * Math.abs(u))\n return Math.max(0, Math.round(count + noise))\n}\n\nfunction countFacetValues(\n rows: readonly VirtualTableRow[],\n columnName: string,\n): Map<string, number> {\n const counts = new Map<string, number>()\n for (const row of rows) {\n const cell = row[columnName]\n const values: readonly string[] =\n typeof cell === 'object' ? cell : [String(cell)]\n for (const value of values) {\n counts.set(value, (counts.get(value) ?? 0) + 1)\n }\n }\n return counts\n}\n\nfunction buildFacet(\n columnName: string,\n counts: ReadonlyMap<string, number>,\n selectedValues: readonly string[],\n aggregateConfig: AggregateDataConfiguration | undefined,\n noiseKeyPrefix: string,\n): FacetColumnResult {\n const sortedCounts = Array.from(counts).sort(\n ([valueA, countA], [valueB, countB]) =>\n countB - countA || valueA.localeCompare(valueB),\n )\n const postProcessing = aggregateConfig?.facetPostProcessingConfig\n const parameters = postProcessing?.parameters\n if (\n postProcessing?.algorithm === 'ROUNDING' &&\n parameters?.concreteType ===\n 'org.sagebionetworks.repo.model.FacetRoundingParameters'\n ) {\n const binSize = parameters.roundTo ?? 1\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnResultBinnedValues',\n columnName,\n facetType: 'enumeration',\n binSize,\n binnedValues: sortedCounts.map(([value, count]) => ({\n value,\n binMin: Math.floor(count / binSize) * binSize,\n isSelected: selectedValues.includes(value),\n })),\n }\n }\n const epsilon =\n postProcessing?.algorithm === 'NOISE' &&\n parameters?.concreteType ===\n 'org.sagebionetworks.repo.model.FacetNoiseParameters'\n ? (parameters.epsilon ?? 1)\n : undefined\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n columnName,\n facetType: 'enumeration',\n facetValues: sortedCounts.map(([value, count]) => ({\n value,\n count:\n epsilon === undefined\n ? count\n : addLaplaceNoise(\n count,\n epsilon,\n `${noiseKeyPrefix}\\u0000${columnName}\\u0000${value}`,\n ),\n isSelected: selectedValues.includes(value),\n })),\n }\n}\n\n// -----------------------------------------------------------------------------\n// Combined SQL (for the Query Builder's SQL summary)\n// -----------------------------------------------------------------------------\n\nfunction sqlLiteral(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`\n}\n\nconst SQL_OPERATOR_BY_FILTER_OPERATOR: Partial<\n Record<ColumnSingleValueFilterOperator, string>\n> = {\n EQUAL: '=',\n NOT_EQUAL: '<>',\n GREATER_THAN: '>',\n GREATER_THAN_OR_EQUAL: '>=',\n LESS_THAN: '<',\n LESS_THAN_OR_EQUAL: '<=',\n LIKE: 'LIKE',\n}\n\nfunction filterToSql(filter: QueryFilter): string {\n switch (filter.concreteType) {\n case 'org.sagebionetworks.repo.model.table.FilterGroup': {\n const joined = (filter.children ?? [])\n .map(filterToSql)\n .join(` ${filter.operator ?? 'AND'} `)\n return `${filter.not ? 'NOT ' : ''}(${joined})`\n }\n case 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter': {\n const column = `\"${filter.columnName}\"`\n switch (filter.operator) {\n case ColumnSingleValueFilterOperator.IN:\n return `${column} IN (${filter.values.map(sqlLiteral).join(', ')})`\n case ColumnSingleValueFilterOperator.IS_NULL:\n return `${column} IS NULL`\n case ColumnSingleValueFilterOperator.IS_NOT_NULL:\n return `${column} IS NOT NULL`\n case ColumnSingleValueFilterOperator.BETWEEN:\n return `${column} BETWEEN ${sqlLiteral(filter.values[0])} AND ${sqlLiteral(filter.values[1])}`\n default: {\n const sqlOperator = SQL_OPERATOR_BY_FILTER_OPERATOR[filter.operator]\n const predicates = filter.values.map(\n value => `${column} ${sqlOperator} ${sqlLiteral(value)}`,\n )\n return predicates.length === 1\n ? predicates[0]\n : `(${predicates.join(' OR ')})`\n }\n }\n }\n case 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter':\n return `\"${filter.columnName}\" ${filter.function} (${filter.values.map(sqlLiteral).join(', ')})`\n case 'org.sagebionetworks.repo.model.table.ColumnCohortFilter':\n return `\"${filter.columnName}\" IN COHORT(${filter.cohortName})`\n default:\n return ''\n }\n}\n\n// -----------------------------------------------------------------------------\n// Query execution\n// -----------------------------------------------------------------------------\n\nfunction sortRows(\n rows: VirtualTableRow[],\n sort: readonly SortItem[] | undefined,\n): VirtualTableRow[] {\n if (!sort || sort.length === 0) {\n return rows\n }\n return [...rows].sort((a, b) => {\n for (const { column, direction } of sort) {\n const toComparable = (cell: CellValue) =>\n Array.isArray(cell) ? cell.join(',') : (cell as string | number)\n const comparison = compareCellValues(\n toComparable(a[column]),\n toComparable(b[column]),\n )\n if (comparison !== 0) {\n return direction === 'DESC' ? -comparison : comparison\n }\n }\n return 0\n })\n}\n\nfunction getPerspective(\n profile: CohortBuilderMockProfile,\n entityId: string,\n): Perspective {\n if (entityId === profile.participantsVirtualTableId) {\n return 'PARTICIPANTS'\n }\n if (entityId === profile.dataVirtualTableId) {\n return 'DATA'\n }\n throw new MockQueryError(404, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason: `The Cohort Builder mock has no table ${entityId}`,\n })\n}\n\nfunction getAggregateConfig(\n profile: CohortBuilderMockProfile,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n): AggregateDataConfiguration | undefined {\n // A data manager's preview applies only to callers who already have full access.\n if (access === 'FULL') {\n return request.aggregateDataPreview\n }\n return {\n suppressionThreshold: profile.suppressionThreshold,\n countSuppressionStrategy: profile.countSuppressionStrategy,\n facetPostProcessingConfig: profile.facetPostProcessingConfig,\n }\n}\n\nfunction assertRowsAllowed(\n perspective: Perspective,\n partMask: number,\n isAggregateOnlyRead: boolean,\n): void {\n // The participant VT projects individualId, a quasi-identifier, so the backend withholds its rows during preflight\n // from aggregate-only callers and from data manager previews.\n if (\n isAggregateOnlyRead &&\n perspective === 'PARTICIPANTS' &&\n (partMask & BUNDLE_MASK_QUERY_RESULTS) !== 0\n ) {\n throw new MockQueryError(MOCK_ROW_SUPPRESSED_HTTP_STATUS, {\n concreteType:\n 'org.sagebionetworks.repo.model.table.RowSuppressionErrorResponse',\n reason:\n 'Row results are withheld because the query projects a quasi-identifier column. Re-run the query without requesting row results.',\n errorCode: 'ROW_SUPPRESSED',\n rowSuppressionReasonCode: 'QID_PROJECTED',\n })\n }\n}\n\nfunction assertAboveSuppressionThreshold(\n matchedRowCount: number,\n aggregateConfig: AggregateDataConfiguration | undefined,\n): void {\n if (!aggregateConfig) {\n return\n }\n // Like the backend's COUNT(*) gate, both perspectives count the rows of the\n // queried VirtualTable: participants, or files and datasets.\n const threshold = aggregateConfig.suppressionThreshold\n if (matchedRowCount > 0 && matchedRowCount < threshold) {\n throw new MockQueryError(MOCK_BELOW_THRESHOLD_HTTP_STATUS, {\n concreteType:\n 'org.sagebionetworks.repo.model.table.BelowThresholdErrorResponse',\n reason: `The number of records matched by this query is below the minimum threshold of ${threshold} required to return a result.`,\n errorCode: 'BELOW_THRESHOLD',\n suppressionThreshold: threshold,\n })\n }\n}\n\ntype MatchedRows = {\n rows: VirtualTableRow[]\n /** The matching rows when one column's facet selection is ignored, as that column's facet counts require. */\n ignoringFacetSelection: (columnName: string) => VirtualTableRow[]\n}\n\nfunction matchRows(\n data: CohortBuilderSyntheticData,\n perspective: Perspective,\n query: Query,\n context: FilterContext,\n): MatchedRows {\n const additionalFilters = query.additionalFilters ?? []\n const selectedFacets = query.selectedFacets ?? []\n const definingFilters = additionalFilters.filter(\n filter => filter.isDefiningCondition,\n )\n const outerFilters = additionalFilters.filter(\n filter => !filter.isDefiningCondition,\n )\n // MATERIAL columns are all scalars.\n const materialContext: FilterContext = {\n ...context,\n listColumnNames: new Set(),\n }\n const materialRows = data.materialRows.filter(row =>\n definingFilters.every(filter =>\n filterMatches(row, filter, materialContext),\n ),\n )\n const virtualTableRows =\n perspective === 'PARTICIPANTS'\n ? groupByParticipant(materialRows, data)\n : groupByDataReference(materialRows, data)\n const filterRows = (ignoredFacetColumnName?: string) =>\n virtualTableRows.filter(\n row =>\n outerFilters.every(filter => filterMatches(row, filter, context)) &&\n selectedFacets.every(\n selection =>\n selection.columnName === ignoredFacetColumnName ||\n facetSelectionMatches(row, selection),\n ),\n )\n return { rows: filterRows(), ignoringFacetSelection: filterRows }\n}\n\nfunction toQueryResult(\n entityId: string,\n columnModels: readonly ColumnModel[],\n selectColumns: TableSelectColumn[],\n rows: VirtualTableRow[],\n query: Query,\n): TableQueryResult {\n const offset = query.offset ?? 0\n const page = sortRows(rows, query.sort).slice(\n offset,\n offset + (query.limit ?? rows.length),\n )\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResult',\n queryResults: {\n concreteType: 'org.sagebionetworks.repo.model.table.RowSet',\n tableId: entityId,\n headers: selectColumns,\n rows: page.map(row => ({\n values: columnModels.map(({ name }) => {\n const cell = row[name!]\n return Array.isArray(cell) ? JSON.stringify(cell) : String(cell)\n }),\n })),\n },\n }\n}\n\nfunction buildFacets(\n columnModels: readonly ColumnModel[],\n query: Query,\n matchedRows: MatchedRows,\n aggregateConfig: AggregateDataConfiguration | undefined,\n): FacetColumnResult[] {\n const selectedFacets = query.selectedFacets ?? []\n const noiseKeyPrefix = JSON.stringify([\n query.additionalFilters ?? [],\n selectedFacets,\n ])\n return columnModels\n .filter(column => column.facetType === 'enumeration')\n .map(({ name }) => {\n const selection = selectedFacets.find(facet => facet.columnName === name)\n return buildFacet(\n name!,\n countFacetValues(matchedRows.ignoringFacetSelection(name!), name!),\n selection?.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest'\n ? selection.facetValues\n : [],\n aggregateConfig,\n noiseKeyPrefix,\n )\n })\n}\n\nfunction toCombinedSql(entityId: string, filters: readonly QueryFilter[]) {\n const predicates = filters.map(filterToSql).filter(Boolean)\n const where =\n predicates.length > 0 ? ` WHERE ${predicates.join(' AND ')}` : ''\n return `SELECT * FROM ${entityId}${where}`\n}\n\n// -----------------------------------------------------------------------------\n// Request-scoped cohorts (design doc §5)\n// -----------------------------------------------------------------------------\n\n/** The stack default of `org.sagebionetworks.table.query.cohort.max.values`. */\nexport const MOCK_MAX_COHORT_VALUES = 10_000\nconst MAX_COHORTS_PER_QUERY = 5\nconst COHORT_NAME_PATTERN = /^[A-Za-z_]\\w*$/\nconst COHORT_SQL_PATTERN = /^\\s*SELECT\\s+(\\w+)\\s+FROM\\s+(syn\\d+)\\s*$/i\n\nexport type CohortBuilderMockQueryOptions = {\n /** Maximum number of distinct values in one cohort. Defaults to {@link MOCK_MAX_COHORT_VALUES}. */\n maxCohortValues?: number\n}\n\ntype CohortReference = {\n filter: ColumnCohortFilter\n /** True when the filter, or the top-level filter containing it, is a defining condition. */\n isDefining: boolean\n}\n\nfunction findCohortReferences(\n filters: readonly QueryFilter[],\n isDefining = false,\n): CohortReference[] {\n return filters.flatMap(filter => {\n const filterIsDefining = isDefining || filter.isDefiningCondition === true\n if (\n filter.concreteType === 'org.sagebionetworks.repo.model.table.FilterGroup'\n ) {\n return findCohortReferences(filter.children ?? [], filterIsDefining)\n }\n return filter.concreteType ===\n 'org.sagebionetworks.repo.model.table.ColumnCohortFilter'\n ? [{ filter, isDefining: filterIsDefining }]\n : []\n })\n}\n\ntype ParsedCohort = {\n name: string\n query: Query\n perspective: Perspective\n columnName: string\n columnType: string\n columnModels: ColumnModel[]\n}\n\n/** Validates a cohort definition's shape without running it. */\nfunction parseCohort(\n data: CohortBuilderSyntheticData,\n cohort: CohortDefinition,\n): ParsedCohort {\n const { name, query } = cohort\n if (\n (query.cohorts?.length ?? 0) > 0 ||\n findCohortReferences(query.additionalFilters ?? []).length > 0\n ) {\n throw invalidQuery(`Cohort '${name}' cannot reference other cohorts.`)\n }\n if (\n (query.sort?.length ?? 0) > 0 ||\n query.limit !== undefined ||\n query.offset !== undefined\n ) {\n throw invalidQuery(`Cohort '${name}' cannot use sort, limit or offset.`)\n }\n const sqlMatch = COHORT_SQL_PATTERN.exec(query.sql)\n if (!sqlMatch) {\n throw invalidQuery(\n `Cohort '${name}' must select exactly one plain column from a single table.`,\n )\n }\n const [, columnName, tableId] = sqlMatch\n const perspective = getPerspective(data.profile, tableId)\n const columnModels =\n getCohortBuilderColumnModels(data)[\n perspective === 'PARTICIPANTS' ? 'participants' : 'dataReferences'\n ]\n const column = columnModels.find(model => model.name === columnName)\n if (!column?.columnType || column.columnType.endsWith('_LIST')) {\n throw invalidQuery(\n `Cohort '${name}' must select a non-list column of ${tableId}: ${columnName}`,\n )\n }\n return {\n name,\n query,\n perspective,\n columnName,\n columnType: column.columnType,\n columnModels,\n }\n}\n\n/** Runs a parsed cohort query as the caller and returns the cohort's distinct values. */\nfunction runCohortQuery(\n data: CohortBuilderSyntheticData,\n cohort: ParsedCohort,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n maxCohortValues: number,\n): Set<string> {\n const { rows } = matchRows(data, cohort.perspective, cohort.query, {\n listColumnNames: new Set(\n cohort.columnModels\n .filter(model => model.columnType?.endsWith('_LIST'))\n .map(model => model.name!),\n ),\n cohortValues: new Map(),\n })\n const values = new Set(rows.map(row => String(row[cohort.columnName])))\n if (values.size > maxCohortValues) {\n throw new MockQueryError(400, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason: `Cohort '${cohort.name}' exceeds the maximum of ${maxCohortValues} values.`,\n errorCode: 'COHORT_TOO_LARGE',\n })\n }\n if (access === 'AGGREGATE_ONLY') {\n assertAboveSuppressionThreshold(\n values.size,\n getAggregateConfig(data.profile, request, access),\n )\n }\n return values\n}\n\nfunction assertCohortReferenceAllowed(\n data: CohortBuilderSyntheticData,\n reference: CohortReference,\n cohort: ParsedCohort,\n columnModels: readonly ColumnModel[],\n access: CohortBuilderAccess,\n): void {\n const { filter, isDefining } = reference\n // A defining-condition filter is resolved against the VirtualTable's source (MATERIAL), whose columns are strings.\n const sourceColumnType =\n data.materialRows.length > 0 && filter.columnName in data.materialRows[0]\n ? 'STRING'\n : undefined\n const referencedColumnType = isDefining\n ? sourceColumnType\n : columnModels.find(model => model.name === filter.columnName)?.columnType\n if (referencedColumnType === undefined) {\n throw invalidQuery(`Column does not exist: ${filter.columnName}`)\n }\n if (referencedColumnType !== cohort.columnType) {\n throw invalidQuery(\n `The column type of cohort '${filter.cohortName}' (${cohort.columnType}) does not match ${filter.columnName} (${referencedColumnType}).`,\n )\n }\n // §5.6: a cohort from an aggregate-only source may only filter a quasi-identifier column (of a query that is itself\n // aggregate-only, which both mock VirtualTables are for this caller).\n const isQuasiIdentifier =\n filter.columnName === PARTICIPANT_ID_COLUMN_NAME ||\n data.profile.participantAttributes.some(\n attribute =>\n attribute.name === filter.columnName && attribute.isQuasiIdentifier,\n )\n if (access === 'AGGREGATE_ONLY' && !isQuasiIdentifier) {\n throw new MockQueryError(403, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason: `A cohort from an aggregate-only source can only filter a quasi-identifier column, and ${filter.columnName} is not one.`,\n })\n }\n}\n\n/** Validates the query's cohorts and their references, runs each cohort query, and returns each cohort's values. */\nfunction resolveCohorts(\n data: CohortBuilderSyntheticData,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n columnModels: readonly ColumnModel[],\n maxCohortValues: number,\n): Map<string, Set<string>> {\n const cohorts = request.query.cohorts ?? []\n const references = findCohortReferences(request.query.additionalFilters ?? [])\n if (cohorts.length > MAX_COHORTS_PER_QUERY) {\n throw invalidQuery(\n `A query can define at most ${MAX_COHORTS_PER_QUERY} cohorts.`,\n )\n }\n const names = new Set<string>()\n for (const { name } of cohorts) {\n if (!COHORT_NAME_PATTERN.test(name)) {\n throw invalidQuery(`Cohort name must be a simple identifier: ${name}`)\n }\n if (names.has(name)) {\n throw invalidQuery(`Cohort names must be unique: ${name}`)\n }\n names.add(name)\n }\n const referencedNames = new Set(\n references.map(reference => reference.filter.cohortName),\n )\n for (const name of referencedNames) {\n if (!names.has(name)) {\n throw invalidQuery(`Cohort is not defined: ${name}`)\n }\n }\n for (const name of names) {\n if (!referencedNames.has(name)) {\n throw invalidQuery(`Cohort is defined but never referenced: ${name}`)\n }\n }\n const parsed = new Map(\n cohorts.map(cohort => [cohort.name, parseCohort(data, cohort)]),\n )\n for (const reference of references) {\n assertCohortReferenceAllowed(\n data,\n reference,\n parsed.get(reference.filter.cohortName)!,\n columnModels,\n access,\n )\n }\n return new Map(\n Array.from(parsed, ([name, cohort]) => [\n name,\n runCohortQuery(data, cohort, request, access, maxCohortValues),\n ]),\n )\n}\n\nfunction executeQuery(\n data: CohortBuilderSyntheticData,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n options: CohortBuilderMockQueryOptions,\n): QueryResultBundle {\n const perspective = getPerspective(data.profile, request.entityId)\n const columnModels =\n getCohortBuilderColumnModels(data)[\n perspective === 'PARTICIPANTS' ? 'participants' : 'dataReferences'\n ]\n const listColumnNames = new Set(\n columnModels\n .filter(column => column.columnType?.endsWith('_LIST'))\n .map(column => column.name!),\n )\n const partMask = request.partMask ?? 0\n const { query } = request\n const aggregateConfig = getAggregateConfig(data.profile, request, access)\n assertRowsAllowed(perspective, partMask, aggregateConfig !== undefined)\n const cohortValues = resolveCohorts(\n data,\n request,\n access,\n columnModels,\n options.maxCohortValues ?? MOCK_MAX_COHORT_VALUES,\n )\n const matchedRows = matchRows(data, perspective, query, {\n listColumnNames,\n cohortValues,\n })\n assertAboveSuppressionThreshold(matchedRows.rows.length, aggregateConfig)\n\n const bundle: QueryResultBundle = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResultBundle',\n }\n const selectColumns = columnModels.map(({ id, name, columnType }) => ({\n id,\n name,\n columnType,\n }))\n if (partMask & BUNDLE_MASK_QUERY_RESULTS) {\n bundle.queryResult = toQueryResult(\n request.entityId,\n columnModels,\n selectColumns,\n matchedRows.rows,\n query,\n )\n }\n if (partMask & BUNDLE_MASK_QUERY_COUNT) {\n bundle.queryCount = matchedRows.rows.length\n }\n if (partMask & BUNDLE_MASK_QUERY_SELECT_COLUMNS) {\n bundle.selectColumns = selectColumns\n }\n if (partMask & BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE) {\n bundle.maxRowsPerPage = MOCK_MAX_ROWS_PER_PAGE\n }\n if (partMask & BUNDLE_MASK_QUERY_COLUMN_MODELS) {\n bundle.columnModels = columnModels\n }\n if (partMask & BUNDLE_MASK_QUERY_FACETS) {\n bundle.facets = buildFacets(\n columnModels,\n query,\n matchedRows,\n aggregateConfig,\n )\n bundle.facetPostProcessingApplied =\n aggregateConfig?.facetPostProcessingConfig !== undefined\n }\n if (partMask & BUNDLE_MASK_LAST_UPDATED_ON) {\n bundle.lastUpdatedOn = MOCK_LAST_UPDATED_ON\n }\n if (partMask & BUNDLE_MASK_COMBINED_SQL) {\n bundle.combinedSql = toCombinedSql(\n request.entityId,\n query.additionalFilters ?? [],\n )\n }\n return bundle\n}\n\n/**\n * Emulates a Cohort Builder 2.0 table query against synthetic data, returning\n * either a QueryResultBundle or the error the backend would return.\n */\nexport function runCohortBuilderMockQuery(\n data: CohortBuilderSyntheticData,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n options: CohortBuilderMockQueryOptions = {},\n): CohortBuilderMockQueryResult {\n try {\n return { status: 200, body: executeQuery(data, request, access, options) }\n } catch (error) {\n if (error instanceof MockQueryError) {\n return { status: error.status, body: error.body }\n }\n throw error\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { CohortBuilderMockProfile } from './cohortBuilderMockProfiles';
2
+ export type ReferenceType = 'FILE' | 'DATASET';
3
+ /** One MATERIAL row: a participant joined to one file or dataset reference. */
4
+ export type MaterialRow = Readonly<Record<string, string>>;
5
+ export type SyntheticDataReference = {
6
+ id: string;
7
+ name: string;
8
+ referenceType: ReferenceType;
9
+ study: string;
10
+ attributes: Readonly<Record<string, string>>;
11
+ };
12
+ export type CohortBuilderSyntheticData = {
13
+ profile: CohortBuilderMockProfile;
14
+ dataAttributeNames: readonly string[];
15
+ references: ReadonlyMap<string, SyntheticDataReference>;
16
+ materialRows: readonly MaterialRow[];
17
+ };
18
+ export declare const DEFAULT_SYNTHETIC_DATA_SEED = 42;
19
+ /** Mulberry32: a small, fast, seedable PRNG returning floats in [0, 1). */
20
+ export declare function createSeededRandom(seed: number): () => number;
21
+ /**
22
+ * Generates a deterministic synthetic participant ⋈ file/dataset dataset (the
23
+ * MATERIAL rows) from a mock profile.
24
+ */
25
+ export declare function createCohortBuilderSyntheticData(profile: CohortBuilderMockProfile, seed?: number): CohortBuilderSyntheticData;
26
+ //# sourceMappingURL=cohortBuilderSyntheticData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohortBuilderSyntheticData.d.ts","sourceRoot":"","sources":["../../../src/mocks/cohortBuilder/cohortBuilderSyntheticData.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EASzB,MAAM,6BAA6B,CAAA;AAEpC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAA;AAE9C,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAE1D,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,aAAa,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC7C,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,wBAAwB,CAAA;IACjC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IACvD,YAAY,EAAE,SAAS,WAAW,EAAE,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,2BAA2B,KAAK,CAAA;AAQ7C,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAS7D;AAuMD;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,wBAAwB,EACjC,IAAI,GAAE,MAAoC,GACzC,0BAA0B,CA2B5B"}
@@ -0,0 +1,112 @@
1
+ import { CORE_DATA_ATTRIBUTE_NAMES as e, DATA_REFERENCE_COLUMN_NAME as t, PARTICIPANT_ID_COLUMN_NAME as n, REFERENCE_TYPE_COLUMN_NAME as r, STUDY_COLUMN_NAME as i } from "./cohortBuilderMockProfiles.js";
2
+ //#region src/mocks/cohortBuilder/cohortBuilderSyntheticData.ts
3
+ var a = 42, o = 3, s = 4;
4
+ function c(e) {
5
+ let t = e >>> 0;
6
+ return () => {
7
+ t = t + 1831565813 >>> 0;
8
+ let e = t;
9
+ return e = Math.imul(e ^ e >>> 15, e | 1), e ^= e + Math.imul(e ^ e >>> 7, e | 61), ((e ^ e >>> 14) >>> 0) / 4294967296;
10
+ };
11
+ }
12
+ function l(e, t) {
13
+ let n = Object.entries(t), r = n.reduce((e, [, t]) => e + t, 0), i = e() * r;
14
+ for (let [e, t] of n) if (i -= t, i < 0) return e;
15
+ return n.at(-1)[0];
16
+ }
17
+ function u(e, t) {
18
+ return t[Math.floor(e() * t.length)];
19
+ }
20
+ function d(e, t, n) {
21
+ let r = t.filter(() => e() < .6);
22
+ for (; r.length < n;) {
23
+ let n = u(e, t);
24
+ r.includes(n) || r.push(n);
25
+ }
26
+ return r;
27
+ }
28
+ function f(e, t, r, a) {
29
+ return Array.from({ length: r.participantCount }, (o, s) => {
30
+ let c = {
31
+ [n]: `${t.participantIdPrefix}-${String(a + s).padStart(6, "0")}`,
32
+ [i]: r.name
33
+ };
34
+ for (let n of t.participantAttributes) c[n.name] = l(e, n.values);
35
+ return c;
36
+ });
37
+ }
38
+ function p(e, n) {
39
+ let i = /* @__PURE__ */ new Map(), a = [], o = n.firstReferenceEntityId;
40
+ return {
41
+ random: e,
42
+ references: i,
43
+ materialRows: a,
44
+ addReference(t, r, a, s) {
45
+ let c = {
46
+ dataType: r.dataType,
47
+ assay: r.assay,
48
+ fileFormat: u(e, r.fileFormats)
49
+ };
50
+ for (let t of n.extraDataAttributeNames) c[t] = u(e, r.extraAttributes[t] ?? ["Unknown"]);
51
+ let l = {
52
+ id: `syn${o++}`,
53
+ name: s,
54
+ referenceType: a,
55
+ study: t.name,
56
+ attributes: c
57
+ };
58
+ return i.set(l.id, l), l;
59
+ },
60
+ link(e, n) {
61
+ for (let i of e) a.push({
62
+ ...i,
63
+ [t]: n.id,
64
+ [r]: n.referenceType,
65
+ ...n.attributes
66
+ });
67
+ }
68
+ };
69
+ }
70
+ function m(e, t, n) {
71
+ for (let r of t.assays) {
72
+ let i = e.addReference(t, r, "DATASET", `${t.name} ${r.assay} (synthetic)`);
73
+ e.link(n, i);
74
+ }
75
+ }
76
+ function h(e, t, n, r) {
77
+ let { random: i } = e;
78
+ for (let a = 1; a <= s; a++) {
79
+ let s = o + Math.floor(i() * 10), c = e.addReference(t, n, "FILE", `${t.name}_${n.assay}_batch${a}_matrix`), l = Math.floor(i() * Math.max(1, r.length - s));
80
+ e.link(r.slice(l, l + s), c);
81
+ }
82
+ }
83
+ function g(e, t, n) {
84
+ let r = new Map(t.assays.map((e) => [e, []]));
85
+ for (let i of n) for (let n of d(e.random, t.assays, 1)) {
86
+ r.get(n).push(i);
87
+ let a = e.addReference(t, n, "FILE", `${t.name}_${n.assay}_sample${String(e.references.size).padStart(5, "0")}`);
88
+ e.link([i], a);
89
+ }
90
+ for (let [n, i] of r) {
91
+ if (i.length === 0) continue;
92
+ let r = e.addReference(t, n, "FILE", `${t.name}_${n.assay}_all_participants_matrix`);
93
+ e.link(i, r), h(e, t, n, i);
94
+ }
95
+ }
96
+ function _(t, n = 42) {
97
+ let r = c(n), i = p(r, t), a = 1;
98
+ for (let e of t.studies) {
99
+ let n = f(r, t, e, a);
100
+ a += n.length, e.mapping === "DATASET" ? m(i, e, n) : g(i, e, n);
101
+ }
102
+ return {
103
+ profile: t,
104
+ dataAttributeNames: [...e, ...t.extraDataAttributeNames],
105
+ references: i.references,
106
+ materialRows: i.materialRows
107
+ };
108
+ }
109
+ //#endregion
110
+ export { a as DEFAULT_SYNTHETIC_DATA_SEED, _ as createCohortBuilderSyntheticData, c as createSeededRandom };
111
+
112
+ //# sourceMappingURL=cohortBuilderSyntheticData.js.map