@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,33 @@
1
+ import type {
2
+ AssayFeature,
3
+ AssaySample,
4
+ } from './types'
5
+ import { idFromName } from './builderIdUtils'
6
+
7
+ export function createAssaySampleLookup(samples: AssaySample[]): Map<string, string> {
8
+ const lookup = new Map<string, string>()
9
+ for (const sample of samples) {
10
+ addLookupAlias(lookup, sample.sampleId, sample.sampleId)
11
+ if (sample.name) {
12
+ addLookupAlias(lookup, sample.name, sample.sampleId)
13
+ addLookupAlias(lookup, idFromName(sample.name, sample.sampleId), sample.sampleId)
14
+ }
15
+ }
16
+ return lookup
17
+ }
18
+
19
+ export function createAssayFeatureLookup(features: AssayFeature[]): Map<string, string> {
20
+ const lookup = new Map<string, string>()
21
+ for (const feature of features) {
22
+ addLookupAlias(lookup, feature.id, feature.id)
23
+ addLookupAlias(lookup, feature.name, feature.id)
24
+ addLookupAlias(lookup, idFromName(feature.name, feature.id), feature.id)
25
+ }
26
+ return lookup
27
+ }
28
+
29
+ function addLookupAlias(lookup: Map<string, string>, alias: string, value: string): void {
30
+ if (!lookup.has(alias)) {
31
+ lookup.set(alias, value)
32
+ }
33
+ }
@@ -0,0 +1,78 @@
1
+ import type { SelectOption } from '../types'
2
+ import { getTemplateData } from './templateEnvelopes'
3
+ import { validateAssayMatrixData } from './templateValidators'
4
+ import type {
5
+ AssayMatrixColumnsAdapterResult,
6
+ AssayMatrixDataFrameAdapterResult,
7
+ AssayMatrixRowsAdapterResult,
8
+ AssayMatrixSampleOptionsAdapterResult,
9
+ AssayMatrixTemplate,
10
+ AssayMatrixTemplateData,
11
+ } from './types'
12
+
13
+ export function toAssayMatrixRows(
14
+ template: AssayMatrixTemplate | AssayMatrixTemplateData
15
+ ): AssayMatrixRowsAdapterResult {
16
+ const data = getTemplateData(template, 'assay-matrix')
17
+ validateAssayMatrixData(data)
18
+ const measurements = new Map(
19
+ data.measurements.map(measurement => [
20
+ `${measurement.sampleId}:${measurement.featureId}`,
21
+ measurement.value ?? null,
22
+ ])
23
+ )
24
+
25
+ return data.samples.map(sample => {
26
+ const row: Record<string, unknown> = {
27
+ sampleId: sample.sampleId,
28
+ name: sample.name,
29
+ group: sample.group,
30
+ ...(sample.metadata ?? {}),
31
+ }
32
+ for (const feature of data.features) {
33
+ row[feature.id] = measurements.get(`${sample.sampleId}:${feature.id}`) ?? null
34
+ }
35
+ return row
36
+ })
37
+ }
38
+
39
+ export function toAssayMatrixColumns(
40
+ template: AssayMatrixTemplate | AssayMatrixTemplateData
41
+ ): AssayMatrixColumnsAdapterResult {
42
+ const data = getTemplateData(template, 'assay-matrix')
43
+ validateAssayMatrixData(data)
44
+ return [
45
+ { key: 'sampleId', label: 'Sample ID', sortable: true },
46
+ { key: 'name', label: 'Name', sortable: true },
47
+ { key: 'group', label: 'Group', sortable: true },
48
+ ...data.features.map(feature => ({
49
+ key: feature.id,
50
+ label: feature.unit ? `${feature.name} (${feature.unit})` : feature.name,
51
+ sortable: true,
52
+ align: 'right' as const,
53
+ })),
54
+ ]
55
+ }
56
+
57
+ export function toAssayMatrixDataFrame(
58
+ template: AssayMatrixTemplate | AssayMatrixTemplateData
59
+ ): AssayMatrixDataFrameAdapterResult {
60
+ return {
61
+ data: toAssayMatrixRows(template),
62
+ columns: toAssayMatrixColumns(template),
63
+ rowKey: 'sampleId',
64
+ }
65
+ }
66
+
67
+ /** Convert an assay-matrix template into SampleSelector options derived from assay samples. */
68
+ export function toAssayMatrixSampleOptions(
69
+ template: AssayMatrixTemplate | AssayMatrixTemplateData
70
+ ): AssayMatrixSampleOptionsAdapterResult {
71
+ const data = getTemplateData(template, 'assay-matrix')
72
+ validateAssayMatrixData(data)
73
+ return data.samples.map((sample): SelectOption<string> => ({
74
+ value: sample.sampleId,
75
+ label: sample.name ?? sample.sampleId,
76
+ description: sample.group,
77
+ }))
78
+ }
@@ -0,0 +1,59 @@
1
+ import {
2
+ createAssayFeatureLookup,
3
+ createAssaySampleLookup,
4
+ } from './assayLookups'
5
+ import {
6
+ normalizeAssayFeature,
7
+ normalizeAssaySample,
8
+ } from './assayNormalizers'
9
+ import { idFromName } from './builderIdUtils'
10
+ import { createTemplateEnvelope } from './templateEnvelopes'
11
+ import { validateAssayMatrixData } from './templateValidators'
12
+ import type {
13
+ AssayFeature,
14
+ AssayMatrixTemplate,
15
+ AssayMatrixTemplateData,
16
+ AssaySample,
17
+ CreateAssayMatrixTemplateOptions,
18
+ } from './types'
19
+
20
+ export function createAssayMatrixTemplate(
21
+ options: CreateAssayMatrixTemplateOptions
22
+ ): AssayMatrixTemplate {
23
+ const samples = options.samples.map((sample, index): AssaySample => {
24
+ if (typeof sample !== 'string') return normalizeAssaySample(sample)
25
+ return {
26
+ sampleId: idFromName(sample, `sample-${index + 1}`),
27
+ name: sample,
28
+ metadata: {},
29
+ }
30
+ })
31
+ const features = options.features.map((feature, index): AssayFeature => {
32
+ if (typeof feature !== 'string') return normalizeAssayFeature(feature)
33
+ return {
34
+ id: idFromName(feature, `feature-${index + 1}`),
35
+ name: feature,
36
+ type: 'readout',
37
+ metadata: {},
38
+ }
39
+ })
40
+ const sampleLookup = createAssaySampleLookup(samples)
41
+ const featureLookup = createAssayFeatureLookup(features)
42
+ const measurements = Object.entries(options.values ?? {}).flatMap(([sampleId, featureValues]) =>
43
+ Object.entries(featureValues).map(([featureId, value]) => ({
44
+ sampleId: sampleLookup.get(sampleId) ?? sampleId,
45
+ featureId: featureLookup.get(featureId) ?? featureId,
46
+ value,
47
+ metadata: {},
48
+ }))
49
+ )
50
+
51
+ const data: AssayMatrixTemplateData = {
52
+ samples,
53
+ features,
54
+ measurements,
55
+ metadata: options.metadata ?? {},
56
+ }
57
+ validateAssayMatrixData(data)
58
+ return createTemplateEnvelope('assay-matrix', data, options.metadata ?? {})
59
+ }
@@ -0,0 +1,34 @@
1
+ import type {
2
+ AssayFeature,
3
+ AssaySample,
4
+ ReagentRecord,
5
+ ReagentTemplateInput,
6
+ } from './types'
7
+
8
+ export function normalizeAssaySample(sample: AssaySample): AssaySample {
9
+ return {
10
+ ...sample,
11
+ metadata: sample.metadata ?? {},
12
+ }
13
+ }
14
+
15
+ export function normalizeAssayFeature(feature: AssayFeature): AssayFeature {
16
+ return {
17
+ ...feature,
18
+ metadata: feature.metadata ?? {},
19
+ }
20
+ }
21
+
22
+ export function normalizeReagent(reagent: ReagentTemplateInput): ReagentRecord {
23
+ return {
24
+ ...reagent,
25
+ expiryDate: normalizeDateString(reagent.expiryDate),
26
+ kind: reagent.kind ?? 'reagent',
27
+ metadata: reagent.metadata ?? {},
28
+ }
29
+ }
30
+
31
+ function normalizeDateString(value: Date | string | null | undefined): string | undefined {
32
+ if (value === undefined || value === null) return undefined
33
+ return value instanceof Date ? value.toISOString() : value
34
+ }
@@ -0,0 +1,11 @@
1
+ export const DEFAULT_SAMPLE_COLORS = [
2
+ '#3B82F6',
3
+ '#10B981',
4
+ '#EF4444',
5
+ '#F59E0B',
6
+ '#8B5CF6',
7
+ '#F97316',
8
+ '#06B6D4',
9
+ '#14B8A6',
10
+ '#6B7280',
11
+ ]
@@ -0,0 +1,20 @@
1
+ export function sampleIdFromName(name: string, index: number): string {
2
+ return idFromName(name, `sample-${index + 1}`)
3
+ }
4
+
5
+ export function compoundIdFromName(name: string, index: number): string {
6
+ return idFromName(name, `compound-${index + 1}`)
7
+ }
8
+
9
+ export function idFromName(name: string, fallback: string): string {
10
+ const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')
11
+ return slug || fallback
12
+ }
13
+
14
+ export function timepointId(value: number, unit: string, index: number): string {
15
+ const raw = Number.isInteger(value)
16
+ ? String(value)
17
+ : String(value).replace(/0+$/, '').replace(/\.$/, '')
18
+ const token = raw.replace('.', 'p')
19
+ return token ? `t${token}-${unit}` : `timepoint-${index + 1}`
20
+ }
@@ -0,0 +1,165 @@
1
+ import {
2
+ readBoolean,
3
+ readInteger,
4
+ readNumber,
5
+ readNumberList,
6
+ readOptionalString,
7
+ readString,
8
+ readStringList,
9
+ } from './builderReadUtils'
10
+ import { readPlateFormat } from './plateGeometry'
11
+ import { getBioTemplatePresetInfo } from './presets'
12
+ import type {
13
+ CreateElisaAssayCollectionOptions,
14
+ CreateFlowCytometryAssayCollectionOptions,
15
+ CreateLcmsBatchCollectionOptions,
16
+ CreateQpcrExpressionCollectionOptions,
17
+ CreateQpcrPlateTemplateOptions,
18
+ CreateSamplePrepTemplateOptions,
19
+ CreateTargetedMetabolomicsCollectionOptions,
20
+ CreateWellPlateScreenCollectionOptions,
21
+ CreateWesternBlotAssayCollectionOptions,
22
+ TemplatePresetId,
23
+ } from './types'
24
+
25
+ export type BioTemplateControlValues = Record<string, unknown>
26
+
27
+ export function bioTemplatePresetControlValuesToOptions(
28
+ name: 'wellplate-screen',
29
+ values: BioTemplateControlValues
30
+ ): CreateWellPlateScreenCollectionOptions
31
+ export function bioTemplatePresetControlValuesToOptions(
32
+ name: 'qpcr-expression',
33
+ values: BioTemplateControlValues
34
+ ): CreateQpcrExpressionCollectionOptions
35
+ export function bioTemplatePresetControlValuesToOptions(
36
+ name: 'lcms-batch',
37
+ values: BioTemplateControlValues
38
+ ): CreateLcmsBatchCollectionOptions
39
+ export function bioTemplatePresetControlValuesToOptions(
40
+ name: 'targeted-metabolomics',
41
+ values: BioTemplateControlValues
42
+ ): CreateTargetedMetabolomicsCollectionOptions
43
+ export function bioTemplatePresetControlValuesToOptions(
44
+ name: 'elisa-assay',
45
+ values: BioTemplateControlValues
46
+ ): CreateElisaAssayCollectionOptions
47
+ export function bioTemplatePresetControlValuesToOptions(
48
+ name: 'flow-cytometry-assay',
49
+ values: BioTemplateControlValues
50
+ ): CreateFlowCytometryAssayCollectionOptions
51
+ export function bioTemplatePresetControlValuesToOptions(
52
+ name: 'western-blot-assay',
53
+ values: BioTemplateControlValues
54
+ ): CreateWesternBlotAssayCollectionOptions
55
+ export function bioTemplatePresetControlValuesToOptions(
56
+ name: TemplatePresetId | string,
57
+ values: BioTemplateControlValues
58
+ ):
59
+ | CreateWellPlateScreenCollectionOptions
60
+ | CreateQpcrExpressionCollectionOptions
61
+ | CreateLcmsBatchCollectionOptions
62
+ | CreateTargetedMetabolomicsCollectionOptions
63
+ | CreateElisaAssayCollectionOptions
64
+ | CreateFlowCytometryAssayCollectionOptions
65
+ | CreateWesternBlotAssayCollectionOptions
66
+ export function bioTemplatePresetControlValuesToOptions(
67
+ name: TemplatePresetId | string,
68
+ values: BioTemplateControlValues
69
+ ):
70
+ | CreateWellPlateScreenCollectionOptions
71
+ | CreateQpcrExpressionCollectionOptions
72
+ | CreateLcmsBatchCollectionOptions
73
+ | CreateTargetedMetabolomicsCollectionOptions
74
+ | CreateElisaAssayCollectionOptions
75
+ | CreateFlowCytometryAssayCollectionOptions
76
+ | CreateWesternBlotAssayCollectionOptions {
77
+ const preset = getBioTemplatePresetInfo(name)
78
+ if (!preset) {
79
+ throw new Error(`Unknown template preset '${name}'.`)
80
+ }
81
+
82
+ if (preset.name === 'wellplate-screen') {
83
+ return {
84
+ samples: readStringList(values.sampleNames, ['Control', 'Treatment']),
85
+ plateName: readString(values.plateName, 'Screen plate'),
86
+ plateFormat: readPlateFormat(values.plateFormat, 96),
87
+ unit: readString(values.unit, 'uM'),
88
+ replicates: readInteger(values.replicates, 3),
89
+ }
90
+ }
91
+
92
+ if (preset.name === 'qpcr-expression') {
93
+ return {
94
+ samples: readStringList(values.sampleNames, ['Control', 'Treatment']),
95
+ targets: readStringList(values.targets, ['ACTB', 'GAPDH']),
96
+ chemistry: readString(values.chemistry, 'sybr') as CreateQpcrPlateTemplateOptions['chemistry'],
97
+ format: readPlateFormat(values.plateFormat, 96),
98
+ includeNoTemplateControls: readBoolean(values.includeNoTemplateControls, true),
99
+ replicates: readInteger(values.replicates, 3),
100
+ instrument: readOptionalString(values.instrument),
101
+ }
102
+ }
103
+
104
+ if (preset.name === 'lcms-batch') {
105
+ return {
106
+ samples: readStringList(values.sampleNames, ['S001', 'S002']),
107
+ features: readStringList(values.featureNames, ['Glucose', 'Lactate']),
108
+ instrument: readString(values.instrument, 'LC-MS'),
109
+ method: readString(values.method, 'Default method'),
110
+ includeQc: readBoolean(values.includeQc, true),
111
+ }
112
+ }
113
+
114
+ if (preset.name === 'targeted-metabolomics') {
115
+ return {
116
+ samples: readStringList(values.sampleNames, ['S001', 'S002']),
117
+ metabolites: readStringList(values.metaboliteNames, ['Glucose', 'Lactate', 'Pyruvate']),
118
+ internalStandards: readStringList(
119
+ values.internalStandards,
120
+ ['Stable isotope internal standard mix'],
121
+ ),
122
+ standardConcentrations: readNumberList(values.standardConcentrations, [0.1, 1, 10, 100]),
123
+ concentrationUnit: readString(values.concentrationUnit, 'uM'),
124
+ responseUnit: readString(values.responseUnit, 'peak area ratio'),
125
+ calibrationAnalyte: readOptionalString(values.calibrationAnalyte),
126
+ instrument: readString(values.instrument, 'LC-MS'),
127
+ method: readString(values.method, 'Targeted metabolomics'),
128
+ prepType: readString(values.prepType, 'extraction') as CreateSamplePrepTemplateOptions['prepType'],
129
+ outputVolume: readNumber(values.outputVolume, 50),
130
+ includeQc: readBoolean(values.includeQc, true),
131
+ }
132
+ }
133
+
134
+ if (preset.name === 'elisa-assay') {
135
+ return {
136
+ samples: readStringList(values.sampleNames, ['Control', 'Treatment']),
137
+ analyte: readString(values.analyte, 'Analyte'),
138
+ standardConcentrations: readNumberList(values.standardConcentrations, [1000, 100, 10, 1]),
139
+ unit: readString(values.unit, 'pg/mL'),
140
+ responseUnit: readString(values.responseUnit, 'OD450'),
141
+ plateName: readString(values.plateName, 'ELISA plate'),
142
+ plateFormat: readPlateFormat(values.plateFormat, 96),
143
+ }
144
+ }
145
+
146
+ if (preset.name === 'flow-cytometry-assay') {
147
+ return {
148
+ samples: readStringList(values.sampleNames, ['Control', 'Treatment']),
149
+ markers: readStringList(values.markers, ['CD3', 'CD4', 'CD8']),
150
+ features: readStringList(values.featureNames, ['CD3+ cells', 'CD4+ cells', 'CD8+ cells']),
151
+ instrument: readString(values.instrument, 'Flow cytometer'),
152
+ includeDefaultControls: readBoolean(values.includeDefaultControls, true),
153
+ }
154
+ }
155
+
156
+ if (preset.name === 'western-blot-assay') {
157
+ return {
158
+ samples: readStringList(values.sampleNames, ['Control', 'Treatment']),
159
+ targets: readStringList(values.targets, ['Target protein']),
160
+ loadingControl: readString(values.loadingControl, 'ACTB'),
161
+ }
162
+ }
163
+
164
+ throw new Error(`Unknown template preset '${name}'.`)
165
+ }
@@ -0,0 +1,57 @@
1
+ export function isRecord(value: unknown): value is Record<string, unknown> {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
3
+ }
4
+
5
+ export function readStringList(value: unknown, fallback: string[]): string[] {
6
+ if (Array.isArray(value)) {
7
+ const items = value.map(item => String(item).trim()).filter(Boolean)
8
+ return items.length ? items : fallback
9
+ }
10
+ if (typeof value === 'string') {
11
+ const items = value.split(',').map(item => item.trim()).filter(Boolean)
12
+ return items.length ? items : fallback
13
+ }
14
+ return fallback
15
+ }
16
+
17
+ export function readNumberList(value: unknown, fallback: number[]): number[] {
18
+ const rawItems = Array.isArray(value)
19
+ ? value
20
+ : typeof value === 'string'
21
+ ? value.split(',')
22
+ : []
23
+ const items = rawItems
24
+ .map(item => Number(String(item).trim()))
25
+ .filter(item => Number.isFinite(item))
26
+ return items.length ? items : fallback
27
+ }
28
+
29
+ export function readString(value: unknown, fallback: string): string {
30
+ return typeof value === 'string' && value.trim() ? value.trim() : fallback
31
+ }
32
+
33
+ export function readOptionalString(value: unknown): string | undefined {
34
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined
35
+ }
36
+
37
+ export function readInteger(value: unknown, fallback: number): number {
38
+ const parsed = typeof value === 'number'
39
+ ? value
40
+ : typeof value === 'string'
41
+ ? Number(value)
42
+ : Number.NaN
43
+ return Number.isFinite(parsed) ? Math.max(1, Math.round(parsed)) : fallback
44
+ }
45
+
46
+ export function readNumber(value: unknown, fallback: number): number {
47
+ const parsed = typeof value === 'number'
48
+ ? value
49
+ : typeof value === 'string'
50
+ ? Number(value)
51
+ : Number.NaN
52
+ return Number.isFinite(parsed) ? parsed : fallback
53
+ }
54
+
55
+ export function readBoolean(value: unknown, fallback: boolean): boolean {
56
+ return typeof value === 'boolean' ? value : fallback
57
+ }