@morscherlab/mint-sdk 1.0.0-rc.2 → 1.0.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
  2. package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
  3. package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
  4. package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
  5. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  6. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  7. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  8. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  9. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  10. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  11. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  12. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  13. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  14. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  15. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  16. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  17. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  18. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  19. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  20. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  21. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  22. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  23. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  24. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  25. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  26. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  27. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  28. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  29. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  30. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  31. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  32. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  33. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  34. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  35. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  36. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  37. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  38. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  39. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  40. package/dist/components/AppTopBar.navigation.d.ts +11 -0
  41. package/dist/components/BaseButton.vue.d.ts +1 -1
  42. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  43. package/dist/components/BaseInput.vue.d.ts +2 -2
  44. package/dist/components/BasePill.vue.d.ts +1 -1
  45. package/dist/components/BaseRadioGroup.vue.d.ts +1 -1
  46. package/dist/components/BaseSelect.vue.d.ts +1 -1
  47. package/dist/components/BaseSlider.vue.d.ts +2 -2
  48. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  49. package/dist/components/BaseToggle.vue.d.ts +1 -1
  50. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  51. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  52. package/dist/components/ColorSlider.vue.d.ts +2 -2
  53. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  54. package/dist/components/DatePicker.vue.d.ts +1 -1
  55. package/dist/components/DateTimePicker.vue.d.ts +2 -2
  56. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
  57. package/dist/components/DropdownButton.vue.d.ts +1 -1
  58. package/dist/components/FileUploader.vue.d.ts +2 -2
  59. package/dist/components/FormulaInput.vue.d.ts +2 -2
  60. package/dist/components/IconButton.vue.d.ts +1 -1
  61. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  62. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  63. package/dist/components/MultiSelect.vue.d.ts +1 -1
  64. package/dist/components/NumberInput.vue.d.ts +1 -1
  65. package/dist/components/PlateMapEditor.vue.d.ts +6 -6
  66. package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
  67. package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
  68. package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
  69. package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
  70. package/dist/components/PluginWorkspaceView.vue.d.ts +46 -195
  71. package/dist/components/ProgressBar.vue.d.ts +1 -1
  72. package/dist/components/ProtocolStep.presentation.d.ts +4 -0
  73. package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
  74. package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
  75. package/dist/components/ReagentList.presentation.d.ts +16 -0
  76. package/dist/components/ResourceCard.vue.d.ts +1 -1
  77. package/dist/components/SampleSelector.colors.d.ts +13 -0
  78. package/dist/components/SampleSelector.drag.d.ts +24 -0
  79. package/dist/components/SampleSelector.groups.d.ts +15 -0
  80. package/dist/components/SampleSelector.selection.d.ts +26 -0
  81. package/dist/components/SampleSelector.vue.d.ts +4 -1
  82. package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
  83. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  84. package/dist/components/SequenceInput.vue.d.ts +2 -2
  85. package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
  86. package/dist/components/SettingsModal.schema.d.ts +9 -0
  87. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  88. package/dist/components/TagsInput.vue.d.ts +2 -2
  89. package/dist/components/TimePicker.vue.d.ts +2 -2
  90. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  91. package/dist/components/UnitInput.vue.d.ts +2 -2
  92. package/dist/components/WellPlate.colors.d.ts +9 -0
  93. package/dist/components/WellPlate.conditions.d.ts +26 -0
  94. package/dist/components/WellPlate.geometry.d.ts +23 -0
  95. package/dist/components/WellPlate.interaction.d.ts +71 -0
  96. package/dist/components/WellPlate.legend.d.ts +2 -0
  97. package/dist/components/WellPlate.rendering.d.ts +24 -0
  98. package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
  99. package/dist/components/WellPlate.vue.d.ts +1 -1
  100. package/dist/components/index.js +2 -2
  101. package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
  102. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
  103. package/dist/{components-BhK-dW99.js → components-DtHA2bgp.js} +3754 -2991
  104. package/dist/components-DtHA2bgp.js.map +1 -0
  105. package/dist/composables/autoGroup/classKey.d.ts +4 -0
  106. package/dist/composables/autoGroup/classify.d.ts +28 -0
  107. package/dist/composables/autoGroup/colors.d.ts +2 -0
  108. package/dist/composables/autoGroup/columns.d.ts +10 -0
  109. package/dist/composables/autoGroup/compose.d.ts +8 -0
  110. package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
  111. package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
  112. package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
  113. package/dist/composables/autoGroup/index.d.ts +16 -0
  114. package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
  115. package/dist/composables/autoGroup/template.d.ts +15 -0
  116. package/dist/composables/autoGroup/tokenize.d.ts +8 -0
  117. package/dist/composables/autoGroupConstants.d.ts +1 -0
  118. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  119. package/dist/composables/controlComponentBindings.d.ts +7 -0
  120. package/dist/composables/controlSchemaAdapters.d.ts +20 -0
  121. package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
  122. package/dist/composables/controlSchemaFormFields.d.ts +3 -0
  123. package/dist/composables/controlSchemaLayout.d.ts +7 -0
  124. package/dist/composables/controlSchemaModel.d.ts +5 -0
  125. package/dist/composables/controlSchemaNormalize.d.ts +15 -0
  126. package/dist/composables/controlSchemaTypes.d.ts +305 -0
  127. package/dist/composables/controlSchemaUtils.d.ts +9 -0
  128. package/dist/composables/controlWorkspaceOptions.d.ts +2 -0
  129. package/dist/composables/formBuilderSchema.d.ts +18 -0
  130. package/dist/composables/index.js +3 -3
  131. package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
  132. package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
  133. package/dist/composables/useAutoGroup.d.ts +61 -74
  134. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  135. package/dist/composables/useBioTemplateControls.d.ts +1 -1
  136. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
  137. package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
  138. package/dist/composables/useControlSchema.d.ts +8 -346
  139. package/dist/composables/useControlWorkspace.d.ts +5 -0
  140. package/dist/composables/useForm.d.ts +2 -33
  141. package/dist/composables/useFormBuilder.d.ts +2 -9
  142. package/dist/composables/useFormValidation.d.ts +34 -0
  143. package/dist/composables/usePluginClient.d.ts +1 -4
  144. package/dist/composables/useProtocolTemplates.d.ts +2 -24
  145. package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
  146. package/dist/{composables-Bg7CFuNz.js → composables-Dlg8jenH.js} +33 -31
  147. package/dist/composables-Dlg8jenH.js.map +1 -0
  148. package/dist/index.js +4 -4
  149. package/dist/install.js +2 -2
  150. package/dist/styles.css +547 -516
  151. package/dist/templates/adapters.d.ts +14 -47
  152. package/dist/templates/assayLookups.d.ts +3 -0
  153. package/dist/templates/assayMatrixAdapters.d.ts +6 -0
  154. package/dist/templates/assayMatrixBuilder.d.ts +2 -0
  155. package/dist/templates/assayNormalizers.d.ts +4 -0
  156. package/dist/templates/builderDefaults.d.ts +1 -0
  157. package/dist/templates/builderIdUtils.d.ts +4 -0
  158. package/dist/templates/builderPresetControls.d.ts +10 -0
  159. package/dist/templates/builderReadUtils.d.ts +8 -0
  160. package/dist/templates/builders.d.ts +26 -67
  161. package/dist/templates/calibrationCurveAdapters.d.ts +4 -0
  162. package/dist/templates/calibrationCurveBuilder.d.ts +2 -0
  163. package/dist/templates/calibrationNormalizers.d.ts +5 -0
  164. package/dist/templates/componentBindingCatalog.d.ts +25 -0
  165. package/dist/templates/componentBindingHelpers.d.ts +17 -0
  166. package/dist/templates/componentDoseResponseProps.d.ts +3 -0
  167. package/dist/templates/componentGenericProps.d.ts +8 -0
  168. package/dist/templates/componentPlateHelpers.d.ts +5 -0
  169. package/dist/templates/componentPlateMapProps.d.ts +3 -0
  170. package/dist/templates/componentPropsFactory.d.ts +3 -0
  171. package/dist/templates/componentQpcrPlateProps.d.ts +3 -0
  172. package/dist/templates/componentTargetResolvers.d.ts +5 -0
  173. package/dist/templates/componentTemplateProps.d.ts +3 -0
  174. package/dist/templates/controlSchemaClone.d.ts +4 -0
  175. package/dist/templates/controlSchemaConstants.d.ts +10 -0
  176. package/dist/templates/controlSchemaMerge.d.ts +3 -0
  177. package/dist/templates/controlSchemaTargets.d.ts +17 -0
  178. package/dist/templates/controlSchemaTypes.d.ts +4 -0
  179. package/dist/templates/controlSchemas.d.ts +4 -4
  180. package/dist/templates/defaultBioTemplateBuilder.d.ts +2 -0
  181. package/dist/templates/doseResponseAdapters.d.ts +4 -0
  182. package/dist/templates/doseResponseBuilder.d.ts +2 -0
  183. package/dist/templates/elisaAssayCollectionBuilder.d.ts +2 -0
  184. package/dist/templates/flowCytometryAssayCollectionBuilder.d.ts +2 -0
  185. package/dist/templates/flowCytometryPanelBuilder.d.ts +2 -0
  186. package/dist/templates/flowNormalizers.d.ts +8 -0
  187. package/dist/templates/flowPanelAdapters.d.ts +4 -0
  188. package/dist/templates/index.js +1 -1
  189. package/dist/templates/instrumentRunAdapterHelpers.d.ts +8 -0
  190. package/dist/templates/instrumentRunAdapters.d.ts +8 -0
  191. package/dist/templates/instrumentRunBuilder.d.ts +2 -0
  192. package/dist/templates/lcmsBatchCollectionBuilder.d.ts +2 -0
  193. package/dist/templates/plateGeometry.d.ts +4 -0
  194. package/dist/templates/plateMapAdapters.d.ts +3 -0
  195. package/dist/templates/plateMapBuilder.d.ts +2 -0
  196. package/dist/templates/presetControlSchemas.d.ts +534 -0
  197. package/dist/templates/protocolAdapters.d.ts +5 -0
  198. package/dist/templates/protocolNormalizers.d.ts +6 -0
  199. package/dist/templates/protocolStepsBuilder.d.ts +2 -0
  200. package/dist/templates/qpcrAdapters.d.ts +5 -0
  201. package/dist/templates/qpcrExpressionCollectionBuilder.d.ts +2 -0
  202. package/dist/templates/qpcrPlateBuilder.d.ts +2 -0
  203. package/dist/templates/reagentAdapters.d.ts +5 -0
  204. package/dist/templates/reagentListBuilder.d.ts +2 -0
  205. package/dist/templates/runNormalizers.d.ts +10 -0
  206. package/dist/templates/sampleNormalizers.d.ts +4 -0
  207. package/dist/templates/samplePrepAdapters.d.ts +4 -0
  208. package/dist/templates/samplePrepBuilder.d.ts +2 -0
  209. package/dist/templates/sampleSheetAdapters.d.ts +5 -0
  210. package/dist/templates/sampleSheetBuilder.d.ts +2 -0
  211. package/dist/templates/targetedMetabolomicsCollectionBuilder.d.ts +2 -0
  212. package/dist/templates/targetedMetabolomicsHelpers.d.ts +5 -0
  213. package/dist/templates/templateAdapterTypes.d.ts +48 -0
  214. package/dist/templates/templateControlSchemas.d.ts +400 -0
  215. package/dist/templates/templateCreateOptions.d.ts +165 -0
  216. package/dist/templates/templateEnvelopes.d.ts +9 -0
  217. package/dist/templates/templatePackCollectionBuilder.d.ts +2 -0
  218. package/dist/templates/templatePresetCollectionBuilder.d.ts +18 -0
  219. package/dist/templates/templateQpcrTypes.d.ts +42 -0
  220. package/dist/templates/templateValidators.d.ts +13 -0
  221. package/dist/templates/timeCourseAdapters.d.ts +5 -0
  222. package/dist/templates/timeCourseBuilder.d.ts +2 -0
  223. package/dist/templates/types.d.ts +5 -250
  224. package/dist/templates/wellPlateScreenCollectionBuilder.d.ts +2 -0
  225. package/dist/templates/westernBlotAssayCollectionBuilder.d.ts +2 -0
  226. package/dist/{templates-BorLR_7p.js → templates-DtdUvJ4c.js} +3565 -3411
  227. package/dist/templates-DtdUvJ4c.js.map +1 -0
  228. package/dist/types/auto-group.d.ts +79 -9
  229. package/dist/types/componentLabTypes.d.ts +161 -0
  230. package/dist/types/componentWorkflowTypes.d.ts +150 -0
  231. package/dist/types/components.d.ts +2 -311
  232. package/dist/{useProtocolTemplates-n6AJqSqv.js → useProtocolTemplates-Bm5vyH4_.js} +1220 -454
  233. package/dist/useProtocolTemplates-Bm5vyH4_.js.map +1 -0
  234. package/package.json +1 -1
  235. package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
  236. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  237. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  238. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  239. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  240. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +41 -0
  241. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  242. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  243. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  244. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  245. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  246. package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
  247. package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
  248. package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
  249. package/src/__tests__/components/SampleSelector.test.ts +32 -0
  250. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
  251. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  252. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  253. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  254. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  255. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  256. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  257. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  258. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  259. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  260. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  261. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  262. package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
  263. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  264. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
  265. package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
  266. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  267. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  268. package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
  269. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
  270. package/src/__tests__/composables/useControlSchema.test.ts +23 -0
  271. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  272. package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
  273. package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
  274. package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
  275. package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
  276. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  277. package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
  278. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  279. package/src/components/AppSidebar.vue +2 -6
  280. package/src/components/AppTopBar.navigation.ts +62 -0
  281. package/src/components/AppTopBar.vue +17 -44
  282. package/src/components/AutoGroupModal.story.vue +50 -0
  283. package/src/components/AutoGroupModal.vue +441 -158
  284. package/src/components/ControlWorkspaceView.vue +2 -6
  285. package/src/components/DoseCalculator.vue +13 -73
  286. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  287. package/src/components/ExperimentTimeline.vue +6 -31
  288. package/src/components/FormBuilder.vue +2 -7
  289. package/src/components/PlateMapEditor.vue +32 -106
  290. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  291. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  292. package/src/components/PluginWorkspaceView.props.ts +174 -0
  293. package/src/components/PluginWorkspaceView.shell.ts +66 -0
  294. package/src/components/PluginWorkspaceView.vue +85 -404
  295. package/src/components/ProtocolStep.presentation.ts +31 -0
  296. package/src/components/ProtocolStepEditor.state.ts +104 -0
  297. package/src/components/ProtocolStepEditor.vue +48 -179
  298. package/src/components/ProtocolStepParameterField.vue +134 -0
  299. package/src/components/ReagentList.presentation.ts +105 -0
  300. package/src/components/ReagentList.vue +16 -79
  301. package/src/components/SampleSelector.colors.ts +43 -0
  302. package/src/components/SampleSelector.drag.ts +164 -0
  303. package/src/components/SampleSelector.groups.ts +109 -0
  304. package/src/components/SampleSelector.selection.ts +103 -0
  305. package/src/components/SampleSelector.vue +82 -349
  306. package/src/components/SampleSelectorSampleRow.vue +64 -0
  307. package/src/components/ScheduleCalendar.vue +44 -199
  308. package/src/components/SettingsModal.schema.ts +71 -0
  309. package/src/components/SettingsModal.vue +16 -46
  310. package/src/components/WellPlate.colors.ts +56 -0
  311. package/src/components/WellPlate.conditions.ts +100 -0
  312. package/src/components/WellPlate.geometry.ts +91 -0
  313. package/src/components/WellPlate.interaction.ts +272 -0
  314. package/src/components/WellPlate.legend.ts +8 -0
  315. package/src/components/WellPlate.rendering.ts +105 -0
  316. package/src/components/WellPlate.sampleDrop.ts +73 -0
  317. package/src/components/WellPlate.vue +102 -550
  318. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  319. package/src/composables/autoGroup/classKey.ts +5 -0
  320. package/src/composables/autoGroup/classify.ts +205 -0
  321. package/src/composables/autoGroup/colors.ts +6 -0
  322. package/src/composables/autoGroup/columns.ts +226 -0
  323. package/src/composables/autoGroup/compose.ts +156 -0
  324. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  325. package/src/composables/autoGroup/csv-shim.ts +44 -0
  326. package/src/composables/autoGroup/fingerprint.ts +49 -0
  327. package/src/composables/autoGroup/index.ts +20 -0
  328. package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
  329. package/src/composables/autoGroup/template.ts +126 -0
  330. package/src/composables/autoGroup/tokenize.ts +41 -0
  331. package/src/composables/autoGroup/vocab.json +67 -0
  332. package/src/composables/autoGroupConstants.ts +4 -0
  333. package/src/composables/autoGroupGrouping.ts +148 -0
  334. package/src/composables/controlComponentBindings.ts +80 -0
  335. package/src/composables/controlSchemaAdapters.ts +196 -0
  336. package/src/composables/controlSchemaDoseDesign.ts +215 -0
  337. package/src/composables/controlSchemaFormFields.ts +61 -0
  338. package/src/composables/controlSchemaLayout.ts +59 -0
  339. package/src/composables/controlSchemaModel.ts +163 -0
  340. package/src/composables/controlSchemaNormalize.ts +101 -0
  341. package/src/composables/controlSchemaTypes.ts +364 -0
  342. package/src/composables/controlSchemaUtils.ts +36 -0
  343. package/src/composables/controlWorkspaceOptions.ts +21 -0
  344. package/src/composables/formBuilderSchema.ts +153 -0
  345. package/src/composables/pluginEndpointBuilder.ts +203 -0
  346. package/src/composables/protocolTemplateCatalog.ts +325 -0
  347. package/src/composables/useAutoGroup.ts +395 -549
  348. package/src/composables/useAutoGroupInputSources.ts +147 -0
  349. package/src/composables/useBioTemplateControls.ts +1 -1
  350. package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
  351. package/src/composables/useBioTemplateWorkspace.ts +1 -1
  352. package/src/composables/useControlSchema.ts +64 -1312
  353. package/src/composables/useControlWorkspace.ts +201 -0
  354. package/src/composables/useForm.ts +5 -187
  355. package/src/composables/useFormBuilder.ts +11 -153
  356. package/src/composables/useFormValidation.ts +154 -0
  357. package/src/composables/usePluginClient.ts +10 -193
  358. package/src/composables/useProtocolTemplates.ts +10 -328
  359. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  360. package/src/styles/components/auto-group-modal.css +248 -310
  361. package/src/templates/adapters.ts +89 -930
  362. package/src/templates/assayLookups.ts +33 -0
  363. package/src/templates/assayMatrixAdapters.ts +78 -0
  364. package/src/templates/assayMatrixBuilder.ts +59 -0
  365. package/src/templates/assayNormalizers.ts +34 -0
  366. package/src/templates/builderDefaults.ts +11 -0
  367. package/src/templates/builderIdUtils.ts +20 -0
  368. package/src/templates/builderPresetControls.ts +165 -0
  369. package/src/templates/builderReadUtils.ts +57 -0
  370. package/src/templates/builders.ts +122 -2350
  371. package/src/templates/calibrationCurveAdapters.ts +59 -0
  372. package/src/templates/calibrationCurveBuilder.ts +99 -0
  373. package/src/templates/calibrationNormalizers.ts +60 -0
  374. package/src/templates/componentBindingCatalog.ts +90 -0
  375. package/src/templates/componentBindingHelpers.ts +93 -0
  376. package/src/templates/componentBindings.ts +12 -461
  377. package/src/templates/componentDoseResponseProps.ts +42 -0
  378. package/src/templates/componentGenericProps.ts +77 -0
  379. package/src/templates/componentPlateHelpers.ts +29 -0
  380. package/src/templates/componentPlateMapProps.ts +32 -0
  381. package/src/templates/componentPropsFactory.ts +21 -0
  382. package/src/templates/componentQpcrPlateProps.ts +28 -0
  383. package/src/templates/componentTargetResolvers.ts +69 -0
  384. package/src/templates/componentTemplateProps.ts +78 -0
  385. package/src/templates/controlSchemaClone.ts +32 -0
  386. package/src/templates/controlSchemaConstants.ts +11 -0
  387. package/src/templates/controlSchemaMerge.ts +40 -0
  388. package/src/templates/controlSchemaTargets.ts +87 -0
  389. package/src/templates/controlSchemaTypes.ts +20 -0
  390. package/src/templates/controlSchemas.ts +22 -704
  391. package/src/templates/defaultBioTemplateBuilder.ts +124 -0
  392. package/src/templates/doseResponseAdapters.ts +45 -0
  393. package/src/templates/doseResponseBuilder.ts +44 -0
  394. package/src/templates/elisaAssayCollectionBuilder.ts +62 -0
  395. package/src/templates/flowCytometryAssayCollectionBuilder.ts +41 -0
  396. package/src/templates/flowCytometryPanelBuilder.ts +53 -0
  397. package/src/templates/flowNormalizers.ts +58 -0
  398. package/src/templates/flowPanelAdapters.ts +58 -0
  399. package/src/templates/instrumentRunAdapterHelpers.ts +94 -0
  400. package/src/templates/instrumentRunAdapters.ts +163 -0
  401. package/src/templates/instrumentRunBuilder.ts +97 -0
  402. package/src/templates/lcmsBatchCollectionBuilder.ts +38 -0
  403. package/src/templates/plateGeometry.ts +62 -0
  404. package/src/templates/plateMapAdapters.ts +36 -0
  405. package/src/templates/plateMapBuilder.ts +43 -0
  406. package/src/templates/presetControlSchemas.ts +258 -0
  407. package/src/templates/protocolAdapters.ts +69 -0
  408. package/src/templates/protocolNormalizers.ts +37 -0
  409. package/src/templates/protocolStepsBuilder.ts +36 -0
  410. package/src/templates/qpcrAdapters.ts +104 -0
  411. package/src/templates/qpcrExpressionCollectionBuilder.ts +33 -0
  412. package/src/templates/qpcrPlateBuilder.ts +96 -0
  413. package/src/templates/reagentAdapters.ts +77 -0
  414. package/src/templates/reagentListBuilder.ts +30 -0
  415. package/src/templates/runNormalizers.ts +63 -0
  416. package/src/templates/sampleNormalizers.ts +58 -0
  417. package/src/templates/samplePrepAdapters.ts +63 -0
  418. package/src/templates/samplePrepBuilder.ts +51 -0
  419. package/src/templates/sampleSheetAdapters.ts +75 -0
  420. package/src/templates/sampleSheetBuilder.ts +23 -0
  421. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +79 -0
  422. package/src/templates/targetedMetabolomicsHelpers.ts +102 -0
  423. package/src/templates/templateAdapterTypes.ts +58 -0
  424. package/src/templates/templateControlSchemas.ts +320 -0
  425. package/src/templates/templateCreateOptions.ts +208 -0
  426. package/src/templates/templateEnvelopes.ts +137 -0
  427. package/src/templates/templatePackCollectionBuilder.ts +23 -0
  428. package/src/templates/templatePresetCollectionBuilder.ts +139 -0
  429. package/src/templates/templateQpcrTypes.ts +48 -0
  430. package/src/templates/templateValidators.ts +414 -0
  431. package/src/templates/timeCourseAdapters.ts +73 -0
  432. package/src/templates/timeCourseBuilder.ts +64 -0
  433. package/src/templates/types.ts +79 -275
  434. package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
  435. package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
  436. package/src/types/auto-group.ts +107 -9
  437. package/src/types/componentLabTypes.ts +235 -0
  438. package/src/types/componentWorkflowTypes.ts +190 -0
  439. package/src/types/components.ts +74 -424
  440. package/dist/components-BhK-dW99.js.map +0 -1
  441. package/dist/composables-Bg7CFuNz.js.map +0 -1
  442. package/dist/templates-BorLR_7p.js.map +0 -1
  443. package/dist/useProtocolTemplates-n6AJqSqv.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ export function recordValue(value: unknown): Record<string, unknown> {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
3
+ ? value as Record<string, unknown>
4
+ : {}
5
+ }
6
+
7
+ export function numericValue(value: number | { value: number; message: string }): number {
8
+ return typeof value === 'number' ? value : value.value
9
+ }
10
+
11
+ export function orderedUnique(values: string[]): string[] {
12
+ return [...new Set(values)]
13
+ }
14
+
15
+ export function replaceRecord(target: Record<string, unknown>, values: Record<string, unknown>) {
16
+ for (const key of Object.keys(target)) {
17
+ delete target[key]
18
+ }
19
+ Object.assign(target, values)
20
+ }
21
+
22
+ export function omitUndefined<T extends object>(record: T): T {
23
+ const next: Record<string, unknown> = {}
24
+ for (const [key, value] of Object.entries(record as Record<string, unknown>)) {
25
+ if (value !== undefined) next[key] = value
26
+ }
27
+ return next as T
28
+ }
29
+
30
+ export function humanize(value: string): string {
31
+ return value
32
+ .replace(/[_-]+/g, ' ')
33
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
34
+ .trim()
35
+ .replace(/\w\S*/g, word => word.charAt(0).toUpperCase() + word.slice(1))
36
+ }
@@ -0,0 +1,21 @@
1
+ import type {
2
+ ControlWorkspaceOptions,
3
+ } from './controlSchemaTypes'
4
+
5
+ export function mergeControlWorkspaceOptions(
6
+ base?: ControlWorkspaceOptions,
7
+ override?: ControlWorkspaceOptions,
8
+ ): ControlWorkspaceOptions {
9
+ return {
10
+ ...(base ?? {}),
11
+ ...(override ?? {}),
12
+ initialValues: {
13
+ ...(base?.initialValues ?? {}),
14
+ ...(override?.initialValues ?? {}),
15
+ },
16
+ topBarSettings: {
17
+ ...(base?.topBarSettings ?? {}),
18
+ ...(override?.topBarSettings ?? {}),
19
+ },
20
+ }
21
+ }
@@ -0,0 +1,153 @@
1
+ import { getTypeDefault } from './formBuilderRegistry'
2
+ import type { FieldRules } from './useForm'
3
+ import type {
4
+ FieldCondition,
5
+ FieldValidation,
6
+ FormEnhancements,
7
+ FormFieldSchema,
8
+ FormSchema,
9
+ FormSectionSchema,
10
+ } from '../types/form-builder'
11
+
12
+ /**
13
+ * Evaluate a JSON-serializable field condition against the current form data.
14
+ *
15
+ * Supports logical operators (`and`, `or`, `not`) and comparison operators
16
+ * (`eq`, `neq`, `gt`, `lt`, `gte`, `lte`, `in`, `notIn`, `truthy`, `falsy`,
17
+ * `contains`). Returns `true` if the condition passes.
18
+ */
19
+ export function evaluateCondition(
20
+ condition: FieldCondition,
21
+ data: Record<string, unknown>,
22
+ ): boolean {
23
+ if ('and' in condition) {
24
+ return condition.and.every((c) => evaluateCondition(c, data))
25
+ }
26
+ if ('or' in condition) {
27
+ return condition.or.some((c) => evaluateCondition(c, data))
28
+ }
29
+ if ('not' in condition) {
30
+ return !evaluateCondition(condition.not, data)
31
+ }
32
+
33
+ const value = data[condition.field]
34
+
35
+ if ('eq' in condition) return value === condition.eq
36
+ if ('neq' in condition) return value !== condition.neq
37
+ if ('gt' in condition) return typeof value === 'number' && value > condition.gt
38
+ if ('lt' in condition) return typeof value === 'number' && value < condition.lt
39
+ if ('gte' in condition) return typeof value === 'number' && value >= condition.gte
40
+ if ('lte' in condition) return typeof value === 'number' && value <= condition.lte
41
+ if ('in' in condition) return condition.in.includes(value)
42
+ if ('notIn' in condition) return !condition.notIn.includes(value)
43
+ if ('truthy' in condition) return !!value
44
+ if ('falsy' in condition) return !value
45
+ if ('contains' in condition) {
46
+ if (typeof value === 'string') return value.includes(condition.contains)
47
+ if (Array.isArray(value)) return value.includes(condition.contains)
48
+ return false
49
+ }
50
+
51
+ return true
52
+ }
53
+
54
+ /** Return all sections across steps (wizard) or directly from a flat schema. */
55
+ export function collectSections(schema: FormSchema): FormSectionSchema[] {
56
+ return schema.steps ? schema.steps.flatMap((step) => step.sections) : schema.sections
57
+ }
58
+
59
+ /** Return all field schemas in schema order, flattening sections and steps. */
60
+ export function flattenFields(schema: FormSchema): FormFieldSchema[] {
61
+ return collectSections(schema).flatMap((section) => section.fields)
62
+ }
63
+
64
+ /** Convert a JSON-safe `FieldValidation` descriptor to a runtime `FieldRules` object. */
65
+ function convertValidation(v: FieldValidation): FieldRules {
66
+ const rules: FieldRules = {}
67
+
68
+ if (v.required !== undefined) rules.required = v.required
69
+ if (v.minLength !== undefined) rules.minLength = v.minLength
70
+ if (v.maxLength !== undefined) rules.maxLength = v.maxLength
71
+ if (v.min !== undefined) rules.min = v.min
72
+ if (v.max !== undefined) rules.max = v.max
73
+ if (v.email !== undefined) rules.email = v.email
74
+
75
+ if (v.pattern !== undefined) {
76
+ rules.pattern =
77
+ typeof v.pattern === 'string'
78
+ ? new RegExp(v.pattern)
79
+ : { value: new RegExp(v.pattern.value), message: v.pattern.message }
80
+ }
81
+
82
+ return rules
83
+ }
84
+
85
+ export function buildInitialValues<T extends Record<string, unknown>>(
86
+ fields: readonly FormFieldSchema[],
87
+ initialData?: Partial<T>,
88
+ ): Record<string, unknown> {
89
+ const initialValues = {} as Record<string, unknown>
90
+
91
+ for (const field of fields) {
92
+ const key = field.name
93
+ if (initialData && hasOwnKey(initialData, key)) {
94
+ initialValues[key] = (initialData as Record<string, unknown>)[key]
95
+ } else if (field.defaultValue !== undefined) {
96
+ initialValues[key] = field.defaultValue
97
+ } else {
98
+ initialValues[key] = getTypeDefault(field.type)
99
+ }
100
+ }
101
+
102
+ return initialValues
103
+ }
104
+
105
+ export function buildRules<T extends Record<string, unknown>>(
106
+ fields: readonly FormFieldSchema[],
107
+ enhancements?: FormEnhancements<T>,
108
+ ): Partial<Record<string, FieldRules>> {
109
+ const rules: Partial<Record<string, FieldRules>> = {}
110
+
111
+ for (const field of fields) {
112
+ const base: FieldRules = field.validation ? convertValidation(field.validation) : {}
113
+ const enhancement = enhancements?.fields?.[field.name as keyof T]
114
+
115
+ const customValidators: Array<(
116
+ value: unknown,
117
+ formData: Record<string, unknown>,
118
+ ) => string | undefined | null> = []
119
+
120
+ if (enhancement?.validate) {
121
+ const fn = enhancement.validate
122
+ customValidators.push((value, formData) => fn(value, formData as T))
123
+ }
124
+
125
+ if (customValidators.length > 0) {
126
+ base.custom = customValidators
127
+ }
128
+
129
+ if (Object.keys(base).length > 0) {
130
+ rules[field.name] = base
131
+ }
132
+ }
133
+
134
+ return rules
135
+ }
136
+
137
+ export function replaceArray<T>(target: T[], values: readonly T[]): void {
138
+ target.splice(0, target.length, ...values)
139
+ }
140
+
141
+ export function replaceRecord<TValue>(
142
+ target: Partial<Record<string, TValue>>,
143
+ source: Partial<Record<string, TValue>>,
144
+ ): void {
145
+ for (const key of Object.keys(target)) {
146
+ delete target[key]
147
+ }
148
+ Object.assign(target, source)
149
+ }
150
+
151
+ function hasOwnKey(source: object, key: string): boolean {
152
+ return Object.prototype.hasOwnProperty.call(source, key)
153
+ }
@@ -0,0 +1,203 @@
1
+ import {
2
+ getInjectedPlatformContext,
3
+ resolveCurrentExperimentId,
4
+ } from './platformContextHelpers'
5
+ import type {
6
+ BuildPluginEndpointUrlOptions,
7
+ PluginContract,
8
+ PluginEndpointDefinition,
9
+ PluginEndpointParamDefinition,
10
+ } from './usePluginClient'
11
+
12
+ function normalizeApiBaseUrl(baseUrl: string | undefined): string | undefined {
13
+ if (!baseUrl) return undefined
14
+ return baseUrl.length > 1 ? baseUrl.replace(/\/+$/, '') : baseUrl
15
+ }
16
+
17
+ function normalizeApiPrefix(prefix: string | undefined): string | undefined {
18
+ if (!prefix) return undefined
19
+ if (prefix.startsWith('/api/')) return normalizeApiBaseUrl(prefix)
20
+ if (prefix === '/api') return prefix
21
+ if (prefix.startsWith('/')) return normalizeApiBaseUrl(`/api${prefix}`)
22
+ return normalizeApiBaseUrl(`/api/${prefix}`)
23
+ }
24
+
25
+ /** Resolve the runtime plugin API base URL from env, explicit options, platform injection, or contract metadata. */
26
+ export function resolvePluginBaseUrl(contract: PluginContract, explicitBaseUrl?: string): string {
27
+ const envPrefix = (import.meta.env?.VITE_API_PREFIX as string | undefined) || undefined
28
+ if (envPrefix) return normalizeApiBaseUrl(envPrefix) ?? envPrefix
29
+ if (explicitBaseUrl) return normalizeApiBaseUrl(explicitBaseUrl) ?? explicitBaseUrl
30
+
31
+ const injected = getInjectedPlatformContext()
32
+ const platformPrefix =
33
+ normalizeApiBaseUrl(injected?.plugin?.api_prefix) ||
34
+ normalizeApiPrefix(injected?.plugin?.route_prefix)
35
+ if (platformPrefix) return platformPrefix
36
+
37
+ return normalizeApiBaseUrl(contract.plugin.apiPrefix) || '/api'
38
+ }
39
+
40
+ function encodePath(path: string, payload: Record<string, unknown>, pathParams: string[]): string {
41
+ let nextPath = path
42
+ for (const param of pathParams) {
43
+ const value = payload[param]
44
+ if (value === undefined || value === null) {
45
+ throw new Error(`[MINT SDK] Missing path parameter '${param}' for plugin endpoint ${path}`)
46
+ }
47
+ nextPath = nextPath.replace(`{${param}}`, encodeURIComponent(String(value)))
48
+ nextPath = nextPath.replace(`:${param}`, encodeURIComponent(String(value)))
49
+ }
50
+ return nextPath
51
+ }
52
+
53
+ function withDefaultPathParams(
54
+ payload: Record<string, unknown>,
55
+ pathParams: string[],
56
+ ): Record<string, unknown> {
57
+ if (!pathParams.length) return payload
58
+ const nextPayload = { ...payload }
59
+ for (const param of pathParams) {
60
+ if (nextPayload[param] !== undefined && nextPayload[param] !== null) continue
61
+ if (isExperimentPathParam(param)) {
62
+ const experimentId = resolveCurrentExperimentId()
63
+ if (experimentId !== undefined) {
64
+ nextPayload[param] = experimentId
65
+ }
66
+ }
67
+ }
68
+ return nextPayload
69
+ }
70
+
71
+ function isExperimentPathParam(param: string): boolean {
72
+ return param === 'experimentId' || param === 'experiment_id'
73
+ }
74
+
75
+ function withoutPathParams(payload: Record<string, unknown>, pathParams: string[]) {
76
+ const copy = { ...payload }
77
+ for (const param of pathParams) {
78
+ delete copy[param]
79
+ }
80
+ return copy
81
+ }
82
+
83
+ function queryParamsFromPayload(
84
+ payload: Record<string, unknown>,
85
+ pathParams: string[],
86
+ queryParams?: PluginEndpointParamDefinition[],
87
+ endpointPath?: string,
88
+ includeUnspecifiedParams = false,
89
+ ) {
90
+ if (!queryParams?.length) {
91
+ return includeUnspecifiedParams ? withoutPathParams(payload, pathParams) : {}
92
+ }
93
+
94
+ const query: Record<string, unknown> = {}
95
+ for (const param of queryParams) {
96
+ const name = typeof param === 'string' ? param : param.name
97
+ const fieldName = typeof param === 'string' ? param : param.fieldName ?? param.name
98
+ const required = typeof param !== 'string' && param.required === true
99
+ const value = payload[fieldName]
100
+ if (value === undefined || value === null) {
101
+ if (required) {
102
+ throw new Error(
103
+ `[MINT SDK] Missing query parameter '${fieldName}' for plugin endpoint ${endpointPath ?? ''}`,
104
+ )
105
+ }
106
+ continue
107
+ }
108
+ query[name] = value
109
+ }
110
+ return query
111
+ }
112
+
113
+ export function hasKeys(value: Record<string, unknown>): boolean {
114
+ return Object.keys(value).length > 0
115
+ }
116
+
117
+ export function requestBodyFromPayload(
118
+ payload: unknown,
119
+ requestPayload: Record<string, unknown>,
120
+ endpoint: PluginEndpointDefinition,
121
+ ): unknown {
122
+ if (!endpoint.hasBody) return undefined
123
+ const body = endpoint.pathParams?.length || endpoint.queryParams?.length
124
+ ? requestPayload.body
125
+ : payload
126
+ if (body === undefined || body === null) {
127
+ throw new Error(`[MINT SDK] Missing request body for plugin endpoint ${endpoint.path}`)
128
+ }
129
+ return body
130
+ }
131
+
132
+ export function pluginEndpointRequestParts(
133
+ contract: PluginContract,
134
+ endpoint: PluginEndpointDefinition,
135
+ payload?: unknown,
136
+ explicitBaseUrl?: string,
137
+ ) {
138
+ const payloadObject =
139
+ payload && typeof payload === 'object' && !Array.isArray(payload)
140
+ ? payload as Record<string, unknown>
141
+ : {}
142
+ const pathParams = endpoint.pathParams ?? []
143
+ const requestPayload = withDefaultPathParams(payloadObject, pathParams)
144
+ const path = encodePath(endpoint.path, requestPayload, pathParams)
145
+ const query = queryParamsFromPayload(
146
+ requestPayload,
147
+ pathParams,
148
+ endpoint.queryParams,
149
+ endpoint.path,
150
+ endpoint.method === 'get',
151
+ )
152
+
153
+ return {
154
+ baseUrl: resolvePluginBaseUrl(contract, explicitBaseUrl),
155
+ path,
156
+ query,
157
+ requestPayload,
158
+ }
159
+ }
160
+
161
+ function appendQueryValue(params: URLSearchParams, key: string, value: unknown): void {
162
+ if (value === undefined || value === null) return
163
+ if (Array.isArray(value)) {
164
+ for (const item of value) {
165
+ appendQueryValue(params, key, item)
166
+ }
167
+ return
168
+ }
169
+ if (typeof value === 'object') {
170
+ params.append(key, JSON.stringify(value))
171
+ return
172
+ }
173
+ params.append(key, String(value))
174
+ }
175
+
176
+ function queryString(query: Record<string, unknown>): string {
177
+ const params = new URLSearchParams()
178
+ for (const [key, value] of Object.entries(query)) {
179
+ appendQueryValue(params, key, value)
180
+ }
181
+ const serialized = params.toString()
182
+ return serialized ? `?${serialized}` : ''
183
+ }
184
+
185
+ function joinBaseUrl(baseUrl: string, path: string): string {
186
+ if (!baseUrl) return path
187
+ const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl
188
+ const normalizedPath = path.startsWith('/') ? path : `/${path}`
189
+ return `${normalizedBase}${normalizedPath}`
190
+ }
191
+
192
+ /** Build the concrete URL for a generated plugin endpoint without making a request. */
193
+ export function buildPluginEndpointUrl(
194
+ contract: PluginContract,
195
+ endpoint: PluginEndpointDefinition,
196
+ payload?: unknown,
197
+ options: BuildPluginEndpointUrlOptions = {},
198
+ ): string {
199
+ const parts = pluginEndpointRequestParts(contract, endpoint, payload, options.baseUrl)
200
+ const pathWithQuery = `${parts.path}${queryString(parts.query)}`
201
+ if (options.includeBaseUrl === false) return pathWithQuery
202
+ return joinBaseUrl(parts.baseUrl, pathWithQuery)
203
+ }