@morscherlab/mint-sdk 1.0.0-rc.4 → 1.0.0-rc.6

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 (324) 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/AppSidebar.vue.d.ts +9 -6
  41. package/dist/components/AppTopBar.navigation.d.ts +11 -0
  42. package/dist/components/BaseButton.vue.d.ts +1 -1
  43. package/dist/components/BaseCheckbox.vue.d.ts +7 -2
  44. package/dist/components/BaseInput.vue.d.ts +2 -2
  45. package/dist/components/BasePill.vue.d.ts +2 -2
  46. package/dist/components/BaseRadioGroup.vue.d.ts +2 -2
  47. package/dist/components/BaseSelect.vue.d.ts +1 -1
  48. package/dist/components/BaseSlider.vue.d.ts +2 -2
  49. package/dist/components/BaseTextarea.vue.d.ts +2 -2
  50. package/dist/components/BaseToggle.vue.d.ts +7 -2
  51. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  52. package/dist/components/BioTemplatePackWorkspaceView.vue.d.ts +1 -1
  53. package/dist/components/CollapsibleCard.vue.d.ts +9 -0
  54. package/dist/components/ColorSlider.vue.d.ts +2 -2
  55. package/dist/components/ConcentrationInput.vue.d.ts +2 -2
  56. package/dist/components/ControlWorkspaceView.vue.d.ts +4 -4
  57. package/dist/components/DatePicker.vue.d.ts +1 -1
  58. package/dist/components/DateTimePicker.vue.d.ts +2 -2
  59. package/dist/components/DoseCalculatorVolumeField.vue.d.ts +15 -0
  60. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +2 -2
  61. package/dist/components/DropdownButton.vue.d.ts +1 -1
  62. package/dist/components/FileUploader.vue.d.ts +2 -2
  63. package/dist/components/FormulaInput.vue.d.ts +2 -2
  64. package/dist/components/IconButton.vue.d.ts +1 -1
  65. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  66. package/dist/components/MoleculeInput.vue.d.ts +2 -2
  67. package/dist/components/MultiSelect.vue.d.ts +1 -1
  68. package/dist/components/NumberInput.vue.d.ts +1 -1
  69. package/dist/components/PlateMapEditor.vue.d.ts +6 -6
  70. package/dist/components/PluginWorkspaceView.controls.d.ts +28 -0
  71. package/dist/components/PluginWorkspaceView.navigation.d.ts +29 -0
  72. package/dist/components/PluginWorkspaceView.props.d.ts +151 -0
  73. package/dist/components/PluginWorkspaceView.shell.d.ts +19 -0
  74. package/dist/components/PluginWorkspaceView.vue.d.ts +51 -196
  75. package/dist/components/ProgressBar.vue.d.ts +1 -1
  76. package/dist/components/ProtocolStep.presentation.d.ts +4 -0
  77. package/dist/components/ProtocolStepEditor.state.d.ts +18 -0
  78. package/dist/components/ProtocolStepParameterField.vue.d.ts +12 -0
  79. package/dist/components/ReagentList.presentation.d.ts +16 -0
  80. package/dist/components/ResourceCard.vue.d.ts +1 -1
  81. package/dist/components/SampleSelector.colors.d.ts +13 -0
  82. package/dist/components/SampleSelector.drag.d.ts +24 -0
  83. package/dist/components/SampleSelector.groups.d.ts +15 -0
  84. package/dist/components/SampleSelector.selection.d.ts +26 -0
  85. package/dist/components/SampleSelector.vue.d.ts +4 -1
  86. package/dist/components/SampleSelectorSampleRow.vue.d.ts +21 -0
  87. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  88. package/dist/components/SequenceInput.vue.d.ts +2 -2
  89. package/dist/components/SequenceProgressBar.vue.d.ts +1 -1
  90. package/dist/components/SettingsModal.schema.d.ts +9 -0
  91. package/dist/components/StatusIndicator.vue.d.ts +1 -1
  92. package/dist/components/TagsInput.vue.d.ts +2 -2
  93. package/dist/components/TimePicker.vue.d.ts +2 -2
  94. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  95. package/dist/components/UnitInput.vue.d.ts +2 -2
  96. package/dist/components/WellPlate.colors.d.ts +9 -0
  97. package/dist/components/WellPlate.conditions.d.ts +26 -0
  98. package/dist/components/WellPlate.geometry.d.ts +23 -0
  99. package/dist/components/WellPlate.interaction.d.ts +71 -0
  100. package/dist/components/WellPlate.legend.d.ts +2 -0
  101. package/dist/components/WellPlate.rendering.d.ts +24 -0
  102. package/dist/components/WellPlate.sampleDrop.d.ts +8 -0
  103. package/dist/components/WellPlate.vue.d.ts +1 -1
  104. package/dist/components/index.js +2 -2
  105. package/dist/components/internal/ActionItemInternal.vue.d.ts +1 -1
  106. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +28 -0
  107. package/dist/{components-DafPc4rM.js → components-Blx4MG--.js} +4073 -4222
  108. package/dist/components-Blx4MG--.js.map +1 -0
  109. package/dist/composables/autoGroup/classKey.d.ts +4 -0
  110. package/dist/composables/autoGroup/classify.d.ts +28 -0
  111. package/dist/composables/autoGroup/colors.d.ts +2 -0
  112. package/dist/composables/autoGroup/columns.d.ts +10 -0
  113. package/dist/composables/autoGroup/compose.d.ts +8 -0
  114. package/dist/composables/autoGroup/cooccurrence.d.ts +2 -0
  115. package/dist/composables/autoGroup/csv-shim.d.ts +2 -0
  116. package/dist/composables/autoGroup/fingerprint.d.ts +3 -0
  117. package/dist/composables/autoGroup/index.d.ts +16 -0
  118. package/dist/composables/autoGroup/replicatePreGroup.d.ts +38 -0
  119. package/dist/composables/autoGroup/template.d.ts +15 -0
  120. package/dist/composables/autoGroup/tokenize.d.ts +8 -0
  121. package/dist/composables/autoGroupConstants.d.ts +1 -0
  122. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  123. package/dist/composables/controlComponentBindings.d.ts +1 -1
  124. package/dist/composables/controlSchemaAdapters.d.ts +1 -1
  125. package/dist/composables/controlSchemaDoseDesign.d.ts +11 -0
  126. package/dist/composables/controlSchemaLayout.d.ts +1 -1
  127. package/dist/composables/controlSchemaModel.d.ts +5 -0
  128. package/dist/composables/controlSchemaNormalize.d.ts +1 -1
  129. package/dist/composables/controlSchemaTypes.d.ts +311 -0
  130. package/dist/composables/controlWorkspaceOptions.d.ts +1 -1
  131. package/dist/composables/formBuilderSchema.d.ts +18 -0
  132. package/dist/composables/index.js +3 -3
  133. package/dist/composables/pluginEndpointBuilder.d.ts +13 -0
  134. package/dist/composables/protocolTemplateCatalog.d.ts +26 -0
  135. package/dist/composables/useAutoGroup.d.ts +61 -74
  136. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  137. package/dist/composables/useBioTemplateControls.d.ts +1 -1
  138. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +1 -1
  139. package/dist/composables/useBioTemplateWorkspace.d.ts +1 -1
  140. package/dist/composables/useControlSchema.d.ts +4 -316
  141. package/dist/composables/useControlWorkspace.d.ts +1 -1
  142. package/dist/composables/useForm.d.ts +2 -33
  143. package/dist/composables/useFormBuilder.d.ts +2 -9
  144. package/dist/composables/useFormValidation.d.ts +34 -0
  145. package/dist/composables/usePluginClient.d.ts +1 -4
  146. package/dist/composables/useProtocolTemplates.d.ts +2 -24
  147. package/dist/composables/useScheduleCalendarLayout.d.ts +49 -0
  148. package/dist/{composables-BMkPQhVK.js → composables-CHDjDIQT.js} +33 -31
  149. package/dist/composables-CHDjDIQT.js.map +1 -0
  150. package/dist/index.js +4 -4
  151. package/dist/install.js +2 -2
  152. package/dist/styles.css +1432 -660
  153. package/dist/templates/controlSchemaTypes.d.ts +1 -1
  154. package/dist/templates/index.js +1 -1
  155. package/dist/templates/templateAdapterTypes.d.ts +48 -0
  156. package/dist/templates/templateCreateOptions.d.ts +165 -0
  157. package/dist/templates/templateQpcrTypes.d.ts +42 -0
  158. package/dist/templates/types.d.ts +5 -250
  159. package/dist/{templates-bUAWMn5L.js → templates-DSbHJC4v.js} +1536 -297
  160. package/dist/templates-DSbHJC4v.js.map +1 -0
  161. package/dist/types/auto-group.d.ts +79 -9
  162. package/dist/types/componentLabTypes.d.ts +161 -0
  163. package/dist/types/componentWorkflowTypes.d.ts +150 -0
  164. package/dist/types/components.d.ts +14 -311
  165. package/dist/types/form-builder.d.ts +3 -0
  166. package/dist/types/index.d.ts +1 -1
  167. package/dist/{useProtocolTemplates-QZtHFFH2.js → useProtocolTemplates-BbPOYPzO.js} +1220 -454
  168. package/dist/useProtocolTemplates-BbPOYPzO.js.map +1 -0
  169. package/package.json +1 -1
  170. package/src/__tests__/components/AppSidebar.test.ts +67 -0
  171. package/src/__tests__/components/AppTopBar.navigation.test.ts +70 -0
  172. package/src/__tests__/components/CollapsibleCard.test.ts +47 -0
  173. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  174. package/src/__tests__/components/FormBuilder.test.ts +57 -0
  175. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  176. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  177. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  178. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +43 -0
  179. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  180. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  181. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  182. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  183. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  184. package/src/__tests__/components/SampleSelector.drag.test.ts +100 -0
  185. package/src/__tests__/components/SampleSelector.groups.test.ts +81 -0
  186. package/src/__tests__/components/SampleSelector.selection.test.ts +70 -0
  187. package/src/__tests__/components/SampleSelector.test.ts +32 -0
  188. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +37 -0
  189. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  190. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  191. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  192. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  193. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  194. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  195. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  196. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  197. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  198. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  199. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  200. package/src/__tests__/composables/autoGroup/compose.test.ts +227 -0
  201. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  202. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +50 -0
  203. package/src/__tests__/composables/autoGroup/integration.test.ts +79 -0
  204. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  205. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  206. package/src/__tests__/composables/useAutoGroup.test.ts +129 -625
  207. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +107 -0
  208. package/src/__tests__/composables/useControlSchema.test.ts +23 -0
  209. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  210. package/src/__tests__/docs/extractDocsComponents.test.ts +142 -0
  211. package/src/__tests__/docs/extractDocsExports.test.ts +77 -0
  212. package/src/__tests__/docs/extractDocsParsing.test.ts +69 -0
  213. package/src/__tests__/docs/extractDocsTemplates.test.ts +54 -0
  214. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  215. package/src/__tests__/docs/frontendDocsCatalog.test.ts +1 -1
  216. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  217. package/src/components/AppSidebar.story.vue +79 -6
  218. package/src/components/AppSidebar.vue +74 -6
  219. package/src/components/AppTopBar.navigation.ts +62 -0
  220. package/src/components/AppTopBar.vue +17 -44
  221. package/src/components/AutoGroupModal.story.vue +50 -0
  222. package/src/components/AutoGroupModal.vue +441 -158
  223. package/src/components/BaseCheckbox.story.vue +27 -0
  224. package/src/components/BaseCheckbox.vue +63 -1
  225. package/src/components/BaseToggle.story.vue +27 -0
  226. package/src/components/BaseToggle.vue +66 -1
  227. package/src/components/CollapsibleCard.vue +123 -45
  228. package/src/components/ControlWorkspaceView.vue +2 -6
  229. package/src/components/DoseCalculator.vue +13 -73
  230. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  231. package/src/components/ExperimentTimeline.vue +6 -31
  232. package/src/components/FormBuilder.story.vue +13 -0
  233. package/src/components/FormBuilder.vue +2 -7
  234. package/src/components/PlateMapEditor.vue +32 -106
  235. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  236. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  237. package/src/components/PluginWorkspaceView.props.ts +174 -0
  238. package/src/components/PluginWorkspaceView.shell.ts +67 -0
  239. package/src/components/PluginWorkspaceView.vue +88 -404
  240. package/src/components/ProtocolStep.presentation.ts +31 -0
  241. package/src/components/ProtocolStepEditor.state.ts +104 -0
  242. package/src/components/ProtocolStepEditor.vue +48 -179
  243. package/src/components/ProtocolStepParameterField.vue +134 -0
  244. package/src/components/ReagentList.presentation.ts +105 -0
  245. package/src/components/ReagentList.vue +16 -79
  246. package/src/components/SampleSelector.colors.ts +43 -0
  247. package/src/components/SampleSelector.drag.ts +164 -0
  248. package/src/components/SampleSelector.groups.ts +109 -0
  249. package/src/components/SampleSelector.selection.ts +103 -0
  250. package/src/components/SampleSelector.vue +82 -349
  251. package/src/components/SampleSelectorSampleRow.vue +64 -0
  252. package/src/components/ScheduleCalendar.vue +44 -199
  253. package/src/components/SettingsModal.schema.ts +71 -0
  254. package/src/components/SettingsModal.vue +16 -46
  255. package/src/components/WellPlate.colors.ts +56 -0
  256. package/src/components/WellPlate.conditions.ts +100 -0
  257. package/src/components/WellPlate.geometry.ts +91 -0
  258. package/src/components/WellPlate.interaction.ts +272 -0
  259. package/src/components/WellPlate.legend.ts +8 -0
  260. package/src/components/WellPlate.rendering.ts +105 -0
  261. package/src/components/WellPlate.sampleDrop.ts +73 -0
  262. package/src/components/WellPlate.vue +102 -550
  263. package/src/components/internal/FormFieldRendererInternal.vue +23 -5
  264. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  265. package/src/composables/autoGroup/classKey.ts +5 -0
  266. package/src/composables/autoGroup/classify.ts +205 -0
  267. package/src/composables/autoGroup/colors.ts +6 -0
  268. package/src/composables/autoGroup/columns.ts +226 -0
  269. package/src/composables/autoGroup/compose.ts +156 -0
  270. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  271. package/src/composables/autoGroup/csv-shim.ts +44 -0
  272. package/src/composables/autoGroup/fingerprint.ts +49 -0
  273. package/src/composables/autoGroup/index.ts +20 -0
  274. package/src/composables/autoGroup/replicatePreGroup.ts +90 -0
  275. package/src/composables/autoGroup/template.ts +126 -0
  276. package/src/composables/autoGroup/tokenize.ts +41 -0
  277. package/src/composables/autoGroup/vocab.json +67 -0
  278. package/src/composables/autoGroupConstants.ts +4 -0
  279. package/src/composables/autoGroupGrouping.ts +148 -0
  280. package/src/composables/controlComponentBindings.ts +1 -1
  281. package/src/composables/controlSchemaAdapters.ts +4 -1
  282. package/src/composables/controlSchemaDoseDesign.ts +215 -0
  283. package/src/composables/controlSchemaFormFields.ts +4 -1
  284. package/src/composables/controlSchemaLayout.ts +1 -1
  285. package/src/composables/controlSchemaModel.ts +163 -0
  286. package/src/composables/controlSchemaNormalize.ts +1 -1
  287. package/src/composables/controlSchemaTypes.ts +372 -0
  288. package/src/composables/controlWorkspaceOptions.ts +1 -1
  289. package/src/composables/formBuilderSchema.ts +153 -0
  290. package/src/composables/pluginEndpointBuilder.ts +203 -0
  291. package/src/composables/protocolTemplateCatalog.ts +325 -0
  292. package/src/composables/useAutoGroup.ts +395 -549
  293. package/src/composables/useAutoGroupInputSources.ts +147 -0
  294. package/src/composables/useBioTemplateControls.ts +1 -1
  295. package/src/composables/useBioTemplatePresetWorkspace.ts +1 -1
  296. package/src/composables/useBioTemplateWorkspace.ts +1 -1
  297. package/src/composables/useControlSchema.ts +21 -692
  298. package/src/composables/useControlWorkspace.ts +7 -13
  299. package/src/composables/useForm.ts +5 -187
  300. package/src/composables/useFormBuilder.ts +11 -153
  301. package/src/composables/useFormValidation.ts +154 -0
  302. package/src/composables/usePluginClient.ts +10 -193
  303. package/src/composables/useProtocolTemplates.ts +10 -328
  304. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  305. package/src/styles/components/app-sidebar.css +134 -6
  306. package/src/styles/components/auto-group-modal.css +248 -310
  307. package/src/styles/components/checkbox.css +87 -0
  308. package/src/styles/components/collapsible-card.css +154 -14
  309. package/src/styles/components/toggle.css +80 -0
  310. package/src/templates/controlSchemaTypes.ts +1 -1
  311. package/src/templates/templateAdapterTypes.ts +58 -0
  312. package/src/templates/templateCreateOptions.ts +208 -0
  313. package/src/templates/templateQpcrTypes.ts +48 -0
  314. package/src/templates/types.ts +79 -275
  315. package/src/types/auto-group.ts +107 -9
  316. package/src/types/componentLabTypes.ts +235 -0
  317. package/src/types/componentWorkflowTypes.ts +190 -0
  318. package/src/types/components.ts +95 -424
  319. package/src/types/form-builder.ts +3 -0
  320. package/src/types/index.ts +2 -0
  321. package/dist/components-DafPc4rM.js.map +0 -1
  322. package/dist/composables-BMkPQhVK.js.map +0 -1
  323. package/dist/templates-bUAWMn5L.js.map +0 -1
  324. package/dist/useProtocolTemplates-QZtHFFH2.js.map +0 -1
@@ -0,0 +1,107 @@
1
+ import { computed, ref } from 'vue'
2
+ import { describe, expect, it } from 'vitest'
3
+ import { useAutoGroup } from '../../composables/useAutoGroup'
4
+ import { useAutoGroupInputSources } from '../../composables/useAutoGroupInputSources'
5
+ import type { WizardStep } from '../../types/components'
6
+
7
+ function makeSources(options: {
8
+ samples?: string[]
9
+ experimentId?: number
10
+ designData?: Record<string, unknown>
11
+ apiGet?: (url: string) => Promise<Record<string, unknown>>
12
+ } = {}) {
13
+ const autoGroup = useAutoGroup()
14
+ const currentStep = ref(0)
15
+ const dynamicSteps = ref<WizardStep[]>([
16
+ { id: 'input', label: 'Input' },
17
+ { id: 'fields', label: 'Fields' },
18
+ { id: 'preview', label: 'Preview' },
19
+ ])
20
+ const sources = useAutoGroupInputSources({
21
+ autoGroup,
22
+ samples: computed(() => options.samples ?? []),
23
+ experimentId: computed(() => options.experimentId),
24
+ designData: computed(() => options.designData),
25
+ currentStep,
26
+ dynamicSteps,
27
+ api: {
28
+ get: async <T>(url: string): Promise<T> => {
29
+ const value = options.apiGet
30
+ ? await options.apiGet(url)
31
+ : { data: undefined }
32
+ return value as T
33
+ },
34
+ },
35
+ })
36
+
37
+ return { autoGroup, currentStep, dynamicSteps, sources }
38
+ }
39
+
40
+ describe('useAutoGroupInputSources', () => {
41
+ it('initializes pasted sample input when samples are provided', async () => {
42
+ const { autoGroup, currentStep, sources } = makeSources({
43
+ samples: ['S1_Control', 'S2_Treated'],
44
+ })
45
+ currentStep.value = 2
46
+
47
+ await sources.initializeInputSources()
48
+
49
+ expect(currentStep.value).toBe(0)
50
+ expect(autoGroup.rawText.value).toBe('S1_Control\nS2_Treated')
51
+ expect(sources.csvFileName.value).toBe('')
52
+ expect(sources.experimentError.value).toBeNull()
53
+ })
54
+
55
+ it('loads experiment design data and advances to the fields step', async () => {
56
+ const { autoGroup, currentStep, sources } = makeSources({
57
+ designData: {
58
+ samples: [
59
+ { sample_name: 'S1', sample_type: 'sample', conditions: { Treatment: 'Control' } },
60
+ { sample_name: 'S2', sample_type: 'sample', conditions: { Treatment: 'Drug' } },
61
+ ],
62
+ },
63
+ })
64
+
65
+ await sources.initializeInputSources()
66
+
67
+ expect(autoGroup.inputMode.value).toBe('experiment')
68
+ expect(autoGroup.csvData.value?.rows).toHaveLength(2)
69
+ expect(sources.experimentFieldNames.value).toEqual(['Treatment', 'sample_type'])
70
+ expect(currentStep.value).toBe(1)
71
+ expect(sources.experimentLoading.value).toBe(false)
72
+ })
73
+
74
+ it('parses uploaded CSV files and can clear them back to paste mode', async () => {
75
+ const { autoGroup, sources } = makeSources()
76
+ const file = {
77
+ name: 'samples.csv',
78
+ text: async () => 'sample_name,Treatment\nS1,Control\nS2,Drug',
79
+ } as File
80
+
81
+ await sources.processFile(file)
82
+
83
+ expect(autoGroup.inputMode.value).toBe('csv')
84
+ expect(autoGroup.csvData.value?.rows).toHaveLength(2)
85
+ expect(sources.csvFileName.value).toBe('samples.csv')
86
+
87
+ sources.clearCsvFile()
88
+
89
+ expect(autoGroup.inputMode.value).toBe('paste')
90
+ expect(autoGroup.csvData.value).toBeNull()
91
+ expect(sources.csvFileName.value).toBe('')
92
+ })
93
+
94
+ it('surfaces API errors when experiment metadata cannot be fetched', async () => {
95
+ const { sources } = makeSources({
96
+ experimentId: 42,
97
+ apiGet: async () => {
98
+ throw new Error('offline')
99
+ },
100
+ })
101
+
102
+ await sources.initializeInputSources()
103
+
104
+ expect(sources.experimentLoading.value).toBe(false)
105
+ expect(sources.experimentError.value).toBe('offline')
106
+ })
107
+ })
@@ -22,6 +22,8 @@ import {
22
22
  defineWellPlateDoseControlProps,
23
23
  getDefaultControlView,
24
24
  getControlDefaults,
25
+ isControlModelBinding,
26
+ resolveControlModel,
25
27
  useControlSchema,
26
28
  useControlWorkspace,
27
29
  } from '../../composables/useControlSchema'
@@ -376,6 +378,27 @@ describe('useControlSchema', () => {
376
378
  expect(workspace.getComponentBindingsById(model.componentBindings).plate.props.modelValue).toEqual(['A1', 'A2'])
377
379
  })
378
380
 
381
+ it('normalizes raw and complete control models through one resolver', () => {
382
+ const rawModel = {
383
+ initialValues: { threshold: 0.1 },
384
+ controls: {
385
+ threshold: { type: 'number' as const, label: 'Threshold', default: 0.05 },
386
+ },
387
+ }
388
+
389
+ const binding = resolveControlModel(rawModel)
390
+
391
+ expect(isControlModelBinding(rawModel)).toBe(false)
392
+ expect(isControlModelBinding(binding)).toBe(true)
393
+ expect(binding?.controls.threshold).toMatchObject({
394
+ label: 'Threshold',
395
+ default: 0.05,
396
+ })
397
+ expect(binding?.controlOptions.initialValues).toEqual({ threshold: 0.1 })
398
+ expect(resolveControlModel(binding)).toBe(binding)
399
+ expect(resolveControlModel(undefined)).toBeUndefined()
400
+ })
401
+
379
402
  it('maps control values into named SDK component bindings', () => {
380
403
  const values = {
381
404
  threshold: 0.05,
@@ -0,0 +1,89 @@
1
+ import { ref } from 'vue'
2
+ import { describe, expect, it } from 'vitest'
3
+ import type { ScheduleEvent, ScheduleView } from '../../types/components'
4
+ import {
5
+ SCHEDULE_SLOT_HEIGHT,
6
+ getWeekStart,
7
+ parseScheduleModelDate,
8
+ useScheduleCalendarLayout,
9
+ } from '../../composables/useScheduleCalendarLayout'
10
+
11
+ function dateKey(date: Date): string {
12
+ const month = String(date.getMonth() + 1).padStart(2, '0')
13
+ const day = String(date.getDate()).padStart(2, '0')
14
+ return `${date.getFullYear()}-${month}-${day}`
15
+ }
16
+
17
+ function makeLayout(overrides: Partial<Parameters<typeof useScheduleCalendarLayout>[0]> = {}) {
18
+ const events: ScheduleEvent[] = [
19
+ {
20
+ id: 'run-1',
21
+ title: 'LCMS run',
22
+ start: '2024-05-15T07:00:00',
23
+ end: '2024-05-15T08:30:00',
24
+ status: 'in-progress',
25
+ },
26
+ ]
27
+
28
+ return useScheduleCalendarLayout({
29
+ currentView: ref<ScheduleView>('week'),
30
+ currentDate: ref(new Date('2024-05-15T12:00:00')),
31
+ now: ref(new Date('2024-05-15T07:30:00')),
32
+ events: ref(events),
33
+ blockedSlots: ref([
34
+ {
35
+ start: '2024-05-15T09:00:00',
36
+ end: '2024-05-15T09:30:00',
37
+ label: 'maintenance',
38
+ },
39
+ ]),
40
+ dayStartHour: ref(6),
41
+ dayEndHour: ref(10),
42
+ slotDuration: ref(30),
43
+ weekStartsOn: ref<0 | 1>(1),
44
+ locale: ref('en-US'),
45
+ showNowIndicator: ref(true),
46
+ slotHeight: ref(SCHEDULE_SLOT_HEIGHT),
47
+ ...overrides,
48
+ })
49
+ }
50
+
51
+ describe('useScheduleCalendarLayout', () => {
52
+ it('builds week ranges and time labels from calendar settings', () => {
53
+ const layout = makeLayout()
54
+
55
+ expect(layout.totalSlots.value).toBe(8)
56
+ expect(layout.timeLabels.value.slice(0, 3)).toEqual(['06:00', '06:30', '07:00'])
57
+ expect(dateKey(layout.visibleDays.value[0])).toBe('2024-05-13')
58
+ expect(dateKey(layout.visibleDays.value[6])).toBe('2024-05-19')
59
+ })
60
+
61
+ it('computes timed event, blocked slot, and now indicator styles', () => {
62
+ const layout = makeLayout()
63
+ const event = layout.getEventsForDate(new Date('2024-05-15T00:00:00'))[0]
64
+
65
+ expect(layout.getEventStyle(event, new Date('2024-05-15T00:00:00'))).toEqual({
66
+ top: '80px',
67
+ height: '120px',
68
+ })
69
+ expect(layout.getBlockedStyle(layout.getBlockedForDay(new Date('2024-05-15T00:00:00'))[0])).toEqual({
70
+ top: '240px',
71
+ height: '40px',
72
+ })
73
+ expect(layout.getNowIndicatorStyle()).toEqual({ top: '120px' })
74
+ })
75
+
76
+ it('builds month cells and weekday labels according to the week start', () => {
77
+ const layout = makeLayout({ currentView: ref<ScheduleView>('month') })
78
+
79
+ expect(layout.monthDays.value).toHaveLength(42)
80
+ expect(dateKey(layout.monthDays.value[0].date)).toBe('2024-04-29')
81
+ expect(layout.monthWeekdayLabels.value[0]).toBe('Mon')
82
+ expect(layout.headerTitle.value).toBe('May 2024')
83
+ })
84
+
85
+ it('parses model dates and honors alternate week starts', () => {
86
+ expect(parseScheduleModelDate('2024-05-15T00:00:00').getFullYear()).toBe(2024)
87
+ expect(dateKey(getWeekStart(new Date('2024-05-15T00:00:00'), 0))).toBe('2024-05-12')
88
+ })
89
+ })
@@ -0,0 +1,142 @@
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
2
+ import { tmpdir } from 'node:os'
3
+ import { join } from 'node:path'
4
+ import { afterEach, describe, expect, it } from 'vitest'
5
+ import {
6
+ extractComponent,
7
+ extractDeprecation,
8
+ parseComponentExports,
9
+ } from '../../../scripts/extract-docs-components'
10
+
11
+ const tempDirs: string[] = []
12
+
13
+ function createTempDir(): string {
14
+ const dir = mkdtempSync(join(tmpdir(), 'mint-docs-components-'))
15
+ tempDirs.push(dir)
16
+ return dir
17
+ }
18
+
19
+ afterEach(() => {
20
+ for (const dir of tempDirs.splice(0)) {
21
+ rmSync(dir, { recursive: true, force: true })
22
+ }
23
+ })
24
+
25
+ describe('extract docs component helpers', () => {
26
+ it('parses grouped Vue component exports with JSDoc metadata', () => {
27
+ const dir = createTempDir()
28
+ const indexPath = join(dir, 'index.ts')
29
+ writeFileSync(indexPath, `
30
+ // Base Components
31
+ /** Primary action. */
32
+ export { default as MintButton } from './Button.vue'
33
+
34
+ // Scheduling / Booking Components
35
+ /**
36
+ * @deprecated Prefer ScheduleCalendar.
37
+ */
38
+ export { default as OldCalendar } from './OldCalendar.vue'
39
+
40
+ // Custom Group
41
+ export { default as SpecialThing } from './SpecialThing.vue'
42
+ `)
43
+
44
+ expect(parseComponentExports(indexPath)).toEqual([
45
+ {
46
+ name: 'MintButton',
47
+ fileBase: 'Button',
48
+ group: 'base',
49
+ description: 'Primary action.',
50
+ },
51
+ {
52
+ name: 'OldCalendar',
53
+ fileBase: 'OldCalendar',
54
+ group: 'scheduling',
55
+ description: '@deprecated Prefer ScheduleCalendar.',
56
+ deprecated: true,
57
+ replacement: 'ScheduleCalendar',
58
+ },
59
+ {
60
+ name: 'SpecialThing',
61
+ fileBase: 'SpecialThing',
62
+ group: 'custom-group',
63
+ },
64
+ ])
65
+ })
66
+
67
+ it('extracts deprecation replacements from use/prefer prose', () => {
68
+ expect(extractDeprecation('@deprecated Use `NewThing()` instead.')).toEqual({
69
+ deprecated: true,
70
+ replacement: 'NewThing',
71
+ })
72
+ expect(extractDeprecation('Stable component.')).toEqual({})
73
+ })
74
+
75
+ it('extracts SFC props, emits, and slots from public components', () => {
76
+ const dir = createTempDir()
77
+ const componentPath = join(dir, 'src', 'components', 'FancyButton.vue')
78
+ mkdirSync(join(dir, 'src', 'components'), { recursive: true })
79
+ writeFileSync(componentPath, `
80
+ <script setup lang="ts">
81
+ /** Fancy button docs. */
82
+ interface Props {
83
+ /** Visible label. */
84
+ label: string
85
+ variant?: 'primary' | 'secondary'
86
+ }
87
+
88
+ withDefaults(defineProps<Props>(), {
89
+ variant: 'primary',
90
+ })
91
+
92
+ defineEmits<{
93
+ 'update:modelValue': [value: string]
94
+ click: []
95
+ }>()
96
+
97
+ defineSlots<{
98
+ default: () => unknown
99
+ suffix?: () => unknown
100
+ }>()
101
+ </script>
102
+
103
+ <template>
104
+ <button>
105
+ <slot />
106
+ <slot name="suffix" />
107
+ </button>
108
+ </template>
109
+ `)
110
+
111
+ expect(extractComponent(componentPath, 'FancyButton', 'base', dir)).toMatchObject({
112
+ name: 'FancyButton',
113
+ kind: 'component',
114
+ group: 'base',
115
+ source: 'packages/sdk-frontend/src/components/FancyButton.vue',
116
+ description: 'Fancy button docs.',
117
+ props: [
118
+ {
119
+ name: 'label',
120
+ type: 'string',
121
+ required: true,
122
+ description: 'Visible label.',
123
+ },
124
+ {
125
+ name: 'variant',
126
+ type: "'primary' | 'secondary'",
127
+ required: false,
128
+ default: "'primary'",
129
+ description: '',
130
+ },
131
+ ],
132
+ emits: [
133
+ { name: 'update:modelValue', type: '(value: string) => void' },
134
+ { name: 'click', type: '() => void' },
135
+ ],
136
+ slots: [
137
+ { name: 'default', description: '' },
138
+ { name: 'suffix', description: '' },
139
+ ],
140
+ })
141
+ })
142
+ })
@@ -0,0 +1,77 @@
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
2
+ import { tmpdir } from 'node:os'
3
+ import { join } from 'node:path'
4
+ import { afterEach, describe, expect, it } from 'vitest'
5
+ import {
6
+ parseNamedExports,
7
+ parseNamedExportSpecs,
8
+ resolveLocalExportPath,
9
+ resolveNamedExportPath,
10
+ } from '../../../scripts/extract-docs-exports'
11
+
12
+ const tempDirs: string[] = []
13
+
14
+ function createTempDir(): string {
15
+ const dir = mkdtempSync(join(tmpdir(), 'mint-docs-exports-'))
16
+ tempDirs.push(dir)
17
+ return dir
18
+ }
19
+
20
+ afterEach(() => {
21
+ for (const dir of tempDirs.splice(0)) {
22
+ rmSync(dir, { recursive: true, force: true })
23
+ }
24
+ })
25
+
26
+ describe('extract docs export helpers', () => {
27
+ it('parses aliased named export specs and skips invalid entries', () => {
28
+ expect(parseNamedExportSpecs(`
29
+ type LocalType as PublicType,
30
+ InternalName as PublicName,
31
+ default,
32
+ invalid-name,
33
+ // ignored
34
+ `)).toEqual([
35
+ { localName: 'LocalType', exportedName: 'PublicType' },
36
+ { localName: 'InternalName', exportedName: 'PublicName' },
37
+ ])
38
+ })
39
+
40
+ it('resolves local export paths across files and directory indexes', () => {
41
+ const dir = createTempDir()
42
+ const indexPath = join(dir, 'index.ts')
43
+ const featureDir = join(dir, 'feature')
44
+ writeFileSync(indexPath, '')
45
+ writeFileSync(join(dir, 'direct.ts'), 'export const Direct = 1')
46
+ writeFileSync(join(dir, 'component.vue'), '<template />')
47
+ mkdirSync(featureDir)
48
+ writeFileSync(join(featureDir, 'index.ts'), 'export const Nested = 1')
49
+
50
+ expect(resolveLocalExportPath(indexPath, './direct')).toBe(join(dir, 'direct.ts'))
51
+ expect(resolveLocalExportPath(indexPath, './component')).toBe(join(dir, 'component.vue'))
52
+ expect(resolveLocalExportPath(indexPath, './feature')).toBe(join(featureDir, 'index.ts'))
53
+ expect(resolveLocalExportPath(indexPath, 'vue')).toBeNull()
54
+ })
55
+
56
+ it('collects and resolves named exports through re-export chains', () => {
57
+ const dir = createTempDir()
58
+ const indexPath = join(dir, 'index.ts')
59
+ const nestedPath = join(dir, 'nested.ts')
60
+ const leafPath = join(dir, 'leaf.ts')
61
+ const starPath = join(dir, 'star.ts')
62
+ writeFileSync(indexPath, `
63
+ export { Leaf as PublicLeaf } from './nested'
64
+ export * from './leaf'
65
+ `)
66
+ writeFileSync(nestedPath, "export { InternalLeaf as Leaf } from './leaf'")
67
+ writeFileSync(leafPath, "export const InternalLeaf = 1\nexport { StarExport } from './star'")
68
+ writeFileSync(starPath, 'export const StarExport = 2')
69
+
70
+ expect(parseNamedExports(indexPath)).toEqual([
71
+ { name: 'PublicLeaf' },
72
+ { name: 'StarExport' },
73
+ ])
74
+ expect(resolveNamedExportPath(indexPath, 'PublicLeaf')).toBe(leafPath)
75
+ expect(resolveNamedExportPath(indexPath, 'StarExport')).toBe(starPath)
76
+ })
77
+ })
@@ -0,0 +1,69 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import {
3
+ cleanJsdoc,
4
+ cleanJsdocSummary,
5
+ extractBalancedBraces,
6
+ extractBalancedParens,
7
+ extractTrailingJsdoc,
8
+ findMatchingClose,
9
+ splitTopLevel,
10
+ } from '../../../scripts/extract-docs-parsing'
11
+
12
+ describe('extract docs parsing helpers', () => {
13
+ it('extracts balanced braces after whitespace-insensitive markers', () => {
14
+ const source = `
15
+ withDefaults(
16
+ defineProps<Props>(),
17
+ {
18
+ alpha: { nested: true },
19
+ beta: () => ({ value: 1 }),
20
+ }
21
+ )
22
+ `
23
+
24
+ expect(extractBalancedBraces(source, 'withDefaults(defineProps<Props>(),')).toContain(
25
+ 'alpha: { nested: true }',
26
+ )
27
+ })
28
+
29
+ it('splits only top-level delimiters', () => {
30
+ expect(splitTopLevel('alpha, beta<{ one: string, two: number }>, gamma()', ',')).toEqual([
31
+ 'alpha',
32
+ ' beta<{ one: string, two: number }>',
33
+ ' gamma()',
34
+ ])
35
+ })
36
+
37
+ it('finds matching close brackets and paren content with nested groups', () => {
38
+ const source = 'fn(alpha, nested(beta, gamma), delta)'
39
+ const openIdx = source.indexOf('(')
40
+
41
+ expect(findMatchingClose(source, openIdx, '(', ')')).toBe(source.length - openIdx - 1)
42
+ expect(extractBalancedParens(source, 0)).toBe('alpha, nested(beta, gamma), delta')
43
+ })
44
+
45
+ it('cleans JSDoc blocks and summaries', () => {
46
+ const comment = `
47
+ /**
48
+ * Primary summary.
49
+ *
50
+ * More details.
51
+ */
52
+ `
53
+
54
+ expect(cleanJsdoc(comment)).toBe('Primary summary.\nMore details.')
55
+ expect(cleanJsdocSummary(comment)).toBe('Primary summary.')
56
+ })
57
+
58
+ it('extracts only the trailing JSDoc closest to a declaration', () => {
59
+ const source = `
60
+ /** Earlier. */
61
+ const a = 1
62
+
63
+ /** Selected. */
64
+ export function useThing() {}
65
+ `
66
+
67
+ expect(extractTrailingJsdoc(source, source.indexOf('export function'))).toContain('Selected.')
68
+ })
69
+ })
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { bioTemplateCatalog } from '../../../src/templates/catalog'
3
+ import { bioTemplatePacks } from '../../../src/templates/packs'
4
+ import { bioTemplatePresets } from '../../../src/templates/presets'
5
+ import {
6
+ extractTemplatePacks,
7
+ extractTemplatePresets,
8
+ extractTemplates,
9
+ } from '../../../scripts/extract-docs-templates'
10
+
11
+ describe('extract docs template helpers', () => {
12
+ it('maps catalog templates into docs manifest entries', () => {
13
+ const entry = bioTemplateCatalog[0]!
14
+ const template = extractTemplates()[0]!
15
+
16
+ expect(extractTemplates()).toHaveLength(bioTemplateCatalog.length)
17
+ expect(template).toMatchObject({
18
+ name: entry.name,
19
+ kind: 'template',
20
+ group: entry.category,
21
+ source: 'packages/sdk-frontend/src/templates/catalog.ts',
22
+ description: entry.purpose,
23
+ template_id: entry.template_id,
24
+ template_version: entry.template_version,
25
+ add_command: entry.add_command,
26
+ })
27
+ })
28
+
29
+ it('maps curated presets and packs into docs manifest entries', () => {
30
+ const presetEntry = bioTemplatePresets[0]!
31
+ const preset = extractTemplatePresets()[0]!
32
+ const packEntry = bioTemplatePacks[0]!
33
+ const pack = extractTemplatePacks()[0]!
34
+
35
+ expect(extractTemplatePresets()).toHaveLength(bioTemplatePresets.length)
36
+ expect(preset).toMatchObject({
37
+ name: presetEntry.name,
38
+ kind: 'template-preset',
39
+ group: presetEntry.category,
40
+ source: 'packages/sdk-frontend/src/templates/presets.ts',
41
+ templates: presetEntry.templates,
42
+ })
43
+ expect(extractTemplatePacks()).toHaveLength(bioTemplatePacks.length)
44
+ expect(pack).toMatchObject({
45
+ name: packEntry.name,
46
+ kind: 'template-pack',
47
+ group: packEntry.category,
48
+ source: 'packages/sdk-frontend/src/templates/packs.ts',
49
+ add_command: packEntry.add_command,
50
+ init_command: packEntry.init_command,
51
+ docs_command: packEntry.docs_command,
52
+ })
53
+ })
54
+ })
@@ -0,0 +1,89 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'
2
+ import { tmpdir } from 'node:os'
3
+ import { join } from 'node:path'
4
+ import { afterEach, describe, expect, it } from 'vitest'
5
+ import {
6
+ extractCssVariables,
7
+ extractTailwindPreset,
8
+ } from '../../../scripts/extract-docs-theme'
9
+
10
+ const tempDirs: string[] = []
11
+
12
+ function createTempDir(): string {
13
+ const dir = mkdtempSync(join(tmpdir(), 'mint-docs-theme-'))
14
+ tempDirs.push(dir)
15
+ return dir
16
+ }
17
+
18
+ afterEach(() => {
19
+ for (const dir of tempDirs.splice(0)) {
20
+ rmSync(dir, { recursive: true, force: true })
21
+ }
22
+ })
23
+
24
+ describe('extract docs theme helpers', () => {
25
+ it('groups CSS variables by root comment sections', () => {
26
+ const dir = createTempDir()
27
+ const cssPath = join(dir, 'variables.css')
28
+ writeFileSync(cssPath, `
29
+ :root {
30
+ --spacing-sm: 0.5rem;
31
+ /* Background colors */
32
+ --bg-default: #ffffff;
33
+ --bg-muted: var(--mint-50);
34
+ }
35
+ `)
36
+
37
+ expect(extractCssVariables(cssPath)).toEqual({
38
+ General: [
39
+ { name: '--spacing-sm', value: '0.5rem' },
40
+ ],
41
+ 'Background colors': [
42
+ { name: '--bg-default', value: '#ffffff' },
43
+ { name: '--bg-muted', value: 'var(--mint-50)' },
44
+ ],
45
+ })
46
+ })
47
+
48
+ it('extracts Tailwind color groups and font families', () => {
49
+ const dir = createTempDir()
50
+ const presetPath = join(dir, 'tailwind.preset.ts')
51
+ writeFileSync(presetPath, `
52
+ export default {
53
+ theme: {
54
+ extend: {
55
+ colors: {
56
+ mint: {
57
+ 50: "#f0fdfa",
58
+ 600: "#0d9488",
59
+ },
60
+ bg: {
61
+ canvas: "var(--bg-default)",
62
+ },
63
+ },
64
+ fontFamily: {
65
+ sans: ['Inter', 'sans-serif'],
66
+ mono: ["JetBrains Mono", "monospace"],
67
+ },
68
+ },
69
+ },
70
+ }
71
+ `)
72
+
73
+ expect(extractTailwindPreset(presetPath)).toMatchObject({
74
+ colors: {
75
+ mint: {
76
+ 50: '#f0fdfa',
77
+ 600: '#0d9488',
78
+ },
79
+ bg: {
80
+ canvas: 'var(--bg-default)',
81
+ },
82
+ },
83
+ fontFamily: {
84
+ sans: 'Inter',
85
+ mono: 'JetBrains Mono',
86
+ },
87
+ })
88
+ })
89
+ })
@@ -114,7 +114,7 @@ function parseDeprecatedComponentExports(): Record<string, string> {
114
114
  }
115
115
 
116
116
  function parseDocumentedComposableExports(): string[] {
117
- const scriptContent = readFileSync(join(SDK_ROOT, 'scripts', 'extract-docs.ts'), 'utf8')
117
+ const scriptContent = readFileSync(join(SDK_ROOT, 'scripts', 'extract-docs-composables.ts'), 'utf8')
118
118
  const helperNames = new Set(
119
119
  [...(scriptContent.match(
120
120
  /const DOCUMENTED_COMPOSABLE_EXPORTS = new Set\(\[([\s\S]*?)\]\);/,