From b6eea4ad195cb8e3061d64e229f74c6c7e50cd94 Mon Sep 17 00:00:00 2001 From: koji Date: Tue, 14 May 2024 21:12:04 -0400 Subject: [PATCH 01/10] fix(app): adjust applied labware offset data table (#15172) * fix(app): adjust applied labware offset data table --- .../HistoricalProtocolRunOffsetDrawer.tsx | 109 ++++++++++-------- 1 file changed, 58 insertions(+), 51 deletions(-) diff --git a/app/src/organisms/Devices/HistoricalProtocolRunOffsetDrawer.tsx b/app/src/organisms/Devices/HistoricalProtocolRunOffsetDrawer.tsx index 1be825a562b..30abbe455c2 100644 --- a/app/src/organisms/Devices/HistoricalProtocolRunOffsetDrawer.tsx +++ b/app/src/organisms/Devices/HistoricalProtocolRunOffsetDrawer.tsx @@ -2,6 +2,8 @@ import * as React from 'react' import isEqual from 'lodash/isEqual' import { useTranslation } from 'react-i18next' import { + ALIGN_CENTER, + ALIGN_END, BORDERS, Box, COLORS, @@ -98,34 +100,40 @@ export function HistoricalProtocolRunOffsetDrawer( ) : null} - - - {t('location')} - - - {t('labware')} - - + - {t('labware_offset_data')} - + + {t('location')} + + + + + {t('labware')} + + + + + {t('labware_offset_data')} + + {uniqueLabwareOffsets.map((offset, index) => { const labwareDefinitions = @@ -144,33 +152,32 @@ export function HistoricalProtocolRunOffsetDrawer( - - {t('slot', { slotName: offset.location.slotName })} - {offset.location.moduleModel != null && - ` - ${String( - getModuleDisplayName(offset.location.moduleModel) - )}`} - - - {labwareName} - - + + + {t('slot', { slotName: offset.location.slotName })} + {offset.location.moduleModel != null && + ` - ${getModuleDisplayName(offset.location.moduleModel)}`} + + + + + {labwareName} + + + + + ) })} From bda38362bf965e643af6eaef6be6a7b27cd2f6b8 Mon Sep 17 00:00:00 2001 From: Brian Arthur Cooper Date: Wed, 15 May 2024 14:11:58 -0400 Subject: [PATCH 02/10] fix(app, components, protocol-designer, shared-data): import type lint rule to error, fix occurrences (#15168) Removes ~1000 lint warnings and standardizes the separation of type imports from module imports --- .eslintrc.js | 1 - api-client/src/calibration/types.ts | 2 +- api-client/src/modules/api-types.ts | 8 +- api-client/src/modules/types.ts | 6 +- .../src/protocols/__tests__/utils.test.ts | 2 +- api-client/src/request.ts | 18 +- api-client/src/sessions/createSession.ts | 2 +- app-shell-odd/src/http.ts | 3 +- app-shell-odd/src/notifications/subscribe.ts | 3 +- app-shell/src/http.ts | 3 +- app-shell/src/notifications/index.ts | 2 +- app-shell/src/notifications/subscribe.ts | 3 +- .../__tests__/protocolAnalysis.test.ts | 9 +- .../protocol-analysis/writeFailedAnalysis.ts | 2 +- app-shell/src/robot-update/release-files.ts | 15 +- .../system-info/__tests__/dispatch.test.ts | 2 +- .../system-info/__tests__/usb-devices.test.ts | 3 +- app-shell/src/usb.ts | 6 +- app/src/App/types.ts | 2 +- app/src/atoms/Interstitial/Interstitial.tsx | 7 +- app/src/atoms/MenuList/MenuItem.tsx | 14 +- app/src/molecules/JogControls/types.ts | 2 +- .../LegacyModal/LegacyModalShell.tsx | 2 +- .../__tests__/createSnippet.test.ts | 6 +- .../createSnippet.ts | 2 +- .../AnalyticsToggle.tsx | 3 +- .../LabwareOffsetTable.tsx | 2 +- .../hooks/useOffsetCandidatesForAnalysis.ts | 6 +- app/src/organisms/CalibrateDeck/types.ts | 2 +- .../__tests__/CalibratePipetteOffset.test.tsx | 9 +- .../organisms/CalibratePipetteOffset/types.ts | 2 +- app/src/organisms/CalibrateTipLength/types.ts | 2 +- .../__tests__/DeckSetup.test.tsx | 6 +- .../ChangePipette/ConfirmPipette.tsx | 5 +- .../__tests__/ChangePipette.test.tsx | 2 +- .../__tests__/ConfirmPipette.test.tsx | 2 +- .../__tests__/LevelPipette.test.tsx | 4 +- app/src/organisms/CheckCalibration/types.ts | 2 +- .../ChildNavigation.stories.tsx | 2 +- .../__tests__/ChildNavigation.test.tsx | 2 +- .../AvailableRobotOption.tsx | 2 +- .../organisms/CommandText/LoadCommandText.tsx | 7 +- .../__tests__/CommandText.test.tsx | 3 +- .../utils/getLabwareDisplayLocation.ts | 3 +- .../CommandText/utils/getWellRange.ts | 7 +- ...kConfigurationDiscardChangesModal.test.tsx | 2 +- .../PipetteCard/PipetteOverflowMenu.tsx | 4 +- .../PipetteCard/PipetteSettingsSlideout.tsx | 4 +- .../Devices/ProtocolRun/RunTimer.tsx | 2 +- .../SetupGripperCalibrationItem.tsx | 5 +- .../__tests__/LiquidDetailCard.test.tsx | 3 +- .../__tests__/LocationConflictModal.test.tsx | 2 +- .../__tests__/LabwareInfoOverlay.test.tsx | 10 +- .../ProtocolRunModuleControls.test.tsx | 2 +- .../ProtocolRunRuntimeParameters.test.tsx | 7 +- .../SetupFlexPipetteCalibrationItem.test.tsx | 2 +- .../getLabwareOffsetLocation.test.tsx | 2 +- .../__tests__/getLocationInfoNames.test.ts | 3 +- .../getModuleInitialLoadInfo.test.ts | 8 +- .../__tests__/getProtocolModulesInfo.test.ts | 4 +- .../getSlotLabwareDefinition.test.ts | 2 +- .../ProtocolRun/utils/getLocationInfoNames.ts | 4 +- .../ProtocolRun/utils/getModuleName.ts | 2 +- ...getModuleTypesThatRequireExtraAttention.ts | 3 +- .../utils/getSlotLabwareDefinition.ts | 2 +- .../RobotSettings/ConnectNetwork/types.ts | 2 +- .../__tests__/RobotSettingsAdvanced.test.tsx | 2 +- .../Devices/__tests__/ModuleInfo.test.tsx | 2 +- .../__tests__/RecentProtocolRuns.test.tsx | 2 +- app/src/organisms/Devices/constants.ts | 7 +- .../Devices/getModulePrepCommands.ts | 2 +- .../__tests__/useAttachedModules.test.tsx | 2 +- .../useAttachedPipetteCalibrations.test.tsx | 3 +- .../__tests__/useAttachedPipettes.test.tsx | 4 +- ...tachedPipettesFromInstrumentsQuery.test.ts | 2 +- .../useDeckCalibrationStatus.test.tsx | 3 +- .../hooks/__tests__/useIsFlex.test.tsx | 3 +- .../useIsLegacySessionInProgress.test.ts | 2 +- .../hooks/__tests__/useIsRobotBusy.test.ts | 3 +- .../__tests__/useIsRobotViewable.test.tsx | 4 +- .../hooks/__tests__/useLights.test.tsx | 3 +- .../usePipetteOffsetCalibration.test.tsx | 5 +- .../useProtocolAnalysisErrors.test.tsx | 2 +- .../useProtocolDetailsForRun.test.tsx | 11 +- .../useProtocolRunAnalyticsData.test.tsx | 3 +- .../__tests__/useRobotAnalyticsData.test.tsx | 3 +- .../useRunPipetteInfoByMount.test.tsx | 3 +- ...nStartedOrLegacySessionInProgress.test.tsx | 2 +- .../__tests__/useSyncRobotClock.test.tsx | 3 +- .../useTrackCreateProtocolRunEvent.test.tsx | 3 +- .../useTrackProtocolRunEvent.test.tsx | 3 +- .../Devices/hooks/useCalibrationTaskList.ts | 3 +- .../Devices/hooks/useDownloadRunLog.ts | 12 +- .../hooks/useModuleCalibrationStatus.ts | 2 +- .../hooks/useProtocolAnalysisErrors.ts | 2 +- .../hooks/useProtocolRunAnalyticsData.ts | 4 +- .../Devices/hooks/useRunCalibrationStatus.ts | 14 +- .../organisms/DropTipWizard/JogToPosition.tsx | 3 +- app/src/organisms/DropTipWizard/types.ts | 2 +- .../__tests__/FirmwareUpdateModal.test.tsx | 2 +- .../organisms/GripperWizardFlows/index.tsx | 2 +- app/src/organisms/GripperWizardFlows/types.ts | 6 +- .../ProtocolInstrumentMountItem.tsx | 8 +- .../MoveLabwareInterventionContent.tsx | 12 +- .../InterventionModal/__fixtures__/index.ts | 2 +- .../__tests__/InterventionModal.test.tsx | 6 +- .../utils/getLabwareNameFromRunData.ts | 7 +- .../utils/isInterventionCommand.ts | 4 +- .../LabwarePositionCheck/AttachProbe.tsx | 14 +- .../LabwarePositionCheck/CheckItem.tsx | 14 +- .../LabwarePositionCheck/DetachProbe.tsx | 8 +- .../IntroScreen/index.tsx | 6 +- .../LabwarePositionCheck/JogToWell.tsx | 5 +- .../LabwarePositionCheckComponent.tsx | 29 ++- .../LabwarePositionCheck/PickUpTip.tsx | 12 +- .../LabwarePositionCheck/PrepareSpace.tsx | 13 +- .../LabwarePositionCheck/ResultsSummary.tsx | 6 +- .../LabwarePositionCheck/ReturnTip.tsx | 13 +- .../getLabwarePositionCheckSteps.ts | 2 +- .../organisms/LabwarePositionCheck/index.tsx | 4 +- .../organisms/LabwarePositionCheck/types.ts | 4 +- .../utils/doesPipetteVisitAllTipracks.ts | 8 +- .../utils/getDisplayLocation.ts | 2 +- .../utils/getProbeBasedLPCSteps.ts | 11 +- .../ModuleCard/MagneticModuleData.tsx | 3 +- .../ModuleCard/TestShakeSlideout.tsx | 2 +- .../organisms/ModuleWizardFlows/constants.ts | 2 +- app/src/organisms/ModuleWizardFlows/types.ts | 4 +- .../RunningProtocolCommandList.tsx | 3 +- .../PipetteWizardFlows/AttachProbe.tsx | 8 +- .../PipetteWizardFlows/BeforeBeginning.tsx | 2 +- .../getPipetteWizardStepsForProtocol.test.tsx | 3 +- .../getPipetteWizardSteps.ts | 86 ++++---- .../getPipetteWizardStepsForProtocol.ts | 55 +++--- .../organisms/PipetteWizardFlows/hooks.tsx | 9 +- .../organisms/PipetteWizardFlows/index.tsx | 16 +- app/src/organisms/PipetteWizardFlows/types.ts | 7 +- .../ProtocolSetupDeckConfiguration.test.tsx | 2 +- .../ProtocolSetupInstruments/utils.ts | 6 +- .../LabwareMapViewModal.tsx | 2 +- .../__tests__/LabwareMapViewModal.test.tsx | 2 +- .../organisms/ProtocolSetupLabware/index.tsx | 10 +- .../organisms/ProtocolSetupLiquids/index.tsx | 3 +- .../ProtocolSetupModulesAndDeck.test.tsx | 4 +- .../ProtocolSetupModulesAndDeck/utils.ts | 2 +- .../__tests__/ResetValuesModal.test.tsx | 2 +- .../ProtocolsLanding/ProtocolCard.tsx | 4 +- .../ProtocolsLanding/__tests__/hooks.test.tsx | 2 +- app/src/organisms/ProtocolsLanding/hooks.tsx | 2 +- .../QuickTransferFlow/CreateNewTransfer.tsx | 2 +- .../QuickTransferFlow/SelectDestLabware.tsx | 5 +- .../QuickTransferFlow/SelectDestWells.tsx | 2 +- .../QuickTransferFlow/SelectPipette.tsx | 3 +- .../QuickTransferFlow/SelectSourceLabware.tsx | 5 +- .../QuickTransferFlow/SelectSourceWells.tsx | 2 +- .../QuickTransferFlow/SelectTipRack.tsx | 3 +- .../QuickTransferFlow/SummaryAndSettings.tsx | 3 +- .../QuickTransferFlow/VolumeEntry.tsx | 2 +- app/src/organisms/QuickTransferFlow/index.tsx | 2 +- app/src/organisms/QuickTransferFlow/types.ts | 2 +- .../CalibrationDetails/OverflowMenu.tsx | 12 +- .../__tests__/OverflowMenu.test.tsx | 2 +- .../TipLengthCalibrationItems.test.tsx | 2 +- .../RobotSettingsTipLengthCalibration.tsx | 7 +- app/src/organisms/RunPreview/CommandIcon.tsx | 6 +- app/src/organisms/RunPreview/index.tsx | 3 +- .../__tests__/RunProgressMeter.test.tsx | 2 +- .../RunTimeControl/__tests__/hooks.test.tsx | 2 +- app/src/organisms/RunTimeControl/utils.ts | 3 +- .../SendProtocolToFlexSlideout/index.tsx | 7 +- .../__tests__/UpdateAppModal.test.tsx | 3 +- app/src/pages/DeckConfiguration/index.tsx | 2 +- .../Devices/ProtocolRunDetails/index.tsx | 4 +- .../pages/Labware/__tests__/hooks.test.tsx | 2 +- app/src/pages/Labware/index.tsx | 8 +- .../DeleteProtocolConfirmationModal.test.tsx | 8 +- .../__tests__/LongPressModal.test.tsx | 2 +- .../__tests__/ProtocolCard.test.tsx | 3 +- .../__tests__/Liquids.test.tsx | 6 +- .../__tests__/ProtocolDetails.test.tsx | 8 +- .../Protocols/hooks/__tests__/hooks.test.tsx | 12 +- app/src/pages/RobotDashboard/index.tsx | 2 +- app/src/redux/alerts/actions.ts | 2 +- app/src/redux/alerts/types.ts | 2 +- app/src/redux/analytics/actions.ts | 2 +- app/src/redux/analytics/types.ts | 9 +- .../__fixtures__/calibration-status.ts | 2 +- app/src/redux/calibration/actions.ts | 4 +- app/src/redux/calibration/api-types.ts | 2 +- .../calibration/pipette-offset/actions.ts | 2 +- .../redux/calibration/pipette-offset/types.ts | 2 +- .../redux/calibration/tip-length/actions.ts | 2 +- app/src/redux/calibration/tip-length/types.ts | 2 +- app/src/redux/calibration/types.ts | 2 +- app/src/redux/config/actions.ts | 2 +- app/src/redux/config/types.ts | 2 +- .../custom-labware/__fixtures__/index.ts | 2 +- app/src/redux/custom-labware/actions.ts | 2 +- app/src/redux/custom-labware/reducer.ts | 2 +- app/src/redux/discovery/reducer.ts | 2 +- app/src/redux/discovery/selectors.ts | 2 +- app/src/redux/discovery/types.ts | 2 +- app/src/redux/modules/__fixtures__/index.ts | 4 +- app/src/redux/modules/actions.ts | 2 +- app/src/redux/modules/api-types.ts | 5 +- app/src/redux/modules/constants.ts | 3 +- .../epic/__tests__/updateModuleEpic.test.ts | 2 +- app/src/redux/modules/types.ts | 7 +- app/src/redux/networking/actions.ts | 2 +- app/src/redux/networking/api-types.ts | 2 +- .../redux/networking/epic/disconnectEpic.ts | 8 +- .../networking/epic/fetchEapOptionsEpic.ts | 2 +- .../networking/epic/wifiConfigureEpic.ts | 2 +- app/src/redux/networking/reducer.ts | 2 +- app/src/redux/networking/selectors.ts | 2 +- app/src/redux/networking/types.ts | 4 +- app/src/redux/pipettes/__fixtures__/index.ts | 2 +- app/src/redux/pipettes/actions.ts | 2 +- .../fetchPipetteSettingsEpic.test.ts | 2 +- .../epic/__tests__/fetchPipettesEpic.test.ts | 2 +- .../updatePipetteSettingsEpic.test.ts | 2 +- app/src/redux/pipettes/selectors.ts | 2 +- app/src/redux/protocol-storage/actions.ts | 2 +- app/src/redux/protocol-storage/reducer.ts | 2 +- app/src/redux/protocol-storage/types.ts | 2 +- .../robot-admin/__tests__/selectors.test.ts | 2 +- app/src/redux/robot-admin/actions.ts | 2 +- .../redux/robot-admin/epic/resetConfigEpic.ts | 2 +- app/src/redux/robot-api/actions.ts | 2 +- app/src/redux/robot-api/helpers.ts | 2 +- app/src/redux/robot-api/operators.ts | 17 +- app/src/redux/robot-api/selectors.ts | 2 +- app/src/redux/robot-api/types.ts | 2 +- app/src/redux/robot-controls/actions.ts | 2 +- .../epic/__tests__/fetchLightsEpic.test.ts | 2 +- .../epic/__tests__/homeEpic.test.ts | 2 +- .../epic/__tests__/moveEpic.test.ts | 2 +- .../epic/__tests__/updateLightsEpic.test.ts | 2 +- .../robot-controls/epic/updateLightsEpic.ts | 2 +- app/src/redux/robot-settings/actions.ts | 2 +- .../epic/__tests__/fetchSettingsEpic.test.ts | 2 +- .../epic/__tests__/updateSettingEpic.test.ts | 2 +- .../redux/robot-update/__tests__/epic.test.ts | 2 +- app/src/redux/sessions/__fixtures__/index.ts | 4 +- app/src/redux/sessions/actions.ts | 2 +- .../redux/sessions/calibration-check/types.ts | 2 +- .../redux/sessions/deck-calibration/types.ts | 2 +- .../createSessionCommandEpic.test.ts | 2 +- .../pipette-offset-calibration/types.ts | 2 +- app/src/redux/sessions/selectors.ts | 2 +- .../sessions/tip-length-calibration/types.ts | 2 +- app/src/redux/sessions/types.ts | 20 +- app/src/redux/system-info/actions.ts | 2 +- app/src/redux/system-info/types.ts | 2 +- .../__tests__/useCanDisconnect.test.tsx | 3 +- .../__tests__/useNetworkConnection.test.tsx | 3 +- .../networking/__tests__/useWifiList.test.ts | 4 +- components/src/atoms/StyledText/index.tsx | 2 +- components/src/buttons/Button.tsx | 7 +- components/src/forms/Select.tsx | 10 +- .../src/hardware-sim/BaseDeck/BaseDeck.tsx | 2 +- .../BaseDeck/WasteChuteFixture.tsx | 9 +- .../hardware-sim/Deck/MoveLabwareOnDeck.tsx | 6 +- .../src/hardware-sim/Deck/RobotWorkSpace.tsx | 3 +- .../hardware-sim/Labware/LabwareRender.tsx | 11 +- .../Labware/labwareInternals/WellLabels.tsx | 3 +- .../__tests__/StrokedWells.test.tsx | 3 +- .../__tests__/WellLabels.test.tsx | 6 +- .../Labware/labwareInternals/types.ts | 2 +- .../hardware-sim/Module/Module.stories.tsx | 3 +- .../Module/Thermocycler/index.tsx | 7 +- components/src/hardware-sim/Module/index.tsx | 7 +- .../hardware-sim/Pipette/PipetteRender.tsx | 7 +- .../hardware-sim/ProtocolDeck/LabwareInfo.tsx | 2 +- .../getLabwareInforByLiquidId.test.ts | 2 +- components/src/hardware-sim/utils.ts | 2 +- components/src/hooks/useDrag.ts | 9 +- components/src/hooks/useLongPress.ts | 13 +- .../src/hooks/useSelectDeckLocation/index.tsx | 8 +- components/src/hooks/useSwipe.ts | 9 +- components/src/icons/IconList.stories.tsx | 3 +- components/src/icons/ModuleIcon.tsx | 3 +- .../src/instrument/InstrumentDiagram.tsx | 2 +- components/src/modals/ModalShell.tsx | 4 +- components/src/primitives/Btn.tsx | 3 +- .../src/testing/utils/renderWithProviders.tsx | 4 +- discovery-client/src/store/actions.ts | 2 +- discovery-client/src/store/types.ts | 4 +- discovery-client/typings/mdns-js.d.ts | 2 +- labware-designer/typings/global.d.ts | 2 +- .../components/ConditionalLabwareRender.tsx | 2 +- .../labware-creator/components/Dropdown.tsx | 7 +- .../components/FormLevelErrorAlerts.tsx | 3 +- .../components/__tests__/FormAlerts.test.tsx | 3 +- .../sections/CreateNewDefinition.test.tsx | 5 +- .../sections/CustomTiprackWarning.test.tsx | 11 +- .../__tests__/sections/Description.test.tsx | 9 +- .../__tests__/sections/Export.test.tsx | 9 +- .../__tests__/sections/File.test.tsx | 9 +- .../__tests__/sections/Footprint.test.tsx | 5 +- .../__tests__/sections/Grid.test.tsx | 9 +- .../__tests__/sections/GridOffset.test.tsx | 5 +- .../sections/HandPlacedTipFit.test.tsx | 4 +- .../__tests__/sections/Height.test.tsx | 5 +- .../__tests__/sections/Preview.test.tsx | 9 +- .../__tests__/sections/Regularity.test.tsx | 9 +- .../__tests__/sections/Volume.test.tsx | 9 +- .../sections/WellBottomAndDepth.test.tsx | 11 +- .../sections/WellShapeAndSides.test.tsx | 9 +- .../__tests__/sections/WellSpacing.test.tsx | 9 +- .../components/alerts/FormAlerts.tsx | 2 +- .../components/alerts/HeightAlerts.tsx | 5 +- .../components/alerts/TipFitAlerts.tsx | 4 +- .../components/alerts/XYDimensionAlerts.tsx | 4 +- .../components/sections/Description.tsx | 2 +- .../components/sections/File.tsx | 2 +- .../components/sections/Footprint.tsx | 2 +- .../components/sections/Grid.tsx | 3 +- .../components/sections/GridOffset.tsx | 2 +- .../components/sections/Height.tsx | 2 +- .../components/sections/Preview.tsx | 2 +- .../components/sections/Volume.tsx | 2 +- .../sections/WellBottomAndDepth.tsx | 2 +- .../components/sections/WellShapeAndSides.tsx | 2 +- .../components/sections/WellSpacing.tsx | 2 +- .../components/utils/wrapInFormik.tsx | 3 +- .../src/labware-creator/fieldsToLabware.ts | 13 +- .../labware-creator/formLevelValidation.ts | 5 +- .../src/labware-creator/getDefaultedDef.ts | 5 +- labware-library/src/labware-creator/index.tsx | 13 +- .../src/labware-creator/labwareFormSchema.ts | 3 +- .../labware-creator/utils/displayAsTube.ts | 2 +- .../utils/getIsCustomTubeRack.ts | 2 +- .../utils/getIsOpentronsTubeRack.ts | 2 +- .../utils/getIsXYGeometryChanged.ts | 2 +- .../labware-creator/utils/getLabwareName.ts | 2 +- .../utils/isEveryFieldHidden.ts | 2 +- .../utils/makeAutofillOnChange.ts | 2 +- package.json | 1 + protocol-designer/src/analytics/actions.ts | 3 +- protocol-designer/src/analytics/index.ts | 3 +- protocol-designer/src/analytics/middleware.ts | 15 +- protocol-designer/src/analytics/mixpanel.ts | 2 +- protocol-designer/src/analytics/reducers.ts | 9 +- protocol-designer/src/analytics/selectors.ts | 2 +- .../components/BatchEditForm/BatchEditMix.tsx | 4 +- .../BatchEditForm/BatchEditMoveLiquid.tsx | 4 +- .../src/components/BatchEditForm/index.tsx | 7 +- .../BatchEditForm/makeBatchEditFieldProps.ts | 12 +- .../src/components/ColorPicker/index.tsx | 3 +- .../components/DeckSetup/LabwareOnDeck.tsx | 2 +- .../LabwareOverlays/AdapterControls.tsx | 6 +- .../DeckSetup/LabwareOverlays/EditLabware.tsx | 7 +- .../LabwareOverlays/LabwareControls.tsx | 5 +- .../DeckSetup/LabwareOverlays/LabwareName.tsx | 2 +- .../LabwareOverlays/SlotControls.tsx | 6 +- .../src/components/DeckSetup/Ot2ModuleTag.tsx | 6 +- .../src/components/DeckSetup/index.tsx | 28 ++- .../src/components/DeckSetup/utils.ts | 7 +- .../__tests__/FileSidebar.test.tsx | 7 +- .../FileSidebar/utils/getUnusedEntities.ts | 3 +- .../FileSidebar/utils/getUnusedTrash.ts | 3 +- .../src/components/IngredientsList/index.tsx | 2 +- .../LabwareSelectionModal/LabwareItem.tsx | 5 +- .../LabwareSelectionModal/LabwarePreview.tsx | 2 +- .../src/components/LiquidPlacementModal.tsx | 3 +- .../StepEditForm/StepEditFormComponent.tsx | 6 +- .../fields/BlowoutLocationField.tsx | 5 +- .../getDisabledChangeTipOptions.ts | 4 +- .../fields/ChangeTipField/index.tsx | 10 +- .../StepEditForm/fields/CheckboxRowField.tsx | 2 +- .../fields/Configure96ChannelField.tsx | 2 +- .../StepEditForm/fields/DelayFields.tsx | 4 +- .../fields/DisposalVolumeField.tsx | 2 +- .../fields/DropTipField/index.tsx | 5 +- .../StepEditForm/fields/MixFields.tsx | 2 +- .../fields/PathField/PathField.tsx | 11 +- .../StepEditForm/fields/ProfileItemRows.tsx | 14 +- .../StepEditForm/fields/RadioGroupField.tsx | 4 +- .../fields/StepFormDropdownField.tsx | 5 +- .../StepEditForm/fields/TextField.tsx | 2 +- .../fields/TipPositionField/index.tsx | 2 +- .../StepEditForm/fields/ToggleRowField.tsx | 2 +- .../StepEditForm/fields/VolumeField.tsx | 4 +- .../fields/WellOrderField/WellOrderViz.tsx | 2 +- .../fields/WellOrderField/index.tsx | 4 +- .../WellSelectionField/WellSelectionModal.tsx | 9 +- .../fields/makeSingleEditFieldProps.ts | 4 +- .../MoveLiquidForm/SourceDestHeaders.tsx | 2 +- .../ThermocyclerForm/ProfileSettings.tsx | 2 +- .../forms/ThermocyclerForm/StateFields.tsx | 4 +- .../forms/ThermocyclerForm/index.tsx | 2 +- .../forms/__tests__/HeaterShakerForm.test.tsx | 8 +- .../forms/__tests__/TemperatureForm.test.tsx | 5 +- .../src/components/StepEditForm/types.ts | 2 +- .../src/components/StepEditForm/utils.ts | 14 +- .../StepSelectionBannerComponent.tsx | 2 +- .../components/StepSelectionBanner/index.tsx | 4 +- .../src/components/alerts/Alerts.tsx | 2 +- .../src/components/alerts/types.ts | 2 +- .../components/labware/BrowsableLabware.tsx | 9 +- .../components/labware/SelectableLabware.tsx | 2 +- .../src/components/labware/utils.ts | 7 +- .../src/components/lists/TitledStepList.tsx | 3 +- .../modals/CreateFileWizard/InputField.tsx | 2 +- .../CreateFileWizard/ModulesAndOtherTile.tsx | 3 +- .../CreateFileWizard/PipetteTipsTile.tsx | 2 +- .../CreateFileWizard/PipetteTypeTile.tsx | 4 +- .../modals/CreateFileWizard/index.tsx | 20 +- .../modals/CreateFileWizard/types.ts | 2 +- .../EditMultipleModulesModal.tsx | 7 +- .../modals/EditModulesModal/ModelDropdown.tsx | 7 +- .../EditMultipleModulesModal.test.tsx | 7 +- .../modals/EditModulesModal/index.tsx | 13 +- .../modals/FilePipettesModal/ModuleFields.tsx | 3 +- .../FilePipettesModal/PipetteDiagram.tsx | 9 +- .../FilePipettesModal/PipetteFields.tsx | 25 +-- .../modals/FilePipettesModal/index.tsx | 20 +- .../FileUploadMessageModal/modalContents.tsx | 2 +- .../modals/FileUploadMessageModal/types.ts | 2 +- .../LabwareUploadMessageModal.tsx | 5 +- .../components/modals/MoreOptionsModal.tsx | 2 +- .../src/components/modals/utils.ts | 4 +- .../components/modules/EditModulesCard.tsx | 5 +- .../src/components/modules/ModuleDiagram.tsx | 3 +- .../src/components/modules/ModuleRow.tsx | 3 +- .../components/modules/StagingAreasModal.tsx | 12 +- .../src/components/modules/TrashModal.tsx | 7 +- .../src/components/modules/utils.ts | 2 +- .../steplist/DraggableStepItems.tsx | 17 +- .../src/components/steplist/IngredPill.tsx | 8 +- .../components/steplist/ModuleStepItems.tsx | 11 +- .../steplist/MultiSelectToolbar/index.tsx | 6 +- .../components/steplist/PauseStepItems.tsx | 2 +- .../components/steplist/SourceDestSubstep.tsx | 2 +- .../src/components/steplist/StepItem.tsx | 25 ++- .../src/components/steplist/SubstepRow.tsx | 6 +- .../TerminalItem/TerminalItemLink.tsx | 2 +- .../steplist/TerminalItem/index.tsx | 8 +- .../src/components/steplist/index.ts | 6 +- protocol-designer/src/configureStore.ts | 13 +- protocol-designer/src/constants.ts | 9 +- .../src/containers/ConnectedNav.tsx | 3 +- .../src/containers/ConnectedStepItem.tsx | 23 +-- .../src/containers/ConnectedTitleBar.tsx | 3 +- protocol-designer/src/dismiss/index.ts | 3 +- protocol-designer/src/dismiss/reducers.ts | 13 +- protocol-designer/src/dismiss/selectors.ts | 10 +- .../src/feature-flags/actions.ts | 2 +- protocol-designer/src/feature-flags/index.ts | 3 +- .../src/feature-flags/reducers.ts | 12 +- .../src/feature-flags/selectors.ts | 4 +- protocol-designer/src/feature-flags/utils.ts | 3 +- .../__fixtures__/createFile/engageMagnet.ts | 6 +- .../__fixtures__/createFile/noModules.ts | 6 +- .../__fixtures__/createFile/v6Fixture.ts | 6 +- protocol-designer/src/file-data/actions.ts | 4 +- protocol-designer/src/file-data/index.ts | 3 +- .../src/file-data/reducers/index.ts | 18 +- .../src/file-data/selectors/commands.ts | 10 +- .../src/file-data/selectors/fileCreator.ts | 19 +- protocol-designer/src/file-types.ts | 14 +- protocol-designer/src/form-types.ts | 2 +- protocol-designer/src/labware-defs/index.ts | 3 +- .../src/labware-defs/reducers.ts | 11 +- .../src/labware-defs/selectors.ts | 10 +- protocol-designer/src/labware-defs/types.ts | 2 +- protocol-designer/src/labware-defs/utils.ts | 8 +- .../src/labware-ingred/actions/actions.ts | 4 +- .../src/labware-ingred/actions/thunks.ts | 6 +- .../src/labware-ingred/reducers/index.ts | 13 +- .../src/labware-ingred/selectors.ts | 13 +- protocol-designer/src/labware-ingred/types.ts | 2 +- protocol-designer/src/load-file/actions.ts | 6 +- protocol-designer/src/load-file/index.ts | 3 +- .../src/load-file/migration/1_1_0.ts | 3 +- .../src/load-file/migration/3_0_0.ts | 4 +- .../src/load-file/migration/6_0_0.ts | 7 +- .../src/load-file/migration/index.ts | 2 +- .../migration/utils/v1LabwareModelToV2Def.ts | 2 +- protocol-designer/src/load-file/reducers.ts | 9 +- protocol-designer/src/load-file/selectors.ts | 4 +- protocol-designer/src/load-file/types.ts | 2 +- protocol-designer/src/navigation/actions.ts | 2 +- protocol-designer/src/navigation/index.ts | 3 +- .../src/navigation/reducers/index.ts | 12 +- protocol-designer/src/navigation/selectors.ts | 4 +- protocol-designer/src/persist.ts | 2 +- protocol-designer/src/pipettes/pipetteData.ts | 2 +- .../src/step-forms/actions/index.ts | 6 +- .../src/step-forms/actions/modules.ts | 4 +- .../src/step-forms/actions/pipettes.ts | 4 +- protocol-designer/src/step-forms/index.ts | 3 +- .../src/step-forms/reducers/index.ts | 48 ++--- .../reducers/nestedCombineReducers.ts | 2 +- .../src/step-forms/selectors/index.ts | 52 +++-- protocol-designer/src/step-forms/types.ts | 8 +- .../utils/createInitialProfileItems.ts | 8 +- .../utils/createPresavedStepForm.ts | 10 +- .../src/step-forms/utils/index.ts | 2 +- .../src/steplist/actions/actions.ts | 8 +- .../src/steplist/actions/types.ts | 2 +- .../src/steplist/fieldLevel/index.ts | 7 +- .../src/steplist/formLevel/createBlankForm.ts | 7 +- .../src/steplist/formLevel/errors.ts | 4 +- .../formLevel/getDefaultsForStepType.ts | 2 +- .../getNextDefaultEngageHeight/index.ts | 2 +- .../getNextDefaultMagnetAction/index.ts | 2 +- .../getNextDefaultTemperatureModuleId.ts | 4 +- .../getNextDefaultThermocyclerModuleId.ts | 2 +- .../getNextDefaultPipetteId/index.ts | 4 +- .../dependentFieldsUpdateHeaterShaker.ts | 4 +- .../dependentFieldsUpdateMagnet.ts | 4 +- .../dependentFieldsUpdateMoveLiquid.ts | 4 +- .../dependentFieldsUpdatePause.ts | 4 +- .../dependentFieldsUpdateTemperature.ts | 4 +- .../dependentFieldsUpdateThermocycler.ts | 4 +- .../formLevel/handleFormChange/index.ts | 9 +- .../handleFormChange/test/moveLiquid.test.ts | 2 +- .../formLevel/handleFormChange/utils.ts | 14 +- .../src/steplist/formLevel/index.ts | 7 +- .../src/steplist/formLevel/profileErrors.ts | 3 +- .../formLevel/stepFormToArgs/getDelayData.ts | 4 +- .../stepFormToArgs/heaterShakerFormToArgs.ts | 2 +- .../formLevel/stepFormToArgs/index.ts | 2 +- .../stepFormToArgs/magnetFormToArgs.ts | 4 +- .../formLevel/stepFormToArgs/mixFormToArgs.ts | 4 +- .../stepFormToArgs/moveLiquidFormToArgs.ts | 7 +- .../stepFormToArgs/pauseFormToArgs.ts | 2 +- .../stepFormToArgs/temperatureFormToArgs.ts | 4 +- .../test/pauseFormToArgs.test.ts | 2 +- .../test/stepFormToArgs.test.ts | 2 +- .../test/thermocyclerFormToArgs.test.ts | 2 +- .../stepFormToArgs/thermocyclerFormToArgs.ts | 4 +- .../src/steplist/generateSubstepItem.ts | 4 +- protocol-designer/src/steplist/index.ts | 7 +- .../src/steplist/substepTimeline.ts | 10 +- protocol-designer/src/steplist/types.ts | 4 +- protocol-designer/src/steplist/utils/index.ts | 2 +- .../src/steplist/utils/orderWells.ts | 5 +- .../generateRobotStateTimeline.test.ts | 7 +- .../timelineMiddleware/generateSubsteps.ts | 6 +- .../makeTimelineMiddleware.ts | 10 +- .../src/timelineMiddleware/types.ts | 8 +- .../src/timelineMiddleware/worker.ts | 3 +- .../top-selectors/labware-locations/index.ts | 9 +- .../src/top-selectors/substep-highlight.ts | 14 +- .../src/top-selectors/timelineFrames.ts | 13 +- .../top-selectors/timelineWarnings/index.ts | 4 +- .../src/top-selectors/tip-contents/index.ts | 4 +- .../getWellContentsAllLabware.ts | 10 +- .../src/top-selectors/well-contents/index.ts | 15 +- .../src/tutorial/__tests__/selectors.test.ts | 2 +- protocol-designer/src/tutorial/index.ts | 4 +- protocol-designer/src/tutorial/reducers.ts | 10 +- protocol-designer/src/tutorial/selectors.ts | 4 +- protocol-designer/src/ui/index.ts | 9 +- protocol-designer/src/ui/labware/selectors.ts | 6 +- protocol-designer/src/ui/modules/selectors.ts | 2 +- protocol-designer/src/ui/modules/utils.ts | 4 +- .../src/ui/steps/__fixtures__/index.ts | 2 +- .../src/ui/steps/actions/actions.ts | 23 +-- .../src/ui/steps/actions/thunks/index.ts | 6 +- .../src/ui/steps/actions/types.ts | 6 +- protocol-designer/src/ui/steps/reducers.ts | 26 ++- protocol-designer/src/ui/steps/selectors.ts | 22 +-- .../src/ui/steps/test/selectors.test.ts | 2 +- protocol-designer/src/ui/steps/utils.ts | 2 +- protocol-designer/src/utils/index.ts | 16 +- .../src/utils/labwareModuleCompatibility.ts | 8 +- .../src/well-selection/actions.ts | 2 +- .../src/well-selection/reducers.ts | 11 +- .../src/well-selection/selectors.ts | 4 +- protocol-designer/typings/reselect.d.ts | 2 +- react-api-client/src/api/useHost.ts | 2 +- .../useDeleteCalibrationMutation.test.tsx | 12 +- .../__fixtures__/maintenanceCommands.ts | 2 +- .../useCreateMaintenanceRunMutation.ts | 20 +- .../useCurrentMaintenanceRun.ts | 7 +- .../useMaintenanceRunQuery.ts | 7 +- .../src/networking/useWifiQuery.ts | 4 +- .../useUpdatePipetteSettingsMutation.ts | 21 +- .../src/protocols/useAllProtocolIdsQuery.ts | 4 +- .../src/protocols/useAllProtocolsQuery.ts | 3 +- .../protocols/useCreateProtocolMutation.ts | 11 +- .../protocols/useDeleteProtocolMutation.ts | 8 +- .../src/protocols/useProtocolAnalysesQuery.ts | 4 +- .../useProtocolAnalysisAsDocumentQuery.ts | 6 +- .../src/protocols/useProtocolQuery.ts | 4 +- .../useAcknowledgeEstopDisengageMutation.ts | 17 +- react-api-client/src/robot/useDoorQuery.ts | 4 +- react-api-client/src/robot/useLightsQuery.ts | 3 +- .../src/robot/useSetLightsMutation.ts | 14 +- .../src/runs/__fixtures__/runActions.ts | 2 +- .../src/runs/__fixtures__/runCommands.ts | 2 +- .../src/runs/__fixtures__/runs.ts | 4 +- .../__tests__/useCreateRunMutation.test.tsx | 9 +- .../__tests__/useRunActionMutations.test.tsx | 8 +- .../runs/useAllCommandsAsPreSerializedList.ts | 4 +- .../src/runs/useAllCommandsQuery.ts | 4 +- react-api-client/src/runs/useCommandQuery.ts | 7 +- .../runs/useCreateLabwareOffsetMutation.ts | 9 +- .../src/runs/useCreateRunMutation.ts | 16 +- .../src/runs/usePauseRunMutation.ts | 16 +- .../src/runs/usePlayRunMutation.ts | 16 +- .../src/runs/useStopRunMutation.ts | 8 +- .../src/server/useUpdateRobotNameMutation.ts | 9 +- .../__tests__/useAllSessionsQuery.test.tsx | 3 +- .../useCreateSessionMutation.test.tsx | 8 +- .../src/sessions/useAllSessionsQuery.ts | 7 +- .../src/sessions/useCreateSessionMutation.ts | 10 +- .../src/sessions/useSessionQuery.ts | 7 +- .../src/sessions/useSessionsByTypeQuery.ts | 12 +- .../src/system/useAuthorization.ts | 8 +- shared-data/js/types.ts | 2 +- shared-data/protocol/types/schemaV3.ts | 2 +- shared-data/protocol/types/schemaV6/index.ts | 2 +- shared-data/protocol/types/schemaV7/index.ts | 7 +- .../src/__tests__/blowoutUtil.test.ts | 2 +- .../__tests__/deactivateTemperature.test.ts | 2 +- step-generation/src/__tests__/delay.test.ts | 2 +- .../src/__tests__/disengageMagnet.test.ts | 2 +- .../src/__tests__/dispense.test.ts | 6 +- .../dispenseUpdateLiquidState.test.ts | 6 +- .../src/__tests__/forAspirate.test.ts | 8 +- .../src/__tests__/forDropTip.test.ts | 2 +- .../getIsSafePipetteMovement.test.ts | 4 +- .../src/__tests__/moveLabware.test.ts | 5 +- .../src/__tests__/robotStateSelectors.test.ts | 5 +- .../src/__tests__/temperatureUpdates.test.ts | 2 +- .../__tests__/thermocyclerStateStep.test.ts | 7 +- .../src/__tests__/thermocyclerUpdates.test.ts | 7 +- step-generation/src/__tests__/utils.test.ts | 10 +- .../src/__tests__/waitForTemperature.test.ts | 6 +- step-generation/src/__utils__/testMatchers.ts | 2 +- .../atomic/configureNozzleLayout.ts | 3 +- .../src/commandCreators/atomic/moveLabware.ts | 6 +- .../src/commandCreators/atomic/replaceTip.ts | 3 +- .../commandCreators/compound/heaterShaker.ts | 11 +- .../src/fixtures/commandFixtures.ts | 5 +- .../src/fixtures/robotStateFixtures.ts | 12 +- .../forConfigureNozzleLayout.ts | 2 +- .../heaterShakerUpdates.ts | 4 +- step-generation/src/robotStateSelectors.ts | 2 +- step-generation/src/types.ts | 4 +- step-generation/src/utils/getLabwareSlot.ts | 2 +- step-generation/src/utils/misc.ts | 2 +- yarn.lock | 184 +++++++++++++++++- 648 files changed, 1963 insertions(+), 1803 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 95df4cae217..1226f14f9d3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -102,7 +102,6 @@ module.exports = { '@typescript-eslint/no-unnecessary-type-assertion': 'warn', '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'warn', '@typescript-eslint/no-unsafe-argument': 'warn', - '@typescript-eslint/consistent-type-imports': 'warn', '@typescript-eslint/consistent-indexed-object-style': 'warn', '@typescript-eslint/no-confusing-void-expression': 'warn', '@typescript-eslint/ban-types': 'warn', diff --git a/api-client/src/calibration/types.ts b/api-client/src/calibration/types.ts index c14ce57e64a..f1ca7559c1d 100644 --- a/api-client/src/calibration/types.ts +++ b/api-client/src/calibration/types.ts @@ -1,4 +1,4 @@ -import { Mount } from '../pipettes' +import type { Mount } from '../pipettes' export interface PipOffsetDeletionParams { calType: 'pipetteOffset' diff --git a/api-client/src/modules/api-types.ts b/api-client/src/modules/api-types.ts index eaee20cf498..68c4f3f26e7 100644 --- a/api-client/src/modules/api-types.ts +++ b/api-client/src/modules/api-types.ts @@ -1,6 +1,8 @@ -import { ModuleType } from '@opentrons/shared-data' - -import type { Coordinates, ModuleModel } from '@opentrons/shared-data' +import type { + ModuleType, + Coordinates, + ModuleModel, +} from '@opentrons/shared-data' type PortGroup = 'main' | 'left' | 'right' | 'front' | 'unknown' interface PhysicalPort { diff --git a/api-client/src/modules/types.ts b/api-client/src/modules/types.ts index 9514f64d412..f138680dafd 100644 --- a/api-client/src/modules/types.ts +++ b/api-client/src/modules/types.ts @@ -3,16 +3,14 @@ import type { ThermocyclerModuleModel, MagneticModuleModel, HeaterShakerModuleModel, -} from '@opentrons/shared-data' - -import { TEMPERATURE_MODULE_TYPE, MAGNETIC_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, } from '@opentrons/shared-data' -import * as ApiTypes from './api-types' +import type * as ApiTypes from './api-types' + export * from './api-types' // common types diff --git a/api-client/src/protocols/__tests__/utils.test.ts b/api-client/src/protocols/__tests__/utils.test.ts index 8be565de451..c400538518d 100644 --- a/api-client/src/protocols/__tests__/utils.test.ts +++ b/api-client/src/protocols/__tests__/utils.test.ts @@ -14,7 +14,7 @@ import { } from '../utils' import { simpleAnalysisFileFixture } from '../__fixtures__' -import { RunTimeCommand } from '@opentrons/shared-data' +import type { RunTimeCommand } from '@opentrons/shared-data' const mockRunTimeCommands: RunTimeCommand[] = simpleAnalysisFileFixture.commands as any const mockLoadLiquidRunTimeCommands = [ diff --git a/api-client/src/request.ts b/api-client/src/request.ts index 87b4997925b..00c0bab63e4 100644 --- a/api-client/src/request.ts +++ b/api-client/src/request.ts @@ -1,6 +1,11 @@ -import axios, { AxiosRequestConfig } from 'axios' - -import type { Method, AxiosPromise, AxiosResponse } from 'axios' +import Axios from 'axios' + +import type { + AxiosRequestConfig, + Method, + AxiosPromise, + AxiosResponse, +} from 'axios' import type { HostConfig } from './types' export type ResponsePromise = AxiosPromise @@ -26,7 +31,12 @@ export function request( config: HostConfig, params?: AxiosRequestConfig['params'] ): ResponsePromise { - const { hostname, port, requestor = axios.request, token } = config + const { + hostname, + port, + requestor = (...args) => Axios.request(...args), + token, + } = config const tokenHeader = token != null ? { authenticationBearer: token } : {} const headers = { ...DEFAULT_HEADERS, ...tokenHeader } diff --git a/api-client/src/sessions/createSession.ts b/api-client/src/sessions/createSession.ts index 61c6941637b..ffb1846bb70 100644 --- a/api-client/src/sessions/createSession.ts +++ b/api-client/src/sessions/createSession.ts @@ -3,7 +3,7 @@ import { POST, request } from '../request' import type { ResponsePromise } from '../request' import type { HostConfig } from '../types' import type { Session } from './types' -import { SessionType } from '.' +import type { SessionType } from '.' export interface CreateSessionData { sessionType: SessionType diff --git a/app-shell-odd/src/http.ts b/app-shell-odd/src/http.ts index 008cd80133f..6a0371fa282 100644 --- a/app-shell-odd/src/http.ts +++ b/app-shell-odd/src/http.ts @@ -1,13 +1,14 @@ // fetch wrapper to throw if response is not ok import fs from 'fs' import { remove } from 'fs-extra' -import { Transform, Readable } from 'stream' import pump from 'pump' import _fetch from 'node-fetch' import FormData from 'form-data' +import { Transform } from 'stream' import { HTTP_API_VERSION } from './constants' +import type { Readable } from 'stream' import type { Request, RequestInit, Response } from 'node-fetch' type RequestInput = Request | string diff --git a/app-shell-odd/src/notifications/subscribe.ts b/app-shell-odd/src/notifications/subscribe.ts index 4db9e3dbf9a..7f57d6d15a5 100644 --- a/app-shell-odd/src/notifications/subscribe.ts +++ b/app-shell-odd/src/notifications/subscribe.ts @@ -1,5 +1,3 @@ -import mqtt from 'mqtt' - import { connectionStore } from './store' import { sendDeserialized, @@ -8,6 +6,7 @@ import { } from './deserialize' import { notifyLog } from './notifyLog' +import type mqtt from 'mqtt' import type { NotifyTopic } from '@opentrons/app/src/redux/shell/types' /** diff --git a/app-shell/src/http.ts b/app-shell/src/http.ts index 8a3a8131ceb..32676d40949 100644 --- a/app-shell/src/http.ts +++ b/app-shell/src/http.ts @@ -1,12 +1,13 @@ // fetch wrapper to throw if response is not ok import fs from 'fs' import fsPromises from 'fs/promises' -import { Transform, Readable } from 'stream' +import { Transform } from 'stream' import pump from 'pump' import _fetch from 'node-fetch' import FormData from 'form-data' import type { Request, RequestInit, Response } from 'node-fetch' +import type { Readable } from 'stream' type RequestInput = Request | string diff --git a/app-shell/src/notifications/index.ts b/app-shell/src/notifications/index.ts index 221addea9f6..6c162e66a02 100644 --- a/app-shell/src/notifications/index.ts +++ b/app-shell/src/notifications/index.ts @@ -4,7 +4,6 @@ import { cleanUpUnreachableRobots, getHealthyRobotDataForNotifyConnections, closeConnectionsForcefullyFor, - RobotData, } from './connect' import { subscribe } from './subscribe' import { notifyLog } from './notifyLog' @@ -12,6 +11,7 @@ import { notifyLog } from './notifyLog' import type { DiscoveryClientRobot } from '@opentrons/discovery-client' import type { BrowserWindow } from 'electron' import type { Action, Dispatch } from '../types' +import type { RobotData } from './connect' // Manages MQTT broker connections through a connection store. Broker connections are added based on health status // reported by discovery-client and broker connectivity status reported by MQTT. Because a robot may have several IPs, diff --git a/app-shell/src/notifications/subscribe.ts b/app-shell/src/notifications/subscribe.ts index 54ee43d92c6..0fda7b30d31 100644 --- a/app-shell/src/notifications/subscribe.ts +++ b/app-shell/src/notifications/subscribe.ts @@ -1,5 +1,3 @@ -import mqtt from 'mqtt' - import { connectionStore } from './store' import { sendDeserialized, @@ -8,6 +6,7 @@ import { } from './deserialize' import { notifyLog } from './notifyLog' +import type mqtt from 'mqtt' import type { NotifyTopic } from '@opentrons/app/src/redux/shell/types' /** diff --git a/app-shell/src/protocol-analysis/__tests__/protocolAnalysis.test.ts b/app-shell/src/protocol-analysis/__tests__/protocolAnalysis.test.ts index e83ed5d4c7a..8463e8a09cf 100644 --- a/app-shell/src/protocol-analysis/__tests__/protocolAnalysis.test.ts +++ b/app-shell/src/protocol-analysis/__tests__/protocolAnalysis.test.ts @@ -1,23 +1,24 @@ import { vi, it, expect, describe, beforeEach } from 'vitest' import { when } from 'vitest-when' -import electron from 'electron' import * as ProtocolAnalysis from '@opentrons/app/src/redux/protocol-analysis' import * as Cfg from '@opentrons/app/src/redux/config' import * as Dialogs from '../../dialogs' -import { Config, getConfig, handleConfigChange } from '../../config' +import { getConfig, handleConfigChange } from '../../config' import { getValidLabwareFilePaths } from '../../labware' import { selectPythonPath, getPythonPath } from '../getPythonPath' import { executeAnalyzeCli } from '../executeAnalyzeCli' import { writeFailedAnalysis } from '../writeFailedAnalysis' -import { createLogger } from '../../log' import { registerProtocolAnalysis, analyzeProtocolSource, CONFIG_PYTHON_PATH_TO_PYTHON_OVERRIDE, } from '..' -import { Dispatch } from '../../types' +import type electron from 'electron' +import type { createLogger } from '../../log' +import type { Dispatch } from '../../types' +import type { Config } from '../../config' vi.mock('../../labware') vi.mock('../../dialogs') diff --git a/app-shell/src/protocol-analysis/writeFailedAnalysis.ts b/app-shell/src/protocol-analysis/writeFailedAnalysis.ts index 8723cd52d04..02f0293dcde 100644 --- a/app-shell/src/protocol-analysis/writeFailedAnalysis.ts +++ b/app-shell/src/protocol-analysis/writeFailedAnalysis.ts @@ -1,7 +1,7 @@ import { writeFile } from 'fs/promises' import uuid from 'uuid/v4' -import { ProtocolAnalysisOutput } from '@opentrons/shared-data' +import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' const UNEXPECTED_ERROR_TYPE = 'UnexpectedAnalysisError' diff --git a/app-shell/src/robot-update/release-files.ts b/app-shell/src/robot-update/release-files.ts index 50e2366632a..2c6a4244670 100644 --- a/app-shell/src/robot-update/release-files.ts +++ b/app-shell/src/robot-update/release-files.ts @@ -7,13 +7,12 @@ import { move, readdir, remove, readFile } from 'fs-extra' import StreamZip from 'node-stream-zip' import getStream from 'get-stream' -import type { RobotUpdateTarget } from '@opentrons/app/src/redux/robot-update/types' - import { createLogger } from '../log' import { fetchToFile } from '../http' -import { Dispatch } from '../types' import { CURRENT_VERSION } from '../update' +import type { RobotUpdateTarget } from '@opentrons/app/src/redux/robot-update/types' +import type { Dispatch } from '../types' import type { DownloadProgress } from '../http' import type { ReleaseSetUrls, ReleaseSetFilepaths, UserFileInfo } from './types' @@ -94,16 +93,16 @@ export function downloadAndNotify( return move(tempPath, path, { overwrite: true }) .then(() => { if (isReleaseNotesDownload) { - return readFile(path, 'utf8').then(releaseNotes => + return readFile(path, 'utf8').then(releaseNotes => { dispatch({ type: 'robotUpdate:UPDATE_INFO', payload: { releaseNotes, target, version: CURRENT_VERSION }, }) - ) + }) } // This action will only have an effect if the user is actively waiting for the download to complete. else { - return dispatch({ + dispatch({ type: 'robotUpdate:DOWNLOAD_DONE', payload: target, }) @@ -151,7 +150,9 @@ export function readUpdateFileInfo(systemFile: string): Promise { versionInfo, })) - result.finally(() => zip.close()) + result.finally(() => { + zip.close() + }) return result }) diff --git a/app-shell/src/system-info/__tests__/dispatch.test.ts b/app-shell/src/system-info/__tests__/dispatch.test.ts index 4da4b838429..c6fcd11e6d9 100644 --- a/app-shell/src/system-info/__tests__/dispatch.test.ts +++ b/app-shell/src/system-info/__tests__/dispatch.test.ts @@ -5,7 +5,6 @@ import * as Fixtures from '@opentrons/app/src/redux/system-info/__fixtures__' import * as SystemInfo from '@opentrons/app/src/redux/system-info' import { uiInitialized } from '@opentrons/app/src/redux/shell/actions' import * as OS from '../../os' -import { createLogger } from '../../log' import { createUsbDeviceMonitor, getWindowsDriverVersion } from '../usb-devices' import { getActiveInterfaces, @@ -16,6 +15,7 @@ import { registerSystemInfo } from '..' import type { Dispatch } from '../../types' import type { UsbDeviceMonitor } from '../usb-devices' import type { NetworkInterfaceMonitor } from '../network-interfaces' +import type { createLogger } from '../../log' vi.mock('../../os') vi.mock('../usb-devices') diff --git a/app-shell/src/system-info/__tests__/usb-devices.test.ts b/app-shell/src/system-info/__tests__/usb-devices.test.ts index 47177333333..60a9eecea57 100644 --- a/app-shell/src/system-info/__tests__/usb-devices.test.ts +++ b/app-shell/src/system-info/__tests__/usb-devices.test.ts @@ -3,10 +3,11 @@ import { usb } from 'usb' import { vi, it, expect, describe, afterEach } from 'vitest' import * as Fixtures from '@opentrons/app/src/redux/system-info/__fixtures__' -import { createLogger } from '../../log' import { createUsbDeviceMonitor, getWindowsDriverVersion } from '../usb-devices' import { isWindows } from '../../os' +import type { createLogger } from '../../log' + vi.mock('execa') vi.mock('usb') vi.mock('electron-store') diff --git a/app-shell/src/usb.ts b/app-shell/src/usb.ts index accdf5c00d7..370051829d9 100644 --- a/app-shell/src/usb.ts +++ b/app-shell/src/usb.ts @@ -1,5 +1,5 @@ -import { ipcMain, IpcMainInvokeEvent } from 'electron' -import axios, { AxiosRequestConfig } from 'axios' +import { ipcMain } from 'electron' +import axios from 'axios' import FormData from 'form-data' import { @@ -17,6 +17,8 @@ import { USB_DEVICE_REMOVED, } from './constants' +import type { IpcMainInvokeEvent } from 'electron' +import type { AxiosRequestConfig } from 'axios' import type { IPCSafeFormData } from '@opentrons/app/src/redux/shell/types' import type { UsbDevice } from '@opentrons/app/src/redux/system-info/types' import type { PortInfo } from '@opentrons/usb-bridge/node-client' diff --git a/app/src/App/types.ts b/app/src/App/types.ts index 3b79224a535..806189ec1e8 100644 --- a/app/src/App/types.ts +++ b/app/src/App/types.ts @@ -1,4 +1,4 @@ -import * as React from 'react' +import type * as React from 'react' export interface RouteProps { /** diff --git a/app/src/atoms/Interstitial/Interstitial.tsx b/app/src/atoms/Interstitial/Interstitial.tsx index e512b8e7adb..c86968c1103 100644 --- a/app/src/atoms/Interstitial/Interstitial.tsx +++ b/app/src/atoms/Interstitial/Interstitial.tsx @@ -11,10 +11,9 @@ import { SPACING, Overlay, } from '@opentrons/components' -import { - InterstitialTitleBar, - InterstitialTitleBarProps, -} from './InterstitiallTitleBar' +import { InterstitialTitleBar } from './InterstitiallTitleBar' + +import type { InterstitialTitleBarProps } from './InterstitiallTitleBar' export interface InterstitialProps { titleBar: InterstitialTitleBarProps contentsClassName?: string diff --git a/app/src/atoms/MenuList/MenuItem.tsx b/app/src/atoms/MenuList/MenuItem.tsx index 42a4efe2cb8..b1a63aaec09 100644 --- a/app/src/atoms/MenuList/MenuItem.tsx +++ b/app/src/atoms/MenuList/MenuItem.tsx @@ -5,8 +5,8 @@ import { TYPOGRAPHY, ALIGN_CENTER, RESPONSIVENESS, - StyleProps, } from '@opentrons/components' +import type { StyleProps } from '@opentrons/components' interface ButtonProps extends StyleProps { /** optional isAlert boolean to turn the background red, only seen in ODD */ @@ -34,21 +34,23 @@ export const MenuItem = styled.button` text-align: ${TYPOGRAPHY.textAlignCenter}; font-size: ${TYPOGRAPHY.fontSize28}; background-color: ${({ isAlert }) => - isAlert ? COLORS.red50 : COLORS.transparent}; - color: ${({ isAlert }) => (isAlert ? COLORS.white : COLORS.black90)}; + isAlert != null ? COLORS.red50 : COLORS.transparent}; + color: ${({ isAlert }) => + isAlert != null ? COLORS.white : COLORS.black90}; padding: ${SPACING.spacing24}; height: 5.5rem; line-height: ${TYPOGRAPHY.lineHeight36}; &:hover, &:active { background-color: ${({ isAlert }) => - isAlert ? COLORS.red50 : COLORS.grey35}; + isAlert != null ? COLORS.red50 : COLORS.grey35}; } &:disabled { background-color: ${({ isAlert }) => - isAlert ? COLORS.red50 : COLORS.transparent}; - color: ${({ isAlert }) => (isAlert ? COLORS.white : COLORS.grey50)}; + isAlert != null ? COLORS.red50 : COLORS.transparent}; + color: ${({ isAlert }) => + isAlert != null ? COLORS.white : COLORS.grey50}; } } ` diff --git a/app/src/molecules/JogControls/types.ts b/app/src/molecules/JogControls/types.ts index f6896eaf313..9d0f906ec98 100644 --- a/app/src/molecules/JogControls/types.ts +++ b/app/src/molecules/JogControls/types.ts @@ -1,4 +1,4 @@ -import { +import type { HORIZONTAL_PLANE, VERTICAL_PLANE, NULL_STEP_SIZE_MM, diff --git a/app/src/molecules/LegacyModal/LegacyModalShell.tsx b/app/src/molecules/LegacyModal/LegacyModalShell.tsx index 9142ea14cbf..d18adc211ac 100644 --- a/app/src/molecules/LegacyModal/LegacyModalShell.tsx +++ b/app/src/molecules/LegacyModal/LegacyModalShell.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import styled from 'styled-components' import { - StyleProps, COLORS, POSITION_FIXED, POSITION_ABSOLUTE, @@ -15,6 +14,7 @@ import { styleProps, SPACING, } from '@opentrons/components' +import type { StyleProps } from '@opentrons/components' export interface LegacyModalShellProps extends StyleProps { /** Modal content */ children: React.ReactNode diff --git a/app/src/molecules/PythonLabwareOffsetSnippet/__tests__/createSnippet.test.ts b/app/src/molecules/PythonLabwareOffsetSnippet/__tests__/createSnippet.test.ts index 683caeed815..2d944a26dae 100644 --- a/app/src/molecules/PythonLabwareOffsetSnippet/__tests__/createSnippet.test.ts +++ b/app/src/molecules/PythonLabwareOffsetSnippet/__tests__/createSnippet.test.ts @@ -1,11 +1,11 @@ import { describe, it, expect } from 'vitest' import '@testing-library/jest-dom/vitest' -import { - transfer_settings, +import { transfer_settings } from '@opentrons/shared-data' +import { createSnippet } from '../createSnippet' +import type { ModuleModel, CompletedProtocolAnalysis, } from '@opentrons/shared-data' -import { createSnippet } from '../createSnippet' const protocolWithMagTempTC = ({ ...transfer_settings, diff --git a/app/src/molecules/PythonLabwareOffsetSnippet/createSnippet.ts b/app/src/molecules/PythonLabwareOffsetSnippet/createSnippet.ts index 7446158b52c..624e46ffaf6 100644 --- a/app/src/molecules/PythonLabwareOffsetSnippet/createSnippet.ts +++ b/app/src/molecules/PythonLabwareOffsetSnippet/createSnippet.ts @@ -1,8 +1,8 @@ import isEqual from 'lodash/isEqual' import { getLoadedLabwareDefinitionsByUri } from '@opentrons/shared-data' import { getLabwareDefinitionUri } from '../../organisms/Devices/ProtocolRun/utils/getLabwareDefinitionUri' -import { LabwareOffset } from '@opentrons/api-client' import { getLabwareOffsetLocation } from '../../organisms/Devices/ProtocolRun/utils/getLabwareOffsetLocation' +import type { LabwareOffset } from '@opentrons/api-client' import type { LoadedLabware, LoadedModule, diff --git a/app/src/organisms/AnalyticsSettingsModal/AnalyticsToggle.tsx b/app/src/organisms/AnalyticsSettingsModal/AnalyticsToggle.tsx index 110bfafd4b0..f577c1e3faf 100644 --- a/app/src/organisms/AnalyticsSettingsModal/AnalyticsToggle.tsx +++ b/app/src/organisms/AnalyticsSettingsModal/AnalyticsToggle.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { connect, MapStateToProps, MapDispatchToProps } from 'react-redux' +import { connect } from 'react-redux' import { LabeledToggle } from '@opentrons/components' import { @@ -7,6 +7,7 @@ import { getAnalyticsOptedIn, } from '../../redux/analytics' +import type { MapStateToProps, MapDispatchToProps } from 'react-redux' import type { State } from '../../redux/types' interface SP { diff --git a/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx b/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx index c73326031b3..b9248b6de92 100644 --- a/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx +++ b/app/src/organisms/ApplyHistoricOffsets/LabwareOffsetTable.tsx @@ -1,11 +1,11 @@ import * as React from 'react' import styled from 'styled-components' import { useTranslation } from 'react-i18next' -import { LabwareDefinition2 } from '@opentrons/shared-data' import { SPACING, TYPOGRAPHY, COLORS } from '@opentrons/components' import { OffsetVector } from '../../molecules/OffsetVector' import { formatTimestamp } from '../Devices/utils' import { getDisplayLocation } from '../LabwarePositionCheck/utils/getDisplayLocation' +import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { OffsetCandidate } from './hooks/useOffsetCandidatesForAnalysis' const OffsetTable = styled('table')` diff --git a/app/src/organisms/ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis.ts b/app/src/organisms/ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis.ts index 761c457bcef..7abc8f9fd97 100644 --- a/app/src/organisms/ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis.ts +++ b/app/src/organisms/ApplyHistoricOffsets/hooks/useOffsetCandidatesForAnalysis.ts @@ -3,12 +3,14 @@ import { getLabwareDisplayName, IDENTITY_VECTOR, getLoadedLabwareDefinitionsByUri, - CompletedProtocolAnalysis, } from '@opentrons/shared-data' import { useAllHistoricOffsets } from './useAllHistoricOffsets' import { getLabwareLocationCombos } from './getLabwareLocationCombos' -import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' +import type { + ProtocolAnalysisOutput, + CompletedProtocolAnalysis, +} from '@opentrons/shared-data' import type { LabwareOffset } from '@opentrons/api-client' export interface OffsetCandidate extends LabwareOffset { runCreatedAt: string diff --git a/app/src/organisms/CalibrateDeck/types.ts b/app/src/organisms/CalibrateDeck/types.ts index b2df75e4a6d..52467a1726d 100644 --- a/app/src/organisms/CalibrateDeck/types.ts +++ b/app/src/organisms/CalibrateDeck/types.ts @@ -1,4 +1,4 @@ -import { DispatchRequestsType } from '../../redux/robot-api' +import type { DispatchRequestsType } from '../../redux/robot-api' import type { MutableRefObject } from 'react' import type { DeckCalibrationSession } from '../../redux/sessions/types' export interface CalibrateDeckParentProps { diff --git a/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx b/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx index febbda5ded4..a4ea115fa73 100644 --- a/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx +++ b/app/src/organisms/CalibratePipetteOffset/__tests__/CalibratePipetteOffset.test.tsx @@ -1,18 +1,15 @@ import * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { when } from 'vitest-when' - -import { renderWithProviders } from '../../../__testing-utils__' +import { fireEvent, screen } from '@testing-library/react' import { getDeckDefinitions } from '@opentrons/shared-data' - +import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import * as Sessions from '../../../redux/sessions' import { mockPipetteOffsetCalibrationSessionAttributes } from '../../../redux/sessions/__fixtures__' - import { CalibratePipetteOffset } from '../index' import type { PipetteOffsetCalibrationStep } from '../../../redux/sessions/types' -import { DispatchRequestsType } from '../../../redux/robot-api' -import { fireEvent, screen } from '@testing-library/react' +import type { DispatchRequestsType } from '../../../redux/robot-api' vi.mock('@opentrons/shared-data', async importOriginal => { const actual = await importOriginal() diff --git a/app/src/organisms/CalibratePipetteOffset/types.ts b/app/src/organisms/CalibratePipetteOffset/types.ts index e26c2d8216c..39df36d6ca5 100644 --- a/app/src/organisms/CalibratePipetteOffset/types.ts +++ b/app/src/organisms/CalibratePipetteOffset/types.ts @@ -5,7 +5,7 @@ import type { } from '../../redux/sessions/types' import type { PipetteOffsetCalibrationStep } from '../../redux/sessions/pipette-offset-calibration/types' -import { DispatchRequestsType } from '../../redux/robot-api' +import type { DispatchRequestsType } from '../../redux/robot-api' export interface CalibratePipetteOffsetParentProps { robotName: string diff --git a/app/src/organisms/CalibrateTipLength/types.ts b/app/src/organisms/CalibrateTipLength/types.ts index bcb791c5f5d..829793ed8be 100644 --- a/app/src/organisms/CalibrateTipLength/types.ts +++ b/app/src/organisms/CalibrateTipLength/types.ts @@ -1,4 +1,4 @@ -import { DispatchRequestsType } from '../../redux/robot-api' +import type { DispatchRequestsType } from '../../redux/robot-api' import type { TipLengthCalibrationSession } from '../../redux/sessions/types' export interface CalibrateTipLengthParentProps { diff --git a/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx b/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx index 3a6922f86be..d52e42581b1 100644 --- a/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx +++ b/app/src/organisms/CalibrationPanels/__tests__/DeckSetup.test.tsx @@ -1,9 +1,6 @@ import * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect } from 'vitest' - -import { getDeckDefinitions } from '@opentrons/shared-data' - import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { @@ -12,9 +9,10 @@ import { mockTipLengthCalBlock, } from '../../../redux/sessions/__fixtures__' import * as Sessions from '../../../redux/sessions' - import { DeckSetup } from '../DeckSetup' +import type { getDeckDefinitions } from '@opentrons/shared-data' + vi.mock('../../../assets/labware/getLabware') vi.mock('@opentrons/shared-data', async importOriginal => { const actual = await importOriginal() diff --git a/app/src/organisms/ChangePipette/ConfirmPipette.tsx b/app/src/organisms/ChangePipette/ConfirmPipette.tsx index 2b7b75da8da..9b19fe0289d 100644 --- a/app/src/organisms/ChangePipette/ConfirmPipette.tsx +++ b/app/src/organisms/ChangePipette/ConfirmPipette.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' - +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { COLORS, SPACING, @@ -13,11 +13,10 @@ import { CheckPipettesButton } from './CheckPipettesButton' import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' import { LevelPipette } from './LevelPipette' -import { +import type { PipetteNameSpecs, PipetteModelSpecs, PipetteDisplayCategory, - OT2_ROBOT_TYPE, } from '@opentrons/shared-data' import type { PipetteOffsetCalibration } from '../../redux/calibration/types' import type { Mount } from '../../redux/pipettes/types' diff --git a/app/src/organisms/ChangePipette/__tests__/ChangePipette.test.tsx b/app/src/organisms/ChangePipette/__tests__/ChangePipette.test.tsx index 4e05137cfab..ad18c140bee 100644 --- a/app/src/organisms/ChangePipette/__tests__/ChangePipette.test.tsx +++ b/app/src/organisms/ChangePipette/__tests__/ChangePipette.test.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent } from '@testing-library/react' -import { useHistory } from 'react-router-dom' import { getPipetteNameSpecs } from '@opentrons/shared-data' @@ -22,6 +21,7 @@ import { ExitModal } from '../ExitModal' import { ConfirmPipette } from '../ConfirmPipette' import { ChangePipette } from '..' +import type { useHistory } from 'react-router-dom' import type { PipetteNameSpecs } from '@opentrons/shared-data' import type { AttachedPipette } from '../../../redux/pipettes/types' import type { DispatchApiRequestType } from '../../../redux/robot-api' diff --git a/app/src/organisms/ChangePipette/__tests__/ConfirmPipette.test.tsx b/app/src/organisms/ChangePipette/__tests__/ConfirmPipette.test.tsx index 9cc9b232db8..39b0f7fec7c 100644 --- a/app/src/organisms/ChangePipette/__tests__/ConfirmPipette.test.tsx +++ b/app/src/organisms/ChangePipette/__tests__/ConfirmPipette.test.tsx @@ -8,13 +8,13 @@ import { LEFT } from '@opentrons/shared-data' import { mockPipetteInfo } from '../../../redux/pipettes/__fixtures__' import { CheckPipettesButton } from '../CheckPipettesButton' import { ConfirmPipette } from '../ConfirmPipette' -import { LevelingVideo } from '../LevelPipette' import type { PipetteModelSpecs, PipetteNameSpecs, } from '@opentrons/shared-data' import type { PipetteOffsetCalibration } from '../../../redux/calibration/types' +import type { LevelingVideo } from '../LevelPipette' vi.mock('../CheckPipettesButton') vi.mock('../LevelPipette', async importOriginal => { diff --git a/app/src/organisms/ChangePipette/__tests__/LevelPipette.test.tsx b/app/src/organisms/ChangePipette/__tests__/LevelPipette.test.tsx index 66526673ca1..1e58d6b03b1 100644 --- a/app/src/organisms/ChangePipette/__tests__/LevelPipette.test.tsx +++ b/app/src/organisms/ChangePipette/__tests__/LevelPipette.test.tsx @@ -2,14 +2,14 @@ import * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { fireEvent } from '@testing-library/react' -import { LEFT, PipetteNameSpecs } from '@opentrons/shared-data' - +import { LEFT } from '@opentrons/shared-data' import { nestedTextMatcher, renderWithProviders, } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { LevelPipette } from '../LevelPipette' +import type { PipetteNameSpecs } from '@opentrons/shared-data' const render = (props: React.ComponentProps) => { return renderWithProviders(, { diff --git a/app/src/organisms/CheckCalibration/types.ts b/app/src/organisms/CheckCalibration/types.ts index 52113aefd17..03a70b2127c 100644 --- a/app/src/organisms/CheckCalibration/types.ts +++ b/app/src/organisms/CheckCalibration/types.ts @@ -1,5 +1,5 @@ import type { CalibrationCheckSession } from '../../redux/sessions/types' -import { DispatchRequestsType } from '../../redux/robot-api' +import type { DispatchRequestsType } from '../../redux/robot-api' export interface CalibrationCheckParentProps { robotName: string diff --git a/app/src/organisms/ChildNavigation/ChildNavigation.stories.tsx b/app/src/organisms/ChildNavigation/ChildNavigation.stories.tsx index cddbb2cd7a3..f6e87878be1 100644 --- a/app/src/organisms/ChildNavigation/ChildNavigation.stories.tsx +++ b/app/src/organisms/ChildNavigation/ChildNavigation.stories.tsx @@ -1,8 +1,8 @@ import * as React from 'react' import { VIEWPORT } from '@opentrons/components' -import { SmallButton } from '../../atoms/buttons' import { ChildNavigation } from '.' import type { Story, Meta } from '@storybook/react' +import type { SmallButton } from '../../atoms/buttons' export default { title: 'ODD/Organisms/ChildNavigation', diff --git a/app/src/organisms/ChildNavigation/__tests__/ChildNavigation.test.tsx b/app/src/organisms/ChildNavigation/__tests__/ChildNavigation.test.tsx index 8e2a1c7ec0e..b3ea0914d8f 100644 --- a/app/src/organisms/ChildNavigation/__tests__/ChildNavigation.test.tsx +++ b/app/src/organisms/ChildNavigation/__tests__/ChildNavigation.test.tsx @@ -3,8 +3,8 @@ import { fireEvent, screen } from '@testing-library/react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { renderWithProviders } from '../../../__testing-utils__' -import { SmallButton } from '../../../atoms/buttons' import { ChildNavigation } from '..' +import type { SmallButton } from '../../../atoms/buttons' const render = (props: React.ComponentProps) => renderWithProviders() diff --git a/app/src/organisms/ChooseRobotSlideout/AvailableRobotOption.tsx b/app/src/organisms/ChooseRobotSlideout/AvailableRobotOption.tsx index 148b9e30e35..190b3e5bb5a 100644 --- a/app/src/organisms/ChooseRobotSlideout/AvailableRobotOption.tsx +++ b/app/src/organisms/ChooseRobotSlideout/AvailableRobotOption.tsx @@ -22,13 +22,13 @@ import { getNetworkInterfaces, fetchStatus } from '../../redux/networking' import { appShellRequestor } from '../../redux/shell/remote' import OT2_PNG from '../../assets/images/OT2-R_HERO.png' import FLEX_PNG from '../../assets/images/FLEX.png' -import { RobotBusyStatusAction } from '.' import { useNotifyAllRunsQuery } from '../../resources/runs' import type { IconName } from '@opentrons/components' import type { Runs } from '@opentrons/api-client' import type { Robot } from '../../redux/discovery/types' import type { Dispatch, State } from '../../redux/types' +import type { RobotBusyStatusAction } from '.' interface AvailableRobotOptionProps { robot: Robot diff --git a/app/src/organisms/CommandText/LoadCommandText.tsx b/app/src/organisms/CommandText/LoadCommandText.tsx index 87eac184546..251d0f3d38d 100644 --- a/app/src/organisms/CommandText/LoadCommandText.tsx +++ b/app/src/organisms/CommandText/LoadCommandText.tsx @@ -3,7 +3,6 @@ import { getModuleDisplayName, getModuleType, getOccludedSlotCountForModule, - LoadLabwareRunTimeCommand, getPipetteNameSpecs, } from '@opentrons/shared-data' import { @@ -14,7 +13,11 @@ import { getLiquidDisplayName, } from './utils' -import type { RunTimeCommand, RobotType } from '@opentrons/shared-data' +import type { + RunTimeCommand, + RobotType, + LoadLabwareRunTimeCommand, +} from '@opentrons/shared-data' import type { CommandTextData } from './types' interface LoadCommandTextProps { diff --git a/app/src/organisms/CommandText/__tests__/CommandText.test.tsx b/app/src/organisms/CommandText/__tests__/CommandText.test.tsx index 422583bcb3b..3cb3dac0a96 100644 --- a/app/src/organisms/CommandText/__tests__/CommandText.test.tsx +++ b/app/src/organisms/CommandText/__tests__/CommandText.test.tsx @@ -5,9 +5,7 @@ import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE, GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA, - MoveToAddressableAreaForDropTipRunTimeCommand, } from '@opentrons/shared-data' - import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { CommandText } from '../' @@ -31,6 +29,7 @@ import type { MoveToWellRunTimeCommand, PrepareToAspirateRunTimeCommand, RunTimeCommand, + MoveToAddressableAreaForDropTipRunTimeCommand, } from '@opentrons/shared-data' describe('CommandText', () => { diff --git a/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts b/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts index 1af68d1a8d4..7f28d42b421 100644 --- a/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts +++ b/app/src/organisms/CommandText/utils/getLabwareDisplayLocation.ts @@ -4,12 +4,11 @@ import { getModuleDisplayName, getModuleType, getOccludedSlotCountForModule, - LabwareLocation, } from '@opentrons/shared-data' import { getModuleDisplayLocation } from './getModuleDisplayLocation' import { getModuleModel } from './getModuleModel' import { getLabwareDefinitionsFromCommands } from '../../LabwarePositionCheck/utils/labware' -import type { RobotType } from '@opentrons/shared-data' +import type { RobotType, LabwareLocation } from '@opentrons/shared-data' import type { TFunction } from 'i18next' import type { CommandTextData } from '../types' diff --git a/app/src/organisms/CommandText/utils/getWellRange.ts b/app/src/organisms/CommandText/utils/getWellRange.ts index 7676aef6969..a0700357413 100644 --- a/app/src/organisms/CommandText/utils/getWellRange.ts +++ b/app/src/organisms/CommandText/utils/getWellRange.ts @@ -1,8 +1,5 @@ -import { - getPipetteNameSpecs, - PipetteName, - RunTimeCommand, -} from '@opentrons/shared-data' +import { getPipetteNameSpecs } from '@opentrons/shared-data' +import type { PipetteName, RunTimeCommand } from '@opentrons/shared-data' /** * @param pipetteName name of pipette being used diff --git a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx index 33b112e1043..0461f81496b 100644 --- a/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx +++ b/app/src/organisms/DeviceDetailsDeckConfiguration/__tests__/DeckConfigurationDiscardChangesModal.test.tsx @@ -1,11 +1,11 @@ import * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, beforeEach, vi, expect } from 'vitest' -import { useHistory } from 'react-router-dom' import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { DeckConfigurationDiscardChangesModal } from '../DeckConfigurationDiscardChangesModal' +import type { useHistory } from 'react-router-dom' const mockFunc = vi.fn() const mockGoBack = vi.fn() diff --git a/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx b/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx index 8c21af89c5d..027a5cd1529 100644 --- a/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx +++ b/app/src/organisms/Devices/PipetteCard/PipetteOverflowMenu.tsx @@ -10,13 +10,13 @@ import { SPACING, DIRECTION_COLUMN, } from '@opentrons/components' -import { PipetteModelSpecs } from '@opentrons/shared-data' import { MenuItem } from '../../../atoms/MenuList/MenuItem' import { Divider } from '../../../atoms/structure' -import type { Mount } from '../../../redux/pipettes/types' +import type { PipetteModelSpecs } from '@opentrons/shared-data' import type { PipetteSettingsFieldsMap } from '@opentrons/api-client' +import type { Mount } from '../../../redux/pipettes/types' interface PipetteOverflowMenuProps { pipetteSpecs: PipetteModelSpecs | null diff --git a/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx b/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx index 0872255474b..e8681b99812 100644 --- a/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx +++ b/app/src/organisms/Devices/PipetteCard/PipetteSettingsSlideout.tsx @@ -1,14 +1,14 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { Flex } from '@opentrons/components' -import { PipetteModelSpecs } from '@opentrons/shared-data' import { useUpdatePipetteSettingsMutation } from '@opentrons/react-api-client' import { Slideout } from '../../../atoms/Slideout' import { ConfigFormSubmitButton } from '../../ConfigurePipette/ConfigFormSubmitButton' import { ConfigurePipette } from '../../ConfigurePipette' -import type { AttachedPipette } from '../../../redux/pipettes/types' +import type { PipetteModelSpecs } from '@opentrons/shared-data' import type { PipetteSettingsFieldsMap } from '@opentrons/api-client' +import type { AttachedPipette } from '../../../redux/pipettes/types' interface PipetteSettingsSlideoutProps { robotName: string diff --git a/app/src/organisms/Devices/ProtocolRun/RunTimer.tsx b/app/src/organisms/Devices/ProtocolRun/RunTimer.tsx index 42076cbf964..337431c7f0c 100644 --- a/app/src/organisms/Devices/ProtocolRun/RunTimer.tsx +++ b/app/src/organisms/Devices/ProtocolRun/RunTimer.tsx @@ -1,11 +1,11 @@ import * as React from 'react' -import { CSSProp } from 'styled-components' import { RUN_STATUS_STOP_REQUESTED } from '@opentrons/api-client' import { useInterval, TYPOGRAPHY, StyledText } from '@opentrons/components' import { formatInterval } from '../../../organisms/RunTimeControl/utils' import { EMPTY_TIMESTAMP } from '../constants' +import type { CSSProp } from 'styled-components' export function RunTimer({ runStatus, diff --git a/app/src/organisms/Devices/ProtocolRun/SetupGripperCalibrationItem.tsx b/app/src/organisms/Devices/ProtocolRun/SetupGripperCalibrationItem.tsx index 255a69f467c..f9eaec4b86e 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupGripperCalibrationItem.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupGripperCalibrationItem.tsx @@ -8,14 +8,15 @@ import { JUSTIFY_FLEX_END, WRAP, } from '@opentrons/components' -import { GripperModel, getGripperDisplayName } from '@opentrons/shared-data' +import { getGripperDisplayName } from '@opentrons/shared-data' import { TertiaryButton } from '../../../atoms/buttons' import { SetupCalibrationItem } from './SetupCalibrationItem' import { GripperWizardFlows } from '../../GripperWizardFlows' +import { GRIPPER_FLOW_TYPES } from '../../GripperWizardFlows/constants' import type { GripperData } from '@opentrons/api-client' +import type { GripperModel } from '@opentrons/shared-data' import type { GripperWizardFlowType } from '../../GripperWizardFlows/types' -import { GRIPPER_FLOW_TYPES } from '../../GripperWizardFlows/constants' interface SetupGripperCalibrationItemProps { gripperData: GripperData | null diff --git a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidDetailCard.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidDetailCard.test.tsx index 648d80f8806..48d22bb3776 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidDetailCard.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupLiquids/__tests__/LiquidDetailCard.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { fireEvent, screen } from '@testing-library/react' -import { describe, it, beforeEach, vi, expect, Mock } from 'vitest' +import { describe, it, beforeEach, vi, expect } from 'vitest' import { SPACING, COLORS } from '@opentrons/components' @@ -15,6 +15,7 @@ import { } from '../../../../../redux/analytics' import { getIsOnDevice } from '../../../../../redux/config' import { LiquidDetailCard } from '../LiquidDetailCard' +import type { Mock } from 'vitest' vi.mock('../../../../../redux/analytics') vi.mock('../../../../../redux/config') diff --git a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/LocationConflictModal.test.tsx b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/LocationConflictModal.test.tsx index 5314acbb283..10ef3c36d98 100644 --- a/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/LocationConflictModal.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/LocationConflictModal.test.tsx @@ -1,5 +1,4 @@ import * as React from 'react' -import { UseQueryResult } from 'react-query' import { MemoryRouter } from 'react-router-dom' import { screen, fireEvent } from '@testing-library/react' import '@testing-library/jest-dom/vitest' @@ -22,6 +21,7 @@ import { useCloseCurrentRun } from '../../../../ProtocolUpload/hooks' import { LocationConflictModal } from '../LocationConflictModal' import { useNotifyDeckConfigurationQuery } from '../../../../../resources/deck_configuration' +import type { UseQueryResult } from 'react-query' import type { DeckConfiguration } from '@opentrons/shared-data' vi.mock('@opentrons/react-api-client') diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx index c56281c127b..8ff94806bdd 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/LabwareInfoOverlay.test.tsx @@ -1,15 +1,10 @@ import * as React from 'react' import { when } from 'vitest-when' import { describe, it, beforeEach, vi, afterEach, expect } from 'vitest' - import { getLabwareDisplayName, - LabwareDefinition2, - ProtocolFile, - LoadedLabware, fixtureTiprack300ul, } from '@opentrons/shared-data' - import { nestedTextMatcher, renderWithProviders, @@ -20,6 +15,11 @@ import { getLabwareLocation } from '../utils/getLabwareLocation' import { LabwareInfoOverlay } from '../LabwareInfoOverlay' import { getLabwareDefinitionUri } from '../utils/getLabwareDefinitionUri' import { useLabwareOffsetForLabware } from '../useLabwareOffsetForLabware' +import type { + LabwareDefinition2, + ProtocolFile, + LoadedLabware, +} from '@opentrons/shared-data' vi.mock('../../../ProtocolUpload/hooks') vi.mock('../utils/getLabwareLocation') diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx index fdcf49dbebb..5de2516791b 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunModuleControls.test.tsx @@ -5,7 +5,6 @@ import { screen } from '@testing-library/react' import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' -import { ModuleModel, ModuleType } from '@opentrons/shared-data' import { useInstrumentsQuery } from '@opentrons/react-api-client' import { ProtocolRunModuleControls } from '../ProtocolRunModuleControls' import { ModuleCard } from '../../../ModuleCard' @@ -16,6 +15,7 @@ import { mockThermocycler, mockHeaterShaker, } from '../../../../redux/modules/__fixtures__' +import type { ModuleModel, ModuleType } from '@opentrons/shared-data' vi.mock('@opentrons/react-api-client') vi.mock('../../../ModuleCard') diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx index e2398fb084c..268afc7f151 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunRuntimeParameters.test.tsx @@ -1,10 +1,7 @@ import * as React from 'react' -import { UseQueryResult } from 'react-query' import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' import { screen } from '@testing-library/react' import { when } from 'vitest-when' - -import { Run } from '@opentrons/api-client' import { InfoScreen } from '@opentrons/components' import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../i18n' @@ -12,9 +9,9 @@ import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/us import { useRunStatus } from '../../../RunTimeControl/hooks' import { useNotifyRunQuery } from '../../../../resources/runs' import { mockSucceededRun } from '../../../RunTimeControl/__fixtures__' - import { ProtocolRunRuntimeParameters } from '../ProtocolRunRunTimeParameters' - +import type { UseQueryResult } from 'react-query' +import type { Run } from '@opentrons/api-client' import type { CompletedProtocolAnalysis, RunTimeParameter, diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx index 65dfccbf6a4..13442cb63c5 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/SetupFlexPipetteCalibrationItem.test.tsx @@ -11,7 +11,7 @@ import { useMostRecentCompletedAnalysis } from '../../../LabwarePositionCheck/us import { PipetteWizardFlows } from '../../../PipetteWizardFlows' import { SetupFlexPipetteCalibrationItem } from '../SetupFlexPipetteCalibrationItem' import _uncastedModifiedSimpleV6Protocol from '../../hooks/__fixtures__/modifiedSimpleV6.json' -import { CompletedProtocolAnalysis } from '@opentrons/shared-data' +import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' vi.mock('@opentrons/react-api-client') vi.mock('../../../PipetteWizardFlows') diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx index b4b59c212f2..4b81bacb8cf 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLabwareOffsetLocation.test.tsx @@ -2,7 +2,6 @@ import { when } from 'vitest-when' import { describe, it, beforeEach, vi, expect, afterEach } from 'vitest' import { - CompletedProtocolAnalysis, getLabwareDefURI, multiple_tipacks_with_tc, opentrons96PcrAdapterV1, @@ -14,6 +13,7 @@ import type { LoadedLabware, LoadedModule, LabwareDefinition2, + CompletedProtocolAnalysis, } from '@opentrons/shared-data' vi.mock('../getLabwareLocation') diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLocationInfoNames.test.ts b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLocationInfoNames.test.ts index 8ff543ffcf4..5f6a14090f0 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLocationInfoNames.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getLocationInfoNames.test.ts @@ -1,6 +1,7 @@ import { describe, it, vi, expect, beforeEach } from 'vitest' -import { getLabwareDisplayName, ModuleModel } from '@opentrons/shared-data' +import { getLabwareDisplayName } from '@opentrons/shared-data' import { getLocationInfoNames } from '../getLocationInfoNames' +import type { ModuleModel } from '@opentrons/shared-data' const ADAPTER_DISPLAY_NAME = 'Opentrons 96 Flat Bottom Adapter' const LABWARE_DISPLAY_NAME = 'Corning 24 Well Plate 3.4 mL Flat' diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts index 25225a56ea2..c30e012cc7e 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getModuleInitialLoadInfo.test.ts @@ -1,10 +1,10 @@ import { describe, it, expect } from 'vitest' -import { - transfer_settings, +import { transfer_settings } from '@opentrons/shared-data' +import { getModuleInitialLoadInfo } from '../getModuleInitialLoadInfo' +import type { + LoadModuleRunTimeCommand, CompletedProtocolAnalysis, } from '@opentrons/shared-data' -import { getModuleInitialLoadInfo } from '../getModuleInitialLoadInfo' -import type { LoadModuleRunTimeCommand } from '@opentrons/shared-data' const protocolWithMagTempTC = (transfer_settings as unknown) as CompletedProtocolAnalysis diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts index 93528250b0d..fcacd157034 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getProtocolModulesInfo.test.ts @@ -4,11 +4,13 @@ import { multiple_temp_modules, ot2DeckDefV5, getModuleDef2, +} from '@opentrons/shared-data' +import { getProtocolModulesInfo } from '../getProtocolModulesInfo' +import type { ProtocolAnalysisOutput, LoadedLabware, LoadedModule, } from '@opentrons/shared-data' -import { getProtocolModulesInfo } from '../getProtocolModulesInfo' const protocolWithMagTempTC = ({ ...transfer_settings, diff --git a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getSlotLabwareDefinition.test.ts b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getSlotLabwareDefinition.test.ts index 973f50f5d61..5ee37cced9c 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getSlotLabwareDefinition.test.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/__tests__/getSlotLabwareDefinition.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest' -import { RunTimeCommand } from '@opentrons/shared-data' import { mockDefinition } from '../../../../../redux/custom-labware/__fixtures__' import { getSlotLabwareDefinition } from '../getSlotLabwareDefinition' +import type { RunTimeCommand } from '@opentrons/shared-data' const LABWARE_ID = '60e8b050-3412-11eb-ad93-ed232a2337cf:opentrons/corning_24_wellplate_3.4ml_flat/1' diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts b/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts index 594d5d37f97..c01d46259f5 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getLocationInfoNames.ts @@ -1,5 +1,5 @@ -import { - getLabwareDisplayName, +import { getLabwareDisplayName } from '@opentrons/shared-data' +import type { LoadLabwareRunTimeCommand, RunTimeCommand, LoadModuleRunTimeCommand, diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getModuleName.ts b/app/src/organisms/Devices/ProtocolRun/utils/getModuleName.ts index 249c90c1749..7703a1da9c4 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getModuleName.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getModuleName.ts @@ -1,4 +1,4 @@ -import { ModuleTypesThatRequireExtraAttention } from './getModuleTypesThatRequireExtraAttention' +import type { ModuleTypesThatRequireExtraAttention } from './getModuleTypesThatRequireExtraAttention' export const getModuleName = ( type: ModuleTypesThatRequireExtraAttention diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getModuleTypesThatRequireExtraAttention.ts b/app/src/organisms/Devices/ProtocolRun/utils/getModuleTypesThatRequireExtraAttention.ts index b3f50c09514..4efd3db210c 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getModuleTypesThatRequireExtraAttention.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getModuleTypesThatRequireExtraAttention.ts @@ -1,4 +1,5 @@ -import { getModuleType, ModuleModel, ModuleType } from '@opentrons/shared-data' +import { getModuleType } from '@opentrons/shared-data' +import type { ModuleModel, ModuleType } from '@opentrons/shared-data' const MODULE_TYPES_THAT_REQUIRE_EXTRA_ATTENTION = [ 'magneticModuleType', diff --git a/app/src/organisms/Devices/ProtocolRun/utils/getSlotLabwareDefinition.ts b/app/src/organisms/Devices/ProtocolRun/utils/getSlotLabwareDefinition.ts index 2b2dec3019d..c52258c982f 100644 --- a/app/src/organisms/Devices/ProtocolRun/utils/getSlotLabwareDefinition.ts +++ b/app/src/organisms/Devices/ProtocolRun/utils/getSlotLabwareDefinition.ts @@ -1,4 +1,4 @@ -import { LabwareDefinition2, RunTimeCommand } from '@opentrons/shared-data' +import type { LabwareDefinition2, RunTimeCommand } from '@opentrons/shared-data' export function getSlotLabwareDefinition( labwareId: string, diff --git a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/types.ts b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/types.ts index 1f70fd48800..a864b81c8eb 100644 --- a/app/src/organisms/Devices/RobotSettings/ConnectNetwork/types.ts +++ b/app/src/organisms/Devices/RobotSettings/ConnectNetwork/types.ts @@ -5,7 +5,7 @@ import type { WifiKey, } from '../../../../redux/networking/types' -import { +import type { CONNECT, DISCONNECT, JOIN_OTHER, diff --git a/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx b/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx index b373fb0565a..825c9c32cde 100644 --- a/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx +++ b/app/src/organisms/Devices/RobotSettings/__tests__/RobotSettingsAdvanced.test.tsx @@ -26,7 +26,7 @@ import { } from '../AdvancedTab' import { RobotSettingsAdvanced } from '../RobotSettingsAdvanced' -import { ShellUpdateState } from '../../../../redux/shell/types' +import type { ShellUpdateState } from '../../../../redux/shell/types' import type * as ShellUpdate from '../../../../redux/shell/update' vi.mock('../../../../redux/robot-settings/selectors') diff --git a/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx b/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx index 3fb5e98d2f6..c1d494690e8 100644 --- a/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx +++ b/app/src/organisms/Devices/__tests__/ModuleInfo.test.tsx @@ -4,10 +4,10 @@ import { describe, it, vi, beforeEach, expect } from 'vitest' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '../../../__testing-utils__' import { when } from 'vitest-when' -import { ModuleModel, ModuleType } from '@opentrons/shared-data' import { i18n } from '../../../i18n' import { ModuleInfo } from '../ModuleInfo' import { useRunHasStarted } from '../hooks' +import type { ModuleModel, ModuleType } from '@opentrons/shared-data' vi.mock('../hooks') diff --git a/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx b/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx index aa4693135ed..92557e96570 100644 --- a/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx +++ b/app/src/organisms/Devices/__tests__/RecentProtocolRuns.test.tsx @@ -1,5 +1,4 @@ import * as React from 'react' -import { UseQueryResult } from 'react-query' import { screen } from '@testing-library/react' import { describe, it, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -10,6 +9,7 @@ import { useIsRobotViewable, useRunStatuses } from '../hooks' import { RecentProtocolRuns } from '../RecentProtocolRuns' import { HistoricalProtocolRun } from '../HistoricalProtocolRun' +import type { UseQueryResult } from 'react-query' import type { Runs } from '@opentrons/api-client' import type { AxiosError } from 'axios' diff --git a/app/src/organisms/Devices/constants.ts b/app/src/organisms/Devices/constants.ts index a3913e104e2..f6c8eece866 100644 --- a/app/src/organisms/Devices/constants.ts +++ b/app/src/organisms/Devices/constants.ts @@ -1,8 +1,5 @@ -import { - getPipetteNameSpecs, - LabwareDefinition2, - PipetteName, -} from '@opentrons/shared-data' +import { getPipetteNameSpecs } from '@opentrons/shared-data' +import type { LabwareDefinition2, PipetteName } from '@opentrons/shared-data' import { getLatestLabwareDef } from '../../assets/labware/getLabware' export const RUN_LOG_WINDOW_SIZE = 60 // number of command items rendered at a time diff --git a/app/src/organisms/Devices/getModulePrepCommands.ts b/app/src/organisms/Devices/getModulePrepCommands.ts index dcb320417b2..cb55081533e 100644 --- a/app/src/organisms/Devices/getModulePrepCommands.ts +++ b/app/src/organisms/Devices/getModulePrepCommands.ts @@ -3,7 +3,6 @@ import { HEATERSHAKER_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, } from '@opentrons/shared-data' -import { AttachedModule } from '../../redux/modules/types' import type { HeaterShakerDeactivateHeaterCreateCommand, HeaterShakerDeactivateShakerCreateCommand, @@ -15,6 +14,7 @@ import type { HeaterShakerCloseLatchCreateCommand, TCCloseLidCreateCommand, } from '@opentrons/shared-data' +import type { AttachedModule } from '../../redux/modules/types' export type ModulePrepCommandsType = | TemperatureModuleDeactivateCreateCommand diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx index 222de6739eb..49fba0eeaa0 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedModules.test.tsx @@ -1,10 +1,10 @@ import { vi, it, expect, describe } from 'vitest' -import { UseQueryResult } from 'react-query' import { renderHook } from '@testing-library/react' import { mockModulesResponse } from '@opentrons/api-client' import { useModulesQuery } from '@opentrons/react-api-client' import { useAttachedModules } from '..' +import type { UseQueryResult } from 'react-query' import type { Modules } from '@opentrons/api-client' vi.mock('@opentrons/react-api-client') diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx index 4681855f02f..45c1ff6487f 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipetteCalibrations.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { when } from 'vitest-when' import { vi, it, expect, describe, beforeEach } from 'vitest' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { @@ -21,6 +21,7 @@ import { } from '../../../../redux/calibration/tip-length/__fixtures__' import { useAttachedPipetteCalibrations } from '..' +import type { Store } from 'redux' import type { State } from '../../../../redux/types' vi.mock('@opentrons/react-api-client') diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx index 1617e15b661..35dbd023839 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettes.test.tsx @@ -1,7 +1,5 @@ -import * as React from 'react' import { vi, it, expect, describe, beforeEach } from 'vitest' import { when } from 'vitest-when' -import { UseQueryResult } from 'react-query' import { renderHook } from '@testing-library/react' import { usePipettesQuery } from '@opentrons/react-api-client' import { getPipetteModelSpecs } from '@opentrons/shared-data' @@ -10,6 +8,8 @@ import { pipetteResponseFixtureLeft, pipetteResponseFixtureRight, } from '@opentrons/api-client' +import type * as React from 'react' +import type { UseQueryResult } from 'react-query' import type { FetchPipettesResponseBody } from '@opentrons/api-client' import type { PipetteModelSpecs } from '@opentrons/shared-data' diff --git a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts index fbb72456a56..535a394fbe9 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts +++ b/app/src/organisms/Devices/hooks/__tests__/useAttachedPipettesFromInstrumentsQuery.test.ts @@ -1,4 +1,3 @@ -import * as React from 'react' import { vi, it, expect, describe, beforeEach } from 'vitest' import { renderHook } from '@testing-library/react' import { useInstrumentsQuery } from '@opentrons/react-api-client' @@ -8,6 +7,7 @@ import { } from '@opentrons/api-client' import { useIsOEMMode } from '../../../../resources/robot-settings/hooks' import { useAttachedPipettesFromInstrumentsQuery } from '..' +import type * as React from 'react' vi.mock('@opentrons/react-api-client') vi.mock('../../../../resources/robot-settings/hooks') diff --git a/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx index 25d8dc74ca5..d409b0ba3cd 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useDeckCalibrationStatus.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useCalibrationStatusQuery } from '@opentrons/react-api-client' @@ -12,6 +12,7 @@ import { getDiscoverableRobotByName } from '../../../../redux/discovery' import { useDeckCalibrationStatus } from '..' import { mockConnectableRobot } from '../../../../redux/discovery/__fixtures__' +import type { Store } from 'redux' vi.mock('@opentrons/react-api-client') vi.mock('../../../../redux/calibration') diff --git a/app/src/organisms/Devices/hooks/__tests__/useIsFlex.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useIsFlex.test.tsx index 629f58b7dea..9461cae9c22 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useIsFlex.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useIsFlex.test.tsx @@ -2,13 +2,14 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { getRobotModelByName } from '../../../../redux/discovery' import { useIsFlex } from '..' +import type { Store } from 'redux' vi.mock('../../../../redux/discovery/selectors') diff --git a/app/src/organisms/Devices/hooks/__tests__/useIsLegacySessionInProgress.test.ts b/app/src/organisms/Devices/hooks/__tests__/useIsLegacySessionInProgress.test.ts index 115c213dff4..038773d9d84 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useIsLegacySessionInProgress.test.ts +++ b/app/src/organisms/Devices/hooks/__tests__/useIsLegacySessionInProgress.test.ts @@ -1,8 +1,8 @@ -import { UseQueryResult } from 'react-query' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { useAllSessionsQuery } from '@opentrons/react-api-client' import { useIsLegacySessionInProgress } from '../useIsLegacySessionInProgress' +import type { UseQueryResult } from 'react-query' import type { Sessions } from '@opentrons/api-client' vi.mock('@opentrons/react-api-client') diff --git a/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts b/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts index 457c0a75287..1a763143e3a 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts +++ b/app/src/organisms/Devices/hooks/__tests__/useIsRobotBusy.test.ts @@ -1,5 +1,3 @@ -import { UseQueryResult } from 'react-query' - import { useAllSessionsQuery, useCurrentAllSubsystemUpdatesQuery, @@ -17,6 +15,7 @@ import { useIsFlex } from '../useIsFlex' import { useNotifyCurrentMaintenanceRun } from '../../../../resources/maintenance_runs' import { useNotifyAllRunsQuery } from '../../../../resources/runs' +import type { UseQueryResult } from 'react-query' import type { Sessions, Runs } from '@opentrons/api-client' import type { AxiosError } from 'axios' diff --git a/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx index 96ed5c3f92b..4ed49e831e2 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useIsRobotViewable.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' @@ -12,8 +12,8 @@ import { mockReachableRobot, mockUnreachableRobot, } from '../../../../redux/discovery/__fixtures__' - import { useIsRobotViewable } from '..' +import type { Store } from 'redux' vi.mock('../../../../redux/discovery') diff --git a/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx index 88b6b3c423e..5f45fbecb23 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useLights.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { @@ -11,6 +11,7 @@ import { import { useLights } from '..' +import type { Store } from 'redux' import type { Mock } from 'vitest' vi.mock('@opentrons/react-api-client') diff --git a/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx b/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx index 6cdf77cdb19..655b06532b8 100644 --- a/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/usePipetteOffsetCalibration.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' @@ -15,9 +15,10 @@ import { useDispatchApiRequest } from '../../../../redux/robot-api' import { useRobot } from '../useRobot' import { usePipetteOffsetCalibration } from '..' +import type { Store } from 'redux' import type { DiscoveredRobot } from '../../../../redux/discovery/types' import type { DispatchApiRequestType } from '../../../../redux/robot-api' -import { AttachedPipette, Mount } from '../../../../redux/pipettes/types' +import type { AttachedPipette, Mount } from '../../../../redux/pipettes/types' vi.mock('../../../../redux/calibration') vi.mock('../../../../redux/robot-api') diff --git a/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx index a327e420b05..20e90f86f75 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useProtocolAnalysisErrors.test.tsx @@ -1,6 +1,5 @@ import { vi, it, expect, describe, beforeEach } from 'vitest' import { when } from 'vitest-when' -import { UseQueryResult } from 'react-query' import { renderHook } from '@testing-library/react' import { @@ -13,6 +12,7 @@ import { useNotifyRunQuery } from '../../../../resources/runs' import { RUN_ID_2 } from '../../../RunTimeControl/__fixtures__' +import type { UseQueryResult } from 'react-query' import type { Run, Protocol } from '@opentrons/api-client' import type { CompletedProtocolAnalysis, diff --git a/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx index 7c0ad0363a9..45c2546efd0 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useProtocolDetailsForRun.test.tsx @@ -1,23 +1,18 @@ import { vi, it, expect, describe, beforeEach } from 'vitest' import { when } from 'vitest-when' -import { UseQueryResult } from 'react-query' import { renderHook } from '@testing-library/react' - +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { useProtocolAnalysisAsDocumentQuery, useProtocolQuery, } from '@opentrons/react-api-client' - import { useProtocolDetailsForRun } from '..' import { useNotifyRunQuery } from '../../../../resources/runs' - import { RUN_ID_2 } from '../../../RunTimeControl/__fixtures__' import type { Protocol, Run } from '@opentrons/api-client' -import { - CompletedProtocolAnalysis, - OT2_ROBOT_TYPE, -} from '@opentrons/shared-data' +import type { UseQueryResult } from 'react-query' +import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' vi.mock('@opentrons/react-api-client') vi.mock('../../../../resources/runs') diff --git a/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx index f256fb126b7..04305b8ed31 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useProtocolRunAnalyticsData.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { renderHook, waitFor } from '@testing-library/react' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' @@ -14,6 +14,7 @@ import { useProtocolMetadata } from '../useProtocolMetadata' import { useRunTimestamps } from '../../../RunTimeControl/hooks' import { formatInterval } from '../../../RunTimeControl/utils' import { mockConnectableRobot } from '../../../../redux/discovery/__fixtures__' +import type { Store } from 'redux' vi.mock('../../../../redux/analytics/hash') vi.mock('../../../../redux/protocol-storage') diff --git a/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx index 1b42a08befd..29463fe55bc 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRobotAnalyticsData.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { renderHook } from '@testing-library/react' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' @@ -18,6 +18,7 @@ import { getRobotSerialNumber, } from '../../../../redux/discovery' +import type { Store } from 'redux' import type { DiscoveredRobot } from '../../../../redux/discovery/types' import type { AttachedPipettesByMount } from '../../../../redux/pipettes/types' diff --git a/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx index b410220425d..1235869ca0b 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRunPipetteInfoByMount.test.tsx @@ -5,7 +5,6 @@ import { when } from 'vitest-when' import { getPipetteNameSpecs, getLoadedLabwareDefinitionsByUri, - RunTimeCommand, opentrons96Tiprack10UlV1Uncasted as _tiprack10ul, } from '@opentrons/shared-data' import { useAllTipLengthCalibrationsQuery } from '@opentrons/react-api-client' @@ -140,7 +139,7 @@ describe('useRunPipetteInfoByMount hook', () => { } as SharedData.PipetteNameSpecs) when(vi.mocked(getLoadedLabwareDefinitionsByUri)) .calledWith( - _uncastedModifiedSimpleV6Protocol.commands as RunTimeCommand[] + _uncastedModifiedSimpleV6Protocol.commands as SharedData.RunTimeCommand[] ) .thenReturn(_uncastedModifiedSimpleV6Protocol.labwareDefinitions as {}) }) diff --git a/app/src/organisms/Devices/hooks/__tests__/useRunStartedOrLegacySessionInProgress.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useRunStartedOrLegacySessionInProgress.test.tsx index 96acc785f07..2354c31c6a8 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useRunStartedOrLegacySessionInProgress.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useRunStartedOrLegacySessionInProgress.test.tsx @@ -1,4 +1,3 @@ -import { UseQueryResult } from 'react-query' import { useAllSessionsQuery } from '@opentrons/react-api-client' import { RUN_STATUS_IDLE, RUN_STATUS_RUNNING } from '@opentrons/api-client' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' @@ -7,6 +6,7 @@ import { useCurrentRunId } from '../../../ProtocolUpload/hooks' import { useRunStatus } from '../../../RunTimeControl/hooks' import { useRunStartedOrLegacySessionInProgress } from '..' +import type { UseQueryResult } from 'react-query' import type { Sessions } from '@opentrons/api-client' vi.mock('@opentrons/react-api-client') diff --git a/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx index 427535824ee..37db5d9e752 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useSyncRobotClock.test.tsx @@ -1,12 +1,13 @@ import * as React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { syncSystemTime } from '../../../../redux/robot-admin' import { useSyncRobotClock } from '..' +import type { Store } from 'redux' vi.mock('../../../../redux/discovery') diff --git a/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx index b7e53546cfb..0be697813a8 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useTrackCreateProtocolRunEvent.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' @@ -13,6 +13,7 @@ import { useTrackEvent } from '../../../../redux/analytics' import { storedProtocolData } from '../../../../redux/protocol-storage/__fixtures__' import type { Mock } from 'vitest' +import type { Store } from 'redux' import type { ProtocolAnalyticsData } from '../../../../redux/analytics/types' vi.mock('../../hooks') diff --git a/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx b/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx index 4642cf31557..99ff16d05f7 100644 --- a/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx +++ b/app/src/organisms/Devices/hooks/__tests__/useTrackProtocolRunEvent.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { Provider } from 'react-redux' import { QueryClient, QueryClientProvider } from 'react-query' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' @@ -15,6 +15,7 @@ import { import { mockConnectableRobot } from '../../../../redux/discovery/__fixtures__' import { useRobot } from '../useRobot' +import type { Store } from 'redux' import type { Mock } from 'vitest' vi.mock('../useRobot') diff --git a/app/src/organisms/Devices/hooks/useCalibrationTaskList.ts b/app/src/organisms/Devices/hooks/useCalibrationTaskList.ts index d96bbf262b7..a391b97cd40 100644 --- a/app/src/organisms/Devices/hooks/useCalibrationTaskList.ts +++ b/app/src/organisms/Devices/hooks/useCalibrationTaskList.ts @@ -5,12 +5,14 @@ import { useCalibrationStatusQuery, useDeleteCalibrationMutation, } from '@opentrons/react-api-client' +import { getLabwareDefURI } from '@opentrons/shared-data' import { useAttachedPipettes } from '.' import { getDefaultTiprackDefForPipetteName } from '../constants' import { DECK_CAL_STATUS_OK } from '../../../redux/calibration/constants' import { formatTimestamp } from '../utils' +import type { PipetteName } from '@opentrons/shared-data' import type { SubTaskProps, TaskListProps, @@ -20,7 +22,6 @@ import type { AttachedPipette } from '../../../redux/pipettes/types' import type { DashboardCalOffsetInvoker } from '../../../pages/Devices/CalibrationDashboard/hooks/useDashboardCalibratePipOffset' import type { DashboardCalTipLengthInvoker } from '../../../pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateTipLength' import type { DashboardCalDeckInvoker } from '../../../pages/Devices/CalibrationDashboard/hooks/useDashboardCalibrateDeck' -import { getLabwareDefURI, PipetteName } from '@opentrons/shared-data' const CALIBRATION_DATA_POLL_MS = 5000 diff --git a/app/src/organisms/Devices/hooks/useDownloadRunLog.ts b/app/src/organisms/Devices/hooks/useDownloadRunLog.ts index ac825faa9b5..76d76f04dce 100644 --- a/app/src/organisms/Devices/hooks/useDownloadRunLog.ts +++ b/app/src/organisms/Devices/hooks/useDownloadRunLog.ts @@ -1,18 +1,12 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' - -import { - HostConfig, - getRun, - getCommands, - getProtocol, -} from '@opentrons/api-client' -import { IconProps } from '@opentrons/components' +import { getRun, getCommands, getProtocol } from '@opentrons/api-client' import { useHost } from '@opentrons/react-api-client' - import { ERROR_TOAST, INFO_TOAST } from '../../../atoms/Toast' import { useToaster } from '../../../organisms/ToasterOven' import { downloadFile } from '../utils' +import type { IconProps } from '@opentrons/components' +import type { HostConfig } from '@opentrons/api-client' export function useDownloadRunLog( robotName: string, diff --git a/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts b/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts index e8bddaaeadb..941a5b261b4 100644 --- a/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts +++ b/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts @@ -1,8 +1,8 @@ import omitBy from 'lodash/omitBy' import { MAGNETIC_BLOCK_TYPE } from '@opentrons/shared-data' import { useModuleRenderInfoForProtocolById } from './useModuleRenderInfoForProtocolById' -import { ProtocolCalibrationStatus } from './useRunCalibrationStatus' import { useIsFlex } from './useIsFlex' +import type { ProtocolCalibrationStatus } from './useRunCalibrationStatus' export function useModuleCalibrationStatus( robotName: string, diff --git a/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts b/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts index 1c86de6ecf5..ad4633b3134 100644 --- a/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts +++ b/app/src/organisms/Devices/hooks/useProtocolAnalysisErrors.ts @@ -6,7 +6,7 @@ import { import { useNotifyRunQuery } from '../../../resources/runs' -import { AnalysisError } from '@opentrons/shared-data' +import type { AnalysisError } from '@opentrons/shared-data' export interface ProtocolAnalysisErrors { analysisErrors: AnalysisError[] | null diff --git a/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts b/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts index 538c10c6855..31e4df921b6 100644 --- a/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts +++ b/app/src/organisms/Devices/hooks/useProtocolRunAnalyticsData.ts @@ -9,11 +9,11 @@ import { useRunTimestamps } from '../../RunTimeControl/hooks' import { formatInterval } from '../../RunTimeControl/utils' import { EMPTY_TIMESTAMP } from '../constants' +import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' import type { ProtocolAnalyticsData } from '../../../redux/analytics/types' import type { StoredProtocolData } from '../../../redux/protocol-storage/types' -import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' import type { State } from '../../../redux/types' -import { DiscoveredRobot } from '../../../redux/discovery/types' +import type { DiscoveredRobot } from '../../../redux/discovery/types' export const parseProtocolRunAnalyticsData = ( protocolAnalysis: ProtocolAnalysisOutput | null, diff --git a/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts b/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts index 27f16c107fe..8bed099c5df 100644 --- a/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts +++ b/app/src/organisms/Devices/hooks/useRunCalibrationStatus.ts @@ -5,16 +5,20 @@ import { useRunPipetteInfoByMount, useStoredProtocolAnalysis, } from '.' -import { DeckCalibrationStatus } from '../../../redux/calibration/api-types' import { useMostRecentCompletedAnalysis } from '../../LabwarePositionCheck/useMostRecentCompletedAnalysis' -import { +import { isGripperInCommands } from '../../../resources/protocols/utils' +import { useInstrumentsQuery } from '@opentrons/react-api-client' +import type { + GripperData, + Instruments, + PipetteData, +} from '@opentrons/api-client' +import type { CompletedProtocolAnalysis, LoadedPipette, ProtocolAnalysisOutput, } from '@opentrons/shared-data' -import { isGripperInCommands } from '../../../resources/protocols/utils' -import { useInstrumentsQuery } from '@opentrons/react-api-client' -import { GripperData, Instruments, PipetteData } from '@opentrons/api-client' +import type { DeckCalibrationStatus } from '../../../redux/calibration/api-types' export interface ProtocolCalibrationStatus { complete: boolean diff --git a/app/src/organisms/DropTipWizard/JogToPosition.tsx b/app/src/organisms/DropTipWizard/JogToPosition.tsx index bad08fb6705..f7c33c8eb3b 100644 --- a/app/src/organisms/DropTipWizard/JogToPosition.tsx +++ b/app/src/organisms/DropTipWizard/JogToPosition.tsx @@ -22,10 +22,11 @@ import { TYPOGRAPHY, } from '@opentrons/components' // import { NeedHelpLink } from '../CalibrationPanels' +import { JogControls } from '../../molecules/JogControls' import { SmallButton } from '../../atoms/buttons' -import { Jog, JogControls } from '../../molecules/JogControls' import { InProgressModal } from '../../molecules/InProgressModal/InProgressModal' import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' +import type { Jog } from '../../molecules/JogControls' // TODO: get help link article URL // const NEED_HELP_URL = '' diff --git a/app/src/organisms/DropTipWizard/types.ts b/app/src/organisms/DropTipWizard/types.ts index e2fd26180d4..f7f6eb138d5 100644 --- a/app/src/organisms/DropTipWizard/types.ts +++ b/app/src/organisms/DropTipWizard/types.ts @@ -1,4 +1,4 @@ -import { +import type { BLOWOUT_SUCCESS, CHOOSE_BLOWOUT_LOCATION, CHOOSE_DROP_TIP_LOCATION, diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx index 6c49288b30e..a889ece33fd 100644 --- a/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx @@ -10,7 +10,7 @@ import { } from '@opentrons/react-api-client' import { i18n } from '../../../i18n' import { FirmwareUpdateModal } from '..' -import { +import type { BadPipette, PipetteData, SubsystemUpdateProgressData, diff --git a/app/src/organisms/GripperWizardFlows/index.tsx b/app/src/organisms/GripperWizardFlows/index.tsx index 1c3126c739d..70e05249973 100644 --- a/app/src/organisms/GripperWizardFlows/index.tsx +++ b/app/src/organisms/GripperWizardFlows/index.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' -import { UseMutateFunction } from 'react-query' import { useConditionalConfirm, Flex, @@ -35,6 +34,7 @@ import { UnmountGripper } from './UnmountGripper' import { Success } from './Success' import { ExitConfirmation } from './ExitConfirmation' +import type { UseMutateFunction } from 'react-query' import type { GripperWizardFlowType } from './types' import type { AxiosError } from 'axios' import type { diff --git a/app/src/organisms/GripperWizardFlows/types.ts b/app/src/organisms/GripperWizardFlows/types.ts index 584346392c3..ece9ff9a4c0 100644 --- a/app/src/organisms/GripperWizardFlows/types.ts +++ b/app/src/organisms/GripperWizardFlows/types.ts @@ -1,4 +1,6 @@ -import { +import type { useCreateCommandMutation } from '@opentrons/react-api-client' +import type { Coordinates, CreateCommand } from '@opentrons/shared-data' +import type { SECTIONS, GRIPPER_FLOW_TYPES, MOVE_PIN_FROM_FRONT_JAW_TO_REAR_JAW, @@ -9,8 +11,6 @@ import { SUCCESSFULLY_DETACHED, SUCCESSFULLY_CALIBRATED, } from './constants' -import { useCreateCommandMutation } from '@opentrons/react-api-client' -import type { Coordinates, CreateCommand } from '@opentrons/shared-data' export type GripperWizardStep = | BeforeBeginningStep diff --git a/app/src/organisms/InstrumentMountItem/ProtocolInstrumentMountItem.tsx b/app/src/organisms/InstrumentMountItem/ProtocolInstrumentMountItem.tsx index 80e160437e8..acaf0789918 100644 --- a/app/src/organisms/InstrumentMountItem/ProtocolInstrumentMountItem.tsx +++ b/app/src/organisms/InstrumentMountItem/ProtocolInstrumentMountItem.tsx @@ -15,9 +15,7 @@ import { } from '@opentrons/components' import { NINETY_SIX_CHANNEL, - PipetteName, SINGLE_MOUNT_PIPETTES, - LoadedPipette, } from '@opentrons/shared-data' import { SmallButton } from '../../atoms/buttons' @@ -30,7 +28,11 @@ import { PipetteWizardFlows } from '../PipetteWizardFlows' import { GripperWizardFlows } from '../GripperWizardFlows' import type { InstrumentData } from '@opentrons/api-client' -import type { GripperModel } from '@opentrons/shared-data' +import type { + GripperModel, + PipetteName, + LoadedPipette, +} from '@opentrons/shared-data' import type { Mount } from '../../redux/pipettes/types' export const MountItem = styled.div<{ isReady: boolean }>` diff --git a/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx b/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx index 9a932bb697d..5e580a45af3 100644 --- a/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx +++ b/app/src/organisms/InterventionModal/MoveLabwareInterventionContent.tsx @@ -22,12 +22,7 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { - CompletedProtocolAnalysis, - LabwareDefinitionsByUri, - LabwareLocation, - MoveLabwareRunTimeCommand, OT2_ROBOT_TYPE, - RobotType, getDeckDefFromRobotType, getLabwareDisplayName, getLoadedLabwareDefinitionsByUri, @@ -50,6 +45,13 @@ import { } from '../CommandText/utils/accessors' import { useNotifyDeckConfigurationQuery } from '../../resources/deck_configuration' +import type { + CompletedProtocolAnalysis, + LabwareDefinitionsByUri, + LabwareLocation, + MoveLabwareRunTimeCommand, + RobotType, +} from '@opentrons/shared-data' import type { RunData } from '@opentrons/api-client' const LABWARE_DESCRIPTION_STYLE = css` diff --git a/app/src/organisms/InterventionModal/__fixtures__/index.ts b/app/src/organisms/InterventionModal/__fixtures__/index.ts index de2ae730f89..333c0b8fa7a 100644 --- a/app/src/organisms/InterventionModal/__fixtures__/index.ts +++ b/app/src/organisms/InterventionModal/__fixtures__/index.ts @@ -1,5 +1,4 @@ import { - LabwareDefinition2, SPAN7_8_10_11_SLOT, THERMOCYCLER_MODULE_V1, getModuleDef2, @@ -8,6 +7,7 @@ import { import type { RunData } from '@opentrons/api-client' import type { LabwareDefinitionsByUri, + LabwareDefinition2, Liquid, LoadedLabware, LoadedModule, diff --git a/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx b/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx index 555973db4eb..06f4f0a22a3 100644 --- a/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx +++ b/app/src/organisms/InterventionModal/__tests__/InterventionModal.test.tsx @@ -1,11 +1,8 @@ import * as React from 'react' import { fireEvent, screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' +import { getLabwareDefURI } from '@opentrons/shared-data' import { renderWithProviders } from '../../../__testing-utils__' -import { - CompletedProtocolAnalysis, - getLabwareDefURI, -} from '@opentrons/shared-data' import { i18n } from '../../../i18n' import { InterventionModal } from '..' @@ -18,6 +15,7 @@ import { } from '../__fixtures__' import { mockTipRackDefinition } from '../../../redux/custom-labware/__fixtures__' import { useIsFlex } from '../../Devices/hooks' +import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' const ROBOT_NAME = 'Otie' diff --git a/app/src/organisms/InterventionModal/utils/getLabwareNameFromRunData.ts b/app/src/organisms/InterventionModal/utils/getLabwareNameFromRunData.ts index e2c083c8afc..d6773e683f1 100644 --- a/app/src/organisms/InterventionModal/utils/getLabwareNameFromRunData.ts +++ b/app/src/organisms/InterventionModal/utils/getLabwareNameFromRunData.ts @@ -1,11 +1,8 @@ -import { - RunTimeCommand, - getLabwareDefURI, - getLabwareDisplayName, -} from '@opentrons/shared-data' +import { getLabwareDefURI, getLabwareDisplayName } from '@opentrons/shared-data' import { getLoadedLabware } from '../../CommandText/utils/accessors' import { getLabwareDefinitionsFromCommands } from '../../LabwarePositionCheck/utils/labware' +import type { RunTimeCommand } from '@opentrons/shared-data' import type { RunData } from '@opentrons/api-client' const FIXED_TRASH_DEF_URIS = [ diff --git a/app/src/organisms/InterventionModal/utils/isInterventionCommand.ts b/app/src/organisms/InterventionModal/utils/isInterventionCommand.ts index 133b8a4d254..b7f198596ff 100644 --- a/app/src/organisms/InterventionModal/utils/isInterventionCommand.ts +++ b/app/src/organisms/InterventionModal/utils/isInterventionCommand.ts @@ -1,5 +1,5 @@ -import { RunTimeCommand } from '@opentrons/shared-data' -import { RunCommandSummary } from '@opentrons/api-client' +import type { RunTimeCommand } from '@opentrons/shared-data' +import type { RunCommandSummary } from '@opentrons/api-client' export function isInterventionCommand( command: RunTimeCommand | RunCommandSummary diff --git a/app/src/organisms/LabwarePositionCheck/AttachProbe.tsx b/app/src/organisms/LabwarePositionCheck/AttachProbe.tsx index 9cf7f86f375..01a87bee4eb 100644 --- a/app/src/organisms/LabwarePositionCheck/AttachProbe.tsx +++ b/app/src/organisms/LabwarePositionCheck/AttachProbe.tsx @@ -6,27 +6,27 @@ import { StyledText, TYPOGRAPHY, } from '@opentrons/components' -import { - CompletedProtocolAnalysis, - getPipetteNameSpecs, - CreateCommand, -} from '@opentrons/shared-data' +import { getPipetteNameSpecs } from '@opentrons/shared-data' import { css } from 'styled-components' import { ProbeNotAttached } from '../PipetteWizardFlows/ProbeNotAttached' import { RobotMotionLoader } from './RobotMotionLoader' import attachProbe1 from '../../assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_1.webm' import attachProbe8 from '../../assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_8.webm' import attachProbe96 from '../../assets/videos/pipette-wizard-flows/Pipette_Attach_Probe_96.webm' -import { useChainRunCommands } from '../../resources/runs' import { GenericWizardTile } from '../../molecules/GenericWizardTile' +import type { + CompletedProtocolAnalysis, + CreateCommand, +} from '@opentrons/shared-data' +import type { LabwareOffset } from '@opentrons/api-client' import type { Jog } from '../../molecules/JogControls/types' +import type { useChainRunCommands } from '../../resources/runs' import type { AttachProbeStep, RegisterPositionAction, WorkingOffset, } from './types' -import type { LabwareOffset } from '@opentrons/api-client' interface AttachProbeProps extends AttachProbeStep { protocolData: CompletedProtocolAnalysis diff --git a/app/src/organisms/LabwarePositionCheck/CheckItem.tsx b/app/src/organisms/LabwarePositionCheck/CheckItem.tsx index 06239a0d4e0..7978f4f76ee 100644 --- a/app/src/organisms/LabwarePositionCheck/CheckItem.tsx +++ b/app/src/organisms/LabwarePositionCheck/CheckItem.tsx @@ -12,7 +12,6 @@ import { RobotMotionLoader } from './RobotMotionLoader' import { PrepareSpace } from './PrepareSpace' import { JogToWell } from './JogToWell' import { - CreateCommand, FLEX_ROBOT_TYPE, getIsTiprack, getLabwareDefURI, @@ -20,9 +19,6 @@ import { getModuleType, HEATERSHAKER_MODULE_TYPE, IDENTITY_VECTOR, - LabwareLocation, - MoveLabwareCreateCommand, - RobotType, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' import { useSelector } from 'react-redux' @@ -32,12 +28,18 @@ import { } from './utils/labware' import { UnorderedList } from '../../molecules/UnorderedList' import { getCurrentOffsetForLabwareInLocation } from '../Devices/ProtocolRun/utils/getCurrentOffsetForLabwareInLocation' -import { useChainRunCommands } from '../../resources/runs' import { getIsOnDevice } from '../../redux/config' import { getDisplayLocation } from './utils/getDisplayLocation' import type { LabwareOffset } from '@opentrons/api-client' -import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' +import type { + CompletedProtocolAnalysis, + CreateCommand, + LabwareLocation, + MoveLabwareCreateCommand, + RobotType, +} from '@opentrons/shared-data' +import type { useChainRunCommands } from '../../resources/runs' import type { CheckLabwareStep, RegisterPositionAction, diff --git a/app/src/organisms/LabwarePositionCheck/DetachProbe.tsx b/app/src/organisms/LabwarePositionCheck/DetachProbe.tsx index 202cf78d57a..55575570cce 100644 --- a/app/src/organisms/LabwarePositionCheck/DetachProbe.tsx +++ b/app/src/organisms/LabwarePositionCheck/DetachProbe.tsx @@ -8,17 +8,15 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { RobotMotionLoader } from './RobotMotionLoader' -import { - CompletedProtocolAnalysis, - getPipetteNameSpecs, -} from '@opentrons/shared-data' +import { getPipetteNameSpecs } from '@opentrons/shared-data' import detachProbe1 from '../../assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_1.webm' import detachProbe8 from '../../assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_8.webm' import detachProbe96 from '../../assets/videos/pipette-wizard-flows/Pipette_Detach_Probe_96.webm' -import { useChainRunCommands } from '../../resources/runs' import { GenericWizardTile } from '../../molecules/GenericWizardTile' +import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { Jog } from '../../molecules/JogControls/types' +import type { useChainRunCommands } from '../../resources/runs' import type { DetachProbeStep, RegisterPositionAction, diff --git a/app/src/organisms/LabwarePositionCheck/IntroScreen/index.tsx b/app/src/organisms/LabwarePositionCheck/IntroScreen/index.tsx index 5fdfb0af52f..0ba541c95f6 100644 --- a/app/src/organisms/LabwarePositionCheck/IntroScreen/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/IntroScreen/index.tsx @@ -19,9 +19,6 @@ import { } from '@opentrons/components' import { RobotMotionLoader } from '../RobotMotionLoader' import { getPrepCommands } from './getPrepCommands' -import { useChainRunCommands } from '../../../resources/runs' -import type { RegisterPositionAction } from '../types' -import type { Jog } from '../../../molecules/JogControls' import { WizardRequiredEquipmentList } from '../../../molecules/WizardRequiredEquipmentList' import { getLatestCurrentOffsets } from '../../Devices/ProtocolRun/SetupLabwarePositionCheck/utils' import { getIsOnDevice } from '../../../redux/config' @@ -40,6 +37,9 @@ import type { CompletedProtocolAnalysis, LabwareDefinition2, } from '@opentrons/shared-data' +import type { useChainRunCommands } from '../../../resources/runs' +import type { RegisterPositionAction } from '../types' +import type { Jog } from '../../../molecules/JogControls' export const INTERVAL_MS = 3000 diff --git a/app/src/organisms/LabwarePositionCheck/JogToWell.tsx b/app/src/organisms/LabwarePositionCheck/JogToWell.tsx index 828264b0218..415eb8f15fb 100644 --- a/app/src/organisms/LabwarePositionCheck/JogToWell.tsx +++ b/app/src/organisms/LabwarePositionCheck/JogToWell.tsx @@ -26,7 +26,6 @@ import { getPipetteNameSpecs, getVectorDifference, getVectorSum, - PipetteName, } from '@opentrons/shared-data' import levelWithTip from '../../assets/images/lpc_level_with_tip.svg' @@ -41,10 +40,10 @@ import { NeedHelpLink } from '../CalibrationPanels' import { JogControls } from '../../molecules/JogControls' import { LiveOffsetValue } from './LiveOffsetValue' -import type { Jog } from '../../molecules/JogControls' -import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { PipetteName, LabwareDefinition2 } from '@opentrons/shared-data' import type { WellStroke } from '@opentrons/components' import type { VectorOffset } from '@opentrons/api-client' +import type { Jog } from '../../molecules/JogControls' const DECK_MAP_VIEWBOX = '-10 -10 150 105' const LPC_HELP_LINK_URL = diff --git a/app/src/organisms/LabwarePositionCheck/LabwarePositionCheckComponent.tsx b/app/src/organisms/LabwarePositionCheck/LabwarePositionCheckComponent.tsx index 440c6c89586..0722465b50b 100644 --- a/app/src/organisms/LabwarePositionCheck/LabwarePositionCheckComponent.tsx +++ b/app/src/organisms/LabwarePositionCheck/LabwarePositionCheckComponent.tsx @@ -5,24 +5,11 @@ import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { useConditionalConfirm } from '@opentrons/components' -import { - LabwareOffsetCreateData, - LabwareOffset, - CommandData, -} from '@opentrons/api-client' import { useCreateLabwareOffsetMutation, useCreateMaintenanceCommandMutation, } from '@opentrons/react-api-client' -import { - CompletedProtocolAnalysis, - Coordinates, - FIXED_TRASH_ID, - FLEX_ROBOT_TYPE, - CreateCommand, - DropTipCreateCommand, - RobotType, -} from '@opentrons/shared-data' +import { FIXED_TRASH_ID, FLEX_ROBOT_TYPE } from '@opentrons/shared-data' import { getTopPortalEl } from '../../App/portal' // import { useTrackEvent } from '../../redux/analytics' @@ -41,8 +28,20 @@ import { useChainMaintenanceCommands } from '../../resources/runs' import { FatalErrorModal } from './FatalErrorModal' import { RobotMotionLoader } from './RobotMotionLoader' import { useNotifyCurrentMaintenanceRun } from '../../resources/maintenance_runs' - import { getLabwarePositionCheckSteps } from './getLabwarePositionCheckSteps' + +import type { + CompletedProtocolAnalysis, + Coordinates, + CreateCommand, + DropTipCreateCommand, + RobotType, +} from '@opentrons/shared-data' +import type { + LabwareOffsetCreateData, + LabwareOffset, + CommandData, +} from '@opentrons/api-client' import type { Axis, Sign, StepSize } from '../../molecules/JogControls/types' import type { RegisterPositionAction, WorkingOffset } from './types' diff --git a/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx b/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx index f9fb114c789..dfeda1ee216 100644 --- a/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx +++ b/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx @@ -8,21 +8,16 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { - CompletedProtocolAnalysis, - CreateCommand, getLabwareDefURI, getLabwareDisplayName, getModuleType, getVectorDifference, HEATERSHAKER_MODULE_TYPE, IDENTITY_VECTOR, - MoveLabwareCreateCommand, - RobotType, } from '@opentrons/shared-data' import { RobotMotionLoader } from './RobotMotionLoader' import { PrepareSpace } from './PrepareSpace' import { JogToWell } from './JogToWell' -import { useChainRunCommands } from '../../resources/runs' import { UnorderedList } from '../../molecules/UnorderedList' import { getCurrentOffsetForLabwareInLocation } from '../Devices/ProtocolRun/utils/getCurrentOffsetForLabwareInLocation' import { TipConfirmation } from './TipConfirmation' @@ -32,6 +27,13 @@ import { } from './utils/labware' import { getDisplayLocation } from './utils/getDisplayLocation' +import type { + CompletedProtocolAnalysis, + CreateCommand, + MoveLabwareCreateCommand, + RobotType, +} from '@opentrons/shared-data' +import type { useChainRunCommands } from '../../resources/runs' import type { Jog } from '../../molecules/JogControls/types' import type { PickUpTipStep, diff --git a/app/src/organisms/LabwarePositionCheck/PrepareSpace.tsx b/app/src/organisms/LabwarePositionCheck/PrepareSpace.tsx index da886ccaba1..ad3df11c6aa 100644 --- a/app/src/organisms/LabwarePositionCheck/PrepareSpace.tsx +++ b/app/src/organisms/LabwarePositionCheck/PrepareSpace.tsx @@ -16,19 +16,18 @@ import { BaseDeck, ALIGN_FLEX_START, } from '@opentrons/components' -import { - CompletedProtocolAnalysis, - LabwareDefinition2, - THERMOCYCLER_MODULE_TYPE, - getModuleType, - RobotType, -} from '@opentrons/shared-data' +import { THERMOCYCLER_MODULE_TYPE, getModuleType } from '@opentrons/shared-data' import { getIsOnDevice } from '../../redux/config' import { SmallButton } from '../../atoms/buttons' import { NeedHelpLink } from '../CalibrationPanels' import { useNotifyDeckConfigurationQuery } from '../../resources/deck_configuration' +import type { + CompletedProtocolAnalysis, + LabwareDefinition2, + RobotType, +} from '@opentrons/shared-data' import type { CheckLabwareStep } from './types' const LPC_HELP_LINK_URL = diff --git a/app/src/organisms/LabwarePositionCheck/ResultsSummary.tsx b/app/src/organisms/LabwarePositionCheck/ResultsSummary.tsx index 0dd1bf38e8a..be0fc80766f 100644 --- a/app/src/organisms/LabwarePositionCheck/ResultsSummary.tsx +++ b/app/src/organisms/LabwarePositionCheck/ResultsSummary.tsx @@ -4,14 +4,12 @@ import { useSelector } from 'react-redux' import isEqual from 'lodash/isEqual' import { useTranslation } from 'react-i18next' import { - CompletedProtocolAnalysis, getLabwareDefURI, getLabwareDisplayName, getModuleType, getVectorDifference, getVectorSum, IDENTITY_VECTOR, - LabwareDefinition2, } from '@opentrons/shared-data' import { NeedHelpLink } from '../CalibrationPanels' import { @@ -42,6 +40,10 @@ import { getCurrentOffsetForLabwareInLocation } from '../Devices/ProtocolRun/uti import { getLabwareDefinitionsFromCommands } from './utils/labware' import { getDisplayLocation } from './utils/getDisplayLocation' +import type { + CompletedProtocolAnalysis, + LabwareDefinition2, +} from '@opentrons/shared-data' import type { LabwareOffset, LabwareOffsetCreateData, diff --git a/app/src/organisms/LabwarePositionCheck/ReturnTip.tsx b/app/src/organisms/LabwarePositionCheck/ReturnTip.tsx index fe32fa4c5b1..5a46ec2b4eb 100644 --- a/app/src/organisms/LabwarePositionCheck/ReturnTip.tsx +++ b/app/src/organisms/LabwarePositionCheck/ReturnTip.tsx @@ -6,17 +6,13 @@ import { StyledText, TYPOGRAPHY, } from '@opentrons/components' + import { - CompletedProtocolAnalysis, - CreateCommand, getLabwareDisplayName, getModuleType, HEATERSHAKER_MODULE_TYPE, - MoveLabwareCreateCommand, - RobotType, } from '@opentrons/shared-data' import { UnorderedList } from '../../molecules/UnorderedList' -import { useChainRunCommands } from '../../resources/runs' import { getLabwareDef, getLabwareDefinitionsFromCommands, @@ -27,7 +23,14 @@ import { PrepareSpace } from './PrepareSpace' import { useSelector } from 'react-redux' import { getIsOnDevice } from '../../redux/config' +import type { + CompletedProtocolAnalysis, + CreateCommand, + RobotType, + MoveLabwareCreateCommand, +} from '@opentrons/shared-data' import type { VectorOffset } from '@opentrons/api-client' +import type { useChainRunCommands } from '../../resources/runs' import type { ReturnTipStep } from './types' interface ReturnTipProps extends ReturnTipStep { diff --git a/app/src/organisms/LabwarePositionCheck/getLabwarePositionCheckSteps.ts b/app/src/organisms/LabwarePositionCheck/getLabwarePositionCheckSteps.ts index fa1e4d881a2..1c51c06827f 100644 --- a/app/src/organisms/LabwarePositionCheck/getLabwarePositionCheckSteps.ts +++ b/app/src/organisms/LabwarePositionCheck/getLabwarePositionCheckSteps.ts @@ -1,7 +1,7 @@ import { getPrimaryPipetteId } from './utils/getPrimaryPipetteId' -import { CompletedProtocolAnalysis } from '@opentrons/shared-data' import { getTipBasedLPCSteps } from './utils/getTipBasedLPCSteps' import { getProbeBasedLPCSteps } from './utils/getProbeBasedLPCSteps' +import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' import type { LabwarePositionCheckStep } from './types' export const getLabwarePositionCheckSteps = ( diff --git a/app/src/organisms/LabwarePositionCheck/index.tsx b/app/src/organisms/LabwarePositionCheck/index.tsx index 1dcd396983c..abadfa346a1 100644 --- a/app/src/organisms/LabwarePositionCheck/index.tsx +++ b/app/src/organisms/LabwarePositionCheck/index.tsx @@ -3,9 +3,9 @@ import { useLogger } from '../../logger' import { LabwarePositionCheckComponent } from './LabwarePositionCheckComponent' import { FatalErrorModal } from './FatalErrorModal' -import { +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' +import type { CompletedProtocolAnalysis, - FLEX_ROBOT_TYPE, RobotType, } from '@opentrons/shared-data' import type { LabwareOffset } from '@opentrons/api-client' diff --git a/app/src/organisms/LabwarePositionCheck/types.ts b/app/src/organisms/LabwarePositionCheck/types.ts index 5f53e7511c0..2ddd14c25d6 100644 --- a/app/src/organisms/LabwarePositionCheck/types.ts +++ b/app/src/organisms/LabwarePositionCheck/types.ts @@ -1,5 +1,5 @@ -import { SECTIONS } from './constants' -import { useCreateCommandMutation } from '@opentrons/react-api-client' +import type { SECTIONS } from './constants' +import type { useCreateCommandMutation } from '@opentrons/react-api-client' import type { LabwareOffsetLocation, VectorOffset } from '@opentrons/api-client' import type { LabwareDefinition2 } from '@opentrons/shared-data' diff --git a/app/src/organisms/LabwarePositionCheck/utils/doesPipetteVisitAllTipracks.ts b/app/src/organisms/LabwarePositionCheck/utils/doesPipetteVisitAllTipracks.ts index 526451c467f..0976aab8b1b 100644 --- a/app/src/organisms/LabwarePositionCheck/utils/doesPipetteVisitAllTipracks.ts +++ b/app/src/organisms/LabwarePositionCheck/utils/doesPipetteVisitAllTipracks.ts @@ -1,7 +1,11 @@ -import { getIsTiprack, LabwareDefinition2 } from '@opentrons/shared-data' +import { getIsTiprack } from '@opentrons/shared-data' import { getPickUpTipCommandsWithPipette } from '../../Devices/ProtocolRun/utils/getPickUpTipCommandsWithPipette' import { getTipracksVisited } from '../../Devices/ProtocolRun/utils/getTipracksVisited' -import type { LoadedLabware, RunTimeCommand } from '@opentrons/shared-data' +import type { + LoadedLabware, + RunTimeCommand, + LabwareDefinition2, +} from '@opentrons/shared-data' export const doesPipetteVisitAllTipracks = ( pipetteId: string, diff --git a/app/src/organisms/LabwarePositionCheck/utils/getDisplayLocation.ts b/app/src/organisms/LabwarePositionCheck/utils/getDisplayLocation.ts index 6c00e9667dd..2c0fb134a40 100644 --- a/app/src/organisms/LabwarePositionCheck/utils/getDisplayLocation.ts +++ b/app/src/organisms/LabwarePositionCheck/utils/getDisplayLocation.ts @@ -3,9 +3,9 @@ import { getModuleType, THERMOCYCLER_MODULE_TYPE, getLabwareDefURI, - LabwareDefinition2, } from '@opentrons/shared-data' import type { i18n, TFunction } from 'i18next' +import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { LabwareOffsetLocation } from '@opentrons/api-client' export function getDisplayLocation( diff --git a/app/src/organisms/LabwarePositionCheck/utils/getProbeBasedLPCSteps.ts b/app/src/organisms/LabwarePositionCheck/utils/getProbeBasedLPCSteps.ts index bb02fee1e6e..34d41e2ce99 100644 --- a/app/src/organisms/LabwarePositionCheck/utils/getProbeBasedLPCSteps.ts +++ b/app/src/organisms/LabwarePositionCheck/utils/getProbeBasedLPCSteps.ts @@ -1,16 +1,15 @@ import { isEqual } from 'lodash' import { SECTIONS } from '../constants' -import { +import { getLabwareDefURI, getPipetteNameSpecs } from '@opentrons/shared-data' +import { getLabwareLocationCombos } from '../../ApplyHistoricOffsets/hooks/getLabwareLocationCombos' +import { getLabwareDefinitionsFromCommands } from './labware' + +import type { CompletedProtocolAnalysis, LoadedPipette, - getLabwareDefURI, - getPipetteNameSpecs, } from '@opentrons/shared-data' -import { getLabwareLocationCombos } from '../../ApplyHistoricOffsets/hooks/getLabwareLocationCombos' - import type { LabwarePositionCheckStep, CheckPositionsStep } from '../types' import type { LabwareLocationCombo } from '../../ApplyHistoricOffsets/hooks/getLabwareLocationCombos' -import { getLabwareDefinitionsFromCommands } from './labware' function getPrimaryPipetteId(pipettes: LoadedPipette[]): string { if (pipettes.length < 1) { diff --git a/app/src/organisms/ModuleCard/MagneticModuleData.tsx b/app/src/organisms/ModuleCard/MagneticModuleData.tsx index 6cd6c2284ab..744d24c9811 100644 --- a/app/src/organisms/ModuleCard/MagneticModuleData.tsx +++ b/app/src/organisms/ModuleCard/MagneticModuleData.tsx @@ -1,8 +1,9 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { COLORS, TYPOGRAPHY, StyledText } from '@opentrons/components' -import { MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2 } from '@opentrons/shared-data' +import { MAGNETIC_MODULE_V2 } from '@opentrons/shared-data' import { StatusLabel } from '../../atoms/StatusLabel' +import type { MAGNETIC_MODULE_V1 } from '@opentrons/shared-data' import type { MagneticStatus } from '../../redux/modules/api-types' interface MagModuleProps { diff --git a/app/src/organisms/ModuleCard/TestShakeSlideout.tsx b/app/src/organisms/ModuleCard/TestShakeSlideout.tsx index 81023ffd337..2b02e3a1f8b 100644 --- a/app/src/organisms/ModuleCard/TestShakeSlideout.tsx +++ b/app/src/organisms/ModuleCard/TestShakeSlideout.tsx @@ -23,7 +23,6 @@ import { } from '@opentrons/components' import { getIsHeaterShakerAttached } from '../../redux/config' import { - CreateCommand, getModuleDisplayName, HS_RPM_MAX, HS_RPM_MIN, @@ -41,6 +40,7 @@ import { ModuleSetupModal } from './ModuleSetupModal' import type { HeaterShakerModule, LatchStatus } from '../../redux/modules/types' import type { + CreateCommand, HeaterShakerCloseLatchCreateCommand, HeaterShakerDeactivateShakerCreateCommand, HeaterShakerSetAndWaitForShakeSpeedCreateCommand, diff --git a/app/src/organisms/ModuleWizardFlows/constants.ts b/app/src/organisms/ModuleWizardFlows/constants.ts index 9367f4f2bb2..5c5892003e8 100644 --- a/app/src/organisms/ModuleWizardFlows/constants.ts +++ b/app/src/organisms/ModuleWizardFlows/constants.ts @@ -1,9 +1,9 @@ import { HEATERSHAKER_MODULE_TYPE, - ModuleType, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' +import type { ModuleType } from '@opentrons/shared-data' export const SECTIONS = { BEFORE_BEGINNING: 'BEFORE_BEGINNING', diff --git a/app/src/organisms/ModuleWizardFlows/types.ts b/app/src/organisms/ModuleWizardFlows/types.ts index df6020e9b36..39fc6e6920e 100644 --- a/app/src/organisms/ModuleWizardFlows/types.ts +++ b/app/src/organisms/ModuleWizardFlows/types.ts @@ -1,5 +1,5 @@ -import { AttachedModule } from '@opentrons/api-client' -import { FLOWS, SECTIONS } from './constants' +import type { AttachedModule } from '@opentrons/api-client' +import type { FLOWS, SECTIONS } from './constants' import type { CreateCommand } from '@opentrons/shared-data' import type { PipetteInformation } from '../Devices/hooks' diff --git a/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunningProtocolCommandList.tsx b/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunningProtocolCommandList.tsx index 442cf903914..a9d476d5810 100644 --- a/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunningProtocolCommandList.tsx +++ b/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunningProtocolCommandList.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { css } from 'styled-components' -import { ViewportList, ViewportListRef } from 'react-viewport-list' +import { ViewportList } from 'react-viewport-list' import { ALIGN_CENTER, @@ -28,6 +28,7 @@ import { PlayPauseButton } from './PlayPauseButton' import { StopButton } from './StopButton' import { ANALYTICS_PROTOCOL_RUN_ACTION } from '../../../redux/analytics' +import type { ViewportListRef } from 'react-viewport-list' import type { CompletedProtocolAnalysis, RobotType, diff --git a/app/src/organisms/PipetteWizardFlows/AttachProbe.tsx b/app/src/organisms/PipetteWizardFlows/AttachProbe.tsx index 489269e4311..ded4afcb7a7 100644 --- a/app/src/organisms/PipetteWizardFlows/AttachProbe.tsx +++ b/app/src/organisms/PipetteWizardFlows/AttachProbe.tsx @@ -9,12 +9,7 @@ import { StyledText, TYPOGRAPHY, } from '@opentrons/components' -import { - LEFT, - MotorAxes, - WASTE_CHUTE_CUTOUT, - CreateCommand, -} from '@opentrons/shared-data' +import { LEFT, WASTE_CHUTE_CUTOUT } from '@opentrons/shared-data' import { Banner } from '../../atoms/Banner' import { GenericWizardTile } from '../../molecules/GenericWizardTile' import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' @@ -27,6 +22,7 @@ import { getPipetteAnimations } from './utils' import { ProbeNotAttached } from './ProbeNotAttached' import { useNotifyDeckConfigurationQuery } from '../../resources/deck_configuration' +import type { MotorAxes, CreateCommand } from '@opentrons/shared-data' import type { PipetteWizardStepProps } from './types' interface AttachProbeProps extends PipetteWizardStepProps { diff --git a/app/src/organisms/PipetteWizardFlows/BeforeBeginning.tsx b/app/src/organisms/PipetteWizardFlows/BeforeBeginning.tsx index 165c37053f9..3861bde63a7 100644 --- a/app/src/organisms/PipetteWizardFlows/BeforeBeginning.tsx +++ b/app/src/organisms/PipetteWizardFlows/BeforeBeginning.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { Trans, useTranslation } from 'react-i18next' -import { UseMutateFunction } from 'react-query' import { COLORS, DIRECTION_COLUMN, @@ -33,6 +32,7 @@ import { import { getIsGantryEmpty } from './utils' import { useNotifyDeckConfigurationQuery } from '../../resources/deck_configuration' +import type { UseMutateFunction } from 'react-query' import type { AxiosError } from 'axios' import type { CreateCommand, diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/getPipetteWizardStepsForProtocol.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/getPipetteWizardStepsForProtocol.test.tsx index 44380a60577..1fc4ea2464e 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/getPipetteWizardStepsForProtocol.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/getPipetteWizardStepsForProtocol.test.tsx @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest' -import { LEFT, RIGHT, LoadedPipette } from '@opentrons/shared-data' +import { LEFT, RIGHT } from '@opentrons/shared-data' import { mock96ChannelAttachedPipetteInformation, mockAttachedPipetteInformation, @@ -7,6 +7,7 @@ import { import { FLOWS, SECTIONS } from '../constants' import { getPipetteWizardStepsForProtocol } from '../getPipetteWizardStepsForProtocol' +import type { LoadedPipette } from '@opentrons/shared-data' import type { PipetteWizardStep } from '../types' const mockPipetteInfo = [ diff --git a/app/src/organisms/PipetteWizardFlows/getPipetteWizardSteps.ts b/app/src/organisms/PipetteWizardFlows/getPipetteWizardSteps.ts index d253fdf15e9..6d89993ab85 100644 --- a/app/src/organisms/PipetteWizardFlows/getPipetteWizardSteps.ts +++ b/app/src/organisms/PipetteWizardFlows/getPipetteWizardSteps.ts @@ -18,15 +18,15 @@ export const getPipetteWizardSteps = ( return [ { section: SECTIONS.BEFORE_BEGINNING, - mount: mount, - flowType: flowType, + mount, + flowType, }, - { section: SECTIONS.ATTACH_PROBE, mount: mount, flowType: flowType }, - { section: SECTIONS.DETACH_PROBE, mount: mount, flowType: flowType }, + { section: SECTIONS.ATTACH_PROBE, mount, flowType }, + { section: SECTIONS.DETACH_PROBE, mount, flowType }, { section: SECTIONS.RESULTS, - mount: mount, - flowType: flowType, + mount, + flowType, }, ] } @@ -35,21 +35,21 @@ export const getPipetteWizardSteps = ( return [ { section: SECTIONS.BEFORE_BEGINNING, - mount: mount, - flowType: flowType, + mount, + flowType, }, - { section: SECTIONS.MOUNT_PIPETTE, mount: mount, flowType: flowType }, + { section: SECTIONS.MOUNT_PIPETTE, mount, flowType }, { section: SECTIONS.FIRMWARE_UPDATE, - mount: mount, - flowType: flowType, + mount, + flowType, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: flowType }, - { section: SECTIONS.ATTACH_PROBE, mount: mount, flowType: flowType }, - { section: SECTIONS.DETACH_PROBE, mount: mount, flowType: flowType }, + { section: SECTIONS.RESULTS, mount, flowType }, + { section: SECTIONS.ATTACH_PROBE, mount, flowType }, + { section: SECTIONS.DETACH_PROBE, mount, flowType }, { section: SECTIONS.RESULTS, - mount: mount, + mount, flowType: FLOWS.CALIBRATE, }, ] @@ -64,7 +64,7 @@ export const getPipetteWizardSteps = ( { section: SECTIONS.BEFORE_BEGINNING, mount: detachMount, - flowType: flowType, + flowType, }, { section: SECTIONS.DETACH_PIPETTE, @@ -80,33 +80,33 @@ export const getPipetteWizardSteps = ( { section: SECTIONS.CARRIAGE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.MOUNTING_PLATE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.MOUNT_PIPETTE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.FIRMWARE_UPDATE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.RESULTS, mount: LEFT, flowType: FLOWS.ATTACH }, { section: SECTIONS.ATTACH_PROBE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.DETACH_PROBE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.RESULTS, @@ -120,38 +120,38 @@ export const getPipetteWizardSteps = ( { section: SECTIONS.BEFORE_BEGINNING, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.CARRIAGE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.MOUNTING_PLATE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.MOUNT_PIPETTE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.FIRMWARE_UPDATE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.RESULTS, mount: LEFT, flowType: FLOWS.ATTACH }, { section: SECTIONS.ATTACH_PROBE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.DETACH_PROBE, mount: LEFT, - flowType: flowType, + flowType, }, { section: SECTIONS.RESULTS, @@ -167,40 +167,40 @@ export const getPipetteWizardSteps = ( return [ { section: SECTIONS.BEFORE_BEGINNING, - mount: mount, - flowType: flowType, + mount, + flowType, }, { section: SECTIONS.DETACH_PIPETTE, - mount: mount, - flowType: flowType, + mount, + flowType, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: flowType }, + { section: SECTIONS.RESULTS, mount, flowType }, ] // 96 channel detach } else { return [ { section: SECTIONS.BEFORE_BEGINNING, - mount: mount, - flowType: flowType, + mount, + flowType, }, { section: SECTIONS.DETACH_PIPETTE, - mount: mount, - flowType: flowType, + mount, + flowType, }, { section: SECTIONS.MOUNTING_PLATE, - mount: mount, - flowType: flowType, + mount, + flowType, }, { section: SECTIONS.CARRIAGE, - mount: mount, - flowType: flowType, + mount, + flowType, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: flowType }, + { section: SECTIONS.RESULTS, mount, flowType }, ] } } diff --git a/app/src/organisms/PipetteWizardFlows/getPipetteWizardStepsForProtocol.ts b/app/src/organisms/PipetteWizardFlows/getPipetteWizardStepsForProtocol.ts index ac5cf5ddb16..064b65b7f95 100644 --- a/app/src/organisms/PipetteWizardFlows/getPipetteWizardStepsForProtocol.ts +++ b/app/src/organisms/PipetteWizardFlows/getPipetteWizardStepsForProtocol.ts @@ -1,5 +1,6 @@ -import { LEFT, LoadedPipette, RIGHT } from '@opentrons/shared-data' +import { LEFT, RIGHT } from '@opentrons/shared-data' import { FLOWS, SECTIONS } from './constants' +import type { LoadedPipette } from '@opentrons/shared-data' import type { Mount } from '../../redux/pipettes/types' import type { AttachedPipettesFromInstrumentsQuery } from '../Devices/hooks' import type { PipetteWizardStep } from './types' @@ -23,20 +24,20 @@ export const getPipetteWizardStepsForProtocol = ( return [ { section: SECTIONS.BEFORE_BEGINNING, - mount: mount, + mount, flowType: FLOWS.CALIBRATE, }, { section: SECTIONS.ATTACH_PROBE, - mount: mount, + mount, flowType: FLOWS.CALIBRATE, }, { section: SECTIONS.DETACH_PROBE, - mount: mount, + mount, flowType: FLOWS.CALIBRATE, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: FLOWS.CALIBRATE }, + { section: SECTIONS.RESULTS, mount, flowType: FLOWS.CALIBRATE }, ] } else if ( requiredPipette.pipetteName !== 'p1000_96' && @@ -73,28 +74,28 @@ export const getPipetteWizardStepsForProtocol = ( }, { section: SECTIONS.MOUNT_PIPETTE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.FIRMWARE_UPDATE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: FLOWS.ATTACH }, + { section: SECTIONS.RESULTS, mount, flowType: FLOWS.ATTACH }, { section: SECTIONS.ATTACH_PROBE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.DETACH_PROBE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.RESULTS, - mount: mount, + mount, flowType: FLOWS.CALIBRATE, }, ] @@ -103,39 +104,39 @@ export const getPipetteWizardStepsForProtocol = ( return [ { section: SECTIONS.BEFORE_BEGINNING, - mount: mount, + mount, flowType: FLOWS.DETACH, }, { section: SECTIONS.DETACH_PIPETTE, - mount: mount, + mount, flowType: FLOWS.DETACH, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: FLOWS.DETACH }, + { section: SECTIONS.RESULTS, mount, flowType: FLOWS.DETACH }, { section: SECTIONS.MOUNT_PIPETTE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.FIRMWARE_UPDATE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: FLOWS.ATTACH }, + { section: SECTIONS.RESULTS, mount, flowType: FLOWS.ATTACH }, { section: SECTIONS.ATTACH_PROBE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.DETACH_PROBE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.RESULTS, - mount: mount, + mount, flowType: FLOWS.CALIBRATE, }, ] @@ -383,33 +384,33 @@ export const getPipetteWizardStepsForProtocol = ( return [ { section: SECTIONS.BEFORE_BEGINNING, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.MOUNT_PIPETTE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.FIRMWARE_UPDATE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, - { section: SECTIONS.RESULTS, mount: mount, flowType: FLOWS.ATTACH }, + { section: SECTIONS.RESULTS, mount, flowType: FLOWS.ATTACH }, { section: SECTIONS.ATTACH_PROBE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.DETACH_PROBE, - mount: mount, + mount, flowType: FLOWS.ATTACH, }, { section: SECTIONS.RESULTS, - mount: mount, + mount, flowType: FLOWS.CALIBRATE, }, ] diff --git a/app/src/organisms/PipetteWizardFlows/hooks.tsx b/app/src/organisms/PipetteWizardFlows/hooks.tsx index f7fe127d623..8d727aeeb75 100644 --- a/app/src/organisms/PipetteWizardFlows/hooks.tsx +++ b/app/src/organisms/PipetteWizardFlows/hooks.tsx @@ -1,13 +1,8 @@ import { useTranslation } from 'react-i18next' import capitalize from 'lodash/capitalize' -import { - LEFT, - LoadedPipette, - PipetteMount, - RIGHT, - SINGLE_MOUNT_PIPETTES, -} from '@opentrons/shared-data' +import { LEFT, RIGHT, SINGLE_MOUNT_PIPETTES } from '@opentrons/shared-data' import { FLOWS } from './constants' +import type { LoadedPipette, PipetteMount } from '@opentrons/shared-data' import type { AttachedPipettesFromInstrumentsQuery } from '../Devices/hooks' import type { PipetteWizardFlow, SelectablePipettes } from './types' diff --git a/app/src/organisms/PipetteWizardFlows/index.tsx b/app/src/organisms/PipetteWizardFlows/index.tsx index 337a51028ed..03f92a64bc8 100644 --- a/app/src/organisms/PipetteWizardFlows/index.tsx +++ b/app/src/organisms/PipetteWizardFlows/index.tsx @@ -5,13 +5,7 @@ import { useTranslation } from 'react-i18next' import NiceModal, { useModal } from '@ebay/nice-modal-react' import { useConditionalConfirm, COLORS } from '@opentrons/components' -import { - LEFT, - NINETY_SIX_CHANNEL, - RIGHT, - LoadedPipette, - CreateCommand, -} from '@opentrons/shared-data' +import { LEFT, NINETY_SIX_CHANNEL, RIGHT } from '@opentrons/shared-data' import { useHost, useDeleteMaintenanceRunMutation, @@ -28,6 +22,7 @@ import { getTopPortalEl } from '../../App/portal' import { WizardHeader } from '../../molecules/WizardHeader' import { FirmwareUpdateModal } from '../FirmwareUpdateModal' import { getIsOnDevice } from '../../redux/config' +import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' import { useAttachedPipettesFromInstrumentsQuery } from '../Devices/hooks' import { usePipetteFlowWizardHeaderText } from './hooks' import { getPipetteWizardSteps } from './getPipetteWizardSteps' @@ -44,10 +39,13 @@ import { Carriage } from './Carriage' import { MountingPlate } from './MountingPlate' import { UnskippableModal } from './UnskippableModal' -import type { PipetteMount } from '@opentrons/shared-data' +import type { + LoadedPipette, + CreateCommand, + PipetteMount, +} from '@opentrons/shared-data' import type { CommandData, HostConfig } from '@opentrons/api-client' import type { PipetteWizardFlow, SelectablePipettes } from './types' -import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' const RUN_REFETCH_INTERVAL = 5000 diff --git a/app/src/organisms/PipetteWizardFlows/types.ts b/app/src/organisms/PipetteWizardFlows/types.ts index f658406e3e3..587e7d84e1f 100644 --- a/app/src/organisms/PipetteWizardFlows/types.ts +++ b/app/src/organisms/PipetteWizardFlows/types.ts @@ -1,7 +1,6 @@ -import { SECTIONS, FLOWS } from './constants' -import { useCreateCommandMutation } from '@opentrons/react-api-client' -import { PipetteMount } from '@opentrons/shared-data' -import type { CreateCommand } from '@opentrons/shared-data' +import type { SECTIONS, FLOWS } from './constants' +import type { useCreateCommandMutation } from '@opentrons/react-api-client' +import type { PipetteMount, CreateCommand } from '@opentrons/shared-data' import type { AttachedPipettesFromInstrumentsQuery } from '../Devices/hooks/useAttachedPipettesFromInstrumentsQuery' export type PipetteWizardStep = diff --git a/app/src/organisms/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx b/app/src/organisms/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx index 18c678d74e6..4ecc5232456 100644 --- a/app/src/organisms/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx +++ b/app/src/organisms/ProtocolSetupDeckConfiguration/__tests__/ProtocolSetupDeckConfiguration.test.tsx @@ -20,7 +20,7 @@ import type { CompletedProtocolAnalysis, DeckConfiguration, } from '@opentrons/shared-data' -import { Modules } from '@opentrons/api-client' +import type { Modules } from '@opentrons/api-client' vi.mock('@opentrons/components/src/hardware-sim/BaseDeck/index') vi.mock('@opentrons/react-api-client') diff --git a/app/src/organisms/ProtocolSetupInstruments/utils.ts b/app/src/organisms/ProtocolSetupInstruments/utils.ts index 45682415bc7..1ce77275e74 100644 --- a/app/src/organisms/ProtocolSetupInstruments/utils.ts +++ b/app/src/organisms/ProtocolSetupInstruments/utils.ts @@ -3,7 +3,11 @@ import type { LoadedPipette, ProtocolAnalysisOutput, } from '@opentrons/shared-data' -import { GripperData, Instruments, PipetteData } from '@opentrons/api-client' +import type { + GripperData, + Instruments, + PipetteData, +} from '@opentrons/api-client' export function getProtocolUsesGripper( analysis: CompletedProtocolAnalysis | ProtocolAnalysisOutput diff --git a/app/src/organisms/ProtocolSetupLabware/LabwareMapViewModal.tsx b/app/src/organisms/ProtocolSetupLabware/LabwareMapViewModal.tsx index efd97cb14ed..e4b353944d2 100644 --- a/app/src/organisms/ProtocolSetupLabware/LabwareMapViewModal.tsx +++ b/app/src/organisms/ProtocolSetupLabware/LabwareMapViewModal.tsx @@ -11,7 +11,6 @@ import { import { Modal } from '../../molecules/Modal' import { getStandardDeckViewLayerBlockList } from '../Devices/ProtocolRun/utils/getStandardDeckViewLayerBlockList' import { getLabwareRenderInfo } from '../Devices/ProtocolRun/utils/getLabwareRenderInfo' -import { AttachedProtocolModuleMatch } from '../ProtocolSetupModulesAndDeck/utils' import type { CompletedProtocolAnalysis, @@ -20,6 +19,7 @@ import type { } from '@opentrons/shared-data' import type { LoadedLabwareByAdapter } from '@opentrons/api-client' import type { ModalHeaderBaseProps } from '../../molecules/Modal/types' +import type { AttachedProtocolModuleMatch } from '../ProtocolSetupModulesAndDeck/utils' interface LabwareMapViewModalProps { attachedProtocolModuleMatches: AttachedProtocolModuleMatch[] diff --git a/app/src/organisms/ProtocolSetupLabware/__tests__/LabwareMapViewModal.test.tsx b/app/src/organisms/ProtocolSetupLabware/__tests__/LabwareMapViewModal.test.tsx index 52c17cd31ca..8a76e5703fe 100644 --- a/app/src/organisms/ProtocolSetupLabware/__tests__/LabwareMapViewModal.test.tsx +++ b/app/src/organisms/ProtocolSetupLabware/__tests__/LabwareMapViewModal.test.tsx @@ -7,7 +7,6 @@ import { describe, it, vi, beforeEach, afterEach, expect } from 'vitest' import { BaseDeck, EXTENDED_DECK_CONFIG_FIXTURE } from '@opentrons/components' import { FLEX_ROBOT_TYPE, - getSimplestDeckConfigForProtocol, deckExample as deckDefFixture, fixtureTiprack300ul, } from '@opentrons/shared-data' @@ -20,6 +19,7 @@ import { mockProtocolModuleInfo } from '../__fixtures__' import { LabwareMapViewModal } from '../LabwareMapViewModal' import type { + getSimplestDeckConfigForProtocol, CompletedProtocolAnalysis, DeckDefinition, LabwareDefinition2, diff --git a/app/src/organisms/ProtocolSetupLabware/index.tsx b/app/src/organisms/ProtocolSetupLabware/index.tsx index 831d0a57962..e1dbcae4911 100644 --- a/app/src/organisms/ProtocolSetupLabware/index.tsx +++ b/app/src/organisms/ProtocolSetupLabware/index.tsx @@ -28,8 +28,6 @@ import { getLabwareDefURI, getLabwareDisplayName, HEATERSHAKER_MODULE_TYPE, - LoadLabwareRunTimeCommand, - RunTimeCommand, } from '@opentrons/shared-data' import { parseInitialLoadedLabwareByAdapter } from '@opentrons/api-client' import { @@ -46,10 +44,7 @@ import { useMostRecentCompletedAnalysis } from '../LabwarePositionCheck/useMostR import { getLabwareSetupItemGroups } from '../../pages/Protocols/utils' import { getProtocolModulesInfo } from '../Devices/ProtocolRun/utils/getProtocolModulesInfo' import { getAttachedProtocolModuleMatches } from '../ProtocolSetupModulesAndDeck/utils' -import { - getNestedLabwareInfo, - NestedLabwareInfo, -} from '../Devices/ProtocolRun/SetupLabware/getNestedLabwareInfo' +import { getNestedLabwareInfo } from '../Devices/ProtocolRun/SetupLabware/getNestedLabwareInfo' import { LabwareMapViewModal } from './LabwareMapViewModal' import { useNotifyDeckConfigurationQuery } from '../../resources/deck_configuration' @@ -59,10 +54,13 @@ import type { HeaterShakerOpenLatchCreateCommand, LabwareDefinition2, LabwareLocation, + LoadLabwareRunTimeCommand, + RunTimeCommand, } from '@opentrons/shared-data' import type { HeaterShakerModule, Modules } from '@opentrons/api-client' import type { LabwareSetupItem } from '../../pages/Protocols/utils' import type { SetupScreens } from '../../pages/ProtocolSetup' +import type { NestedLabwareInfo } from '../Devices/ProtocolRun/SetupLabware/getNestedLabwareInfo' import type { AttachedProtocolModuleMatch } from '../ProtocolSetupModulesAndDeck/utils' const MODULE_REFETCH_INTERVAL_MS = 5000 diff --git a/app/src/organisms/ProtocolSetupLiquids/index.tsx b/app/src/organisms/ProtocolSetupLiquids/index.tsx index 2e705d279b2..af886000ab2 100644 --- a/app/src/organisms/ProtocolSetupLiquids/index.tsx +++ b/app/src/organisms/ProtocolSetupLiquids/index.tsx @@ -16,11 +16,12 @@ import { parseLiquidsInLoadOrder, parseLabwareInfoByLiquidId, } from '@opentrons/api-client' -import { MICRO_LITERS, RunTimeCommand } from '@opentrons/shared-data' +import { MICRO_LITERS } from '@opentrons/shared-data' import { ODDBackButton } from '../../molecules/ODDBackButton' import { useMostRecentCompletedAnalysis } from '../LabwarePositionCheck/useMostRecentCompletedAnalysis' import { getTotalVolumePerLiquidId } from '../Devices/ProtocolRun/SetupLiquids/utils' import { LiquidDetails } from './LiquidDetails' +import type { RunTimeCommand } from '@opentrons/shared-data' import type { ParsedLiquid } from '@opentrons/api-client' import type { SetupScreens } from '../../pages/ProtocolSetup' diff --git a/app/src/organisms/ProtocolSetupModulesAndDeck/__tests__/ProtocolSetupModulesAndDeck.test.tsx b/app/src/organisms/ProtocolSetupModulesAndDeck/__tests__/ProtocolSetupModulesAndDeck.test.tsx index e2bd427d691..8154768b9c8 100644 --- a/app/src/organisms/ProtocolSetupModulesAndDeck/__tests__/ProtocolSetupModulesAndDeck.test.tsx +++ b/app/src/organisms/ProtocolSetupModulesAndDeck/__tests__/ProtocolSetupModulesAndDeck.test.tsx @@ -1,10 +1,10 @@ import * as React from 'react' -import { UseQueryResult } from 'react-query' import { fireEvent, screen, waitFor } from '@testing-library/react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { MemoryRouter } from 'react-router-dom' +import { RUN_STATUS_IDLE } from '@opentrons/api-client' import { FLEX_ROBOT_TYPE, WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, @@ -39,7 +39,7 @@ import { useNotifyDeckConfigurationQuery } from '../../../resources/deck_configu import { useRunStatus } from '../../RunTimeControl/hooks' import type { CutoutConfig, DeckConfiguration } from '@opentrons/shared-data' -import { RUN_STATUS_IDLE } from '@opentrons/api-client' +import type { UseQueryResult } from 'react-query' vi.mock('../../../resources/runs') vi.mock('../../../redux/discovery') diff --git a/app/src/organisms/ProtocolSetupModulesAndDeck/utils.ts b/app/src/organisms/ProtocolSetupModulesAndDeck/utils.ts index cc921ef6049..0608751fd0f 100644 --- a/app/src/organisms/ProtocolSetupModulesAndDeck/utils.ts +++ b/app/src/organisms/ProtocolSetupModulesAndDeck/utils.ts @@ -1,5 +1,4 @@ import { - DeckConfiguration, FLEX_ROBOT_TYPE, NON_CONNECTING_MODULE_TYPES, checkModuleCompatibility, @@ -9,6 +8,7 @@ import { getModuleType, } from '@opentrons/shared-data' +import type { DeckConfiguration } from '@opentrons/shared-data' import type { ProtocolModuleInfo } from '../../organisms/Devices/ProtocolRun/utils/getProtocolModulesInfo' import type { AttachedModule } from '../../redux/modules/types' diff --git a/app/src/organisms/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx b/app/src/organisms/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx index ec2eb28a81c..46659717788 100644 --- a/app/src/organisms/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx +++ b/app/src/organisms/ProtocolSetupParameters/__tests__/ResetValuesModal.test.tsx @@ -5,7 +5,7 @@ import { fireEvent, screen } from '@testing-library/react' import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { ResetValuesModal } from '../ResetValuesModal' -import { RunTimeParameter } from '@opentrons/shared-data' +import type { RunTimeParameter } from '@opentrons/shared-data' const mockGoBack = vi.fn() const mockSetRunTimeParametersOverrides = vi.fn() diff --git a/app/src/organisms/ProtocolsLanding/ProtocolCard.tsx b/app/src/organisms/ProtocolsLanding/ProtocolCard.tsx index 89658e81ef4..585aaa2277b 100644 --- a/app/src/organisms/ProtocolsLanding/ProtocolCard.tsx +++ b/app/src/organisms/ProtocolsLanding/ProtocolCard.tsx @@ -8,7 +8,6 @@ import { ErrorBoundary } from 'react-error-boundary' import { getModuleType, getPipetteNameSpecs, - ProtocolAnalysisOutput, FLEX_STANDARD_MODEL, getGripperDisplayName, } from '@opentrons/shared-data' @@ -42,6 +41,7 @@ import { getIsProtocolAnalysisInProgress } from '../../redux/protocol-storage' import { InstrumentContainer } from '../../atoms/InstrumentContainer' import { ProtocolOverflowMenu } from './ProtocolOverflowMenu' import { ProtocolAnalysisFailure } from '../ProtocolAnalysisFailure' +import { getProtocolUsesGripper } from '../ProtocolSetupInstruments/utils' import { ProtocolAnalysisStale } from '../ProtocolAnalysisFailure/ProtocolAnalysisStale' import { getAnalysisStatus, @@ -49,9 +49,9 @@ import { getRobotTypeDisplayName, } from './utils' +import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' import type { StoredProtocolData } from '../../redux/protocol-storage' import type { State } from '../../redux/types' -import { getProtocolUsesGripper } from '../ProtocolSetupInstruments/utils' interface ProtocolCardProps { handleRunProtocol: (storedProtocolData: StoredProtocolData) => void diff --git a/app/src/organisms/ProtocolsLanding/__tests__/hooks.test.tsx b/app/src/organisms/ProtocolsLanding/__tests__/hooks.test.tsx index cfba2402172..629cb692ff0 100644 --- a/app/src/organisms/ProtocolsLanding/__tests__/hooks.test.tsx +++ b/app/src/organisms/ProtocolsLanding/__tests__/hooks.test.tsx @@ -7,10 +7,10 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { useSortedProtocols } from '../hooks' -import { StoredProtocolData } from '../../../redux/protocol-storage' import type { Store } from 'redux' import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' +import type { StoredProtocolData } from '../../../redux/protocol-storage' import type { State } from '../../../redux/types' const mockStoredProtocolData = [ diff --git a/app/src/organisms/ProtocolsLanding/hooks.tsx b/app/src/organisms/ProtocolsLanding/hooks.tsx index dcdc9c528c9..c067cd34f98 100644 --- a/app/src/organisms/ProtocolsLanding/hooks.tsx +++ b/app/src/organisms/ProtocolsLanding/hooks.tsx @@ -1,6 +1,6 @@ import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' -import { StoredProtocolData } from '../../redux/protocol-storage' import { getProtocolDisplayName } from './utils' +import type { StoredProtocolData } from '../../redux/protocol-storage' export type ProtocolSort = | 'alphabetical' diff --git a/app/src/organisms/QuickTransferFlow/CreateNewTransfer.tsx b/app/src/organisms/QuickTransferFlow/CreateNewTransfer.tsx index 5d622577313..c6f4986febc 100644 --- a/app/src/organisms/QuickTransferFlow/CreateNewTransfer.tsx +++ b/app/src/organisms/QuickTransferFlow/CreateNewTransfer.tsx @@ -10,9 +10,9 @@ import { DIRECTION_COLUMN, } from '@opentrons/components' -import { SmallButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' import { useNotifyDeckConfigurationQuery } from '../../resources/deck_configuration' +import type { SmallButton } from '../../atoms/buttons' interface CreateNewTransferProps { onNext: () => void diff --git a/app/src/organisms/QuickTransferFlow/SelectDestLabware.tsx b/app/src/organisms/QuickTransferFlow/SelectDestLabware.tsx index 06ec18184bf..c5722fba863 100644 --- a/app/src/organisms/QuickTransferFlow/SelectDestLabware.tsx +++ b/app/src/organisms/QuickTransferFlow/SelectDestLabware.tsx @@ -10,16 +10,17 @@ import { ALIGN_CENTER, } from '@opentrons/components' -import { SmallButton, LargeButton, TabbedButton } from '../../atoms/buttons' +import { LargeButton, TabbedButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' import { getCompatibleLabwareByCategory } from './utils' import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { SmallButton } from '../../atoms/buttons' +import type { LabwareFilter } from '../../pages/Labware/types' import type { QuickTransferSetupState, QuickTransferWizardAction, } from './types' -import { LabwareFilter } from '../../pages/Labware/types' interface SelectDestLabwareProps { onNext: () => void diff --git a/app/src/organisms/QuickTransferFlow/SelectDestWells.tsx b/app/src/organisms/QuickTransferFlow/SelectDestWells.tsx index 39ef17cffe9..beef6d55e39 100644 --- a/app/src/organisms/QuickTransferFlow/SelectDestWells.tsx +++ b/app/src/organisms/QuickTransferFlow/SelectDestWells.tsx @@ -2,9 +2,9 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { Flex, SPACING } from '@opentrons/components' -import { SmallButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' +import type { SmallButton } from '../../atoms/buttons' import type { QuickTransferSetupState, QuickTransferWizardAction, diff --git a/app/src/organisms/QuickTransferFlow/SelectPipette.tsx b/app/src/organisms/QuickTransferFlow/SelectPipette.tsx index 6ef31157fdf..152bdf1d7aa 100644 --- a/app/src/organisms/QuickTransferFlow/SelectPipette.tsx +++ b/app/src/organisms/QuickTransferFlow/SelectPipette.tsx @@ -9,10 +9,11 @@ import { } from '@opentrons/components' import { useInstrumentsQuery } from '@opentrons/react-api-client' import { getPipetteSpecsV2, RIGHT, LEFT } from '@opentrons/shared-data' -import { SmallButton, LargeButton } from '../../atoms/buttons' +import { LargeButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' import type { PipetteData, Mount } from '@opentrons/api-client' +import type { SmallButton } from '../../atoms/buttons' import type { QuickTransferSetupState, QuickTransferWizardAction, diff --git a/app/src/organisms/QuickTransferFlow/SelectSourceLabware.tsx b/app/src/organisms/QuickTransferFlow/SelectSourceLabware.tsx index 5c2889b91f7..21b98cb44fd 100644 --- a/app/src/organisms/QuickTransferFlow/SelectSourceLabware.tsx +++ b/app/src/organisms/QuickTransferFlow/SelectSourceLabware.tsx @@ -10,16 +10,17 @@ import { ALIGN_CENTER, } from '@opentrons/components' -import { SmallButton, LargeButton, TabbedButton } from '../../atoms/buttons' +import { LargeButton, TabbedButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' import { getCompatibleLabwareByCategory } from './utils' import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { SmallButton } from '../../atoms/buttons' +import type { LabwareFilter } from '../../pages/Labware/types' import type { QuickTransferSetupState, QuickTransferWizardAction, } from './types' -import { LabwareFilter } from '../../pages/Labware/types' interface SelectSourceLabwareProps { onNext: () => void diff --git a/app/src/organisms/QuickTransferFlow/SelectSourceWells.tsx b/app/src/organisms/QuickTransferFlow/SelectSourceWells.tsx index 1cdc2b75595..cd82278a66b 100644 --- a/app/src/organisms/QuickTransferFlow/SelectSourceWells.tsx +++ b/app/src/organisms/QuickTransferFlow/SelectSourceWells.tsx @@ -2,9 +2,9 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { Flex, SPACING } from '@opentrons/components' -import { SmallButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' +import type { SmallButton } from '../../atoms/buttons' import type { QuickTransferSetupState, QuickTransferWizardAction, diff --git a/app/src/organisms/QuickTransferFlow/SelectTipRack.tsx b/app/src/organisms/QuickTransferFlow/SelectTipRack.tsx index ec5e3cad0e0..462e13d1eae 100644 --- a/app/src/organisms/QuickTransferFlow/SelectTipRack.tsx +++ b/app/src/organisms/QuickTransferFlow/SelectTipRack.tsx @@ -2,10 +2,11 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { Flex, SPACING, DIRECTION_COLUMN } from '@opentrons/components' import { getAllDefinitions } from '@opentrons/shared-data' -import { SmallButton, LargeButton } from '../../atoms/buttons' +import { LargeButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { SmallButton } from '../../atoms/buttons' import type { QuickTransferSetupState, QuickTransferWizardAction, diff --git a/app/src/organisms/QuickTransferFlow/SummaryAndSettings.tsx b/app/src/organisms/QuickTransferFlow/SummaryAndSettings.tsx index d59bef773cb..3cfd0063a68 100644 --- a/app/src/organisms/QuickTransferFlow/SummaryAndSettings.tsx +++ b/app/src/organisms/QuickTransferFlow/SummaryAndSettings.tsx @@ -10,10 +10,11 @@ import { ALIGN_CENTER, } from '@opentrons/components' -import { SmallButton, TabbedButton } from '../../atoms/buttons' +import { TabbedButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' import { Overview } from './Overview' +import type { SmallButton } from '../../atoms/buttons' import type { QuickTransferSetupState } from './types' interface SummaryAndSettingsProps { diff --git a/app/src/organisms/QuickTransferFlow/VolumeEntry.tsx b/app/src/organisms/QuickTransferFlow/VolumeEntry.tsx index e2ce14ee42e..ef2ed8d271d 100644 --- a/app/src/organisms/QuickTransferFlow/VolumeEntry.tsx +++ b/app/src/organisms/QuickTransferFlow/VolumeEntry.tsx @@ -7,13 +7,13 @@ import { ALIGN_CENTER, } from '@opentrons/components' -import { SmallButton } from '../../atoms/buttons' import { ChildNavigation } from '../ChildNavigation' import { InputField } from '../../atoms/InputField' import { NumericalKeyboard } from '../../atoms/SoftwareKeyboard' import { getVolumeLimits } from './utils' import { CONSOLIDATE, DISTRIBUTE } from './constants' +import type { SmallButton } from '../../atoms/buttons' import type { QuickTransferSetupState, QuickTransferWizardAction, diff --git a/app/src/organisms/QuickTransferFlow/index.tsx b/app/src/organisms/QuickTransferFlow/index.tsx index e8627a373f9..d95c54bd84f 100644 --- a/app/src/organisms/QuickTransferFlow/index.tsx +++ b/app/src/organisms/QuickTransferFlow/index.tsx @@ -6,7 +6,6 @@ import { StepMeter, POSITION_STICKY, } from '@opentrons/components' -import { SmallButton } from '../../atoms/buttons' import { ConfirmExitModal } from './ConfirmExitModal' import { CreateNewTransfer } from './CreateNewTransfer' import { SelectPipette } from './SelectPipette' @@ -19,6 +18,7 @@ import { VolumeEntry } from './VolumeEntry' import { SummaryAndSettings } from './SummaryAndSettings' import { quickTransferReducer } from './utils' +import type { SmallButton } from '../../atoms/buttons' import type { QuickTransferSetupState } from './types' const QUICK_TRANSFER_WIZARD_STEPS = 8 diff --git a/app/src/organisms/QuickTransferFlow/types.ts b/app/src/organisms/QuickTransferFlow/types.ts index e6743428d64..ad6e647021d 100644 --- a/app/src/organisms/QuickTransferFlow/types.ts +++ b/app/src/organisms/QuickTransferFlow/types.ts @@ -1,6 +1,6 @@ -import { ACTIONS, CONSOLIDATE, DISTRIBUTE, TRANSFER } from './constants' import type { Mount } from '@opentrons/api-client' import type { LabwareDefinition2, PipetteV2Specs } from '@opentrons/shared-data' +import type { ACTIONS, CONSOLIDATE, DISTRIBUTE, TRANSFER } from './constants' export interface QuickTransferSetupState { pipette?: PipetteV2Specs diff --git a/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/OverflowMenu.tsx b/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/OverflowMenu.tsx index b127dcbb669..d6048011a57 100644 --- a/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/OverflowMenu.tsx +++ b/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/OverflowMenu.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { saveAs } from 'file-saver' +import { css } from 'styled-components' import { Flex, @@ -10,7 +11,6 @@ import { DIRECTION_COLUMN, POSITION_RELATIVE, ALIGN_FLEX_END, - Mount, useOnClickOutside, } from '@opentrons/components' import { isFlexPipette, SINGLE_MOUNT_PIPETTES } from '@opentrons/shared-data' @@ -36,10 +36,10 @@ import { PipetteWizardFlows } from '../../PipetteWizardFlows' import { FLOWS } from '../../PipetteWizardFlows/constants' import { useIsEstopNotDisengaged } from '../../../resources/devices/hooks/useIsEstopNotDisengaged' +import type { Mount } from '@opentrons/components' import type { PipetteName } from '@opentrons/shared-data' import type { DeleteCalRequestParams } from '@opentrons/api-client' import type { SelectablePipettes } from '../../PipetteWizardFlows/types' -import { css } from 'styled-components' interface OverflowMenuProps { calType: 'pipetteOffset' | 'tipLength' @@ -74,7 +74,9 @@ export function OverflowMenu({ } = useMenuHandleClickOutside() const calsOverflowWrapperRef = useOnClickOutside({ - onClickOutside: () => setShowOverflowMenu(false), + onClickOutside: () => { + setShowOverflowMenu(false) + }, }) const pipetteOffsetCalibrations = useAllPipetteOffsetCalibrationsQuery().data ?.data @@ -184,7 +186,9 @@ export function OverflowMenu({ setShowPipetteWizardFlows(false)} + closeFlow={() => { + setShowPipetteWizardFlows(false) + }} selectedPipette={selectedPipette} onComplete={() => { setSelectedPipette(SINGLE_MOUNT_PIPETTES) diff --git a/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx b/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx index 638c51fb7e3..f35f4d64997 100644 --- a/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx +++ b/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/OverflowMenu.test.tsx @@ -4,7 +4,6 @@ import { when } from 'vitest-when' import '@testing-library/jest-dom/vitest' import { describe, it, expect, vi, beforeEach } from 'vitest' import { OT3_PIPETTES } from '@opentrons/shared-data' -import { Mount } from '@opentrons/components' import { useDeleteCalibrationMutation, useAllPipetteOffsetCalibrationsQuery, @@ -28,6 +27,7 @@ import { import { renderWithProviders } from '../../../../__testing-utils__' import { useIsEstopNotDisengaged } from '../../../../resources/devices/hooks/useIsEstopNotDisengaged' import { OverflowMenu } from '../OverflowMenu' +import type { Mount } from '@opentrons/components' const render = ( props: React.ComponentProps diff --git a/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx b/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx index df6f0de2089..39bcde401d0 100644 --- a/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx +++ b/app/src/organisms/RobotSettingsCalibration/CalibrationDetails/__tests__/TipLengthCalibrationItems.test.tsx @@ -2,11 +2,11 @@ import * as React from 'react' import { screen } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' -import { Mount } from '@opentrons/components' import { i18n } from '../../../../i18n' import { renderWithProviders } from '../../../../__testing-utils__' import { TipLengthCalibrationItems } from '../TipLengthCalibrationItems' import { OverflowMenu } from '../OverflowMenu' +import type { Mount } from '@opentrons/components' vi.mock('../../../../redux/custom-labware/selectors') vi.mock('../../../../redux/config') diff --git a/app/src/organisms/RobotSettingsCalibration/RobotSettingsTipLengthCalibration.tsx b/app/src/organisms/RobotSettingsCalibration/RobotSettingsTipLengthCalibration.tsx index 00983365695..721568d38c0 100644 --- a/app/src/organisms/RobotSettingsCalibration/RobotSettingsTipLengthCalibration.tsx +++ b/app/src/organisms/RobotSettingsCalibration/RobotSettingsTipLengthCalibration.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' +import { getLabwareDefURI } from '@opentrons/shared-data' import { DIRECTION_COLUMN, Flex, @@ -11,12 +12,12 @@ import { import { useAllTipLengthCalibrationsQuery } from '@opentrons/react-api-client' import { useAttachedPipettes } from '../../organisms/Devices/hooks' +import { getDefaultTiprackDefForPipetteName } from '../Devices/constants' import { TipLengthCalibrationItems } from './CalibrationDetails/TipLengthCalibrationItems' +import type { PipetteName } from '@opentrons/shared-data' import type { FormattedPipetteOffsetCalibration } from '.' -import { TipLengthCalibration } from '../../redux/calibration/api-types' -import { getDefaultTiprackDefForPipetteName } from '../Devices/constants' -import { getLabwareDefURI, PipetteName } from '@opentrons/shared-data' +import type { TipLengthCalibration } from '../../redux/calibration/api-types' interface RobotSettingsTipLengthCalibrationProps { formattedPipetteOffsetCalibrations: FormattedPipetteOffsetCalibration[] diff --git a/app/src/organisms/RunPreview/CommandIcon.tsx b/app/src/organisms/RunPreview/CommandIcon.tsx index b9314718c68..a2b3a00c592 100644 --- a/app/src/organisms/RunPreview/CommandIcon.tsx +++ b/app/src/organisms/RunPreview/CommandIcon.tsx @@ -1,7 +1,7 @@ import * as React from 'react' -import { Icon, IconName } from '@opentrons/components' -import { RunTimeCommand } from '@opentrons/shared-data' -import type { StyleProps } from '@opentrons/components' +import { Icon } from '@opentrons/components' +import type { IconName, StyleProps } from '@opentrons/components' +import type { RunTimeCommand } from '@opentrons/shared-data' const ICON_BY_COMMAND_TYPE: { [commandType: string]: IconName } = { delay: 'pause-circle', diff --git a/app/src/organisms/RunPreview/index.tsx b/app/src/organisms/RunPreview/index.tsx index efc716a5738..9c7b535fe38 100644 --- a/app/src/organisms/RunPreview/index.tsx +++ b/app/src/organisms/RunPreview/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { css } from 'styled-components' import { useTranslation } from 'react-i18next' -import { ViewportList, ViewportListRef } from 'react-viewport-list' +import { ViewportList } from 'react-viewport-list' import { RUN_STATUSES_TERMINAL } from '@opentrons/api-client' import { @@ -32,6 +32,7 @@ import { useRunStatus } from '../RunTimeControl/hooks' import { getCommandTextData } from '../CommandText/utils/getCommandTextData' import { useLastRunCommand } from '../Devices/hooks/useLastRunCommand' +import type { ViewportListRef } from 'react-viewport-list' import type { RunStatus } from '@opentrons/api-client' import type { RobotType } from '@opentrons/shared-data' diff --git a/app/src/organisms/RunProgressMeter/__tests__/RunProgressMeter.test.tsx b/app/src/organisms/RunProgressMeter/__tests__/RunProgressMeter.test.tsx index 9bb8140ecbf..77eeada15ba 100644 --- a/app/src/organisms/RunProgressMeter/__tests__/RunProgressMeter.test.tsx +++ b/app/src/organisms/RunProgressMeter/__tests__/RunProgressMeter.test.tsx @@ -9,7 +9,6 @@ import { RUN_STATUS_IDLE, RUN_STATUS_RUNNING, RUN_STATUS_SUCCEEDED, - RunCommandSummary, } from '@opentrons/api-client' import { i18n } from '../../../i18n' @@ -36,6 +35,7 @@ import { RunProgressMeter } from '..' import { renderWithProviders } from '../../../__testing-utils__' import { useLastRunCommand } from '../../Devices/hooks/useLastRunCommand' +import type { RunCommandSummary } from '@opentrons/api-client' import type * as ApiClient from '@opentrons/react-api-client' vi.mock('@opentrons/react-api-client', async importOriginal => { diff --git a/app/src/organisms/RunTimeControl/__tests__/hooks.test.tsx b/app/src/organisms/RunTimeControl/__tests__/hooks.test.tsx index a46bc37d865..7d4ef55ab2b 100644 --- a/app/src/organisms/RunTimeControl/__tests__/hooks.test.tsx +++ b/app/src/organisms/RunTimeControl/__tests__/hooks.test.tsx @@ -1,5 +1,4 @@ import { when } from 'vitest-when' -import { UseQueryResult } from 'react-query' import { act, renderHook } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import '@testing-library/jest-dom/vitest' @@ -31,6 +30,7 @@ import { mockCommand, } from '../__fixtures__' +import type { UseQueryResult } from 'react-query' import type { Run } from '@opentrons/api-client' import type * as ApiClient from '@opentrons/react-api-client' diff --git a/app/src/organisms/RunTimeControl/utils.ts b/app/src/organisms/RunTimeControl/utils.ts index 91cfee88a4b..e95efcaf164 100644 --- a/app/src/organisms/RunTimeControl/utils.ts +++ b/app/src/organisms/RunTimeControl/utils.ts @@ -1,5 +1,6 @@ -import { intervalToDuration, Duration } from 'date-fns' +import { intervalToDuration } from 'date-fns' import padStart from 'lodash/padStart' +import type { Duration } from 'date-fns' /** * utility to format a date-fns duration object to hh:mm:ss diff --git a/app/src/organisms/SendProtocolToFlexSlideout/index.tsx b/app/src/organisms/SendProtocolToFlexSlideout/index.tsx index 883a264b78c..4695cb7652c 100644 --- a/app/src/organisms/SendProtocolToFlexSlideout/index.tsx +++ b/app/src/organisms/SendProtocolToFlexSlideout/index.tsx @@ -6,7 +6,7 @@ import { useCreateProtocolMutation } from '@opentrons/react-api-client' import { FLEX_DISPLAY_NAME, FLEX_ROBOT_TYPE } from '@opentrons/shared-data' -import { PrimaryButton, IconProps, StyleProps } from '@opentrons/components' +import { PrimaryButton } from '@opentrons/components' import { ERROR_TOAST, INFO_TOAST, SUCCESS_TOAST } from '../../atoms/Toast' import { ChooseRobotSlideout } from '../../organisms/ChooseRobotSlideout' import { @@ -17,13 +17,14 @@ import { useToaster } from '../../organisms/ToasterOven' import { appShellRequestor } from '../../redux/shell/remote' import { OPENTRONS_USB } from '../../redux/discovery' import { getIsProtocolAnalysisInProgress } from '../../redux/protocol-storage' +import { getRobotUpdateDisplayInfo } from '../../redux/robot-update' +import { getValidCustomLabwareFiles } from '../../redux/custom-labware' import type { AxiosError } from 'axios' -import { getRobotUpdateDisplayInfo } from '../../redux/robot-update' +import type { IconProps, StyleProps } from '@opentrons/components' import type { Robot } from '../../redux/discovery/types' import type { StoredProtocolData } from '../../redux/protocol-storage' import type { State } from '../../redux/types' -import { getValidCustomLabwareFiles } from '../../redux/custom-labware' const _getFileBaseName = (filePath: string): string => { return filePath.split('/').reverse()[0] diff --git a/app/src/organisms/UpdateAppModal/__tests__/UpdateAppModal.test.tsx b/app/src/organisms/UpdateAppModal/__tests__/UpdateAppModal.test.tsx index 440ddca0f42..95681e4a661 100644 --- a/app/src/organisms/UpdateAppModal/__tests__/UpdateAppModal.test.tsx +++ b/app/src/organisms/UpdateAppModal/__tests__/UpdateAppModal.test.tsx @@ -7,12 +7,13 @@ import { i18n } from '../../../i18n' import * as Shell from '../../../redux/shell' import { renderWithProviders } from '../../../__testing-utils__' import { useRemoveActiveAppUpdateToast } from '../../Alerts' -import { UpdateAppModal, UpdateAppModalProps, RELEASE_NOTES_URL_BASE } from '..' +import { UpdateAppModal, RELEASE_NOTES_URL_BASE } from '..' import type { State } from '../../../redux/types' import type { ShellUpdateState } from '../../../redux/shell/types' import type * as ShellState from '../../../redux/shell' import type * as Dom from 'react-router-dom' +import type { UpdateAppModalProps } from '..' vi.mock('../../../redux/shell/update', async importOriginal => { const actual = await importOriginal() diff --git a/app/src/pages/DeckConfiguration/index.tsx b/app/src/pages/DeckConfiguration/index.tsx index 2c90d5249b8..a14ddfb14b3 100644 --- a/app/src/pages/DeckConfiguration/index.tsx +++ b/app/src/pages/DeckConfiguration/index.tsx @@ -22,7 +22,6 @@ import { FLEX_ROBOT_TYPE, } from '@opentrons/shared-data' -import { SmallButton } from '../../atoms/buttons' import { ChildNavigation } from '../../organisms/ChildNavigation' import { AddFixtureModal } from '../../organisms/DeviceDetailsDeckConfiguration/AddFixtureModal' import { DeckFixtureSetupInstructionsModal } from '../../organisms/DeviceDetailsDeckConfiguration/DeckFixtureSetupInstructionsModal' @@ -35,6 +34,7 @@ import type { CutoutId, DeckConfiguration, } from '@opentrons/shared-data' +import type { SmallButton } from '../../atoms/buttons' export function DeckConfigurationEditor(): JSX.Element { const { t, i18n } = useTranslation([ diff --git a/app/src/pages/Devices/ProtocolRunDetails/index.tsx b/app/src/pages/Devices/ProtocolRunDetails/index.tsx index 672c2231e31..2d92e3ae705 100644 --- a/app/src/pages/Devices/ProtocolRunDetails/index.tsx +++ b/app/src/pages/Devices/ProtocolRunDetails/index.tsx @@ -37,14 +37,14 @@ import { useCurrentRunId } from '../../../organisms/ProtocolUpload/hooks' import { OPENTRONS_USB } from '../../../redux/discovery' import { fetchProtocols } from '../../../redux/protocol-storage' import { appShellRequestor } from '../../../redux/shell/remote' +import { useMostRecentCompletedAnalysis } from '../../../organisms/LabwarePositionCheck/useMostRecentCompletedAnalysis' +import type { ViewportListRef } from 'react-viewport-list' import type { DesktopRouteParams, ProtocolRunDetailsTab, } from '../../../App/types' import type { Dispatch } from '../../../redux/types' -import { useMostRecentCompletedAnalysis } from '../../../organisms/LabwarePositionCheck/useMostRecentCompletedAnalysis' -import { ViewportListRef } from 'react-viewport-list' const baseRoundTabStyling = css` ${TYPOGRAPHY.pSemiBold} diff --git a/app/src/pages/Labware/__tests__/hooks.test.tsx b/app/src/pages/Labware/__tests__/hooks.test.tsx index 20173b0dbf0..23035d94cc3 100644 --- a/app/src/pages/Labware/__tests__/hooks.test.tsx +++ b/app/src/pages/Labware/__tests__/hooks.test.tsx @@ -21,7 +21,7 @@ import { useAllLabware, useLabwareFailure, useNewLabwareName } from '../hooks' import type { Store } from 'redux' import type { State } from '../../../redux/types' -import { FailedLabwareFile } from '../../../redux/custom-labware/types' +import type { FailedLabwareFile } from '../../../redux/custom-labware/types' vi.mock('../../../redux/custom-labware') vi.mock('../helpers/getAllDefs') diff --git a/app/src/pages/Labware/index.tsx b/app/src/pages/Labware/index.tsx index c5ba42a5dd8..ad05c61f9ee 100644 --- a/app/src/pages/Labware/index.tsx +++ b/app/src/pages/Labware/index.tsx @@ -34,15 +34,11 @@ import { LabwareCard } from '../../organisms/LabwareCard' import { AddCustomLabwareSlideout } from '../../organisms/AddCustomLabwareSlideout' import { LabwareDetails } from '../../organisms/LabwareDetails' import { useToaster } from '../../organisms/ToasterOven' -import { - LabwareDefAndDate, - useAllLabware, - useLabwareFailure, - useNewLabwareName, -} from './hooks' +import { useAllLabware, useLabwareFailure, useNewLabwareName } from './hooks' import type { DropdownOption } from '../../atoms/MenuList/DropdownMenu' import type { LabwareFilter, LabwareSort } from './types' +import type { LabwareDefAndDate } from './hooks' const LABWARE_CREATOR_HREF = 'https://labware.opentrons.com/create/' const labwareDisplayCategoryFilters: LabwareFilter[] = [ diff --git a/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx index 22ee4ae1286..c12dcfa21fd 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/DeleteProtocolConfirmationModal.test.tsx @@ -3,18 +3,14 @@ import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { act, fireEvent, screen } from '@testing-library/react' -import { - getProtocol, - deleteProtocol, - deleteRun, - HostConfig, -} from '@opentrons/api-client' +import { getProtocol, deleteProtocol, deleteRun } from '@opentrons/api-client' import { renderWithProviders } from '../../../__testing-utils__' import { useHost, useProtocolQuery } from '@opentrons/react-api-client' import { i18n } from '../../../i18n' import { useToaster } from '../../../organisms/ToasterOven' import { DeleteProtocolConfirmationModal } from '../DeleteProtocolConfirmationModal' +import type { HostConfig } from '@opentrons/api-client' vi.mock('@opentrons/api-client') vi.mock('@opentrons/react-api-client') diff --git a/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx index e657b7bbdc5..d39e45c6947 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/LongPressModal.test.tsx @@ -5,13 +5,13 @@ import { MemoryRouter } from 'react-router-dom' import { fireEvent, renderHook } from '@testing-library/react' import { useLongPress } from '@opentrons/components' -import { HostConfig } from '@opentrons/api-client' import { useCreateRunMutation, useHost } from '@opentrons/react-api-client' import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { LongPressModal } from '../LongPressModal' +import type { HostConfig } from '@opentrons/api-client' import type { UseLongPressResult } from '@opentrons/components' const MOCK_HOST_CONFIG = {} as HostConfig diff --git a/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx b/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx index 040e00d640c..081a1d720cd 100644 --- a/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx +++ b/app/src/pages/ProtocolDashboard/__tests__/ProtocolCard.test.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import { vi, it, describe, expect, beforeEach } from 'vitest' import { act, fireEvent, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router-dom' -import { UseQueryResult } from 'react-query' import { useMostRecentSuccessfulAnalysisAsDocumentQuery, useProtocolAnalysisAsDocumentQuery, @@ -12,7 +11,7 @@ import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { ProtocolCard } from '../ProtocolCard' import type * as ReactRouterDom from 'react-router-dom' - +import type { UseQueryResult } from 'react-query' import type { CompletedProtocolAnalysis, ProtocolResource, diff --git a/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx b/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx index f6e665f63e3..af8f437e70c 100644 --- a/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/Liquids.test.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { vi, it, describe, beforeEach } from 'vitest' -import { UseQueryResult } from 'react-query' import { when } from 'vitest-when' import { useProtocolAnalysisAsDocumentQuery, @@ -9,12 +8,13 @@ import { import { parseLabwareInfoByLiquidId, parseLiquidsInLoadOrder, - Protocol, } from '@opentrons/api-client' import { renderWithProviders } from '../../../__testing-utils__' import { i18n } from '../../../i18n' import { Liquids } from '../Liquids' -import { CompletedProtocolAnalysis } from '@opentrons/shared-data' +import type { UseQueryResult } from 'react-query' +import type { Protocol } from '@opentrons/api-client' +import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' vi.mock('@opentrons/api-client') vi.mock('@opentrons/react-api-client') diff --git a/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx b/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx index 0e9226de0a8..59db6871691 100644 --- a/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx +++ b/app/src/pages/ProtocolDetails/__tests__/ProtocolDetails.test.tsx @@ -5,12 +5,7 @@ import { when } from 'vitest-when' import { Route, MemoryRouter } from 'react-router-dom' import '@testing-library/jest-dom/vitest' import { renderWithProviders } from '../../../__testing-utils__' -import { - deleteProtocol, - deleteRun, - getProtocol, - HostConfig, -} from '@opentrons/api-client' +import { deleteProtocol, deleteRun, getProtocol } from '@opentrons/api-client' import { useCreateRunMutation, useHost, @@ -33,6 +28,7 @@ import { Hardware } from '../Hardware' import { Labware } from '../Labware' import { Parameters } from '../Parameters' import { mockRunTimeParameterData } from '../fixtures' +import type { HostConfig } from '@opentrons/api-client' // Mock IntersectionObserver class IntersectionObserver { diff --git a/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx b/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx index 79e0e16a759..95cc478f7b6 100644 --- a/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx +++ b/app/src/pages/Protocols/hooks/__tests__/hooks.test.tsx @@ -1,5 +1,4 @@ import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' -import { UseQueryResult } from 'react-query' import { renderHook } from '@testing-library/react' import { when } from 'vitest-when' import omitBy from 'lodash/omitBy' @@ -11,10 +10,7 @@ import { useModulesQuery, } from '@opentrons/react-api-client' import { - CompletedProtocolAnalysis, - DeckConfiguration, FLEX_SIMPLEST_DECK_CONFIG, - LabwareDefinition2, WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE, fixtureTiprack300ul, } from '@opentrons/shared-data' @@ -24,9 +20,15 @@ import { useRunTimeParameters, } from '../index' import { useNotifyDeckConfigurationQuery } from '../../../../resources/deck_configuration/useNotifyDeckConfigurationQuery' +import { mockHeaterShaker } from '../../../../redux/modules/__fixtures__' +import type { UseQueryResult } from 'react-query' +import type { + CompletedProtocolAnalysis, + DeckConfiguration, + LabwareDefinition2, +} from '@opentrons/shared-data' import type { Protocol } from '@opentrons/api-client' -import { mockHeaterShaker } from '../../../../redux/modules/__fixtures__' vi.mock('@opentrons/react-api-client') vi.mock('../../../../organisms/Devices/hooks') diff --git a/app/src/pages/RobotDashboard/index.tsx b/app/src/pages/RobotDashboard/index.tsx index 2b4606d3812..86cb9b693f7 100644 --- a/app/src/pages/RobotDashboard/index.tsx +++ b/app/src/pages/RobotDashboard/index.tsx @@ -19,9 +19,9 @@ import { import { getOnDeviceDisplaySettings } from '../../redux/config' import { AnalyticsOptInModal } from './AnalyticsOptInModal' import { WelcomeModal } from './WelcomeModal' -import { RunData } from '@opentrons/api-client' import { ServerInitializing } from '../../organisms/OnDeviceDisplay/RobotDashboard/ServerInitializing' import { useNotifyAllRunsQuery } from '../../resources/runs' +import type { RunData } from '@opentrons/api-client' export const MAXIMUM_RECENT_RUN_PROTOCOLS = 8 diff --git a/app/src/redux/alerts/actions.ts b/app/src/redux/alerts/actions.ts index a1c169c4772..3439ea75703 100644 --- a/app/src/redux/alerts/actions.ts +++ b/app/src/redux/alerts/actions.ts @@ -1,6 +1,6 @@ import { addUniqueConfigValue, subtractConfigValue } from '../config' import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { AddUniqueConfigValueAction, diff --git a/app/src/redux/alerts/types.ts b/app/src/redux/alerts/types.ts index 9c6b1d54339..69a793ee672 100644 --- a/app/src/redux/alerts/types.ts +++ b/app/src/redux/alerts/types.ts @@ -1,4 +1,4 @@ -import { +import type { ALERT_U2E_DRIVER_OUTDATED, ALERT_APP_UPDATE_AVAILABLE, ALERT_TRIGGERED, diff --git a/app/src/redux/analytics/actions.ts b/app/src/redux/analytics/actions.ts index 8ae92b3ace1..c87e48dc078 100644 --- a/app/src/redux/analytics/actions.ts +++ b/app/src/redux/analytics/actions.ts @@ -1,8 +1,8 @@ // Actions for triggering analytics events that don't work well as epics looking // for unrelated events -import * as Types from './types' import * as Constants from './constants' +import type * as Types from './types' export const pipetteOffsetCalibrationStarted = ( mount: string, diff --git a/app/src/redux/analytics/types.ts b/app/src/redux/analytics/types.ts index 197660f7794..2d9b972f55b 100644 --- a/app/src/redux/analytics/types.ts +++ b/app/src/redux/analytics/types.ts @@ -1,12 +1,11 @@ -import { - ANALYTICS_PIPETTE_OFFSET_STARTED, - ANALYTICS_TIP_LENGTH_STARTED, -} from './constants' - import type { PipetteMount as Mount } from '@opentrons/shared-data' import type { CalibrationCheckComparisonsPerCalibration } from '../sessions/types' import type { DeckCalibrationStatus } from '../calibration/types' import type { ConfigV0 } from '../config/types' +import type { + ANALYTICS_PIPETTE_OFFSET_STARTED, + ANALYTICS_TIP_LENGTH_STARTED, +} from './constants' export type AnalyticsConfig = ConfigV0['analytics'] diff --git a/app/src/redux/calibration/__fixtures__/calibration-status.ts b/app/src/redux/calibration/__fixtures__/calibration-status.ts index 247d161fd26..0e765302a36 100644 --- a/app/src/redux/calibration/__fixtures__/calibration-status.ts +++ b/app/src/redux/calibration/__fixtures__/calibration-status.ts @@ -7,7 +7,7 @@ import { CALIBRATION_STATUS_PATH, DECK_CAL_STATUS_IDENTITY } from '../constants' import type { ResponseFixtures } from '../../robot-api/__fixtures__' import type { CalibrationStatus, ProtocolCalibrationStatus } from '../types' -import { DeckCalibrationData } from '@opentrons/api-client' +import type { DeckCalibrationData } from '@opentrons/api-client' export const mockCalibrationStatus: CalibrationStatus = { deckCalibration: { diff --git a/app/src/redux/calibration/actions.ts b/app/src/redux/calibration/actions.ts index de88eb16641..fff62325f6e 100644 --- a/app/src/redux/calibration/actions.ts +++ b/app/src/redux/calibration/actions.ts @@ -1,10 +1,10 @@ import { resetConfigValue, updateConfigValue } from '../config' +import * as Constants from './constants' import type { ResetConfigValueAction, UpdateConfigValueAction, } from '../config/types' -import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { RobotApiRequestMeta, diff --git a/app/src/redux/calibration/api-types.ts b/app/src/redux/calibration/api-types.ts index dc39685d4fb..ec07faddbf5 100644 --- a/app/src/redux/calibration/api-types.ts +++ b/app/src/redux/calibration/api-types.ts @@ -1,4 +1,4 @@ -import { +import type { DECK_CAL_STATUS_OK, DECK_CAL_STATUS_IDENTITY, DECK_CAL_STATUS_BAD_CALIBRATION, diff --git a/app/src/redux/calibration/pipette-offset/actions.ts b/app/src/redux/calibration/pipette-offset/actions.ts index 01827e2497c..c2d6bad6657 100644 --- a/app/src/redux/calibration/pipette-offset/actions.ts +++ b/app/src/redux/calibration/pipette-offset/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { AllPipetteOffsetCalibrations } from '../api-types' diff --git a/app/src/redux/calibration/pipette-offset/types.ts b/app/src/redux/calibration/pipette-offset/types.ts index 998cfddd3ad..f910352b099 100644 --- a/app/src/redux/calibration/pipette-offset/types.ts +++ b/app/src/redux/calibration/pipette-offset/types.ts @@ -5,7 +5,7 @@ import type { import type { AllPipetteOffsetCalibrations } from '../api-types' -import { +import type { FETCH_PIPETTE_OFFSET_CALIBRATIONS, FETCH_PIPETTE_OFFSET_CALIBRATIONS_SUCCESS, FETCH_PIPETTE_OFFSET_CALIBRATIONS_FAILURE, diff --git a/app/src/redux/calibration/tip-length/actions.ts b/app/src/redux/calibration/tip-length/actions.ts index 11f0f6cc8d9..e010dc74b9b 100644 --- a/app/src/redux/calibration/tip-length/actions.ts +++ b/app/src/redux/calibration/tip-length/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { AllTipLengthCalibrations } from '../api-types' diff --git a/app/src/redux/calibration/tip-length/types.ts b/app/src/redux/calibration/tip-length/types.ts index 103311e3f3f..36765f79e80 100644 --- a/app/src/redux/calibration/tip-length/types.ts +++ b/app/src/redux/calibration/tip-length/types.ts @@ -5,7 +5,7 @@ import type { import type { AllTipLengthCalibrations } from '../api-types' -import { +import type { FETCH_TIP_LENGTH_CALIBRATIONS, FETCH_TIP_LENGTH_CALIBRATIONS_SUCCESS, FETCH_TIP_LENGTH_CALIBRATIONS_FAILURE, diff --git a/app/src/redux/calibration/types.ts b/app/src/redux/calibration/types.ts index c8b54499bb9..a26655cb273 100644 --- a/app/src/redux/calibration/types.ts +++ b/app/src/redux/calibration/types.ts @@ -12,7 +12,7 @@ import type { import type { PipetteOffsetCalibrationsAction } from './pipette-offset/types' import type { TipLengthCalibrationsAction } from './tip-length/types' -import { +import type { FETCH_CALIBRATION_STATUS, FETCH_CALIBRATION_STATUS_SUCCESS, FETCH_CALIBRATION_STATUS_FAILURE, diff --git a/app/src/redux/config/actions.ts b/app/src/redux/config/actions.ts index e4112cb9e0a..e0a6906b17f 100644 --- a/app/src/redux/config/actions.ts +++ b/app/src/redux/config/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' // request a config value update export const updateConfigValue = ( diff --git a/app/src/redux/config/types.ts b/app/src/redux/config/types.ts index 7e57539700d..b408a2204e2 100644 --- a/app/src/redux/config/types.ts +++ b/app/src/redux/config/types.ts @@ -1,4 +1,4 @@ -import { +import type { INITIALIZED, VALUE_UPDATED, UPDATE_VALUE, diff --git a/app/src/redux/custom-labware/__fixtures__/index.ts b/app/src/redux/custom-labware/__fixtures__/index.ts index 50311d1f5d1..56233d506fd 100644 --- a/app/src/redux/custom-labware/__fixtures__/index.ts +++ b/app/src/redux/custom-labware/__fixtures__/index.ts @@ -1,6 +1,6 @@ import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { LabwareWellGroupProperties } from '../../../pages/Labware/types' -import * as Types from '../types' +import type * as Types from '../types' export const mockDefinition: LabwareDefinition2 = { version: 1, diff --git a/app/src/redux/custom-labware/actions.ts b/app/src/redux/custom-labware/actions.ts index 8850c79a3cc..705a4259aa4 100644 --- a/app/src/redux/custom-labware/actions.ts +++ b/app/src/redux/custom-labware/actions.ts @@ -1,5 +1,5 @@ import { resetConfigValue } from '../config' -import * as Types from './types' +import type * as Types from './types' import type { ResetConfigValueAction } from '../config/types' diff --git a/app/src/redux/custom-labware/reducer.ts b/app/src/redux/custom-labware/reducer.ts index d6f6455acd5..2d8d0836865 100644 --- a/app/src/redux/custom-labware/reducer.ts +++ b/app/src/redux/custom-labware/reducer.ts @@ -4,7 +4,7 @@ import * as Actions from './actions' import type { Action } from '../types' import type { CustomLabwareState } from './types' -import { Reducer } from 'redux' +import type { Reducer } from 'redux' export const INITIAL_STATE: CustomLabwareState = { filenames: [], diff --git a/app/src/redux/discovery/reducer.ts b/app/src/redux/discovery/reducer.ts index e6ce2faa78a..741bd2fd693 100644 --- a/app/src/redux/discovery/reducer.ts +++ b/app/src/redux/discovery/reducer.ts @@ -5,7 +5,7 @@ import * as actions from './actions' import type { Action } from '../types' import type { DiscoveryState } from './types' -import { Reducer } from 'redux' +import type { Reducer } from 'redux' export const INITIAL_STATE: DiscoveryState = { scanning: false, diff --git a/app/src/redux/discovery/selectors.ts b/app/src/redux/discovery/selectors.ts index 3becb1a31a3..c92f6f6d2a1 100644 --- a/app/src/redux/discovery/selectors.ts +++ b/app/src/redux/discovery/selectors.ts @@ -25,7 +25,7 @@ import { } from './constants' import type { State } from '../types' -import { +import type { DiscoveredRobot, DiscoveryClientRobotAddress, Robot, diff --git a/app/src/redux/discovery/types.ts b/app/src/redux/discovery/types.ts index 6d87dee56da..399326ec1ed 100644 --- a/app/src/redux/discovery/types.ts +++ b/app/src/redux/discovery/types.ts @@ -5,7 +5,7 @@ import type { HealthStatus, } from '@opentrons/discovery-client' -import { +import type { HEALTH_STATUS_OK, CONNECTABLE, REACHABLE, diff --git a/app/src/redux/modules/__fixtures__/index.ts b/app/src/redux/modules/__fixtures__/index.ts index 258817bdc8a..a14454c56ec 100644 --- a/app/src/redux/modules/__fixtures__/index.ts +++ b/app/src/redux/modules/__fixtures__/index.ts @@ -1,5 +1,5 @@ -import * as Types from '../types' -import * as ApiTypes from '../api-types' +import type * as Types from '../types' +import type * as ApiTypes from '../api-types' import type { RobotApiResponse, RobotApiResponseMeta, diff --git a/app/src/redux/modules/actions.ts b/app/src/redux/modules/actions.ts index 3d4bfaa5b9c..85bfa6db5ef 100644 --- a/app/src/redux/modules/actions.ts +++ b/app/src/redux/modules/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { RobotApiRequestMeta } from '../robot-api/types' diff --git a/app/src/redux/modules/api-types.ts b/app/src/redux/modules/api-types.ts index 74bf735f760..4ebe20ef126 100644 --- a/app/src/redux/modules/api-types.ts +++ b/app/src/redux/modules/api-types.ts @@ -1,11 +1,8 @@ -import { +import type { TEMPDECK, MAGDECK, THERMOCYCLER, ModuleType, -} from '@opentrons/shared-data' - -import type { MagneticModuleModel, TemperatureModuleModel, ThermocyclerModuleModel, diff --git a/app/src/redux/modules/constants.ts b/app/src/redux/modules/constants.ts index 9be54c0375a..027a0398746 100644 --- a/app/src/redux/modules/constants.ts +++ b/app/src/redux/modules/constants.ts @@ -1,4 +1,5 @@ -import { ModuleType, THERMOCYCLER_MODULE_TYPE } from '@opentrons/shared-data' +import { THERMOCYCLER_MODULE_TYPE } from '@opentrons/shared-data' +import type { ModuleType } from '@opentrons/shared-data' // common constants diff --git a/app/src/redux/modules/epic/__tests__/updateModuleEpic.test.ts b/app/src/redux/modules/epic/__tests__/updateModuleEpic.test.ts index 8a7676aff66..79575a1ff9e 100644 --- a/app/src/redux/modules/epic/__tests__/updateModuleEpic.test.ts +++ b/app/src/redux/modules/epic/__tests__/updateModuleEpic.test.ts @@ -6,9 +6,9 @@ import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' import { modulesEpic } from '../../epic' +import type * as Types from '../../types' import type { Action, State } from '../../../types' vi.mock('../../../robot-api/http') diff --git a/app/src/redux/modules/types.ts b/app/src/redux/modules/types.ts index ff209830515..ce5b44123d3 100644 --- a/app/src/redux/modules/types.ts +++ b/app/src/redux/modules/types.ts @@ -4,18 +4,15 @@ import type { ThermocyclerModuleModel, MagneticModuleModel, HeaterShakerModuleModel, -} from '@opentrons/shared-data' - -import { TEMPERATURE_MODULE_TYPE, MAGNETIC_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, } from '@opentrons/shared-data' -import { ModuleOffset } from '@opentrons/api-client' +import type { ModuleOffset } from '@opentrons/api-client' -import * as ApiTypes from './api-types' +import type * as ApiTypes from './api-types' export * from './api-types' // common types diff --git a/app/src/redux/networking/actions.ts b/app/src/redux/networking/actions.ts index 49f6911605b..48e8ea924bc 100644 --- a/app/src/redux/networking/actions.ts +++ b/app/src/redux/networking/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { RobotApiRequestMeta, diff --git a/app/src/redux/networking/api-types.ts b/app/src/redux/networking/api-types.ts index 5c807e5eaec..09721757928 100644 --- a/app/src/redux/networking/api-types.ts +++ b/app/src/redux/networking/api-types.ts @@ -1,4 +1,4 @@ -import { +import type { STATUS_NONE, STATUS_PORTAL, STATUS_LIMITED, diff --git a/app/src/redux/networking/epic/disconnectEpic.ts b/app/src/redux/networking/epic/disconnectEpic.ts index a23902dae8b..56f93672ba1 100644 --- a/app/src/redux/networking/epic/disconnectEpic.ts +++ b/app/src/redux/networking/epic/disconnectEpic.ts @@ -2,15 +2,15 @@ import { ofType, combineEpics } from 'redux-observable' import { POST } from '../../robot-api/constants' import { mapToRobotApiRequest } from '../../robot-api/operators' +import * as Actions from '../actions' +import * as Constants from '../constants' + import type { ActionToRequestMapper, ResponseToActionMapper, } from '../../robot-api/operators' -import * as Actions from '../actions' -import * as Constants from '../constants' - import type { Action, Epic } from '../../types' -import { PostWifiDisconnectAction } from '../types' +import type { PostWifiDisconnectAction } from '../types' const mapActionToRequest: ActionToRequestMapper = action => ({ method: POST, diff --git a/app/src/redux/networking/epic/fetchEapOptionsEpic.ts b/app/src/redux/networking/epic/fetchEapOptionsEpic.ts index 4667558ad5b..b3f4438324c 100644 --- a/app/src/redux/networking/epic/fetchEapOptionsEpic.ts +++ b/app/src/redux/networking/epic/fetchEapOptionsEpic.ts @@ -10,7 +10,7 @@ import type { ResponseToActionMapper, } from '../../robot-api/operators' import type { Action, Epic } from '../../types' -import { FetchEapOptionsAction } from '../types' +import type { FetchEapOptionsAction } from '../types' const mapActionToRequest: ActionToRequestMapper = action => ({ method: GET, diff --git a/app/src/redux/networking/epic/wifiConfigureEpic.ts b/app/src/redux/networking/epic/wifiConfigureEpic.ts index 6f38c8a218a..5e7cb7b9388 100644 --- a/app/src/redux/networking/epic/wifiConfigureEpic.ts +++ b/app/src/redux/networking/epic/wifiConfigureEpic.ts @@ -13,7 +13,7 @@ import type { ResponseToActionMapper, } from '../../robot-api/operators' import type { Action, Epic } from '../../types' -import { +import type { PostWifiConfigureAction, PostWifiConfigureSuccessAction, } from '../types' diff --git a/app/src/redux/networking/reducer.ts b/app/src/redux/networking/reducer.ts index da3a67077bb..179450595a5 100644 --- a/app/src/redux/networking/reducer.ts +++ b/app/src/redux/networking/reducer.ts @@ -7,7 +7,7 @@ import * as Constants from './constants' import type { Action } from '../types' import type { NetworkingState, PerRobotNetworkingState } from './types' -import { Reducer } from 'redux' +import type { Reducer } from 'redux' const INITIAL_STATE: NetworkingState = {} const INITIAL_ROBOT_STATE: PerRobotNetworkingState = {} diff --git a/app/src/redux/networking/selectors.ts b/app/src/redux/networking/selectors.ts index ef6eb18ec96..bca3a638481 100644 --- a/app/src/redux/networking/selectors.ts +++ b/app/src/redux/networking/selectors.ts @@ -6,7 +6,7 @@ import { long2ip } from 'netmask' import { INTERFACE_WIFI, INTERFACE_ETHERNET } from './constants' import type { State } from '../types' -import * as Types from './types' +import type * as Types from './types' import type { Dictionary } from 'lodash' export function getInternetStatus( diff --git a/app/src/redux/networking/types.ts b/app/src/redux/networking/types.ts index 0077d8f29ba..0e73a7f01f3 100644 --- a/app/src/redux/networking/types.ts +++ b/app/src/redux/networking/types.ts @@ -3,7 +3,7 @@ import type { RobotApiErrorResponse, } from '../robot-api/types' -import { +import type { FETCH_STATUS, FETCH_STATUS_SUCCESS, FETCH_STATUS_FAILURE, @@ -21,7 +21,7 @@ import { FETCH_EAP_OPTIONS_FAILURE, } from './constants' -import * as ApiTypes from './api-types' +import type * as ApiTypes from './api-types' export * from './api-types' diff --git a/app/src/redux/pipettes/__fixtures__/index.ts b/app/src/redux/pipettes/__fixtures__/index.ts index a89b5d82a90..f8433cf6465 100644 --- a/app/src/redux/pipettes/__fixtures__/index.ts +++ b/app/src/redux/pipettes/__fixtures__/index.ts @@ -14,7 +14,7 @@ import type { PipetteInfo, PipetteInformation, } from '../../../organisms/Devices/hooks' -import { PipetteData } from '@opentrons/api-client' +import type { PipetteData } from '@opentrons/api-client' export const mockRobot = { name: 'robot', ip: '127.0.0.1', port: 31950 } diff --git a/app/src/redux/pipettes/actions.ts b/app/src/redux/pipettes/actions.ts index bd8247618ec..bdf77f118f2 100644 --- a/app/src/redux/pipettes/actions.ts +++ b/app/src/redux/pipettes/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { RobotApiRequestMeta } from '../robot-api/types' diff --git a/app/src/redux/pipettes/epic/__tests__/fetchPipetteSettingsEpic.test.ts b/app/src/redux/pipettes/epic/__tests__/fetchPipetteSettingsEpic.test.ts index 6f5c6d1fd8b..6bdd0e532ba 100644 --- a/app/src/redux/pipettes/epic/__tests__/fetchPipetteSettingsEpic.test.ts +++ b/app/src/redux/pipettes/epic/__tests__/fetchPipetteSettingsEpic.test.ts @@ -7,7 +7,7 @@ import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' +import type * as Types from '../../types' import { pipettesEpic } from '../../epic' import type { Action, State } from '../../../types' diff --git a/app/src/redux/pipettes/epic/__tests__/fetchPipettesEpic.test.ts b/app/src/redux/pipettes/epic/__tests__/fetchPipettesEpic.test.ts index ee07b47a82e..566acc682b7 100644 --- a/app/src/redux/pipettes/epic/__tests__/fetchPipettesEpic.test.ts +++ b/app/src/redux/pipettes/epic/__tests__/fetchPipettesEpic.test.ts @@ -7,9 +7,9 @@ import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' import { pipettesEpic } from '../../epic' +import type * as Types from '../../types' import type { Action, State } from '../../../types' import type { RobotApiResponse } from '../../../robot-api/types' diff --git a/app/src/redux/pipettes/epic/__tests__/updatePipetteSettingsEpic.test.ts b/app/src/redux/pipettes/epic/__tests__/updatePipetteSettingsEpic.test.ts index 1133ba82360..bea6b90bf28 100644 --- a/app/src/redux/pipettes/epic/__tests__/updatePipetteSettingsEpic.test.ts +++ b/app/src/redux/pipettes/epic/__tests__/updatePipetteSettingsEpic.test.ts @@ -7,9 +7,9 @@ import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' import { pipettesEpic } from '../../epic' +import type * as Types from '../../types' import type { Action, State } from '../../../types' import type { RobotApiRequestMeta } from '../../../robot-api/types' diff --git a/app/src/redux/pipettes/selectors.ts b/app/src/redux/pipettes/selectors.ts index 64ab5f72cc2..70b3d59c61e 100644 --- a/app/src/redux/pipettes/selectors.ts +++ b/app/src/redux/pipettes/selectors.ts @@ -11,7 +11,7 @@ import { } from '../calibration/tip-length' import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { PipetteModel } from '@opentrons/shared-data' import type { State } from '../types' diff --git a/app/src/redux/protocol-storage/actions.ts b/app/src/redux/protocol-storage/actions.ts index ce6b990a0a6..f28792af12a 100644 --- a/app/src/redux/protocol-storage/actions.ts +++ b/app/src/redux/protocol-storage/actions.ts @@ -1,4 +1,4 @@ -import * as Types from './types' +import type * as Types from './types' // action type literals diff --git a/app/src/redux/protocol-storage/reducer.ts b/app/src/redux/protocol-storage/reducer.ts index 0f8a3305959..56eca6c2625 100644 --- a/app/src/redux/protocol-storage/reducer.ts +++ b/app/src/redux/protocol-storage/reducer.ts @@ -5,7 +5,7 @@ import * as Actions from './actions' import type { Action } from '../types' import type { ProtocolStorageState } from './types' -import { Reducer } from 'redux' +import type { Reducer } from 'redux' export const INITIAL_STATE: ProtocolStorageState = { protocolKeys: [], diff --git a/app/src/redux/protocol-storage/types.ts b/app/src/redux/protocol-storage/types.ts index 6e33954516b..807bae7fe26 100644 --- a/app/src/redux/protocol-storage/types.ts +++ b/app/src/redux/protocol-storage/types.ts @@ -1,6 +1,6 @@ // common types -import { ProtocolAnalysisOutput } from '@opentrons/shared-data' +import type { ProtocolAnalysisOutput } from '@opentrons/shared-data' export interface StoredProtocolDir { dirPath: string diff --git a/app/src/redux/robot-admin/__tests__/selectors.test.ts b/app/src/redux/robot-admin/__tests__/selectors.test.ts index 77d1e24950c..61549a2bc3b 100644 --- a/app/src/redux/robot-admin/__tests__/selectors.test.ts +++ b/app/src/redux/robot-admin/__tests__/selectors.test.ts @@ -6,7 +6,7 @@ import { getNextRestartStatus, getResetConfigOptions, } from '../selectors' -import { ConnectivityStatus } from '../../discovery/types' +import type { ConnectivityStatus } from '../../discovery/types' import type { State } from '../../types' const START_TIME = new Date('2000-01-01') diff --git a/app/src/redux/robot-admin/actions.ts b/app/src/redux/robot-admin/actions.ts index c82ae42b22c..8cf09544dc4 100644 --- a/app/src/redux/robot-admin/actions.ts +++ b/app/src/redux/robot-admin/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { RobotApiRequestMeta } from '../robot-api/types' diff --git a/app/src/redux/robot-admin/epic/resetConfigEpic.ts b/app/src/redux/robot-admin/epic/resetConfigEpic.ts index 4d093f5ee25..c4b69445938 100644 --- a/app/src/redux/robot-admin/epic/resetConfigEpic.ts +++ b/app/src/redux/robot-admin/epic/resetConfigEpic.ts @@ -11,7 +11,7 @@ import type { ActionToRequestMapper, ResponseToActionMapper, } from '../../robot-api/operators' -import { +import type { ResetConfigAction, ResetConfigSuccessAction, RestartRobotAction, diff --git a/app/src/redux/robot-api/actions.ts b/app/src/redux/robot-api/actions.ts index caa8e7ef298..a41a232f702 100644 --- a/app/src/redux/robot-api/actions.ts +++ b/app/src/redux/robot-api/actions.ts @@ -1,5 +1,5 @@ -import * as Types from './types' import { DISMISS_REQUEST } from './constants' +import type * as Types from './types' export const dismissRequest = ( requestId: string diff --git a/app/src/redux/robot-api/helpers.ts b/app/src/redux/robot-api/helpers.ts index 90c1e0e5926..4b4974de782 100644 --- a/app/src/redux/robot-api/helpers.ts +++ b/app/src/redux/robot-api/helpers.ts @@ -1,4 +1,4 @@ -import * as Types from './types' +import type * as Types from './types' // TODO(mc, 2020-06-17): this is unit tested by component tests // write some direct tests and maybe fold into getRequestState selector diff --git a/app/src/redux/robot-api/operators.ts b/app/src/redux/robot-api/operators.ts index ddfec300379..d1b7f52d903 100644 --- a/app/src/redux/robot-api/operators.ts +++ b/app/src/redux/robot-api/operators.ts @@ -3,11 +3,10 @@ import { map, mergeMap, withLatestFrom, filter } from 'rxjs/operators' import { getRobotByName } from '../discovery/selectors' import { fetchRobotApi } from './http' -import * as Types from './types' import type { Observable, UnaryFunction, OperatorFunction } from 'rxjs' import type { State, Action } from '../types' -import type { RobotHost } from './types' +import type * as Types from './types' export type ActionToRequestMapper = ( triggerAction: TriggerAction, @@ -23,14 +22,14 @@ export type ResponseToActionMapper = ( export function withRobotHost( state$: Observable, getRobotName: (action: A) => string -): UnaryFunction, Observable<[A, State, RobotHost]>> { +): UnaryFunction, Observable<[A, State, Types.RobotHost]>> { return pipe( - withLatestFrom(state$, (a: A, s: State): [A, State, RobotHost | null] => [ - a, - s, - getRobotByName(s, getRobotName(a)) as RobotHost | null, - ]), - filter((args): args is [A, State, RobotHost] => { + withLatestFrom(state$, (a: A, s: State): [ + A, + State, + Types.RobotHost | null + ] => [a, s, getRobotByName(s, getRobotName(a)) as Types.RobotHost | null]), + filter((args): args is [A, State, Types.RobotHost] => { const [, , maybeRobot] = args return maybeRobot !== null }) diff --git a/app/src/redux/robot-api/selectors.ts b/app/src/redux/robot-api/selectors.ts index b8c3ab7bf2e..ca5eea7b982 100644 --- a/app/src/redux/robot-api/selectors.ts +++ b/app/src/redux/robot-api/selectors.ts @@ -1,5 +1,5 @@ import type { State } from '../types' -import * as Types from './types' +import type * as Types from './types' export const getRequestById = ( state: State, diff --git a/app/src/redux/robot-api/types.ts b/app/src/redux/robot-api/types.ts index b32f0da11ac..92107e92e6c 100644 --- a/app/src/redux/robot-api/types.ts +++ b/app/src/redux/robot-api/types.ts @@ -1,4 +1,4 @@ -import { PENDING, SUCCESS, FAILURE } from './constants' +import type { PENDING, SUCCESS, FAILURE } from './constants' export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' diff --git a/app/src/redux/robot-controls/actions.ts b/app/src/redux/robot-controls/actions.ts index 4bf95e449e2..816475a1738 100644 --- a/app/src/redux/robot-controls/actions.ts +++ b/app/src/redux/robot-controls/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { RobotApiRequestMeta } from '../robot-api/types' import type { Mount } from '../pipettes/types' diff --git a/app/src/redux/robot-controls/epic/__tests__/fetchLightsEpic.test.ts b/app/src/redux/robot-controls/epic/__tests__/fetchLightsEpic.test.ts index 4d92e26b217..e6bbad02530 100644 --- a/app/src/redux/robot-controls/epic/__tests__/fetchLightsEpic.test.ts +++ b/app/src/redux/robot-controls/epic/__tests__/fetchLightsEpic.test.ts @@ -6,9 +6,9 @@ import * as RobotApiHttp from '../../../robot-api/http' import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' import { robotControlsEpic } from '..' +import type * as Types from '../../types' import type { Action, State } from '../../../types' vi.mock('../../../robot-api/http') diff --git a/app/src/redux/robot-controls/epic/__tests__/homeEpic.test.ts b/app/src/redux/robot-controls/epic/__tests__/homeEpic.test.ts index 987329abb30..541c7b666dd 100644 --- a/app/src/redux/robot-controls/epic/__tests__/homeEpic.test.ts +++ b/app/src/redux/robot-controls/epic/__tests__/homeEpic.test.ts @@ -6,9 +6,9 @@ import * as RobotApiHttp from '../../../robot-api/http' import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' import { robotControlsEpic } from '..' +import type * as Types from '../../types' import type { Action, State } from '../../../types' vi.mock('../../../robot-api/http') diff --git a/app/src/redux/robot-controls/epic/__tests__/moveEpic.test.ts b/app/src/redux/robot-controls/epic/__tests__/moveEpic.test.ts index 2825a07b5fd..5c1cef71c8f 100644 --- a/app/src/redux/robot-controls/epic/__tests__/moveEpic.test.ts +++ b/app/src/redux/robot-controls/epic/__tests__/moveEpic.test.ts @@ -7,9 +7,9 @@ import * as DiscoverySelectors from '../../../discovery/selectors' import * as PipettesSelectors from '../../../pipettes/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' import { robotControlsEpic } from '..' +import type * as Types from '../../types' import type { Action, State } from '../../../types' vi.mock('../../../robot-api/http') diff --git a/app/src/redux/robot-controls/epic/__tests__/updateLightsEpic.test.ts b/app/src/redux/robot-controls/epic/__tests__/updateLightsEpic.test.ts index 8d4586fc4e5..b97ae48d2ac 100644 --- a/app/src/redux/robot-controls/epic/__tests__/updateLightsEpic.test.ts +++ b/app/src/redux/robot-controls/epic/__tests__/updateLightsEpic.test.ts @@ -6,7 +6,7 @@ import * as RobotApiHttp from '../../../robot-api/http' import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Actions from '../../actions' -import * as Types from '../../types' +import type * as Types from '../../types' import { robotControlsEpic } from '..' import type { Action, State } from '../../../types' diff --git a/app/src/redux/robot-controls/epic/updateLightsEpic.ts b/app/src/redux/robot-controls/epic/updateLightsEpic.ts index e47bdf8340a..a3d643b15e4 100644 --- a/app/src/redux/robot-controls/epic/updateLightsEpic.ts +++ b/app/src/redux/robot-controls/epic/updateLightsEpic.ts @@ -14,7 +14,7 @@ import type { } from '../../robot-api/operators' import type { UpdateLightsAction } from '../types' -import { RobotApiRequestMeta } from '../../robot-api/types' +import type { RobotApiRequestMeta } from '../../robot-api/types' const mapActionToRequest: ActionToRequestMapper = action => ({ method: POST, diff --git a/app/src/redux/robot-settings/actions.ts b/app/src/redux/robot-settings/actions.ts index fcf22b0c59a..e5844295e7b 100644 --- a/app/src/redux/robot-settings/actions.ts +++ b/app/src/redux/robot-settings/actions.ts @@ -1,5 +1,5 @@ import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' import type { RobotApiRequestMeta } from '../robot-api/types' diff --git a/app/src/redux/robot-settings/epic/__tests__/fetchSettingsEpic.test.ts b/app/src/redux/robot-settings/epic/__tests__/fetchSettingsEpic.test.ts index 9847f182ab3..7c8a90cf66f 100644 --- a/app/src/redux/robot-settings/epic/__tests__/fetchSettingsEpic.test.ts +++ b/app/src/redux/robot-settings/epic/__tests__/fetchSettingsEpic.test.ts @@ -7,9 +7,9 @@ import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Selectors from '../../selectors' import * as Actions from '../../actions' -import * as Types from '../../types' import { robotSettingsEpic } from '..' +import type * as Types from '../../types' import type { Action, State } from '../../../types' import type { RobotApiRequestMeta } from '../../../robot-api/types' diff --git a/app/src/redux/robot-settings/epic/__tests__/updateSettingEpic.test.ts b/app/src/redux/robot-settings/epic/__tests__/updateSettingEpic.test.ts index 26ed9bacc96..2c42f1e8809 100644 --- a/app/src/redux/robot-settings/epic/__tests__/updateSettingEpic.test.ts +++ b/app/src/redux/robot-settings/epic/__tests__/updateSettingEpic.test.ts @@ -7,7 +7,7 @@ import * as DiscoverySelectors from '../../../discovery/selectors' import * as Fixtures from '../../__fixtures__' import * as Selectors from '../../selectors' import * as Actions from '../../actions' -import * as Types from '../../types' +import type * as Types from '../../types' import { robotSettingsEpic } from '..' import type { Action, State } from '../../../types' diff --git a/app/src/redux/robot-update/__tests__/epic.test.ts b/app/src/redux/robot-update/__tests__/epic.test.ts index ea1066c0e62..84cb04d51eb 100644 --- a/app/src/redux/robot-update/__tests__/epic.test.ts +++ b/app/src/redux/robot-update/__tests__/epic.test.ts @@ -13,7 +13,7 @@ import * as selectors from '../selectors' import { INITIAL_STATE } from '../reducer' import type { Action, State } from '../../types' -import { RobotApiResponse } from '../../robot-api/types' +import type { RobotApiResponse } from '../../robot-api/types' vi.mock('../selectors') vi.mock('../../robot-api/http') diff --git a/app/src/redux/sessions/__fixtures__/index.ts b/app/src/redux/sessions/__fixtures__/index.ts index 5f5e338f94d..391de0151f5 100644 --- a/app/src/redux/sessions/__fixtures__/index.ts +++ b/app/src/redux/sessions/__fixtures__/index.ts @@ -16,12 +16,12 @@ import { mockPipetteOffsetCalibrationSessionDetails, mockPipetteOffsetCalibrationSessionParams, } from './pipette-offset-calibration' +import * as Constants from '../constants' import type { ResponseFixtures } from '../../robot-api/__fixtures__' import type { RobotApiV2ErrorResponseBody } from '../../robot-api/types' -import * as Types from '../types' -import * as Constants from '../constants' +import type * as Types from '../types' export * from './calibration-check' export * from './tip-length-calibration' diff --git a/app/src/redux/sessions/actions.ts b/app/src/redux/sessions/actions.ts index d92163032f5..87cbdc2786f 100644 --- a/app/src/redux/sessions/actions.ts +++ b/app/src/redux/sessions/actions.ts @@ -1,5 +1,5 @@ -import * as Types from './types' import * as Constants from './constants' +import type * as Types from './types' import type { RobotApiRequestMeta, RobotApiV2ErrorResponseBody, diff --git a/app/src/redux/sessions/calibration-check/types.ts b/app/src/redux/sessions/calibration-check/types.ts index 450cf9bbe0a..5fde44d3241 100644 --- a/app/src/redux/sessions/calibration-check/types.ts +++ b/app/src/redux/sessions/calibration-check/types.ts @@ -4,7 +4,7 @@ import type { LabwareDefinition2, PipetteModel } from '@opentrons/shared-data' // calibration check session types -import { +import type { CHECK_STEP_SESSION_STARTED, CHECK_STEP_LABWARE_LOADED, CHECK_STEP_INSPECTING_TIP, diff --git a/app/src/redux/sessions/deck-calibration/types.ts b/app/src/redux/sessions/deck-calibration/types.ts index 44dd1b7f473..8587d38747b 100644 --- a/app/src/redux/sessions/deck-calibration/types.ts +++ b/app/src/redux/sessions/deck-calibration/types.ts @@ -1,6 +1,6 @@ // deck calibration types -import { +import type { DECK_STEP_SESSION_STARTED, DECK_STEP_LABWARE_LOADED, DECK_STEP_PREPARING_PIPETTE, diff --git a/app/src/redux/sessions/epic/__tests__/createSessionCommandEpic.test.ts b/app/src/redux/sessions/epic/__tests__/createSessionCommandEpic.test.ts index c587cb53e2b..434b5a96085 100644 --- a/app/src/redux/sessions/epic/__tests__/createSessionCommandEpic.test.ts +++ b/app/src/redux/sessions/epic/__tests__/createSessionCommandEpic.test.ts @@ -8,7 +8,7 @@ import * as Actions from '../../actions' import { sessionsEpic } from '..' import type { Action } from '../../../types' -import { CreateSessionCommandAction } from '../../types' +import type { CreateSessionCommandAction } from '../../types' vi.mock('../../../robot-api/http') diff --git a/app/src/redux/sessions/pipette-offset-calibration/types.ts b/app/src/redux/sessions/pipette-offset-calibration/types.ts index 55d1397bb74..5a840f432cc 100644 --- a/app/src/redux/sessions/pipette-offset-calibration/types.ts +++ b/app/src/redux/sessions/pipette-offset-calibration/types.ts @@ -1,5 +1,5 @@ // pipette offset calibration types -import { +import type { PIP_OFFSET_STEP_SESSION_STARTED, PIP_OFFSET_STEP_LABWARE_LOADED, PIP_OFFSET_STEP_PREPARING_PIPETTE, diff --git a/app/src/redux/sessions/selectors.ts b/app/src/redux/sessions/selectors.ts index 150580e2dce..8acb5923d40 100644 --- a/app/src/redux/sessions/selectors.ts +++ b/app/src/redux/sessions/selectors.ts @@ -1,5 +1,5 @@ import type { State } from '../types' -import * as Types from './types' +import type * as Types from './types' export const getRobotSessions: ( state: State, diff --git a/app/src/redux/sessions/tip-length-calibration/types.ts b/app/src/redux/sessions/tip-length-calibration/types.ts index 16b5eebb865..8a7db5be43f 100644 --- a/app/src/redux/sessions/tip-length-calibration/types.ts +++ b/app/src/redux/sessions/tip-length-calibration/types.ts @@ -1,5 +1,5 @@ // tip length calibration types -import { +import type { TIP_LENGTH_STEP_SESSION_STARTED, TIP_LENGTH_STEP_LABWARE_LOADED, TIP_LENGTH_STEP_MEASURING_NOZZLE_OFFSET, diff --git a/app/src/redux/sessions/types.ts b/app/src/redux/sessions/types.ts index be9ce194ca4..3103dcd57cc 100644 --- a/app/src/redux/sessions/types.ts +++ b/app/src/redux/sessions/types.ts @@ -1,6 +1,6 @@ import type { LabwareDefinition2 } from '@opentrons/shared-data' -import { +import type { CREATE_SESSION, CREATE_SESSION_SUCCESS, CREATE_SESSION_FAILURE, @@ -30,15 +30,15 @@ import type { RobotApiV2ErrorResponseBody, } from '../robot-api/types' -import * as CalCheckTypes from './calibration-check/types' -import * as TipLengthCalTypes from './tip-length-calibration/types' -import * as DeckCalTypes from './deck-calibration/types' -import * as PipOffsetCalTypes from './pipette-offset-calibration/types' -import * as CalCheckConstants from './calibration-check/constants' -import * as TipCalConstants from './tip-length-calibration/constants' -import * as DeckCalConstants from './deck-calibration/constants' -import * as PipOffsetCalConstants from './pipette-offset-calibration/constants' -import * as CommonCalConstants from './common-calibration/constants' +import type * as CalCheckTypes from './calibration-check/types' +import type * as TipLengthCalTypes from './tip-length-calibration/types' +import type * as DeckCalTypes from './deck-calibration/types' +import type * as PipOffsetCalTypes from './pipette-offset-calibration/types' +import type * as CalCheckConstants from './calibration-check/constants' +import type * as TipCalConstants from './tip-length-calibration/constants' +import type * as DeckCalConstants from './deck-calibration/constants' +import type * as PipOffsetCalConstants from './pipette-offset-calibration/constants' +import type * as CommonCalConstants from './common-calibration/constants' export * from './calibration-check/types' export * from './tip-length-calibration/types' diff --git a/app/src/redux/system-info/actions.ts b/app/src/redux/system-info/actions.ts index 5972f918291..359b4a859e9 100644 --- a/app/src/redux/system-info/actions.ts +++ b/app/src/redux/system-info/actions.ts @@ -1,7 +1,7 @@ // system-info actions import * as Constants from './constants' -import * as Types from './types' +import type * as Types from './types' export const initialized = ( usbDevices: Types.UsbDevice[], diff --git a/app/src/redux/system-info/types.ts b/app/src/redux/system-info/types.ts index febce9230b9..8b2ae57a560 100644 --- a/app/src/redux/system-info/types.ts +++ b/app/src/redux/system-info/types.ts @@ -1,6 +1,6 @@ // system-info types -import { +import type { INITIALIZED, USB_DEVICE_ADDED, USB_DEVICE_REMOVED, diff --git a/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx b/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx index 5a81f052edd..f51f5dca2e0 100644 --- a/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx +++ b/app/src/resources/networking/__tests__/useCanDisconnect.test.tsx @@ -3,7 +3,7 @@ import { when } from 'vitest-when' import { describe, it, expect, vi, beforeEach } from 'vitest' import { createStore } from 'redux' import { Provider } from 'react-redux' -import { SECURITY_WPA_EAP, WifiNetwork } from '@opentrons/api-client' +import { SECURITY_WPA_EAP } from '@opentrons/api-client' import { renderHook } from '@testing-library/react' import { getRobotApiVersionByName } from '../../../redux/discovery' @@ -11,6 +11,7 @@ import { useIsFlex } from '../../../organisms/Devices/hooks' import { useCanDisconnect } from '../hooks/useCanDisconnect' import { useWifiList } from '../hooks/useWifiList' +import type { WifiNetwork } from '@opentrons/api-client' import type { Store } from 'redux' import type { State } from '../../../redux/types' diff --git a/app/src/resources/networking/__tests__/useNetworkConnection.test.tsx b/app/src/resources/networking/__tests__/useNetworkConnection.test.tsx index 624a5a37917..f6f038dd081 100644 --- a/app/src/resources/networking/__tests__/useNetworkConnection.test.tsx +++ b/app/src/resources/networking/__tests__/useNetworkConnection.test.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { when } from 'vitest-when' import { describe, it, expect, vi, beforeEach } from 'vitest' import { Provider } from 'react-redux' -import { createStore, Store } from 'redux' +import { createStore } from 'redux' import { renderHook } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' @@ -14,6 +14,7 @@ import * as Fixtures from '../../../redux/networking/__fixtures__' import { getNetworkInterfaces } from '../../../redux/networking' import { useNetworkConnection } from '../hooks/useNetworkConnection' +import type { Store } from 'redux' vi.mock('../../../resources/networking/hooks') vi.mock('../../../redux/networking/selectors') diff --git a/app/src/resources/networking/__tests__/useWifiList.test.ts b/app/src/resources/networking/__tests__/useWifiList.test.ts index 8db28648272..d616067c2b8 100644 --- a/app/src/resources/networking/__tests__/useWifiList.test.ts +++ b/app/src/resources/networking/__tests__/useWifiList.test.ts @@ -1,11 +1,11 @@ import { when } from 'vitest-when' import { describe, it, expect, vi, beforeEach } from 'vitest' -import { SECURITY_WPA_EAP, WifiNetwork } from '@opentrons/api-client' +import { SECURITY_WPA_EAP } from '@opentrons/api-client' import { useWifiQuery } from '@opentrons/react-api-client' import { useRobot } from '../../../organisms/Devices/hooks' import { useWifiList } from '../hooks' -import type { WifiListResponse } from '@opentrons/api-client' import type { UseQueryResult } from 'react-query' +import type { WifiNetwork, WifiListResponse } from '@opentrons/api-client' vi.mock('@opentrons/react-api-client') vi.mock('../../../organisms/Devices/hooks') diff --git a/components/src/atoms/StyledText/index.tsx b/components/src/atoms/StyledText/index.tsx index 64acb9c8174..aa1eb16c29f 100644 --- a/components/src/atoms/StyledText/index.tsx +++ b/components/src/atoms/StyledText/index.tsx @@ -1,8 +1,8 @@ -import * as React from 'react' import styled, { css } from 'styled-components' import { Text } from '../../primitives' import { TYPOGRAPHY, RESPONSIVENESS } from '../../ui-style-constants' +import type * as React from 'react' import type { FlattenSimpleInterpolation } from 'styled-components' export interface Props extends React.ComponentProps { diff --git a/components/src/buttons/Button.tsx b/components/src/buttons/Button.tsx index 28937e2da13..ee8e1f22881 100644 --- a/components/src/buttons/Button.tsx +++ b/components/src/buttons/Button.tsx @@ -5,12 +5,9 @@ import omit from 'lodash/omit' import { Icon } from '../icons' import styles from './buttons.module.css' -import { - BUTTON_TYPE_SUBMIT, - BUTTON_TYPE_RESET, - BUTTON_TYPE_BUTTON, -} from '../primitives' +import { BUTTON_TYPE_BUTTON } from '../primitives' +import type { BUTTON_TYPE_SUBMIT, BUTTON_TYPE_RESET } from '../primitives' import type { IconName } from '../icons' import type { UseHoverTooltipTargetProps } from '../tooltips' diff --git a/components/src/forms/Select.tsx b/components/src/forms/Select.tsx index 9e2b3d2082c..d1341f106e2 100644 --- a/components/src/forms/Select.tsx +++ b/components/src/forms/Select.tsx @@ -1,20 +1,18 @@ import * as React from 'react' -import ReactSelect, { - components as reactSelectComponents, - DropdownIndicatorProps, -} from 'react-select' +import ReactSelect, { components as reactSelectComponents } from 'react-select' + import cx from 'classnames' import { Icon } from '../icons' -import { POSITION_ABSOLUTE, POSITION_FIXED } from '../styles' import styles from './Select.module.css' - import type { + DropdownIndicatorProps, Props as ReactSelectProps, MenuProps, StylesConfig, CSSObjectWithLabel, } from 'react-select' +import type { POSITION_ABSOLUTE, POSITION_FIXED } from '../styles' export { reactSelectComponents } diff --git a/components/src/hardware-sim/BaseDeck/BaseDeck.tsx b/components/src/hardware-sim/BaseDeck/BaseDeck.tsx index db72c865cd3..3b3b61dd9fa 100644 --- a/components/src/hardware-sim/BaseDeck/BaseDeck.tsx +++ b/components/src/hardware-sim/BaseDeck/BaseDeck.tsx @@ -27,12 +27,12 @@ import { DeckFromLayers } from '../Deck/DeckFromLayers' import { SlotLabels } from '../Deck' import { COLORS } from '../../helix-design-system' -import { Svg } from '../../primitives' import { SingleSlotFixture } from './SingleSlotFixture' import { StagingAreaFixture } from './StagingAreaFixture' import { WasteChuteFixture } from './WasteChuteFixture' import { WasteChuteStagingAreaFixture } from './WasteChuteStagingAreaFixture' +import type { Svg } from '../../primitives' import type { CutoutFixtureId, DeckConfiguration, diff --git a/components/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx b/components/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx index 6db439eba57..44d2ab9c49c 100644 --- a/components/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +++ b/components/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx @@ -1,7 +1,5 @@ import * as React from 'react' -import { WASTE_CHUTE_CUTOUT } from '@opentrons/shared-data' - import { Icon } from '../../icons' import { Flex, Text } from '../../primitives' import { @@ -14,8 +12,11 @@ import { SPACING, TYPOGRAPHY } from '../../ui-style-constants' import { COLORS } from '../../helix-design-system' import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject' import { SlotBase } from './SlotBase' - -import type { DeckDefinition, ModuleType } from '@opentrons/shared-data' +import type { + WASTE_CHUTE_CUTOUT, + DeckDefinition, + ModuleType, +} from '@opentrons/shared-data' interface WasteChuteFixtureProps extends React.SVGProps { cutoutId: typeof WASTE_CHUTE_CUTOUT diff --git a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx index 91defab6667..c727ac5ad35 100644 --- a/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +++ b/components/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx @@ -3,12 +3,9 @@ import styled from 'styled-components' import flatMap from 'lodash/flatMap' import { animated, useSpring, easings } from '@react-spring/web' import { - LabwareWell, - LoadedModule, getDeckDefFromRobotType, getModuleDef2, getPositionFromSlotId, - LoadedLabware, } from '@opentrons/shared-data' import { COLORS } from '../../helix-design-system' @@ -16,6 +13,9 @@ import { IDENTITY_AFFINE_TRANSFORM, multiplyMatrices } from '../utils' import { BaseDeck } from '../BaseDeck' import type { + LoadedLabware, + LabwareWell, + LoadedModule, Coordinates, LabwareDefinition2, LabwareLocation, diff --git a/components/src/hardware-sim/Deck/RobotWorkSpace.tsx b/components/src/hardware-sim/Deck/RobotWorkSpace.tsx index 34c780f569f..bf999139659 100644 --- a/components/src/hardware-sim/Deck/RobotWorkSpace.tsx +++ b/components/src/hardware-sim/Deck/RobotWorkSpace.tsx @@ -1,8 +1,9 @@ import * as React from 'react' import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' -import { StyleProps, Svg } from '../../primitives' +import { Svg } from '../../primitives' import { DeckFromLayers } from './DeckFromLayers' +import type { StyleProps } from '../../primitives' import type { DeckDefinition, DeckSlot } from '@opentrons/shared-data' export interface RobotWorkSpaceRenderProps { diff --git a/components/src/hardware-sim/Labware/LabwareRender.tsx b/components/src/hardware-sim/Labware/LabwareRender.tsx index b3133fe1813..9b2365b668c 100644 --- a/components/src/hardware-sim/Labware/LabwareRender.tsx +++ b/components/src/hardware-sim/Labware/LabwareRender.tsx @@ -6,11 +6,9 @@ import { StrokedWells, StaticLabware, } from './labwareInternals' -import { - LabwareAdapter, - LabwareAdapterLoadName, - labwareAdapterLoadNames, -} from './LabwareAdapter' +import { LabwareAdapter, labwareAdapterLoadNames } from './LabwareAdapter' + +import type { CSSProperties } from 'styled-components' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { HighlightedWellLabels, @@ -19,7 +17,8 @@ import type { WellStroke, WellGroup, } from './labwareInternals/types' -import type { CSSProperties } from 'styled-components' +import type { LabwareAdapterLoadName } from './LabwareAdapter' + export const WELL_LABEL_OPTIONS = { SHOW_LABEL_INSIDE: 'SHOW_LABEL_INSIDE', SHOW_LABEL_OUTSIDE: 'SHOW_LABEL_OUTSIDE', diff --git a/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx b/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx index f3f044f04bd..bc6d0764768 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx @@ -1,9 +1,10 @@ import * as React from 'react' import { C_BLACK, C_BLUE } from '../../../styles/colors' import { RobotCoordsText } from '../../Deck' -import { WellLabelOption, WELL_LABEL_OPTIONS } from '../LabwareRender' +import { WELL_LABEL_OPTIONS } from '../LabwareRender' import { COLORS } from '../../../helix-design-system' import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { WellLabelOption } from '../LabwareRender' import type { HighlightedWellLabels } from './types' // magic layout numbers to make the letters close to the edges of the labware diff --git a/components/src/hardware-sim/Labware/labwareInternals/__tests__/StrokedWells.test.tsx b/components/src/hardware-sim/Labware/labwareInternals/__tests__/StrokedWells.test.tsx index e4b8c99581c..501ab817b2b 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/__tests__/StrokedWells.test.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/__tests__/StrokedWells.test.tsx @@ -2,9 +2,10 @@ import * as React from 'react' import { describe, it, vi } from 'vitest' import { render, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' -import { LabwareDefinition2, fixture12Trough } from '@opentrons/shared-data' +import { fixture12Trough } from '@opentrons/shared-data' import { StrokedWells } from '../StrokedWells' import { WellComponent as Well } from '../Well' +import type { LabwareDefinition2 } from '@opentrons/shared-data' vi.mock('../Well') diff --git a/components/src/hardware-sim/Labware/labwareInternals/__tests__/WellLabels.test.tsx b/components/src/hardware-sim/Labware/labwareInternals/__tests__/WellLabels.test.tsx index 61f9c77abaf..1fe1b63f9ce 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/__tests__/WellLabels.test.tsx +++ b/components/src/hardware-sim/Labware/labwareInternals/__tests__/WellLabels.test.tsx @@ -2,12 +2,10 @@ import * as React from 'react' import { describe, it, expect } from 'vitest' import { render, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' -import { - LabwareDefinition2, - fixture12Trough as _fixture12Trough, -} from '@opentrons/shared-data' +import { fixture12Trough as _fixture12Trough } from '@opentrons/shared-data' import { WellLabels } from '../WellLabels' import { WELL_LABEL_OPTIONS } from '../../LabwareRender' +import type { LabwareDefinition2 } from '@opentrons/shared-data' const troughFixture12 = _fixture12Trough as LabwareDefinition2 diff --git a/components/src/hardware-sim/Labware/labwareInternals/types.ts b/components/src/hardware-sim/Labware/labwareInternals/types.ts index 039c8a6104f..337a0932a03 100644 --- a/components/src/hardware-sim/Labware/labwareInternals/types.ts +++ b/components/src/hardware-sim/Labware/labwareInternals/types.ts @@ -1,4 +1,4 @@ -import * as React from 'react' +import type * as React from 'react' export interface WellMouseEvent { wellName: string diff --git a/components/src/hardware-sim/Module/Module.stories.tsx b/components/src/hardware-sim/Module/Module.stories.tsx index 98f8502e545..67b26a226d7 100644 --- a/components/src/hardware-sim/Module/Module.stories.tsx +++ b/components/src/hardware-sim/Module/Module.stories.tsx @@ -2,10 +2,8 @@ import * as React from 'react' import { fixture96Plate, getModuleDef2, - LabwareDefinition2, MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2, - ModuleModel, TEMPERATURE_MODULE_V1, TEMPERATURE_MODULE_V2, THERMOCYCLER_MODULE_V1, @@ -18,6 +16,7 @@ import { RobotCoordinateSpace } from '../RobotCoordinateSpace' import { Module as ModuleComponent } from './' import type { Story, Meta } from '@storybook/react' +import type { LabwareDefinition2, ModuleModel } from '@opentrons/shared-data' const moduleModels: ModuleModel[] = [ TEMPERATURE_MODULE_V2, diff --git a/components/src/hardware-sim/Module/Thermocycler/index.tsx b/components/src/hardware-sim/Module/Thermocycler/index.tsx index 9cec276b83b..e858e3ee92f 100644 --- a/components/src/hardware-sim/Module/Thermocycler/index.tsx +++ b/components/src/hardware-sim/Module/Thermocycler/index.tsx @@ -1,10 +1,6 @@ import * as React from 'react' -import { - THERMOCYCLER_MODULE_V1, - ThermocyclerModuleModel, - getModuleDef2, -} from '@opentrons/shared-data' +import { THERMOCYCLER_MODULE_V1, getModuleDef2 } from '@opentrons/shared-data' import { C_MED_LIGHT_GRAY } from '../../../styles' import { COLORS, BORDERS } from '../../../helix-design-system' @@ -12,6 +8,7 @@ import { COLORS, BORDERS } from '../../../helix-design-system' import { RobotCoordsForeignDiv } from '../../Deck' import { ThermocyclerGEN1 } from './ThermocyclerGEN1' import { ThermocyclerGEN2 } from './ThermocyclerGEN2' +import type { ThermocyclerModuleModel } from '@opentrons/shared-data' const ROOM_TEMPERATURE_C = 23 // value taken from TC firmware export interface ThermocyclerVizProps { diff --git a/components/src/hardware-sim/Module/index.tsx b/components/src/hardware-sim/Module/index.tsx index e2d865329b2..ae1b6902337 100644 --- a/components/src/hardware-sim/Module/index.tsx +++ b/components/src/hardware-sim/Module/index.tsx @@ -4,11 +4,9 @@ import { HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, MAGNETIC_MODULE_TYPE, - ModuleDefinition, OT2_STANDARD_DECKID, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, - ThermocyclerModuleModel, } from '@opentrons/shared-data' import { C_DARK_GRAY, @@ -28,6 +26,11 @@ import { Temperature } from './Temperature' import { MagneticBlock } from './MagneticBlock' import { MagneticModule } from './MagneticModule' +import type { + ModuleDefinition, + ThermocyclerModuleModel, +} from '@opentrons/shared-data' + export * from './Thermocycler' const LABWARE_OFFSET_DISPLAY_THRESHOLD = 2 diff --git a/components/src/hardware-sim/Pipette/PipetteRender.tsx b/components/src/hardware-sim/Pipette/PipetteRender.tsx index 567377e2a32..da850a308aa 100644 --- a/components/src/hardware-sim/Pipette/PipetteRender.tsx +++ b/components/src/hardware-sim/Pipette/PipetteRender.tsx @@ -1,9 +1,5 @@ import * as React from 'react' -import { - getPipetteNameSpecs, - LabwareDefinition2, - PipetteName, -} from '@opentrons/shared-data' +import { getPipetteNameSpecs } from '@opentrons/shared-data' import { C_MED_DARK_GRAY, C_MED_GRAY } from '../../styles' import { BORDERS } from '../../helix-design-system' import { RobotCoordsForeignDiv } from '../Deck/RobotCoordsForeignDiv' @@ -18,6 +14,7 @@ import { } from './constants' import { EmanatingNozzle } from './EmanatingNozzle' import { EightEmanatingNozzles } from './EightEmanatingNozzles' +import type { LabwareDefinition2, PipetteName } from '@opentrons/shared-data' interface PipetteRenderProps { labwareDef: LabwareDefinition2 diff --git a/components/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx b/components/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx index 2aacdab6737..d35e4cec27d 100644 --- a/components/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +++ b/components/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { css } from 'styled-components' -import { LabwareDefinition2 } from '@opentrons/shared-data' import { RobotCoordsForeignDiv } from '../Deck' import { DISPLAY_FLEX, @@ -14,6 +13,7 @@ import { import { Box, Flex, Text } from '../../primitives' import { TYPOGRAPHY, SPACING } from '../../ui-style-constants' import { COLORS } from '../../helix-design-system' +import type { LabwareDefinition2 } from '@opentrons/shared-data' const labwareDisplayNameStyle = css` ${TYPOGRAPHY.labelSemiBold} diff --git a/components/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts b/components/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts index 2f43a9a2dc4..23ae614167c 100644 --- a/components/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts +++ b/components/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest' -import { RunTimeCommand } from '@opentrons/shared-data' import { getLabwareInfoByLiquidId } from '../getLabwareInfoByLiquidId' +import type { RunTimeCommand } from '@opentrons/shared-data' const mockLoadLiquidRunTimeCommands = [ { diff --git a/components/src/hardware-sim/utils.ts b/components/src/hardware-sim/utils.ts index aeb03098c94..dcdba4ba66c 100644 --- a/components/src/hardware-sim/utils.ts +++ b/components/src/hardware-sim/utils.ts @@ -1,4 +1,4 @@ -import { AffineTransformMatrix } from '@opentrons/shared-data' +import type { AffineTransformMatrix } from '@opentrons/shared-data' export const IDENTITY_AFFINE_TRANSFORM: AffineTransformMatrix = [ [1, 0, 0, 0], diff --git a/components/src/hooks/useDrag.ts b/components/src/hooks/useDrag.ts index e7587555962..8a89de19c09 100644 --- a/components/src/hooks/useDrag.ts +++ b/components/src/hooks/useDrag.ts @@ -1,11 +1,6 @@ -import { - useState, - useEffect, - useRef, - CSSProperties, - MutableRefObject, -} from 'react' +import { useState, useEffect, useRef } from 'react' import interact from 'interactjs' +import type { CSSProperties, MutableRefObject } from 'react' export interface ElementPosition { width: number diff --git a/components/src/hooks/useLongPress.ts b/components/src/hooks/useLongPress.ts index 4b29a7c4b32..2556720032f 100644 --- a/components/src/hooks/useLongPress.ts +++ b/components/src/hooks/useLongPress.ts @@ -1,12 +1,7 @@ -import { - useState, - useEffect, - useRef, - CSSProperties, - MutableRefObject, -} from 'react' +import { useState, useEffect, useRef } from 'react' import interact from 'interactjs' import type PointerEvent from 'interactjs' +import type { CSSProperties, MutableRefObject } from 'react' const HOLD_DURATION_MS = 1000 @@ -44,10 +39,10 @@ export const useLongPress = (): UseLongPressResult => { .pointerEvents({ holdDuration: HOLD_DURATION_MS, }) - .on('hold', (event: PointerEvent) => { + .on('hold', (_event: PointerEvent) => { setIsLongPressed(isLongPressed => !isLongPressed) }) - .on('tap', (event: PointerEvent) => { + .on('tap', (_event: PointerEvent) => { setIsTapped(isTapped => !isTapped) }) } diff --git a/components/src/hooks/useSelectDeckLocation/index.tsx b/components/src/hooks/useSelectDeckLocation/index.tsx index c7ccf53e6bf..4716e535fc6 100644 --- a/components/src/hooks/useSelectDeckLocation/index.tsx +++ b/components/src/hooks/useSelectDeckLocation/index.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import isEqual from 'lodash/isEqual' import { useTranslation } from 'react-i18next' import { - CutoutConfig, FLEX_CUTOUT_BY_SLOT_ID, FLEX_SINGLE_SLOT_BY_CUTOUT_ID, FLEX_ROBOT_TYPE, @@ -11,9 +10,6 @@ import { getFixtureDisplayName, isAddressableAreaStandardSlot, OT2_ROBOT_TYPE, - AddressableArea, - CoordinateTuple, - CutoutFixtureId, } from '@opentrons/shared-data' import { DeckFromLayers, @@ -32,6 +28,10 @@ import { SPACING, TYPOGRAPHY } from '../../ui-style-constants' import { COLORS } from '../../helix-design-system' import type { + CutoutConfig, + AddressableArea, + CoordinateTuple, + CutoutFixtureId, DeckDefinition, ModuleLocation, RobotType, diff --git a/components/src/hooks/useSwipe.ts b/components/src/hooks/useSwipe.ts index 646ffe913d7..84bb3469330 100644 --- a/components/src/hooks/useSwipe.ts +++ b/components/src/hooks/useSwipe.ts @@ -1,11 +1,6 @@ -import { - useState, - useEffect, - useRef, - MutableRefObject, - CSSProperties, -} from 'react' +import { useState, useEffect, useRef } from 'react' import interact from 'interactjs' +import type { MutableRefObject, CSSProperties } from 'react' interface UseSwipeResult { ref: MutableRefObject diff --git a/components/src/icons/IconList.stories.tsx b/components/src/icons/IconList.stories.tsx index ec081a3f2ca..6cc5c24ed23 100644 --- a/components/src/icons/IconList.stories.tsx +++ b/components/src/icons/IconList.stories.tsx @@ -12,9 +12,10 @@ import { BORDERS, } from '@opentrons/components' import { ICON_DATA_BY_NAME } from './icon-data' -import { Icon as IconComponent, IconName } from './Icon' +import { Icon as IconComponent } from './Icon' import type { Story, Meta } from '@storybook/react' +import type { IconName } from './Icon' export default { title: 'Library/Atoms/IconList', diff --git a/components/src/icons/ModuleIcon.tsx b/components/src/icons/ModuleIcon.tsx index 5c240c4eee9..4d6bea3c734 100644 --- a/components/src/icons/ModuleIcon.tsx +++ b/components/src/icons/ModuleIcon.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { Icon, IconName } from './Icon' +import { Icon } from './Icon' import { HEATERSHAKER_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, @@ -10,6 +10,7 @@ import { import type { ModuleType } from '@opentrons/shared-data' import type { StyleProps } from '../primitives/types' +import type { IconName } from './Icon' export const MODULE_ICON_NAME_BY_TYPE: { [type in ModuleType]: IconName } = { [MAGNETIC_BLOCK_TYPE]: 'ot-magnet-v2', diff --git a/components/src/instrument/InstrumentDiagram.tsx b/components/src/instrument/InstrumentDiagram.tsx index 1ed6344d308..8617009d601 100644 --- a/components/src/instrument/InstrumentDiagram.tsx +++ b/components/src/instrument/InstrumentDiagram.tsx @@ -1,5 +1,4 @@ import * as React from 'react' -import { FlattenSimpleInterpolation } from 'styled-components' import { Flex } from '../primitives' import { ALIGN_CENTER, JUSTIFY_CENTER } from '../styles' import singleSrc from './single_channel_GEN1_800px.png' @@ -10,6 +9,7 @@ import singleFlexSrc from './single-channel-flex.png' import eightChannelFlexSrc from './eight-channel-flex.png' import ninetySixSrc from './ninety-six-channel-gen1.png' +import type { FlattenSimpleInterpolation } from 'styled-components' import type { PipetteV2Specs } from '@opentrons/shared-data' import type { Mount } from '../robot-types' import type { StyleProps } from '..' diff --git a/components/src/modals/ModalShell.tsx b/components/src/modals/ModalShell.tsx index 4990ef47ce8..98fe207571e 100644 --- a/components/src/modals/ModalShell.tsx +++ b/components/src/modals/ModalShell.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import styled from 'styled-components' import { SPACING } from '../ui-style-constants' import { BORDERS, COLORS } from '../helix-design-system' -import { StyleProps, styleProps } from '../primitives' +import { styleProps } from '../primitives' import { POSITION_FIXED, POSITION_ABSOLUTE, @@ -12,6 +12,8 @@ import { JUSTIFY_CENTER, OVERFLOW_AUTO, } from '../styles' + +import type { StyleProps } from '../primitives' export interface ModalShellProps extends StyleProps { /** Modal content */ children: React.ReactNode diff --git a/components/src/primitives/Btn.tsx b/components/src/primitives/Btn.tsx index 39819cc0569..5ea917a3a29 100644 --- a/components/src/primitives/Btn.tsx +++ b/components/src/primitives/Btn.tsx @@ -1,9 +1,10 @@ -import styled, { StyledComponent, css } from 'styled-components' +import styled, { css } from 'styled-components' import * as Styles from '../styles' import { styleProps, isntStyleProp } from './style-props' import { RESPONSIVENESS } from '../ui-style-constants' +import type { StyledComponent } from 'styled-components' import type { StyleProps } from './types' export const BUTTON_TYPE_SUBMIT: 'submit' = 'submit' diff --git a/components/src/testing/utils/renderWithProviders.tsx b/components/src/testing/utils/renderWithProviders.tsx index fdf4d4dcc38..c948fe54204 100644 --- a/components/src/testing/utils/renderWithProviders.tsx +++ b/components/src/testing/utils/renderWithProviders.tsx @@ -5,11 +5,11 @@ import { QueryClient, QueryClientProvider } from 'react-query' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' import { vi } from 'vitest' -import { render, RenderResult } from '@testing-library/react' +import { render } from '@testing-library/react' import { createStore } from 'redux' +import type { RenderResult, RenderOptions } from '@testing-library/react' import type { PreloadedState, Store } from 'redux' -import type { RenderOptions } from '@testing-library/react' export interface RenderWithProvidersOptions extends RenderOptions { initialState?: State diff --git a/discovery-client/src/store/actions.ts b/discovery-client/src/store/actions.ts index 9094118be56..1c544576873 100644 --- a/discovery-client/src/store/actions.ts +++ b/discovery-client/src/store/actions.ts @@ -1,7 +1,7 @@ import type { HealthPollerResult } from '../types' import type { MdnsBrowserService } from '../mdns-browser' -import * as Types from './types' +import type * as Types from './types' export const SERVICE_FOUND: 'mdns:SERVICE_FOUND' = 'mdns:SERVICE_FOUND' diff --git a/discovery-client/src/store/types.ts b/discovery-client/src/store/types.ts index 2fbbd206453..cc74c390ff2 100644 --- a/discovery-client/src/store/types.ts +++ b/discovery-client/src/store/types.ts @@ -10,13 +10,13 @@ import type { import type { MdnsBrowserService } from '../mdns-browser' -import { +import type { HEALTH_STATUS_UNREACHABLE, HEALTH_STATUS_NOT_OK, HEALTH_STATUS_OK, } from '../constants' -import { +import type { INITIALIZE_STATE, SERVICE_FOUND, HEALTH_POLLED, diff --git a/discovery-client/typings/mdns-js.d.ts b/discovery-client/typings/mdns-js.d.ts index 7f9c55b6ccb..2d230a1b8cf 100644 --- a/discovery-client/typings/mdns-js.d.ts +++ b/discovery-client/typings/mdns-js.d.ts @@ -1,6 +1,6 @@ declare module 'mdns-js' { import EventEmitter from 'events' - import { Socket } from 'dgram' + import type { Socket } from 'dgram' namespace mdns { interface BrowserService { diff --git a/labware-designer/typings/global.d.ts b/labware-designer/typings/global.d.ts index 007983beba5..24e685aa694 100644 --- a/labware-designer/typings/global.d.ts +++ b/labware-designer/typings/global.d.ts @@ -1,4 +1,4 @@ -import * as allSharedData from '@opentrons/shared-data' +import type * as allSharedData from '@opentrons/shared-data' declare global { interface Window { diff --git a/labware-library/src/labware-creator/components/ConditionalLabwareRender.tsx b/labware-library/src/labware-creator/components/ConditionalLabwareRender.tsx index 8b19353248c..4419fde57d9 100644 --- a/labware-library/src/labware-creator/components/ConditionalLabwareRender.tsx +++ b/labware-library/src/labware-creator/components/ConditionalLabwareRender.tsx @@ -6,11 +6,11 @@ import { RobotWorkSpace, } from '@opentrons/components' import { - LabwareDefinition2, SLOT_LENGTH_MM as DEFAULT_X_DIMENSION, SLOT_WIDTH_MM as DEFAULT_Y_DIMENSION, } from '@opentrons/shared-data' import styles from './ConditionalLabwareRender.module.css' +import type { LabwareDefinition2 } from '@opentrons/shared-data' interface Props { definition: LabwareDefinition2 | null diff --git a/labware-library/src/labware-creator/components/Dropdown.tsx b/labware-library/src/labware-creator/components/Dropdown.tsx index 414b70ee7a8..a4ea2c8101a 100644 --- a/labware-library/src/labware-creator/components/Dropdown.tsx +++ b/labware-library/src/labware-creator/components/Dropdown.tsx @@ -3,17 +3,16 @@ import * as React from 'react' import { Box, SelectField, - SelectOption, - StyleProps, Tooltip, useHoverTooltip, } from '@opentrons/components' import { Field } from 'formik' import { reportFieldEdit } from '../analyticsUtils' -import { getLabel, LabwareFields } from '../fields' -import type { RichOption, RichOptions } from '../fields' +import { getLabel } from '../fields' import fieldStyles from './fieldStyles.module.css' import styles from './Dropdown.module.css' +import type { SelectOption, StyleProps } from '@opentrons/components' +import type { LabwareFields, RichOption, RichOptions } from '../fields' export interface DropdownProps extends StyleProps { name: keyof LabwareFields diff --git a/labware-library/src/labware-creator/components/FormLevelErrorAlerts.tsx b/labware-library/src/labware-creator/components/FormLevelErrorAlerts.tsx index f274d656ed3..bf8883bfaa3 100644 --- a/labware-library/src/labware-creator/components/FormLevelErrorAlerts.tsx +++ b/labware-library/src/labware-creator/components/FormLevelErrorAlerts.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { AlertItem } from '@opentrons/components' -import { LabwareCreatorErrors, FORM_LEVEL_ERRORS } from '../formLevelValidation' +import { FORM_LEVEL_ERRORS } from '../formLevelValidation' +import type { LabwareCreatorErrors } from '../formLevelValidation' export const FormLevelErrorAlerts = (props: { errors: LabwareCreatorErrors diff --git a/labware-library/src/labware-creator/components/__tests__/FormAlerts.test.tsx b/labware-library/src/labware-creator/components/__tests__/FormAlerts.test.tsx index 108d83560ae..440c175b299 100644 --- a/labware-library/src/labware-creator/components/__tests__/FormAlerts.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/FormAlerts.test.tsx @@ -9,7 +9,8 @@ import { LABWARE_TOO_SMALL_ERROR, LABWARE_TOO_LARGE_ERROR, } from '../../fields' -import { FormAlerts, Props as FormAlertProps } from '../alerts/FormAlerts' +import { FormAlerts } from '../alerts/FormAlerts' +import type { Props as FormAlertProps } from '../alerts/FormAlerts' vi.mock('../../formSelectors') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/CreateNewDefinition.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/CreateNewDefinition.test.tsx index f2095e4d630..09e4cde21dd 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/CreateNewDefinition.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/CreateNewDefinition.test.tsx @@ -1,11 +1,12 @@ import React from 'react' import { vi, describe, it, expect } from 'vitest' -import { FormikConfig } from 'formik' import { render, fireEvent } from '@testing-library/react' import '@testing-library/jest-dom/vitest' -import { getDefaultFormState, LabwareFields } from '../../../fields' +import { getDefaultFormState } from '../../../fields' import { wrapInFormik } from '../../utils/wrapInFormik' import { CreateNewDefinition } from '../../sections/CreateNewDefinition' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' const formikConfig: FormikConfig = { initialValues: getDefaultFormState(), diff --git a/labware-library/src/labware-creator/components/__tests__/sections/CustomTiprackWarning.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/CustomTiprackWarning.test.tsx index 6e18832b7bd..a63ecf9f6e9 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/CustomTiprackWarning.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/CustomTiprackWarning.test.tsx @@ -1,16 +1,11 @@ import React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' -import { FormikConfig } from 'formik' import { render, screen } from '@testing-library/react' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' - +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { CustomTiprackWarning } from '../../sections/CustomTiprackWarning' - import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' let formikConfig: FormikConfig diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Description.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Description.test.tsx index 05b3bbb4914..26607f544e7 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Description.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Description.test.tsx @@ -1,17 +1,14 @@ import React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' -import { FormikConfig } from 'formik' import { render, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { Description } from '../../sections/Description' import { isEveryFieldHidden } from '../../../utils/isEveryFieldHidden' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils/isEveryFieldHidden') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Export.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Export.test.tsx index 0711332637f..9e83ddecc74 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Export.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Export.test.tsx @@ -1,17 +1,14 @@ import React from 'react' -import { FormikConfig } from 'formik' import { vi, describe, it, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { render, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { isEveryFieldHidden } from '../../../utils' import { Export } from '../../sections/Export' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/File.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/File.test.tsx index 1b6eb6c7ff5..f3756fd1b54 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/File.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/File.test.tsx @@ -1,17 +1,14 @@ import React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' -import { FormikConfig } from 'formik' import { render, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { isEveryFieldHidden } from '../../../utils' import { File } from '../../sections/File' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Footprint.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Footprint.test.tsx index 11aa7fe13aa..8a578d3c7e3 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Footprint.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Footprint.test.tsx @@ -1,14 +1,15 @@ import React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import '@testing-library/jest-dom/vitest' -import { FormikConfig } from 'formik' import { when } from 'vitest-when' import { render, screen } from '@testing-library/react' import { nestedTextMatcher } from '../../__testUtils__/nestedTextMatcher' -import { getDefaultFormState, LabwareFields } from '../../../fields' +import { getDefaultFormState } from '../../../fields' import { Footprint } from '../../sections/Footprint' import { wrapInFormik } from '../../utils/wrapInFormik' import { isEveryFieldHidden } from '../../../utils' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Grid.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Grid.test.tsx index 3347be9baf0..40a49859748 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Grid.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Grid.test.tsx @@ -1,20 +1,17 @@ import React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' -import { FormikConfig } from 'formik' import isEqual from 'lodash/isEqual' import { when } from 'vitest-when' import { render, screen } from '@testing-library/react' -import { - getDefaultFormState, - LabwareFields, - yesNoOptions, -} from '../../../fields' +import { getDefaultFormState, yesNoOptions } from '../../../fields' import { isEveryFieldHidden, getLabwareName } from '../../../utils' import { Grid } from '../../sections/Grid' import { FormAlerts } from '../../alerts/FormAlerts' import { TextField } from '../../TextField' import { RadioField } from '../../RadioField' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') vi.mock('../../TextField') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/GridOffset.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/GridOffset.test.tsx index 6cb1fbeb77c..9ae5b28a65f 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/GridOffset.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/GridOffset.test.tsx @@ -1,16 +1,17 @@ import React from 'react' -import { FormikConfig } from 'formik' import isEqual from 'lodash/isEqual' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { render, screen } from '@testing-library/react' import { nestedTextMatcher } from '../../__testUtils__/nestedTextMatcher' -import { getDefaultFormState, LabwareFields } from '../../../fields' +import { getDefaultFormState } from '../../../fields' import { isEveryFieldHidden, getLabwareName } from '../../../utils' import { GridOffset } from '../../sections/GridOffset' import { FormAlerts } from '../../alerts/FormAlerts' import { TextField } from '../../TextField' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') vi.mock('../../TextField') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/HandPlacedTipFit.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/HandPlacedTipFit.test.tsx index 0261d3183c8..595908aa989 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/HandPlacedTipFit.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/HandPlacedTipFit.test.tsx @@ -1,12 +1,10 @@ import React from 'react' -import { FormikConfig } from 'formik' import isEqual from 'lodash/isEqual' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import { render, screen } from '@testing-library/react' import { getDefaultFormState, getInitialStatus, - LabwareFields, snugLooseOptions, } from '../../../fields' import { HandPlacedTipFit } from '../../sections/HandPlacedTipFit' @@ -14,6 +12,8 @@ import { FormAlerts } from '../../alerts/FormAlerts' import { TipFitAlerts } from '../../alerts/TipFitAlerts' import { Dropdown } from '../../Dropdown' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../Dropdown') vi.mock('../../alerts/FormAlerts') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Height.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Height.test.tsx index d70892e5359..84296e1c4b8 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Height.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Height.test.tsx @@ -2,13 +2,14 @@ import React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { when } from 'vitest-when' -import { FormikConfig } from 'formik' import { render, screen } from '@testing-library/react' import { nestedTextMatcher } from '../../__testUtils__/nestedTextMatcher' -import { getDefaultFormState, LabwareFields } from '../../../fields' +import { getDefaultFormState } from '../../../fields' import { isEveryFieldHidden } from '../../../utils' import { Height } from '../../sections/Height' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Preview.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Preview.test.tsx index 385f677da2e..7389010bcac 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Preview.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Preview.test.tsx @@ -1,18 +1,15 @@ import React from 'react' -import { FormikConfig } from 'formik' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { when } from 'vitest-when' import { render, screen } from '@testing-library/react' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { getLabwareName } from '../../../utils' import { Preview } from '../../sections/Preview' import { wrapInFormik } from '../../utils/wrapInFormik' import { FORM_LEVEL_ERRORS } from '../../../formLevelValidation' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Regularity.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Regularity.test.tsx index cee5a4e0ba0..cada50867ce 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Regularity.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Regularity.test.tsx @@ -2,16 +2,13 @@ import React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import '@testing-library/jest-dom/vitest' import { when } from 'vitest-when' -import { FormikConfig } from 'formik' import { render, screen } from '@testing-library/react' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { isEveryFieldHidden, getLabwareName } from '../../../utils' import { Regularity } from '../../sections/Regularity' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/Volume.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/Volume.test.tsx index faafd0e4ec8..c0fc90b54eb 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/Volume.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/Volume.test.tsx @@ -1,17 +1,14 @@ import React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' -import { FormikConfig } from 'formik' import '@testing-library/jest-dom/vitest' import { when } from 'vitest-when' import { render, screen } from '@testing-library/react' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { isEveryFieldHidden, getLabwareName } from '../../../utils' import { Volume } from '../../sections/Volume' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/WellBottomAndDepth.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/WellBottomAndDepth.test.tsx index fc081e38a96..db7c7193697 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/WellBottomAndDepth.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/WellBottomAndDepth.test.tsx @@ -2,18 +2,13 @@ import React from 'react' import { vi, it, expect, describe, beforeEach, afterEach } from 'vitest' import { render, screen } from '@testing-library/react' import '@testing-library/jest-dom/vitest' -import { FormikConfig } from 'formik' import { when } from 'vitest-when' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, - LabwareType, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { getLabwareName } from '../../../utils' import { WellBottomAndDepth } from '../../sections/WellBottomAndDepth' - import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields, LabwareType } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/WellShapeAndSides.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/WellShapeAndSides.test.tsx index f788c6108fc..74202597ee1 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/WellShapeAndSides.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/WellShapeAndSides.test.tsx @@ -1,16 +1,13 @@ import React from 'react' import { vi, describe, beforeEach, afterEach, it, expect } from 'vitest' import { render, screen } from '@testing-library/react' -import { FormikConfig } from 'formik' import { when } from 'vitest-when' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { displayAsTube, getLabwareName } from '../../../utils' import { WellShapeAndSides } from '../../sections/WellShapeAndSides' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/__tests__/sections/WellSpacing.test.tsx b/labware-library/src/labware-creator/components/__tests__/sections/WellSpacing.test.tsx index 4f79611f073..6cd9b77b09e 100644 --- a/labware-library/src/labware-creator/components/__tests__/sections/WellSpacing.test.tsx +++ b/labware-library/src/labware-creator/components/__tests__/sections/WellSpacing.test.tsx @@ -1,17 +1,14 @@ import React from 'react' -import { FormikConfig } from 'formik' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import { when } from 'vitest-when' import { render, screen } from '@testing-library/react' import { nestedTextMatcher } from '../../__testUtils__/nestedTextMatcher' -import { - getDefaultFormState, - getInitialStatus, - LabwareFields, -} from '../../../fields' +import { getDefaultFormState, getInitialStatus } from '../../../fields' import { isEveryFieldHidden, getLabwareName } from '../../../utils' import { WellSpacing } from '../../sections/WellSpacing' import { wrapInFormik } from '../../utils/wrapInFormik' +import type { FormikConfig } from 'formik' +import type { LabwareFields } from '../../../fields' vi.mock('../../../utils') diff --git a/labware-library/src/labware-creator/components/alerts/FormAlerts.tsx b/labware-library/src/labware-creator/components/alerts/FormAlerts.tsx index 4a421564a49..1312a0f44d6 100644 --- a/labware-library/src/labware-creator/components/alerts/FormAlerts.tsx +++ b/labware-library/src/labware-creator/components/alerts/FormAlerts.tsx @@ -4,7 +4,6 @@ import pick from 'lodash/pick' import { AlertItem } from '@opentrons/components' import { getLabel, - LabwareFields, IRREGULAR_LABWARE_ERROR, LABWARE_TOO_SMALL_ERROR, LABWARE_TOO_LARGE_ERROR, @@ -17,6 +16,7 @@ import { import { LinkOut } from '../LinkOut' import type { FormikTouched, FormikErrors } from 'formik' +import type { LabwareFields } from '../../fields' export interface Props { values: LabwareFields fieldList: Array diff --git a/labware-library/src/labware-creator/components/alerts/HeightAlerts.tsx b/labware-library/src/labware-creator/components/alerts/HeightAlerts.tsx index 21b76362f9f..98f00c67fc3 100644 --- a/labware-library/src/labware-creator/components/alerts/HeightAlerts.tsx +++ b/labware-library/src/labware-creator/components/alerts/HeightAlerts.tsx @@ -1,7 +1,8 @@ import * as React from 'react' -import { FormikTouched } from 'formik' -import { LabwareFields, MAX_SUGGESTED_Z } from '../../fields' import { AlertItem } from '@opentrons/components' +import { MAX_SUGGESTED_Z } from '../../fields' +import type { FormikTouched } from 'formik' +import type { LabwareFields } from '../../fields' export interface Props { values: LabwareFields diff --git a/labware-library/src/labware-creator/components/alerts/TipFitAlerts.tsx b/labware-library/src/labware-creator/components/alerts/TipFitAlerts.tsx index 5108beaa6c4..a4fdfb1ec19 100644 --- a/labware-library/src/labware-creator/components/alerts/TipFitAlerts.tsx +++ b/labware-library/src/labware-creator/components/alerts/TipFitAlerts.tsx @@ -1,7 +1,7 @@ import * as React from 'react' -import { FormikTouched } from 'formik' -import { LabwareFields } from '../../fields' import { AlertItem } from '@opentrons/components' +import type { FormikTouched } from 'formik' +import type { LabwareFields } from '../../fields' export interface Props { values: LabwareFields diff --git a/labware-library/src/labware-creator/components/alerts/XYDimensionAlerts.tsx b/labware-library/src/labware-creator/components/alerts/XYDimensionAlerts.tsx index 4f8149d4dd5..5c9fcdd704f 100644 --- a/labware-library/src/labware-creator/components/alerts/XYDimensionAlerts.tsx +++ b/labware-library/src/labware-creator/components/alerts/XYDimensionAlerts.tsx @@ -1,14 +1,14 @@ import * as React from 'react' -import { FormikTouched } from 'formik' import { AlertItem } from '@opentrons/components' import { SUGGESTED_X, SUGGESTED_Y, LINK_CUSTOM_LABWARE_FORM, SUGGESTED_XY_RANGE, - LabwareFields, } from '../../fields' import { LinkOut } from '../LinkOut' +import type { FormikTouched } from 'formik' +import type { LabwareFields } from '../../fields' const xyMessage = (
diff --git a/labware-library/src/labware-creator/components/sections/Description.tsx b/labware-library/src/labware-creator/components/sections/Description.tsx index f6dcb71d4b1..7d5c7e12d84 100644 --- a/labware-library/src/labware-creator/components/sections/Description.tsx +++ b/labware-library/src/labware-creator/components/sections/Description.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { useFormikContext } from 'formik' -import { LabwareFields } from '../../fields' import { isEveryFieldHidden } from '../../utils' import { getIsOpentronsTubeRack } from '../../utils/getIsOpentronsTubeRack' import { FormAlerts } from '../alerts/FormAlerts' @@ -9,6 +8,7 @@ import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' import { Flex } from '@opentrons/components' +import type { LabwareFields } from '../../fields' interface Props { values: LabwareFields diff --git a/labware-library/src/labware-creator/components/sections/File.tsx b/labware-library/src/labware-creator/components/sections/File.tsx index bd2129a361a..e54b4c0111f 100644 --- a/labware-library/src/labware-creator/components/sections/File.tsx +++ b/labware-library/src/labware-creator/components/sections/File.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { useFormikContext } from 'formik' -import { LabwareFields } from '../../fields' import { maskLoadName } from '../../fieldMasks' import { getDefaultDisplayName, getDefaultLoadName } from '../../formSelectors' import { isEveryFieldHidden } from '../../utils' @@ -9,6 +8,7 @@ import { TextField } from '../TextField' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' const Content = (props: { values: LabwareFields }): JSX.Element => (
diff --git a/labware-library/src/labware-creator/components/sections/Footprint.tsx b/labware-library/src/labware-creator/components/sections/Footprint.tsx index 8656738cec4..6564a20eed7 100644 --- a/labware-library/src/labware-creator/components/sections/Footprint.tsx +++ b/labware-library/src/labware-creator/components/sections/Footprint.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { useFormikContext } from 'formik' import { makeMaskToDecimal } from '../../fieldMasks' -import { LabwareFields } from '../../fields' import { isEveryFieldHidden } from '../../utils' import { FormAlerts } from '../alerts/FormAlerts' import { XYDimensionAlerts } from '../alerts/XYDimensionAlerts' @@ -10,6 +9,7 @@ import { SectionBody } from './SectionBody' import footprintImage from '../../images/footprint.svg' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' const maskTo2Decimal = makeMaskToDecimal(2) diff --git a/labware-library/src/labware-creator/components/sections/Grid.tsx b/labware-library/src/labware-creator/components/sections/Grid.tsx index d764b018824..067297a2bad 100644 --- a/labware-library/src/labware-creator/components/sections/Grid.tsx +++ b/labware-library/src/labware-creator/components/sections/Grid.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { useFormikContext } from 'formik' import { maskToInteger } from '../../fieldMasks' import { isEveryFieldHidden, getLabwareName } from '../../utils' -import { LabwareFields, yesNoOptions } from '../../fields' +import { yesNoOptions } from '../../fields' import { FormAlerts } from '../alerts/FormAlerts' import { TextField } from '../TextField' import { RadioField } from '../RadioField' @@ -10,6 +10,7 @@ import { GridImg } from '../diagrams' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' interface Props { values: LabwareFields diff --git a/labware-library/src/labware-creator/components/sections/GridOffset.tsx b/labware-library/src/labware-creator/components/sections/GridOffset.tsx index 855bb458374..8bc13c0bfae 100644 --- a/labware-library/src/labware-creator/components/sections/GridOffset.tsx +++ b/labware-library/src/labware-creator/components/sections/GridOffset.tsx @@ -2,13 +2,13 @@ import * as React from 'react' import { useFormikContext } from 'formik' import { makeMaskToDecimal } from '../../fieldMasks' import { isEveryFieldHidden, getLabwareName } from '../../utils' -import { LabwareFields } from '../../fields' import { FormAlerts } from '../alerts/FormAlerts' import { TextField } from '../TextField' import { XYOffsetImg, XYOffsetHelperTextImg } from '../diagrams' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' const maskTo2Decimal = makeMaskToDecimal(2) diff --git a/labware-library/src/labware-creator/components/sections/Height.tsx b/labware-library/src/labware-creator/components/sections/Height.tsx index 62eb3194552..a56256a38ef 100644 --- a/labware-library/src/labware-creator/components/sections/Height.tsx +++ b/labware-library/src/labware-creator/components/sections/Height.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import { useFormikContext } from 'formik' import { isEveryFieldHidden } from '../../utils' import { makeMaskToDecimal } from '../../fieldMasks' -import { LabwareFields } from '../../fields' import { HeightAlerts } from '../alerts/HeightAlerts' import { FormAlerts } from '../alerts/FormAlerts' import { TextField } from '../TextField' @@ -11,6 +10,7 @@ import { HeightGuidingText } from '../HeightGuidingText' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' const maskTo2Decimal = makeMaskToDecimal(2) diff --git a/labware-library/src/labware-creator/components/sections/Preview.tsx b/labware-library/src/labware-creator/components/sections/Preview.tsx index 287c3368c75..f06a120fb92 100644 --- a/labware-library/src/labware-creator/components/sections/Preview.tsx +++ b/labware-library/src/labware-creator/components/sections/Preview.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { useFormikContext } from 'formik' -import { FormStatus, LabwareFields } from '../../fields' import { getLabwareName } from '../../utils' import { ConditionalLabwareRender } from '../ConditionalLabwareRender' import { FormLevelErrorAlerts } from '../FormLevelErrorAlerts' @@ -8,6 +7,7 @@ import { FormLevelErrorAlerts } from '../FormLevelErrorAlerts' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { FormStatus, LabwareFields } from '../../fields' export const PreviewInstructions = (props: { values: LabwareFields diff --git a/labware-library/src/labware-creator/components/sections/Volume.tsx b/labware-library/src/labware-creator/components/sections/Volume.tsx index 78980748bc9..c8ad8d4c34b 100644 --- a/labware-library/src/labware-creator/components/sections/Volume.tsx +++ b/labware-library/src/labware-creator/components/sections/Volume.tsx @@ -2,12 +2,12 @@ import * as React from 'react' import { useFormikContext } from 'formik' import { isEveryFieldHidden, getLabwareName } from '../../utils' import { makeMaskToDecimal } from '../../fieldMasks' -import { LabwareFields } from '../../fields' import { FormAlerts } from '../alerts/FormAlerts' import { TextField } from '../TextField' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' const maskTo2Decimal = makeMaskToDecimal(2) diff --git a/labware-library/src/labware-creator/components/sections/WellBottomAndDepth.tsx b/labware-library/src/labware-creator/components/sections/WellBottomAndDepth.tsx index 0d2112acb27..d27e1f6a23f 100644 --- a/labware-library/src/labware-creator/components/sections/WellBottomAndDepth.tsx +++ b/labware-library/src/labware-creator/components/sections/WellBottomAndDepth.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import capitalize from 'lodash/capitalize' import { useFormikContext } from 'formik' import { makeMaskToDecimal } from '../../fieldMasks' -import { LabwareFields } from '../../fields' import { FormAlerts } from '../alerts/FormAlerts' import { TextField } from '../TextField' import { RadioField } from '../RadioField' @@ -12,6 +11,7 @@ import { wellBottomShapeOptionsWithIcons } from '../optionsWithImages' import styles from '../../styles.module.css' import { getLabwareName } from '../../utils' +import type { LabwareFields } from '../../fields' const maskTo2Decimal = makeMaskToDecimal(2) diff --git a/labware-library/src/labware-creator/components/sections/WellShapeAndSides.tsx b/labware-library/src/labware-creator/components/sections/WellShapeAndSides.tsx index 5a4cd5590cf..23b8362cef3 100644 --- a/labware-library/src/labware-creator/components/sections/WellShapeAndSides.tsx +++ b/labware-library/src/labware-creator/components/sections/WellShapeAndSides.tsx @@ -3,7 +3,6 @@ import { useFormikContext } from 'formik' import capitalize from 'lodash/capitalize' import { makeMaskToDecimal } from '../../fieldMasks' import { displayAsTube, getLabwareName } from '../../utils' -import { LabwareFields } from '../../fields' import { FormAlerts } from '../alerts/FormAlerts' import { wellShapeOptionsWithIcons } from '../optionsWithImages' import { TextField } from '../TextField' @@ -12,6 +11,7 @@ import { WellXYImg } from '../diagrams' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' const maskTo2Decimal = makeMaskToDecimal(2) diff --git a/labware-library/src/labware-creator/components/sections/WellSpacing.tsx b/labware-library/src/labware-creator/components/sections/WellSpacing.tsx index 05ed08b5ec3..05c473dd9e3 100644 --- a/labware-library/src/labware-creator/components/sections/WellSpacing.tsx +++ b/labware-library/src/labware-creator/components/sections/WellSpacing.tsx @@ -3,13 +3,13 @@ import { useFormikContext } from 'formik' import capitalize from 'lodash/capitalize' import { makeMaskToDecimal } from '../../fieldMasks' import { isEveryFieldHidden, getLabwareName } from '../../utils' -import { LabwareFields } from '../../fields' import { FormAlerts } from '../alerts/FormAlerts' import { TextField } from '../TextField' import { XYSpacingImg } from '../diagrams' import { SectionBody } from './SectionBody' import styles from '../../styles.module.css' +import type { LabwareFields } from '../../fields' const maskTo2Decimal = makeMaskToDecimal(2) diff --git a/labware-library/src/labware-creator/components/utils/wrapInFormik.tsx b/labware-library/src/labware-creator/components/utils/wrapInFormik.tsx index 2135236d709..4c8bf123ece 100644 --- a/labware-library/src/labware-creator/components/utils/wrapInFormik.tsx +++ b/labware-library/src/labware-creator/components/utils/wrapInFormik.tsx @@ -1,5 +1,6 @@ import * as React from 'react' -import { Formik, FormikConfig } from 'formik' +import { Formik } from 'formik' +import type { FormikConfig } from 'formik' /** * Wraps a component in so it can be unit tested in isolation diff --git a/labware-library/src/labware-creator/fieldsToLabware.ts b/labware-library/src/labware-creator/fieldsToLabware.ts index 1c956ff7c0d..d9a718e0964 100644 --- a/labware-library/src/labware-creator/fieldsToLabware.ts +++ b/labware-library/src/labware-creator/fieldsToLabware.ts @@ -1,17 +1,16 @@ -import { - createRegularLabware, - LabwareWellGroup, - // createIrregularLabware, -} from '@opentrons/shared-data' +import { createRegularLabware } from '@opentrons/shared-data' + import { DISPLAY_VOLUME_UNITS } from './fields' +import { getIsCustomTubeRack } from './utils' +import type { ProcessedLabwareFields } from './fields' import type { + LabwareWellGroup, + // createIrregularLabware, LabwareDefinition2, LabwareDisplayCategory, LabwareWellProperties, } from '@opentrons/shared-data' -import type { ProcessedLabwareFields } from './fields' -import { getIsCustomTubeRack } from './utils' // TODO Ian 2019-07-29: move this constant to shared-data? // This is the distance from channel 1 to channel 8 of any 8-channel, not tied to name/model diff --git a/labware-library/src/labware-creator/formLevelValidation.ts b/labware-library/src/labware-creator/formLevelValidation.ts index 370f61fabc4..38243803cb6 100644 --- a/labware-library/src/labware-creator/formLevelValidation.ts +++ b/labware-library/src/labware-creator/formLevelValidation.ts @@ -1,8 +1,9 @@ -import { FormikErrors } from 'formik' import { labwareFormSchemaBaseObject } from './labwareFormSchema' -import type { LabwareFields } from './fields' import { getLabwareName } from './utils' +import type { LabwareFields } from './fields' +import type { FormikErrors } from 'formik' + export const FORM_LEVEL_ERRORS = 'FORM_LEVEL_ERRORS' export const WELLS_OUT_OF_BOUNDS_X = 'WELLS_OUT_OF_BOUNDS_X' export const WELLS_OUT_OF_BOUNDS_Y = 'WELLS_OUT_OF_BOUNDS_Y' diff --git a/labware-library/src/labware-creator/getDefaultedDef.ts b/labware-library/src/labware-creator/getDefaultedDef.ts index c8d5fd8ca4b..f3ab100a6ea 100644 --- a/labware-library/src/labware-creator/getDefaultedDef.ts +++ b/labware-library/src/labware-creator/getDefaultedDef.ts @@ -1,13 +1,14 @@ import { - LabwareDefinition2, SLOT_LENGTH_MM as DEFAULT_X_DIMENSION, SLOT_WIDTH_MM as DEFAULT_Y_DIMENSION, } from '@opentrons/shared-data' import pick from 'lodash/pick' -import { LabwareFields, ProcessedLabwareFields } from './fields' import { labwareFormSchema } from './labwareFormSchema' import { fieldsToLabware } from './fieldsToLabware' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { LabwareFields, ProcessedLabwareFields } from './fields' + // Fill arbitrary values in to any missing fields that aren't needed for this render, // eg some required definition data like well volume, height, and bottom shape don't affect the render. // diff --git a/labware-library/src/labware-creator/index.tsx b/labware-library/src/labware-creator/index.tsx index 648dec63a9f..8eed39b66da 100644 --- a/labware-library/src/labware-creator/index.tsx +++ b/labware-library/src/labware-creator/index.tsx @@ -11,19 +11,16 @@ import { aluminumBlockAutofills, aluminumBlockChildTypeOptions, aluminumBlockTypeOptions, - FormStatus, getDefaultFormState, getInitialStatus, tubeRackAutofills, tubeRackInsertOptions, } from './fields' + import { makeAutofillOnChange } from './utils/makeAutofillOnChange' import { labwareDefToFields } from './labwareDefToFields' import { labwareFormSchema } from './labwareFormSchema' -import { - formLevelValidation, - LabwareCreatorErrors, -} from './formLevelValidation' +import { formLevelValidation } from './formLevelValidation' import { fieldsToLabware } from './fieldsToLabware' import { LabwareCreator as LabwareCreatorComponent } from './components/LabwareCreator' import { Dropdown } from './components/Dropdown' @@ -48,17 +45,19 @@ import { Volume } from './components/sections/Volume' import { WellBottomAndDepth } from './components/sections/WellBottomAndDepth' import { WellShapeAndSides } from './components/sections/WellShapeAndSides' import { WellSpacing } from './components/sections/WellSpacing' +import { getDefaultedDef } from './getDefaultedDef' +import { getIsXYGeometryChanged } from './utils/getIsXYGeometryChanged' import styles from './styles.module.css' import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { LabwareCreatorErrors } from './formLevelValidation' import type { + FormStatus, ImportError, LabwareFields, ProcessedLabwareFields, } from './fields' -import { getDefaultedDef } from './getDefaultedDef' -import { getIsXYGeometryChanged } from './utils/getIsXYGeometryChanged' const ajv = new Ajv() const validateLabwareSchema = ajv.compile(labwareSchema) diff --git a/labware-library/src/labware-creator/labwareFormSchema.ts b/labware-library/src/labware-creator/labwareFormSchema.ts index 7b0898a8144..24b16894188 100644 --- a/labware-library/src/labware-creator/labwareFormSchema.ts +++ b/labware-library/src/labware-creator/labwareFormSchema.ts @@ -18,9 +18,8 @@ import { MIN_Y_DIMENSION, REQUIRED_FIELD_ERROR, MUST_BE_A_NUMBER_ERROR, - LabwareFields, } from './fields' -import type { ProcessedLabwareFields } from './fields' +import type { LabwareFields, ProcessedLabwareFields } from './fields' // global overrides for Yup's default error messages. Yup.setLocale({ diff --git a/labware-library/src/labware-creator/utils/displayAsTube.ts b/labware-library/src/labware-creator/utils/displayAsTube.ts index 9a55bcc34ad..c4bdd18d7fe 100644 --- a/labware-library/src/labware-creator/utils/displayAsTube.ts +++ b/labware-library/src/labware-creator/utils/displayAsTube.ts @@ -1,4 +1,4 @@ -import { LabwareFields } from '../fields' +import type { LabwareFields } from '../fields' export const displayAsTube = (values: LabwareFields): boolean => values.labwareType === 'tubeRack' || diff --git a/labware-library/src/labware-creator/utils/getIsCustomTubeRack.ts b/labware-library/src/labware-creator/utils/getIsCustomTubeRack.ts index 4766cf8d457..8c11ca58557 100644 --- a/labware-library/src/labware-creator/utils/getIsCustomTubeRack.ts +++ b/labware-library/src/labware-creator/utils/getIsCustomTubeRack.ts @@ -1,4 +1,4 @@ -import { LabwareFields, ProcessedLabwareFields } from '../fields' +import type { LabwareFields, ProcessedLabwareFields } from '../fields' export const getIsCustomTubeRack = ( values: LabwareFields | ProcessedLabwareFields diff --git a/labware-library/src/labware-creator/utils/getIsOpentronsTubeRack.ts b/labware-library/src/labware-creator/utils/getIsOpentronsTubeRack.ts index 5c3590c195b..7894b198e57 100644 --- a/labware-library/src/labware-creator/utils/getIsOpentronsTubeRack.ts +++ b/labware-library/src/labware-creator/utils/getIsOpentronsTubeRack.ts @@ -1,4 +1,4 @@ -import { LabwareFields, ProcessedLabwareFields } from '../fields' +import type { LabwareFields, ProcessedLabwareFields } from '../fields' // NOTE: if tubeRackInsertLoadName is blank, // assume Opentrons tube rack (aka non-custom tube rack) diff --git a/labware-library/src/labware-creator/utils/getIsXYGeometryChanged.ts b/labware-library/src/labware-creator/utils/getIsXYGeometryChanged.ts index b6f0d0058f4..7f8c217c504 100644 --- a/labware-library/src/labware-creator/utils/getIsXYGeometryChanged.ts +++ b/labware-library/src/labware-creator/utils/getIsXYGeometryChanged.ts @@ -1,6 +1,6 @@ import difference from 'lodash/difference' -import { LabwareFields } from '../fields' import { DEFAULTED_DEF_PATCH } from '../getDefaultedDef' +import type { LabwareFields } from '../fields' export const getIsXYGeometryChanged = ( prevValues: LabwareFields, diff --git a/labware-library/src/labware-creator/utils/getLabwareName.ts b/labware-library/src/labware-creator/utils/getLabwareName.ts index 1805ef762ae..5b280fe7960 100644 --- a/labware-library/src/labware-creator/utils/getLabwareName.ts +++ b/labware-library/src/labware-creator/utils/getLabwareName.ts @@ -1,5 +1,5 @@ -import { LabwareFields } from '../fields' import { displayAsTube } from './displayAsTube' +import type { LabwareFields } from '../fields' export const getLabwareName = ( values: LabwareFields, diff --git a/labware-library/src/labware-creator/utils/isEveryFieldHidden.ts b/labware-library/src/labware-creator/utils/isEveryFieldHidden.ts index 1a97ae26023..8de287116b0 100644 --- a/labware-library/src/labware-creator/utils/isEveryFieldHidden.ts +++ b/labware-library/src/labware-creator/utils/isEveryFieldHidden.ts @@ -1,5 +1,5 @@ import { getIsHidden } from '../formSelectors' -import { LabwareFields } from '../fields' +import type { LabwareFields } from '../fields' export const isEveryFieldHidden = ( fieldList: Array, diff --git a/labware-library/src/labware-creator/utils/makeAutofillOnChange.ts b/labware-library/src/labware-creator/utils/makeAutofillOnChange.ts index a9dba75ce71..67fa07497df 100644 --- a/labware-library/src/labware-creator/utils/makeAutofillOnChange.ts +++ b/labware-library/src/labware-creator/utils/makeAutofillOnChange.ts @@ -1,6 +1,6 @@ import mapValues from 'lodash/mapValues' -import { LabwareFields } from '../fields' import type { FormikTouched } from 'formik' +import type { LabwareFields } from '../fields' interface MakeAutofillOnChangeArgs { name: keyof LabwareFields diff --git a/package.json b/package.json index ef12e013721..d440ede1742 100755 --- a/package.json +++ b/package.json @@ -85,6 +85,7 @@ "eslint-config-prettier": "^8.1.0", "eslint-config-standard": "^16.0.2", "eslint-config-standard-with-typescript": "^43.0.1", + "eslint-formatter-summary-chart": "0.3.0", "eslint-plugin-cypress": "^2.11.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-json": "^3.1.0", diff --git a/protocol-designer/src/analytics/actions.ts b/protocol-designer/src/analytics/actions.ts index eee86cd900a..a6fa4fc18cf 100644 --- a/protocol-designer/src/analytics/actions.ts +++ b/protocol-designer/src/analytics/actions.ts @@ -1,4 +1,5 @@ -import { setMixpanelTracking, AnalyticsEvent } from './mixpanel' +import { setMixpanelTracking } from './mixpanel' +import type { AnalyticsEvent } from './mixpanel' export interface SetOptIn { type: 'SET_OPT_IN' diff --git a/protocol-designer/src/analytics/index.ts b/protocol-designer/src/analytics/index.ts index 5f980d62427..4e0941b0228 100644 --- a/protocol-designer/src/analytics/index.ts +++ b/protocol-designer/src/analytics/index.ts @@ -1,5 +1,6 @@ import * as actions from './actions' import * as selectors from './selectors' -import { RootState, rootReducer } from './reducers' +import { rootReducer } from './reducers' +import type { RootState } from './reducers' export { actions, selectors, rootReducer } export type { RootState } diff --git a/protocol-designer/src/analytics/middleware.ts b/protocol-designer/src/analytics/middleware.ts index d089f988261..5fd88ab3fb3 100644 --- a/protocol-designer/src/analytics/middleware.ts +++ b/protocol-designer/src/analytics/middleware.ts @@ -5,15 +5,16 @@ import { getSavedStepForms, } from '../step-forms/selectors' import { getFileMetadata } from '../file-data/selectors' -import { trackEvent, AnalyticsEvent } from './mixpanel' +import { trackEvent } from './mixpanel' import { getHasOptedIn } from './selectors' import { flattenNestedProperties } from './utils/flattenNestedProperties' -import { Middleware } from 'redux' -import { BaseState } from '../types' -import { FormData, StepIdType, StepType } from '../form-types' -import { StepArgsAndErrors } from '../steplist' -import { SaveStepFormAction } from '../ui/steps/actions/thunks' -import { AnalyticsEventAction } from './actions' +import type { Middleware } from 'redux' +import type { BaseState } from '../types' +import type { FormData, StepIdType, StepType } from '../form-types' +import type { StepArgsAndErrors } from '../steplist' +import type { SaveStepFormAction } from '../ui/steps/actions/thunks' +import type { AnalyticsEventAction } from './actions' +import type { AnalyticsEvent } from './mixpanel' // Converts Redux actions to analytics events (read: Mixpanel events). // Returns null if there is no analytics event associated with the action, diff --git a/protocol-designer/src/analytics/mixpanel.ts b/protocol-designer/src/analytics/mixpanel.ts index 075c194318a..c0ed678959b 100644 --- a/protocol-designer/src/analytics/mixpanel.ts +++ b/protocol-designer/src/analytics/mixpanel.ts @@ -2,7 +2,7 @@ import mixpanel from 'mixpanel-browser' import { getIsProduction } from '../networking/opentronsWebApi' import { getHasOptedIn } from './selectors' -import { BaseState } from '../types' +import type { BaseState } from '../types' // TODO(IL, 2020-09-09): AnalyticsEvent type copied from app/src/analytics/types.js, consider merging export type AnalyticsEvent = diff --git a/protocol-designer/src/analytics/reducers.ts b/protocol-designer/src/analytics/reducers.ts index c0beb172283..6d4f71ebaa6 100644 --- a/protocol-designer/src/analytics/reducers.ts +++ b/protocol-designer/src/analytics/reducers.ts @@ -1,8 +1,9 @@ -import { combineReducers, Reducer } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' -import { Action } from '../types' -import { SetOptIn } from './actions' -import { RehydratePersistedAction } from '../persist' +import type { Reducer } from 'redux' +import type { Action } from '../types' +import type { SetOptIn } from './actions' +import type { RehydratePersistedAction } from '../persist' type OptInState = boolean | null const optInInitialState = null // @ts-expect-error(sb, 2021-6-17): cannot use string literals as action type diff --git a/protocol-designer/src/analytics/selectors.ts b/protocol-designer/src/analytics/selectors.ts index 36268e7da5f..77a37bbfcb1 100644 --- a/protocol-designer/src/analytics/selectors.ts +++ b/protocol-designer/src/analytics/selectors.ts @@ -1,3 +1,3 @@ -import { BaseState } from '../types' +import type { BaseState } from '../types' export const getHasOptedIn = (state: BaseState): boolean | null => state.analytics.hasOptedIn diff --git a/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx b/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx index 76074bc8e3b..a2caf67761f 100644 --- a/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx +++ b/protocol-designer/src/components/BatchEditForm/BatchEditMix.tsx @@ -22,12 +22,12 @@ import { getLabwareFieldForPositioningField, } from '../StepEditForm/utils' import { FormColumn } from './FormColumn' -import { FieldPropsByName } from '../StepEditForm/types' -import { WellOrderOption } from '../../form-types' // TODO(IL, 2021-03-01): refactor these fragmented style rules (see #7402) import formStyles from '../forms/forms.module.css' import styles from '../StepEditForm/StepEditForm.module.css' import buttonStyles from '../StepEditForm/ButtonRow/styles.module.css' +import type { FieldPropsByName } from '../StepEditForm/types' +import type { WellOrderOption } from '../../form-types' interface BatchEditMixProps { batchEditFormHasChanges: boolean diff --git a/protocol-designer/src/components/BatchEditForm/BatchEditMoveLiquid.tsx b/protocol-designer/src/components/BatchEditForm/BatchEditMoveLiquid.tsx index d8d56226d63..b6f5617cc73 100644 --- a/protocol-designer/src/components/BatchEditForm/BatchEditMoveLiquid.tsx +++ b/protocol-designer/src/components/BatchEditForm/BatchEditMoveLiquid.tsx @@ -23,12 +23,12 @@ import { getLabwareFieldForPositioningField, } from '../StepEditForm/utils' import { FormColumn } from './FormColumn' -import { FieldPropsByName } from '../StepEditForm/types' -import { WellOrderOption } from '../../form-types' // TODO(IL, 2021-03-01): refactor these fragmented style rules (see #7402) import formStyles from '../forms/forms.module.css' import styles from '../StepEditForm/StepEditForm.module.css' import buttonStyles from '../StepEditForm/ButtonRow/styles.module.css' +import type { FieldPropsByName } from '../StepEditForm/types' +import type { WellOrderOption } from '../../form-types' const SourceDestBatchEditMoveLiquidFields = (props: { prefix: 'aspirate' | 'dispense' diff --git a/protocol-designer/src/components/BatchEditForm/index.tsx b/protocol-designer/src/components/BatchEditForm/index.tsx index 28b779d094f..71de584a43d 100644 --- a/protocol-designer/src/components/BatchEditForm/index.tsx +++ b/protocol-designer/src/components/BatchEditForm/index.tsx @@ -15,11 +15,12 @@ import { resetBatchEditFieldChanges, saveStepFormsMulti, } from '../../step-forms/actions' -import { maskField, StepFieldName } from '../../steplist/fieldLevel' +import { maskField } from '../../steplist/fieldLevel' import { BatchEditMoveLiquid } from './BatchEditMoveLiquid' import { BatchEditMix } from './BatchEditMix' -import { ThunkDispatch } from 'redux-thunk' -import { BaseState } from '../../types' +import type { StepFieldName } from '../../steplist/fieldLevel' +import type { ThunkDispatch } from 'redux-thunk' +import type { BaseState } from '../../types' export const BatchEditForm = (): JSX.Element => { const { t } = useTranslation('tooltip') diff --git a/protocol-designer/src/components/BatchEditForm/makeBatchEditFieldProps.ts b/protocol-designer/src/components/BatchEditForm/makeBatchEditFieldProps.ts index 57564e5537b..4838baf0305 100644 --- a/protocol-designer/src/components/BatchEditForm/makeBatchEditFieldProps.ts +++ b/protocol-designer/src/components/BatchEditForm/makeBatchEditFieldProps.ts @@ -1,14 +1,14 @@ import noop from 'lodash/noop' -import { - DisabledFields, - MultiselectFieldValues, -} from '../../ui/steps/selectors' import { getFieldDefaultTooltip, getFieldIndeterminateTooltip, } from '../StepEditForm/utils' -import { FieldPropsByName } from '../StepEditForm/types' -import { StepFieldName } from '../../form-types' +import type { + DisabledFields, + MultiselectFieldValues, +} from '../../ui/steps/selectors' +import type { FieldPropsByName } from '../StepEditForm/types' +import type { StepFieldName } from '../../form-types' export const makeBatchEditFieldProps = ( fieldValues: MultiselectFieldValues, disabledFields: DisabledFields, diff --git a/protocol-designer/src/components/ColorPicker/index.tsx b/protocol-designer/src/components/ColorPicker/index.tsx index 676eae59397..26d1cc50607 100644 --- a/protocol-designer/src/components/ColorPicker/index.tsx +++ b/protocol-designer/src/components/ColorPicker/index.tsx @@ -1,7 +1,8 @@ import * as React from 'react' import cx from 'classnames' -import { ColorResult, TwitterPicker } from 'react-color' +import { TwitterPicker } from 'react-color' import { DEFAULT_LIQUID_COLORS } from '@opentrons/shared-data' +import type { ColorResult } from 'react-color' import styles from './ColorPicker.module.css' diff --git a/protocol-designer/src/components/DeckSetup/LabwareOnDeck.tsx b/protocol-designer/src/components/DeckSetup/LabwareOnDeck.tsx index c84239e3b10..e36272d4ada 100644 --- a/protocol-designer/src/components/DeckSetup/LabwareOnDeck.tsx +++ b/protocol-designer/src/components/DeckSetup/LabwareOnDeck.tsx @@ -6,8 +6,8 @@ import { selectors } from '../../labware-ingred/selectors' import * as wellContentsSelectors from '../../top-selectors/well-contents' import * as highlightSelectors from '../../top-selectors/substep-highlight' import * as tipContentsSelectors from '../../top-selectors/tip-contents' -import { LabwareOnDeck as LabwareOnDeckType } from '../../step-forms' import { wellFillFromWellContents } from '../labware/utils' +import type { LabwareOnDeck as LabwareOnDeckType } from '../../step-forms' interface LabwareOnDeckProps { className?: string diff --git a/protocol-designer/src/components/DeckSetup/LabwareOverlays/AdapterControls.tsx b/protocol-designer/src/components/DeckSetup/LabwareOverlays/AdapterControls.tsx index 172b5b1129a..44da52c8787 100644 --- a/protocol-designer/src/components/DeckSetup/LabwareOverlays/AdapterControls.tsx +++ b/protocol-designer/src/components/DeckSetup/LabwareOverlays/AdapterControls.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { useDispatch, useSelector } from 'react-redux' -import { DropTargetMonitor, useDrop } from 'react-dnd' +import { useDrop } from 'react-dnd' import cx from 'classnames' import noop from 'lodash/noop' import { Icon, RobotCoordsForeignDiv } from '@opentrons/components' @@ -15,10 +15,12 @@ import { openAddLabwareModal, } from '../../../labware-ingred/actions' import { selectors as labwareDefSelectors } from '../../../labware-defs' -import { START_TERMINAL_ITEM_ID, TerminalItemId } from '../../../steplist' +import { START_TERMINAL_ITEM_ID } from '../../../steplist' import { BlockedSlot } from './BlockedSlot' +import type { DropTargetMonitor } from 'react-dnd' import type { CoordinateTuple, Dimensions } from '@opentrons/shared-data' +import type { TerminalItemId } from '../../../steplist' import type { LabwareOnDeck } from '../../../step-forms' import styles from './LabwareOverlays.module.css' diff --git a/protocol-designer/src/components/DeckSetup/LabwareOverlays/EditLabware.tsx b/protocol-designer/src/components/DeckSetup/LabwareOverlays/EditLabware.tsx index d75cefe5b71..3c3e577ecf0 100644 --- a/protocol-designer/src/components/DeckSetup/LabwareOverlays/EditLabware.tsx +++ b/protocol-designer/src/components/DeckSetup/LabwareOverlays/EditLabware.tsx @@ -4,7 +4,7 @@ import { useDispatch, useSelector } from 'react-redux' import cx from 'classnames' import { Icon } from '@opentrons/components' import { getLabwareDisplayName } from '@opentrons/shared-data' -import { DropTargetMonitor, useDrag, useDrop } from 'react-dnd' +import { useDrag, useDrop } from 'react-dnd' import { NameThisLabware } from './NameThisLabware' import { DND_TYPES } from '../../../constants' import { @@ -14,9 +14,10 @@ import { openIngredientSelector, } from '../../../labware-ingred/actions' import { selectors as labwareIngredSelectors } from '../../../labware-ingred/selectors' -import { ThunkDispatch } from '../../../types' -import { LabwareOnDeck } from '../../../step-forms' import styles from './LabwareOverlays.module.css' +import type { DropTargetMonitor } from 'react-dnd' +import type { ThunkDispatch } from '../../../types' +import type { LabwareOnDeck } from '../../../step-forms' interface Props { labwareOnDeck: LabwareOnDeck diff --git a/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareControls.tsx b/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareControls.tsx index 34a990e3646..0fba71f5c7b 100644 --- a/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareControls.tsx +++ b/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareControls.tsx @@ -2,8 +2,7 @@ import * as React from 'react' import cx from 'classnames' import { RobotCoordsForeignDiv } from '@opentrons/components' -import { START_TERMINAL_ITEM_ID, TerminalItemId } from '../../../steplist' -import { LabwareOnDeck } from '../../../step-forms' +import { START_TERMINAL_ITEM_ID } from '../../../steplist' import { BlockedSlot } from './BlockedSlot' import { BrowseLabware } from './BrowseLabware' import { EditLabware } from './EditLabware' @@ -12,6 +11,8 @@ import { LabwareHighlight } from './LabwareHighlight' import styles from './LabwareOverlays.module.css' import type { CoordinateTuple } from '@opentrons/shared-data' +import type { TerminalItemId } from '../../../steplist' +import type { LabwareOnDeck } from '../../../step-forms' interface LabwareControlsProps { labwareOnDeck: LabwareOnDeck diff --git a/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareName.tsx b/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareName.tsx index 7efdc0d2949..339e4af0176 100644 --- a/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareName.tsx +++ b/protocol-designer/src/components/DeckSetup/LabwareOverlays/LabwareName.tsx @@ -3,7 +3,7 @@ import { useSelector } from 'react-redux' import { LabwareNameOverlay, truncateString } from '@opentrons/components' import { getLabwareDisplayName } from '@opentrons/shared-data' import { selectors as uiLabwareSelectors } from '../../../ui/labware' -import { LabwareOnDeck } from '../../../step-forms' +import type { LabwareOnDeck } from '../../../step-forms' interface LabwareNameProps { labwareOnDeck: LabwareOnDeck } diff --git a/protocol-designer/src/components/DeckSetup/LabwareOverlays/SlotControls.tsx b/protocol-designer/src/components/DeckSetup/LabwareOverlays/SlotControls.tsx index 2849506cefb..283c8712ace 100644 --- a/protocol-designer/src/components/DeckSetup/LabwareOverlays/SlotControls.tsx +++ b/protocol-designer/src/components/DeckSetup/LabwareOverlays/SlotControls.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector, useDispatch } from 'react-redux' import noop from 'lodash/noop' -import { useDrop, DropTargetMonitor, useDrag } from 'react-dnd' +import { useDrop, useDrag } from 'react-dnd' import cx from 'classnames' import { Icon, RobotCoordsForeignDiv } from '@opentrons/components' import { DND_TYPES } from '../../../constants' @@ -15,16 +15,18 @@ import { openAddLabwareModal, } from '../../../labware-ingred/actions' import { selectors as labwareDefSelectors } from '../../../labware-defs' -import { START_TERMINAL_ITEM_ID, TerminalItemId } from '../../../steplist' +import { START_TERMINAL_ITEM_ID } from '../../../steplist' import { BlockedSlot } from './BlockedSlot' import styles from './LabwareOverlays.module.css' +import type { DropTargetMonitor } from 'react-dnd' import type { CoordinateTuple, Dimensions, ModuleType, } from '@opentrons/shared-data' import type { LabwareOnDeck } from '../../../step-forms' +import type { TerminalItemId } from '../../../steplist' interface SlotControlsProps { slotPosition: CoordinateTuple | null diff --git a/protocol-designer/src/components/DeckSetup/Ot2ModuleTag.tsx b/protocol-designer/src/components/DeckSetup/Ot2ModuleTag.tsx index 5809ed12b6a..abb43d417f0 100644 --- a/protocol-designer/src/components/DeckSetup/Ot2ModuleTag.tsx +++ b/protocol-designer/src/components/DeckSetup/Ot2ModuleTag.tsx @@ -8,11 +8,13 @@ import { } from '@opentrons/components' import { getModuleDisplayName, + THERMOCYCLER_MODULE_V1, + THERMOCYCLER_MODULE_V2, +} from '@opentrons/shared-data' +import type { ModuleDefinition, ModuleModel, ModuleOrientation, - THERMOCYCLER_MODULE_V1, - THERMOCYCLER_MODULE_V2, } from '@opentrons/shared-data' interface Ot2ModuleTagProps { diff --git a/protocol-designer/src/components/DeckSetup/index.tsx b/protocol-designer/src/components/DeckSetup/index.tsx index 698a49f2456..a99886c9873 100644 --- a/protocol-designer/src/components/DeckSetup/index.tsx +++ b/protocol-designer/src/components/DeckSetup/index.tsx @@ -10,17 +10,11 @@ import { RobotCoordinateSpaceWithRef, SingleSlotFixture, StagingAreaFixture, - StagingAreaLocation, - TrashCutoutId, useOnClickOutside, WasteChuteFixture, WasteChuteStagingAreaFixture, } from '@opentrons/components' -import { - AdditionalEquipmentEntity, - MODULES_WITH_COLLISION_ISSUES, - ModuleTemporalProperties, -} from '@opentrons/step-generation' +import { MODULES_WITH_COLLISION_ISSUES } from '@opentrons/step-generation' import { FLEX_ROBOT_TYPE, getAddressableAreaFromSlotId, @@ -43,17 +37,10 @@ import { selectors as labwareDefSelectors } from '../../labware-defs' import { selectors as featureFlagSelectors } from '../../feature-flags' import { getStagingAreaAddressableAreas } from '../../utils' -import { - getSlotIdsBlockedBySpanning, - getSlotIsEmpty, - InitialDeckSetup, - LabwareOnDeck as LabwareOnDeckType, - ModuleOnDeck, -} from '../../step-forms' +import { getSlotIdsBlockedBySpanning, getSlotIsEmpty } from '../../step-forms' import * as labwareIngredActions from '../../labware-ingred/actions' import { getDeckSetupForActiveItem } from '../../top-selectors/labware-locations' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' -import { TerminalItemId } from '../../steplist' import { getSelectedTerminalItemId } from '../../ui/steps' import { getRobotType } from '../../file-data/selectors' import { BrowseLabwareModal } from '../labware' @@ -69,6 +56,11 @@ import { Ot2ModuleTag } from './Ot2ModuleTag' import { SlotLabels } from './SlotLabels' import { getHasGen1MultiChannelPipette, getSwapBlocked } from './utils' +import type { + AdditionalEquipmentEntity, + ModuleTemporalProperties, +} from '@opentrons/step-generation' +import type { StagingAreaLocation, TrashCutoutId } from '@opentrons/components' import type { AddressableAreaName, CutoutFixture, @@ -76,6 +68,12 @@ import type { DeckDefinition, RobotType, } from '@opentrons/shared-data' +import type { TerminalItemId } from '../../steplist' +import type { + InitialDeckSetup, + LabwareOnDeck as LabwareOnDeckType, + ModuleOnDeck, +} from '../../step-forms' import styles from './DeckSetup.module.css' diff --git a/protocol-designer/src/components/DeckSetup/utils.ts b/protocol-designer/src/components/DeckSetup/utils.ts index a2d7e6d4af5..c21607050a1 100644 --- a/protocol-designer/src/components/DeckSetup/utils.ts +++ b/protocol-designer/src/components/DeckSetup/utils.ts @@ -1,10 +1,11 @@ -import { GEN_ONE_MULTI_PIPETTES, ModuleType } from '@opentrons/shared-data' -import { LabwareDefByDefURI } from '../../labware-defs' -import { InitialDeckSetup, LabwareOnDeck } from '../../step-forms' +import { GEN_ONE_MULTI_PIPETTES } from '@opentrons/shared-data' import { getLabwareIsCompatible, getLabwareIsCustom, } from '../../utils/labwareModuleCompatibility' +import type { InitialDeckSetup, LabwareOnDeck } from '../../step-forms' +import type { ModuleType } from '@opentrons/shared-data' +import type { LabwareDefByDefURI } from '../../labware-defs' export interface SwapBlockedArgs { hoveredLabware?: LabwareOnDeck | null diff --git a/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx b/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx index 827af5a2aa8..8d0d38ec6cf 100644 --- a/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx +++ b/protocol-designer/src/components/FileSidebar/__tests__/FileSidebar.test.tsx @@ -1,11 +1,7 @@ import * as React from 'react' import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest' import { fireEvent, screen, cleanup } from '@testing-library/react' -import { - FLEX_ROBOT_TYPE, - LabwareDefinition2, - fixtureTiprack300ul, -} from '@opentrons/shared-data' +import { FLEX_ROBOT_TYPE, fixtureTiprack300ul } from '@opentrons/shared-data' import { renderWithProviders } from '../../../__testing-utils__' import { createFile, getRobotType } from '../../../file-data/selectors' import { @@ -24,6 +20,7 @@ import { useBlockingHint } from '../../Hints/useBlockingHint' import { getUnusedStagingAreas } from '../utils/getUnusedStagingAreas' import { getUnusedTrash } from '../utils/getUnusedTrash' import { FileSidebar } from '../FileSidebar' +import type { LabwareDefinition2 } from '@opentrons/shared-data' vi.mock('../../../step-forms/selectors') vi.mock('../../../load-file/selectors') diff --git a/protocol-designer/src/components/FileSidebar/utils/getUnusedEntities.ts b/protocol-designer/src/components/FileSidebar/utils/getUnusedEntities.ts index 7968ef72ba2..12e34c04e75 100644 --- a/protocol-designer/src/components/FileSidebar/utils/getUnusedEntities.ts +++ b/protocol-designer/src/components/FileSidebar/utils/getUnusedEntities.ts @@ -1,6 +1,7 @@ import some from 'lodash/some' import reduce from 'lodash/reduce' -import { FLEX_ROBOT_TYPE, RobotType } from '@opentrons/shared-data' +import { FLEX_ROBOT_TYPE } from '@opentrons/shared-data' +import type { RobotType } from '@opentrons/shared-data' import type { SavedStepFormState } from '../../../step-forms' /** Pull out all entities never specified by step forms. Assumes that all forms share the entityKey */ diff --git a/protocol-designer/src/components/FileSidebar/utils/getUnusedTrash.ts b/protocol-designer/src/components/FileSidebar/utils/getUnusedTrash.ts index 634e0e07f42..d88daf31145 100644 --- a/protocol-designer/src/components/FileSidebar/utils/getUnusedTrash.ts +++ b/protocol-designer/src/components/FileSidebar/utils/getUnusedTrash.ts @@ -1,10 +1,9 @@ import { - AddressableAreaName, - CreateCommand, FIXED_TRASH_ID, MOVABLE_TRASH_ADDRESSABLE_AREAS, WASTE_CHUTE_ADDRESSABLE_AREAS, } from '@opentrons/shared-data' +import type { AddressableAreaName, CreateCommand } from '@opentrons/shared-data' import type { InitialDeckSetup } from '../../../step-forms' interface UnusedTrash { diff --git a/protocol-designer/src/components/IngredientsList/index.tsx b/protocol-designer/src/components/IngredientsList/index.tsx index f690f823544..15d7f3e8f7d 100644 --- a/protocol-designer/src/components/IngredientsList/index.tsx +++ b/protocol-designer/src/components/IngredientsList/index.tsx @@ -2,7 +2,6 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' -import { SingleLabwareLiquidState } from '@opentrons/step-generation' import { IconButton, SidePanel, truncateString } from '@opentrons/components' import { sortWells } from '@opentrons/shared-data' import * as wellSelectionSelectors from '../../top-selectors/well-contents' @@ -13,6 +12,7 @@ import { swatchColors } from '../swatchColors' import { LabwareDetailsCard } from './LabwareDetailsCard/LabwareDetailsCard' import styles from './IngredientsList.module.css' +import type { SingleLabwareLiquidState } from '@opentrons/step-generation' import type { SelectedContainerId } from '../../labware-ingred/reducers' import type { LiquidGroup } from '../../labware-ingred/types' import type { ThunkDispatch } from '../../types' diff --git a/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx b/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx index ed099273afc..29863585666 100644 --- a/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx +++ b/protocol-designer/src/components/LabwareSelectionModal/LabwareItem.tsx @@ -1,15 +1,16 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import cx from 'classnames' -import { Icon, IconName } from '@opentrons/components' +import { Icon } from '@opentrons/components' import { PDListItem } from '../lists' import styles from './styles.module.css' import { getLabwareDefURI, getLabwareDefIsStandard, getLabwareDisplayName, - LabwareDefinition2, } from '@opentrons/shared-data' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { IconName } from '@opentrons/components' interface Props { disabled?: boolean | null diff --git a/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx b/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx index ed9b9156eae..ada2d060199 100644 --- a/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx +++ b/protocol-designer/src/components/LabwareSelectionModal/LabwarePreview.tsx @@ -10,9 +10,9 @@ import { import { getLabwareDisplayName, getLabwareDefIsStandard, - LabwareDefinition2, } from '@opentrons/shared-data' import styles from './styles.module.css' +import type { LabwareDefinition2 } from '@opentrons/shared-data' interface Props { labwareDef?: LabwareDefinition2 | null diff --git a/protocol-designer/src/components/LiquidPlacementModal.tsx b/protocol-designer/src/components/LiquidPlacementModal.tsx index bd7e95a02aa..d138c1d1678 100644 --- a/protocol-designer/src/components/LiquidPlacementModal.tsx +++ b/protocol-designer/src/components/LiquidPlacementModal.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { useDispatch, useSelector } from 'react-redux' import cx from 'classnames' import isEmpty from 'lodash/isEmpty' -import { WellGroup, WELL_LABEL_OPTIONS } from '@opentrons/components' +import { WELL_LABEL_OPTIONS } from '@opentrons/components' import { wellFillFromWellContents, @@ -18,6 +18,7 @@ import { LiquidPlacementForm } from './LiquidPlacementForm/LiquidPlacementForm' import { WellSelectionInstructions } from './WellSelectionInstructions' import styles from './LiquidPlacementModal.module.css' +import type { WellGroup } from '@opentrons/components' export function LiquidPlacementModal(): JSX.Element | null { const [highlightedWells, setHighlightedWells] = React.useState< diff --git a/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx b/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx index 40b1865571b..c19e958382c 100644 --- a/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx +++ b/protocol-designer/src/components/StepEditForm/StepEditFormComponent.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import cx from 'classnames' import get from 'lodash/get' -import { StepFieldName } from '../../steplist/fieldLevel' import { MoreOptionsModal } from '../modals/MoreOptionsModal' import { MixForm, @@ -17,8 +16,9 @@ import { Alerts } from '../alerts/Alerts' import { ButtonRow } from './ButtonRow' import formStyles from '../forms/forms.module.css' import styles from './StepEditForm.module.css' -import { FormData, StepType } from '../../form-types' -import { FieldPropsByName, FocusHandlers, StepFormProps } from './types' +import type { StepFieldName } from '../../steplist/fieldLevel' +import type { FormData, StepType } from '../../form-types' +import type { FieldPropsByName, FocusHandlers, StepFormProps } from './types' type StepFormMap = { [K in StepType]?: React.ComponentType | null diff --git a/protocol-designer/src/components/StepEditForm/fields/BlowoutLocationField.tsx b/protocol-designer/src/components/StepEditForm/fields/BlowoutLocationField.tsx index 6637092deab..85d5f53e069 100644 --- a/protocol-designer/src/components/StepEditForm/fields/BlowoutLocationField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/BlowoutLocationField.tsx @@ -1,10 +1,11 @@ import * as React from 'react' import { useSelector } from 'react-redux' -import { DropdownField, Options } from '@opentrons/components' +import { DropdownField } from '@opentrons/components' import cx from 'classnames' import { selectors as uiLabwareSelectors } from '../../../ui/labware' import styles from '../StepEditForm.module.css' -import { FieldProps } from '../types' +import type { Options } from '@opentrons/components' +import type { FieldProps } from '../types' type BlowoutLocationDropdownProps = FieldProps & { options: Options diff --git a/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/getDisabledChangeTipOptions.ts b/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/getDisabledChangeTipOptions.ts index 1dca83bb557..bee62012254 100644 --- a/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/getDisabledChangeTipOptions.ts +++ b/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/getDisabledChangeTipOptions.ts @@ -1,6 +1,6 @@ import { getWellRatio } from '../../../../steplist/utils' -import { PathOption, StepType } from '../../../../form-types' -import { ChangeTipOptions } from '@opentrons/step-generation' +import type { PathOption, StepType } from '../../../../form-types' +import type { ChangeTipOptions } from '@opentrons/step-generation' export interface DisabledChangeTipArgs { aspirateWells?: string[] dispenseWells?: string[] diff --git a/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx index 6a2a7e4da58..4c1767122d9 100644 --- a/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/ChangeTipField/index.tsx @@ -7,13 +7,11 @@ import { useHoverTooltip, TOOLTIP_FIXED, } from '@opentrons/components' -import { - getDisabledChangeTipOptions, - DisabledChangeTipArgs, -} from './getDisabledChangeTipOptions' -import { ChangeTipOptions } from '@opentrons/step-generation' -import { FieldProps } from '../../types' +import { getDisabledChangeTipOptions } from './getDisabledChangeTipOptions' import styles from '../../StepEditForm.module.css' +import type { DisabledChangeTipArgs } from './getDisabledChangeTipOptions' +import type { ChangeTipOptions } from '@opentrons/step-generation' +import type { FieldProps } from '../../types' const ALL_CHANGE_TIP_VALUES: ChangeTipOptions[] = [ 'always', diff --git a/protocol-designer/src/components/StepEditForm/fields/CheckboxRowField.tsx b/protocol-designer/src/components/StepEditForm/fields/CheckboxRowField.tsx index ad4150fc687..b102be6883e 100644 --- a/protocol-designer/src/components/StepEditForm/fields/CheckboxRowField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/CheckboxRowField.tsx @@ -7,7 +7,7 @@ import { } from '@opentrons/components' import cx from 'classnames' import styles from '../StepEditForm.module.css' -import { FieldProps } from '../types' +import type { FieldProps } from '../types' import type { Placement } from '@opentrons/components' type CheckboxRowProps = FieldProps & { diff --git a/protocol-designer/src/components/StepEditForm/fields/Configure96ChannelField.tsx b/protocol-designer/src/components/StepEditForm/fields/Configure96ChannelField.tsx index 28675a00993..9b6c9f69f89 100644 --- a/protocol-designer/src/components/StepEditForm/fields/Configure96ChannelField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/Configure96ChannelField.tsx @@ -10,8 +10,8 @@ import { useHoverTooltip, } from '@opentrons/components' import { getInitialDeckSetup } from '../../../step-forms/selectors' -import { StepFormDropdown } from './StepFormDropdownField' import styles from '../StepEditForm.module.css' +import type { StepFormDropdown } from './StepFormDropdownField' export function Configure96ChannelField( props: Omit, 'options'> diff --git a/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx b/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx index dd49dd71d9f..ec8dab06f2f 100644 --- a/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/DelayFields.tsx @@ -4,8 +4,8 @@ import { TextField } from './TextField' import { CheckboxRowField } from './CheckboxRowField' import { TipPositionField } from './TipPositionField' import styles from '../StepEditForm.module.css' -import { FieldPropsByName } from '../types' -import { StepFieldName } from '../../../form-types' +import type { FieldPropsByName } from '../types' +import type { StepFieldName } from '../../../form-types' export interface DelayFieldProps { checkboxFieldName: StepFieldName // TODO(IL, 2021-03-03): strictly, could be DelayCheckboxFields! diff --git a/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx b/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx index 6f3a706d626..65d9f5d2178 100644 --- a/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/DisposalVolumeField.tsx @@ -7,7 +7,6 @@ import { FormGroup, DeprecatedCheckboxField, DropdownField, - Options, Flex, DIRECTION_COLUMN, SPACING, @@ -20,6 +19,7 @@ import { TextField } from './TextField' import { FlowRateField } from './FlowRateField' import { BlowoutZOffsetField } from './BlowoutZOffsetField' +import type { Options } from '@opentrons/components' import type { PathOption, StepType } from '../../../form-types' import type { FieldProps, FieldPropsByName } from '../types' diff --git a/protocol-designer/src/components/StepEditForm/fields/DropTipField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/DropTipField/index.tsx index 0e558d6d77f..f4468cd28bc 100644 --- a/protocol-designer/src/components/StepEditForm/fields/DropTipField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/DropTipField/index.tsx @@ -1,10 +1,11 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' -import { DropdownField, DropdownOption, FormGroup } from '@opentrons/components' +import { DropdownField, FormGroup } from '@opentrons/components' import { getAdditionalEquipmentEntities } from '../../../../step-forms/selectors' -import { StepFormDropdown } from '../StepFormDropdownField' import styles from '../../StepEditForm.module.css' +import type { DropdownOption } from '@opentrons/components' +import type { StepFormDropdown } from '../StepFormDropdownField' export function DropTipField( props: Omit, 'options'> diff --git a/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx b/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx index 6105685332b..a86c9271fb0 100644 --- a/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/MixFields.tsx @@ -1,8 +1,8 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { CheckboxRowField, TextField } from './' -import { FieldPropsByName } from '../types' import styles from '../StepEditForm.module.css' +import type { FieldPropsByName } from '../types' export const MixFields = (props: { propsForFields: FieldPropsByName diff --git a/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx b/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx index 81bb79fd02e..09ab57f905f 100644 --- a/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/PathField/PathField.tsx @@ -7,14 +7,11 @@ import { selectors as stepFormSelectors } from '../../../../step-forms' import SINGLE_IMAGE from '../../../../images/path_single_transfers.svg' import MULTI_DISPENSE_IMAGE from '../../../../images/path_multi_dispense.svg' import MULTI_ASPIRATE_IMAGE from '../../../../images/path_multi_aspirate.svg' -import { PathOption } from '../../../../form-types' -import { FieldProps } from '../../types' +import { getDisabledPathMap } from './getDisabledPathMap' import styles from '../../StepEditForm.module.css' -import { - DisabledPathMap, - getDisabledPathMap, - ValuesForPath, -} from './getDisabledPathMap' +import type { PathOption } from '../../../../form-types' +import type { FieldProps } from '../../types' +import type { DisabledPathMap, ValuesForPath } from './getDisabledPathMap' const PATH_ANIMATION_IMAGES = { single: new URL('../../../../images/path_single.gif', import.meta.url).href, diff --git a/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx b/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx index 254d56390c7..4917dbb2d7c 100644 --- a/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/ProfileItemRows.tsx @@ -13,12 +13,7 @@ import { TOOLTIP_TOP_END, } from '@opentrons/components' import * as steplistActions from '../../../steplist/actions' -import { - PROFILE_CYCLE, - ProfileStepItem, - ProfileItem, - ProfileCycleItem, -} from '../../../form-types' +import { PROFILE_CYCLE } from '../../../form-types' import { getProfileFieldErrors, maskProfileField, @@ -30,7 +25,12 @@ import { import { getDynamicFieldFocusHandlerId } from '../utils' import styles from '../StepEditForm.module.css' -import { FocusHandlers } from '../types' +import type { + ProfileStepItem, + ProfileItem, + ProfileCycleItem, +} from '../../../form-types' +import type { FocusHandlers } from '../types' export const showProfileFieldErrors = ({ fieldId, diff --git a/protocol-designer/src/components/StepEditForm/fields/RadioGroupField.tsx b/protocol-designer/src/components/StepEditForm/fields/RadioGroupField.tsx index fe8c8225f5c..c073fe7d486 100644 --- a/protocol-designer/src/components/StepEditForm/fields/RadioGroupField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/RadioGroupField.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { RadioGroup } from '@opentrons/components' -import { StepFieldName } from '../../../steplist/fieldLevel' -import { FieldProps } from '../types' +import type { StepFieldName } from '../../../steplist/fieldLevel' +import type { FieldProps } from '../types' interface RadioGroupFieldProps extends FieldProps { name: StepFieldName diff --git a/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx b/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx index a311c31c8d8..54c7bd2cff9 100644 --- a/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/StepFormDropdownField.tsx @@ -1,8 +1,9 @@ import * as React from 'react' -import { DropdownField, Options } from '@opentrons/components' +import { DropdownField } from '@opentrons/components' import cx from 'classnames' -import { StepFieldName } from '../../../steplist/fieldLevel' import styles from '../StepEditForm.module.css' +import type { Options } from '@opentrons/components' +import type { StepFieldName } from '../../../steplist/fieldLevel' import type { FieldProps } from '../types' export interface StepFormDropdownProps extends FieldProps { diff --git a/protocol-designer/src/components/StepEditForm/fields/TextField.tsx b/protocol-designer/src/components/StepEditForm/fields/TextField.tsx index ba6677990bd..27c59058406 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TextField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/TextField.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { InputField } from '@opentrons/components' -import { FieldProps } from '../types' +import type { FieldProps } from '../types' type TextFieldProps = FieldProps & { className?: string diff --git a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx index 5f60d13cd79..b8adeca17ba 100644 --- a/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/TipPositionField/index.tsx @@ -9,7 +9,6 @@ import { InputField, Tooltip, useHoverTooltip, - UseHoverTooltipTargetProps, } from '@opentrons/components' import { getWellsDepth, getWellDimension } from '@opentrons/shared-data' import { @@ -25,6 +24,7 @@ import type { TipYOffsetFields, TipZOffsetFields, } from '../../../../form-types' +import type { UseHoverTooltipTargetProps } from '@opentrons/components' import type { FieldPropsByName } from '../../types' import type { PositionSpecs } from './TipPositionModal' diff --git a/protocol-designer/src/components/StepEditForm/fields/ToggleRowField.tsx b/protocol-designer/src/components/StepEditForm/fields/ToggleRowField.tsx index 8438620459d..c4a303e0abc 100644 --- a/protocol-designer/src/components/StepEditForm/fields/ToggleRowField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/ToggleRowField.tsx @@ -5,7 +5,7 @@ import { ToggleField } from '@opentrons/components' import styles from '../StepEditForm.module.css' -import { FieldProps } from '../types' +import type { FieldProps } from '../types' type ToggleRowProps = FieldProps & { offLabel?: string diff --git a/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx b/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx index ac3ba920ebe..da2f2caa6a6 100644 --- a/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/VolumeField.tsx @@ -9,9 +9,9 @@ import { } from '@opentrons/components' import { getFieldDefaultTooltip } from '../utils' import { TextField } from './TextField' -import { StepType } from '../../../form-types' -import { FieldProps } from '../types' import styles from '../StepEditForm.module.css' +import type { StepType } from '../../../form-types' +import type { FieldProps } from '../types' type Props = FieldProps & { stepType: StepType diff --git a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderViz.tsx b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderViz.tsx index 35619dfc361..8a9ba9b60be 100644 --- a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderViz.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/WellOrderViz.tsx @@ -4,7 +4,7 @@ import cx from 'classnames' import WELLS_IMAGE from '../../../../images/well_order_wells.svg' import PATH_IMAGE from '../../../../images/well_order_path.svg' -import { WellOrderOption } from '../../../../form-types' +import type { WellOrderOption } from '../../../../form-types' import styles from './WellOrderInput.module.css' diff --git a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx index 0ce4bba7b42..13481bb0362 100644 --- a/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/WellOrderField/index.tsx @@ -15,8 +15,8 @@ import ZIG_ZAG_IMAGE from '../../../../images/zig_zag_icon.svg' import { WellOrderModal } from './WellOrderModal' import stepEditStyles from '../../StepEditForm.module.css' import styles from './WellOrderInput.module.css' -import { FieldProps } from '../../types' -import { WellOrderOption } from '../../../../form-types' +import type { FieldProps } from '../../types' +import type { WellOrderOption } from '../../../../form-types' export interface WellOrderFieldProps { className?: string | null diff --git a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx index 5a9c6424ff3..da6182ce613 100644 --- a/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx +++ b/protocol-designer/src/components/StepEditForm/fields/WellSelectionField/WellSelectionModal.tsx @@ -7,14 +7,9 @@ import { Modal, OutlineButton, LabeledValue, - WellGroup, WELL_LABEL_OPTIONS, } from '@opentrons/components' -import { - sortWells, - LabwareDefinition2, - PipetteV2Specs, -} from '@opentrons/shared-data' +import { sortWells } from '@opentrons/shared-data' import { arrayToWellGroup } from '../../../../utils' import * as wellContentsSelectors from '../../../../top-selectors/well-contents' @@ -23,6 +18,8 @@ import { selectors as stepFormSelectors } from '../../../../step-forms' import { WellSelectionInstructions } from '../../../WellSelectionInstructions' import { SelectableLabware, wellFillFromWellContents } from '../../../labware' +import type { LabwareDefinition2, PipetteV2Specs } from '@opentrons/shared-data' +import type { WellGroup } from '@opentrons/components' import type { ContentsByWell } from '../../../../labware-ingred/types' import type { WellIngredientNames } from '../../../../steplist/types' import type { StepFieldName } from '../../../../form-types' diff --git a/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts b/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts index 6390828958d..251f44d3a9d 100644 --- a/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts +++ b/protocol-designer/src/components/StepEditForm/fields/makeSingleEditFieldProps.ts @@ -7,8 +7,8 @@ import { getFieldDefaultTooltip, getSingleSelectDisabledTooltip, } from '../utils' -import { StepFieldName, FormData } from '../../../form-types' -import { FieldProps, FieldPropsByName, FocusHandlers } from '../types' +import type { StepFieldName, FormData } from '../../../form-types' +import type { FieldProps, FieldPropsByName, FocusHandlers } from '../types' interface ShowFieldErrorParams { name: StepFieldName focusedField: StepFieldName | null diff --git a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx index b269519a5f0..0e44bca110d 100644 --- a/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/MoveLiquidForm/SourceDestHeaders.tsx @@ -3,9 +3,9 @@ import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { FormGroup } from '@opentrons/components' import { getAdditionalEquipmentEntities } from '../../../../step-forms/selectors' -import { StepFieldName } from '../../../../steplist/fieldLevel' import { LabwareField, WellSelectionField } from '../../fields' import { AspDispSection } from '../AspDispSection' +import type { StepFieldName } from '../../../../steplist/fieldLevel' import type { FormData } from '../../../../form-types' import type { FieldPropsByName } from '../../types' diff --git a/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/ProfileSettings.tsx b/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/ProfileSettings.tsx index 2c7e69556b5..362860e404d 100644 --- a/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/ProfileSettings.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/ProfileSettings.tsx @@ -6,7 +6,7 @@ import { TextField } from '../../fields' import styles from '../../StepEditForm.module.css' -import { FieldPropsByName } from '../../types' +import type { FieldPropsByName } from '../../types' interface Props { propsForFields: FieldPropsByName diff --git a/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/StateFields.tsx b/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/StateFields.tsx index 43f849282f4..c72d4d1cc81 100644 --- a/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/StateFields.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/StateFields.tsx @@ -6,8 +6,8 @@ import { FormGroup } from '@opentrons/components' import { ToggleRowField, TextField } from '../../fields' import styles from '../../StepEditForm.module.css' -import { FieldPropsByName } from '../../types' -import { FormData } from '../../../../form-types' +import type { FieldPropsByName } from '../../types' +import type { FormData } from '../../../../form-types' interface Props { propsForFields: FieldPropsByName diff --git a/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/index.tsx b/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/index.tsx index 64d1d6e171b..60160df4dea 100644 --- a/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/index.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/ThermocyclerForm/index.tsx @@ -7,7 +7,7 @@ import { ProfileItemRows, RadioGroupField } from '../../fields' import { StateFields } from './StateFields' import { ProfileSettings } from './ProfileSettings' import styles from '../../StepEditForm.module.css' -import { StepFormProps } from '../../types' +import type { StepFormProps } from '../../types' export const ThermocyclerForm = (props: StepFormProps): JSX.Element => { const { focusHandlers, propsForFields, formData } = props diff --git a/protocol-designer/src/components/StepEditForm/forms/__tests__/HeaterShakerForm.test.tsx b/protocol-designer/src/components/StepEditForm/forms/__tests__/HeaterShakerForm.test.tsx index dbc5bb5a408..88da7ef9d06 100644 --- a/protocol-designer/src/components/StepEditForm/forms/__tests__/HeaterShakerForm.test.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/__tests__/HeaterShakerForm.test.tsx @@ -5,19 +5,19 @@ import { renderWithProviders } from '../../../../__testing-utils__' import { getHeaterShakerLabwareOptions } from '../../../../ui/modules/selectors' import { i18n } from '../../../../localization' import { HeaterShakerForm } from '../HeaterShakerForm' +import type * as ModulesSelectors from '../../../../ui/modules/selectors' +import type * as Fields from '../../fields' import type { DropdownOption } from '@opentrons/components' vi.mock('../../../../ui/modules/selectors', async importOriginal => { - const actualFields = await importOriginal< - typeof import('../../../../ui/modules/selectors') - >() + const actualFields = await importOriginal() return { ...actualFields, getHeaterShakerLabwareOptions: vi.fn(), } }) vi.mock('../../fields', async importOriginal => { - const actualFields = await importOriginal() + const actualFields = await importOriginal() return { ...actualFields, diff --git a/protocol-designer/src/components/StepEditForm/forms/__tests__/TemperatureForm.test.tsx b/protocol-designer/src/components/StepEditForm/forms/__tests__/TemperatureForm.test.tsx index a32894d3b84..9a84248c8a6 100644 --- a/protocol-designer/src/components/StepEditForm/forms/__tests__/TemperatureForm.test.tsx +++ b/protocol-designer/src/components/StepEditForm/forms/__tests__/TemperatureForm.test.tsx @@ -8,11 +8,10 @@ import { getTemperatureModuleIds, } from '../../../../ui/modules/selectors' import { TemperatureForm } from '../TemperatureForm' +import type * as ModulesSelectors from '../../../../ui/modules/selectors' vi.mock('../../../../ui/modules/selectors', async importOriginal => { - const actualFields = await importOriginal< - typeof import('../../../../ui/modules/selectors') - >() + const actualFields = await importOriginal() return { ...actualFields, getTemperatureLabwareOptions: vi.fn(), diff --git a/protocol-designer/src/components/StepEditForm/types.ts b/protocol-designer/src/components/StepEditForm/types.ts index 573bf6e9edb..2441ed00e07 100644 --- a/protocol-designer/src/components/StepEditForm/types.ts +++ b/protocol-designer/src/components/StepEditForm/types.ts @@ -1,4 +1,4 @@ -import { FormData, StepFieldName } from '../../form-types' +import type { FormData, StepFieldName } from '../../form-types' export interface FocusHandlers { focusedField: StepFieldName | null dirtyFields: StepFieldName[] diff --git a/protocol-designer/src/components/StepEditForm/utils.ts b/protocol-designer/src/components/StepEditForm/utils.ts index d7df72c50c3..79afc0c80d6 100644 --- a/protocol-designer/src/components/StepEditForm/utils.ts +++ b/protocol-designer/src/components/StepEditForm/utils.ts @@ -5,19 +5,19 @@ import { SOURCE_WELL_BLOWOUT_DESTINATION, DEST_WELL_BLOWOUT_DESTINATION, } from '@opentrons/step-generation' -import { - PROFILE_CYCLE, +import { PROFILE_CYCLE } from '../../form-types' +import { getDefaultsForStepType } from '../../steplist/formLevel/getDefaultsForStepType' +import type { Options } from '@opentrons/components' +import type { ProfileFormError } from '../../steplist/formLevel/profileErrors' +import type { FormWarning } from '../../steplist/formLevel/warnings' +import type { StepFormErrors } from '../../steplist/types' +import type { FormData, ProfileItem, StepFieldName, StepType, PathOption, } from '../../form-types' -import { getDefaultsForStepType } from '../../steplist/formLevel/getDefaultsForStepType' -import { Options } from '@opentrons/components' -import { ProfileFormError } from '../../steplist/formLevel/profileErrors' -import { FormWarning } from '../../steplist/formLevel/warnings' -import type { StepFormErrors } from '../../steplist/types' export function getBlowoutLocationOptionsForForm(args: { stepType: StepType diff --git a/protocol-designer/src/components/StepSelectionBanner/StepSelectionBannerComponent.tsx b/protocol-designer/src/components/StepSelectionBanner/StepSelectionBannerComponent.tsx index 489f5c41a74..a7f319e86e9 100644 --- a/protocol-designer/src/components/StepSelectionBanner/StepSelectionBannerComponent.tsx +++ b/protocol-designer/src/components/StepSelectionBanner/StepSelectionBannerComponent.tsx @@ -25,7 +25,7 @@ import { SPACING_3, TYPOGRAPHY, } from '@opentrons/components' -import { CountPerStepType, StepType } from '../../form-types' +import type { CountPerStepType, StepType } from '../../form-types' interface StepPillProps { stepType: StepType diff --git a/protocol-designer/src/components/StepSelectionBanner/index.tsx b/protocol-designer/src/components/StepSelectionBanner/index.tsx index da378bde3d9..7f0d8ed207a 100644 --- a/protocol-designer/src/components/StepSelectionBanner/index.tsx +++ b/protocol-designer/src/components/StepSelectionBanner/index.tsx @@ -9,8 +9,8 @@ import { CLOSE_BATCH_EDIT_FORM, } from '../modals/ConfirmDeleteModal' import { StepSelectionBannerComponent } from './StepSelectionBannerComponent' -import { ThunkDispatch } from 'redux-thunk' -import { BaseState } from '../../types' +import type { ThunkDispatch } from 'redux-thunk' +import type { BaseState } from '../../types' const MemoizedStepSelectionBannerComponent = React.memo( StepSelectionBannerComponent diff --git a/protocol-designer/src/components/alerts/Alerts.tsx b/protocol-designer/src/components/alerts/Alerts.tsx index 1fc95e8162f..c593f5ab74a 100644 --- a/protocol-designer/src/components/alerts/Alerts.tsx +++ b/protocol-designer/src/components/alerts/Alerts.tsx @@ -9,7 +9,6 @@ import { selectors as dismissSelectors, } from '../../dismiss' import { selectors as stepFormSelectors } from '../../step-forms' -import { StepFieldName } from '../../steplist/fieldLevel' import { selectors as fileDataSelectors } from '../../file-data' import { PRESAVED_STEP_ID } from '../../steplist' import { @@ -22,6 +21,7 @@ import { ErrorContents } from './ErrorContents' import { WarningContents } from './WarningContents' import type { CommandCreatorError } from '@opentrons/step-generation' +import type { StepFieldName } from '../../steplist/fieldLevel' import type { ProfileItem } from '../../form-types' import type { ProfileFormError } from '../../steplist/formLevel/profileErrors' import type { AlertData, AlertType } from './types' diff --git a/protocol-designer/src/components/alerts/types.ts b/protocol-designer/src/components/alerts/types.ts index 2423ab77d29..981447c1987 100644 --- a/protocol-designer/src/components/alerts/types.ts +++ b/protocol-designer/src/components/alerts/types.ts @@ -1,4 +1,4 @@ -import { ReactNode } from 'react' +import type { ReactNode } from 'react' export type AlertLevel = 'timeline' | 'form' export type AlertType = 'error' | 'warning' // generic alert (warning or error) formatted for rendering diff --git a/protocol-designer/src/components/labware/BrowsableLabware.tsx b/protocol-designer/src/components/labware/BrowsableLabware.tsx index 3994cf943e8..ef57162b122 100644 --- a/protocol-designer/src/components/labware/BrowsableLabware.tsx +++ b/protocol-designer/src/components/labware/BrowsableLabware.tsx @@ -2,13 +2,14 @@ import * as React from 'react' import { useSelector } from 'react-redux' import reduce from 'lodash/reduce' +import { WELL_LABEL_OPTIONS } from '@opentrons/components' import { selectors } from '../../labware-ingred/selectors' import { SingleLabware } from './SingleLabware' import { wellFillFromWellContents } from './utils' -import { ContentsByWell } from '../../labware-ingred/types' -import { WellIngredientNames } from '../../steplist/types' -import { WellGroup, WELL_LABEL_OPTIONS } from '@opentrons/components' -import { LabwareDefinition2 } from '@opentrons/shared-data' +import type { WellGroup } from '@opentrons/components' +import type { ContentsByWell } from '../../labware-ingred/types' +import type { WellIngredientNames } from '../../steplist/types' +import type { LabwareDefinition2 } from '@opentrons/shared-data' import { WellTooltip } from './WellTooltip' diff --git a/protocol-designer/src/components/labware/SelectableLabware.tsx b/protocol-designer/src/components/labware/SelectableLabware.tsx index ffe39799487..257fe013270 100644 --- a/protocol-designer/src/components/labware/SelectableLabware.tsx +++ b/protocol-designer/src/components/labware/SelectableLabware.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import reduce from 'lodash/reduce' -import { WellMouseEvent, WellGroup } from '@opentrons/components' import { COLUMN } from '@opentrons/shared-data' import { arrayToWellGroup, @@ -12,6 +11,7 @@ import { SingleLabware } from './SingleLabware' import { SelectionRect } from '../SelectionRect' import { WellTooltip } from './WellTooltip' +import type { WellMouseEvent, WellGroup } from '@opentrons/components' import type { ContentsByWell } from '../../labware-ingred/types' import type { WellIngredientNames } from '../../steplist/types' import type { GenericRect } from '../../collision-types' diff --git a/protocol-designer/src/components/labware/utils.ts b/protocol-designer/src/components/labware/utils.ts index 1c92ee47186..d20e788cfdf 100644 --- a/protocol-designer/src/components/labware/utils.ts +++ b/protocol-designer/src/components/labware/utils.ts @@ -1,9 +1,10 @@ import reduce from 'lodash/reduce' -import { AdditionalEquipmentEntities, AIR } from '@opentrons/step-generation' -import { WellFill } from '@opentrons/components' +import { AIR } from '@opentrons/step-generation' import { WASTE_CHUTE_CUTOUT } from '@opentrons/shared-data' import { swatchColors, MIXED_WELL_COLOR } from '../swatchColors' -import { ContentsByWell, WellContents } from '../../labware-ingred/types' +import type { AdditionalEquipmentEntities } from '@opentrons/step-generation' +import type { WellFill } from '@opentrons/components' +import type { ContentsByWell, WellContents } from '../../labware-ingred/types' const ingredIdsToColor = ( groupIds: string[], diff --git a/protocol-designer/src/components/lists/TitledStepList.tsx b/protocol-designer/src/components/lists/TitledStepList.tsx index dd719b05eb5..3d66d0c03cc 100644 --- a/protocol-designer/src/components/lists/TitledStepList.tsx +++ b/protocol-designer/src/components/lists/TitledStepList.tsx @@ -1,7 +1,8 @@ import * as React from 'react' import cx from 'classnames' -import { Icon, IconName } from '@opentrons/components' +import { Icon } from '@opentrons/components' import styles from './styles.module.css' +import type { IconName } from '@opentrons/components' export interface Props { /** text of title */ diff --git a/protocol-designer/src/components/modals/CreateFileWizard/InputField.tsx b/protocol-designer/src/components/modals/CreateFileWizard/InputField.tsx index 63a7903907e..ea6a50648eb 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/InputField.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/InputField.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { css } from 'styled-components' -import { UseFormRegister } from 'react-hook-form' import { ALIGN_CENTER, BORDERS, @@ -13,6 +12,7 @@ import { DISPLAY_INLINE_BLOCK, TEXT_ALIGN_RIGHT, } from '@opentrons/components' +import type { UseFormRegister } from 'react-hook-form' export interface InputFieldProps { register: UseFormRegister diff --git a/protocol-designer/src/components/modals/CreateFileWizard/ModulesAndOtherTile.tsx b/protocol-designer/src/components/modals/CreateFileWizard/ModulesAndOtherTile.tsx index cc0906c34b8..19c4f4e41f7 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/ModulesAndOtherTile.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/ModulesAndOtherTile.tsx @@ -20,13 +20,11 @@ import { MAGNETIC_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, getPipetteSpecsV2, - PipetteName, OT2_ROBOT_TYPE, THERMOCYCLER_MODULE_V2, HEATERSHAKER_MODULE_V1, MAGNETIC_BLOCK_V1, TEMPERATURE_MODULE_V2, - ModuleModel, getModuleDisplayName, getModuleType, FLEX_ROBOT_TYPE, @@ -50,6 +48,7 @@ import { import { EquipmentOption } from './EquipmentOption' import { HandleEnter } from './HandleEnter' +import type { ModuleModel, PipetteName } from '@opentrons/shared-data' import type { AdditionalEquipment, WizardTileProps } from './types' const MAX_TEMPERATURE_MODULES = 7 diff --git a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx index 422c87e332e..9f77c5a0150 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTipsTile.tsx @@ -7,7 +7,6 @@ import { Flex, Text, SPACING, - Mount, ALIGN_CENTER, PrimaryButton, JUSTIFY_SPACE_BETWEEN, @@ -32,6 +31,7 @@ import { GoBack } from './GoBack' import { EquipmentOption } from './EquipmentOption' import { HandleEnter } from './HandleEnter' +import type { Mount } from '@opentrons/components' import type { PipetteName } from '@opentrons/shared-data' import type { FormState, WizardTileProps } from './types' import type { ThunkDispatch } from 'redux-thunk' diff --git a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx index b7d050e33f2..d833bb8f4b5 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/PipetteTypeTile.tsx @@ -6,14 +6,12 @@ import { Flex, Text, SPACING, - Mount, ALIGN_CENTER, PrimaryButton, JUSTIFY_SPACE_BETWEEN, InstrumentDiagram, } from '@opentrons/components' import { - PipetteName, OT2_PIPETTES, OT2_ROBOT_TYPE, OT3_PIPETTES, @@ -27,6 +25,8 @@ import { GoBack } from './GoBack' import { EquipmentOption } from './EquipmentOption' import { HandleEnter } from './HandleEnter' +import type { PipetteName } from '@opentrons/shared-data' +import type { Mount } from '@opentrons/components' import type { FormState, WizardTileProps } from './types' import type { UseFormReturn } from 'react-hook-form' diff --git a/protocol-designer/src/components/modals/CreateFileWizard/index.tsx b/protocol-designer/src/components/modals/CreateFileWizard/index.tsx index ecc37ea4b26..03cbdd8cf60 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/index.tsx +++ b/protocol-designer/src/components/modals/CreateFileWizard/index.tsx @@ -10,9 +10,6 @@ import uniq from 'lodash/uniq' import * as Yup from 'yup' import { ModalShell } from '@opentrons/components' import { - ModuleType, - ModuleModel, - PipetteName, OT2_ROBOT_TYPE, TEMPERATURE_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, @@ -21,12 +18,7 @@ import { FLEX_ROBOT_TYPE, WASTE_CHUTE_CUTOUT, } from '@opentrons/shared-data' -import { - actions as stepFormActions, - FormPipettesByMount, - FormPipette, - PipetteOnDeck, -} from '../../../step-forms' +import { actions as stepFormActions } from '../../../step-forms' import { INITIAL_DECK_SETUP_STEP_ID } from '../../../constants' import { uuid } from '../../../utils' import { actions as navigationActions } from '../../../navigation' @@ -53,8 +45,18 @@ import { WizardHeader } from './WizardHeader' import { StagingAreaTile } from './StagingAreaTile' import { getTrashSlot } from './utils' +import type { + ModuleType, + ModuleModel, + PipetteName, +} from '@opentrons/shared-data' import type { NormalizedPipette } from '@opentrons/step-generation' import type { ThunkDispatch } from 'redux-thunk' +import type { + FormPipettesByMount, + FormPipette, + PipetteOnDeck, +} from '../../../step-forms' import type { BaseState } from '../../../types' import type { FormState } from './types' diff --git a/protocol-designer/src/components/modals/CreateFileWizard/types.ts b/protocol-designer/src/components/modals/CreateFileWizard/types.ts index 1bfa43bbe74..fd325457b57 100644 --- a/protocol-designer/src/components/modals/CreateFileWizard/types.ts +++ b/protocol-designer/src/components/modals/CreateFileWizard/types.ts @@ -1,4 +1,4 @@ -import { UseFormReturn } from 'react-hook-form' +import type { UseFormReturn } from 'react-hook-form' import type { FormPipettesByMount, FormModules } from '../../../step-forms' import type { NewProtocolFields } from '../../../load-file' diff --git a/protocol-designer/src/components/modals/EditModulesModal/EditMultipleModulesModal.tsx b/protocol-designer/src/components/modals/EditModulesModal/EditMultipleModulesModal.tsx index cc31c4eb071..02d5626eed2 100644 --- a/protocol-designer/src/components/modals/EditModulesModal/EditMultipleModulesModal.tsx +++ b/protocol-designer/src/components/modals/EditModulesModal/EditMultipleModulesModal.tsx @@ -18,7 +18,6 @@ import { DIRECTION_COLUMN, } from '@opentrons/components' import { - DeckConfiguration, SINGLE_RIGHT_SLOT_FIXTURE, TEMPERATURE_MODULE_CUTOUTS, TEMPERATURE_MODULE_TYPE, @@ -30,8 +29,12 @@ import { getLabwareOnSlot, getSlotIsEmpty } from '../../../step-forms' import { getInitialDeckSetup } from '../../../step-forms/selectors' import { getLabwareIsCompatible } from '../../../utils/labwareModuleCompatibility' import { PDAlert } from '../../alerts/PDAlert' +import type { + DeckConfiguration, + CutoutId, + ModuleType, +} from '@opentrons/shared-data' import type { Control, ControllerRenderProps } from 'react-hook-form' -import type { CutoutId, ModuleType } from '@opentrons/shared-data' import type { ModuleOnDeck } from '../../../step-forms' export interface EditMultipleModulesModalValues { diff --git a/protocol-designer/src/components/modals/EditModulesModal/ModelDropdown.tsx b/protocol-designer/src/components/modals/EditModulesModal/ModelDropdown.tsx index 72c55271792..5f6bc6b7938 100644 --- a/protocol-designer/src/components/modals/EditModulesModal/ModelDropdown.tsx +++ b/protocol-designer/src/components/modals/EditModulesModal/ModelDropdown.tsx @@ -1,7 +1,10 @@ import * as React from 'react' import { DropdownField } from '@opentrons/components' -import { ControllerFieldState, ControllerRenderProps } from 'react-hook-form' -import { EditModulesFormValues } from './index' +import type { + ControllerFieldState, + ControllerRenderProps, +} from 'react-hook-form' +import type { EditModulesFormValues } from './index' export interface ModelDropdownProps { field: ControllerRenderProps diff --git a/protocol-designer/src/components/modals/EditModulesModal/__tests__/EditMultipleModulesModal.test.tsx b/protocol-designer/src/components/modals/EditModulesModal/__tests__/EditMultipleModulesModal.test.tsx index fa01bd44ecf..df2bd73545f 100644 --- a/protocol-designer/src/components/modals/EditModulesModal/__tests__/EditMultipleModulesModal.test.tsx +++ b/protocol-designer/src/components/modals/EditModulesModal/__tests__/EditMultipleModulesModal.test.tsx @@ -5,13 +5,10 @@ import { renderWithProviders } from '../../../../__testing-utils__' import { i18n } from '../../../../localization' import { getInitialDeckSetup } from '../../../../step-forms/selectors' import { getLabwareIsCompatible } from '../../../../utils/labwareModuleCompatibility' -import { - getLabwareOnSlot, - getSlotIsEmpty, - ModuleOnDeck, -} from '../../../../step-forms' +import { getLabwareOnSlot, getSlotIsEmpty } from '../../../../step-forms' import { EditMultipleModulesModal } from '../EditMultipleModulesModal' import type * as Components from '@opentrons/components' +import type { ModuleOnDeck } from '../../../../step-forms' vi.mock('../../../../step-forms/selectors') vi.mock('../../../../utils/labwareModuleCompatibility') diff --git a/protocol-designer/src/components/modals/EditModulesModal/index.tsx b/protocol-designer/src/components/modals/EditModulesModal/index.tsx index 3b65879f996..4ff099e9f2a 100644 --- a/protocol-designer/src/components/modals/EditModulesModal/index.tsx +++ b/protocol-designer/src/components/modals/EditModulesModal/index.tsx @@ -2,13 +2,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector, useDispatch } from 'react-redux' import some from 'lodash/some' -import { - Control, - Controller, - useController, - useForm, - UseFormWatch, -} from 'react-hook-form' +import { Controller, useController, useForm } from 'react-hook-form' import { FormGroup, @@ -35,12 +29,9 @@ import { THERMOCYCLER_MODULE_TYPE, MAGNETIC_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, - ModuleType, - ModuleModel, OT2_STANDARD_MODEL, THERMOCYCLER_MODULE_V1, TEMPERATURE_MODULE_V1, - RobotType, FLEX_ROBOT_TYPE, THERMOCYCLER_MODULE_V2, OT2_ROBOT_TYPE, @@ -70,6 +61,8 @@ import { ModelDropdown } from './ModelDropdown' import { SlotDropdown } from './SlotDropdown' import styles from './EditModules.module.css' +import type { ModuleType, ModuleModel, RobotType } from '@opentrons/shared-data' +import type { Control, UseFormWatch } from 'react-hook-form' import type { ModuleOnDeck } from '../../../step-forms/types' import type { ModelModuleInfo } from '../../EditModules' diff --git a/protocol-designer/src/components/modals/FilePipettesModal/ModuleFields.tsx b/protocol-designer/src/components/modals/FilePipettesModal/ModuleFields.tsx index 8eba4a7e553..6edfae58570 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/ModuleFields.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/ModuleFields.tsx @@ -6,8 +6,6 @@ import { MAGNETIC_MODULE_TYPE, MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2, - ModuleModel, - ModuleType, OT2_ROBOT_TYPE, SPAN7_8_10_11_SLOT, TEMPERATURE_MODULE_TYPE, @@ -22,6 +20,7 @@ import { import { uuid } from '../../../utils' import { ModuleDiagram } from '../../modules' import { EquipmentOption } from '../CreateFileWizard/EquipmentOption' +import type { ModuleModel, ModuleType } from '@opentrons/shared-data' import type { WizardTileProps } from '../CreateFileWizard/types' export const DEFAULT_SLOT_MAP: { [moduleType in ModuleType]?: string } = { diff --git a/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx b/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx index 9b886213933..6268e1608aa 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/PipetteDiagram.tsx @@ -2,15 +2,12 @@ import * as React from 'react' import { useSelector } from 'react-redux' import { css } from 'styled-components' import cx from 'classnames' -import { - FLEX_ROBOT_TYPE, - getPipetteSpecsV2, - PipetteName, -} from '@opentrons/shared-data' +import { FLEX_ROBOT_TYPE, getPipetteSpecsV2 } from '@opentrons/shared-data' import { InstrumentDiagram } from '@opentrons/components' -import { FormPipette } from '../../../step-forms/types' import { getRobotType } from '../../../file-data/selectors' import styles from './FilePipettesModal.module.css' +import type { PipetteName } from '@opentrons/shared-data' +import type { FormPipette } from '../../../step-forms/types' interface Props { leftPipette?: FormPipette['pipetteName'] diff --git a/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx b/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx index 92593996844..2a6c503ef4a 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/PipetteFields.tsx @@ -1,30 +1,17 @@ import * as React from 'react' import { useDispatch, useSelector } from 'react-redux' -import { - Control, - FormState, - UseFormSetValue, - UseFormTrigger, -} from 'react-hook-form' import { useTranslation } from 'react-i18next' import isEmpty from 'lodash/isEmpty' -import { - FormGroup, - PipetteSelect, - OutlineButton, - Mount, -} from '@opentrons/components' +import { FormGroup, PipetteSelect, OutlineButton } from '@opentrons/components' import { getIncompatiblePipetteNames, OT2_PIPETTES, OT2_ROBOT_TYPE, OT3_PIPETTES, RIGHT, - RobotType, } from '@opentrons/shared-data' import { createCustomTiprackDef } from '../../../labware-defs/actions' import { getLabwareDefsByURI } from '../../../labware-defs/selectors' -import { FormPipettesByMount } from '../../../step-forms' import { getAllowAllTipracks } from '../../../feature-flags/selectors' import { getTiprackOptions } from '../utils' import { PipetteDiagram } from './PipetteDiagram' @@ -33,8 +20,16 @@ import { TiprackSelect } from './TiprackSelect' import styles from './FilePipettesModal.module.css' import formStyles from '../../forms/forms.module.css' -import type { PipetteName } from '@opentrons/shared-data' +import type { + Control, + FormState, + UseFormSetValue, + UseFormTrigger, +} from 'react-hook-form' import type { ThunkDispatch } from 'redux-thunk' +import type { Mount } from '@opentrons/components' +import type { RobotType, PipetteName } from '@opentrons/shared-data' +import type { FormPipettesByMount } from '../../../step-forms' import type { BaseState } from '../../../types' import type { FormState as TypeFormState } from './index' diff --git a/protocol-designer/src/components/modals/FilePipettesModal/index.tsx b/protocol-designer/src/components/modals/FilePipettesModal/index.tsx index 9b415280ef2..fd1ab4e6252 100644 --- a/protocol-designer/src/components/modals/FilePipettesModal/index.tsx +++ b/protocol-designer/src/components/modals/FilePipettesModal/index.tsx @@ -18,9 +18,6 @@ import { TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, - ModuleType, - ModuleModel, - PipetteName, OT2_ROBOT_TYPE, getPipetteSpecsV2, } from '@opentrons/shared-data' @@ -28,13 +25,8 @@ import { actions as stepFormActions, selectors as stepFormSelectors, getIsCrashablePipetteSelected, - PipetteOnDeck, - FormPipettesByMount, - FormModules, - FormPipette, } from '../../../step-forms' import { INITIAL_DECK_SETUP_STEP_ID } from '../../../constants' -import { NewProtocolFields } from '../../../load-file' import { getRobotType } from '../../../file-data/selectors' import { uuid } from '../../../utils' import { getLabwareEntities } from '../../../step-forms/selectors' @@ -50,10 +42,22 @@ import { adapter96ChannelDefUri } from '../CreateFileWizard' import { StepChangesConfirmModal } from '../EditPipettesModal/StepChangesConfirmModal' import { PipetteFields } from './PipetteFields' +import type { + ModuleType, + ModuleModel, + PipetteName, +} from '@opentrons/shared-data' import type { LabwareEntities, NormalizedPipette, } from '@opentrons/step-generation' +import type { NewProtocolFields } from '../../../load-file' +import type { + PipetteOnDeck, + FormPipettesByMount, + FormModules, + FormPipette, +} from '../../../step-forms' import type { DeckSlot, ThunkDispatch } from '../../../types' import type { StepIdType } from '../../../form-types' diff --git a/protocol-designer/src/components/modals/FileUploadMessageModal/modalContents.tsx b/protocol-designer/src/components/modals/FileUploadMessageModal/modalContents.tsx index 8f7af3bc68f..a58cea838cd 100644 --- a/protocol-designer/src/components/modals/FileUploadMessageModal/modalContents.tsx +++ b/protocol-designer/src/components/modals/FileUploadMessageModal/modalContents.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { Trans, useTranslation } from 'react-i18next' import styles from './modalContents.module.css' -import { FileUploadMessage } from '../../../load-file' +import type { FileUploadMessage } from '../../../load-file' import type { ModalContents } from './types' const PD = 'Protocol Designer' diff --git a/protocol-designer/src/components/modals/FileUploadMessageModal/types.ts b/protocol-designer/src/components/modals/FileUploadMessageModal/types.ts index c190a630b37..5e6f0428f10 100644 --- a/protocol-designer/src/components/modals/FileUploadMessageModal/types.ts +++ b/protocol-designer/src/components/modals/FileUploadMessageModal/types.ts @@ -1,4 +1,4 @@ -import * as React from 'react' +import type * as React from 'react' export interface ModalContents { title: string body: React.ReactNode diff --git a/protocol-designer/src/components/modals/LabwareUploadMessageModal/LabwareUploadMessageModal.tsx b/protocol-designer/src/components/modals/LabwareUploadMessageModal/LabwareUploadMessageModal.tsx index 2cb36c1de03..2d789d07d67 100644 --- a/protocol-designer/src/components/modals/LabwareUploadMessageModal/LabwareUploadMessageModal.tsx +++ b/protocol-designer/src/components/modals/LabwareUploadMessageModal/LabwareUploadMessageModal.tsx @@ -3,13 +3,14 @@ import { useDispatch, useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import cx from 'classnames' -import { AlertModal, OutlineButton, ButtonProps } from '@opentrons/components' +import { AlertModal, OutlineButton } from '@opentrons/components' import modalStyles from '../modal.module.css' import { selectors as labwareDefSelectors, actions as labwareDefActions, - LabwareUploadMessage, } from '../../../labware-defs' +import type { ButtonProps } from '@opentrons/components' +import type { LabwareUploadMessage } from '../../../labware-defs' const MessageBody = (props: { message: LabwareUploadMessage diff --git a/protocol-designer/src/components/modals/MoreOptionsModal.tsx b/protocol-designer/src/components/modals/MoreOptionsModal.tsx index e6520cae19c..88b0cee0ff4 100644 --- a/protocol-designer/src/components/modals/MoreOptionsModal.tsx +++ b/protocol-designer/src/components/modals/MoreOptionsModal.tsx @@ -8,10 +8,10 @@ import { OutlineButton, } from '@opentrons/components' import { actions as steplistActions } from '../../steplist' -import { StepFieldName } from '../../steplist/fieldLevel' import modalStyles from './modal.module.css' import styles from './MoreOptionsModal.module.css' +import type { StepFieldName } from '../../steplist/fieldLevel' import type { FormData } from '../../form-types' import type { ChangeFormPayload } from '../../steplist/actions' diff --git a/protocol-designer/src/components/modals/utils.ts b/protocol-designer/src/components/modals/utils.ts index bc83d27bf1f..4b514281bf3 100644 --- a/protocol-designer/src/components/modals/utils.ts +++ b/protocol-designer/src/components/modals/utils.ts @@ -2,9 +2,9 @@ import { getLabwareDefURI, getLabwareDisplayName, getPipetteSpecsV2, - PipetteName, } from '@opentrons/shared-data' -import { LabwareDefByDefURI } from '../../labware-defs' +import type { PipetteName } from '@opentrons/shared-data' +import type { LabwareDefByDefURI } from '../../labware-defs' export interface TiprackOption { name: string diff --git a/protocol-designer/src/components/modules/EditModulesCard.tsx b/protocol-designer/src/components/modules/EditModulesCard.tsx index 27dcc233ede..f1507f01f14 100644 --- a/protocol-designer/src/components/modules/EditModulesCard.tsx +++ b/protocol-designer/src/components/modules/EditModulesCard.tsx @@ -5,15 +5,12 @@ import { MAGNETIC_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, - ModuleType, - PipetteName, FLEX_ROBOT_TYPE, getPipetteSpecsV2, } from '@opentrons/shared-data' import { selectors as stepFormSelectors, getIsCrashablePipetteSelected, - ModulesForEditModulesCard, } from '../../step-forms' import { selectors as featureFlagSelectors } from '../../feature-flags' import { SUPPORTED_MODULE_TYPES } from '../../modules' @@ -31,6 +28,8 @@ import { StagingAreasRow } from './StagingAreasRow' import { MultipleModulesRow } from './MultipleModulesRow' import type { AdditionalEquipmentEntity } from '@opentrons/step-generation' +import type { ModuleType, PipetteName } from '@opentrons/shared-data' +import type { ModulesForEditModulesCard } from '../../step-forms' import styles from './styles.module.css' export interface Props { diff --git a/protocol-designer/src/components/modules/ModuleDiagram.tsx b/protocol-designer/src/components/modules/ModuleDiagram.tsx index ad28ea58430..297ed5ce29d 100644 --- a/protocol-designer/src/components/modules/ModuleDiagram.tsx +++ b/protocol-designer/src/components/modules/ModuleDiagram.tsx @@ -4,13 +4,11 @@ import { MAGNETIC_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, - ModuleType, MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2, TEMPERATURE_MODULE_V1, TEMPERATURE_MODULE_V2, THERMOCYCLER_MODULE_V1, - ModuleModel, HEATERSHAKER_MODULE_TYPE, HEATERSHAKER_MODULE_V1, THERMOCYCLER_MODULE_V2, @@ -26,6 +24,7 @@ import thermocycler from '../../images/modules/thermocycler.png' import thermocycler_gen2 from '../../images/modules/thermocycler_gen2.png' import heater_shaker_module_transparent from '../../images/modules/heater_shaker_module_transparent.png' import mag_block from '../../images/modules/mag_block.png' +import type { ModuleType, ModuleModel } from '@opentrons/shared-data' interface Props { type: ModuleType diff --git a/protocol-designer/src/components/modules/ModuleRow.tsx b/protocol-designer/src/components/modules/ModuleRow.tsx index db75941f6b1..68b8d81bacb 100644 --- a/protocol-designer/src/components/modules/ModuleRow.tsx +++ b/protocol-designer/src/components/modules/ModuleRow.tsx @@ -17,7 +17,7 @@ import { FLEX_ROBOT_TYPE, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' -import { actions as stepFormActions, ModuleOnDeck } from '../../step-forms' +import { actions as stepFormActions } from '../../step-forms' import { SPAN7_8_10_11_SLOT, DEFAULT_MODEL_FOR_MODULE_TYPE, @@ -28,6 +28,7 @@ import { isModuleWithCollisionIssue } from './utils' import styles from './styles.module.css' import type { ModuleType, RobotType } from '@opentrons/shared-data' +import type { ModuleOnDeck } from '../../step-forms' interface Props { robotType?: RobotType diff --git a/protocol-designer/src/components/modules/StagingAreasModal.tsx b/protocol-designer/src/components/modules/StagingAreasModal.tsx index 9c397888a65..a1c14df70b6 100644 --- a/protocol-designer/src/components/modules/StagingAreasModal.tsx +++ b/protocol-designer/src/components/modules/StagingAreasModal.tsx @@ -1,13 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector, useDispatch } from 'react-redux' -import { - Control, - Controller, - ControllerRenderProps, - useForm, - useWatch, -} from 'react-hook-form' +import { Controller, useForm, useWatch } from 'react-hook-form' import { BUTTON_TYPE_SUBMIT, OutlineButton, @@ -24,8 +18,6 @@ import { DIRECTION_COLUMN, } from '@opentrons/components' import { - CutoutId, - DeckConfiguration, SINGLE_RIGHT_SLOT_FIXTURE, STAGING_AREA_CUTOUTS, STAGING_AREA_RIGHT_SLOT_FIXTURE, @@ -38,7 +30,9 @@ import { import { getSlotIsEmpty } from '../../step-forms' import { getInitialDeckSetup } from '../../step-forms/selectors' import { PDAlert } from '../alerts/PDAlert' +import type { Control, ControllerRenderProps } from 'react-hook-form' import type { AdditionalEquipmentEntity } from '@opentrons/step-generation' +import type { CutoutId, DeckConfiguration } from '@opentrons/shared-data' export interface StagingAreasValues { selectedSlots: string[] diff --git a/protocol-designer/src/components/modules/TrashModal.tsx b/protocol-designer/src/components/modules/TrashModal.tsx index dad0f799213..7a36b638071 100644 --- a/protocol-designer/src/components/modules/TrashModal.tsx +++ b/protocol-designer/src/components/modules/TrashModal.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' -import { Control, Controller, useForm, useWatch } from 'react-hook-form' +import { Controller, useForm, useWatch } from 'react-hook-form' import { useSelector, useDispatch } from 'react-redux' import { FormGroup, @@ -18,7 +18,6 @@ import { JUSTIFY_SPACE_BETWEEN, JUSTIFY_FLEX_END, JUSTIFY_END, - DropdownOption, } from '@opentrons/components' import { FLEX_ROBOT_TYPE, @@ -33,6 +32,8 @@ import { getSlotIsEmpty } from '../../step-forms' import { getInitialDeckSetup } from '../../step-forms/selectors' import { SlotDropdown } from '../modals/EditModulesModal/SlotDropdown' import { PDAlert } from '../alerts/PDAlert' +import type { Control } from 'react-hook-form' +import type { DropdownOption } from '@opentrons/components' export interface TrashValues { selectedSlot: string @@ -85,7 +86,7 @@ const TrashModalComponent = (props: TrashModalComponentProps): JSX.Element => { const selectedSlot = useWatch({ control, name: 'selectedSlot', - defaultValue: defaultValue, + defaultValue, }) const hasTrashAlreadyInSlot = Object.values( initialDeckSetup.additionalEquipmentOnDeck diff --git a/protocol-designer/src/components/modules/utils.ts b/protocol-designer/src/components/modules/utils.ts index 06491f2cadb..cd4a751dcf9 100644 --- a/protocol-designer/src/components/modules/utils.ts +++ b/protocol-designer/src/components/modules/utils.ts @@ -1,5 +1,5 @@ import { MODULES_WITH_COLLISION_ISSUES } from '@opentrons/step-generation' -import { ModuleModel } from '@opentrons/shared-data' +import type { ModuleModel } from '@opentrons/shared-data' export function isModuleWithCollisionIssue(model: ModuleModel): boolean { return MODULES_WITH_COLLISION_ISSUES.includes(model) } diff --git a/protocol-designer/src/components/steplist/DraggableStepItems.tsx b/protocol-designer/src/components/steplist/DraggableStepItems.tsx index 0eadb1ce5a7..24067895485 100644 --- a/protocol-designer/src/components/steplist/DraggableStepItems.tsx +++ b/protocol-designer/src/components/steplist/DraggableStepItems.tsx @@ -1,23 +1,18 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' -import { - DragLayerMonitor, - useDrop, - useDrag, - DropTargetOptions, -} from 'react-dnd' +import { useDrop, useDrag } from 'react-dnd' import { DND_TYPES } from '../../constants' import { selectors as stepFormSelectors } from '../../step-forms' -import { stepIconsByType, StepIdType } from '../../form-types' -import { - ConnectedStepItem, - ConnectedStepItemProps, -} from '../../containers/ConnectedStepItem' +import { stepIconsByType } from '../../form-types' +import { ConnectedStepItem } from '../../containers/ConnectedStepItem' import { PDTitledList } from '../lists' import { ContextMenu } from './ContextMenu' import styles from './StepItem.module.css' +import type { DragLayerMonitor, DropTargetOptions } from 'react-dnd' +import type { StepIdType } from '../../form-types' +import type { ConnectedStepItemProps } from '../../containers/ConnectedStepItem' interface DragDropStepItemProps extends ConnectedStepItemProps { stepId: StepIdType diff --git a/protocol-designer/src/components/steplist/IngredPill.tsx b/protocol-designer/src/components/steplist/IngredPill.tsx index 378d3c18cdc..e9c4c0a7132 100644 --- a/protocol-designer/src/components/steplist/IngredPill.tsx +++ b/protocol-designer/src/components/steplist/IngredPill.tsx @@ -1,11 +1,15 @@ import * as React from 'react' import { useSelector } from 'react-redux' -import { Pill, UseHoverTooltipTargetProps } from '@opentrons/components' +import { Pill } from '@opentrons/components' import { selectors } from '../../labware-ingred/selectors' import { AIR } from '@opentrons/step-generation' import { swatchColors, MIXED_WELL_COLOR } from '../swatchColors' -import { WellIngredientVolumeData, WellIngredientNames } from '../../steplist' import styles from './StepItem.module.css' +import type { UseHoverTooltipTargetProps } from '@opentrons/components' +import type { + WellIngredientVolumeData, + WellIngredientNames, +} from '../../steplist' interface Props { ingreds: WellIngredientVolumeData diff --git a/protocol-designer/src/components/steplist/ModuleStepItems.tsx b/protocol-designer/src/components/steplist/ModuleStepItems.tsx index 548caf2964d..048e798cb90 100644 --- a/protocol-designer/src/components/steplist/ModuleStepItems.tsx +++ b/protocol-designer/src/components/steplist/ModuleStepItems.tsx @@ -1,17 +1,12 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import cx from 'classnames' -import { - Tooltip, - useHoverTooltip, - TOOLTIP_FIXED, - UseHoverTooltipTargetProps, -} from '@opentrons/components' +import { Tooltip, useHoverTooltip, TOOLTIP_FIXED } from '@opentrons/components' import { PDListItem } from '../lists' import { LabwareTooltipContents } from './LabwareTooltipContents' -import type { ModuleType } from '@opentrons/shared-data' - import styles from './StepItem.module.css' +import type { UseHoverTooltipTargetProps } from '@opentrons/components' +import type { ModuleType } from '@opentrons/shared-data' export interface ModuleStepItemRowProps { label?: string | null diff --git a/protocol-designer/src/components/steplist/MultiSelectToolbar/index.tsx b/protocol-designer/src/components/steplist/MultiSelectToolbar/index.tsx index 8083949862a..90985278a80 100644 --- a/protocol-designer/src/components/steplist/MultiSelectToolbar/index.tsx +++ b/protocol-designer/src/components/steplist/MultiSelectToolbar/index.tsx @@ -16,7 +16,6 @@ import { C_DARK_GRAY, BORDER_SOLID_MEDIUM, POSITION_STICKY, - IconName, SPACING, } from '@opentrons/components' import { selectors as stepFormSelectors } from '../../../step-forms' @@ -31,8 +30,9 @@ import { ConfirmDeleteModal, DELETE_MULTIPLE_STEP_FORMS, } from '../../modals/ConfirmDeleteModal' -import { ThunkDispatch } from 'redux-thunk' -import { BaseState } from '../../../types' +import type { IconName } from '@opentrons/components' +import type { ThunkDispatch } from 'redux-thunk' +import type { BaseState } from '../../../types' export interface ClickableIconProps { id?: string diff --git a/protocol-designer/src/components/steplist/PauseStepItems.tsx b/protocol-designer/src/components/steplist/PauseStepItems.tsx index d0b18509662..c899c357c2e 100644 --- a/protocol-designer/src/components/steplist/PauseStepItems.tsx +++ b/protocol-designer/src/components/steplist/PauseStepItems.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' -import { PauseArgs } from '@opentrons/step-generation' import styles from './StepItem.module.css' +import type { PauseArgs } from '@opentrons/step-generation' interface Props { pauseArgs: PauseArgs } diff --git a/protocol-designer/src/components/steplist/SourceDestSubstep.tsx b/protocol-designer/src/components/steplist/SourceDestSubstep.tsx index b9c25149b28..46b0e9348cb 100644 --- a/protocol-designer/src/components/steplist/SourceDestSubstep.tsx +++ b/protocol-designer/src/components/steplist/SourceDestSubstep.tsx @@ -5,7 +5,7 @@ import { MultiChannelSubstep } from './MultiChannelSubstep' import { SubstepRow } from './SubstepRow' import styles from './StepItem.module.css' -import { +import type { SourceDestSubstepItem, SubstepIdentifier, WellIngredientNames, diff --git a/protocol-designer/src/components/steplist/StepItem.tsx b/protocol-designer/src/components/steplist/StepItem.tsx index 0fbb338cc0f..aca7ea6d79a 100644 --- a/protocol-designer/src/components/steplist/StepItem.tsx +++ b/protocol-designer/src/components/steplist/StepItem.tsx @@ -9,40 +9,39 @@ import { TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' -import { AtomicProfileStep } from '@opentrons/shared-data/protocol/types/schemaV4' import { THERMOCYCLER_PROFILE, THERMOCYCLER_STATE } from '../../constants' -import { - stepIconsByType, - PROFILE_CYCLE, - FormData, - StepType, - ProfileCycleItem, - ProfileStepItem, -} from '../../form-types' +import { stepIconsByType, PROFILE_CYCLE } from '../../form-types' import { makeLidLabelText, makeSpeedText, makeTemperatureText, makeTimerText, } from '../../utils' -import { InitialDeckSetup } from '../../step-forms' import { PDListItem, TitledStepList } from '../lists' import { TitledListNotes } from '../TitledListNotes' import { AspirateDispenseHeader } from './AspirateDispenseHeader' import { MixHeader } from './MixHeader' import { ModuleStepItems, ModuleStepItemRow } from './ModuleStepItems' import { PauseStepItems } from './PauseStepItems' +import { MoveLabwareHeader } from './MoveLabwareHeader' import { SourceDestSubstep } from './SourceDestSubstep' import styles from './StepItem.module.css' -import { +import type { AdditionalEquipmentEntities } from '@opentrons/step-generation' +import type { AtomicProfileStep } from '@opentrons/shared-data/protocol/types/schemaV4' +import type { + FormData, + StepType, + ProfileCycleItem, + ProfileStepItem, +} from '../../form-types' +import type { SubstepIdentifier, SubstepItemData, ThermocyclerProfileSubstepItem, WellIngredientNames, } from '../../steplist/types' -import { MoveLabwareHeader } from './MoveLabwareHeader' -import type { AdditionalEquipmentEntities } from '@opentrons/step-generation' +import type { InitialDeckSetup } from '../../step-forms' export interface StepItemProps { description?: string | null diff --git a/protocol-designer/src/components/steplist/SubstepRow.tsx b/protocol-designer/src/components/steplist/SubstepRow.tsx index 9aafe7c4482..937e80a4b2a 100644 --- a/protocol-designer/src/components/steplist/SubstepRow.tsx +++ b/protocol-designer/src/components/steplist/SubstepRow.tsx @@ -10,14 +10,14 @@ import { IngredPill } from './IngredPill' import { PDListItem } from '../lists' import { swatchColors } from '../swatchColors' import { formatVolume, formatPercentage } from './utils' -import { LocationLiquidState } from '@opentrons/step-generation' -import { +import styles from './StepItem.module.css' +import type { LocationLiquidState } from '@opentrons/step-generation' +import type { SubstepIdentifier, SubstepWellData, WellIngredientVolumeData, WellIngredientNames, } from '../../steplist/types' -import styles from './StepItem.module.css' interface SubstepRowProps { volume: number | string | null | undefined diff --git a/protocol-designer/src/components/steplist/TerminalItem/TerminalItemLink.tsx b/protocol-designer/src/components/steplist/TerminalItem/TerminalItemLink.tsx index 325f55d794b..e0486f6a87c 100644 --- a/protocol-designer/src/components/steplist/TerminalItem/TerminalItemLink.tsx +++ b/protocol-designer/src/components/steplist/TerminalItem/TerminalItemLink.tsx @@ -2,8 +2,8 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { actions as stepsActions } from '../../../ui/steps' -import { TerminalItemId } from '../../../steplist' import styles from './styles.module.css' +import type { TerminalItemId } from '../../../steplist' interface Props { terminalId: TerminalItemId diff --git a/protocol-designer/src/components/steplist/TerminalItem/index.tsx b/protocol-designer/src/components/steplist/TerminalItem/index.tsx index a66cb4d5662..55887d89094 100644 --- a/protocol-designer/src/components/steplist/TerminalItem/index.tsx +++ b/protocol-designer/src/components/steplist/TerminalItem/index.tsx @@ -6,8 +6,6 @@ import { getSelectedTerminalItemId, getIsMultiSelectMode, actions as stepsActions, - SelectTerminalItemAction, - HoverOnTerminalItemAction, } from '../../../ui/steps' import { getCurrentFormIsPresaved, @@ -19,7 +17,11 @@ import { CLOSE_UNSAVED_STEP_FORM, } from '../../modals/ConfirmDeleteModal' import { PDTitledList } from '../../lists' -import { TerminalItemId } from '../../../steplist' +import type { + SelectTerminalItemAction, + HoverOnTerminalItemAction, +} from '../../../ui/steps' +import type { TerminalItemId } from '../../../steplist' export { TerminalItemLink } from './TerminalItemLink' diff --git a/protocol-designer/src/components/steplist/index.ts b/protocol-designer/src/components/steplist/index.ts index f6ca974415d..fb71246ce12 100644 --- a/protocol-designer/src/components/steplist/index.ts +++ b/protocol-designer/src/components/steplist/index.ts @@ -1,4 +1,6 @@ -import { StepItem, StepItemProps } from './StepItem' -import { StepList, StepListProps } from './StepList' +import { StepItem } from './StepItem' +import { StepList } from './StepList' +import type { StepListProps } from './StepList' +import type { StepItemProps } from './StepItem' export { StepItem, StepList } export type { StepListProps, StepItemProps } diff --git a/protocol-designer/src/configureStore.ts b/protocol-designer/src/configureStore.ts index 7e5d098ea6b..6f72fd18782 100644 --- a/protocol-designer/src/configureStore.ts +++ b/protocol-designer/src/configureStore.ts @@ -1,18 +1,9 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { - createStore, - combineReducers, - applyMiddleware, - compose, - Store, - Reducer, -} from 'redux' +import { createStore, combineReducers, applyMiddleware, compose } from 'redux' import thunk from 'redux-thunk' import { trackEventMiddleware } from './analytics/middleware' import { makePersistSubscriber, rehydratePersistedAction } from './persist' import { fileUploadMessage } from './load-file/actions' import { makeTimelineMiddleware } from './timelineMiddleware/makeTimelineMiddleware' -import { BaseState, Action } from './types' import { rootReducer as analyticsReducer } from './analytics' import { rootReducer as dismissReducer } from './dismiss' import { rootReducer as featureFlagsReducer } from './feature-flags' @@ -24,6 +15,8 @@ import { rootReducer as stepFormsReducer } from './step-forms' import { rootReducer as tutorialReducer } from './tutorial' import { rootReducer as uiReducer } from './ui' import { rootReducer as wellSelectionReducer } from './well-selection/reducers' +import type { Store, Reducer } from 'redux' +import type { BaseState, Action } from './types' const timelineMiddleware = makeTimelineMiddleware() diff --git a/protocol-designer/src/constants.ts b/protocol-designer/src/constants.ts index 14308884b81..6c0c2db3816 100644 --- a/protocol-designer/src/constants.ts +++ b/protocol-designer/src/constants.ts @@ -10,14 +10,17 @@ import { TEMPERATURE_MODULE_V2, THERMOCYCLER_MODULE_V1, HEATERSHAKER_MODULE_V1, - LabwareDefinition2, - DeckSlot as DeckDefSlot, THERMOCYCLER_MODULE_V2, MAGNETIC_BLOCK_TYPE, MAGNETIC_BLOCK_V1, } from '@opentrons/shared-data' +import type { + LabwareDefinition2, + DeckSlot as DeckDefSlot, + ModuleType, + ModuleModel, +} from '@opentrons/shared-data' import type { DeckSlot, WellVolumes } from './types' -import type { ModuleType, ModuleModel } from '@opentrons/shared-data' export const getMaxVolumes = (def: LabwareDefinition2): WellVolumes => mapValues(def.wells, well => well.totalLiquidVolume) diff --git a/protocol-designer/src/containers/ConnectedNav.tsx b/protocol-designer/src/containers/ConnectedNav.tsx index 994aa9441b7..fcc7d2c3311 100644 --- a/protocol-designer/src/containers/ConnectedNav.tsx +++ b/protocol-designer/src/containers/ConnectedNav.tsx @@ -3,8 +3,9 @@ import { useDispatch, useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { KNOWLEDGEBASE_ROOT_URL } from '../components/KnowledgeBaseLink' import { NavTab, TabbedNavBar, OutsideLinkTab } from '@opentrons/components' -import { Page, actions, selectors } from '../navigation' import { selectors as fileSelectors } from '../file-data' +import { actions, selectors } from '../navigation' +import type { Page } from '../navigation' export function ConnectedNav(): JSX.Element { const { t } = useTranslation('nav') diff --git a/protocol-designer/src/containers/ConnectedStepItem.tsx b/protocol-designer/src/containers/ConnectedStepItem.tsx index a3ebcb05f41..c6d01af1a6f 100644 --- a/protocol-designer/src/containers/ConnectedStepItem.tsx +++ b/protocol-designer/src/containers/ConnectedStepItem.tsx @@ -18,24 +18,14 @@ import { getMultiSelectItemIds, getMultiSelectLastSelected, getSelectedStepId, - HoverOnStepAction, - HoverOnSubstepAction, - ToggleStepCollapsedAction, - SelectMultipleStepsAction, } from '../ui/steps' import { selectors as fileDataSelectors } from '../file-data' -import { - StepItem, - StepItemContents, - StepItemContentsProps, - StepItemProps, -} from '../components/steplist/StepItem' +import { StepItem, StepItemContents } from '../components/steplist/StepItem' import { CLOSE_BATCH_EDIT_FORM, CLOSE_STEP_FORM_WITH_CHANGES, CLOSE_UNSAVED_STEP_FORM, ConfirmDeleteModal, - DeleteModalType, } from '../components/modals/ConfirmDeleteModal' import { getAdditionalEquipmentEntities, @@ -43,6 +33,17 @@ import { } from '../step-forms/selectors' import type { ThunkDispatch } from 'redux-thunk' +import type { + HoverOnStepAction, + HoverOnSubstepAction, + ToggleStepCollapsedAction, + SelectMultipleStepsAction, +} from '../ui/steps' +import type { + StepItemContentsProps, + StepItemProps, +} from '../components/steplist/StepItem' +import type { DeleteModalType } from '../components/modals/ConfirmDeleteModal' import type { SubstepIdentifier } from '../steplist/types' import type { StepIdType } from '../form-types' import type { BaseState, ThunkAction } from '../types' diff --git a/protocol-designer/src/containers/ConnectedTitleBar.tsx b/protocol-designer/src/containers/ConnectedTitleBar.tsx index 1ad0b850c4f..87a8849c9da 100644 --- a/protocol-designer/src/containers/ConnectedTitleBar.tsx +++ b/protocol-designer/src/containers/ConnectedTitleBar.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { useSelector, useDispatch } from 'react-redux' import { useTranslation } from 'react-i18next' -import { TitleBar, Icon, IconName } from '@opentrons/components' +import { TitleBar, Icon } from '@opentrons/components' import { getLabwareDisplayName } from '@opentrons/shared-data' import styles from './TitleBar.module.css' import { START_TERMINAL_TITLE, END_TERMINAL_TITLE } from '../constants' @@ -20,6 +20,7 @@ import { selectors as fileDataSelectors } from '../file-data' import { closeIngredientSelector } from '../labware-ingred/actions' import { stepIconsByType } from '../form-types' import { selectors } from '../navigation' +import type { IconName } from '@opentrons/components' interface TitleWithIconProps { iconName: IconName | null | undefined text: string | null | undefined diff --git a/protocol-designer/src/dismiss/index.ts b/protocol-designer/src/dismiss/index.ts index 0ef4230066a..b6aa558c875 100644 --- a/protocol-designer/src/dismiss/index.ts +++ b/protocol-designer/src/dismiss/index.ts @@ -1,5 +1,6 @@ import * as actions from './actions' -import { rootReducer, RootState } from './reducers' +import { rootReducer } from './reducers' import * as selectors from './selectors' +import type { RootState } from './reducers' export { actions, rootReducer, selectors } export type { RootState } diff --git a/protocol-designer/src/dismiss/reducers.ts b/protocol-designer/src/dismiss/reducers.ts index 80a0230efe3..5b3cec94365 100644 --- a/protocol-designer/src/dismiss/reducers.ts +++ b/protocol-designer/src/dismiss/reducers.ts @@ -1,17 +1,18 @@ -import { Reducer, combineReducers } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' import omit from 'lodash/omit' import { getPDMetadata } from '../file-types' import { PRESAVED_STEP_ID } from '../steplist/types' -import { DismissFormWarning, DismissTimelineWarning } from './actions' -import { BaseState, Action } from '../types' -import { LoadFileAction } from '../load-file' -import { +import type { Reducer } from 'redux' +import type { DismissFormWarning, DismissTimelineWarning } from './actions' +import type { BaseState, Action } from '../types' +import type { LoadFileAction } from '../load-file' +import type { CancelStepFormAction, DeleteStepAction, DeleteMultipleStepsAction, } from '../steplist/actions' -import { StepIdType } from '../form-types' +import type { StepIdType } from '../form-types' export type WarningType = string export type DismissedWarningsAllSteps = Record< StepIdType, diff --git a/protocol-designer/src/dismiss/selectors.ts b/protocol-designer/src/dismiss/selectors.ts index dcc1104f6fe..5a6964aea0a 100644 --- a/protocol-designer/src/dismiss/selectors.ts +++ b/protocol-designer/src/dismiss/selectors.ts @@ -3,9 +3,13 @@ import mapValues from 'lodash/mapValues' import { selectors as stepFormSelectors } from '../step-forms' import { getSelectedStepId } from '../ui/steps/selectors' import { PRESAVED_STEP_ID } from '../steplist/types' -import { FormWarning } from '../steplist' -import { BaseState, Selector } from '../types' -import { RootState, DismissedWarningsAllSteps, WarningType } from './reducers' +import type { FormWarning } from '../steplist' +import type { BaseState, Selector } from '../types' +import type { + RootState, + DismissedWarningsAllSteps, + WarningType, +} from './reducers' export const rootSelector = (state: BaseState): RootState => state.dismiss export const getAllDismissedWarnings: Selector = createSelector( rootSelector, diff --git a/protocol-designer/src/feature-flags/actions.ts b/protocol-designer/src/feature-flags/actions.ts index 006394d4bd4..9e9db9a1fca 100644 --- a/protocol-designer/src/feature-flags/actions.ts +++ b/protocol-designer/src/feature-flags/actions.ts @@ -1,4 +1,4 @@ -import { Flags } from './types' +import type { Flags } from './types' export interface SetFeatureFlagAction { type: 'SET_FEATURE_FLAGS' payload: Partial diff --git a/protocol-designer/src/feature-flags/index.ts b/protocol-designer/src/feature-flags/index.ts index b57f6c2e3dc..18444468fb3 100644 --- a/protocol-designer/src/feature-flags/index.ts +++ b/protocol-designer/src/feature-flags/index.ts @@ -1,6 +1,7 @@ -import { rootReducer, RootState } from './reducers' +import { rootReducer } from './reducers' import * as actions from './actions' import * as selectors from './selectors' +import type { RootState } from './reducers' export * from './types' export * from './utils' export { actions, rootReducer, selectors } diff --git a/protocol-designer/src/feature-flags/reducers.ts b/protocol-designer/src/feature-flags/reducers.ts index bddaa38c628..3220828e0c6 100644 --- a/protocol-designer/src/feature-flags/reducers.ts +++ b/protocol-designer/src/feature-flags/reducers.ts @@ -1,11 +1,13 @@ import omit from 'lodash/omit' import mapValues from 'lodash/mapValues' -import { Reducer, combineReducers } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' -import { Flags, FlagTypes, userFacingFlags, DEPRECATED_FLAGS } from './types' -import { RehydratePersistedAction } from '../persist' -import { SetFeatureFlagAction } from './actions' -import { Action } from '../types' +import { userFacingFlags, DEPRECATED_FLAGS } from './types' +import type { Reducer } from 'redux' +import type { Flags, FlagTypes } from './types' +import type { RehydratePersistedAction } from '../persist' +import type { SetFeatureFlagAction } from './actions' +import type { Action } from '../types' // NOTE: these values will always be overridden by persisted values, // whenever the browser has seen the feature flag before and persisted it. // Only "never before seen" flags will take on the default values from `initialFlags`. diff --git a/protocol-designer/src/feature-flags/selectors.ts b/protocol-designer/src/feature-flags/selectors.ts index 35f69dd70da..82b846c0da1 100644 --- a/protocol-designer/src/feature-flags/selectors.ts +++ b/protocol-designer/src/feature-flags/selectors.ts @@ -1,7 +1,7 @@ import { createSelector } from 'reselect' import { getFlagsFromQueryParams } from './utils' -import { BaseState, Selector } from '../types' -import { Flags } from './types' +import type { BaseState, Selector } from '../types' +import type { Flags } from './types' export const getFeatureFlagData = (state: BaseState): Flags => ({ ...state.featureFlags.flags, ...getFlagsFromQueryParams(), diff --git a/protocol-designer/src/feature-flags/utils.ts b/protocol-designer/src/feature-flags/utils.ts index a2c4b94d3eb..793ccb3fe18 100644 --- a/protocol-designer/src/feature-flags/utils.ts +++ b/protocol-designer/src/feature-flags/utils.ts @@ -1,4 +1,5 @@ -import { allFlags, Flags, FlagTypes } from './types' +import { allFlags } from './types' +import type { Flags, FlagTypes } from './types' // Overwrite feature flags that come in via query params // Ex: https://designer.opentrons.com/?someFF=1&anotherFF=1 export const getFlagsFromQueryParams = (): Flags => { diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts b/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts index 8d65cf41d53..fc32b152c91 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/engageMagnet.ts @@ -1,7 +1,7 @@ // Named arguments to createFile selector. This data would be the result of several selectors. -import { RobotState, Timeline } from '@opentrons/step-generation' -import { SavedStepFormState, ModuleEntities } from '../../../step-forms' -import { StepIdType } from '../../../form-types' +import type { RobotState, Timeline } from '@opentrons/step-generation' +import type { SavedStepFormState, ModuleEntities } from '../../../step-forms' +import type { StepIdType } from '../../../form-types' export const initialRobotState: RobotState = { labware: { fixedTrash: { diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/noModules.ts b/protocol-designer/src/file-data/__fixtures__/createFile/noModules.ts index ce8bdc0c98f..222bf67941d 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/noModules.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/noModules.ts @@ -1,7 +1,7 @@ // Named arguments to createFile selector. This data would be the result of several selectors. -import { RobotState, Timeline } from '@opentrons/step-generation' -import { SavedStepFormState, ModuleEntities } from '../../../step-forms' -import { StepIdType } from '../../../form-types' +import type { RobotState, Timeline } from '@opentrons/step-generation' +import type { SavedStepFormState, ModuleEntities } from '../../../step-forms' +import type { StepIdType } from '../../../form-types' export const initialRobotState: RobotState = { labware: { fixedTrash: { diff --git a/protocol-designer/src/file-data/__fixtures__/createFile/v6Fixture.ts b/protocol-designer/src/file-data/__fixtures__/createFile/v6Fixture.ts index cf6900463c0..8ce619ba36b 100644 --- a/protocol-designer/src/file-data/__fixtures__/createFile/v6Fixture.ts +++ b/protocol-designer/src/file-data/__fixtures__/createFile/v6Fixture.ts @@ -1,7 +1,7 @@ // Named arguments to createFile selector. This data would be the result of several selectors. -import { RobotState, Timeline } from '@opentrons/step-generation' -import { SavedStepFormState, ModuleEntities } from '../../../step-forms' -import { StepIdType } from '../../../form-types' +import type { RobotState, Timeline } from '@opentrons/step-generation' +import type { SavedStepFormState, ModuleEntities } from '../../../step-forms' +import type { StepIdType } from '../../../form-types' export const initialRobotState: RobotState = { labware: { fixedTrash: { diff --git a/protocol-designer/src/file-data/actions.ts b/protocol-designer/src/file-data/actions.ts index 999e26bef82..0e175493baf 100644 --- a/protocol-designer/src/file-data/actions.ts +++ b/protocol-designer/src/file-data/actions.ts @@ -1,5 +1,5 @@ -import { FileMetadataFields, SaveFileMetadataAction } from './types' -import { WorkerResponse } from '../timelineMiddleware/types' +import type { FileMetadataFields, SaveFileMetadataAction } from './types' +import type { WorkerResponse } from '../timelineMiddleware/types' export const saveFileMetadata = ( payload: FileMetadataFields ): SaveFileMetadataAction => ({ diff --git a/protocol-designer/src/file-data/index.ts b/protocol-designer/src/file-data/index.ts index ab4e2b3b931..da3cc7b448d 100644 --- a/protocol-designer/src/file-data/index.ts +++ b/protocol-designer/src/file-data/index.ts @@ -1,7 +1,8 @@ /** This is the big selector that generates a .json file to download */ import * as actions from './actions' -import { rootReducer, RootState } from './reducers' import * as selectors from './selectors' +import { rootReducer } from './reducers' +import type { RootState } from './reducers' export * from './types' export { actions, rootReducer, selectors } export type { RootState } diff --git a/protocol-designer/src/file-data/reducers/index.ts b/protocol-designer/src/file-data/reducers/index.ts index 9a7190cb186..7f4d010e8ec 100644 --- a/protocol-designer/src/file-data/reducers/index.ts +++ b/protocol-designer/src/file-data/reducers/index.ts @@ -1,12 +1,14 @@ -import { Reducer, combineReducers } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' -import { Timeline } from '@opentrons/step-generation' -import { OT2_ROBOT_TYPE, RobotType } from '@opentrons/shared-data' -import { Action } from '../../types' -import { LoadFileAction, NewProtocolFields } from '../../load-file' -import { Substeps } from '../../steplist/types' -import { ComputeRobotStateTimelineSuccessAction } from '../actions' -import { FileMetadataFields, SaveFileMetadataAction } from '../types' +import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' +import type { Reducer } from 'redux' +import type { Timeline } from '@opentrons/step-generation' +import type { RobotType } from '@opentrons/shared-data' +import type { Action } from '../../types' +import type { LoadFileAction, NewProtocolFields } from '../../load-file' +import type { Substeps } from '../../steplist/types' +import type { ComputeRobotStateTimelineSuccessAction } from '../actions' +import type { FileMetadataFields, SaveFileMetadataAction } from '../types' export const timelineIsBeingComputed: Reducer = handleActions( { diff --git a/protocol-designer/src/file-data/selectors/commands.ts b/protocol-designer/src/file-data/selectors/commands.ts index 3f40007fdb1..b4c70cdf290 100644 --- a/protocol-designer/src/file-data/selectors/commands.ts +++ b/protocol-designer/src/file-data/selectors/commands.ts @@ -6,8 +6,8 @@ import uniqBy from 'lodash/uniqBy' import * as StepGeneration from '@opentrons/step-generation' import { getAllWellsForLabware } from '../../constants' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' -import { - selectors as stepFormSelectors, +import { selectors as stepFormSelectors } from '../../step-forms' +import type { LabwareOnDeck, LabwareTemporalProperties, ModuleOnDeck, @@ -15,9 +15,9 @@ import { PipetteOnDeck, PipetteTemporalProperties, } from '../../step-forms' -import { Substeps } from '../../steplist/types' -import { BaseState, Selector } from '../../types' -import { StepIdType } from '../../form-types' +import type { Substeps } from '../../steplist/types' +import type { BaseState, Selector } from '../../types' +import type { StepIdType } from '../../form-types' // NOTE this just adds missing well keys to the labware-ingred 'deck setup' liquid state export const getLabwareLiquidState: Selector = createSelector( diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index dfe72d15625..8257388b828 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -11,21 +11,16 @@ import { OT2_STANDARD_MODEL, FLEX_STANDARD_DECKID, SPAN7_8_10_11_SLOT, - LabwareLocation, } from '@opentrons/shared-data' + +import { COLUMN_4_SLOTS } from '@opentrons/step-generation' import { selectors as dismissSelectors } from '../../dismiss' -import { - selectors as labwareDefSelectors, - LabwareDefByDefURI, -} from '../../labware-defs' +import { selectors as labwareDefSelectors } from '../../labware-defs' import { uuid } from '../../utils' import { selectors as ingredSelectors } from '../../labware-ingred/selectors' import { selectors as stepFormSelectors } from '../../step-forms' import { selectors as uiLabwareSelectors } from '../../ui/labware' -import { - DesignerApplicationData, - getLoadLiquidCommands, -} from '../../load-file/migration/utils/getLoadLiquidCommands' +import { getLoadLiquidCommands } from '../../load-file/migration/utils/getLoadLiquidCommands' import { swatchColors } from '../../components/swatchColors' import { DEFAULT_MM_FROM_BOTTOM_ASPIRATE, @@ -36,14 +31,14 @@ import { import { getFileMetadata, getRobotType } from './fileFields' import { getInitialRobotState, getRobotStateTimeline } from './commands' -import { +import type { PipetteEntity, LabwareEntities, PipetteEntities, RobotState, - COLUMN_4_SLOTS, } from '@opentrons/step-generation' import type { + LabwareLocation, AddressableAreaName, CommandAnnotationV1Mixin, CommandV8Mixin, @@ -59,7 +54,9 @@ import type { ProtocolBase, ProtocolFile, } from '@opentrons/shared-data' +import type { LabwareDefByDefURI } from '../../labware-defs' import type { Selector } from '../../types' +import type { DesignerApplicationData } from '../../load-file/migration/utils/getLoadLiquidCommands' // TODO: BC: 2018-02-21 uncomment this assert, causes test failures // console.assert(!isEmpty(process.env.OT_PD_VERSION), 'Could not find application version!') diff --git a/protocol-designer/src/file-types.ts b/protocol-designer/src/file-types.ts index f9a904bf4a5..f8923d7a9e1 100644 --- a/protocol-designer/src/file-types.ts +++ b/protocol-designer/src/file-types.ts @@ -1,10 +1,10 @@ -import { RootState as IngredRoot } from './labware-ingred/reducers' -import { RootState as StepformRoot } from './step-forms' -import { RootState as DismissRoot } from './dismiss' -import { ProtocolFile as ProtocolFileV3 } from '@opentrons/shared-data/protocol/types/schemaV3' -import { ProtocolFile as ProtocolFileV4 } from '@opentrons/shared-data/protocol/types/schemaV4' -import { ProtocolFile as ProtocolFileV5 } from '@opentrons/shared-data/protocol/types/schemaV5' -import { ProtocolFile as ProtocolFileV6 } from '@opentrons/shared-data/protocol/types/schemaV6' +import type { RootState as IngredRoot } from './labware-ingred/reducers' +import type { RootState as StepformRoot } from './step-forms' +import type { RootState as DismissRoot } from './dismiss' +import type { ProtocolFile as ProtocolFileV3 } from '@opentrons/shared-data/protocol/types/schemaV3' +import type { ProtocolFile as ProtocolFileV4 } from '@opentrons/shared-data/protocol/types/schemaV4' +import type { ProtocolFile as ProtocolFileV5 } from '@opentrons/shared-data/protocol/types/schemaV5' +import type { ProtocolFile as ProtocolFileV6 } from '@opentrons/shared-data/protocol/types/schemaV6' export interface PDMetadata { // pipetteId to tiprackModel diff --git a/protocol-designer/src/form-types.ts b/protocol-designer/src/form-types.ts index 1e12911f1ac..5c69e549788 100644 --- a/protocol-designer/src/form-types.ts +++ b/protocol-designer/src/form-types.ts @@ -1,4 +1,4 @@ -import { +import type { PAUSE_UNTIL_RESUME, PAUSE_UNTIL_TIME, PAUSE_UNTIL_TEMP, diff --git a/protocol-designer/src/labware-defs/index.ts b/protocol-designer/src/labware-defs/index.ts index 9b3a6ae5d0c..718967323e3 100644 --- a/protocol-designer/src/labware-defs/index.ts +++ b/protocol-designer/src/labware-defs/index.ts @@ -1,6 +1,7 @@ import * as actions from './actions' -import { rootReducer, RootState } from './reducers' +import { rootReducer } from './reducers' import * as selectors from './selectors' +import type { RootState } from './reducers' export * from './types' export * from './utils' export { actions, rootReducer, selectors } diff --git a/protocol-designer/src/labware-defs/reducers.ts b/protocol-designer/src/labware-defs/reducers.ts index d6611c72b16..786213b90ad 100644 --- a/protocol-designer/src/labware-defs/reducers.ts +++ b/protocol-designer/src/labware-defs/reducers.ts @@ -1,19 +1,20 @@ import omit from 'lodash/omit' -import { Reducer, combineReducers } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' import pickBy from 'lodash/pickBy' import { getLabwareDefURI, getLabwareDefIsStandard, } from '@opentrons/shared-data' -import { Action } from '../types' -import { LabwareUploadMessage, LabwareDefByDefURI } from './types' -import { +import type { Action } from '../types' +import type { LabwareUploadMessage, LabwareDefByDefURI } from './types' +import type { CreateCustomLabwareDef, LabwareUploadMessageAction, ReplaceCustomLabwareDef, } from './actions' -import { LoadFileAction } from '../load-file' +import type { Reducer } from 'redux' +import type { LoadFileAction } from '../load-file' // @ts-expect-error(sa, 2021-6-20): cannot use string literals as action type // TODO IMMEDIATELY: refactor this to the old fashioned way if we cannot have type safety: https://github.com/redux-utilities/redux-actions/issues/282#issuecomment-595163081 const customDefs: Reducer = handleActions( diff --git a/protocol-designer/src/labware-defs/selectors.ts b/protocol-designer/src/labware-defs/selectors.ts index b01a444544a..ab78dc4aa14 100644 --- a/protocol-designer/src/labware-defs/selectors.ts +++ b/protocol-designer/src/labware-defs/selectors.ts @@ -1,10 +1,10 @@ import { createSelector } from 'reselect' import { _getSharedLabware, getAllDefinitions } from './utils' -import { LabwareDefinition2 } from '@opentrons/shared-data' -import { BaseState, Selector } from '../types' -import { LabwareDefByDefURI, LabwareUploadMessage } from './types' -import { RootState } from './reducers' -import { RootState as StepFormRootState } from '../step-forms' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { BaseState, Selector } from '../types' +import type { LabwareDefByDefURI, LabwareUploadMessage } from './types' +import type { RootState } from './reducers' +import type { RootState as StepFormRootState } from '../step-forms' // NOTE: labware-defs/ state is nested inside step-forms export const rootSelector = (state: BaseState): RootState => state.stepForms.labwareDefs diff --git a/protocol-designer/src/labware-defs/types.ts b/protocol-designer/src/labware-defs/types.ts index 882ea0a0818..af68ae062ef 100644 --- a/protocol-designer/src/labware-defs/types.ts +++ b/protocol-designer/src/labware-defs/types.ts @@ -1,4 +1,4 @@ -import { LabwareDefinition2 } from '@opentrons/shared-data' +import type { LabwareDefinition2 } from '@opentrons/shared-data' export type LabwareDefByDefURI = Record export type LabwareUploadMessageType = | 'INVALID_JSON_FILE' diff --git a/protocol-designer/src/labware-defs/utils.ts b/protocol-designer/src/labware-defs/utils.ts index a32b6bbe1f1..18886b559b9 100644 --- a/protocol-designer/src/labware-defs/utils.ts +++ b/protocol-designer/src/labware-defs/utils.ts @@ -2,12 +2,14 @@ import groupBy from 'lodash/groupBy' import { getLabwareDefURI, PD_DO_NOT_LIST, - LabwareDefinition1, - LabwareDefinition2, getAllDefinitions as _getAllDefinitions, getAllLegacyDefinitions, } from '@opentrons/shared-data' -import { LabwareDefByDefURI } from './types' +import type { + LabwareDefinition1, + LabwareDefinition2, +} from '@opentrons/shared-data' +import type { LabwareDefByDefURI } from './types' export function getLegacyLabwareDef( loadName: string | null | undefined diff --git a/protocol-designer/src/labware-ingred/actions/actions.ts b/protocol-designer/src/labware-ingred/actions/actions.ts index 7d39ec3ac76..5741b06fc24 100644 --- a/protocol-designer/src/labware-ingred/actions/actions.ts +++ b/protocol-designer/src/labware-ingred/actions/actions.ts @@ -1,7 +1,7 @@ import { createAction } from 'redux-actions' import { selectors } from '../selectors' -import { DeckSlot, ThunkAction } from '../../types' -import { IngredInputs } from '../types' +import type { DeckSlot, ThunkAction } from '../../types' +import type { IngredInputs } from '../types' // ===== Labware selector actions ===== export interface OpenAddLabwareModalAction { type: 'OPEN_ADD_LABWARE_MODAL' diff --git a/protocol-designer/src/labware-ingred/actions/thunks.ts b/protocol-designer/src/labware-ingred/actions/thunks.ts index 39418ceb2ad..95b944c2c75 100644 --- a/protocol-designer/src/labware-ingred/actions/thunks.ts +++ b/protocol-designer/src/labware-ingred/actions/thunks.ts @@ -4,13 +4,13 @@ import { selectors as labwareDefSelectors } from '../../labware-defs' import { selectors as stepFormSelectors } from '../../step-forms' import { selectors as uiLabwareSelectors } from '../../ui/labware' import { getNextAvailableDeckSlot, getNextNickname } from '../utils' -import { +import { getRobotType } from '../../file-data/selectors' +import type { CreateContainerArgs, CreateContainerAction, DuplicateLabwareAction, } from './actions' -import { ThunkAction } from '../../types' -import { getRobotType } from '../../file-data/selectors' +import type { ThunkAction } from '../../types' export interface RenameLabwareAction { type: 'RENAME_LABWARE' payload: { diff --git a/protocol-designer/src/labware-ingred/reducers/index.ts b/protocol-designer/src/labware-ingred/reducers/index.ts index bb1b8d2cdab..b968c93b4ac 100644 --- a/protocol-designer/src/labware-ingred/reducers/index.ts +++ b/protocol-designer/src/labware-ingred/reducers/index.ts @@ -1,18 +1,19 @@ -import { Reducer, combineReducers } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' import omit from 'lodash/omit' import mapValues from 'lodash/mapValues' import pickBy from 'lodash/pickBy' import { getPDMetadata } from '../../file-types' -import { +import type { Reducer } from 'redux' +import type { SingleLabwareLiquidState, LocationLiquidState, LabwareLiquidState, } from '@opentrons/step-generation' -import { Action, DeckSlot } from '../../types' -import { LiquidGroupsById, DisplayLabware } from '../types' -import { LoadFileAction } from '../../load-file' -import { +import type { Action, DeckSlot } from '../../types' +import type { LiquidGroupsById, DisplayLabware } from '../types' +import type { LoadFileAction } from '../../load-file' +import type { RemoveWellsContentsAction, CreateContainerAction, DeleteLiquidGroupAction, diff --git a/protocol-designer/src/labware-ingred/selectors.ts b/protocol-designer/src/labware-ingred/selectors.ts index 8238026c0db..817b2c705e5 100644 --- a/protocol-designer/src/labware-ingred/selectors.ts +++ b/protocol-designer/src/labware-ingred/selectors.ts @@ -1,11 +1,12 @@ -import { createSelector, Selector } from 'reselect' +import { createSelector } from 'reselect' import forEach from 'lodash/forEach' import mapValues from 'lodash/mapValues' import max from 'lodash/max' import reduce from 'lodash/reduce' -import { Options } from '@opentrons/components' -import { LabwareLiquidState } from '@opentrons/step-generation' -import { +import type { Selector } from 'reselect' +import type { Options } from '@opentrons/components' +import type { LabwareLiquidState } from '@opentrons/step-generation' +import type { RootState, ContainersState, DrillDownLabwareId, @@ -13,13 +14,13 @@ import { SelectedContainerId, SelectedLiquidGroupState, } from './reducers' -import { +import type { AllIngredGroupFields, IngredInputs, LiquidGroup, OrderedLiquids, } from './types' -import { BaseState, DeckSlot } from './../types' +import type { BaseState, DeckSlot } from './../types' // TODO: Ian 2019-02-15 no RootSlice, use BaseState interface RootSlice { labwareIngred: RootState diff --git a/protocol-designer/src/labware-ingred/types.ts b/protocol-designer/src/labware-ingred/types.ts index f5997158e32..02bb8afa6ad 100644 --- a/protocol-designer/src/labware-ingred/types.ts +++ b/protocol-designer/src/labware-ingred/types.ts @@ -1,4 +1,4 @@ -import { LocationLiquidState } from '@opentrons/step-generation' +import type { LocationLiquidState } from '@opentrons/step-generation' // TODO Ian 2018-02-19 make these shared in component library, standardize with Run App // ===== LABWARE =========== export interface DisplayLabware { diff --git a/protocol-designer/src/load-file/actions.ts b/protocol-designer/src/load-file/actions.ts index 2b841c718c3..a698696c525 100644 --- a/protocol-designer/src/load-file/actions.ts +++ b/protocol-designer/src/load-file/actions.ts @@ -1,9 +1,9 @@ import { migration } from './migration' import { selectors as fileDataSelectors } from '../file-data' import { saveFile } from './utils' -import { PDProtocolFile } from '../file-types' -import { GetState, ThunkAction, ThunkDispatch } from '../types' -import { +import type { PDProtocolFile } from '../file-types' +import type { GetState, ThunkAction, ThunkDispatch } from '../types' +import type { FileUploadErrorType, FileUploadMessage, LoadFileAction, diff --git a/protocol-designer/src/load-file/index.ts b/protocol-designer/src/load-file/index.ts index 30c2ea1a3c1..778ef3e3106 100644 --- a/protocol-designer/src/load-file/index.ts +++ b/protocol-designer/src/load-file/index.ts @@ -1,6 +1,7 @@ -import { RootState, rootReducer } from './reducers' +import { rootReducer } from './reducers' import * as actions from './actions' import * as selectors from './selectors' +import type { RootState } from './reducers' export * from './types' export { actions, rootReducer, selectors } export type { RootState } diff --git a/protocol-designer/src/load-file/migration/1_1_0.ts b/protocol-designer/src/load-file/migration/1_1_0.ts index af041cee1d9..f42852e7c96 100644 --- a/protocol-designer/src/load-file/migration/1_1_0.ts +++ b/protocol-designer/src/load-file/migration/1_1_0.ts @@ -3,13 +3,14 @@ import mapValues from 'lodash/mapValues' import omit from 'lodash/omit' import omitBy from 'lodash/omitBy' import flow from 'lodash/flow' -import { PipetteName, getPipetteSpecsV2 } from '@opentrons/shared-data' +import { getPipetteSpecsV2 } from '@opentrons/shared-data' import { getLegacyLabwareDef } from '../../labware-defs' import type { FileLabware, FilePipette, ProtocolFile, } from '@opentrons/shared-data/protocol/types/schemaV1' +import type { PipetteName } from '@opentrons/shared-data' import type { FormPatch } from '../../steplist/actions' import type { FormData } from '../../form-types' diff --git a/protocol-designer/src/load-file/migration/3_0_0.ts b/protocol-designer/src/load-file/migration/3_0_0.ts index f0b57bc6819..798eaa8ae8f 100644 --- a/protocol-designer/src/load-file/migration/3_0_0.ts +++ b/protocol-designer/src/load-file/migration/3_0_0.ts @@ -4,12 +4,12 @@ import reduce from 'lodash/reduce' import uniq from 'lodash/uniq' import { v1LabwareModelToV2Def } from './utils/v1LabwareModelToV2Def' import { getLabwareDefURI } from '@opentrons/shared-data' -import { +import type { ProtocolFile, FileLabware, FilePipette, } from '@opentrons/shared-data/protocol/types/schemaV3' -import { PDProtocolFile as PDProtocolFileV1, PDMetadata } from './1_1_0' +import type { PDProtocolFile as PDProtocolFileV1, PDMetadata } from './1_1_0' // NOTE: PDMetadata type did not change btw 1.1.0 and 3.0.0 export type PDProtocolFile = ProtocolFile // the version and schema for this migration diff --git a/protocol-designer/src/load-file/migration/6_0_0.ts b/protocol-designer/src/load-file/migration/6_0_0.ts index 2eb7a330a2b..f4ffcefd150 100644 --- a/protocol-designer/src/load-file/migration/6_0_0.ts +++ b/protocol-designer/src/load-file/migration/6_0_0.ts @@ -3,11 +3,7 @@ import mapKeys from 'lodash/mapKeys' import mapValues from 'lodash/mapValues' import omit from 'lodash/omit' import reduce from 'lodash/reduce' -import { - OT2_STANDARD_DECKID, - OT2_STANDARD_MODEL, - ProtocolFileV5, -} from '@opentrons/shared-data' +import { OT2_STANDARD_DECKID, OT2_STANDARD_MODEL } from '@opentrons/shared-data' import { uuid } from '../../utils' import { FIXED_TRASH_ID, INITIAL_DECK_SETUP_STEP_ID } from '../../constants' // NOTE: this migration bump adds load commands (loadLiquid, loadModule, loadPipette, loadLabware), modifies both pipette @@ -15,6 +11,7 @@ import { FIXED_TRASH_ID, INITIAL_DECK_SETUP_STEP_ID } from '../../constants' // and module keys such as slot, mount // and renames well to wellName import { getLoadLiquidCommands } from './utils/getLoadLiquidCommands' +import type { ProtocolFileV5 } from '@opentrons/shared-data' import type { LoadPipetteCreateCommand, LoadModuleCreateCommand, diff --git a/protocol-designer/src/load-file/migration/index.ts b/protocol-designer/src/load-file/migration/index.ts index 16e58a0cce7..120cff0a6ad 100644 --- a/protocol-designer/src/load-file/migration/index.ts +++ b/protocol-designer/src/load-file/migration/index.ts @@ -1,7 +1,6 @@ import flow from 'lodash/flow' import takeRightWhile from 'lodash/takeRightWhile' import semver from 'semver' -import { PDProtocolFile } from '../../file-types' import { migrateFile as migrateFileOne } from './1_1_0' import { migrateFile as migrateFileThree } from './3_0_0' import { migrateFile as migrateFileFour } from './4_0_0' @@ -12,6 +11,7 @@ import { migrateFile as migrateFileSix } from './6_0_0' import { migrateFile as migrateFileSeven } from './7_0_0' import { migrateFile as migrateFileEight } from './8_0_0' import { migrateFile as migrateFileEightOne } from './8_1_0' +import type { PDProtocolFile } from '../../file-types' export const OLDEST_MIGRATEABLE_VERSION = '1.0.0' type Version = string diff --git a/protocol-designer/src/load-file/migration/utils/v1LabwareModelToV2Def.ts b/protocol-designer/src/load-file/migration/utils/v1LabwareModelToV2Def.ts index a8c1bc25e3a..0325983fb1b 100644 --- a/protocol-designer/src/load-file/migration/utils/v1LabwareModelToV2Def.ts +++ b/protocol-designer/src/load-file/migration/utils/v1LabwareModelToV2Def.ts @@ -1,5 +1,5 @@ import { getOnlyLatestDefs } from '../../../labware-defs' -import { LabwareDefinition2 } from '@opentrons/shared-data' +import type { LabwareDefinition2 } from '@opentrons/shared-data' const v1ModelTov2LoadNameMap = { '6-well-plate': 'corning_6_wellplate_16.8ml_flat', '12-well-plate': 'corning_12_wellplate_6.9ml_flat', diff --git a/protocol-designer/src/load-file/reducers.ts b/protocol-designer/src/load-file/reducers.ts index a47284a04e3..76ec872aca0 100644 --- a/protocol-designer/src/load-file/reducers.ts +++ b/protocol-designer/src/load-file/reducers.ts @@ -1,8 +1,9 @@ -import { Reducer, combineReducers } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' -import { Action } from '../types' -import { FileUploadMessage, LoadFileAction } from './types' -import { FileUploadMessageAction } from './actions' +import type { Reducer } from 'redux' +import type { Action } from '../types' +import type { FileUploadMessage, LoadFileAction } from './types' +import type { FileUploadMessageAction } from './actions' // Keep track of file upload errors / messages type FileUploadMessageState = FileUploadMessage | null | undefined diff --git a/protocol-designer/src/load-file/selectors.ts b/protocol-designer/src/load-file/selectors.ts index 8a1003425cd..733fd2dfb27 100644 --- a/protocol-designer/src/load-file/selectors.ts +++ b/protocol-designer/src/load-file/selectors.ts @@ -1,6 +1,6 @@ import { createSelector } from 'reselect' -import { BaseState, Selector } from '../types' -import { RootState } from './reducers' +import type { BaseState, Selector } from '../types' +import type { RootState } from './reducers' export const rootSelector = (state: BaseState): RootState => state.loadFile export const getFileUploadMessages: Selector< RootState['fileUploadMessage'] diff --git a/protocol-designer/src/load-file/types.ts b/protocol-designer/src/load-file/types.ts index bfd612b0898..d3a25dfde74 100644 --- a/protocol-designer/src/load-file/types.ts +++ b/protocol-designer/src/load-file/types.ts @@ -1,4 +1,4 @@ -import { PDProtocolFile } from '../file-types' +import type { PDProtocolFile } from '../file-types' import type { RobotType } from '@opentrons/shared-data' export type FileUploadErrorType = 'INVALID_FILE_TYPE' | 'INVALID_JSON_FILE' diff --git a/protocol-designer/src/navigation/actions.ts b/protocol-designer/src/navigation/actions.ts index 4b365d82f5d..751ffd324cf 100644 --- a/protocol-designer/src/navigation/actions.ts +++ b/protocol-designer/src/navigation/actions.ts @@ -1,4 +1,4 @@ -import { Page } from './types' +import type { Page } from './types' export interface NavigateToPageAction { type: 'NAVIGATE_TO_PAGE' payload: Page diff --git a/protocol-designer/src/navigation/index.ts b/protocol-designer/src/navigation/index.ts index d449b20323c..6229586f0c2 100644 --- a/protocol-designer/src/navigation/index.ts +++ b/protocol-designer/src/navigation/index.ts @@ -1,6 +1,7 @@ import * as actions from './actions' -import { rootReducer, RootState } from './reducers' +import { rootReducer } from './reducers' import * as selectors from './selectors' +import type { RootState } from './reducers' // TODO export types from reducers export * from './types' export { actions, rootReducer, selectors } diff --git a/protocol-designer/src/navigation/reducers/index.ts b/protocol-designer/src/navigation/reducers/index.ts index 07d464486ac..1c6a9df5593 100644 --- a/protocol-designer/src/navigation/reducers/index.ts +++ b/protocol-designer/src/navigation/reducers/index.ts @@ -1,8 +1,12 @@ -import { Reducer, combineReducers } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' -import { BaseState, Action } from '../../types' -import { NavigateToPageAction, ToggleNewProtocolModalAction } from '../actions' -import { Page } from '../types' +import type { Reducer } from 'redux' +import type { BaseState, Action } from '../../types' +import type { + NavigateToPageAction, + ToggleNewProtocolModalAction, +} from '../actions' +import type { Page } from '../types' const page: Reducer = handleActions( { LOAD_FILE: (): Page => 'file-detail', diff --git a/protocol-designer/src/navigation/selectors.ts b/protocol-designer/src/navigation/selectors.ts index 5ddf985ee82..3a1fa647f17 100644 --- a/protocol-designer/src/navigation/selectors.ts +++ b/protocol-designer/src/navigation/selectors.ts @@ -1,6 +1,6 @@ -import { BaseState, Selector } from '../types' import { rootSelector as navigationRootSelector } from './reducers' -import { Page } from './types' +import type { BaseState, Selector } from '../types' +import type { Page } from './types' export const getNewProtocolModal: Selector = (state: BaseState) => navigationRootSelector(state).newProtocolModal export const getCurrentPage: Selector = (state: BaseState) => { diff --git a/protocol-designer/src/persist.ts b/protocol-designer/src/persist.ts index 42edf18dc16..fbec573b065 100644 --- a/protocol-designer/src/persist.ts +++ b/protocol-designer/src/persist.ts @@ -1,7 +1,7 @@ import get from 'lodash/get' -import { Store } from 'redux' import { dismissedHintsPersist } from './tutorial/reducers' +import type { Store } from 'redux' export interface RehydratePersistedAction { type: 'REHYDRATE_PERSISTED' payload: { diff --git a/protocol-designer/src/pipettes/pipetteData.ts b/protocol-designer/src/pipettes/pipetteData.ts index 4da240de6b5..00040089e49 100644 --- a/protocol-designer/src/pipettes/pipetteData.ts +++ b/protocol-designer/src/pipettes/pipetteData.ts @@ -1,4 +1,3 @@ -import { DropdownOption } from '../../../components/lib/forms/DropdownField.d' import { getPipetteSpecsV2, getTiprackVolume, @@ -7,6 +6,7 @@ import { import type { PipetteName } from '@opentrons/shared-data' import type { Options } from '@opentrons/components' import type { LabwareEntities, PipetteEntity } from '@opentrons/step-generation' +import type { DropdownOption } from '../../../components/lib/forms/DropdownField.d' const supportedPipetteNames: PipetteName[] = [ 'p10_single', 'p10_multi', diff --git a/protocol-designer/src/step-forms/actions/index.ts b/protocol-designer/src/step-forms/actions/index.ts index 1cda526efc3..e55d8ca14d1 100644 --- a/protocol-designer/src/step-forms/actions/index.ts +++ b/protocol-designer/src/step-forms/actions/index.ts @@ -1,7 +1,7 @@ import { getBatchEditFieldChanges } from '../selectors' -import { ThunkAction } from '../../types' -import { StepIdType, StepFieldName } from '../../form-types' -import { BatchEditFormChangesState } from '../reducers' +import type { ThunkAction } from '../../types' +import type { StepIdType, StepFieldName } from '../../form-types' +import type { BatchEditFormChangesState } from '../reducers' export * from './modules' export * from './pipettes' export interface ChangeBatchEditFieldAction { diff --git a/protocol-designer/src/step-forms/actions/modules.ts b/protocol-designer/src/step-forms/actions/modules.ts index 6d119ceb15e..f405d2773d3 100644 --- a/protocol-designer/src/step-forms/actions/modules.ts +++ b/protocol-designer/src/step-forms/actions/modules.ts @@ -1,6 +1,6 @@ import { uuid } from '../../utils' -import { ModuleModel, ModuleType } from '@opentrons/shared-data' -import { DeckSlot } from '../../types' +import type { ModuleModel, ModuleType } from '@opentrons/shared-data' +import type { DeckSlot } from '../../types' export interface CreateModuleAction { type: 'CREATE_MODULE' payload: { diff --git a/protocol-designer/src/step-forms/actions/pipettes.ts b/protocol-designer/src/step-forms/actions/pipettes.ts index 1e44b34b4d6..cdc5b5ca1e0 100644 --- a/protocol-designer/src/step-forms/actions/pipettes.ts +++ b/protocol-designer/src/step-forms/actions/pipettes.ts @@ -1,5 +1,5 @@ -import { NormalizedPipetteById } from '@opentrons/step-generation' -import { StepIdType } from '../../form-types' +import type { NormalizedPipetteById } from '@opentrons/step-generation' +import type { StepIdType } from '../../form-types' export interface CreatePipettesAction { type: 'CREATE_PIPETTES' payload: NormalizedPipetteById diff --git a/protocol-designer/src/step-forms/index.ts b/protocol-designer/src/step-forms/index.ts index 310d7fbf798..14e1497b4d6 100644 --- a/protocol-designer/src/step-forms/index.ts +++ b/protocol-designer/src/step-forms/index.ts @@ -1,6 +1,7 @@ -import { rootReducer, RootState, SavedStepFormState } from './reducers' +import { rootReducer } from './reducers' import * as selectors from './selectors' import * as actions from './actions' +import type { RootState, SavedStepFormState } from './reducers' export * from './utils' export * from './types' export type { RootState, SavedStepFormState } diff --git a/protocol-designer/src/step-forms/reducers/index.ts b/protocol-designer/src/step-forms/reducers/index.ts index c901e2e8876..f180bc5f175 100644 --- a/protocol-designer/src/step-forms/reducers/index.ts +++ b/protocol-designer/src/step-forms/reducers/index.ts @@ -1,5 +1,4 @@ import { handleActions } from 'redux-actions' -import { Reducer } from 'redux' import mapValues from 'lodash/mapValues' import cloneDeep from 'lodash/cloneDeep' import merge from 'lodash/merge' @@ -12,21 +11,12 @@ import { getLabwareDefaultEngageHeight, getLabwareDefURI, getModuleType, - LoadLabwareCreateCommand, - LoadModuleCreateCommand, - LoadPipetteCreateCommand, - MoveLabwareCreateCommand, - MoveToAddressableAreaCreateCommand, - MoveToAddressableAreaForDropTipCreateCommand, MAGNETIC_MODULE_TYPE, MAGNETIC_MODULE_V1, - PipetteName, THERMOCYCLER_MODULE_TYPE, WASTE_CHUTE_ADDRESSABLE_AREAS, - AddressableAreaName, MOVABLE_TRASH_ADDRESSABLE_AREAS, } from '@opentrons/shared-data' -import type { RootState as LabwareDefsRootState } from '../../labware-defs' import { rootReducer as labwareDefsRootReducer } from '../../labware-defs' import { getCutoutIdByAddressableArea, uuid } from '../../utils' import { INITIAL_DECK_SETUP_STEP_ID, SPAN7_8_10_11_SLOT } from '../../constants' @@ -44,25 +34,13 @@ import { import { getLabwareOnModule } from '../../ui/modules/utils' import { nestedCombineReducers } from './nestedCombineReducers' import { PROFILE_CYCLE, PROFILE_STEP } from '../../form-types' -import { - COLUMN_4_SLOTS, - NormalizedAdditionalEquipmentById, - NormalizedPipetteById, -} from '@opentrons/step-generation' -import { LoadFileAction } from '../../load-file' -import { SaveStepFormAction } from '../../ui/steps/actions/thunks' -import { ReplaceCustomLabwareDef } from '../../labware-defs/actions' +import { COLUMN_4_SLOTS } from '@opentrons/step-generation' import { _getPipetteEntitiesRootState, _getLabwareEntitiesRootState, _getInitialDeckSetupRootState, _getAdditionalEquipmentEntitiesRootState, } from '../selectors' -import { - CreateDeckFixtureAction, - DeleteDeckFixtureAction, - ToggleIsGripperRequiredAction, -} from '../actions/additionalItems' import { createPresavedStepForm, getDeckItemIdInSlot, @@ -70,6 +48,30 @@ import { getUnoccupiedSlotForMoveableTrash, } from '../utils' +import type { Reducer } from 'redux' +import type { + NormalizedAdditionalEquipmentById, + NormalizedPipetteById, +} from '@opentrons/step-generation' +import type { + LoadLabwareCreateCommand, + LoadModuleCreateCommand, + LoadPipetteCreateCommand, + MoveLabwareCreateCommand, + MoveToAddressableAreaCreateCommand, + MoveToAddressableAreaForDropTipCreateCommand, + PipetteName, + AddressableAreaName, +} from '@opentrons/shared-data' +import type { RootState as LabwareDefsRootState } from '../../labware-defs' +import type { LoadFileAction } from '../../load-file' +import type { SaveStepFormAction } from '../../ui/steps/actions/thunks' +import type { ReplaceCustomLabwareDef } from '../../labware-defs/actions' +import type { + CreateDeckFixtureAction, + DeleteDeckFixtureAction, + ToggleIsGripperRequiredAction, +} from '../actions/additionalItems' import type { CreateModuleAction, CreatePipettesAction, diff --git a/protocol-designer/src/step-forms/reducers/nestedCombineReducers.ts b/protocol-designer/src/step-forms/reducers/nestedCombineReducers.ts index 393caceb589..45ea5f8270a 100644 --- a/protocol-designer/src/step-forms/reducers/nestedCombineReducers.ts +++ b/protocol-designer/src/step-forms/reducers/nestedCombineReducers.ts @@ -1,4 +1,4 @@ -import { Action, Reducer } from 'redux' +import type { Action, Reducer } from 'redux' export type GetNextState = (args: { action: A state: S diff --git a/protocol-designer/src/step-forms/selectors/index.ts b/protocol-designer/src/step-forms/selectors/index.ts index 3e3cb161f81..372ea86f0a2 100644 --- a/protocol-designer/src/step-forms/selectors/index.ts +++ b/protocol-designer/src/step-forms/selectors/index.ts @@ -2,7 +2,7 @@ import isEqual from 'lodash/isEqual' import mapValues from 'lodash/mapValues' import reduce from 'lodash/reduce' import isEmpty from 'lodash/isEmpty' -import { createSelector, Selector } from 'reselect' +import { createSelector } from 'reselect' import { getLabwareDisplayName, getLabwareDefURI, @@ -10,53 +10,51 @@ import { TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, - PipetteName, MAGNETIC_BLOCK_TYPE, getPipetteSpecsV2, - LabwareDefinition2, } from '@opentrons/shared-data' -import { - AdditionalEquipmentEntities, - NormalizedAdditionalEquipmentById, - TEMPERATURE_DEACTIVATED, -} from '@opentrons/step-generation' +import { TEMPERATURE_DEACTIVATED } from '@opentrons/step-generation' + import { INITIAL_DECK_SETUP_STEP_ID } from '../../constants' import { getFormWarnings, getFormErrors, stepFormToArgs, } from '../../steplist/formLevel' -import { - ProfileFormError, - getProfileFormErrors, -} from '../../steplist/formLevel/profileErrors' +import { getProfileFormErrors } from '../../steplist/formLevel/profileErrors' import { getMoveLabwareFormErrors } from '../../steplist/formLevel/moveLabwareFormErrors' import { getFieldErrors } from '../../steplist/fieldLevel' import { getProfileItemsHaveErrors } from '../utils/getProfileItemsHaveErrors' import * as featureFlagSelectors from '../../feature-flags/selectors' import { denormalizePipetteEntities, getHydratedForm } from '../utils' -import { - selectors as labwareDefSelectors, - LabwareDefByDefURI, -} from '../../labware-defs' -import { InstrumentGroup } from '@opentrons/components' -import type { - DropdownOption, - Mount, - InstrumentInfoProps, -} from '@opentrons/components' +import { selectors as labwareDefSelectors } from '../../labware-defs' +import type { Selector } from 'reselect' import type { + AdditionalEquipmentEntities, + NormalizedAdditionalEquipmentById, InvariantContext, LabwareEntity, LabwareEntities, ModuleEntities, PipetteEntities, } from '@opentrons/step-generation' +import type { PipetteName, LabwareDefinition2 } from '@opentrons/shared-data' +import type { + InstrumentGroup, + DropdownOption, + Mount, + InstrumentInfoProps, +} from '@opentrons/components' +import type { ProfileFormError } from '../../steplist/formLevel/profileErrors' +import type { LabwareDefByDefURI } from '../../labware-defs' import type { FormWarning } from '../../steplist/formLevel' -import { BaseState, DeckSlot } from '../../types' -import { FormData, StepIdType } from '../../form-types' -import { StepArgsAndErrorsById, StepFormErrors } from '../../steplist/types' -import { +import type { BaseState, DeckSlot } from '../../types' +import type { FormData, StepIdType } from '../../form-types' +import type { + StepArgsAndErrorsById, + StepFormErrors, +} from '../../steplist/types' +import type { InitialDeckSetup, NormalizedLabwareById, NormalizedLabware, @@ -71,7 +69,7 @@ import { HeaterShakerModuleState, MagneticBlockState, } from '../types' -import { +import type { PresavedStepFormState, RootState, SavedStepFormState, diff --git a/protocol-designer/src/step-forms/types.ts b/protocol-designer/src/step-forms/types.ts index 24dee9b0c46..bffcda77c79 100644 --- a/protocol-designer/src/step-forms/types.ts +++ b/protocol-designer/src/step-forms/types.ts @@ -1,5 +1,5 @@ -import { Mount } from '@opentrons/components' -import { +import type { Mount } from '@opentrons/components' +import type { ModuleType, ModuleModel, MAGNETIC_MODULE_TYPE, @@ -9,9 +9,9 @@ import { MAGNETIC_BLOCK_TYPE, NozzleConfigurationStyle, } from '@opentrons/shared-data' -import { DeckSlot } from '../types' +import type { DeckSlot } from '../types' -import { +import type { TemperatureStatus, ModuleEntity, PipetteEntity, diff --git a/protocol-designer/src/step-forms/utils/createInitialProfileItems.ts b/protocol-designer/src/step-forms/utils/createInitialProfileItems.ts index 70a05f33774..3b072cdc470 100644 --- a/protocol-designer/src/step-forms/utils/createInitialProfileItems.ts +++ b/protocol-designer/src/step-forms/utils/createInitialProfileItems.ts @@ -1,9 +1,5 @@ -import { - PROFILE_CYCLE, - PROFILE_STEP, - ProfileStepItem, - ProfileCycleItem, -} from '../../form-types' +import { PROFILE_CYCLE, PROFILE_STEP } from '../../form-types' +import type { ProfileStepItem, ProfileCycleItem } from '../../form-types' export const createInitialProfileStep = (id: string): ProfileStepItem => ({ type: PROFILE_STEP, id, diff --git a/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts b/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts index 5e3563683b0..56c5788f36e 100644 --- a/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts +++ b/protocol-designer/src/step-forms/utils/createPresavedStepForm.ts @@ -18,17 +18,17 @@ import { getMagnetLabwareEngageHeight, } from '../../ui/modules/utils' import { maskField } from '../../steplist/fieldLevel' -import { +import type { PipetteEntities, LabwareEntities, RobotState, Timeline, AdditionalEquipmentEntities, } from '@opentrons/step-generation' -import { FormData, StepType, StepIdType } from '../../form-types' -import { InitialDeckSetup } from '../types' -import { FormPatch } from '../../steplist/actions/types' -import { SavedStepFormState, OrderedStepIdsState } from '../reducers' +import type { FormData, StepType, StepIdType } from '../../form-types' +import type { InitialDeckSetup } from '../types' +import type { FormPatch } from '../../steplist/actions/types' +import type { SavedStepFormState, OrderedStepIdsState } from '../reducers' export interface CreatePresavedStepFormArgs { stepId: StepIdType stepType: StepType diff --git a/protocol-designer/src/step-forms/utils/index.ts b/protocol-designer/src/step-forms/utils/index.ts index d9b2d108132..03cc9e9ba4e 100644 --- a/protocol-designer/src/step-forms/utils/index.ts +++ b/protocol-designer/src/step-forms/utils/index.ts @@ -12,8 +12,8 @@ import { } from '@opentrons/shared-data' import { SPAN7_8_10_11_SLOT, TC_SPAN_SLOTS } from '../../constants' import { hydrateField } from '../../steplist/fieldLevel' -import { LabwareDefByDefURI } from '../../labware-defs' import { getCutoutIdByAddressableArea } from '../../utils' +import type { LabwareDefByDefURI } from '../../labware-defs' import type { AddressableAreaName, CutoutId, diff --git a/protocol-designer/src/steplist/actions/actions.ts b/protocol-designer/src/steplist/actions/actions.ts index 7149e114059..2f5d3bdf9af 100644 --- a/protocol-designer/src/steplist/actions/actions.ts +++ b/protocol-designer/src/steplist/actions/actions.ts @@ -1,9 +1,9 @@ import { getOrderedStepIds } from '../../step-forms/selectors' import { getNextNonTerminalItemId } from '../utils' -import { ThunkAction } from '../../types' -import { StepIdType, FormData } from '../../form-types' -import { ChangeFormPayload } from './types' -import { +import type { ThunkAction } from '../../types' +import type { StepIdType, FormData } from '../../form-types' +import type { ChangeFormPayload } from './types' +import type { ClearSelectedItemAction, SelectMultipleStepsAction, } from '../../ui/steps' diff --git a/protocol-designer/src/steplist/actions/types.ts b/protocol-designer/src/steplist/actions/types.ts index 1e346c13764..b38a0eefa21 100644 --- a/protocol-designer/src/steplist/actions/types.ts +++ b/protocol-designer/src/steplist/actions/types.ts @@ -1,4 +1,4 @@ -import { StepFieldName } from '../fieldLevel' +import type { StepFieldName } from '../fieldLevel' export type FormPatch = Partial> // Update Form input (onChange on inputs) export interface ChangeFormPayload { diff --git a/protocol-designer/src/steplist/fieldLevel/index.ts b/protocol-designer/src/steplist/fieldLevel/index.ts index 15dd06279cf..b3551819fab 100644 --- a/protocol-designer/src/steplist/fieldLevel/index.ts +++ b/protocol-designer/src/steplist/fieldLevel/index.ts @@ -16,8 +16,6 @@ import { defaultTo, composeMaskers, trimDecimals, - ValueMasker, - ValueCaster, } from './processing' import { MIN_TEMP_MODULE_TEMP, @@ -37,7 +35,8 @@ import { MIN_TC_PROFILE_VOLUME, MAX_TC_PROFILE_VOLUME, } from '../../constants' -import { +import { getStagingAreaAddressableAreas } from '../../utils' +import type { LabwareEntity, PipetteEntity, InvariantContext, @@ -45,7 +44,7 @@ import { AdditionalEquipmentEntities, AdditionalEquipmentEntity, } from '@opentrons/step-generation' -import { getStagingAreaAddressableAreas } from '../../utils' +import type { ValueMasker, ValueCaster } from './processing' import type { StepFieldName } from '../../form-types' import type { AddressableAreaName, diff --git a/protocol-designer/src/steplist/formLevel/createBlankForm.ts b/protocol-designer/src/steplist/formLevel/createBlankForm.ts index f7fcd6a7743..c8e22a1fb88 100644 --- a/protocol-designer/src/steplist/formLevel/createBlankForm.ts +++ b/protocol-designer/src/steplist/formLevel/createBlankForm.ts @@ -1,5 +1,10 @@ import { getDefaultsForStepType } from './getDefaultsForStepType' -import { StepType, StepIdType, BlankForm, FormData } from '../../form-types' +import type { + StepType, + StepIdType, + BlankForm, + FormData, +} from '../../form-types' interface NewFormArgs { stepId: StepIdType stepType: StepType diff --git a/protocol-designer/src/steplist/formLevel/errors.ts b/protocol-designer/src/steplist/formLevel/errors.ts index 64aac638745..a9158bea010 100644 --- a/protocol-designer/src/steplist/formLevel/errors.ts +++ b/protocol-designer/src/steplist/formLevel/errors.ts @@ -1,4 +1,3 @@ -import * as React from 'react' import { getWellRatio } from '../utils' import { canPipetteUseLabware } from '../../utils' import { MAGNETIC_MODULE_V1, MAGNETIC_MODULE_V2 } from '@opentrons/shared-data' @@ -13,7 +12,8 @@ import { PAUSE_UNTIL_TEMP, THERMOCYCLER_PROFILE, } from '../../constants' -import { StepFieldName } from '../../form-types' +import type * as React from 'react' +import type { StepFieldName } from '../../form-types' import type { LabwareEntities } from '@opentrons/step-generation' /******************* ** Error Messages ** diff --git a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts index a6933bc85e4..23ee6d1d5e3 100644 --- a/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts +++ b/protocol-designer/src/steplist/formLevel/getDefaultsForStepType.ts @@ -6,7 +6,7 @@ import { DEFAULT_DELAY_SECONDS, DEFAULT_MM_BLOWOUT_OFFSET_FROM_TOP, } from '../../constants' -import { StepType, StepFieldName } from '../../form-types' +import type { StepType, StepFieldName } from '../../form-types' export function getDefaultsForStepType( stepType: StepType ): Record { diff --git a/protocol-designer/src/steplist/formLevel/getNextDefaultEngageHeight/index.ts b/protocol-designer/src/steplist/formLevel/getNextDefaultEngageHeight/index.ts index 6220e92e875..5ffc41e7b62 100644 --- a/protocol-designer/src/steplist/formLevel/getNextDefaultEngageHeight/index.ts +++ b/protocol-designer/src/steplist/formLevel/getNextDefaultEngageHeight/index.ts @@ -1,5 +1,5 @@ import last from 'lodash/last' -import { StepIdType, FormData } from '../../../form-types' +import type { StepIdType, FormData } from '../../../form-types' export function getNextDefaultEngageHeight( savedForms: Record, orderedStepIds: StepIdType[] diff --git a/protocol-designer/src/steplist/formLevel/getNextDefaultMagnetAction/index.ts b/protocol-designer/src/steplist/formLevel/getNextDefaultMagnetAction/index.ts index 062c007fb86..ef0e2888b98 100644 --- a/protocol-designer/src/steplist/formLevel/getNextDefaultMagnetAction/index.ts +++ b/protocol-designer/src/steplist/formLevel/getNextDefaultMagnetAction/index.ts @@ -1,5 +1,5 @@ import last from 'lodash/last' -import { StepIdType, FormData, MagnetAction } from '../../../form-types' +import type { StepIdType, FormData, MagnetAction } from '../../../form-types' export function getNextDefaultMagnetAction( savedForms: Record, orderedStepIds: StepIdType[] diff --git a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultTemperatureModuleId.ts b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultTemperatureModuleId.ts index 6d24c6a0ca3..b727de28de5 100644 --- a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultTemperatureModuleId.ts +++ b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultTemperatureModuleId.ts @@ -1,7 +1,7 @@ import findKey from 'lodash/findKey' import { TEMPERATURE_MODULE_TYPE } from '@opentrons/shared-data' -import { ModuleOnDeck } from '../../../step-forms' -import { StepIdType, FormData } from '../../../form-types' +import type { ModuleOnDeck } from '../../../step-forms' +import type { StepIdType, FormData } from '../../../form-types' export function getNextDefaultTemperatureModuleId( savedForms: Record, orderedStepIds: StepIdType[], diff --git a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultThermocyclerModuleId.ts b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultThermocyclerModuleId.ts index 2064e2fc985..bf993d6d952 100644 --- a/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultThermocyclerModuleId.ts +++ b/protocol-designer/src/steplist/formLevel/getNextDefaultModuleId/getNextDefaultThermocyclerModuleId.ts @@ -1,6 +1,6 @@ import findKey from 'lodash/findKey' import { THERMOCYCLER_MODULE_TYPE } from '@opentrons/shared-data' -import { ModuleOnDeck } from '../../../step-forms' +import type { ModuleOnDeck } from '../../../step-forms' export function getNextDefaultThermocyclerModuleId( equippedModulesById: Record ): string | null { diff --git a/protocol-designer/src/steplist/formLevel/getNextDefaultPipetteId/index.ts b/protocol-designer/src/steplist/formLevel/getNextDefaultPipetteId/index.ts index d4880136bc3..2d8732efcd0 100644 --- a/protocol-designer/src/steplist/formLevel/getNextDefaultPipetteId/index.ts +++ b/protocol-designer/src/steplist/formLevel/getNextDefaultPipetteId/index.ts @@ -1,7 +1,7 @@ import findKey from 'lodash/findKey' import last from 'lodash/last' -import { PipetteOnDeck } from '../../../step-forms' -import { StepIdType, FormData } from '../../../form-types' +import type { PipetteOnDeck } from '../../../step-forms' +import type { StepIdType, FormData } from '../../../form-types' // TODO: Ian 2018-09-18 once we support switching pipettes mid-protocol, // this should use pipette state in RobotState, instead of pipettes/ selectors // (which represent initial pipette state, expected to be static across the timeline) diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateHeaterShaker.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateHeaterShaker.ts index 9931472ba43..3147357bf31 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateHeaterShaker.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateHeaterShaker.ts @@ -1,6 +1,6 @@ import { chainPatchUpdaters, fieldHasChanged } from './utils' -import { FormData } from '../../../form-types' -import { FormPatch } from '../../actions/types' +import type { FormData } from '../../../form-types' +import type { FormPatch } from '../../actions/types' const updatePatchOnSetShakeChange = ( patch: FormPatch, diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMagnet.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMagnet.ts index 035b77cd1cc..1b5ed50ef5c 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMagnet.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMagnet.ts @@ -1,8 +1,8 @@ import pick from 'lodash/pick' import { chainPatchUpdaters, fieldHasChanged } from './utils' import { getDefaultsForStepType } from '../getDefaultsForStepType' -import { FormData, StepFieldName } from '../../../form-types' -import { FormPatch } from '../../actions/types' +import type { FormData, StepFieldName } from '../../../form-types' +import type { FormPatch } from '../../actions/types' // TODO: Ian 2019-02-21 import this from a more central place - see #2926 const getDefaultFields = (...fields: StepFieldName[]): FormPatch => diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts index 86df6366716..7a493118348 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateMoveLiquid.ts @@ -27,8 +27,8 @@ import type { LabwareEntities, PipetteEntities, } from '@opentrons/step-generation' -import { FormData, StepFieldName } from '../../../form-types' -import { FormPatch } from '../../actions/types' +import type { FormData, StepFieldName } from '../../../form-types' +import type { FormPatch } from '../../actions/types' // TODO: Ian 2019-02-21 import this from a more central place - see #2926 const getDefaultFields = (...fields: StepFieldName[]): FormPatch => diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdatePause.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdatePause.ts index 65fb9c4270d..902ec98309d 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdatePause.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdatePause.ts @@ -2,8 +2,8 @@ import pick from 'lodash/pick' import { chainPatchUpdaters, fieldHasChanged } from './utils' import { getDefaultsForStepType } from '../getDefaultsForStepType' -import { FormData, StepFieldName } from '../../../form-types' -import { FormPatch } from '../../actions/types' +import type { FormData, StepFieldName } from '../../../form-types' +import type { FormPatch } from '../../actions/types' // TODO: Ian 2019-02-21 import this from a more central place - see #2926 const getDefaultFields = (...fields: StepFieldName[]): FormPatch => diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateTemperature.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateTemperature.ts index d282b1d589c..fa8264edd93 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateTemperature.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateTemperature.ts @@ -1,8 +1,8 @@ import pick from 'lodash/pick' import { chainPatchUpdaters, fieldHasChanged } from './utils' import { getDefaultsForStepType } from '../getDefaultsForStepType' -import { FormData, StepFieldName } from '../../../form-types' -import { FormPatch } from '../../actions/types' +import type { FormData, StepFieldName } from '../../../form-types' +import type { FormPatch } from '../../actions/types' // TODO: Ian 2019-02-21 import this from a more central place - see #2926 const getDefaultFields = (...fields: StepFieldName[]): FormPatch => diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateThermocycler.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateThermocycler.ts index 507140fa64a..c0e315d19a6 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateThermocycler.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/dependentFieldsUpdateThermocycler.ts @@ -1,8 +1,8 @@ import pick from 'lodash/pick' import { chainPatchUpdaters, fieldHasChanged } from './utils' import { getDefaultsForStepType } from '../getDefaultsForStepType' -import { FormData, StepFieldName } from '../../../form-types' -import { FormPatch } from '../../actions/types' +import type { FormData, StepFieldName } from '../../../form-types' +import type { FormPatch } from '../../actions/types' // TODO: Ian 2019-02-21 import this from a more central place - see #2926 const getDefaultFields = (...fields: StepFieldName[]): FormPatch => diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/index.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/index.ts index ecdde16ede4..a86737aa037 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/index.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/index.ts @@ -5,9 +5,12 @@ import { dependentFieldsUpdatePause } from './dependentFieldsUpdatePause' import { dependentFieldsUpdateTemperature } from './dependentFieldsUpdateTemperature' import { dependentFieldsUpdateHeaterShaker } from './dependentFieldsUpdateHeaterShaker' import { dependentFieldsUpdateThermocycler } from './dependentFieldsUpdateThermocycler' -import { LabwareEntities, PipetteEntities } from '@opentrons/step-generation' -import { FormData } from '../../../form-types' -import { FormPatch } from '../../actions/types' +import type { + LabwareEntities, + PipetteEntities, +} from '@opentrons/step-generation' +import type { FormData } from '../../../form-types' +import type { FormPatch } from '../../actions/types' export function handleFormChange( patch: FormPatch, rawForm: FormData | null | undefined, diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts index 692ee51fe0d..7ac47b9695f 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/test/moveLiquid.test.ts @@ -14,8 +14,8 @@ import { import { fixtureP10SingleV2Specs, fixtureP300SingleV2Specs, - LabwareDefinition2, } from '@opentrons/shared-data' +import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { PipetteEntities, LabwareEntities, diff --git a/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts b/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts index 4ec62eb354d..fe5e82ff767 100644 --- a/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts +++ b/protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts @@ -2,10 +2,16 @@ import round from 'lodash/round' import uniq from 'lodash/uniq' import { getWellSetForMultichannel, canPipetteUseLabware } from '../../../utils' import { getPipetteCapacity } from '../../../pipettes/pipetteData' -import { LabwareDefinition2, PipetteChannels } from '@opentrons/shared-data' -import { LabwareEntities, PipetteEntities } from '@opentrons/step-generation' -import { FormPatch } from '../../actions/types' -import { FormData, PathOption, StepFieldName } from '../../../form-types' +import type { + LabwareDefinition2, + PipetteChannels, +} from '@opentrons/shared-data' +import type { + LabwareEntities, + PipetteEntities, +} from '@opentrons/step-generation' +import type { FormPatch } from '../../actions/types' +import type { FormData, PathOption, StepFieldName } from '../../../form-types' export function chainPatchUpdaters( initialPatch: FormPatch, fns: Array<(arg0: FormPatch) => FormPatch> diff --git a/protocol-designer/src/steplist/formLevel/index.ts b/protocol-designer/src/steplist/formLevel/index.ts index 6f003bdc77e..efa9334315e 100644 --- a/protocol-designer/src/steplist/formLevel/index.ts +++ b/protocol-designer/src/steplist/formLevel/index.ts @@ -1,5 +1,4 @@ import { - FormError, composeErrors, incompatibleAspirateLabware, incompatibleDispenseLabware, @@ -21,8 +20,6 @@ import { } from './errors' import { - FormWarning, - FormWarningType, composeWarnings, belowPipetteMinimumVolume, maxDispenseWellVolume, @@ -33,7 +30,9 @@ import { tipPositionInTube, } from './warnings' -import { HydratedFormdata, StepType } from '../../form-types' +import type { FormWarning, FormWarningType } from './warnings' +import type { HydratedFormdata, StepType } from '../../form-types' +import type { FormError } from './errors' export { handleFormChange } from './handleFormChange' export { createBlankForm } from './createBlankForm' export { getDefaultsForStepType } from './getDefaultsForStepType' diff --git a/protocol-designer/src/steplist/formLevel/profileErrors.ts b/protocol-designer/src/steplist/formLevel/profileErrors.ts index 908dcbe86d6..8c7b9f3aeba 100644 --- a/protocol-designer/src/steplist/formLevel/profileErrors.ts +++ b/protocol-designer/src/steplist/formLevel/profileErrors.ts @@ -1,6 +1,7 @@ import uniqBy from 'lodash/uniqBy' import { THERMOCYCLER_PROFILE } from '../../constants' -import { PROFILE_STEP, ProfileStepItem } from '../../form-types' +import { PROFILE_STEP } from '../../form-types' +import type { ProfileStepItem } from '../../form-types' // TODO: real HydratedFormData type type HydratedFormData = any diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts index fe7911e5e6e..061dab8fe3a 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/getDelayData.ts @@ -1,6 +1,6 @@ -import { InnerDelayArgs } from '@opentrons/step-generation' import { getDefaultMmFromBottom } from '../../../components/StepEditForm/fields/TipPositionField/utils' -import { +import type { InnerDelayArgs } from '@opentrons/step-generation' +import type { DelayCheckboxFields, DelaySecondFields, HydratedMoveLiquidFormData, diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/heaterShakerFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/heaterShakerFormToArgs.ts index e951c626db3..8366864f190 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/heaterShakerFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/heaterShakerFormToArgs.ts @@ -1,4 +1,4 @@ -import { HeaterShakerArgs } from '@opentrons/step-generation' +import type { HeaterShakerArgs } from '@opentrons/step-generation' import type { HydratedHeaterShakerFormData } from '../../../form-types' export const heaterShakerFormToArgs = ( diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/index.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/index.ts index 8923c6bca8c..5c4eb608055 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/index.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/index.ts @@ -1,5 +1,4 @@ import mapValues from 'lodash/mapValues' -import { CommandCreatorArgs } from '@opentrons/step-generation' import { castField } from '../../../steplist/fieldLevel' import { mixFormToArgs } from './mixFormToArgs' import { pauseFormToArgs } from './pauseFormToArgs' @@ -9,6 +8,7 @@ import { thermocyclerFormToArgs } from './thermocyclerFormToArgs' import { heaterShakerFormToArgs } from './heaterShakerFormToArgs' import { moveLiquidFormToArgs } from './moveLiquidFormToArgs' import { moveLabwareFormToArgs } from './moveLabwareFormToArgs' +import type { CommandCreatorArgs } from '@opentrons/step-generation' import type { FormData } from '../../../form-types' // NOTE: this acts as an adapter for the PD defined data shape of the step forms // to create arguments that the step generation service is expecting diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/magnetFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/magnetFormToArgs.ts index 4c20f5c8de2..e9ce7ec546d 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/magnetFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/magnetFormToArgs.ts @@ -1,8 +1,8 @@ -import { +import type { EngageMagnetArgs, DisengageMagnetArgs, } from '@opentrons/step-generation' -import { HydratedMagnetFormData } from '../../../form-types' +import type { HydratedMagnetFormData } from '../../../form-types' type MagnetArgs = EngageMagnetArgs | DisengageMagnetArgs export const magnetFormToArgs = ( hydratedFormData: HydratedMagnetFormData diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts index 4b22040578f..17b1125c763 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts @@ -8,9 +8,9 @@ import { } from '../../../constants' import { getOrderedWells } from '../../utils' import { getMixDelayData } from './getDelayData' -import { HydratedMixFormDataLegacy } from '../../../form-types' -import { MixArgs } from '@opentrons/step-generation' import { getMatchingTipLiquidSpecs } from '../../../utils' +import type { HydratedMixFormDataLegacy } from '../../../form-types' +import type { MixArgs } from '@opentrons/step-generation' type MixStepArgs = MixArgs export const mixFormToArgs = ( hydratedFormData: HydratedMixFormDataLegacy diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts index 04f87317ff0..c9d83e49b02 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts @@ -1,4 +1,4 @@ -import { getWellsDepth, LabwareDefinition2 } from '@opentrons/shared-data' +import { getWellsDepth } from '@opentrons/shared-data' import { DEST_WELL_BLOWOUT_DESTINATION } from '@opentrons/step-generation' import { DEFAULT_MM_FROM_BOTTOM_ASPIRATE, @@ -8,14 +8,15 @@ import { } from '../../../constants' import { getOrderedWells } from '../../utils' import { getMoveLiquidDelayData } from './getDelayData' -import { HydratedMoveLiquidFormData } from '../../../form-types' +import { getMatchingTipLiquidSpecs } from '../../../utils' import type { ConsolidateArgs, DistributeArgs, TransferArgs, InnerMixArgs, } from '@opentrons/step-generation' -import { getMatchingTipLiquidSpecs } from '../../../utils' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { HydratedMoveLiquidFormData } from '../../../form-types' type MoveLiquidFields = HydratedMoveLiquidFormData['fields'] // NOTE(sa, 2020-08-11): leaving this as fn so it can be expanded later for dispense air gap diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/pauseFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/pauseFormToArgs.ts index 801dcfbe1ea..1baea445994 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/pauseFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/pauseFormToArgs.ts @@ -3,7 +3,7 @@ import { PAUSE_UNTIL_TEMP, PAUSE_UNTIL_RESUME, } from '../../../constants' -import { FormData } from '../../../form-types' +import type { FormData } from '../../../form-types' import type { WaitForTemperatureArgs, PauseArgs, diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/temperatureFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/temperatureFormToArgs.ts index 3ac49ad5e5a..72f00317413 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/temperatureFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/temperatureFormToArgs.ts @@ -1,8 +1,8 @@ -import { +import type { SetTemperatureArgs, DeactivateTemperatureArgs, } from '@opentrons/step-generation' -import { HydratedTemperatureFormData } from '../../../form-types' +import type { HydratedTemperatureFormData } from '../../../form-types' type TemperatureArgs = SetTemperatureArgs | DeactivateTemperatureArgs export const temperatureFormToArgs = ( hydratedFormData: HydratedTemperatureFormData diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/pauseFormToArgs.test.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/pauseFormToArgs.test.ts index 1014c1a611d..fe9665e477c 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/pauseFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/pauseFormToArgs.test.ts @@ -4,8 +4,8 @@ import { PAUSE_UNTIL_RESUME, PAUSE_UNTIL_TIME, } from '../../../../constants' -import { FormData } from '../../../../form-types' import { pauseFormToArgs } from '../pauseFormToArgs' +import type { FormData } from '../../../../form-types' describe('pauseFormToArgs', () => { it('returns waitForTemperature command creator when form specifies pause until temp', () => { diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/stepFormToArgs.test.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/stepFormToArgs.test.ts index 8a03c718ba9..05557b3d1b7 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/stepFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/stepFormToArgs.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest' import { _castForm } from '../index' -import { FormData } from '../../../../form-types' +import type { FormData } from '../../../../form-types' // NOTE(IL, 2020-09-24): I think the real solution to validating the // output of hydration/casting is static typing as per #3161 diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/thermocyclerFormToArgs.test.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/thermocyclerFormToArgs.test.ts index 8d26e5780c0..f5af393e50e 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/thermocyclerFormToArgs.test.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/test/thermocyclerFormToArgs.test.ts @@ -2,11 +2,11 @@ import { describe, it, expect } from 'vitest' import { THERMOCYCLER_PROFILE, THERMOCYCLER_STATE } from '../../../../constants' import { getDefaultsForStepType } from '../../getDefaultsForStepType' import { thermocyclerFormToArgs } from '../thermocyclerFormToArgs' -import { FormData } from '../../../../form-types' import type { ThermocyclerStateStepArgs, ThermocyclerProfileStepArgs, } from '@opentrons/step-generation' +import type { FormData } from '../../../../form-types' const tcModuleId = 'tcModuleId' describe('thermocyclerFormToArgs', () => { diff --git a/protocol-designer/src/steplist/formLevel/stepFormToArgs/thermocyclerFormToArgs.ts b/protocol-designer/src/steplist/formLevel/stepFormToArgs/thermocyclerFormToArgs.ts index aedcfa1bbb0..9a6e3b52915 100644 --- a/protocol-designer/src/steplist/formLevel/stepFormToArgs/thermocyclerFormToArgs.ts +++ b/protocol-designer/src/steplist/formLevel/stepFormToArgs/thermocyclerFormToArgs.ts @@ -1,9 +1,9 @@ import { THERMOCYCLER_STATE, THERMOCYCLER_PROFILE } from '../../../constants' -import { +import { PROFILE_STEP } from '../../../form-types' +import type { ThermocyclerProfileStepArgs, ThermocyclerStateStepArgs, } from '@opentrons/step-generation' -import { PROFILE_STEP } from '../../../form-types' import type { FormData, ProfileItem, diff --git a/protocol-designer/src/steplist/generateSubstepItem.ts b/protocol-designer/src/steplist/generateSubstepItem.ts index 2c58befeeda..94fd68d77d2 100644 --- a/protocol-designer/src/steplist/generateSubstepItem.ts +++ b/protocol-designer/src/steplist/generateSubstepItem.ts @@ -21,8 +21,8 @@ import type { MixArgs, TransferArgs, } from '@opentrons/step-generation' -import { StepIdType } from '../form-types' -import { +import type { StepIdType } from '../form-types' +import type { NamedIngred, StepArgsAndErrors, StepItemSourceDestRow, diff --git a/protocol-designer/src/steplist/index.ts b/protocol-designer/src/steplist/index.ts index cc218970675..9b2bee3b3ad 100644 --- a/protocol-designer/src/steplist/index.ts +++ b/protocol-designer/src/steplist/index.ts @@ -2,11 +2,8 @@ import * as actions from './actions' import * as utils from './utils' import { getFieldErrors, castField, maskField } from './fieldLevel' -import { - getDefaultsForStepType, - FormWarning, - FormWarningType, -} from './formLevel' +import { getDefaultsForStepType } from './formLevel' +import type { FormWarning, FormWarningType } from './formLevel' export * from './types' export type { FormWarning, FormWarningType } export { diff --git a/protocol-designer/src/steplist/substepTimeline.ts b/protocol-designer/src/steplist/substepTimeline.ts index d164a33bedf..0788acbde6f 100644 --- a/protocol-designer/src/steplist/substepTimeline.ts +++ b/protocol-designer/src/steplist/substepTimeline.ts @@ -5,16 +5,18 @@ import { getNextRobotStateAndWarningsSingleCommand, } from '@opentrons/step-generation' import { - AddressableAreaName, FLEX_ROBOT_TYPE, ALL, COLUMN, - CreateCommand, OT2_ROBOT_TYPE, - NozzleConfigurationStyle, } from '@opentrons/shared-data' -import { Channels } from '@opentrons/components' import { getCutoutIdByAddressableArea } from '../utils' +import type { Channels } from '@opentrons/components' +import type { + AddressableAreaName, + CreateCommand, + NozzleConfigurationStyle, +} from '@opentrons/shared-data' import type { CommandCreatorError, CommandsAndWarnings, diff --git a/protocol-designer/src/steplist/types.ts b/protocol-designer/src/steplist/types.ts index 6855104c5dd..f762d348847 100644 --- a/protocol-designer/src/steplist/types.ts +++ b/protocol-designer/src/steplist/types.ts @@ -1,5 +1,5 @@ -import { THERMOCYCLER_PROFILE, THERMOCYCLER_STATE } from '../constants' -import { +import type { THERMOCYCLER_PROFILE, THERMOCYCLER_STATE } from '../constants' +import type { CommandCreatorArgs, MoveLabwareArgs, PauseArgs, diff --git a/protocol-designer/src/steplist/utils/index.ts b/protocol-designer/src/steplist/utils/index.ts index 17c5360f486..a2701772355 100644 --- a/protocol-designer/src/steplist/utils/index.ts +++ b/protocol-designer/src/steplist/utils/index.ts @@ -1,6 +1,6 @@ import { mergeWhen } from './mergeWhen' import { getOrderedWells } from './orderWells' -import { StepIdType } from '../../form-types' +import type { StepIdType } from '../../form-types' export { mergeWhen, getOrderedWells } export type WellRatio = 'n:n' | '1:many' | 'many:1' diff --git a/protocol-designer/src/steplist/utils/orderWells.ts b/protocol-designer/src/steplist/utils/orderWells.ts index ab4db8e4faf..130d284741d 100644 --- a/protocol-designer/src/steplist/utils/orderWells.ts +++ b/protocol-designer/src/steplist/utils/orderWells.ts @@ -1,6 +1,7 @@ import intersection from 'lodash/intersection' -import { LabwareDefinition2, orderWells } from '@opentrons/shared-data' -import { WellOrderOption } from '../../form-types' +import { orderWells } from '@opentrons/shared-data' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { WellOrderOption } from '../../form-types' export function getOrderedWells( unorderedWells: string[], labwareDef: LabwareDefinition2, diff --git a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts index 795512828dc..7379e30bd52 100644 --- a/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts +++ b/protocol-designer/src/timelineMiddleware/__tests__/generateRobotStateTimeline.test.ts @@ -8,13 +8,10 @@ import { DEST_LABWARE, FIXED_TRASH_ID, } from '@opentrons/step-generation' +import { fixtureTiprack300ul, getLabwareDefURI } from '@opentrons/shared-data' import { generateRobotStateTimeline } from '../generateRobotStateTimeline' +import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { StepArgsAndErrorsById } from '../../steplist' -import { - LabwareDefinition2, - fixtureTiprack300ul, - getLabwareDefURI, -} from '@opentrons/shared-data' vi.mock('../../labware-defs/utils') diff --git a/protocol-designer/src/timelineMiddleware/generateSubsteps.ts b/protocol-designer/src/timelineMiddleware/generateSubsteps.ts index 005d1c7a90c..8b8c20af69c 100644 --- a/protocol-designer/src/timelineMiddleware/generateSubsteps.ts +++ b/protocol-designer/src/timelineMiddleware/generateSubsteps.ts @@ -1,10 +1,10 @@ -import { +import { generateSubstepItem } from '../steplist/generateSubstepItem' +import type { Timeline, RobotState, InvariantContext, } from '@opentrons/step-generation' -import { generateSubstepItem } from '../steplist/generateSubstepItem' -import { +import type { LabwareNamesByModuleId, StepArgsAndErrorsById, Substeps, diff --git a/protocol-designer/src/timelineMiddleware/makeTimelineMiddleware.ts b/protocol-designer/src/timelineMiddleware/makeTimelineMiddleware.ts index 9d9d2f399a9..2b6e6f2bc25 100644 --- a/protocol-designer/src/timelineMiddleware/makeTimelineMiddleware.ts +++ b/protocol-designer/src/timelineMiddleware/makeTimelineMiddleware.ts @@ -7,13 +7,13 @@ import { getInitialRobotState } from '../file-data/selectors' import { computeRobotStateTimelineRequest, computeRobotStateTimelineSuccess, - ComputeRobotStateTimelineSuccessAction, } from '../file-data/actions' import { getLabwareNamesByModuleId } from '../ui/modules/selectors' -import { Middleware } from 'redux' -import { BaseState } from '../types' -import { GenerateRobotStateTimelineArgs } from './generateRobotStateTimeline' -import { SubstepsArgsNoTimeline } from './types' +import type { ComputeRobotStateTimelineSuccessAction } from '../file-data/actions' +import type { Middleware } from 'redux' +import type { BaseState } from '../types' +import type { GenerateRobotStateTimelineArgs } from './generateRobotStateTimeline' +import type { SubstepsArgsNoTimeline } from './types' const hasChanged = ( nextValues: { [key in any]?: any }, diff --git a/protocol-designer/src/timelineMiddleware/types.ts b/protocol-designer/src/timelineMiddleware/types.ts index 443c40bd6a3..758daabe263 100644 --- a/protocol-designer/src/timelineMiddleware/types.ts +++ b/protocol-designer/src/timelineMiddleware/types.ts @@ -1,7 +1,7 @@ -import { Timeline } from '@opentrons/step-generation' -import { Substeps } from '../steplist/types' -import { GenerateRobotStateTimelineArgs } from './generateRobotStateTimeline' -import { GenerateSubstepsArgs } from './generateSubsteps' +import type { Timeline } from '@opentrons/step-generation' +import type { Substeps } from '../steplist/types' +import type { GenerateRobotStateTimelineArgs } from './generateRobotStateTimeline' +import type { GenerateSubstepsArgs } from './generateSubsteps' // worker itself will spread the robotStateTimeline in export type SubstepsArgsNoTimeline = Omit< GenerateSubstepsArgs, diff --git a/protocol-designer/src/timelineMiddleware/worker.ts b/protocol-designer/src/timelineMiddleware/worker.ts index 243331a1bee..7fa50480dfa 100644 --- a/protocol-designer/src/timelineMiddleware/worker.ts +++ b/protocol-designer/src/timelineMiddleware/worker.ts @@ -1,6 +1,7 @@ -import { Timeline } from '@opentrons/step-generation' import { generateRobotStateTimeline } from './generateRobotStateTimeline' import { generateSubsteps } from './generateSubsteps' +import type { Timeline } from '@opentrons/step-generation' + addEventListener('message', event => { // NOTE: may have performance increase by not sending both // eg timelineArgs.initialRobotState and substepsArgs.initialRobotState diff --git a/protocol-designer/src/top-selectors/labware-locations/index.ts b/protocol-designer/src/top-selectors/labware-locations/index.ts index 6c66367fb4f..7741f3a7314 100644 --- a/protocol-designer/src/top-selectors/labware-locations/index.ts +++ b/protocol-designer/src/top-selectors/labware-locations/index.ts @@ -7,7 +7,6 @@ import { FLEX_ROBOT_TYPE, WASTE_CHUTE_ADDRESSABLE_AREAS, WASTE_CHUTE_CUTOUT, - CutoutId, STAGING_AREA_RIGHT_SLOT_FIXTURE, isAddressableAreaStandardSlot, MOVABLE_TRASH_ADDRESSABLE_AREAS, @@ -20,10 +19,7 @@ import { PRESAVED_STEP_ID, } from '../../steplist' import { getHasWasteChute } from '../../components/labware' -import { - AllTemporalPropertiesForTimelineFrame, - selectors as stepFormSelectors, -} from '../../step-forms' +import { selectors as stepFormSelectors } from '../../step-forms' import { getActiveItem } from '../../ui/steps' import { TERMINAL_ITEM_SELECTION_TYPE } from '../../ui/steps/reducers' import { selectors as fileDataSelectors } from '../../file-data' @@ -35,9 +31,10 @@ import { getAdditionalEquipmentEntities, } from '../../step-forms/selectors' import { getIsAdapter } from '../../utils' +import type { CutoutId, AddressableAreaName } from '@opentrons/shared-data' import type { RobotState } from '@opentrons/step-generation' +import type { AllTemporalPropertiesForTimelineFrame } from '../../step-forms' import type { Selector } from '../../types' -import type { AddressableAreaName } from '@opentrons/shared-data' interface Option { name: string diff --git a/protocol-designer/src/top-selectors/substep-highlight.ts b/protocol-designer/src/top-selectors/substep-highlight.ts index 1144b81fe59..8aeccdb5ef4 100644 --- a/protocol-designer/src/top-selectors/substep-highlight.ts +++ b/protocol-designer/src/top-selectors/substep-highlight.ts @@ -1,18 +1,16 @@ import { createSelector } from 'reselect' import mapValues from 'lodash/mapValues' -import { - ALL, - COLUMN, - getWellNamePerMultiTip, - NozzleConfigurationStyle, -} from '@opentrons/shared-data' -import { WellGroup } from '@opentrons/components' +import { ALL, COLUMN, getWellNamePerMultiTip } from '@opentrons/shared-data' import * as StepGeneration from '@opentrons/step-generation' import { selectors as stepFormSelectors } from '../step-forms' import { selectors as fileDataSelectors } from '../file-data' import { getHoveredStepId, getHoveredSubstep } from '../ui/steps' import { getWellSetForMultichannel } from '../utils' -import type { CreateCommand } from '@opentrons/shared-data' +import type { WellGroup } from '@opentrons/components' +import type { + NozzleConfigurationStyle, + CreateCommand, +} from '@opentrons/shared-data' import type { PipetteEntity, LabwareEntity } from '@opentrons/step-generation' import type { Selector } from '../types' import type { SubstepItemData } from '../steplist/types' diff --git a/protocol-designer/src/top-selectors/timelineFrames.ts b/protocol-designer/src/top-selectors/timelineFrames.ts index 06e0b5e0bbf..4015af4aa70 100644 --- a/protocol-designer/src/top-selectors/timelineFrames.ts +++ b/protocol-designer/src/top-selectors/timelineFrames.ts @@ -1,20 +1,19 @@ import { createSelector } from 'reselect' - import { selectors as fileDataSelectors } from '../file-data' import { selectors as stepFormSelectors } from '../step-forms' import { getActiveItem } from '../ui/steps/selectors' import { START_TERMINAL_ITEM_ID, PRESAVED_STEP_ID } from '../steplist' import { + SINGLE_STEP_SELECTION_TYPE, + TERMINAL_ITEM_SELECTION_TYPE, +} from '../ui/steps/reducers' +import type { CommandsAndRobotState, RobotState, Timeline, } from '@opentrons/step-generation' -import { Selector } from '../types' -import { - HoverableItem, - SINGLE_STEP_SELECTION_TYPE, - TERMINAL_ITEM_SELECTION_TYPE, -} from '../ui/steps/reducers' +import type { Selector } from '../types' +import type { HoverableItem } from '../ui/steps/reducers' const _timelineFrameHelper = (beforeActiveItem: boolean) => ( activeItem: HoverableItem | null, diff --git a/protocol-designer/src/top-selectors/timelineWarnings/index.ts b/protocol-designer/src/top-selectors/timelineWarnings/index.ts index d9ca0de7c16..2a8e3252af9 100644 --- a/protocol-designer/src/top-selectors/timelineWarnings/index.ts +++ b/protocol-designer/src/top-selectors/timelineWarnings/index.ts @@ -3,8 +3,8 @@ import { selectors as fileDataSelectors } from '../../file-data' import { selectors as stepFormSelectors } from '../../step-forms' import { getSelectedStepId } from '../../ui/steps' import { selectors as dismissSelectors } from '../../dismiss' -import { CommandCreatorWarning } from '@opentrons/step-generation' -import { Selector } from '../../types' +import type { CommandCreatorWarning } from '@opentrons/step-generation' +import type { Selector } from '../../types' export const getTimelineWarningsForSelectedStep: Selector< CommandCreatorWarning[] > = createSelector( diff --git a/protocol-designer/src/top-selectors/tip-contents/index.ts b/protocol-designer/src/top-selectors/tip-contents/index.ts index 5d3774b43a8..7f62e91cb05 100644 --- a/protocol-designer/src/top-selectors/tip-contents/index.ts +++ b/protocol-designer/src/top-selectors/tip-contents/index.ts @@ -10,8 +10,8 @@ import { selectors as stepFormSelectors } from '../../step-forms' import { getActiveItem } from '../../ui/steps' import { TERMINAL_ITEM_SELECTION_TYPE } from '../../ui/steps/reducers' import { selectors as fileDataSelectors } from '../../file-data' -import { WellGroup } from '@opentrons/components' -import { Selector } from '../../types' +import type { WellGroup } from '@opentrons/components' +import type { Selector } from '../../types' export const getMissingTipsByLabwareId: Selector state.tutorial diff --git a/protocol-designer/src/ui/index.ts b/protocol-designer/src/ui/index.ts index 2739a5b9f6f..2e54df4cb20 100644 --- a/protocol-designer/src/ui/index.ts +++ b/protocol-designer/src/ui/index.ts @@ -1,6 +1,9 @@ -import { combineReducers, Reducer } from 'redux' -import { rootReducer as stepsReducer, StepsState } from './steps/reducers' -import { Action } from '../types' +import { combineReducers } from 'redux' +import { rootReducer as stepsReducer } from './steps/reducers' +import type { Reducer } from 'redux' +import type { Action } from '../types' +import type { StepsState } from './steps/reducers' + export interface RootState { steps: StepsState } diff --git a/protocol-designer/src/ui/labware/selectors.ts b/protocol-designer/src/ui/labware/selectors.ts index 0c68ceb87c6..1f321526c76 100644 --- a/protocol-designer/src/ui/labware/selectors.ts +++ b/protocol-designer/src/ui/labware/selectors.ts @@ -2,13 +2,15 @@ import { createSelector } from 'reselect' import mapValues from 'lodash/mapValues' import reduce from 'lodash/reduce' import { getIsTiprack, getLabwareDisplayName } from '@opentrons/shared-data' -import { AdditionalEquipmentEntity } from '@opentrons/step-generation' import * as stepFormSelectors from '../../step-forms/selectors' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' import { getModuleShortNames, getModuleUnderLabware } from '../modules/utils' import { getLabwareOffDeck, getLabwareInColumn4 } from './utils' -import type { LabwareEntity } from '@opentrons/step-generation' +import type { + LabwareEntity, + AdditionalEquipmentEntity, +} from '@opentrons/step-generation' import type { DropdownOption, Options } from '@opentrons/components' import type { Selector } from '../../types' import type { diff --git a/protocol-designer/src/ui/modules/selectors.ts b/protocol-designer/src/ui/modules/selectors.ts index 1d5ec7bdb08..ea8f3ba5433 100644 --- a/protocol-designer/src/ui/modules/selectors.ts +++ b/protocol-designer/src/ui/modules/selectors.ts @@ -17,8 +17,8 @@ import { getMagnetLabwareEngageHeight as getMagnetLabwareEngageHeightUtil, getModulesOnDeckByType, getModulesHaveLabware, - ModuleAndLabware, } from './utils' +import type { ModuleAndLabware } from './utils' import type { Options } from '@opentrons/components' import type { Selector } from '../../types' import type { LabwareNamesByModuleId } from '../../steplist/types' diff --git a/protocol-designer/src/ui/modules/utils.ts b/protocol-designer/src/ui/modules/utils.ts index e49e8ad7b33..54b7b4c4b76 100644 --- a/protocol-designer/src/ui/modules/utils.ts +++ b/protocol-designer/src/ui/modules/utils.ts @@ -2,9 +2,9 @@ import values from 'lodash/values' import { MAGNETIC_MODULE_V1, getLabwareDefaultEngageHeight, - ModuleType, } from '@opentrons/shared-data' -import { Options } from '@opentrons/components' +import type { Options } from '@opentrons/components' +import type { ModuleType } from '@opentrons/shared-data' import type { ModuleOnDeck, LabwareOnDeck, diff --git a/protocol-designer/src/ui/steps/__fixtures__/index.ts b/protocol-designer/src/ui/steps/__fixtures__/index.ts index 7b0a3391c23..b7eeee3ec4a 100644 --- a/protocol-designer/src/ui/steps/__fixtures__/index.ts +++ b/protocol-designer/src/ui/steps/__fixtures__/index.ts @@ -1,4 +1,4 @@ -import { SavedStepFormState } from '../../../step-forms' +import type { SavedStepFormState } from '../../../step-forms' export const getMockMoveLiquidStep = (): SavedStepFormState => ({ move_liquid_step_id: { pipette: 'some_pipette_id', diff --git a/protocol-designer/src/ui/steps/actions/actions.ts b/protocol-designer/src/ui/steps/actions/actions.ts index ea19fdfb503..bdd41e323ae 100644 --- a/protocol-designer/src/ui/steps/actions/actions.ts +++ b/protocol-designer/src/ui/steps/actions/actions.ts @@ -1,21 +1,16 @@ import last from 'lodash/last' -import { - analyticsEvent, - AnalyticsEventAction, -} from '../../../analytics/actions' -import { - PRESAVED_STEP_ID, - TerminalItemId, - SubstepIdentifier, -} from '../../../steplist/types' +import { analyticsEvent } from '../../../analytics/actions' +import { PRESAVED_STEP_ID } from '../../../steplist/types' import { selectors as stepFormSelectors } from '../../../step-forms' import { getMultiSelectLastSelected } from '../selectors' import { resetScrollElements } from '../utils' -import { Timeline } from '@opentrons/step-generation' -import { StepIdType, StepType } from '../../../form-types' -import { GetState, ThunkAction, ThunkDispatch } from '../../../types' -import { AnalyticsEvent } from '../../../analytics/mixpanel' -import { +import type { Timeline } from '@opentrons/step-generation' +import type { StepIdType, StepType } from '../../../form-types' +import type { GetState, ThunkAction, ThunkDispatch } from '../../../types' +import type { AnalyticsEvent } from '../../../analytics/mixpanel' +import type { AnalyticsEventAction } from '../../../analytics/actions' +import type { TerminalItemId, SubstepIdentifier } from '../../../steplist/types' +import type { AddStepAction, ExpandAddStepButtonAction, ToggleStepCollapsedAction, diff --git a/protocol-designer/src/ui/steps/actions/thunks/index.ts b/protocol-designer/src/ui/steps/actions/thunks/index.ts index 9cc31de8ab8..b59780e949c 100644 --- a/protocol-designer/src/ui/steps/actions/thunks/index.ts +++ b/protocol-designer/src/ui/steps/actions/thunks/index.ts @@ -18,9 +18,9 @@ import { } from '../../../../tutorial' import * as uiModuleSelectors from '../../../../ui/modules/selectors' import * as fileDataSelectors from '../../../../file-data/selectors' -import { StepType, StepIdType, FormData } from '../../../../form-types' -import { ThunkAction } from '../../../../types' -import { +import type { StepType, StepIdType, FormData } from '../../../../form-types' +import type { ThunkAction } from '../../../../types' +import type { DuplicateStepAction, DuplicateMultipleStepsAction, SelectMultipleStepsAction, diff --git a/protocol-designer/src/ui/steps/actions/types.ts b/protocol-designer/src/ui/steps/actions/types.ts index ffae982e7fb..0205c9eac52 100644 --- a/protocol-designer/src/ui/steps/actions/types.ts +++ b/protocol-designer/src/ui/steps/actions/types.ts @@ -1,6 +1,6 @@ -import { Timeline } from '@opentrons/step-generation' -import { StepIdType, StepType } from '../../../form-types' -import { TerminalItemId, SubstepIdentifier } from '../../../steplist/types' +import type { Timeline } from '@opentrons/step-generation' +import type { StepIdType, StepType } from '../../../form-types' +import type { TerminalItemId, SubstepIdentifier } from '../../../steplist/types' interface AddStepPayload { id: string stepType: StepType diff --git a/protocol-designer/src/ui/steps/reducers.ts b/protocol-designer/src/ui/steps/reducers.ts index 4f3bcbe113d..6654a55b32c 100644 --- a/protocol-designer/src/ui/steps/reducers.ts +++ b/protocol-designer/src/ui/steps/reducers.ts @@ -1,24 +1,19 @@ -import { Reducer, combineReducers } from 'redux' - +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' import omit from 'lodash/omit' import { getPDMetadata } from '../../file-types' -import { - SubstepIdentifier, - TerminalItemId, - START_TERMINAL_ITEM_ID, - PRESAVED_STEP_ID, -} from '../../steplist/types' - -import { Action } from '../../types' -import { LoadFileAction } from '../../load-file' -import { StepIdType } from '../../form-types' -import { SaveStepFormAction } from '../steps/actions/thunks' -import { +import { START_TERMINAL_ITEM_ID, PRESAVED_STEP_ID } from '../../steplist/types' +import type { Reducer } from 'redux' +import type { SubstepIdentifier, TerminalItemId } from '../../steplist/types' +import type { DeleteStepAction, DeleteMultipleStepsAction, } from '../../steplist/actions' -import { +import type { Action } from '../../types' +import type { LoadFileAction } from '../../load-file' +import type { StepIdType } from '../../form-types' +import type { SaveStepFormAction } from '../steps/actions/thunks' +import type { AddStepAction, HoverOnStepAction, HoverOnSubstepAction, @@ -30,6 +25,7 @@ import { ExpandMultipleStepsAction, CollapseMultipleStepsAction, } from './actions/types' + export type CollapsedStepsState = Record // @ts-expect-error(sa, 2021-6-10): cannot use string literals as action type // TODO IMMEDIATELY: refactor this to the old fashioned way if we cannot have type safety: https://github.com/redux-utilities/redux-actions/issues/282#issuecomment-595163081 diff --git a/protocol-designer/src/ui/steps/selectors.ts b/protocol-designer/src/ui/steps/selectors.ts index 8ed2eeb20dd..205137d1003 100644 --- a/protocol-designer/src/ui/steps/selectors.ts +++ b/protocol-designer/src/ui/steps/selectors.ts @@ -3,18 +3,10 @@ import last from 'lodash/last' import uniq from 'lodash/uniq' import { selectors as stepFormSelectors } from '../../step-forms' import { getDefaultsForStepType } from '../../steplist/formLevel/getDefaultsForStepType' -import { - SubstepIdentifier, - TerminalItemId, - PRESAVED_STEP_ID, -} from '../../steplist/types' +import { PRESAVED_STEP_ID } from '../../steplist/types' import { getLabwareOnModule } from '../modules/utils' import { - SelectableItem, - StepsState, - CollapsedStepsState, - HoverableItem, initialSelectedItemState, SINGLE_STEP_SELECTION_TYPE, TERMINAL_ITEM_SELECTION_TYPE, @@ -31,14 +23,22 @@ import { getPipetteDifferentDisabledFields, getLabwareDisabledFields, } from './utils' -import { +import type { BaseState, Selector } from '../../types' +import type { SubstepIdentifier, TerminalItemId } from '../../steplist/types' +import type { CountPerStepType, FormData, StepFieldName, StepIdType, StepType, } from '../../form-types' -import { BaseState, Selector } from '../../types' +import type { + SelectableItem, + StepsState, + CollapsedStepsState, + HoverableItem, +} from './reducers' + export const rootSelector = (state: BaseState): StepsState => state.ui.steps // ======= Selectors =============================================== // NOTE: when the selected step is deleted, we need to fall back to the last step diff --git a/protocol-designer/src/ui/steps/test/selectors.test.ts b/protocol-designer/src/ui/steps/test/selectors.test.ts index 22b93569b04..64c96f2d9a3 100644 --- a/protocol-designer/src/ui/steps/test/selectors.test.ts +++ b/protocol-designer/src/ui/steps/test/selectors.test.ts @@ -27,7 +27,7 @@ import * as utils from '../../modules/utils' import type { FormData } from '../../../form-types' import type { StepArgsAndErrorsById } from '../../../steplist/types' -import { AllTemporalPropertiesForTimelineFrame } from '../../../step-forms' +import type { AllTemporalPropertiesForTimelineFrame } from '../../../step-forms' vi.mock('../../modules/utils') diff --git a/protocol-designer/src/ui/steps/utils.ts b/protocol-designer/src/ui/steps/utils.ts index 097a34ee93c..bf3cba42aaa 100644 --- a/protocol-designer/src/ui/steps/utils.ts +++ b/protocol-designer/src/ui/steps/utils.ts @@ -1,5 +1,5 @@ import forEach from 'lodash/forEach' -import { StepFieldName } from '../../form-types' +import type { StepFieldName } from '../../form-types' export const MAIN_CONTENT_FORCED_SCROLL_CLASSNAME = 'main_content_forced_scroll' // scroll to top of all elements with the special class (probably the main page wrapper) // diff --git a/protocol-designer/src/utils/index.ts b/protocol-designer/src/utils/index.ts index 28c91fd2aad..3366f1c3ccb 100644 --- a/protocol-designer/src/utils/index.ts +++ b/protocol-designer/src/utils/index.ts @@ -1,27 +1,29 @@ import uuidv1 from 'uuid/v4' import { - WellSetHelpers, makeWellSetHelpers, - AddressableAreaName, getDeckDefFromRobotType, FLEX_ROBOT_TYPE, - CutoutId, STAGING_AREA_RIGHT_SLOT_FIXTURE, isAddressableAreaStandardSlot, - CutoutFixtureId, - RobotType, INTERACTIVE_WELL_DATA_ATTRIBUTE, - SupportedTip, LOW_VOLUME_PIPETTES, } from '@opentrons/shared-data' -import { BoundingRect, GenericRect } from '../collision-types' import type { AdditionalEquipmentEntity, LabwareEntities, PipetteEntities, PipetteEntity, } from '@opentrons/step-generation' +import type { + WellSetHelpers, + AddressableAreaName, + CutoutId, + CutoutFixtureId, + RobotType, + SupportedTip, +} from '@opentrons/shared-data' import type { WellGroup } from '@opentrons/components' +import type { BoundingRect, GenericRect } from '../collision-types' export const uuid: () => string = uuidv1 // Collision detection for SelectionRect / SelectableLabware diff --git a/protocol-designer/src/utils/labwareModuleCompatibility.ts b/protocol-designer/src/utils/labwareModuleCompatibility.ts index 5092afd6903..1fe26f427d7 100644 --- a/protocol-designer/src/utils/labwareModuleCompatibility.ts +++ b/protocol-designer/src/utils/labwareModuleCompatibility.ts @@ -1,16 +1,14 @@ // PD-specific info about labware<>module compatibilty - import { MAGNETIC_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, - LabwareDefinition2, - ModuleType, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, } from '@opentrons/shared-data' -import { LabwareDefByDefURI } from '../labware-defs' -import { LabwareOnDeck } from '../step-forms' +import type { LabwareDefByDefURI } from '../labware-defs' +import type { LabwareOnDeck } from '../step-forms' +import type { LabwareDefinition2, ModuleType } from '@opentrons/shared-data' // NOTE: this does not distinguish btw versions. Standard labware only (assumes namespace is 'opentrons') export const COMPATIBLE_LABWARE_ALLOWLIST_BY_MODULE_TYPE: Record< ModuleType, diff --git a/protocol-designer/src/well-selection/actions.ts b/protocol-designer/src/well-selection/actions.ts index 25d403f1fa8..0213c362020 100644 --- a/protocol-designer/src/well-selection/actions.ts +++ b/protocol-designer/src/well-selection/actions.ts @@ -1,4 +1,4 @@ -import { WellGroup } from '@opentrons/components' +import type { WellGroup } from '@opentrons/components' // ===== Preselect / select wells in plate // these actions all use PRIMARY WELLS (see reducers for definition) export interface HighlightWellsAction { diff --git a/protocol-designer/src/well-selection/reducers.ts b/protocol-designer/src/well-selection/reducers.ts index be2989ae857..7bc672631db 100644 --- a/protocol-designer/src/well-selection/reducers.ts +++ b/protocol-designer/src/well-selection/reducers.ts @@ -1,13 +1,16 @@ import omit from 'lodash/omit' -import { combineReducers, Reducer } from 'redux' +import { combineReducers } from 'redux' import { handleActions } from 'redux-actions' -import { WellGroup } from '@opentrons/components' -import { Action } from '../types' -import { + +import type { Reducer } from 'redux' +import type { WellGroup } from '@opentrons/components' +import type { Action } from '../types' +import type { HighlightWellsAction, SelectWellsAction, DeselectWellsAction, } from './actions' + interface SelectedWellsState { highlighted: WellGroup selected: WellGroup diff --git a/protocol-designer/src/well-selection/selectors.ts b/protocol-designer/src/well-selection/selectors.ts index a695784f0dc..9a281709508 100644 --- a/protocol-designer/src/well-selection/selectors.ts +++ b/protocol-designer/src/well-selection/selectors.ts @@ -1,7 +1,7 @@ import { createSelector } from 'reselect' import { sortWells } from '@opentrons/shared-data' -import { WellGroup } from '@opentrons/components' -import { BaseState, Selector } from '../types' +import type { WellGroup } from '@opentrons/components' +import type { BaseState, Selector } from '../types' const rootSelector = (state: BaseState): BaseState['wellSelection'] => state.wellSelection diff --git a/protocol-designer/typings/reselect.d.ts b/protocol-designer/typings/reselect.d.ts index c905b8139c4..8a80c1fd544 100644 --- a/protocol-designer/typings/reselect.d.ts +++ b/protocol-designer/typings/reselect.d.ts @@ -1,4 +1,4 @@ -import { OutputSelector, Selector } from 'reselect' +import type { OutputSelector, Selector } from 'reselect' declare module 'reselect' { // declaring type for createSelector with 14 selectors because the reselect types only support up to 12 selectors export function createSelector< diff --git a/react-api-client/src/api/useHost.ts b/react-api-client/src/api/useHost.ts index 84d310c121e..ee081320aa9 100644 --- a/react-api-client/src/api/useHost.ts +++ b/react-api-client/src/api/useHost.ts @@ -1,6 +1,6 @@ import { useContext } from 'react' -import { HostConfig } from '@opentrons/api-client' import { ApiHostContext } from './ApiHostProvider' +import type { HostConfig } from '@opentrons/api-client' export function useHost(): HostConfig | null { return useContext(ApiHostContext) diff --git a/react-api-client/src/calibration/__tests__/useDeleteCalibrationMutation.test.tsx b/react-api-client/src/calibration/__tests__/useDeleteCalibrationMutation.test.tsx index 511a0857254..6639f2dd25f 100644 --- a/react-api-client/src/calibration/__tests__/useDeleteCalibrationMutation.test.tsx +++ b/react-api-client/src/calibration/__tests__/useDeleteCalibrationMutation.test.tsx @@ -2,13 +2,15 @@ import * as React from 'react' import { describe, it, expect, beforeEach, vi } from 'vitest' import { QueryClient, QueryClientProvider } from 'react-query' import { act, renderHook, waitFor } from '@testing-library/react' -import { - deleteCalibration, - DeleteCalRequestParams, -} from '@opentrons/api-client' +import { deleteCalibration } from '@opentrons/api-client' import { useHost } from '../../api' import { useDeleteCalibrationMutation } from '..' -import type { HostConfig, Response, EmptyResponse } from '@opentrons/api-client' +import type { + DeleteCalRequestParams, + HostConfig, + Response, + EmptyResponse, +} from '@opentrons/api-client' vi.mock('@opentrons/api-client') vi.mock('../../api/useHost') diff --git a/react-api-client/src/maintenance_runs/__fixtures__/maintenanceCommands.ts b/react-api-client/src/maintenance_runs/__fixtures__/maintenanceCommands.ts index 488e8d539d6..0a8b7797f25 100644 --- a/react-api-client/src/maintenance_runs/__fixtures__/maintenanceCommands.ts +++ b/react-api-client/src/maintenance_runs/__fixtures__/maintenanceCommands.ts @@ -1,4 +1,4 @@ -import { CommandsData, RunCommandSummary } from '@opentrons/api-client' +import type { CommandsData, RunCommandSummary } from '@opentrons/api-client' import type { CreateCommand } from '@opentrons/shared-data' export const mockAnonLoadCommand: CreateCommand = { diff --git a/react-api-client/src/maintenance_runs/useCreateMaintenanceRunMutation.ts b/react-api-client/src/maintenance_runs/useCreateMaintenanceRunMutation.ts index 3768bfcb544..298c0576587 100644 --- a/react-api-client/src/maintenance_runs/useCreateMaintenanceRunMutation.ts +++ b/react-api-client/src/maintenance_runs/useCreateMaintenanceRunMutation.ts @@ -1,17 +1,17 @@ -import { - HostConfig, - MaintenanceRun, - createMaintenanceRun, - CreateMaintenanceRunData, -} from '@opentrons/api-client' -import { +import { createMaintenanceRun } from '@opentrons/api-client' +import { useMutation } from 'react-query' +import { useHost } from '../api' +import type { AxiosError } from 'axios' +import type { UseMutationResult, - useMutation, UseMutateAsyncFunction, UseMutationOptions, } from 'react-query' -import { useHost } from '../api' -import type { AxiosError } from 'axios' +import type { + HostConfig, + MaintenanceRun, + CreateMaintenanceRunData, +} from '@opentrons/api-client' export type CreateMaintenanceRunType = UseMutateAsyncFunction< MaintenanceRun, diff --git a/react-api-client/src/maintenance_runs/useCurrentMaintenanceRun.ts b/react-api-client/src/maintenance_runs/useCurrentMaintenanceRun.ts index a12a8a9278f..883c8e05667 100644 --- a/react-api-client/src/maintenance_runs/useCurrentMaintenanceRun.ts +++ b/react-api-client/src/maintenance_runs/useCurrentMaintenanceRun.ts @@ -1,12 +1,9 @@ -import { - HostConfig, - getCurrentMaintenanceRun, - MaintenanceRun, -} from '@opentrons/api-client' +import { getCurrentMaintenanceRun } from '@opentrons/api-client' import { useQuery, useQueryClient } from 'react-query' import { useHost } from '../api' import type { UseQueryResult, UseQueryOptions } from 'react-query' +import type { HostConfig, MaintenanceRun } from '@opentrons/api-client' export function useCurrentMaintenanceRun( options: UseQueryOptions = {} diff --git a/react-api-client/src/maintenance_runs/useMaintenanceRunQuery.ts b/react-api-client/src/maintenance_runs/useMaintenanceRunQuery.ts index 43f5b75a1d0..f9746d0757b 100644 --- a/react-api-client/src/maintenance_runs/useMaintenanceRunQuery.ts +++ b/react-api-client/src/maintenance_runs/useMaintenanceRunQuery.ts @@ -1,12 +1,9 @@ -import { - HostConfig, - MaintenanceRun, - getMaintenanceRun, -} from '@opentrons/api-client' +import { getMaintenanceRun } from '@opentrons/api-client' import { useQuery } from 'react-query' import { useHost } from '../api' import type { UseQueryResult, UseQueryOptions } from 'react-query' +import type { HostConfig, MaintenanceRun } from '@opentrons/api-client' export function useMaintenanceRunQuery( maintenanceRunId: string | null, diff --git a/react-api-client/src/networking/useWifiQuery.ts b/react-api-client/src/networking/useWifiQuery.ts index 937d1a065ed..d00c0a52f8d 100644 --- a/react-api-client/src/networking/useWifiQuery.ts +++ b/react-api-client/src/networking/useWifiQuery.ts @@ -1,8 +1,8 @@ import { useQuery } from 'react-query' -import { WifiListResponse, getWifiList } from '@opentrons/api-client' +import { getWifiList } from '@opentrons/api-client' import { useHost } from '../api' import type { UseQueryResult, UseQueryOptions } from 'react-query' -import type { HostConfig } from '@opentrons/api-client' +import type { HostConfig, WifiListResponse } from '@opentrons/api-client' export function useWifiQuery( options: UseQueryOptions< diff --git a/react-api-client/src/pipettes/useUpdatePipetteSettingsMutation.ts b/react-api-client/src/pipettes/useUpdatePipetteSettingsMutation.ts index f306a8b9202..f742cc22405 100644 --- a/react-api-client/src/pipettes/useUpdatePipetteSettingsMutation.ts +++ b/react-api-client/src/pipettes/useUpdatePipetteSettingsMutation.ts @@ -1,18 +1,17 @@ -import { - HostConfig, - IndividualPipetteSettings, - updatePipetteSettings, - UpdatePipetteSettingsData, -} from '@opentrons/api-client' -import { - useMutation, - useQueryClient, +import { updatePipetteSettings } from '@opentrons/api-client' +import { useMutation, useQueryClient } from 'react-query' +import { useHost } from '../api' +import type { AxiosError } from 'axios' +import type { UseMutateAsyncFunction, UseMutationOptions, UseMutationResult, } from 'react-query' -import { useHost } from '../api' -import type { AxiosError } from 'axios' +import type { + HostConfig, + IndividualPipetteSettings, + UpdatePipetteSettingsData, +} from '@opentrons/api-client' export type UpdatePipetteSettingsType = UseMutateAsyncFunction< IndividualPipetteSettings, diff --git a/react-api-client/src/protocols/useAllProtocolIdsQuery.ts b/react-api-client/src/protocols/useAllProtocolIdsQuery.ts index 0adf939eab7..d09934ae1c0 100644 --- a/react-api-client/src/protocols/useAllProtocolIdsQuery.ts +++ b/react-api-client/src/protocols/useAllProtocolIdsQuery.ts @@ -1,8 +1,8 @@ -import { UseQueryResult, useQuery } from 'react-query' +import { useQuery } from 'react-query' import { getProtocolIds } from '@opentrons/api-client' import { useHost } from '../api' import type { HostConfig, ProtocolsIds } from '@opentrons/api-client' -import type { UseQueryOptions } from 'react-query' +import type { UseQueryOptions, UseQueryResult } from 'react-query' const POLLING_INTERVAL = 1000 diff --git a/react-api-client/src/protocols/useAllProtocolsQuery.ts b/react-api-client/src/protocols/useAllProtocolsQuery.ts index 4eeb1101665..65c70d7fbf8 100644 --- a/react-api-client/src/protocols/useAllProtocolsQuery.ts +++ b/react-api-client/src/protocols/useAllProtocolsQuery.ts @@ -1,6 +1,7 @@ -import { UseQueryResult, useQuery } from 'react-query' +import { useQuery } from 'react-query' import { getProtocols } from '@opentrons/api-client' import { useHost } from '../api' +import type { UseQueryResult } from 'react-query' import type { HostConfig, Protocols } from '@opentrons/api-client' export function useAllProtocolsQuery(): UseQueryResult { diff --git a/react-api-client/src/protocols/useCreateProtocolMutation.ts b/react-api-client/src/protocols/useCreateProtocolMutation.ts index 2e36321e311..f503f2f745d 100644 --- a/react-api-client/src/protocols/useCreateProtocolMutation.ts +++ b/react-api-client/src/protocols/useCreateProtocolMutation.ts @@ -1,13 +1,12 @@ -import { +import { useMutation, useQueryClient } from 'react-query' +import { createProtocol } from '@opentrons/api-client' +import { useHost } from '../api' +import type { AxiosError } from 'axios' +import type { UseMutationResult, UseMutationOptions, - useMutation, UseMutateFunction, - useQueryClient, } from 'react-query' -import { createProtocol } from '@opentrons/api-client' -import { useHost } from '../api' -import type { AxiosError } from 'axios' import type { ErrorResponse, HostConfig, diff --git a/react-api-client/src/protocols/useDeleteProtocolMutation.ts b/react-api-client/src/protocols/useDeleteProtocolMutation.ts index eaac4dc0ed6..921d6c6cabb 100644 --- a/react-api-client/src/protocols/useDeleteProtocolMutation.ts +++ b/react-api-client/src/protocols/useDeleteProtocolMutation.ts @@ -1,11 +1,7 @@ -import { - UseMutationResult, - useMutation, - UseMutateFunction, - useQueryClient, -} from 'react-query' +import { useMutation, useQueryClient } from 'react-query' import { deleteProtocol } from '@opentrons/api-client' import { useHost } from '../api' +import type { UseMutationResult, UseMutateFunction } from 'react-query' import type { HostConfig, EmptyResponse } from '@opentrons/api-client' export type UseDeleteProtocolMutationResult = UseMutationResult< diff --git a/react-api-client/src/protocols/useProtocolAnalysesQuery.ts b/react-api-client/src/protocols/useProtocolAnalysesQuery.ts index 943dec00a98..0cbdaf64daf 100644 --- a/react-api-client/src/protocols/useProtocolAnalysesQuery.ts +++ b/react-api-client/src/protocols/useProtocolAnalysesQuery.ts @@ -1,8 +1,8 @@ -import { UseQueryResult, useQuery } from 'react-query' +import { useQuery } from 'react-query' import { getProtocolAnalyses } from '@opentrons/api-client' import { useHost } from '../api' import type { HostConfig, ProtocolAnalyses } from '@opentrons/api-client' -import type { UseQueryOptions } from 'react-query' +import type { UseQueryOptions, UseQueryResult } from 'react-query' const POLLING_INTERVAL = 1000 diff --git a/react-api-client/src/protocols/useProtocolAnalysisAsDocumentQuery.ts b/react-api-client/src/protocols/useProtocolAnalysisAsDocumentQuery.ts index 6cfebeb2c47..6e0be35276d 100644 --- a/react-api-client/src/protocols/useProtocolAnalysisAsDocumentQuery.ts +++ b/react-api-client/src/protocols/useProtocolAnalysisAsDocumentQuery.ts @@ -1,9 +1,9 @@ -import { UseQueryResult, useQuery } from 'react-query' +import { useQuery } from 'react-query' import { getProtocolAnalysisAsDocument } from '@opentrons/api-client' import { useHost } from '../api' import type { HostConfig } from '@opentrons/api-client' -import type { UseQueryOptions } from 'react-query' -import { CompletedProtocolAnalysis } from '@opentrons/shared-data' +import type { UseQueryOptions, UseQueryResult } from 'react-query' +import type { CompletedProtocolAnalysis } from '@opentrons/shared-data' export function useProtocolAnalysisAsDocumentQuery( protocolId: string | null, diff --git a/react-api-client/src/protocols/useProtocolQuery.ts b/react-api-client/src/protocols/useProtocolQuery.ts index bfdb2fc396c..cea43962ab4 100644 --- a/react-api-client/src/protocols/useProtocolQuery.ts +++ b/react-api-client/src/protocols/useProtocolQuery.ts @@ -1,8 +1,8 @@ -import { UseQueryResult, useQuery } from 'react-query' +import { useQuery } from 'react-query' import { getProtocol } from '@opentrons/api-client' import { useHost } from '../api' import type { HostConfig, Protocol } from '@opentrons/api-client' -import type { UseQueryOptions } from 'react-query' +import type { UseQueryOptions, UseQueryResult } from 'react-query' const POLLING_INTERVAL = 1000 diff --git a/react-api-client/src/robot/useAcknowledgeEstopDisengageMutation.ts b/react-api-client/src/robot/useAcknowledgeEstopDisengageMutation.ts index 50b0ad18eb9..90585699e80 100644 --- a/react-api-client/src/robot/useAcknowledgeEstopDisengageMutation.ts +++ b/react-api-client/src/robot/useAcknowledgeEstopDisengageMutation.ts @@ -1,18 +1,13 @@ -import { +import { useMutation } from 'react-query' +import { acknowledgeEstopDisengage } from '@opentrons/api-client' +import { useHost } from '../api' +import type { AxiosError } from 'axios' +import type { UseMutationResult, - useMutation, UseMutateFunction, UseMutationOptions, } from 'react-query' - -import { - HostConfig, - EstopStatus, - acknowledgeEstopDisengage, -} from '@opentrons/api-client' - -import { useHost } from '../api' -import type { AxiosError } from 'axios' +import type { HostConfig, EstopStatus } from '@opentrons/api-client' export type UseAcknowledgeEstopDisengageMutationResult = UseMutationResult< EstopStatus, diff --git a/react-api-client/src/robot/useDoorQuery.ts b/react-api-client/src/robot/useDoorQuery.ts index 4343acf2160..92e96f7b095 100644 --- a/react-api-client/src/robot/useDoorQuery.ts +++ b/react-api-client/src/robot/useDoorQuery.ts @@ -1,9 +1,9 @@ import { useQuery } from 'react-query' -import { HostConfig, getDoorStatus } from '@opentrons/api-client' +import { getDoorStatus } from '@opentrons/api-client' import { useHost } from '../api' import type { UseQueryResult, UseQueryOptions } from 'react-query' -import type { DoorStatus } from '@opentrons/api-client' +import type { HostConfig, DoorStatus } from '@opentrons/api-client' export type UseDoorQueryOptions = UseQueryOptions< DoorStatus, diff --git a/react-api-client/src/robot/useLightsQuery.ts b/react-api-client/src/robot/useLightsQuery.ts index 6ccee63149f..9c910b85823 100644 --- a/react-api-client/src/robot/useLightsQuery.ts +++ b/react-api-client/src/robot/useLightsQuery.ts @@ -1,7 +1,8 @@ -import { HostConfig, Lights, getLights } from '@opentrons/api-client' +import { getLights } from '@opentrons/api-client' import { useQuery } from 'react-query' import { useHost } from '../api' import type { UseQueryResult, UseQueryOptions } from 'react-query' +import type { HostConfig, Lights } from '@opentrons/api-client' export type UseLightsQueryOptions = UseQueryOptions< Lights, diff --git a/react-api-client/src/robot/useSetLightsMutation.ts b/react-api-client/src/robot/useSetLightsMutation.ts index 223bd907e9a..c3e36094e3b 100644 --- a/react-api-client/src/robot/useSetLightsMutation.ts +++ b/react-api-client/src/robot/useSetLightsMutation.ts @@ -1,17 +1,13 @@ -import { - HostConfig, - Lights, - setLights, - SetLightsData, -} from '@opentrons/api-client' -import { +import { setLights } from '@opentrons/api-client' +import { useMutation } from 'react-query' +import { useHost } from '../api' +import type { UseMutationResult, - useMutation, UseMutateFunction, UseMutationOptions, } from 'react-query' -import { useHost } from '../api' import type { AxiosError } from 'axios' +import type { HostConfig, Lights, SetLightsData } from '@opentrons/api-client' export type UseSetLightsMutationResult = UseMutationResult< Lights, diff --git a/react-api-client/src/runs/__fixtures__/runActions.ts b/react-api-client/src/runs/__fixtures__/runActions.ts index 41c333dd459..096c60b7ce1 100644 --- a/react-api-client/src/runs/__fixtures__/runActions.ts +++ b/react-api-client/src/runs/__fixtures__/runActions.ts @@ -1,9 +1,9 @@ import { - RunAction, RUN_ACTION_TYPE_PLAY, RUN_ACTION_TYPE_PAUSE, RUN_ACTION_TYPE_STOP, } from '@opentrons/api-client' +import type { RunAction } from '@opentrons/api-client' export const mockPlayRunAction: RunAction = { id: '1', diff --git a/react-api-client/src/runs/__fixtures__/runCommands.ts b/react-api-client/src/runs/__fixtures__/runCommands.ts index 7a78725e2a9..58a6ae11679 100644 --- a/react-api-client/src/runs/__fixtures__/runCommands.ts +++ b/react-api-client/src/runs/__fixtures__/runCommands.ts @@ -1,4 +1,4 @@ -import { CommandsData, RunCommandSummary } from '@opentrons/api-client' +import type { CommandsData, RunCommandSummary } from '@opentrons/api-client' import type { CreateCommand } from '@opentrons/shared-data' export const mockAnonLoadCommand: CreateCommand = { diff --git a/react-api-client/src/runs/__fixtures__/runs.ts b/react-api-client/src/runs/__fixtures__/runs.ts index 47a432f5a5f..33ae7cb4b4d 100644 --- a/react-api-client/src/runs/__fixtures__/runs.ts +++ b/react-api-client/src/runs/__fixtures__/runs.ts @@ -1,10 +1,8 @@ import { RUN_ACTION_TYPE_PLAY, RUN_ACTION_TYPE_PAUSE, - Run, - Runs, - RunData, } from '@opentrons/api-client' +import type { Run, Runs, RunData } from '@opentrons/api-client' export const PROTOCOL_ID = '1' export const RUN_ID_1 = '1' diff --git a/react-api-client/src/runs/__tests__/useCreateRunMutation.test.tsx b/react-api-client/src/runs/__tests__/useCreateRunMutation.test.tsx index 8fb1ebe2752..87d5920f838 100644 --- a/react-api-client/src/runs/__tests__/useCreateRunMutation.test.tsx +++ b/react-api-client/src/runs/__tests__/useCreateRunMutation.test.tsx @@ -2,12 +2,17 @@ import * as React from 'react' import { describe, it, expect, beforeEach, vi } from 'vitest' import { QueryClient, QueryClientProvider } from 'react-query' import { act, renderHook, waitFor } from '@testing-library/react' -import { createRun, CreateRunData } from '@opentrons/api-client' +import { createRun } from '@opentrons/api-client' import { useHost } from '../../api' import { PROTOCOL_ID, mockRunResponse } from '../__fixtures__' import { useCreateRunMutation } from '..' -import type { HostConfig, Response, Run } from '@opentrons/api-client' +import type { + HostConfig, + Response, + Run, + CreateRunData, +} from '@opentrons/api-client' vi.mock('@opentrons/api-client') vi.mock('../../api/useHost') diff --git a/react-api-client/src/runs/__tests__/useRunActionMutations.test.tsx b/react-api-client/src/runs/__tests__/useRunActionMutations.test.tsx index 0a6390889a0..7df81392aea 100644 --- a/react-api-client/src/runs/__tests__/useRunActionMutations.test.tsx +++ b/react-api-client/src/runs/__tests__/useRunActionMutations.test.tsx @@ -6,13 +6,15 @@ import { act, renderHook } from '@testing-library/react' import { RUN_ID_1 } from '../__fixtures__' import { useRunActionMutations, - UsePlayRunMutationResult, - UsePauseRunMutationResult, - UseStopRunMutationResult, usePlayRunMutation, usePauseRunMutation, useStopRunMutation, } from '..' +import type { + UsePlayRunMutationResult, + UsePauseRunMutationResult, + UseStopRunMutationResult, +} from '..' vi.mock('../usePlayRunMutation') vi.mock('../usePauseRunMutation') diff --git a/react-api-client/src/runs/useAllCommandsAsPreSerializedList.ts b/react-api-client/src/runs/useAllCommandsAsPreSerializedList.ts index 3d30d13c579..fde0834ce80 100644 --- a/react-api-client/src/runs/useAllCommandsAsPreSerializedList.ts +++ b/react-api-client/src/runs/useAllCommandsAsPreSerializedList.ts @@ -1,7 +1,7 @@ -import { UseQueryResult, useQuery } from 'react-query' +import { useQuery } from 'react-query' import { getCommandsAsPreSerializedList } from '@opentrons/api-client' import { useHost } from '../api' -import type { UseQueryOptions } from 'react-query' +import type { UseQueryOptions, UseQueryResult } from 'react-query' import type { GetCommandsParams, HostConfig, diff --git a/react-api-client/src/runs/useAllCommandsQuery.ts b/react-api-client/src/runs/useAllCommandsQuery.ts index f258b61836f..20c598d733f 100644 --- a/react-api-client/src/runs/useAllCommandsQuery.ts +++ b/react-api-client/src/runs/useAllCommandsQuery.ts @@ -1,7 +1,7 @@ -import { UseQueryResult, useQuery } from 'react-query' +import { useQuery } from 'react-query' import { getCommands } from '@opentrons/api-client' import { useHost } from '../api' -import type { UseQueryOptions } from 'react-query' +import type { UseQueryOptions, UseQueryResult } from 'react-query' import type { GetCommandsParams, HostConfig, diff --git a/react-api-client/src/runs/useCommandQuery.ts b/react-api-client/src/runs/useCommandQuery.ts index 56c1e269982..2dc76b34163 100644 --- a/react-api-client/src/runs/useCommandQuery.ts +++ b/react-api-client/src/runs/useCommandQuery.ts @@ -1,7 +1,8 @@ -import { UseQueryResult, useQuery } from 'react-query' -import { CommandDetail, HostConfig, getCommand } from '@opentrons/api-client' +import { useQuery } from 'react-query' +import { getCommand } from '@opentrons/api-client' import { useHost } from '../api' -import type { UseQueryOptions } from 'react-query' +import type { UseQueryOptions, UseQueryResult } from 'react-query' +import type { CommandDetail, HostConfig } from '@opentrons/api-client' export function useCommandQuery( runId: string | null, diff --git a/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts b/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts index 1ca3c56de41..0acf522c1c1 100644 --- a/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts +++ b/react-api-client/src/runs/useCreateLabwareOffsetMutation.ts @@ -1,10 +1,11 @@ import { useMutation, useQueryClient } from 'react-query' -import { - createLabwareOffset, +import { createLabwareOffset } from '@opentrons/api-client' +import { useHost } from '../api' +import type { + HostConfig, + Run, LabwareOffsetCreateData, } from '@opentrons/api-client' -import { useHost } from '../api' -import type { HostConfig, Run } from '@opentrons/api-client' import type { UseMutationResult, UseMutateAsyncFunction } from 'react-query' interface CreateLabwareOffsetParams { diff --git a/react-api-client/src/runs/useCreateRunMutation.ts b/react-api-client/src/runs/useCreateRunMutation.ts index 9a40d1f58bf..f3b5490d96a 100644 --- a/react-api-client/src/runs/useCreateRunMutation.ts +++ b/react-api-client/src/runs/useCreateRunMutation.ts @@ -1,17 +1,13 @@ -import { - HostConfig, - Run, - createRun, - CreateRunData, -} from '@opentrons/api-client' -import { +import { createRun } from '@opentrons/api-client' +import { useMutation } from 'react-query' +import { useHost } from '../api' +import type { AxiosError } from 'axios' +import type { UseMutationResult, - useMutation, UseMutateFunction, UseMutationOptions, } from 'react-query' -import { useHost } from '../api' -import type { AxiosError } from 'axios' +import type { HostConfig, CreateRunData, Run } from '@opentrons/api-client' export type UseCreateRunMutationResult = UseMutationResult< Run, diff --git a/react-api-client/src/runs/usePauseRunMutation.ts b/react-api-client/src/runs/usePauseRunMutation.ts index 0be8be79959..e87c830c1b0 100644 --- a/react-api-client/src/runs/usePauseRunMutation.ts +++ b/react-api-client/src/runs/usePauseRunMutation.ts @@ -1,18 +1,14 @@ -import { - HostConfig, - RunAction, - RUN_ACTION_TYPE_PAUSE, - createRunAction, -} from '@opentrons/api-client' -import { +import { RUN_ACTION_TYPE_PAUSE, createRunAction } from '@opentrons/api-client' +import { useMutation } from 'react-query' +import { useHost } from '../api' + +import type { UseMutationResult, - useMutation, UseMutateFunction, UseMutationOptions, } from 'react-query' -import { useHost } from '../api' - import type { AxiosError } from 'axios' +import type { HostConfig, RunAction } from '@opentrons/api-client' export type UsePauseRunMutationResult = UseMutationResult< RunAction, diff --git a/react-api-client/src/runs/usePlayRunMutation.ts b/react-api-client/src/runs/usePlayRunMutation.ts index c047a8fea4b..26b8c53c9e3 100644 --- a/react-api-client/src/runs/usePlayRunMutation.ts +++ b/react-api-client/src/runs/usePlayRunMutation.ts @@ -1,18 +1,14 @@ -import { - HostConfig, - RunAction, - RUN_ACTION_TYPE_PLAY, - createRunAction, -} from '@opentrons/api-client' -import { +import { RUN_ACTION_TYPE_PLAY, createRunAction } from '@opentrons/api-client' +import { useMutation } from 'react-query' +import { useHost } from '../api' + +import type { UseMutationResult, - useMutation, UseMutateFunction, UseMutationOptions, } from 'react-query' -import { useHost } from '../api' - import type { AxiosError } from 'axios' +import type { HostConfig, RunAction } from '@opentrons/api-client' export type UsePlayRunMutationResult = UseMutationResult< RunAction, diff --git a/react-api-client/src/runs/useStopRunMutation.ts b/react-api-client/src/runs/useStopRunMutation.ts index 1d102cdae08..14b690cfa62 100644 --- a/react-api-client/src/runs/useStopRunMutation.ts +++ b/react-api-client/src/runs/useStopRunMutation.ts @@ -1,9 +1,4 @@ -import { - HostConfig, - RunAction, - RUN_ACTION_TYPE_STOP, - createRunAction, -} from '@opentrons/api-client' +import { RUN_ACTION_TYPE_STOP, createRunAction } from '@opentrons/api-client' import { useMutation } from 'react-query' import { useHost } from '../api' @@ -12,6 +7,7 @@ import type { UseMutateFunction, UseMutationOptions, } from 'react-query' +import type { HostConfig, RunAction } from '@opentrons/api-client' export type UseStopRunMutationResult = UseMutationResult< RunAction, diff --git a/react-api-client/src/server/useUpdateRobotNameMutation.ts b/react-api-client/src/server/useUpdateRobotNameMutation.ts index d4ae290d92a..6b78165e53c 100644 --- a/react-api-client/src/server/useUpdateRobotNameMutation.ts +++ b/react-api-client/src/server/useUpdateRobotNameMutation.ts @@ -1,12 +1,11 @@ -import { +import { useMutation, useQueryClient } from 'react-query' +import { updateRobotName } from '@opentrons/api-client' +import { useHost } from '../api' +import type { UseMutationResult, UseMutationOptions, - useMutation, UseMutateFunction, - useQueryClient, } from 'react-query' -import { updateRobotName } from '@opentrons/api-client' -import { useHost } from '../api' import type { AxiosError } from 'axios' import type { ErrorResponse, diff --git a/react-api-client/src/sessions/__tests__/useAllSessionsQuery.test.tsx b/react-api-client/src/sessions/__tests__/useAllSessionsQuery.test.tsx index 426c116cf3c..45d9eae6484 100644 --- a/react-api-client/src/sessions/__tests__/useAllSessionsQuery.test.tsx +++ b/react-api-client/src/sessions/__tests__/useAllSessionsQuery.test.tsx @@ -1,11 +1,12 @@ import * as React from 'react' import { describe, it, expect, beforeEach, vi } from 'vitest' -import { QueryClient, QueryClientProvider, UseQueryOptions } from 'react-query' +import { QueryClient, QueryClientProvider } from 'react-query' import { renderHook, waitFor } from '@testing-library/react' import { getSessions } from '@opentrons/api-client' import { useHost } from '../../api' import { useAllSessionsQuery } from '..' +import type { UseQueryOptions } from 'react-query' import type { HostConfig, Response, Sessions } from '@opentrons/api-client' vi.mock('@opentrons/api-client') diff --git a/react-api-client/src/sessions/__tests__/useCreateSessionMutation.test.tsx b/react-api-client/src/sessions/__tests__/useCreateSessionMutation.test.tsx index c4dea17c8cc..982c2049200 100644 --- a/react-api-client/src/sessions/__tests__/useCreateSessionMutation.test.tsx +++ b/react-api-client/src/sessions/__tests__/useCreateSessionMutation.test.tsx @@ -4,13 +4,17 @@ import { QueryClient, QueryClientProvider } from 'react-query' import { act, renderHook, waitFor } from '@testing-library/react' import { createSession, - CreateSessionData, SESSION_TYPE_DECK_CALIBRATION, } from '@opentrons/api-client' import { useHost } from '../../api' import { useCreateSessionMutation } from '..' -import type { HostConfig, Response, Session } from '@opentrons/api-client' +import type { + HostConfig, + Response, + Session, + CreateSessionData, +} from '@opentrons/api-client' vi.mock('@opentrons/api-client') vi.mock('../../api/useHost') diff --git a/react-api-client/src/sessions/useAllSessionsQuery.ts b/react-api-client/src/sessions/useAllSessionsQuery.ts index 238b1ca17cf..34256b008cc 100644 --- a/react-api-client/src/sessions/useAllSessionsQuery.ts +++ b/react-api-client/src/sessions/useAllSessionsQuery.ts @@ -1,8 +1,9 @@ -import { HostConfig, Sessions, getSessions } from '@opentrons/api-client' -import { UseQueryResult, useQuery } from 'react-query' +import { getSessions } from '@opentrons/api-client' +import { useQuery } from 'react-query' import { useHost } from '../api' -import type { UseQueryOptions } from 'react-query' +import type { UseQueryResult, UseQueryOptions } from 'react-query' +import type { HostConfig, Sessions } from '@opentrons/api-client' export function useAllSessionsQuery( options: UseQueryOptions = {} diff --git a/react-api-client/src/sessions/useCreateSessionMutation.ts b/react-api-client/src/sessions/useCreateSessionMutation.ts index aae57332e81..c78ada4b903 100644 --- a/react-api-client/src/sessions/useCreateSessionMutation.ts +++ b/react-api-client/src/sessions/useCreateSessionMutation.ts @@ -1,11 +1,13 @@ -import { +import { createSession } from '@opentrons/api-client' +import { useMutation } from 'react-query' +import { useHost } from '../api' + +import type { UseMutationResult, UseMutateFunction } from 'react-query' +import type { HostConfig, Session, - createSession, CreateSessionData, } from '@opentrons/api-client' -import { UseMutationResult, useMutation, UseMutateFunction } from 'react-query' -import { useHost } from '../api' export type UseCreateSessionMutationResult = UseMutationResult< Session, diff --git a/react-api-client/src/sessions/useSessionQuery.ts b/react-api-client/src/sessions/useSessionQuery.ts index e522be2b5b2..0f6cfa5bca0 100644 --- a/react-api-client/src/sessions/useSessionQuery.ts +++ b/react-api-client/src/sessions/useSessionQuery.ts @@ -1,7 +1,10 @@ -import { HostConfig, Session, getSession } from '@opentrons/api-client' -import { UseQueryResult, useQuery } from 'react-query' +import { getSession } from '@opentrons/api-client' +import { useQuery } from 'react-query' import { useHost } from '../api' +import type { UseQueryResult } from 'react-query' +import type { HostConfig, Session } from '@opentrons/api-client' + export function useSessionQuery(sessionId: string): UseQueryResult { const host = useHost() const query = useQuery( diff --git a/react-api-client/src/sessions/useSessionsByTypeQuery.ts b/react-api-client/src/sessions/useSessionsByTypeQuery.ts index 3d67b52f182..7e86c2cff35 100644 --- a/react-api-client/src/sessions/useSessionsByTypeQuery.ts +++ b/react-api-client/src/sessions/useSessionsByTypeQuery.ts @@ -1,12 +1,10 @@ -import { - getSessions, - HostConfig, - Sessions, - SessionType, -} from '@opentrons/api-client' -import { UseQueryResult, useQuery } from 'react-query' +import { getSessions } from '@opentrons/api-client' +import { useQuery } from 'react-query' import { useHost } from '../api' +import type { UseQueryResult } from 'react-query' +import type { HostConfig, Sessions, SessionType } from '@opentrons/api-client' + export function useSessionsByTypeQuery(args: { sessionType: SessionType }): UseQueryResult { diff --git a/react-api-client/src/system/useAuthorization.ts b/react-api-client/src/system/useAuthorization.ts index 02fa26d4734..db793536db3 100644 --- a/react-api-client/src/system/useAuthorization.ts +++ b/react-api-client/src/system/useAuthorization.ts @@ -1,11 +1,9 @@ import * as React from 'react' -import { - createAuthorization, - createRegistration, - HostConfig, -} from '@opentrons/api-client' +import { createAuthorization, createRegistration } from '@opentrons/api-client' import { useHost } from '../api' + import type { + HostConfig, AuthorizationToken, CreateRegistrationParams, RegistrationToken, diff --git a/shared-data/js/types.ts b/shared-data/js/types.ts index 4d51f992f22..5eab9ebaa08 100644 --- a/shared-data/js/types.ts +++ b/shared-data/js/types.ts @@ -1,4 +1,4 @@ -import { +import type { MAGDECK, TEMPDECK, THERMOCYCLER, diff --git a/shared-data/protocol/types/schemaV3.ts b/shared-data/protocol/types/schemaV3.ts index 2e3f96c108e..a89f7beb4d9 100644 --- a/shared-data/protocol/types/schemaV3.ts +++ b/shared-data/protocol/types/schemaV3.ts @@ -1,4 +1,4 @@ -import { PipetteName } from '../../js' +import type { PipetteName } from '../../js' import type { DeckSlotId, LabwareDefinition2, diff --git a/shared-data/protocol/types/schemaV6/index.ts b/shared-data/protocol/types/schemaV6/index.ts index ea60dfe7739..f04a6129eb6 100644 --- a/shared-data/protocol/types/schemaV6/index.ts +++ b/shared-data/protocol/types/schemaV6/index.ts @@ -1,4 +1,4 @@ -import { +import type { LoadedPipette, LoadedLabware, LoadedModule, diff --git a/shared-data/protocol/types/schemaV7/index.ts b/shared-data/protocol/types/schemaV7/index.ts index 2c05d6496b9..51f7d8ee41a 100644 --- a/shared-data/protocol/types/schemaV7/index.ts +++ b/shared-data/protocol/types/schemaV7/index.ts @@ -1,4 +1,9 @@ -import { LoadedPipette, LoadedLabware, LoadedModule, Liquid } from '../../../js' +import type { + LoadedPipette, + LoadedLabware, + LoadedModule, + Liquid, +} from '../../../js' import type { CreateCommand, RunTimeCommand } from './command' import type { LabwareDefinition2, RobotType } from '../../../js/types' diff --git a/step-generation/src/__tests__/blowoutUtil.test.ts b/step-generation/src/__tests__/blowoutUtil.test.ts index ac2a1c1cd87..7337e517769 100644 --- a/step-generation/src/__tests__/blowoutUtil.test.ts +++ b/step-generation/src/__tests__/blowoutUtil.test.ts @@ -1,5 +1,4 @@ import { beforeEach, describe, it, expect, vi } from 'vitest' -import { BlowoutParams } from '@opentrons/shared-data/protocol/types/schemaV3' import { ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA } from '@opentrons/shared-data' import { blowoutUtil, @@ -23,6 +22,7 @@ import { getInitialRobotStateStandard, } from '../fixtures' import type { RobotState, InvariantContext } from '../types' +import type { BlowoutParams } from '@opentrons/shared-data/protocol/types/schemaV3' vi.mock('../utils/curryCommandCreator') let blowoutArgs: { diff --git a/step-generation/src/__tests__/deactivateTemperature.test.ts b/step-generation/src/__tests__/deactivateTemperature.test.ts index 730f3971cf1..fdd29e97ffc 100644 --- a/step-generation/src/__tests__/deactivateTemperature.test.ts +++ b/step-generation/src/__tests__/deactivateTemperature.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, it, expect } from 'vitest' import { getStateAndContextTempTCModules } from '../fixtures' import { deactivateTemperature } from '../commandCreators/atomic/deactivateTemperature' -import { +import type { InvariantContext, RobotState, DeactivateTemperatureArgs, diff --git a/step-generation/src/__tests__/delay.test.ts b/step-generation/src/__tests__/delay.test.ts index 6fdce84c181..6a843ab11f5 100644 --- a/step-generation/src/__tests__/delay.test.ts +++ b/step-generation/src/__tests__/delay.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, it, expect } from 'vitest' import { delay } from '../commandCreators/atomic/delay' -import { PauseArgs } from '../types' import { getSuccessResult } from '../fixtures' +import type { PauseArgs } from '../types' const getRobotInitialState = (): any => { // This particular state shouldn't matter for delay diff --git a/step-generation/src/__tests__/disengageMagnet.test.ts b/step-generation/src/__tests__/disengageMagnet.test.ts index 55cbef080b3..3f988492fe0 100644 --- a/step-generation/src/__tests__/disengageMagnet.test.ts +++ b/step-generation/src/__tests__/disengageMagnet.test.ts @@ -5,7 +5,7 @@ import { } from '@opentrons/shared-data' import { makeContext, getInitialRobotStateStandard } from '../fixtures' import { disengageMagnet } from '../commandCreators/atomic/disengageMagnet' -import { InvariantContext, RobotState } from '../types' +import type { InvariantContext, RobotState } from '../types' const moduleId = 'magneticModuleId' const commandCreatorFnName = 'disengageMagnet' describe('disengageMagnet', () => { diff --git a/step-generation/src/__tests__/dispense.test.ts b/step-generation/src/__tests__/dispense.test.ts index c193f8f0b01..968d8000e88 100644 --- a/step-generation/src/__tests__/dispense.test.ts +++ b/step-generation/src/__tests__/dispense.test.ts @@ -20,10 +20,8 @@ import { DEFAULT_PIPETTE, SOURCE_LABWARE, } from '../fixtures' -import { - ExtendedDispenseParams, - dispense, -} from '../commandCreators/atomic/dispense' +import { dispense } from '../commandCreators/atomic/dispense' +import type { ExtendedDispenseParams } from '../commandCreators/atomic/dispense' import type { InvariantContext, RobotState } from '../types' vi.mock('../utils/thermocyclerPipetteCollision') diff --git a/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts b/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts index d24ed0a4c21..5eacb77b483 100644 --- a/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts +++ b/step-generation/src/__tests__/dispenseUpdateLiquidState.test.ts @@ -14,12 +14,10 @@ import { SOURCE_LABWARE, getInitialRobotStateStandard, } from '../fixtures' +import { dispenseUpdateLiquidState } from '../getNextRobotStateAndWarnings/dispenseUpdateLiquidState' -import { - dispenseUpdateLiquidState, - DispenseUpdateLiquidStateArgs, -} from '../getNextRobotStateAndWarnings/dispenseUpdateLiquidState' import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { DispenseUpdateLiquidStateArgs } from '../getNextRobotStateAndWarnings/dispenseUpdateLiquidState' import type { InvariantContext, RobotState } from '../types' const fixture96Plate = _fixture96Plate as LabwareDefinition2 diff --git a/step-generation/src/__tests__/forAspirate.test.ts b/step-generation/src/__tests__/forAspirate.test.ts index 85b07046782..cdb22c8951e 100644 --- a/step-generation/src/__tests__/forAspirate.test.ts +++ b/step-generation/src/__tests__/forAspirate.test.ts @@ -10,8 +10,12 @@ import { AIR, createTipLiquidState } from '../utils/misc' import { makeImmutableStateUpdater } from '../__utils__' import { forAspirate as _forAspirate } from '../getNextRobotStateAndWarnings/forAspirate' import * as warningCreators from '../warningCreators' -import { CommandCreatorWarning, InvariantContext, RobotState } from '../types' -import { AspDispAirgapParams } from '@opentrons/shared-data/lib/protocol/types/schemaV6/command/pipetting' +import type { + CommandCreatorWarning, + InvariantContext, + RobotState, +} from '../types' +import type { AspDispAirgapParams } from '@opentrons/shared-data/lib/protocol/types/schemaV6/command/pipetting' const forAspirate = makeImmutableStateUpdater(_forAspirate) diff --git a/step-generation/src/__tests__/forDropTip.test.ts b/step-generation/src/__tests__/forDropTip.test.ts index dcb4bffadf5..833187dcf99 100644 --- a/step-generation/src/__tests__/forDropTip.test.ts +++ b/step-generation/src/__tests__/forDropTip.test.ts @@ -7,7 +7,7 @@ import { } from '../fixtures' import { makeImmutableStateUpdater } from '../__utils__' import { forDropTip as _forDropTip } from '../getNextRobotStateAndWarnings/forDropTip' -import { InvariantContext, RobotState } from '../types' +import type { InvariantContext, RobotState } from '../types' const forDropTip = makeImmutableStateUpdater(_forDropTip) describe('dropTip', () => { diff --git a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts index b3ff5cba24d..bf63014d552 100644 --- a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts +++ b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts @@ -1,7 +1,6 @@ import { expect, describe, it } from 'vitest' import { getIsSafePipetteMovement } from '../utils' import { - LabwareDefinition2, TEMPERATURE_MODULE_TYPE, TEMPERATURE_MODULE_V2, fixture96Plate, @@ -9,7 +8,8 @@ import { fixtureTiprack1000ul, fixtureTiprackAdapter, } from '@opentrons/shared-data' -import { InvariantContext, RobotState } from '../types' +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { InvariantContext, RobotState } from '../types' const mockLabwareId = 'labwareId' const mockPipId = 'pip' diff --git a/step-generation/src/__tests__/moveLabware.test.ts b/step-generation/src/__tests__/moveLabware.test.ts index f378db67e40..ddc8e6008de 100644 --- a/step-generation/src/__tests__/moveLabware.test.ts +++ b/step-generation/src/__tests__/moveLabware.test.ts @@ -1,7 +1,6 @@ import { beforeEach, describe, it, expect, afterEach, vi } from 'vitest' import { HEATERSHAKER_MODULE_TYPE, - LabwareDefinition2, WASTE_CHUTE_CUTOUT, } from '@opentrons/shared-data' import { @@ -14,9 +13,11 @@ import { SOURCE_LABWARE, TIPRACK_1, } from '../fixtures' -import { moveLabware, MoveLabwareArgs } from '..' +import { moveLabware } from '..' +import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { InvariantContext, RobotState } from '../types' +import type { MoveLabwareArgs } from '..' const mockWasteChuteId = 'mockWasteChuteId' const mockGripperId = 'mockGripperId' diff --git a/step-generation/src/__tests__/robotStateSelectors.test.ts b/step-generation/src/__tests__/robotStateSelectors.test.ts index 637ddaa22da..792c277651e 100644 --- a/step-generation/src/__tests__/robotStateSelectors.test.ts +++ b/step-generation/src/__tests__/robotStateSelectors.test.ts @@ -2,7 +2,6 @@ import { beforeEach, describe, it, expect } from 'vitest' import { getLabwareDefURI, MAGNETIC_MODULE_TYPE, - LabwareDefinition2, fixtureTiprack300ul as _fixtureTiprack300ul, } from '@opentrons/shared-data' import { @@ -18,7 +17,9 @@ import { _getNextTip, getModuleState, } from '../' -import { InvariantContext } from '../types' + +import type { LabwareDefinition2 } from '@opentrons/shared-data' +import type { InvariantContext } from '../types' let invariantContext: InvariantContext const fixtureTiprack300ul = _fixtureTiprack300ul as LabwareDefinition2 diff --git a/step-generation/src/__tests__/temperatureUpdates.test.ts b/step-generation/src/__tests__/temperatureUpdates.test.ts index df448caa2f5..fc08f969924 100644 --- a/step-generation/src/__tests__/temperatureUpdates.test.ts +++ b/step-generation/src/__tests__/temperatureUpdates.test.ts @@ -14,7 +14,7 @@ import { getStateAndContextTempTCModules, robotWithStatusAndTemp, } from '../fixtures/robotStateFixtures' -import { InvariantContext, RobotState } from '../types' +import type { InvariantContext, RobotState } from '../types' const forSetTemperature = makeImmutableStateUpdater(_forSetTemperature) const forDeactivateTemperature = makeImmutableStateUpdater( diff --git a/step-generation/src/__tests__/thermocyclerStateStep.test.ts b/step-generation/src/__tests__/thermocyclerStateStep.test.ts index d35bb5149ae..a4f4af90ff8 100644 --- a/step-generation/src/__tests__/thermocyclerStateStep.test.ts +++ b/step-generation/src/__tests__/thermocyclerStateStep.test.ts @@ -1,10 +1,9 @@ import { describe, it, expect, vi, afterEach } from 'vitest' -import { - thermocyclerStateDiff as actualThermocyclerStateDiff, - Diff, -} from '../utils/thermocyclerStateDiff' +import { thermocyclerStateDiff as actualThermocyclerStateDiff } from '../utils/thermocyclerStateDiff' import { thermocyclerStateStep } from '../commandCreators/compound/thermocyclerStateStep' import { getStateAndContextTempTCModules, getSuccessResult } from '../fixtures' + +import type { Diff } from '../utils/thermocyclerStateDiff' import type { CreateCommand } from '@opentrons/shared-data' import type { InvariantContext, diff --git a/step-generation/src/__tests__/thermocyclerUpdates.test.ts b/step-generation/src/__tests__/thermocyclerUpdates.test.ts index 225ede197d4..19f690e38c2 100644 --- a/step-generation/src/__tests__/thermocyclerUpdates.test.ts +++ b/step-generation/src/__tests__/thermocyclerUpdates.test.ts @@ -23,7 +23,12 @@ import type { TemperatureParams, ThermocyclerSetTargetBlockTemperatureParams, } from '@opentrons/shared-data/protocol/types/schemaV6/command/module' -import { InvariantContext, RobotState, ThermocyclerModuleState } from '../types' +import type { + InvariantContext, + RobotState, + ThermocyclerModuleState, +} from '../types' + const forThermocyclerSetTargetBlockTemperature = makeImmutableStateUpdater( _forThermocyclerSetTargetBlockTemperature ) diff --git a/step-generation/src/__tests__/utils.test.ts b/step-generation/src/__tests__/utils.test.ts index 7451b3c5076..65fea098106 100644 --- a/step-generation/src/__tests__/utils.test.ts +++ b/step-generation/src/__tests__/utils.test.ts @@ -5,7 +5,6 @@ import { TEMPERATURE_MODULE_TYPE, TEMPERATURE_MODULE_V1, THERMOCYCLER_MODULE_TYPE, - LabwareDefinition2, getIsLabwareAboveHeight, MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM, HEATERSHAKER_MODULE_TYPE, @@ -29,7 +28,7 @@ import { SOURCE_WELL_BLOWOUT_DESTINATION, splitLiquid, } from '../utils/misc' -import { Diff, thermocyclerStateDiff } from '../utils/thermocyclerStateDiff' +import { thermocyclerStateDiff } from '../utils/thermocyclerStateDiff' import { DEFAULT_CONFIG } from '../fixtures' import { getIsHeaterShakerEastWestWithLatchOpen, @@ -38,6 +37,10 @@ import { pipetteAdjacentHeaterShakerWhileShaking, thermocyclerPipetteCollision, } from '../utils' +import { getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette } from '../utils/heaterShakerCollision' +import * as SharedData from '@opentrons/shared-data' + +import type { Diff } from '../utils/thermocyclerStateDiff' import type { RobotState } from '../' import type { LabwareEntities, @@ -45,8 +48,7 @@ import type { ThermocyclerModuleState, ThermocyclerStateStepArgs, } from '../types' -import { getIsHeaterShakerNorthSouthOfNonTiprackWithMultiChannelPipette } from '../utils/heaterShakerCollision' -import * as SharedData from '@opentrons/shared-data' +import type { LabwareDefinition2 } from '@opentrons/shared-data' vi.mock('@opentrons/shared-data', async importOriginal => { const actualSharedData = await importOriginal() diff --git a/step-generation/src/__tests__/waitForTemperature.test.ts b/step-generation/src/__tests__/waitForTemperature.test.ts index 32a96df4325..7cdd64333d6 100644 --- a/step-generation/src/__tests__/waitForTemperature.test.ts +++ b/step-generation/src/__tests__/waitForTemperature.test.ts @@ -9,7 +9,11 @@ import { getStateAndContextTempTCModules, robotWithStatusAndTemp, } from '../fixtures' -import { WaitForTemperatureArgs, InvariantContext, RobotState } from '../types' +import type { + WaitForTemperatureArgs, + InvariantContext, + RobotState, +} from '../types' describe('waitForTemperature', () => { const temperatureModuleId = 'temperatureModuleId' diff --git a/step-generation/src/__utils__/testMatchers.ts b/step-generation/src/__utils__/testMatchers.ts index 50325deb1f2..09ae4fe83e0 100644 --- a/step-generation/src/__utils__/testMatchers.ts +++ b/step-generation/src/__utils__/testMatchers.ts @@ -1,5 +1,5 @@ import { expect } from 'vitest' -import { CommandCreatorError } from '../types' +import type { CommandCreatorError } from '../types' // error of type exists somewhere in timeline errors export function expectTimelineError( diff --git a/step-generation/src/commandCreators/atomic/configureNozzleLayout.ts b/step-generation/src/commandCreators/atomic/configureNozzleLayout.ts index 19a7e35db0a..bff6a097eda 100644 --- a/step-generation/src/commandCreators/atomic/configureNozzleLayout.ts +++ b/step-generation/src/commandCreators/atomic/configureNozzleLayout.ts @@ -1,6 +1,7 @@ -import { COLUMN, NozzleConfigurationStyle } from '@opentrons/shared-data' +import { COLUMN } from '@opentrons/shared-data' import { uuid } from '../../utils' import type { CommandCreator } from '../../types' +import type { NozzleConfigurationStyle } from '@opentrons/shared-data' interface configureNozzleLayoutArgs { pipetteId: string diff --git a/step-generation/src/commandCreators/atomic/moveLabware.ts b/step-generation/src/commandCreators/atomic/moveLabware.ts index 3ca4045647c..904f95fb569 100644 --- a/step-generation/src/commandCreators/atomic/moveLabware.ts +++ b/step-generation/src/commandCreators/atomic/moveLabware.ts @@ -1,7 +1,5 @@ import { - CreateCommand, HEATERSHAKER_MODULE_TYPE, - LabwareMovementStrategy, THERMOCYCLER_MODULE_TYPE, } from '@opentrons/shared-data' import * as errorCreators from '../../errorCreators' @@ -12,6 +10,10 @@ import { getLabwareHasLiquid, uuid, } from '../../utils' +import type { + CreateCommand, + LabwareMovementStrategy, +} from '@opentrons/shared-data' import type { CommandCreator, CommandCreatorError, diff --git a/step-generation/src/commandCreators/atomic/replaceTip.ts b/step-generation/src/commandCreators/atomic/replaceTip.ts index b56f0978db6..77e112d75a6 100644 --- a/step-generation/src/commandCreators/atomic/replaceTip.ts +++ b/step-generation/src/commandCreators/atomic/replaceTip.ts @@ -1,7 +1,6 @@ import { ALL, COLUMN, - NozzleConfigurationStyle, FLEX_ROBOT_TYPE, OT2_ROBOT_TYPE, } from '@opentrons/shared-data' @@ -23,6 +22,8 @@ import { getWasteChuteAddressableAreaNamePip, } from '../../utils' import { dropTip } from './dropTip' + +import type { NozzleConfigurationStyle } from '@opentrons/shared-data' import type { CommandCreator, CommandCreatorError, diff --git a/step-generation/src/commandCreators/compound/heaterShaker.ts b/step-generation/src/commandCreators/compound/heaterShaker.ts index c7de7779df4..49d94f52d90 100644 --- a/step-generation/src/commandCreators/compound/heaterShaker.ts +++ b/step-generation/src/commandCreators/compound/heaterShaker.ts @@ -1,10 +1,5 @@ import { curryCommandCreator, reduceCommandCreators } from '../../utils' import * as errorCreators from '../../errorCreators' -import { - CommandCreator, - CurriedCommandCreator, - HeaterShakerArgs, -} from '../../types' import { getModuleState } from '../../robotStateSelectors' import { delay } from '../atomic/delay' import { heaterShakerOpenLatch } from '../atomic/heaterShakerOpenLatch' @@ -14,6 +9,12 @@ import { setTemperature } from '../atomic/setTemperature' import { heaterShakerStopShake } from '../atomic/heaterShakerStopShake' import { heaterShakerSetTargetShakeSpeed } from '../atomic/heaterShakerSetTargetShakeSpeed' +import type { + CommandCreator, + CurriedCommandCreator, + HeaterShakerArgs, +} from '../../types' + export const heaterShaker: CommandCreator = ( args, invariantContext, diff --git a/step-generation/src/fixtures/commandFixtures.ts b/step-generation/src/fixtures/commandFixtures.ts index 3d1ee394574..86b6e9ea030 100644 --- a/step-generation/src/fixtures/commandFixtures.ts +++ b/step-generation/src/fixtures/commandFixtures.ts @@ -7,12 +7,13 @@ import { DEFAULT_BLOWOUT_WELL, DEST_LABWARE, } from './data' -import { +import { ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA } from '@opentrons/shared-data' + +import type { AddressableAreaName, AspDispAirgapParams, BlowoutParams, CreateCommand, - ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, TouchTipParams, } from '@opentrons/shared-data' import type { CommandsAndWarnings, CommandCreatorErrorResponse } from '../types' diff --git a/step-generation/src/fixtures/robotStateFixtures.ts b/step-generation/src/fixtures/robotStateFixtures.ts index a3a7e47062d..bfed688ad72 100644 --- a/step-generation/src/fixtures/robotStateFixtures.ts +++ b/step-generation/src/fixtures/robotStateFixtures.ts @@ -17,12 +17,6 @@ import { fixtureP100096V2Specs, } from '@opentrons/shared-data' -import { - TEMPERATURE_APPROACHING_TARGET, - TEMPERATURE_AT_TARGET, - TEMPERATURE_DEACTIVATED, - FIXED_TRASH_ID, -} from '../constants' import { makeInitialRobotState } from '../utils' import { DEFAULT_PIPETTE, @@ -33,6 +27,12 @@ import { TROUGH_LABWARE, tiprackWellNamesFlat, } from './data' +import { TEMPERATURE_DEACTIVATED, FIXED_TRASH_ID } from '../constants' + +import type { + TEMPERATURE_APPROACHING_TARGET, + TEMPERATURE_AT_TARGET, +} from '../constants' import type { LabwareDefinition2 } from '@opentrons/shared-data' import type { AdditionalEquipmentEntities } from '../types' import type { diff --git a/step-generation/src/getNextRobotStateAndWarnings/forConfigureNozzleLayout.ts b/step-generation/src/getNextRobotStateAndWarnings/forConfigureNozzleLayout.ts index dbfcb5f50e7..ec372615ac2 100644 --- a/step-generation/src/getNextRobotStateAndWarnings/forConfigureNozzleLayout.ts +++ b/step-generation/src/getNextRobotStateAndWarnings/forConfigureNozzleLayout.ts @@ -1,4 +1,4 @@ -import { NozzleConfigurationStyle } from '@opentrons/shared-data' +import type { NozzleConfigurationStyle } from '@opentrons/shared-data' import type { InvariantContext, RobotStateAndWarnings } from '../types' interface ConfigureNozzleLayoutParams { diff --git a/step-generation/src/getNextRobotStateAndWarnings/heaterShakerUpdates.ts b/step-generation/src/getNextRobotStateAndWarnings/heaterShakerUpdates.ts index 16f3c3ead23..8d8f5be586d 100644 --- a/step-generation/src/getNextRobotStateAndWarnings/heaterShakerUpdates.ts +++ b/step-generation/src/getNextRobotStateAndWarnings/heaterShakerUpdates.ts @@ -1,11 +1,11 @@ import { HEATERSHAKER_MODULE_TYPE } from '@opentrons/shared-data' import { getModuleState } from '../robotStateSelectors' -import { +import type { TemperatureParams, ShakeSpeedParams, ModuleOnlyParams, } from '@opentrons/shared-data/protocol/types/schemaV6/command/module' -import { +import type { HeaterShakerModuleState, InvariantContext, RobotState, diff --git a/step-generation/src/robotStateSelectors.ts b/step-generation/src/robotStateSelectors.ts index 4b1b0e9310e..68ad44b9009 100644 --- a/step-generation/src/robotStateSelectors.ts +++ b/step-generation/src/robotStateSelectors.ts @@ -5,7 +5,6 @@ import { getLabwareDefURI, THERMOCYCLER_MODULE_TYPE, orderWells, - NozzleConfigurationStyle, COLUMN, ALL, } from '@opentrons/shared-data' @@ -16,6 +15,7 @@ import type { RobotState, ThermocyclerModuleState, } from './types' +import type { NozzleConfigurationStyle } from '@opentrons/shared-data' export function sortLabwareBySlot( labwareState: RobotState['labware'] diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index 2ffb48bc192..ad1ea16df14 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -1,11 +1,9 @@ -import { +import type { MAGNETIC_MODULE_TYPE, TEMPERATURE_MODULE_TYPE, THERMOCYCLER_MODULE_TYPE, HEATERSHAKER_MODULE_TYPE, MAGNETIC_BLOCK_TYPE, -} from '@opentrons/shared-data' -import type { CreateCommand, LabwareDefinition2, ModuleType, diff --git a/step-generation/src/utils/getLabwareSlot.ts b/step-generation/src/utils/getLabwareSlot.ts index b6c3477acc3..e965e537d58 100644 --- a/step-generation/src/utils/getLabwareSlot.ts +++ b/step-generation/src/utils/getLabwareSlot.ts @@ -1,4 +1,4 @@ -import { RobotState } from '../types' +import type { RobotState } from '../types' // this function returns the slot a labware is in (which should be a string 1-12) // the reason this function is needed is because if a labware is on top of a module diff --git a/step-generation/src/utils/misc.ts b/step-generation/src/utils/misc.ts index 77d91213d63..cc2b51e6c25 100644 --- a/step-generation/src/utils/misc.ts +++ b/step-generation/src/utils/misc.ts @@ -7,7 +7,6 @@ import { getLabwareDefURI, getWellNamePerMultiTip, WASTE_CHUTE_CUTOUT, - PipetteChannels, ONE_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, EIGHT_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, NINETY_SIX_CHANNEL_WASTE_CHUTE_ADDRESSABLE_AREA, @@ -26,6 +25,7 @@ import type { AddressableAreaName, LabwareDefinition2, BlowoutParams, + PipetteChannels, } from '@opentrons/shared-data' import type { AdditionalEquipmentEntities, diff --git a/yarn.lock b/yarn.lock index 8427f656e8d..269ab6f11a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5850,6 +5850,16 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bar-horizontal@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/bar-horizontal/-/bar-horizontal-0.5.1.tgz#aa35a769cf89ee30bdf294b1d6b879c8199e97d1" + integrity sha512-xU8nq9JprzO6gUJUg2tTarFhciL8f4TSEujLLWJ9ziepJTHeoiET1SB0TVPvbbm41K+S8jpQvQ6AlXW7H2NtEA== + dependencies: + figures "1.7.0" + lodash ">=4.17.12" + meow "3.7.0" + window-size "0.1.4" + base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -6541,6 +6551,14 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ== + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + camelcase-keys@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" @@ -6559,6 +6577,11 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -8048,7 +8071,7 @@ decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -9140,7 +9163,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -9469,6 +9492,13 @@ eslint-config-standard@^16.0.2: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516" integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg== +eslint-formatter-summary-chart@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-formatter-summary-chart/-/eslint-formatter-summary-chart-0.3.0.tgz#d6da8c9ba18f09488efcff49d3287e3e4162b396" + integrity sha512-xRGVLIt5SjH0Tq3aPg7MA0xGPPIvKCNk9rqYhrgoQiHDPyaMmWDPz0176qAtBdhGfpiclhxkbuo/rrxZLf/U+g== + dependencies: + bar-horizontal "^0.5.1" + eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" @@ -10180,6 +10210,14 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +figures@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -10368,6 +10406,14 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -10786,6 +10832,11 @@ get-port@^5.1.1: resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw== + get-stdin@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" @@ -11967,6 +12018,13 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg== + dependencies: + repeating "^2.0.0" + indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" @@ -12348,6 +12406,11 @@ is-finalizationregistry@^1.0.2: dependencies: call-bind "^1.0.2" +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -12647,6 +12710,11 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" @@ -13290,6 +13358,17 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -13426,7 +13505,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@4.17.21, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.7.0: +lodash@4.17.21, lodash@>=4.17.12, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -13715,7 +13794,7 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== -map-obj@^1.0.0: +map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== @@ -13972,6 +14051,22 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +meow@3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA== + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" @@ -14399,7 +14494,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q== -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -15498,6 +15593,13 @@ parse-entities@^4.0.0: is-decimal "^2.0.0" is-hexadecimal "^2.0.0" +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -15563,6 +15665,13 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -15628,6 +15737,15 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -17323,6 +17441,14 @@ read-config-file@6.3.2: json5 "^2.2.0" lazy-val "^1.0.4" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -17340,6 +17466,15 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -17425,6 +17560,14 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g== + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + redent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" @@ -17734,6 +17877,13 @@ repeat-string@^1.5.4, repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== + dependencies: + is-finite "^1.0.0" + replace-ext@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" @@ -19185,6 +19335,13 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -19212,6 +19369,13 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA== + dependencies: + get-stdin "^4.0.1" + strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" @@ -19873,6 +20037,11 @@ trim-lines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw== + trim-newlines@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" @@ -21321,6 +21490,11 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +window-size@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw== + winston-transport@^4.2.0: version "4.7.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" From 643a9dd20e7d27a0a816e63536e5a8230185380f Mon Sep 17 00:00:00 2001 From: Alise Au <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 15 May 2024 14:38:32 -0400 Subject: [PATCH 03/10] feat(shared-data, api): add absorbance plate reader definition and module control (#15167) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Overview This PR adds support for the Absorbance Plate Reader in the hardware controller API. We can now see the plate reader as an attached module on the backend and use the AbsorbanceReaderDriver to communicate with the plate reader like we would with the other modules. # Caveat The driver is not fully finished - there are some functions that still need to be implemented and I expect the format of the response will change depending on how we implement the engine commands. We still need to add some changes on oe-core side to make sure this runs on all robot - however i'm happy to show you the plate reader in action at this time. --- api/Pipfile | 1 + api/Pipfile.lock | 201 +- .../drivers/absorbance_reader/__init__.py | 11 + .../drivers/absorbance_reader/abstract.py | 45 + .../drivers/absorbance_reader/async_byonoy.py | 272 ++ .../drivers/absorbance_reader/driver.py | 63 + .../drivers/absorbance_reader/hid_protocol.py | 115 + .../drivers/absorbance_reader/simulator.py | 55 + .../opentrons/drivers/rpi_drivers/types.py | 118 +- api/src/opentrons/drivers/rpi_drivers/usb.py | 20 +- api/src/opentrons/drivers/types.py | 16 + .../hardware_control/modules/__init__.py | 2 + .../modules/absorbance_reader.py | 172 + .../hardware_control/modules/types.py | 16 + .../hardware_control/modules/utils.py | 3 + .../absorbance_reader_substate.py | 20 + .../drivers/absorbance_reader/__init__.py | 0 .../drivers/absorbance_reader/test_driver.py | 168 + g-code-testing/Pipfile | 1 + g-code-testing/Pipfile.lock | 437 +- hardware-testing/Pipfile | 1 + hardware-testing/Pipfile.lock | 496 +-- robot-server/Pipfile | 1 + robot-server/Pipfile.lock | 217 +- .../definitions/3/absorbanceReaderV1.json | 3686 +++++++++++++++++ shared-data/module/schemas/3.json | 5 +- .../opentrons_shared_data/module/dev_types.py | 4 + 27 files changed, 5336 insertions(+), 810 deletions(-) create mode 100644 api/src/opentrons/drivers/absorbance_reader/__init__.py create mode 100644 api/src/opentrons/drivers/absorbance_reader/abstract.py create mode 100644 api/src/opentrons/drivers/absorbance_reader/async_byonoy.py create mode 100644 api/src/opentrons/drivers/absorbance_reader/driver.py create mode 100644 api/src/opentrons/drivers/absorbance_reader/hid_protocol.py create mode 100644 api/src/opentrons/drivers/absorbance_reader/simulator.py create mode 100644 api/src/opentrons/hardware_control/modules/absorbance_reader.py create mode 100644 api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py create mode 100644 api/tests/opentrons/drivers/absorbance_reader/__init__.py create mode 100644 api/tests/opentrons/drivers/absorbance_reader/test_driver.py create mode 100644 shared-data/module/definitions/3/absorbanceReaderV1.json diff --git a/api/Pipfile b/api/Pipfile index 7be11b82934..e37e6e1c5f9 100755 --- a/api/Pipfile +++ b/api/Pipfile @@ -11,6 +11,7 @@ opentrons-shared-data = { editable = true, path = "../shared-data/python" } opentrons = { editable = true, path = "." } opentrons-hardware = { editable = true, path = "./../hardware", extras=["FLEX"] } numpy = "==1.22.3" +pyusb = "==1.2.1" [dev-packages] # atomicwrites and colorama are pytest dependencies on windows, diff --git a/api/Pipfile.lock b/api/Pipfile.lock index 94643ce22a7..b08815e2656 100644 --- a/api/Pipfile.lock +++ b/api/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a531665bfd7452ea19565ee95137118966532a8ab5475b7d5ee086ada333e627" + "sha256": "8a1eb02e26b3ae9d690880546729375c7b74c8e53a8f1806eefdbeac5829dc67" }, "pipfile-spec": 6, "requires": {}, @@ -48,11 +48,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" ], "markers": "python_version < '3.11'", - "version": "==1.2.0" + "version": "==1.2.1" }, "idna": { "hashes": [ @@ -162,7 +162,7 @@ }, "opentrons": { "editable": true, - "markers": "python_version >= '3.8'", + "markers": "python_version >= '3.10'", "path": "." }, "opentrons-hardware": { @@ -174,7 +174,7 @@ }, "opentrons-shared-data": { "editable": true, - "markers": "python_version >= '3.8'", + "markers": "python_version >= '3.10'", "path": "../shared-data/python" }, "packaging": { @@ -280,6 +280,15 @@ ], "version": "==4.2.2" }, + "pyusb": { + "hashes": [ + "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36", + "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9" + ], + "index": "pypi", + "markers": "python_full_version >= '3.6.0'", + "version": "==1.2.1" + }, "setuptools": { "hashes": [ "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", @@ -408,19 +417,19 @@ }, "babel": { "hashes": [ - "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", - "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" + "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", + "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" ], - "markers": "python_version >= '3.7'", - "version": "==2.14.0" + "markers": "python_version >= '3.8'", + "version": "==2.15.0" }, "backports.tarfile": { "hashes": [ - "sha256:2688f159c21afd56a07b75f01306f9f52c79aebcc5f4a117fb8fbb4445352c75", - "sha256:bcd36290d9684beb524d3fe74f4a2db056824c47746583f090b8e55daf0776e4" + "sha256:73e0179647803d3726d82e76089d01d8549ceca9bace469953fcb4d97cf2d417", + "sha256:9c2ef9696cb73374f7164e17fc761389393ca76777036f5aad42e8b93fcd8009" ], "markers": "python_version < '3.12'", - "version": "==1.0.0" + "version": "==1.1.1" }, "black": { "hashes": [ @@ -460,64 +469,6 @@ "markers": "python_version >= '3.6'", "version": "==2024.2.2" }, - "cffi": { - "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" - ], - "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" - }, "charset-normalizer": { "hashes": [ "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", @@ -742,44 +693,6 @@ "markers": "python_version >= '3.8'", "version": "==7.4.1" }, - "cryptography": { - "hashes": [ - "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee", - "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576", - "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d", - "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30", - "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413", - "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb", - "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da", - "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4", - "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd", - "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc", - "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8", - "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1", - "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc", - "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e", - "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8", - "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940", - "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400", - "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7", - "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16", - "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278", - "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74", - "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec", - "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1", - "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2", - "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c", - "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922", - "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a", - "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6", - "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1", - "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e", - "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac", - "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7" - ], - "markers": "python_version >= '3.7'", - "version": "==42.0.5" - }, "cycler": { "hashes": [ "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", @@ -807,11 +720,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" ], "markers": "python_version < '3.11'", - "version": "==1.2.0" + "version": "==1.2.1" }, "execnet": { "hashes": [ @@ -972,19 +885,11 @@ }, "jaraco.functools": { "hashes": [ - "sha256:c279cb24c93d694ef7270f970d499cab4d3813f4e08273f95398651a634f0925", - "sha256:daf276ddf234bea897ef14f43c4e1bf9eefeac7b7a82a4dd69228ac20acff68d" + "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664", + "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8" ], "markers": "python_version >= '3.8'", - "version": "==4.0.0" - }, - "jeepney": { - "hashes": [ - "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", - "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" - ], - "markers": "sys_platform == 'linux'", - "version": "==0.8.0" + "version": "==4.0.1" }, "jinja2": { "hashes": [ @@ -1006,11 +911,11 @@ }, "keyring": { "hashes": [ - "sha256:26fc12e6a329d61d24aa47b22a7c5c3f35753df7d8f2860973cf94f4e1fb3427", - "sha256:7230ea690525133f6ad536a9b5def74a4bd52642abe594761028fc044d7c7893" + "sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50", + "sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b" ], "markers": "python_version >= '3.8'", - "version": "==25.1.0" + "version": "==25.2.1" }, "kiwisolver": { "hashes": [ @@ -1362,7 +1267,7 @@ }, "opentrons-shared-data": { "editable": true, - "markers": "python_version >= '3.8'", + "markers": "python_version >= '3.10'", "path": "../shared-data/python" }, "packaging": { @@ -1470,19 +1375,19 @@ }, "platformdirs": { "hashes": [ - "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", + "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1" ], "markers": "python_version >= '3.8'", - "version": "==4.2.0" + "version": "==4.2.1" }, "pluggy": { "hashes": [ - "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", - "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" ], "markers": "python_version >= '3.8'", - "version": "==1.4.0" + "version": "==1.5.0" }, "py": { "hashes": [ @@ -1500,14 +1405,6 @@ "markers": "python_version >= '3.8'", "version": "==2.11.1" }, - "pycparser": { - "hashes": [ - "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" - ], - "markers": "python_version >= '3.8'", - "version": "==2.22" - }, "pydantic": { "hashes": [ "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303", @@ -1569,11 +1466,11 @@ }, "pygments": { "hashes": [ - "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", - "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" ], - "markers": "python_version >= '3.7'", - "version": "==2.17.2" + "markers": "python_version >= '3.8'", + "version": "==2.18.0" }, "pyparsing": { "hashes": [ @@ -1731,14 +1628,6 @@ "markers": "python_full_version >= '3.7.0'", "version": "==13.7.1" }, - "secretstorage": { - "hashes": [ - "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", - "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99" - ], - "markers": "sys_platform == 'linux'", - "version": "==3.3.3" - }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", @@ -1878,12 +1767,12 @@ }, "types-mock": { "hashes": [ - "sha256:0769cb376dfc75b45215619f17a9fd6333d771cc29ce4a38937f060b1e45530f", - "sha256:7472797986d83016f96fde7f73577d129b0cd8a8d0b783487a7be330d57ba431" + "sha256:5281a645d72e827d70043e3cc144fe33b1c003db084f789dc203aa90e812a5a4", + "sha256:d586a01d39ad919d3ddcd73de6cde73ca7f3c69707219f722d1b8d7733641ad7" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.1.0.20240311" + "version": "==5.1.0.20240425" }, "types-setuptools": { "hashes": [ diff --git a/api/src/opentrons/drivers/absorbance_reader/__init__.py b/api/src/opentrons/drivers/absorbance_reader/__init__.py new file mode 100644 index 00000000000..9b127df97b3 --- /dev/null +++ b/api/src/opentrons/drivers/absorbance_reader/__init__.py @@ -0,0 +1,11 @@ +from .abstract import AbstractAbsorbanceReaderDriver +from .driver import AbsorbanceReaderDriver +from .simulator import SimulatingDriver +from .hid_protocol import AbsorbanceHidInterface + +__all__ = [ + "AbstractAbsorbanceReaderDriver", + "AbsorbanceReaderDriver", + "SimulatingDriver", + "AbsorbanceHidInterface", +] diff --git a/api/src/opentrons/drivers/absorbance_reader/abstract.py b/api/src/opentrons/drivers/absorbance_reader/abstract.py new file mode 100644 index 00000000000..769de38253e --- /dev/null +++ b/api/src/opentrons/drivers/absorbance_reader/abstract.py @@ -0,0 +1,45 @@ +from abc import ABC, abstractmethod +from typing import Dict, List +from opentrons.drivers.types import AbsorbanceReaderLidStatus + + +class AbstractAbsorbanceReaderDriver(ABC): + @abstractmethod + async def connect(self) -> None: + """Connect to absorbance reader""" + ... + + @abstractmethod + async def disconnect(self) -> None: + """Disconnect from absorbance reader""" + ... + + @abstractmethod + async def is_connected(self) -> bool: + """Check connection to absorbance reader""" + ... + + @abstractmethod + async def get_lid_status(self) -> AbsorbanceReaderLidStatus: + ... + + @abstractmethod + async def get_available_wavelengths(self) -> List[int]: + ... + + @abstractmethod + async def get_single_measurement(self, wavelength: int) -> List[float]: + ... + + @abstractmethod + async def initialize_measurement(self, wavelength: int) -> None: + ... + + @abstractmethod + async def get_status(self) -> None: + ... + + @abstractmethod + async def get_device_info(self) -> Dict[str, str]: + """Get device info""" + ... diff --git a/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py new file mode 100644 index 00000000000..1d5465db342 --- /dev/null +++ b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py @@ -0,0 +1,272 @@ +from __future__ import annotations + +import asyncio +import re +from concurrent.futures.thread import ThreadPoolExecutor +from functools import partial +from typing import Optional, List, Dict +import usb.core as usb_core # type: ignore[import-untyped] + + +from .hid_protocol import AbsorbanceHidInterface as AbsProtocol, ErrorCodeNames +from opentrons.drivers.types import ( + AbsorbanceReaderLidStatus, + AbsorbanceReaderPlatePresence, +) +from opentrons.drivers.rpi_drivers.types import USBPort + + +SN_PARSER = re.compile(r'ATTRS{serial}=="(?P.+?)"') + + +class AsyncByonoy: + """Async wrapper around Byonoy Device Library.""" + + @staticmethod + def match_device_with_sn( + sn: str, devices: List[AbsProtocol.Device] + ) -> AbsProtocol.Device: + for device in devices: + if device.sn == sn: + return device + raise RuntimeError(f"Unavailble module with serial number: {sn}") + + @staticmethod + def serial_number_from_port(name: str) -> str: + """ + Get the serial number from a port using pyusb. + """ + port_numbers = tuple(int(s) for s in name.split("-")[1].split(".")) + device = usb_core.find(port_numbers=port_numbers) + if device: + return str(device.serial_number) + raise RuntimeError(f"Could not find serial number for port: {name}") + + @classmethod + async def create( + cls, + port: str, + usb_port: USBPort, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> AsyncByonoy: + """ + Create an AsyncByonoy instance. + + Args: + port: url or port name + baud_rate: the baud rate + timeout: optional timeout in seconds + write_timeout: optional write timeout in seconds + loop: optional event loop. if None get_running_loop will be used + reset_buffer_before_write: reset the serial input buffer before + writing to it + """ + loop = loop or asyncio.get_running_loop() + executor = ThreadPoolExecutor(max_workers=1) + + import pybyonoy_device_library as byonoy # type: ignore[import-not-found] + + interface: AbsProtocol = byonoy + + device_sn = cls.serial_number_from_port(usb_port.name) + found: List[AbsProtocol.Device] = await loop.run_in_executor( + executor=executor, func=byonoy.byonoy_available_devices + ) + device = cls.match_device_with_sn(device_sn, found) + + return cls( + interface=interface, + device=device, + executor=executor, + loop=loop, + ) + + def __init__( + self, + interface: AbsProtocol, + device: AbsProtocol.Device, + executor: ThreadPoolExecutor, + loop: asyncio.AbstractEventLoop, + ) -> None: + """ + Constructor + + Args: + serial: connected Serial object + executor: a thread pool executor + loop: event loop + """ + self._interface = interface + self._device = device + self._executor = executor + self._loop = loop + self._supported_wavelengths: Optional[list[int]] = None + self._device_handle: Optional[int] = None + self._current_config: Optional[AbsProtocol.MeasurementConfig] = None + + def _cleanup(self) -> None: + self._device_handle = None + + def _open(self) -> None: + err, device_handle = self._interface.byonoy_open_device(self._device) + if err.name != "BYONOY_ERROR_NO_ERROR": + raise RuntimeError(f"Error opening device: {err}") + self._device_handle = device_handle + + def _free(self) -> None: + if self._device_handle: + self._interface.byonoy_free_device(self._device_handle) + self._cleanup() + + def verify_device_handle(self) -> int: + assert self._device_handle is not None, RuntimeError( + "Device handle not set up." + ) + return self._device_handle + + def _raise_if_error( + self, + err_name: ErrorCodeNames, + msg: str = "Error occurred: ", + ) -> None: + if err_name != "BYONOY_ERROR_NO_ERROR": + raise RuntimeError(msg, err_name) + + def _get_device_information(self) -> AbsProtocol.DeviceInfo: + handle = self.verify_device_handle() + err, device_info = self._interface.byonoy_get_device_information(handle) + self._raise_if_error(err.name, "Error getting device information: ") + return device_info + + def _get_device_status(self) -> AbsProtocol.DeviceState: + handle = self.verify_device_handle() + err, status = self._interface.byonoy_get_device_status(handle) + self._raise_if_error(err.name, "Error getting device status: ") + return status + + def _get_slot_status(self) -> AbsProtocol.SlotState: + handle = self.verify_device_handle() + err, slot_status = self._interface.byonoy_get_device_slot_status(handle) + self._raise_if_error(err.name, "Error getting slot status: ") + return slot_status + + def _get_lid_status(self) -> bool: + handle = self.verify_device_handle() + lid_on: bool + err, lid_on = self._interface.byonoy_get_device_parts_aligned(handle) + self._raise_if_error(err.name, "Error getting lid status: ") + return lid_on + + def _get_supported_wavelengths(self) -> List[int]: + handle = self.verify_device_handle() + wavelengths: List[int] + err, wavelengths = self._interface.byonoy_abs96_get_available_wavelengths( + handle + ) + self._raise_if_error(err.name, "Error getting available wavelengths: ") + self._supported_wavelengths = wavelengths + return wavelengths + + def _initialize_measurement(self, conf: AbsProtocol.MeasurementConfig) -> None: + handle = self.verify_device_handle() + err = self._interface.byonoy_abs96_initialize_single_measurement(handle, conf) + self._raise_if_error(err.name, "Error initializing measurement: ") + self._current_config = conf + + def _single_measurement(self, conf: AbsProtocol.MeasurementConfig) -> List[float]: + handle = self.verify_device_handle() + measurements: List[float] + err, measurements = self._interface.byonoy_abs96_single_measure(handle, conf) + self._raise_if_error(err.name, "Error getting single measurement: ") + return measurements + + def _set_sample_wavelength(self, wavelength: int) -> AbsProtocol.MeasurementConfig: + if not self._supported_wavelengths: + self._get_supported_wavelengths() + assert self._supported_wavelengths + if wavelength in self._supported_wavelengths: + conf = self._interface.ByonoyAbs96SingleMeasurementConfig() + conf.sample_wavelength = wavelength + return conf + else: + raise ValueError( + f"Unsupported wavelength: {wavelength}, expected: {self._supported_wavelengths}" + ) + + def _initialize(self, wavelength: int) -> None: + conf = self._set_sample_wavelength(wavelength) + self._initialize_measurement(conf) + + def _get_single_measurement(self, wavelength: int) -> List[float]: + initialized = self._current_config + assert initialized and initialized.sample_wavelength == wavelength + return self._single_measurement(initialized) + + async def open(self) -> None: + """ + Open the connection. + + Returns: None + """ + return await self._loop.run_in_executor( + executor=self._executor, func=self._open + ) + + async def close(self) -> None: + """ + Close the connection + + Returns: None + """ + await self._loop.run_in_executor(executor=self._executor, func=self._free) + + async def is_open(self) -> bool: + """ + Check if connection is open. + + Returns: boolean + """ + return self._device_handle is not None + + async def get_device_static_info(self) -> Dict[str, str]: + return { + "serial": self._device.sn, + "model": "ABS96", + } + + async def get_device_information(self) -> Dict[str, str]: + device_info = await self._loop.run_in_executor( + executor=self._executor, func=self._get_device_information + ) + return { + "serial_number": device_info.sn, + "reference_number": device_info.ref_no, + "version": device_info.version, + } + + async def get_lid_status(self) -> AbsorbanceReaderLidStatus: + lid_info = await self._loop.run_in_executor( + executor=self._executor, func=self._get_lid_status + ) + return ( + AbsorbanceReaderLidStatus.ON if lid_info else AbsorbanceReaderLidStatus.OFF + ) + + async def get_supported_wavelengths(self) -> list[int]: + return await self._loop.run_in_executor( + executor=self._executor, func=self._get_supported_wavelengths + ) + + async def initialize(self, wavelength: int) -> None: + return await self._loop.run_in_executor( + executor=self._executor, func=partial(self._initialize, wavelength) + ) + + async def get_single_measurement(self, wavelength: int) -> List[float]: + return await self._loop.run_in_executor( + executor=self._executor, + func=partial(self._get_single_measurement, wavelength), + ) + + async def get_plate_presence(self) -> AbsorbanceReaderPlatePresence: + return AbsorbanceReaderPlatePresence.UNKNOWN diff --git a/api/src/opentrons/drivers/absorbance_reader/driver.py b/api/src/opentrons/drivers/absorbance_reader/driver.py new file mode 100644 index 00000000000..538bc83d70d --- /dev/null +++ b/api/src/opentrons/drivers/absorbance_reader/driver.py @@ -0,0 +1,63 @@ +from __future__ import annotations + +import asyncio +from typing import Dict, Optional, List + +from opentrons.drivers.types import AbsorbanceReaderLidStatus +from opentrons.drivers.absorbance_reader.abstract import AbstractAbsorbanceReaderDriver +from opentrons.drivers.rpi_drivers.types import USBPort +from .async_byonoy import AsyncByonoy + + +class AbsorbanceReaderDriver(AbstractAbsorbanceReaderDriver): + @classmethod + async def create( + cls, + port: str, + usb_port: USBPort, + loop: Optional[asyncio.AbstractEventLoop], + ) -> AbsorbanceReaderDriver: + """Create an absorbance reader driver.""" + from .async_byonoy import AsyncByonoy + + connection = await AsyncByonoy.create(port=port, usb_port=usb_port, loop=loop) + return cls(connection=connection) + + def __init__(self, connection: AsyncByonoy) -> None: + self._connection = connection + + async def get_device_info(self) -> Dict[str, str]: + """Get device info""" + connected = await self.is_connected() + if not connected: + info = await self._connection.get_device_static_info() + else: + info = await self._connection.get_device_information() + return info + + async def connect(self) -> None: + """Connect to absorbance reader""" + await self._connection.open() + + async def disconnect(self) -> None: + """Disconnect from absorbance reader""" + await self._connection.close() + + async def is_connected(self) -> bool: + """Check connection to absorbance reader""" + return await self._connection.is_open() + + async def get_lid_status(self) -> AbsorbanceReaderLidStatus: + return await self._connection.get_lid_status() + + async def get_available_wavelengths(self) -> List[int]: + return await self._connection.get_supported_wavelengths() + + async def get_single_measurement(self, wavelength: int) -> List[float]: + return await self._connection.get_single_measurement(wavelength) + + async def initialize_measurement(self, wavelength: int) -> None: + await self._connection.initialize(wavelength) + + async def get_status(self) -> None: + pass diff --git a/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py b/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py new file mode 100644 index 00000000000..6ddd82aa030 --- /dev/null +++ b/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py @@ -0,0 +1,115 @@ +from typing import ( + Dict, + Protocol, + List, + Literal, + Tuple, + ClassVar, + runtime_checkable, + TypeVar, +) + +Response = TypeVar("Response") + +ErrorCodeNames = Literal[ + "BYONOY_ERROR_NO_ERROR", + "BYONOY_ERROR_UNKNOWN_ERROR", + "BYONOY_ERROR_DEVICE_CLOSED", + "BYONOY_ERROR_INVALID_ARGUMENT", + "BYONOY_ERROR_NO_MEMORY", + "BYONOY_ERROR_UNSUPPORTED_OPERATION", + "BYONOY_ERROR_DEVICE_COMMUNICATION_FAILURE", + "BYONOY_ERROR_DEVICE_OPERATION_FAILED", + "BYONOY_ERROR_DEVICE_OPEN_PREFIX", + "BYONOY_ERROR_DEVICE_NOT_FOUND", + "BYONOY_ERROR_DEVICE_TOO_NEW", + "BYONOY_ERROR_DEVICE_ALREADY_OPEN", + "BYONOY_ERROR_FIRMWARE_UPDATE_ERROR_PREFIX", + "BYONOY_ERROR_FIRMWARE_UPDATE_FILE_NOT_FOUND", + "BYONOY_ERROR_FIRMWARE_UPDATE_FILE_NOT_VALID", + "BYONOY_ERROR_FIRMWARE_UPDATE_FAILED", + "BYONOY_ERROR_FILE_ERROR_PREFIX", + "BYONOY_ERROR_FILE_WRITE_ERROR", + "BYONOY_ERROR_MEASUTEMNT_ERROR_PREFIX", + "BYONOY_ERROR_MEASUTEMNT_SLOT_NOT_EMPTY", + "BYONOY_ERROR_NOT_INITIALIZED", + "BYONOY_ERROR_INTERNAL", +] + + +@runtime_checkable +class AbsorbanceHidInterface(Protocol): + @runtime_checkable + class Device(Protocol): + sn: str + + @runtime_checkable + class ErrorCode(Protocol): + __members__: Dict[ErrorCodeNames, int] + name: ErrorCodeNames + value: int + + @runtime_checkable + class SlotState(Protocol): + __members__: ClassVar[Dict[str, int]] + + @runtime_checkable + class MeasurementConfig(Protocol): + sample_wavelength: int + + @runtime_checkable + class DeviceInfo(Protocol): + ref_no: str + sn: str + version: str + + @runtime_checkable + class DeviceState(Protocol): + __members__: ClassVar[Dict[str, int]] + + def ByonoyAbs96SingleMeasurementConfig(self) -> MeasurementConfig: + ... + + def byonoy_open_device(self, device: Device) -> Tuple[ErrorCode, int]: + ... + + def byonoy_free_device(self, device_handle: int) -> Tuple[ErrorCode, bool]: + ... + + def byonoy_get_device_information( + self, device_handle: int + ) -> Tuple[ErrorCode, DeviceInfo]: + ... + + def byonoy_get_device_status( + self, device_handle: int + ) -> Tuple[ErrorCode, DeviceState]: + ... + + def byonoy_get_device_slot_status( + self, device_handle: int + ) -> Tuple[ErrorCode, SlotState]: + ... + + def byonoy_get_device_parts_aligned( + self, device_handle: int + ) -> Tuple[ErrorCode, bool]: + ... + + def byonoy_abs96_get_available_wavelengths( + self, device_handle: int + ) -> Tuple[ErrorCode, List[int]]: + ... + + def byonoy_abs96_initialize_single_measurement( + self, device_handle: int, conf: MeasurementConfig + ) -> ErrorCode: + ... + + def byonoy_abs96_single_measure( + self, device_handle: int, conf: MeasurementConfig + ) -> Tuple[ErrorCode, List[float]]: + ... + + def byonoy_available_devices(self) -> List[Device]: + ... diff --git a/api/src/opentrons/drivers/absorbance_reader/simulator.py b/api/src/opentrons/drivers/absorbance_reader/simulator.py new file mode 100644 index 00000000000..b189030b653 --- /dev/null +++ b/api/src/opentrons/drivers/absorbance_reader/simulator.py @@ -0,0 +1,55 @@ +from typing import Dict, List, Optional +from opentrons.util.async_helpers import ensure_yield + +from opentrons.drivers.types import AbsorbanceReaderLidStatus + +from .abstract import AbstractAbsorbanceReaderDriver + + +class SimulatingDriver(AbstractAbsorbanceReaderDriver): + def __init__(self, serial_number: Optional[str] = None) -> None: + self._serial_number = serial_number + + @ensure_yield + async def get_device_info(self) -> Dict[str, str]: + """Get device info""" + return { + "serial": self._serial_number if self._serial_number else "dummySerialAR", + "model": "dummyModelAR", + "version": "dummyVersionAR", + } + + @ensure_yield + async def connect(self) -> None: + """Connect to absorbance reader""" + pass + + @ensure_yield + async def disconnect(self) -> None: + """Disconnect from absorbance reader""" + pass + + @ensure_yield + async def is_connected(self) -> bool: + """Check connection to absorbance reader""" + return True + + @ensure_yield + async def get_lid_status(self) -> AbsorbanceReaderLidStatus: + return AbsorbanceReaderLidStatus.ON + + @ensure_yield + async def get_available_wavelengths(self) -> List[int]: + return [450, 570, 600, 650] + + @ensure_yield + async def get_single_measurement(self, wavelength: int) -> List[float]: + return [0.0] + + @ensure_yield + async def initialize_measurement(self, wavelength: int) -> None: + pass + + @ensure_yield + async def get_status(self) -> None: + pass diff --git a/api/src/opentrons/drivers/rpi_drivers/types.py b/api/src/opentrons/drivers/rpi_drivers/types.py index 5c36d0109c2..acb177a05b4 100644 --- a/api/src/opentrons/drivers/rpi_drivers/types.py +++ b/api/src/opentrons/drivers/rpi_drivers/types.py @@ -1,5 +1,6 @@ from __future__ import annotations import enum +import re from itertools import groupby from dataclasses import dataclass from typing import List, Optional, Tuple @@ -27,6 +28,26 @@ class PortGroup: FLEX_B2_USB_PORT_GROUP_FRONT = 7 FLEX_B2_USB_PORTS = {"4": 1, "3": 2, "2": 3, "1": 4} +BUS_PATH = "/sys/bus/usb/devices/usb1/" + +# Example usb path might look like: +# '/sys/bus/usb/devices/usb1/1-1/1-1.3/1-1.3:1.0/tty/ttyACM1/dev'. +# Example hid device path might look like: +# '/sys/bus/usb/devices/usb1/1-1/1-1.3/1-1.3:1.0/0003:16D0:1199.0002/hidraw/hidraw0/dev' +# There is only 1 bus that supports USB on the raspberry pi. +USB_PORT_INFO = re.compile( + r""" + (?P(\d[\d]*-\d[\d\.]*[/]?)+): + (?P + \d.\d/ + (tty/tty(\w{4})/dev | [\w:\.]+?/hidraw/hidraw\d/dev) + ) + """, + re.VERBOSE, +) + +HUB_PATTERN = re.compile(r"(\d-[\d.]+\d?)[\/:]") + @dataclass(frozen=True) class USBPort: @@ -38,7 +59,9 @@ class USBPort: device_path: str = "" @classmethod - def build(cls, port_path: str, board_revision: BoardRevision) -> "USBPort": + def build( + cls, full_path: str, board_revision: BoardRevision + ) -> Optional["USBPort"]: """ Build a USBPort dataclass. @@ -52,8 +75,13 @@ def build(cls, port_path: str, board_revision: BoardRevision) -> "USBPort": Returns: Tuple of the port number, port group, hub, hub port, device path, and name """ - full_name, device_path = port_path.split(":") - port_nodes = cls.get_unique_nodes(full_name) + match = USB_PORT_INFO.search(full_path) + if not match: + return None + + port_path = match.group("port_path") + device_path = match.group("device_path") + port_nodes = cls.get_unique_nodes(port_path) hub, port, hub_port, name = cls.find_hub(port_nodes, board_revision) hub, port_group, port, hub_port = cls.map_to_revision( board_revision, @@ -91,43 +119,52 @@ def find_hub( :param port_nodes: A list of unique port id(s) :returns: Tuple of the hub, port number, hub_port and name """ - if len(port_nodes) > 2: - port_info = port_nodes[2].split(".") - hub: Optional[int] = int(port_info[1]) - port = int(port_info[2]) - hub_port: Optional[int] = int(port_info[3]) - name = port_nodes[2] - elif len(port_nodes) > 1: - if board_revision == BoardRevision.OG: - port_info = port_nodes[1].split(".") + if len(port_nodes) == 1 and "." not in port_nodes[0]: + # if no hub is attached, such as on a dev kit, the port + # nodes available will be 1-1 + port = int(port_nodes[0].split("-")[1]) + hub = None + hub_port = None + name = port_nodes[0] + else: + port_nodes = [node for node in port_nodes if "." in node] + if len(port_nodes) > 2: + port_info = port_nodes[2].split(".") hub = int(port_info[1]) - port = int(port_info[1]) - hub_port = int(port_info[2]) - name = port_nodes[1] + port = int(port_info[2]) + hub_port = int(port_info[3]) + name = port_nodes[2] + elif len(port_nodes) > 1: + if board_revision == BoardRevision.OG: + port_info = port_nodes[1].split(".") + hub = int(port_info[1]) + port = int(port_info[1]) + hub_port = int(port_info[2]) + name = port_nodes[1] + else: + port_info = port_nodes[1].split(".") + hub = int(port_info[1]) + name = port_nodes[1] + if (board_revision == BoardRevision.FLEX_B2) and ( + hub == FLEX_B2_USB_PORT_GROUP_FRONT + ): + port = 9 + hub_port = int(port_info[2]) + else: + port = int(port_info[2]) + hub_port = None else: - port_info = port_nodes[1].split(".") - hub = int(port_info[1]) - name = port_nodes[1] - if (board_revision == BoardRevision.FLEX_B2) and ( - hub == FLEX_B2_USB_PORT_GROUP_FRONT - ): + if board_revision == BoardRevision.FLEX_B2: + port_info = port_nodes[0].split(".") + hub = int(port_info[1]) port = 9 - hub_port = int(port_info[2]) + hub_port = None + name = port_nodes[0] else: - port = int(port_info[2]) + port = int(port_nodes[0].split(".")[1]) + hub = None hub_port = None - else: - if board_revision == BoardRevision.FLEX_B2: - port_info = port_nodes[0].split(".") - hub = int(port_info[1]) - port = 9 - hub_port = None - name = port_nodes[0] - else: - port = int(port_nodes[0].split(".")[1]) - hub = None - hub_port = None - name = port_nodes[0] + name = port_nodes[0] return hub, port, hub_port, name @staticmethod @@ -161,11 +198,12 @@ def get_unique_nodes(full_name: str) -> List[str]: :param full_name: Full path of the physical USB Path :returns: List of separated USB port paths """ - port_nodes = [] - for node in full_name.split("/"): - if node not in port_nodes: - port_nodes.append(node) - return port_nodes + all_match = HUB_PATTERN.findall(full_name) + match_set = [] + for match in all_match: + if match not in match_set: + match_set.append(match) + return match_set @staticmethod def map_to_revision( diff --git a/api/src/opentrons/drivers/rpi_drivers/usb.py b/api/src/opentrons/drivers/rpi_drivers/usb.py index 04ee5496c4a..b2446a96b73 100644 --- a/api/src/opentrons/drivers/rpi_drivers/usb.py +++ b/api/src/opentrons/drivers/rpi_drivers/usb.py @@ -6,7 +6,6 @@ """ import subprocess -import re import os from typing import List, Union @@ -17,16 +16,7 @@ from opentrons.hardware_control.types import BoardRevision from .interfaces import USBDriverInterface -from .types import USBPort - - -# Example usb path might look like: -# '/sys/bus/usb/devices/usb1/1-1/1-1.3/1-1.3:1.0/tty/ttyACM1/dev'. -# There is only 1 bus that supports USB on the raspberry pi. -BUS_PATH = "/sys/bus/usb/devices/usb1/" -PORT_PATTERN = r"(/\d-\d(\.?\d)+)+:" -DEVICE_PATH = r"\d.\d/tty/tty(\w{4})/dev" -USB_PORT_INFO = re.compile(PORT_PATTERN + DEVICE_PATH) +from .types import BUS_PATH, USBPort class USBBus(USBDriverInterface): @@ -73,11 +63,9 @@ def _read_usb_bus(self) -> List[USBPort]: active_ports = self._read_bus() port_matches = [] for port in active_ports: - match = USB_PORT_INFO.search(port) - if match: - port_matches.append( - USBPort.build(match.group(0).strip("/"), self._board_revision) - ) + usb_port = USBPort.build(port.strip("/"), self._board_revision) + if usb_port: + port_matches.append(usb_port) return port_matches def match_virtual_ports( diff --git a/api/src/opentrons/drivers/types.py b/api/src/opentrons/drivers/types.py index 7186025dc35..09691ff051f 100644 --- a/api/src/opentrons/drivers/types.py +++ b/api/src/opentrons/drivers/types.py @@ -58,3 +58,19 @@ class ThermocyclerLidStatus(str, Enum): IN_BETWEEN = "in_between" OPEN = "open" MAX = "max" + + +class AbsorbanceReaderLidStatus(str, Enum): + """Absorbance reader lid status.""" + + UNKNOWN = "unknown" + ON = "on" + OFF = "off" + + +class AbsorbanceReaderPlatePresence(str, Enum): + """Absorbance reader plate presence.""" + + UNKNOWN = "unknown" + PRESENT = "present" + ABSENCE = "absence" diff --git a/api/src/opentrons/hardware_control/modules/__init__.py b/api/src/opentrons/hardware_control/modules/__init__.py index 8675bc59de9..3e4c14f0baf 100644 --- a/api/src/opentrons/hardware_control/modules/__init__.py +++ b/api/src/opentrons/hardware_control/modules/__init__.py @@ -3,6 +3,7 @@ from .magdeck import MagDeck from .thermocycler import Thermocycler from .heater_shaker import HeaterShaker +from .absorbance_reader import AbsorbanceReader from .update import update_firmware from .utils import MODULE_TYPE_BY_NAME, build from .types import ( @@ -45,4 +46,5 @@ "HeaterShakerStatus", "SpeedStatus", "LiveData", + "AbsorbanceReader", ] diff --git a/api/src/opentrons/hardware_control/modules/absorbance_reader.py b/api/src/opentrons/hardware_control/modules/absorbance_reader.py new file mode 100644 index 00000000000..8f3c65e3ace --- /dev/null +++ b/api/src/opentrons/hardware_control/modules/absorbance_reader.py @@ -0,0 +1,172 @@ +import asyncio +from typing import Optional, Mapping, List, Dict, Any, Tuple + +from opentrons.drivers.rpi_drivers.types import USBPort +from opentrons.drivers.absorbance_reader import ( + AbstractAbsorbanceReaderDriver, + AbsorbanceReaderDriver, + SimulatingDriver, +) +from opentrons.hardware_control.execution_manager import ExecutionManager +from opentrons.hardware_control.modules import mod_abc +from opentrons.hardware_control.modules.types import ( + ModuleType, + AbsorbanceReaderStatus, + LiveData, + UploadFunction, +) + + +async def upload_func_placeholder( + dfu_serial: str, firmware_file_path: str, kwargs: Dict[str, Any] +) -> Tuple[bool, str]: + return False, "Not implemented" + + +class AbsorbanceReader(mod_abc.AbstractModule): + """Hardware control interface for an attached Absorbance Reader module.""" + + MODULE_TYPE = ModuleType.ABSORBANCE_READER + + @classmethod + async def build( + cls, + port: str, + usb_port: USBPort, + execution_manager: ExecutionManager, + hw_control_loop: asyncio.AbstractEventLoop, + poll_interval_seconds: Optional[float] = None, + simulating: bool = False, + sim_model: Optional[str] = None, + sim_serial_number: Optional[str] = None, + ) -> "AbsorbanceReader": + """Create an AbsorbanceReader.""" + driver: AbstractAbsorbanceReaderDriver + if not simulating: + driver = await AbsorbanceReaderDriver.create( + port, usb_port, hw_control_loop + ) + else: + driver = SimulatingDriver(serial_number=sim_serial_number) + module = cls( + port=port, + usb_port=usb_port, + device_info=await driver.get_device_info(), + execution_manager=execution_manager, + driver=driver, + hw_control_loop=hw_control_loop, + ) + return module + + def __init__( + self, + port: str, + usb_port: USBPort, + driver: AbstractAbsorbanceReaderDriver, + device_info: Mapping[str, str], + execution_manager: ExecutionManager, + hw_control_loop: asyncio.AbstractEventLoop, + ) -> None: + super().__init__(port, usb_port, execution_manager, hw_control_loop) + self._driver = driver + self._device_info = device_info + + async def deactivate(self, must_be_running: bool = True) -> None: + """Deactivate the module. + + Contains an override to the `wait_for_is_running` step in cases where the + module must be deactivated regardless of context.""" + await self._driver.disconnect() + + @property + def status(self) -> AbsorbanceReaderStatus: + """Return some string describing status.""" + return AbsorbanceReaderStatus.IDLE + + @property + def device_info(self) -> Mapping[str, str]: + """Return a dict of the module's static information (serial, etc)""" + return self._device_info + + @property + def live_data(self) -> LiveData: + """Return a dict of the module's dynamic information""" + return { + "status": "idle", + "data": { + "sampleWavelength": 400, + }, + } + + @property + def is_simulated(self) -> bool: + """True if this is a simulated module.""" + return isinstance(self._driver, SimulatingDriver) + + @property + def port(self) -> str: + """The virtual port where the module is connected.""" + return self._port + + @property + def usb_port(self) -> USBPort: + """The physical port where the module is connected.""" + return self._usb_port + + async def wait_for_is_running(self) -> None: + if not self.is_simulated: + await self._execution_manager.wait_for_is_running() + + async def prep_for_update(self) -> str: + """Prepare for an update. + + By the time this coroutine completes, the hardware should be ready + to take an update. This implicitly tears down the module instance; + it does not need to be either working or recoverable after this + coroutine completes. + + :returns str: The port we're running on. + """ + return "" + + def model(self) -> str: + """A name for this specific module, matching module defs""" + return "absorbanceReaderV1" + + @classmethod + def name(cls) -> str: + """A shortname used for matching usb ports, among other things""" + return "absorbancereader" + + def firmware_prefix(self) -> str: + """The prefix used for looking up firmware""" + # TODO: (AA) This is a placeholder + return "" + + def bootloader(self) -> UploadFunction: + """Bootloader mode""" + return upload_func_placeholder + + async def cleanup(self) -> None: + """Clean up the module instance. + + Clean up, i.e. stop pollers, disconnect serial, etc in preparation for + object destruction. + """ + await self._driver.disconnect() + + async def set_sample_wavelength(self, wavelength: int) -> None: + """Set the Absorbance Reader's active wavelength.""" + await self._driver.initialize_measurement(wavelength) + + async def start_measure(self, wavelength: int) -> None: + """Initiate a single measurement.""" + await self._driver.get_single_measurement(wavelength) + + async def get_supported_wavelengths(self) -> List[int]: + """Get the Absorbance Reader's supported wavelengths.""" + return await self._driver.get_available_wavelengths() + + async def get_current_wavelength(self) -> None: + """Get the Absorbance Reader's current active wavelength.""" + pass diff --git a/api/src/opentrons/hardware_control/modules/types.py b/api/src/opentrons/hardware_control/modules/types.py index f0980fca2b1..e538e603f8d 100644 --- a/api/src/opentrons/hardware_control/modules/types.py +++ b/api/src/opentrons/hardware_control/modules/types.py @@ -25,6 +25,7 @@ TemperatureModuleType, HeaterShakerModuleType, MagneticBlockType, + AbsorbanceReaderType, ) @@ -51,6 +52,7 @@ class ModuleType(str, Enum): MAGNETIC: MagneticModuleType = "magneticModuleType" HEATER_SHAKER: HeaterShakerModuleType = "heaterShakerModuleType" MAGNETIC_BLOCK: MagneticBlockType = "magneticBlockType" + ABSORBANCE_READER: AbsorbanceReaderType = "absorbanceReaderType" @classmethod def from_model(cls, model: ModuleModel) -> ModuleType: @@ -64,6 +66,8 @@ def from_model(cls, model: ModuleModel) -> ModuleType: return cls.HEATER_SHAKER if isinstance(model, MagneticBlockModel): return cls.MAGNETIC_BLOCK + if isinstance(model, AbsorbanceReaderModel): + return cls.ABSORBANCE_READER @classmethod def to_module_fixture_id(cls, module_type: ModuleType) -> str: @@ -105,6 +109,10 @@ class MagneticBlockModel(str, Enum): MAGNETIC_BLOCK_V1: str = "magneticBlockV1" +class AbsorbanceReaderModel(str, Enum): + ABSORBANCE_READER_V1: str = "absorbanceReaderV1" + + def module_model_from_string(model_string: str) -> ModuleModel: for model_enum in { MagneticModuleModel, @@ -112,6 +120,7 @@ def module_model_from_string(model_string: str) -> ModuleModel: ThermocyclerModuleModel, HeaterShakerModuleModel, MagneticBlockModel, + AbsorbanceReaderModel, }: try: return cast(ModuleModel, model_enum(model_string)) @@ -166,6 +175,7 @@ class ModuleInfo(NamedTuple): ThermocyclerModuleModel, HeaterShakerModuleModel, MagneticBlockModel, + AbsorbanceReaderModel, ] @@ -194,3 +204,9 @@ class HeaterShakerStatus(str, Enum): IDLE = "idle" RUNNING = "running" ERROR = "error" + + +class AbsorbanceReaderStatus(str, Enum): + IDLE = "idle" + MEASURING = "measuring" + ERROR = "error" diff --git a/api/src/opentrons/hardware_control/modules/utils.py b/api/src/opentrons/hardware_control/modules/utils.py index 0c213ead6a1..862617e2d60 100644 --- a/api/src/opentrons/hardware_control/modules/utils.py +++ b/api/src/opentrons/hardware_control/modules/utils.py @@ -12,6 +12,7 @@ from .magdeck import MagDeck from .thermocycler import Thermocycler from .heater_shaker import HeaterShaker +from .absorbance_reader import AbsorbanceReader log = logging.getLogger(__name__) @@ -24,6 +25,7 @@ TempDeck.name(): TempDeck.MODULE_TYPE, Thermocycler.name(): Thermocycler.MODULE_TYPE, HeaterShaker.name(): HeaterShaker.MODULE_TYPE, + AbsorbanceReader.name(): AbsorbanceReader.MODULE_TYPE, } _MODULE_CLS_BY_TYPE: Dict[ModuleType, Type[AbstractModule]] = { @@ -31,6 +33,7 @@ TempDeck.MODULE_TYPE: TempDeck, Thermocycler.MODULE_TYPE: Thermocycler, HeaterShaker.MODULE_TYPE: HeaterShaker, + AbsorbanceReader.MODULE_TYPE: AbsorbanceReader, } diff --git a/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py new file mode 100644 index 00000000000..f694f798a71 --- /dev/null +++ b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py @@ -0,0 +1,20 @@ +"""Heater-Shaker Module sub-state.""" +from dataclasses import dataclass +from typing import List, NewType, Optional + + +AbsorbanceReaderId = NewType("AbsorbanceReaderId", str) + + +@dataclass(frozen=True) +class AbsorbanceReaderSubState: + """Absorbance-Plate-Reader-specific state.""" + + module_id: AbsorbanceReaderId + initialized: bool + is_lid_open: bool + is_loaded: bool + is_measuring: bool + temperature: float + sample_wavelength: Optional[int] + supported_wavelengths: Optional[List[int]] diff --git a/api/tests/opentrons/drivers/absorbance_reader/__init__.py b/api/tests/opentrons/drivers/absorbance_reader/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/api/tests/opentrons/drivers/absorbance_reader/test_driver.py b/api/tests/opentrons/drivers/absorbance_reader/test_driver.py new file mode 100644 index 00000000000..ecda705fa3e --- /dev/null +++ b/api/tests/opentrons/drivers/absorbance_reader/test_driver.py @@ -0,0 +1,168 @@ +from mock import MagicMock +import pytest +import asyncio +from enum import Enum +from concurrent.futures.thread import ThreadPoolExecutor + +from opentrons.drivers.absorbance_reader import ( + AbsorbanceReaderDriver, + AbsorbanceHidInterface, +) +from opentrons.drivers.absorbance_reader.async_byonoy import AsyncByonoy +from opentrons.drivers.types import AbsorbanceReaderLidStatus + + +@pytest.fixture +def mock_interface() -> MagicMock: + return MagicMock(spec=AbsorbanceHidInterface) + + +@pytest.fixture +def mock_device() -> MagicMock: + return MagicMock(spec=AbsorbanceHidInterface.Device) + + +class MockErrorCode(Enum): + BYONOY_ERROR_NO_ERROR = "no_error" + BYONOY_ERROR = "error" + + +@pytest.fixture +async def mock_async_byonoy(mock_interface, mock_device) -> AsyncByonoy: + loop = asyncio.get_running_loop() + return AsyncByonoy( + mock_interface, mock_device, ThreadPoolExecutor(max_workers=1), loop + ) + + +@pytest.fixture +async def driver(mock_async_byonoy: AsyncByonoy) -> AbsorbanceReaderDriver: + return AbsorbanceReaderDriver(mock_async_byonoy) + + +@pytest.fixture +async def connected_driver(driver: AbsorbanceReaderDriver) -> AbsorbanceReaderDriver: + driver._connection._device_handle = 1 + return driver + + +async def test_driver_connect_disconnect( + mock_interface: MagicMock, + driver: AbsorbanceReaderDriver, +) -> None: + mock_interface.byonoy_open_device.return_value = ( + MockErrorCode.BYONOY_ERROR_NO_ERROR, + 1, + ) + + assert not await driver.is_connected() + await driver.connect() + + mock_interface.byonoy_open_device.assert_called_once() + assert await driver.is_connected() + assert driver._connection.verify_device_handle() + assert driver._connection._device_handle == 1 + + mock_interface.byonoy_free_device.return_value = MockErrorCode.BYONOY_ERROR_NO_ERROR + await driver.disconnect() + + assert not await driver.is_connected() + assert driver._connection._device_handle is None + + +async def test_driver_get_device_info( + mock_interface: MagicMock, + connected_driver: AbsorbanceReaderDriver, +) -> None: + + DEVICE_INFO = MagicMock(AbsorbanceHidInterface.DeviceInfo) + DEVICE_INFO.ref_no = "456" + DEVICE_INFO.sn = "123" + DEVICE_INFO.version = "1.0" + + mock_interface.byonoy_get_device_information.return_value = ( + MockErrorCode.BYONOY_ERROR_NO_ERROR, + DEVICE_INFO, + ) + + info = await connected_driver.get_device_info() + + mock_interface.byonoy_get_device_information.assert_called_once() + assert info == {"serial_number": "123", "reference_number": "456", "version": "1.0"} + + +@pytest.mark.parametrize( + "parts_aligned, module_status", + [(True, AbsorbanceReaderLidStatus.ON), (False, AbsorbanceReaderLidStatus.OFF)], +) +async def test_driver_get_lid_status( + mock_interface: MagicMock, + connected_driver: AbsorbanceReaderDriver, + parts_aligned: bool, + module_status: AbsorbanceReaderLidStatus, +) -> None: + + mock_interface.byonoy_get_device_parts_aligned.return_value = ( + MockErrorCode.BYONOY_ERROR_NO_ERROR, + parts_aligned, + ) + + status = await connected_driver.get_lid_status() + + mock_interface.byonoy_get_device_parts_aligned.assert_called_once() + assert status == module_status + + +async def test_driver_get_supported_wavelengths( + mock_interface: MagicMock, + connected_driver: AbsorbanceReaderDriver, +) -> None: + SUPPORTED_WAVELENGTHS = [450, 500] + mock_interface.byonoy_abs96_get_available_wavelengths.return_value = ( + MockErrorCode.BYONOY_ERROR_NO_ERROR, + SUPPORTED_WAVELENGTHS, + ) + + assert not connected_driver._connection._supported_wavelengths + + wavelengths = await connected_driver.get_available_wavelengths() + + mock_interface.byonoy_abs96_get_available_wavelengths.assert_called_once() + assert connected_driver._connection._supported_wavelengths == SUPPORTED_WAVELENGTHS + assert wavelengths == SUPPORTED_WAVELENGTHS + + +async def test_driver_initialize_and_read( + mock_interface: MagicMock, + connected_driver: AbsorbanceReaderDriver, +) -> None: + # set up mock interface + connected_driver._connection._supported_wavelengths = [450, 500] + mock_interface.byonoy_abs96_initialize_single_measurement.return_value = ( + MockErrorCode.BYONOY_ERROR_NO_ERROR + ) + mock_interface.ByonoyAbs96SingleMeasurementConfig = MagicMock( + spec=AbsorbanceHidInterface.MeasurementConfig + ) + + # current config should not have been setup yet + assert not connected_driver._connection._current_config + await connected_driver.initialize_measurement(450) + + conf = connected_driver._connection._current_config + assert conf and conf.sample_wavelength == 450 + mock_interface.byonoy_abs96_initialize_single_measurement.assert_called_once_with( + 1, conf + ) + + # setup up mock interface + MEASURE_RESULT = [0.1] * 96 + mock_interface.byonoy_abs96_single_measure.return_value = ( + MockErrorCode.BYONOY_ERROR_NO_ERROR, + MEASURE_RESULT, + ) + + result = await connected_driver.get_single_measurement(450) + mock_interface.byonoy_abs96_single_measure.assert_called_once_with(1, conf) + + assert result == MEASURE_RESULT diff --git a/g-code-testing/Pipfile b/g-code-testing/Pipfile index 80f83a4561a..0b39a9dd222 100644 --- a/g-code-testing/Pipfile +++ b/g-code-testing/Pipfile @@ -31,6 +31,7 @@ flake8-docstrings = "~=1.7.0" flake8-noqa = "~=1.4.0" black = "==22.3.0" decoy = "~=2.1.1" +pyusb = "==1.2.1" [requires] python_version = "3.10" diff --git a/g-code-testing/Pipfile.lock b/g-code-testing/Pipfile.lock index ad7aa98a701..fd068bff783 100644 --- a/g-code-testing/Pipfile.lock +++ b/g-code-testing/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "2454d48b1b831db24fb96b42516e1ac204d98ea0ed929307858ee32ac793fb20" + "sha256": "214f2b205b35dd2d385ec40836249499ecebefc1696107a12d48c58b13c6353d" }, "pipfile-spec": 6, "requires": { @@ -23,14 +23,6 @@ ], "version": "==0.2.0" }, - "aiosqlite": { - "hashes": [ - "sha256:95ee77b91c8d2808bd08a59fbebf66270e9090c3d92ffbf260dc0db0b979577d", - "sha256:edba222e03453e094a3ce605db1b970c4b3376264e56f32e2a4959f948d66a96" - ], - "markers": "python_version >= '3.7'", - "version": "==0.19.0" - }, "anyio": { "hashes": [ "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", @@ -58,11 +50,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" ], "markers": "python_version < '3.11'", - "version": "==1.2.0" + "version": "==1.2.1" }, "fastapi": { "hashes": [ @@ -86,11 +78,11 @@ }, "idna": { "hashes": [ - "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", - "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], "markers": "python_version >= '3.5'", - "version": "==3.6" + "version": "==3.7" }, "jsonschema": { "hashes": [ @@ -102,49 +94,49 @@ }, "numpy": { "hashes": [ - "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd", - "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b", - "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e", - "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f", - "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f", - "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178", - "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3", - "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4", - "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e", - "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0", - "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00", - "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419", - "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4", - "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6", - "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166", - "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b", - "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3", - "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf", - "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2", - "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2", - "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36", - "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03", - "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce", - "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6", - "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13", - "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5", - "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e", - "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485", - "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137", - "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374", - "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58", - "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b", - "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb", - "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b", - "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda", - "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511" + "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", + "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", + "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", + "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", + "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", + "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", + "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", + "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", + "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", + "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", + "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", + "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", + "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", + "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", + "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", + "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", + "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", + "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", + "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", + "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", + "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", + "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", + "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", + "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", + "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", + "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", + "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", + "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", + "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", + "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", + "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", + "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", + "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", + "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", + "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" ], "markers": "python_version >= '3.9'", - "version": "==1.26.3" + "version": "==1.26.4" }, "opentrons": { "editable": true, - "markers": "python_version >= '3.7'", + "markers": "python_version >= '3.10'", "path": "./../api" }, "opentrons-hardware": { @@ -153,7 +145,7 @@ }, "opentrons-shared-data": { "editable": true, - "markers": "python_version >= '3.7'", + "markers": "python_version >= '3.10'", "path": "../shared-data/python" }, "paho-mqtt": { @@ -276,11 +268,11 @@ }, "sniffio": { "hashes": [ - "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", - "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" ], "markers": "python_version >= '3.7'", - "version": "==1.3.0" + "version": "==1.3.1" }, "sqlalchemy": { "hashes": [ @@ -351,11 +343,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.11.0" }, "uvicorn": { "hashes": [ @@ -377,85 +369,85 @@ "develop": { "aiohttp": { "hashes": [ - "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168", - "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb", - "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5", - "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f", - "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc", - "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c", - "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29", - "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4", - "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc", - "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc", - "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63", - "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e", - "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d", - "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a", - "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60", - "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38", - "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b", - "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2", - "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53", - "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5", - "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4", - "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96", - "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58", - "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa", - "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321", - "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae", - "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce", - "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8", - "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194", - "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c", - "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf", - "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d", - "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869", - "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b", - "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52", - "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528", - "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5", - "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1", - "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4", - "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8", - "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d", - "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7", - "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5", - "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54", - "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3", - "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5", - "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c", - "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29", - "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3", - "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747", - "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672", - "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5", - "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11", - "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca", - "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768", - "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6", - "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2", - "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533", - "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6", - "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266", - "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d", - "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec", - "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5", - "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1", - "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b", - "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679", - "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283", - "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb", - "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b", - "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3", - "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051", - "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511", - "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e", - "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d", - "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542", - "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f" + "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8", + "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c", + "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475", + "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed", + "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf", + "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372", + "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81", + "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f", + "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1", + "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd", + "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a", + "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb", + "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46", + "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de", + "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78", + "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c", + "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771", + "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb", + "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", + "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233", + "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156", + "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9", + "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59", + "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888", + "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", + "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c", + "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da", + "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424", + "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2", + "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb", + "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8", + "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", + "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", + "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", + "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09", + "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031", + "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4", + "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", + "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa", + "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a", + "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe", + "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a", + "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2", + "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1", + "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323", + "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b", + "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b", + "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106", + "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac", + "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6", + "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", + "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75", + "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6", + "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d", + "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", + "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", + "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a", + "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da", + "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678", + "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", + "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24", + "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed", + "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f", + "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e", + "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58", + "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a", + "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342", + "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", + "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2", + "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", + "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595", + "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee", + "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11", + "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d", + "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", + "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f" ], "markers": "python_version >= '3.8'", - "version": "==3.9.3" + "version": "==3.9.5" }, "aiosignal": { "hashes": [ @@ -524,61 +516,61 @@ "toml" ], "hashes": [ - "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61", - "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1", - "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7", - "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7", - "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75", - "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd", - "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35", - "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04", - "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6", - "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042", - "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166", - "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1", - "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d", - "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c", - "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66", - "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70", - "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1", - "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676", - "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630", - "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a", - "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74", - "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad", - "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19", - "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6", - "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448", - "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018", - "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218", - "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756", - "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54", - "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45", - "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628", - "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968", - "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d", - "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25", - "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60", - "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950", - "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06", - "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295", - "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b", - "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c", - "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc", - "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74", - "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1", - "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee", - "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011", - "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156", - "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766", - "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5", - "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581", - "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016", - "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c", - "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3" + "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de", + "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661", + "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26", + "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41", + "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d", + "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981", + "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2", + "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34", + "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f", + "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a", + "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35", + "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223", + "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1", + "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746", + "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90", + "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c", + "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca", + "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8", + "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596", + "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e", + "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd", + "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e", + "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3", + "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e", + "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312", + "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7", + "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572", + "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428", + "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f", + "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07", + "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e", + "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4", + "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136", + "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5", + "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8", + "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d", + "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228", + "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206", + "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa", + "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e", + "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be", + "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5", + "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668", + "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601", + "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057", + "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146", + "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f", + "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8", + "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7", + "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987", + "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19", + "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece" ], "markers": "python_version >= '3.8'", - "version": "==7.4.1" + "version": "==7.5.1" }, "decoy": { "hashes": [ @@ -600,19 +592,19 @@ }, "exceptiongroup": { "hashes": [ - "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" ], "markers": "python_version < '3.11'", - "version": "==1.2.0" + "version": "==1.2.1" }, "execnet": { "hashes": [ - "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41", - "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af" + "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", + "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" ], - "markers": "python_version >= '3.7'", - "version": "==2.0.2" + "markers": "python_version >= '3.8'", + "version": "==2.1.1" }, "flake8": { "hashes": [ @@ -735,11 +727,11 @@ }, "idna": { "hashes": [ - "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", - "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], "markers": "python_version >= '3.5'", - "version": "==3.6" + "version": "==3.7" }, "iniconfig": { "hashes": [ @@ -906,11 +898,11 @@ }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pathspec": { "hashes": [ @@ -922,19 +914,19 @@ }, "platformdirs": { "hashes": [ - "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], "markers": "python_version >= '3.8'", - "version": "==4.2.0" + "version": "==4.2.2" }, "pluggy": { "hashes": [ - "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", - "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" ], "markers": "python_version >= '3.8'", - "version": "==1.4.0" + "version": "==1.5.0" }, "py": { "hashes": [ @@ -988,11 +980,11 @@ }, "pytest-asyncio": { "hashes": [ - "sha256:2143d9d9375bf372a73260e4114541485e84fca350b0b6b92674ca56ff5f7ea2", - "sha256:b0079dfac14b60cd1ce4691fbfb1748fe939db7d0234b5aba97197d10fbe0fef" + "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a", + "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f" ], "markers": "python_version >= '3.8'", - "version": "==0.23.4" + "version": "==0.23.6" }, "pytest-cov": { "hashes": [ @@ -1020,6 +1012,15 @@ "markers": "python_version >= '3.6'", "version": "==2.5.0" }, + "pyusb": { + "hashes": [ + "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36", + "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9" + ], + "index": "pypi", + "markers": "python_full_version >= '3.6.0'", + "version": "==1.2.1" + }, "snowballstemmer": { "hashes": [ "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", @@ -1037,20 +1038,20 @@ }, "types-mock": { "hashes": [ - "sha256:13ca379d5710ccb3f18f69ade5b08881874cb83383d8fb49b1d4dac9d5c5d090", - "sha256:3d116955495935b0bcba14954b38d97e507cd43eca3e3700fc1b8e4f5c6bf2c7" + "sha256:5281a645d72e827d70043e3cc144fe33b1c003db084f789dc203aa90e812a5a4", + "sha256:d586a01d39ad919d3ddcd73de6cde73ca7f3c69707219f722d1b8d7733641ad7" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.1.0.20240106" + "version": "==5.1.0.20240425" }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.11.0" }, "yarl": { "hashes": [ diff --git a/hardware-testing/Pipfile b/hardware-testing/Pipfile index acc317ac325..e851331de96 100644 --- a/hardware-testing/Pipfile +++ b/hardware-testing/Pipfile @@ -23,6 +23,7 @@ flake8-docstrings = "~=1.6.0" flake8-noqa = "~=1.2.1" requests = "==2.27.1" types-requests = "==2.25.6" +pyusb = "==1.2.1" [requires] python_version = "3.10" diff --git a/hardware-testing/Pipfile.lock b/hardware-testing/Pipfile.lock index 6c717bc2743..cbe473a96c3 100644 --- a/hardware-testing/Pipfile.lock +++ b/hardware-testing/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "62d9d88f58594147f78dbda65db2d96b53ac2c07a54eb0b81854c7c7ebe4e247" + "sha256": "29fd7580a2384b6f20317de4c4869f27ede50315e7d87d75346bfbabd0ef683c" }, "pipfile-spec": 6, "requires": { @@ -25,19 +25,19 @@ }, "anyio": { "hashes": [ - "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b", - "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be" + "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", + "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" ], - "markers": "python_full_version >= '3.6.2'", - "version": "==3.6.1" + "markers": "python_version >= '3.7'", + "version": "==3.7.1" }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "click": { "hashes": [ @@ -47,134 +47,144 @@ "markers": "python_version >= '3.7'", "version": "==8.1.7" }, + "exceptiongroup": { + "hashes": [ + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.1" + }, "hardware-testing": { "editable": true, "path": "." }, "idna": { "hashes": [ - "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", - "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], "markers": "python_version >= '3.5'", - "version": "==3.6" + "version": "==3.7" }, "jsonschema": { "hashes": [ - "sha256:5f9c0a719ca2ce14c5de2fd350a64fd2d13e8539db29836a86adc990bb1a068f", - "sha256:8d4a2b7b6c2237e0199c8ea1a6d3e05bf118e289ae2b9d7ba444182a2959560d" + "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", + "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" ], - "version": "==3.0.2" + "markers": "python_version >= '3.7'", + "version": "==4.17.3" }, "msgpack": { "hashes": [ - "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862", - "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d", - "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3", - "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672", - "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0", - "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9", - "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee", - "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46", - "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524", - "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819", - "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc", - "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc", - "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1", - "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82", - "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81", - "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6", - "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d", - "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2", - "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c", - "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87", - "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84", - "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e", - "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95", - "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f", - "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b", - "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93", - "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf", - "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61", - "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c", - "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8", - "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d", - "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c", - "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4", - "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba", - "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415", - "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee", - "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d", - "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9", - "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075", - "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f", - "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7", - "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681", - "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329", - "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1", - "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf", - "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c", - "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5", - "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b", - "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5", - "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e", - "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b", - "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad", - "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd", - "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7", - "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002", - "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc" + "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982", + "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3", + "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40", + "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee", + "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693", + "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950", + "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151", + "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24", + "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305", + "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b", + "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c", + "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659", + "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d", + "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18", + "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746", + "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868", + "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2", + "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba", + "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228", + "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2", + "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273", + "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c", + "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653", + "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a", + "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596", + "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd", + "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8", + "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa", + "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85", + "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc", + "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836", + "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3", + "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58", + "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128", + "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db", + "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f", + "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77", + "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad", + "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13", + "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8", + "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b", + "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a", + "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543", + "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b", + "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce", + "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d", + "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a", + "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c", + "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f", + "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e", + "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011", + "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04", + "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480", + "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a", + "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d", + "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d" ], "markers": "platform_system != 'Windows'", - "version": "==1.0.7" + "version": "==1.0.8" }, "numpy": { "hashes": [ - "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a", - "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6", - "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2", - "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79", - "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9", - "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919", - "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d", - "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060", - "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75", - "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f", - "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe", - "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167", - "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef", - "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75", - "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3", - "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7", - "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7", - "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d", - "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b", - "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186", - "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0", - "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1", - "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6", - "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e", - "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523", - "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36", - "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841", - "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818", - "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00", - "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80", - "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440", - "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210", - "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8", - "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea", - "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec", - "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841" + "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", + "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", + "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", + "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", + "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", + "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", + "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", + "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", + "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", + "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", + "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", + "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", + "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", + "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", + "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", + "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", + "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", + "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", + "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", + "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", + "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", + "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", + "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", + "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", + "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", + "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", + "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", + "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", + "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", + "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", + "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", + "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", + "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", + "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", + "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" ], "markers": "python_version >= '3.9'", - "version": "==1.26.2" + "version": "==1.26.4" }, "opentrons": { "editable": true, "extras": [ "flex-hardware" ], + "markers": "python_version >= '3.10'", "path": "./../api" }, "opentrons-hardware": { @@ -186,57 +196,58 @@ }, "opentrons-shared-data": { "editable": true, - "markers": "python_version >= '3.7'", + "markers": "python_version >= '3.10'", "path": "./../shared-data/python" }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pydantic": { "hashes": [ - "sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44", - "sha256:19b5686387ea0d1ea52ecc4cffb71abb21702c5e5b2ac626fd4dbaa0834aa49d", - "sha256:2bd446bdb7755c3a94e56d7bdfd3ee92396070efa8ef3a34fab9579fe6aa1d84", - "sha256:328558c9f2eed77bd8fffad3cef39dbbe3edc7044517f4625a769d45d4cf7555", - "sha256:32e0b4fb13ad4db4058a7c3c80e2569adbd810c25e6ca3bbd8b2a9cc2cc871d7", - "sha256:3ee0d69b2a5b341fc7927e92cae7ddcfd95e624dfc4870b32a85568bd65e6131", - "sha256:4aafd4e55e8ad5bd1b19572ea2df546ccace7945853832bb99422a79c70ce9b8", - "sha256:4b3946f87e5cef3ba2e7bd3a4eb5a20385fe36521d6cc1ebf3c08a6697c6cfb3", - "sha256:4de71c718c9756d679420c69f216776c2e977459f77e8f679a4a961dc7304a56", - "sha256:5565a49effe38d51882cb7bac18bda013cdb34d80ac336428e8908f0b72499b0", - "sha256:5803ad846cdd1ed0d97eb00292b870c29c1f03732a010e66908ff48a762f20e4", - "sha256:5da164119602212a3fe7e3bc08911a89db4710ae51444b4224c2382fd09ad453", - "sha256:615661bfc37e82ac677543704437ff737418e4ea04bef9cf11c6d27346606044", - "sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e", - "sha256:7d0f183b305629765910eaad707800d2f47c6ac5bcfb8c6397abdc30b69eeb15", - "sha256:7ead3cd020d526f75b4188e0a8d71c0dbbe1b4b6b5dc0ea775a93aca16256aeb", - "sha256:84d76ecc908d917f4684b354a39fd885d69dd0491be175f3465fe4b59811c001", - "sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d", - "sha256:91089b2e281713f3893cd01d8e576771cd5bfdfbff5d0ed95969f47ef6d676c3", - "sha256:9c9e04a6cdb7a363d7cb3ccf0efea51e0abb48e180c0d31dca8d247967d85c6e", - "sha256:a8c5360a0297a713b4123608a7909e6869e1b56d0e96eb0d792c27585d40757f", - "sha256:afacf6d2a41ed91fc631bade88b1d319c51ab5418870802cedb590b709c5ae3c", - "sha256:b34ba24f3e2d0b39b43f0ca62008f7ba962cff51efa56e64ee25c4af6eed987b", - "sha256:bd67cb2c2d9602ad159389c29e4ca964b86fa2f35c2faef54c3eb28b4efd36c8", - "sha256:c0f5e142ef8217019e3eef6ae1b6b55f09a7a15972958d44fbd228214cede567", - "sha256:cdb4272678db803ddf94caa4f94f8672e9a46bae4a44f167095e4d06fec12979", - "sha256:d70916235d478404a3fa8c997b003b5f33aeac4686ac1baa767234a0f8ac2326", - "sha256:d8ce3fb0841763a89322ea0432f1f59a2d3feae07a63ea2c958b2315e1ae8adb", - "sha256:e0b214e57623a535936005797567231a12d0da0c29711eb3514bc2b3cd008d0f", - "sha256:e631c70c9280e3129f071635b81207cad85e6c08e253539467e4ead0e5b219aa", - "sha256:e78578f0c7481c850d1c969aca9a65405887003484d24f6110458fb02cca7747", - "sha256:f0ca86b525264daa5f6b192f216a0d1e860b7383e3da1c65a1908f9c02f42801", - "sha256:f1a68f4f65a9ee64b6ccccb5bf7e17db07caebd2730109cb8a95863cfa9c4e55", - "sha256:fafe841be1103f340a24977f61dee76172e4ae5f647ab9e7fd1e1fca51524f08", - "sha256:ff68fc85355532ea77559ede81f35fff79a6a5543477e168ab3a381887caea76" - ], - "markers": "python_full_version >= '3.6.1'", - "version": "==1.9.2" + "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de", + "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986", + "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55", + "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4", + "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58", + "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3", + "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12", + "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d", + "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7", + "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53", + "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb", + "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51", + "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948", + "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022", + "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed", + "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383", + "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4", + "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b", + "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2", + "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528", + "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf", + "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8", + "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc", + "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f", + "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0", + "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7", + "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c", + "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44", + "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654", + "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0", + "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb", + "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00", + "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1", + "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c", + "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22", + "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0" + ], + "markers": "python_version >= '3.7'", + "version": "==1.10.15" }, "pyrsistent": { "hashes": [ @@ -293,35 +304,27 @@ }, "setuptools": { "hashes": [ - "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", - "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" + "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", + "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" ], "markers": "python_version >= '3.8'", - "version": "==69.0.2" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" + "version": "==69.5.1" }, "sniffio": { "hashes": [ - "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", - "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" ], "markers": "python_version >= '3.7'", - "version": "==1.3.0" + "version": "==1.3.1" }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.11.0" }, "wrapt": { "hashes": [ @@ -410,11 +413,11 @@ }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "black": { "hashes": [ @@ -448,11 +451,11 @@ }, "certifi": { "hashes": [ - "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", - "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" ], "markers": "python_version >= '3.6'", - "version": "==2023.11.17" + "version": "==2024.2.2" }, "charset-normalizer": { "hashes": [ @@ -481,61 +484,61 @@ }, "coverage": { "hashes": [ - "sha256:007a7e49831cfe387473e92e9ff07377f6121120669ddc39674e7244350a6a29", - "sha256:1191270b06ecd68b1d00897b2daddb98e1719f63750969614ceb3438228c088e", - "sha256:1367aa411afb4431ab58fd7ee102adb2665894d047c490649e86219327183134", - "sha256:1f0f8f0c497eb9c9f18f21de0750c8d8b4b9c7000b43996a094290b59d0e7523", - "sha256:222b038f08a7ebed1e4e78ccf3c09a1ca4ac3da16de983e66520973443b546bc", - "sha256:243576944f7c1a1205e5cd658533a50eba662c74f9be4c050d51c69bd4532936", - "sha256:2e9223a18f51d00d3ce239c39fc41410489ec7a248a84fab443fbb39c943616c", - "sha256:307aecb65bb77cbfebf2eb6e12009e9034d050c6c69d8a5f3f737b329f4f15fb", - "sha256:31c0b1b8b5a4aebf8fcd227237fc4263aa7fa0ddcd4d288d42f50eff18b0bac4", - "sha256:3b15e03b8ee6a908db48eccf4e4e42397f146ab1e91c6324da44197a45cb9132", - "sha256:3c854c1d2c7d3e47f7120b560d1a30c1ca221e207439608d27bc4d08fd4aeae8", - "sha256:475de8213ed95a6b6283056d180b2442eee38d5948d735cd3d3b52b86dd65b92", - "sha256:50c472c1916540f8b2deef10cdc736cd2b3d1464d3945e4da0333862270dcb15", - "sha256:593efa42160c15c59ee9b66c5f27a453ed3968718e6e58431cdfb2d50d5ad284", - "sha256:65d716b736f16e250435473c5ca01285d73c29f20097decdbb12571d5dfb2c94", - "sha256:733537a182b5d62184f2a72796eb6901299898231a8e4f84c858c68684b25a70", - "sha256:757453848c18d7ab5d5b5f1827293d580f156f1c2c8cef45bfc21f37d8681069", - "sha256:79c32f875fd7c0ed8d642b221cf81feba98183d2ff14d1f37a1bbce6b0347d9f", - "sha256:7f3bad1a9313401ff2964e411ab7d57fb700a2d5478b727e13f156c8f89774a0", - "sha256:7fbf3f5756e7955174a31fb579307d69ffca91ad163467ed123858ce0f3fd4aa", - "sha256:811ca7373da32f1ccee2927dc27dc523462fd30674a80102f86c6753d6681bc6", - "sha256:89400aa1752e09f666cc48708eaa171eef0ebe3d5f74044b614729231763ae69", - "sha256:8c944cf1775235c0857829c275c777a2c3e33032e544bcef614036f337ac37bb", - "sha256:9437a4074b43c177c92c96d051957592afd85ba00d3e92002c8ef45ee75df438", - "sha256:9e17d9cb06c13b4f2ef570355fa45797d10f19ca71395910b249e3f77942a837", - "sha256:9ede881c7618f9cf93e2df0421ee127afdfd267d1b5d0c59bcea771cf160ea4a", - "sha256:a1f76cfc122c9e0f62dbe0460ec9cc7696fc9a0293931a33b8870f78cf83a327", - "sha256:a2ac4245f18057dfec3b0074c4eb366953bca6787f1ec397c004c78176a23d56", - "sha256:a702e66483b1fe602717020a0e90506e759c84a71dbc1616dd55d29d86a9b91f", - "sha256:ad2453b852a1316c8a103c9c970db8fbc262f4f6b930aa6c606df9b2766eee06", - "sha256:af75cf83c2d57717a8493ed2246d34b1f3398cb8a92b10fd7a1858cad8e78f59", - "sha256:afdcc10c01d0db217fc0a64f58c7edd635b8f27787fea0a3054b856a6dff8717", - "sha256:c59a3e59fb95e6d72e71dc915e6d7fa568863fad0a80b33bc7b82d6e9f844973", - "sha256:cad9afc1644b979211989ec3ff7d82110b2ed52995c2f7263e7841c846a75348", - "sha256:d299d379b676812e142fb57662a8d0d810b859421412b4d7af996154c00c31bb", - "sha256:d31650d313bd90d027f4be7663dfa2241079edd780b56ac416b56eebe0a21aab", - "sha256:d874434e0cb7b90f7af2b6e3309b0733cde8ec1476eb47db148ed7deeb2a9494", - "sha256:db0338c4b0951d93d547e0ff8d8ea340fecf5885f5b00b23be5aa99549e14cfd", - "sha256:df04c64e58df96b4427db8d0559e95e2df3138c9916c96f9f6a4dd220db2fdb7", - "sha256:e995efb191f04b01ced307dbd7407ebf6e6dc209b528d75583277b10fd1800ee", - "sha256:eda7f6e92358ac9e1717ce1f0377ed2b9320cea070906ece4e5c11d172a45a39", - "sha256:ee453085279df1bac0996bc97004771a4a052b1f1e23f6101213e3796ff3cb85", - "sha256:ee6621dccce8af666b8c4651f9f43467bfbf409607c604b840b78f4ff3619aeb", - "sha256:eee5e741b43ea1b49d98ab6e40f7e299e97715af2488d1c77a90de4a663a86e2", - "sha256:f3bfd2c2f0e5384276e12b14882bf2c7621f97c35320c3e7132c156ce18436a1", - "sha256:f501e36ac428c1b334c41e196ff6bd550c0353c7314716e80055b1f0a32ba394", - "sha256:f9191be7af41f0b54324ded600e8ddbcabea23e1e8ba419d9a53b241dece821d", - "sha256:fbd8a5fe6c893de21a3c6835071ec116d79334fbdf641743332e442a3466f7ea", - "sha256:fc200cec654311ca2c3f5ab3ce2220521b3d4732f68e1b1e79bef8fcfc1f2b97", - "sha256:ff4800783d85bff132f2cc7d007426ec698cdce08c3062c8d501ad3f4ea3d16c", - "sha256:ffb0eacbadb705c0a6969b0adf468f126b064f3362411df95f6d4f31c40d31c1", - "sha256:fff0b2f249ac642fd735f009b8363c2b46cf406d3caec00e4deeb79b5ff39b40" + "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de", + "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661", + "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26", + "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41", + "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d", + "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981", + "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2", + "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34", + "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f", + "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a", + "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35", + "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223", + "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1", + "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746", + "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90", + "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c", + "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca", + "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8", + "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596", + "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e", + "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd", + "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e", + "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3", + "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e", + "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312", + "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7", + "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572", + "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428", + "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f", + "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07", + "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e", + "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4", + "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136", + "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5", + "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8", + "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d", + "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228", + "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206", + "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa", + "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e", + "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be", + "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5", + "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668", + "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601", + "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057", + "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146", + "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f", + "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8", + "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7", + "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987", + "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19", + "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece" ], "markers": "python_version >= '3.8'", - "version": "==7.3.3" + "version": "==7.5.1" }, "flake8": { "hashes": [ @@ -574,11 +577,11 @@ }, "idna": { "hashes": [ - "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", - "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], "markers": "python_version >= '3.5'", - "version": "==3.6" + "version": "==3.7" }, "iniconfig": { "hashes": [ @@ -636,11 +639,11 @@ }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pathspec": { "hashes": [ @@ -652,19 +655,19 @@ }, "platformdirs": { "hashes": [ - "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", - "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], "markers": "python_version >= '3.8'", - "version": "==4.1.0" + "version": "==4.2.2" }, "pluggy": { "hashes": [ - "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", - "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.5.0" }, "py": { "hashes": [ @@ -716,6 +719,15 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==2.10.1" }, + "pyusb": { + "hashes": [ + "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36", + "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9" + ], + "index": "pypi", + "markers": "python_full_version >= '3.6.0'", + "version": "==1.2.1" + }, "requests": { "hashes": [ "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61", @@ -737,7 +749,7 @@ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_version >= '3.7'", + "markers": "python_version < '3.11'", "version": "==2.0.1" }, "types-requests": { @@ -750,11 +762,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" ], "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "version": "==4.11.0" }, "urllib3": { "hashes": [ diff --git a/robot-server/Pipfile b/robot-server/Pipfile index 2d22c6dc34c..0b70739eac3 100755 --- a/robot-server/Pipfile +++ b/robot-server/Pipfile @@ -37,6 +37,7 @@ sqlalchemy2-stubs = "==0.0.2a21" python-box = "==6.1.0" types-paho-mqtt = "==1.6.0.20240106" performance-metrics = {file = "../performance-metrics", editable = true} +pyusb = "==1.2.1" [packages] anyio = "==3.7.1" diff --git a/robot-server/Pipfile.lock b/robot-server/Pipfile.lock index 2ea9f545696..af344b810f6 100644 --- a/robot-server/Pipfile.lock +++ b/robot-server/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9f64ba7d87b9c9fd510aac5c4a22fa748c1bb3b9936826ef2b4b13454c1c5e2b" + "sha256": "f43123500e774f5b9a92f2be8ae39a04af8df7ba2ae4b2a505f1bb4b751cc30a" }, "pipfile-spec": 6, "requires": { @@ -154,11 +154,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" ], "markers": "python_version < '3.11'", - "version": "==1.2.0" + "version": "==1.2.1" }, "fastapi": { "hashes": [ @@ -252,70 +252,6 @@ "markers": "python_version >= '3.8'", "version": "==1.4.1" }, - "greenlet": { - "hashes": [ - "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", - "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", - "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", - "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", - "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", - "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", - "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", - "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", - "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", - "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", - "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", - "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", - "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", - "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", - "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", - "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", - "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", - "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", - "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", - "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", - "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", - "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", - "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", - "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", - "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", - "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", - "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", - "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", - "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", - "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", - "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", - "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", - "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", - "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", - "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", - "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", - "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", - "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", - "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", - "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", - "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", - "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", - "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", - "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", - "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", - "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", - "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", - "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", - "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", - "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", - "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", - "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", - "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", - "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", - "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", - "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", - "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", - "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" - ], - "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", - "version": "==3.0.3" - }, "h11": { "hashes": [ "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", @@ -528,7 +464,7 @@ }, "opentrons": { "editable": true, - "markers": "python_version >= '3.8'", + "markers": "python_version >= '3.10'", "path": "../api" }, "opentrons-hardware": { @@ -540,7 +476,7 @@ }, "opentrons-shared-data": { "editable": true, - "markers": "python_version >= '3.8'", + "markers": "python_version >= '3.10'", "path": "../shared-data/python" }, "packaging": { @@ -1066,61 +1002,61 @@ "toml" ], "hashes": [ - "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c", - "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63", - "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7", - "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f", - "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8", - "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf", - "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0", - "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384", - "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76", - "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7", - "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d", - "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70", - "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f", - "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818", - "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b", - "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d", - "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec", - "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083", - "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2", - "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9", - "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd", - "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade", - "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e", - "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a", - "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227", - "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87", - "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c", - "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e", - "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c", - "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e", - "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd", - "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec", - "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562", - "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8", - "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677", - "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357", - "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c", - "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd", - "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49", - "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286", - "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1", - "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf", - "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51", - "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409", - "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384", - "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e", - "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978", - "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57", - "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e", - "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2", - "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48", - "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4" + "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de", + "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661", + "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26", + "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41", + "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d", + "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981", + "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2", + "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34", + "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f", + "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a", + "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35", + "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223", + "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1", + "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746", + "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90", + "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c", + "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca", + "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8", + "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596", + "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e", + "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd", + "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e", + "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3", + "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e", + "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312", + "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7", + "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572", + "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428", + "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f", + "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07", + "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e", + "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4", + "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136", + "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5", + "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8", + "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d", + "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228", + "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206", + "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa", + "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e", + "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be", + "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5", + "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668", + "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601", + "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057", + "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146", + "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f", + "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8", + "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7", + "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987", + "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19", + "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece" ], "markers": "python_version >= '3.8'", - "version": "==7.4.4" + "version": "==7.5.1" }, "decoy": { "hashes": [ @@ -1139,11 +1075,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" ], "markers": "python_version < '3.11'", - "version": "==1.2.0" + "version": "==1.2.1" }, "execnet": { "hashes": [ @@ -1317,7 +1253,7 @@ }, "opentrons-shared-data": { "editable": true, - "markers": "python_version >= '3.8'", + "markers": "python_version >= '3.10'", "path": "../shared-data/python" }, "packaging": { @@ -1356,19 +1292,19 @@ }, "platformdirs": { "hashes": [ - "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], "markers": "python_version >= '3.8'", - "version": "==4.2.0" + "version": "==4.2.2" }, "pluggy": { "hashes": [ - "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", - "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" ], "markers": "python_version >= '3.8'", - "version": "==1.4.0" + "version": "==1.5.0" }, "py": { "hashes": [ @@ -1582,6 +1518,15 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, + "pyusb": { + "hashes": [ + "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36", + "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9" + ], + "index": "pypi", + "markers": "python_full_version >= '3.6.0'", + "version": "==1.2.1" + }, "pyyaml": { "hashes": [ "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", @@ -1771,12 +1716,12 @@ }, "types-mock": { "hashes": [ - "sha256:0769cb376dfc75b45215619f17a9fd6333d771cc29ce4a38937f060b1e45530f", - "sha256:7472797986d83016f96fde7f73577d129b0cd8a8d0b783487a7be330d57ba431" + "sha256:5281a645d72e827d70043e3cc144fe33b1c003db084f789dc203aa90e812a5a4", + "sha256:d586a01d39ad919d3ddcd73de6cde73ca7f3c69707219f722d1b8d7733641ad7" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.1.0.20240311" + "version": "==5.1.0.20240425" }, "types-paho-mqtt": { "hashes": [ diff --git a/shared-data/module/definitions/3/absorbanceReaderV1.json b/shared-data/module/definitions/3/absorbanceReaderV1.json new file mode 100644 index 00000000000..7b3172c377d --- /dev/null +++ b/shared-data/module/definitions/3/absorbanceReaderV1.json @@ -0,0 +1,3686 @@ +{ + "$otSharedSchema": "module/schemas/3", + "moduleType": "absorbanceReaderType", + "model": "absorbanceReaderV1", + "labwareOffset": { + "x": 0.0, + "y": 0.0, + "z": 108.96 + }, + "dimensions": { + "bareOverallHeight": 108.96, + "overLabwareHeight": 0.0, + "lidHeight": 61.7, + "xDimension": 172, + "yDimension": 245.2, + "labwareInterfaceXDimension": 128, + "labwareInterfaceYDimension": 86 + }, + "cornerOffsetFromSlot": { + "x": -22.125, + "y": 0, + "z": 0 + }, + "calibrationPoint": { + "x": 14.4, + "y": 64.93, + "z": 97.8 + }, + "config": { + "minBlockTemperature": 0, + "maxBlockTemperature": 99, + "minLidTemperature": 37, + "maxLidTemperature": 110, + "minBlockVolume": 0, + "maxBlockVolume": 100 + }, + "gripperOffsets": { + "default": { + "pickUpOffset": { + "x": 0, + "y": 0, + "z": 4.6 + }, + "dropOffset": { + "x": 0, + "y": 0, + "z": 5.6 + } + } + }, + "displayName": "Thermocycler Module GEN2", + "quirks": [], + "slotTransforms": { + "ot3_standard": { + "B1": { + "labwareOffset": [ + [1, 0, 0, -20.005], + [0, 1, 0, -0.84], + [0, 0, 1, -98], + [0, 0, 0, 1] + ], + "cornerOffsetFromSlot": [ + [1, 0, 0, -20.005], + [0, 1, 0, -0.84], + [0, 0, 1, -98], + [0, 0, 0, 1] + ] + } + } + }, + "compatibleWith": [], + "twoDimensionalRendering": { + "name": "svg", + "type": "element", + "value": "", + "attributes": { + "version": "1.1", + "id": "thermocycler", + "xmlns": "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink", + "x": "0px", + "y": "0px", + "viewBox": "0 0 172 258", + "style": "enable-background:new 0 0 172 258;", + "xml:space": "preserve" + }, + "children": [ + { + "name": "style", + "type": "element", + "value": "", + "attributes": { + "type": "text/css" + }, + "children": [ + { + "name": "", + "type": "text", + "value": "\n.st0{fill:#FFFFFF;}\n.st1{fill:#E6E6E6;}\n", + "attributes": {}, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "closed" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "d": "M145.2,232.7V186c0-4-2.7-7.2-6-7.2H32.5c-3.3,0-5.7,3.2-5.7,7.2v46.7H0.4V0.4h171.2v232.3H145.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st1", + "d": "M139.1,178.8h-106c-3.3,0-6,2.7-6,6v47.9h118v-47.9C145.1,181.5,142.4,178.8,139.1,178.8z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "rect", + "type": "element", + "value": "", + "attributes": { + "x": "4.2", + "y": "0.4", + "class": "st1", + "width": "163.4", + "height": "38.3" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "d": "M141,191.8H31.1c-1.1,0-2,0.9-2,2v49.2c0,1.1,0.9,2,2,2H141c1.1,0,2-0.9,2-2v-49.2\n C143,192.7,142.1,191.8,141,191.8z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "rect", + "type": "element", + "value": "", + "attributes": { + "x": "32.7", + "y": "195.4", + "class": "st1", + "width": "106.8", + "height": "49.5" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "d": "M130.8,18.5H41.2c-1.6,0-3,1.3-3,3l0,0c0,1.7,1.3,3,3,3h89.6c1.6,0,3-1.3,3-3l0,0\n C133.8,19.9,132.5,18.5,130.8,18.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M130.8,18.3H41.2c-1.7,0-3.2,1.4-3.2,3.2c0,1.7,1.4,3.2,3.2,3.2h89.6c1.7,0,3.2-1.4,3.2-3.2\n C133.9,19.8,132.5,18.3,130.8,18.3z M41.2,24.3c-1.5,0-2.8-1.3-2.8-2.8c0-1.6,1.3-2.8,2.8-2.8h89.6c1.5,0,2.8,1.3,2.8,2.8\n c0,1.6-1.3,2.8-2.8,2.8H41.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M4.4,0.2c-0.1,0-0.2,0.1-0.2,0.2v232.3c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2V0.4C4.6,0.3,4.5,0.2,4.4,0.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M171.6,38.3H0.4c-0.2,0-0.4,0.2-0.4,0.4S0.2,39,0.4,39h171.2c0.2,0,0.4-0.2,0.4-0.4S171.8,38.3,171.6,38.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M167.6,0.2c-0.1,0-0.2,0.1-0.2,0.2v232.4c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2V0.4\n C167.8,0.3,167.7,0.2,167.6,0.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M139.5,242.3c-0.1,0-0.1,0.1-0.1,0.1v2.5c0,0.1,0.1,0.1,0.1,0.1s0.1-0.1,0.1-0.1v-2.5\n C139.6,242.4,139.5,242.3,139.5,242.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M139.1,195.1H139c-0.1,0-0.1,0.1-0.1,0.1s0.1,0.1,0.1,0.1h0.1l0.2,0.1l0.1,0.1l0,0.1c0,0.1,0.1,0.1,0.1,0.1\n s0.1-0.1,0.1-0.1v-0.1c0,0,0,0,0,0l-0.1-0.2l-0.1-0.1c0,0,0,0,0,0L139.1,195.1C139.1,195.1,139.1,195.1,139.1,195.1z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M33.1,195.1H33c0,0,0,0,0,0l-0.1,0c0,0,0,0,0,0l-0.1,0.1l-0.1,0c0,0,0,0,0,0l-0.1,0.2l0,0.1c0,0,0,0,0,0v0.1\n c0,0.1,0.1,0.1,0.1,0.1c0.1,0,0.1-0.1,0.1-0.1v0l0.1-0.1l0-0.1l0,0c0,0,0,0,0,0l0,0l0.1,0h0.1c0.1,0,0.1-0.1,0.1-0.1\n C33.2,195.2,33.1,195.1,33.1,195.1z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M32.6,242.3c-0.1,0-0.1,0.1-0.1,0.1v2.5c0,0.1,0.1,0.1,0.1,0.1c0.1,0,0.1-0.1,0.1-0.1v-2.5\n C32.7,242.4,32.6,242.3,32.6,242.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M0.4,0C0.2,0,0.1,0.2,0.1,0.4v232.3c0,0.2,0.2,0.4,0.4,0.4h28.7c0.2,0,0.4-0.2,0.4-0.4c0-0.2-0.2-0.4-0.4-0.4H0.8V0.7\n h170.5v231.7H143c-0.2,0-0.4,0.2-0.4,0.4s0.2,0.4,0.4,0.4h28.7c0.2,0,0.4-0.2,0.4-0.4V0.4c0-0.2-0.2-0.4-0.4-0.4H0.5\n C0.5,0,0.4,0,0.4,0z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M171.6,4.2H0.4c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h171.2c0.1,0,0.2-0.1,0.2-0.2\n C171.8,4.3,171.7,4.2,171.6,4.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M150.6,12.4c-5,0-9.1,4.1-9.1,9.1s4.1,9.1,9.1,9.1s9.1-4.1,9.1-9.1S155.6,12.4,150.6,12.4z M150.6,30.2\n c-4.8,0-8.7-3.9-8.7-8.7s3.9-8.7,8.7-8.7s8.7,3.9,8.7,8.7S155.4,30.2,150.6,30.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "ellipse", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "cx": "150.6", + "cy": "21.5", + "rx": "5.8", + "ry": "5.8" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M150.6,15.5c-3.3,0-6,2.7-6,6s2.7,6,6,6s6-2.7,6-6S153.9,15.5,150.6,15.5z M150.6,27.2c-3.1,0-5.7-2.5-5.7-5.7\n s2.5-5.7,5.7-5.7s5.7,2.5,5.7,5.7S153.7,27.2,150.6,27.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "ellipse", + "type": "element", + "value": "", + "attributes": { + "class": "st1", + "cx": "150.6", + "cy": "21.5", + "rx": "3.8", + "ry": "3.8" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M150.6,17.6c-2.2,0-3.9,1.8-3.9,4s1.8,4,3.9,4c2.2,0,3.9-1.8,3.9-4C154.5,19.3,152.8,17.6,150.6,17.6z M150.6,25.1\n c-2,0-3.6-1.6-3.6-3.6s1.6-3.6,3.6-3.6s3.6,1.6,3.6,3.6S152.6,25.1,150.6,25.1z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M141,191.4H31.1c-1.3,0-2.3,1.1-2.3,2.3v51.2c0,0.2,0.2,0.4,0.4,0.4H143c0.2,0,0.4-0.2,0.4-0.4v-51.2\n C143.3,192.5,142.3,191.4,141,191.4z M29.5,244.6v-50.8c0-0.9,0.7-1.6,1.6-1.6H141c0.9,0,1.6,0.7,1.6,1.6v50.8H29.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M139,195.1H33.1c-0.4,0-0.7,0.3-0.7,0.7v49.2c0,0.1,0.1,0.2,0.2,0.2h106.9c0.1,0,0.2-0.1,0.2-0.2v-49.2\n C139.7,195.4,139.4,195.1,139,195.1z M32.8,244.8v-49c0-0.2,0.1-0.3,0.3-0.3H139c0.2,0,0.3,0.1,0.3,0.3v49H32.8z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M139.1,178.4H32.7c-3.5,0-6.3,2.8-6.3,6.3V233h0.7v-48.2c0-3.1,2.5-5.6,5.6-5.6h106.4c3.1,0,5.6,2.5,5.6,5.6v47.7h0.7\n v-47.7C145.4,181.3,142.6,178.4,139.1,178.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M51.7,79.2c-0.1,0-0.1,0.1-0.1,0.1v99.4c0,0.1,0.1,0.1,0.1,0.1c0.1,0,0.1-0.1,0.1-0.1V79.3\n C51.8,79.2,51.8,79.2,51.7,79.2z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M120.4,79.1c-0.1,0-0.2,0.1-0.2,0.2v99.4c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2V79.3\n C120.6,79.2,120.5,79.1,120.4,79.1z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M120.4,79.1H51.6c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h68.7c0.1,0,0.2-0.1,0.2-0.2\n C120.6,79.2,120.5,79.1,120.4,79.1z" + }, + "children": [] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "open" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "shading_00000140696093821789790550000002253882697550769834_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "d": "M51.7,247.3c0,2.4,0,9.8,0,11.1c0,1.4,0,2.8,1.1,3.9c1.2,1.2,2.6,1.2,4.1,1.2c1.6,0,58,0,59.1,0\n c1.3,0,2.5-0.3,3.3-1.3c1.3-1.4,1-3.3,1-5c0-1.8,0-8.4,0-9.9" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "rect", + "type": "element", + "value": "", + "attributes": { + "x": "55.6", + "y": "246.9", + "class": "st1", + "width": "60.7", + "height": "12.7" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "d": "M171.6,38.7H0.4v206.3c0,1.1,0.9,2,2,2h167.3c1.1,0,2-0.9,2-2L171.6,38.7L171.6,38.7z" + }, + "children": [] + }, + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M171.6,38.3H0.4c-0.2,0-0.4,0.2-0.4,0.4v206.3c0,1.3,1.1,2.3,2.3,2.3h167.3c1.3,0,2.3-1.1,2.3-2.3V38.7\n C172,38.5,171.8,38.3,171.6,38.3z M0.7,39h170.6v205.9c0,0.9-0.7,1.6-1.6,1.6H2.3c-0.9,0-1.6-0.7-1.6-1.6\n C0.7,244.9,0.7,39,0.7,39z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "base_grey_00000027585544793631977930000012329166542688174233_" + }, + "children": [ + { + "name": "rect", + "type": "element", + "value": "", + "attributes": { + "x": "4.4", + "y": "39.1", + "class": "st1", + "width": "163.4", + "height": "203.4" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "d": "M19.3,70.9v-4.4c0-1.2,1-2.2,2.2-2.2h129c1.2,0,2.2,1,2.2,2.2v4.4h-5.9c-0.6,0-1,0.4-1,1v2.5\n c0,0.6,0.4,1,1,1h5.9v65.3h-5.9c-0.6,0-1,0.4-1,1v2.5c0,0.6,0.4,1,1,1h5.9V156c0,1.2-1,2.2-2.2,2.2h-129l0,0\n c-1.2,0-2.2-1-2.2-2.2v0v-10.8h5.9c0.6,0,1-0.4,1-1v-2.5c0-0.6-0.4-1-1-1h-5.9V75.4h5.9c0.6,0,1-0.4,1-1v-2.5c0-0.6-0.4-1-1-1\n L19.3,70.9" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "class": "st0", + "d": "M143,203v-9.2c0-1.1-0.9-2-2-2H31.1c-1.1,0-2,0.9-2,2v9.2" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "polyline", + "type": "element", + "value": "", + "attributes": { + "class": "st1", + "points": "139.5,203.1 139.5,195.4 32.8,195.4 32.8,203.3 \t\t\t" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "stroke" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M116.5,246.7h-0.4v12.7H55.8v-12.7h-0.4v12.9c0,0.1,0.1,0.2,0.2,0.2h60.7c0.1,0,0.2-0.1,0.2-0.2V246.7z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M120.4,246.6c-0.2,0-0.4,0.2-0.4,0.4v10.2c0,0.3,0,0.5,0,0.8c0,1.5,0.1,3-0.9,4.2c-0.7,0.8-1.7,1.2-3.1,1.2H56.9\n c-1.4,0-2.8,0-3.8-1.1c-1-1.1-1-2.5-1-3.8v-11.4c0-0.2-0.2-0.4-0.4-0.4s-0.4,0.2-0.4,0.4v11.4c0,1.4,0,3,1.2,4.3\n c1.3,1.3,2.8,1.3,4.4,1.3H116c1.5,0,2.7-0.5,3.6-1.5c1.2-1.3,1.1-3.1,1.1-4.6c0-0.3,0-0.5,0-0.8v-10.2\n C120.7,246.7,120.6,246.6,120.4,246.6z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000072973290214693693960000017318416397027368577_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,139.7,45.7,139.7z M45.7,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,145.3,45.7,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,139.7,54.7,139.7z M54.7,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,145.3,54.7,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,139.7,63.6,139.7z M63.6,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,145.3,63.6,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,139.7,72.6,139.7z M72.6,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,145.3,72.6,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,139.7,81.6,139.7z M81.6,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,145.3,81.6,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,139.7,90.5,139.7z M90.5,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,145.3,90.5,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,139.7,99.5,139.7z M99.5,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,145.3,99.5,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,139.7,108.4,139.7z M108.4,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,145.3,108.4,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,139.7,117.4,139.7z M117.4,145.3\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,145.3,117.4,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,139.7,126.3,139.7z M126.3,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,145.3,126.3,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,139.7,135.3,139.7z M135.3,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,145.3,135.3,145.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,139.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,139.7,36.7,139.7z M36.7,145.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,145.3,36.7,145.3z" + }, + "children": [] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000153665527845359773540000012752985171215028372_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,130.7,45.7,130.7z M45.7,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,136.3,45.7,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,130.7,54.7,130.7z M54.7,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,136.3,54.7,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,130.7,63.6,130.7z M63.6,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,136.3,63.6,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,130.7,72.6,130.7z M72.6,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,136.3,72.6,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,130.7,81.6,130.7z M81.6,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,136.3,81.6,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,130.7,90.5,130.7z M90.5,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,136.3,90.5,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,130.7,99.5,130.7z M99.5,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,136.3,99.5,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,130.7,108.4,130.7z M108.4,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,136.3,108.4,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,130.7,117.4,130.7z M117.4,136.3\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,136.3,117.4,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,130.7,126.3,130.7z M126.3,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,136.3,126.3,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,130.7,135.3,130.7z M135.3,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,136.3,135.3,136.3z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,130.7c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,130.7,36.7,130.7z M36.7,136.3c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,136.3,36.7,136.3z" + }, + "children": [] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000001654953178113305770000001548480951139594390_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C48.7,123.1,47.3,121.8,45.7,121.8z M45.7,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,127.4,45.7,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C57.7,123.1,56.3,121.8,54.7,121.8z M54.7,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,127.4,54.7,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C66.6,123.1,65.3,121.8,63.6,121.8z M63.6,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,127.4,63.6,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C75.6,123.1,74.2,121.8,72.6,121.8z M72.6,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,127.4,72.6,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C84.5,123.1,83.2,121.8,81.6,121.8z M81.6,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,127.4,81.6,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C93.5,123.1,92.1,121.8,90.5,121.8z M90.5,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,127.4,90.5,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C102.4,123.1,101.1,121.8,99.5,121.8z M99.5,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,127.4,99.5,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C111.4,123.1,110.1,121.8,108.4,121.8z M108.4,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,127.4,108.4,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C120.3,123.1,119,121.8,117.4,121.8z M117.4,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,127.4,117.4,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C129.3,123.1,128,121.8,126.3,121.8z M126.3,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,127.4,126.3,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C138.3,123.1,137,121.8,135.3,121.8z M135.3,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,127.4,135.3,127.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,121.8c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C39.7,123.1,38.4,121.8,36.7,121.8z M36.7,127.4\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,127.4,36.7,127.4z" + }, + "children": [] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000142157505160117839040000001831267897535693211_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,112.8,45.7,112.8z M45.7,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C48.3,117.2,47.2,118.4,45.7,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,112.8,54.7,112.8z M54.7,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C57.3,117.2,56.1,118.4,54.7,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,112.8,63.6,112.8z M63.6,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C66.3,117.2,65.1,118.4,63.6,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,112.8,72.6,112.8z M72.6,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C75.2,117.2,74,118.4,72.6,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,112.8,81.6,112.8z M81.6,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C84.2,117.2,83,118.4,81.6,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,112.8,90.5,112.8z M90.5,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C93.1,117.2,91.9,118.4,90.5,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,112.8,99.5,112.8z M99.5,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C102.1,117.2,100.9,118.4,99.5,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,112.8,108.4,112.8z M108.4,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C111,117.2,109.9,118.4,108.4,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,112.8,117.4,112.8z M117.4,118.4\n c-1.4,0-2.6-1.2-2.6-2.6c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C120,117.2,118.8,118.4,117.4,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,112.8,126.3,112.8z M126.3,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C129,117.2,127.8,118.4,126.3,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,112.8,135.3,112.8z M135.3,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C137.9,117.2,136.8,118.4,135.3,118.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,112.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,112.8,36.7,112.8z M36.7,118.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C39.4,117.2,38.2,118.4,36.7,118.4z" + }, + "children": [] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000023262343608832889980000007837414120611036803_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,103.8,45.7,103.8z M45.7,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C48.3,108.2,47.2,109.4,45.7,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,103.8,54.7,103.8z M54.7,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C57.3,108.2,56.1,109.4,54.7,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,103.8,63.6,103.8z M63.6,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C66.3,108.2,65.1,109.4,63.6,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,103.8,72.6,103.8z M72.6,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C75.2,108.2,74,109.4,72.6,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,103.8,81.6,103.8z M81.6,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C84.2,108.2,83,109.4,81.6,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,103.8,90.5,103.8z M90.5,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C93.1,108.2,91.9,109.4,90.5,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,103.8,99.5,103.8z M99.5,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C102.1,108.2,100.9,109.4,99.5,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,103.8,108.4,103.8z M108.4,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C111,108.2,109.9,109.4,108.4,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,103.8,117.4,103.8z M117.4,109.4\n c-1.4,0-2.6-1.2-2.6-2.6c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C120,108.2,118.8,109.4,117.4,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,103.8,126.3,103.8z M126.3,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C129,108.2,127.8,109.4,126.3,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,103.8,135.3,103.8z M135.3,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C137.9,108.2,136.8,109.4,135.3,109.4z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,103.8c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,103.8,36.7,103.8z M36.7,109.4c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C39.4,108.2,38.2,109.4,36.7,109.4z" + }, + "children": [] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000032644834021452807300000012529714203134445742_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,94.9,45.7,94.9z M45.7,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C48.3,99.3,47.2,100.5,45.7,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,94.9,54.7,94.9z M54.7,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C57.3,99.3,56.1,100.5,54.7,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,94.9,63.6,94.9z M63.6,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C66.3,99.3,65.1,100.5,63.6,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,94.9,72.6,94.9z M72.6,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C75.2,99.3,74,100.5,72.6,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,94.9,81.6,94.9z M81.6,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C84.2,99.3,83,100.5,81.6,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,94.9,90.5,94.9z M90.5,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C93.1,99.3,91.9,100.5,90.5,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,94.9,99.5,94.9z M99.5,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C102.1,99.3,100.9,100.5,99.5,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,94.9,108.4,94.9z M108.4,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C111,99.3,109.9,100.5,108.4,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,94.9,117.4,94.9z M117.4,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C120,99.3,118.8,100.5,117.4,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,94.9,126.3,94.9z M126.3,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C129,99.3,127.8,100.5,126.3,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,94.9,135.3,94.9z M135.3,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6C137.9,99.3,136.8,100.5,135.3,100.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,94.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,94.9,36.7,94.9z M36.7,100.5c-1.4,0-2.6-1.2-2.6-2.6\n c0-1.4,1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6C39.4,99.3,38.2,100.5,36.7,100.5z" + }, + "children": [] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000046301211336714059340000011006363706714132412_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S47.3,85.9,45.7,85.9z M45.7,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,91.5,45.7,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S56.3,85.9,54.7,85.9z M54.7,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,91.5,54.7,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S65.3,85.9,63.6,85.9z M63.6,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,91.5,63.6,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S74.2,85.9,72.6,85.9z M72.6,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,91.5,72.6,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S83.2,85.9,81.6,85.9z M81.6,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,91.5,81.6,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S92.1,85.9,90.5,85.9z M90.5,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,91.5,90.5,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S101.1,85.9,99.5,85.9z M99.5,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,91.5,99.5,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S110.1,85.9,108.4,85.9z M108.4,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,91.5,108.4,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3c1.6,0,3-1.3,3-3S119,85.9,117.4,85.9z M117.4,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,91.5,117.4,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S128,85.9,126.3,85.9z M126.3,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,91.5,126.3,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S137,85.9,135.3,85.9z M135.3,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,91.5,135.3,91.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,85.9c-1.6,0-3,1.3-3,3s1.3,3,3,3s3-1.3,3-3S38.4,85.9,36.7,85.9z M36.7,91.5c-1.4,0-2.6-1.2-2.6-2.6\n s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,91.5,36.7,91.5z" + }, + "children": [] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": { + "id": "row_1_00000090987415974105529780000012985790832784842890_" + }, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M45.7,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C48.7,78.2,47.3,76.9,45.7,76.9z M45.7,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S47.2,82.5,45.7,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M54.7,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C57.7,78.2,56.3,76.9,54.7,76.9z M54.7,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S56.1,82.5,54.7,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M63.6,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C66.6,78.2,65.3,76.9,63.6,76.9z M63.6,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S65.1,82.5,63.6,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M72.6,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C75.6,78.2,74.2,76.9,72.6,76.9z M72.6,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S74,82.5,72.6,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M81.6,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C84.5,78.2,83.2,76.9,81.6,76.9z M81.6,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S83,82.5,81.6,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M90.5,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C93.5,78.2,92.1,76.9,90.5,76.9z M90.5,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S91.9,82.5,90.5,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M99.5,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C102.4,78.2,101.1,76.9,99.5,76.9z M99.5,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S100.9,82.5,99.5,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M108.4,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C111.4,78.2,110.1,76.9,108.4,76.9z M108.4,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S109.9,82.5,108.4,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M117.4,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3c1.6,0,3-1.3,3-3C120.3,78.2,119,76.9,117.4,76.9z M117.4,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S118.8,82.5,117.4,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M126.3,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C129.3,78.2,128,76.9,126.3,76.9z M126.3,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S127.8,82.5,126.3,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M135.3,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C138.3,78.2,137,76.9,135.3,76.9z M135.3,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S136.8,82.5,135.3,82.5z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M36.7,76.9c-1.6,0-3,1.3-3,3c0,1.6,1.3,3,3,3s3-1.3,3-3C39.7,78.2,38.4,76.9,36.7,76.9z M36.7,82.5\n c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S38.2,82.5,36.7,82.5z" + }, + "children": [] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M171.6,208.8H0.4c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h171.3c0.1,0,0.2-0.1,0.2-0.2\n C171.8,208.9,171.7,208.8,171.6,208.8z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M171.6,212.8H0.4c-0.1,0-0.2,0.1-0.2,0.2c0,0.1,0.1,0.2,0.2,0.2h171.3c0.1,0,0.2-0.1,0.2-0.2\n C171.8,212.9,171.7,212.8,171.6,212.8z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M10.9,202.8h-0.4c-0.1,0-0.2,0.1-0.2,0.2s0.1,0.2,0.2,0.2h0.4c0.3,0,0.6,0.1,0.8,0.4l3.3,4.5c0.4,0.5,0.8,0.9,1.3,1.1\n c0.1,0,0.2,0,0.2-0.1c0-0.1,0-0.2-0.1-0.2c-0.5-0.2-0.9-0.6-1.2-1l-3.3-4.5C11.7,203,11.3,202.8,10.9,202.8z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M161.6,202.8h-0.4c-0.4,0-0.8,0.2-1.1,0.5l-3.3,4.5c-0.3,0.4-0.7,0.8-1.2,1c-0.1,0-0.1,0.1-0.1,0.2\n c0,0.1,0.1,0.1,0.2,0.1c0.5-0.2,1-0.6,1.3-1.1l3.3-4.5c0.2-0.3,0.5-0.4,0.8-0.4h0.4c0.1,0,0.2-0.1,0.2-0.2\n C161.8,202.9,161.7,202.8,161.6,202.8z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M161.6,202.7H10.5c-0.2,0-0.4,0.2-0.4,0.4s0.2,0.4,0.4,0.4h151.2c0.2,0,0.4-0.2,0.4-0.4S161.8,202.7,161.6,202.7z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M0.4,103.9H0.3c-0.1,0-0.1,0.1-0.1,0.1c0,0.1,0.1,0.1,0.1,0.1h0.1c0.1,0,0.1-0.1,0.1-0.1C0.5,104,0.5,103.9,0.4,103.9z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M167.6,38.9c-0.1,0-0.2,0.1-0.2,0.2v203.4H4.6V39.1c0-0.1-0.1-0.2-0.2-0.2c-0.1,0-0.2,0.1-0.2,0.2v203.6\n c0,0.1,0.1,0.2,0.2,0.2h163.2c0.1,0,0.2-0.1,0.2-0.2V39.1C167.8,39,167.7,38.9,167.6,38.9z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M150.5,63.9h-129c-1.4,0-2.6,1.2-2.6,2.6v4.4c0,0.2,0.2,0.4,0.4,0.4h5.9c0.4,0,0.6,0.3,0.6,0.6v2.5\n c0,0.4-0.3,0.6-0.6,0.6h-5.9c-0.2,0-0.4,0.2-0.4,0.4v65.3c0,0.2,0.2,0.4,0.4,0.4h5.9c0.4,0,0.6,0.3,0.6,0.6v2.5\n c0,0.4-0.3,0.6-0.6,0.6h-5.9c-0.2,0-0.4,0.2-0.4,0.4V156c0,1.4,1.2,2.6,2.6,2.6h129c1.4,0,2.6-1.2,2.6-2.6v-10.9\n c0-0.2-0.2-0.4-0.4-0.4h-5.9c-0.4,0-0.6-0.3-0.6-0.6v-2.5c0-0.4,0.3-0.6,0.6-0.6h5.9c0.2,0,0.4-0.2,0.4-0.4V75.4\n c0-0.2-0.2-0.4-0.4-0.4h-5.9c-0.4,0-0.6-0.3-0.6-0.6v-2.5c0-0.4,0.3-0.6,0.6-0.6h5.9c0.2,0,0.4-0.2,0.4-0.4v-4.4\n C153.1,65.1,151.9,63.9,150.5,63.9z M19.7,70.5v-4c0-1,0.8-1.9,1.9-1.9h129c1,0,1.9,0.8,1.9,1.9v4h-5.5c-0.7,0-1.3,0.6-1.3,1.3\n v2.5c0,0.7,0.6,1.3,1.3,1.3h5.5v64.6h-5.5c-0.7,0-1.3,0.6-1.3,1.3v2.5c0,0.7,0.6,1.3,1.3,1.3h5.5V156c0,1-0.8,1.9-1.9,1.9h-129\n c-1,0-1.9-0.8-1.9-1.9v-10.5h5.5c0.7,0,1.3-0.6,1.3-1.3v-2.5c0-0.7-0.6-1.3-1.3-1.3h-5.5V75.7h5.5c0.7,0,1.3-0.6,1.3-1.3v-2.5\n c0-0.7-0.6-1.3-1.3-1.3L19.7,70.5L19.7,70.5z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M47.7,52.7c-3.2,0-5.2,3.4-6.3,5.5c-0.1,0.1-0.1,0.2-0.2,0.3c-0.4,0.8-0.9,1.7-1.8,1.7H21c-3.5,0-6.3,2.8-6.3,6.3v95.9\n c0,3.5,2.8,6.3,6.3,6.3h130c3.5,0,6.3-2.8,6.3-6.3V66.6c0-3.5-2.8-6.3-6.3-6.3h-18.4c-0.9,0-1.3-0.9-1.8-1.7\n c-0.1-0.1-0.1-0.2-0.2-0.3c-1-1.9-2.2-3.9-4.2-5c-0.8-0.4-1.7-0.6-2.5-0.5H48.1C47.9,52.7,47.8,52.7,47.7,52.7z M21,168.1\n c-3.1,0-5.6-2.5-5.6-5.6V66.6c0-3.1,2.5-5.6,5.6-5.6h18.4c1.3,0,1.9-1.2,2.4-2.1c0.1-0.1,0.1-0.2,0.2-0.3\n c1.5-2.7,3.2-5.4,6.1-5.1h76c0,0,0,0,0,0c0.7-0.1,1.5,0.1,2.2,0.4c1.8,0.9,2.9,2.9,3.9,4.7c0.1,0.1,0.1,0.2,0.2,0.3\n c0.5,0.9,1.1,2.1,2.4,2.1H151c3.1,0,5.6,2.5,5.6,5.6v95.9c0,3.1-2.5,5.6-5.6,5.6H21z" + }, + "children": [] + } + ] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M141,191.4H31.1c-1.3,0-2.3,1.1-2.3,2.3v9.2c0,0.2,0.2,0.4,0.4,0.4c0.2,0,0.4-0.2,0.4-0.4v-9.2c0-0.9,0.7-1.6,1.6-1.6H141\n c0.9,0,1.6,0.7,1.6,1.6v9.2c0,0.2,0.2,0.4,0.4,0.4s0.4-0.2,0.4-0.4v-9.2C143.3,192.5,142.3,191.4,141,191.4z" + }, + "children": [] + } + ] + }, + { + "name": "g", + "type": "element", + "value": "", + "attributes": {}, + "children": [ + { + "name": "path", + "type": "element", + "value": "", + "attributes": { + "d": "M139,195.1H33.1c-0.4,0-0.7,0.3-0.7,0.7v7.5c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2v-7.5c0-0.2,0.1-0.3,0.3-0.3H139\n c0.2,0,0.3,0.1,0.3,0.3v7.4c0,0.1,0.1,0.2,0.2,0.2c0.1,0,0.2-0.1,0.2-0.2v-7.4C139.7,195.4,139.4,195.1,139,195.1z" + }, + "children": [] + } + ] + } + ] + } + ] + } +} diff --git a/shared-data/module/schemas/3.json b/shared-data/module/schemas/3.json index 6ccd1bb8eab..fdafba4c8a9 100644 --- a/shared-data/module/schemas/3.json +++ b/shared-data/module/schemas/3.json @@ -81,13 +81,14 @@ "magneticModuleType", "thermocyclerModuleType", "heaterShakerModuleType", - "magneticBlockType" + "magneticBlockType", + "absorbanceReaderType" ], "type": "string" }, "model": { "type": "string", - "pattern": "^(temperatureModule|magneticModule|thermocyclerModule|heaterShakerModule|magneticBlock)V[0-9]+$" + "pattern": "^(temperatureModule|magneticModule|thermocyclerModule|heaterShakerModule|magneticBlock|absorbanceReader)V[0-9]+$" }, "labwareOffset": { "$ref": "#/definitions/coordinates" }, "dimensions": { diff --git a/shared-data/python/opentrons_shared_data/module/dev_types.py b/shared-data/python/opentrons_shared_data/module/dev_types.py index 326d9b6b764..c6dbbc4acad 100644 --- a/shared-data/python/opentrons_shared_data/module/dev_types.py +++ b/shared-data/python/opentrons_shared_data/module/dev_types.py @@ -18,6 +18,7 @@ ThermocyclerModuleType = Literal["thermocyclerModuleType"] HeaterShakerModuleType = Literal["heaterShakerModuleType"] MagneticBlockType = Literal["magneticBlockType"] +AbsorbanceReaderType = Literal["absorbanceReaderType"] ModuleType = Union[ MagneticModuleType, @@ -25,6 +26,7 @@ ThermocyclerModuleType, HeaterShakerModuleType, MagneticBlockType, + AbsorbanceReaderType, ] MagneticModuleModel = Literal["magneticModuleV1", "magneticModuleV2"] @@ -32,6 +34,7 @@ ThermocyclerModuleModel = Literal["thermocyclerModuleV1", "thermocyclerModuleV2"] HeaterShakerModuleModel = Literal["heaterShakerModuleV1"] MagneticBlockModel = Literal["magneticBlockV1"] +AbsorbanceReaderModel = Literal["absorbanceReaderV1"] ModuleModel = Union[ MagneticModuleModel, @@ -39,6 +42,7 @@ ThermocyclerModuleModel, HeaterShakerModuleModel, MagneticBlockModel, + AbsorbanceReaderModel, ] ModuleSlotTransform = TypedDict( From 1e66d706402e5505f2c63fc59af350f09429e544 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Thu, 16 May 2024 09:32:46 -0400 Subject: [PATCH 04/10] fix(api): Parse all RTP fields strictly to fix flakiness (#15187) --- api/src/opentrons/protocol_engine/types.py | 44 ++++++++++++++-------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/api/src/opentrons/protocol_engine/types.py b/api/src/opentrons/protocol_engine/types.py index 13e9515e447..77ab6231b71 100644 --- a/api/src/opentrons/protocol_engine/types.py +++ b/api/src/opentrons/protocol_engine/types.py @@ -4,7 +4,15 @@ from datetime import datetime from enum import Enum from dataclasses import dataclass -from pydantic import BaseModel, Field, validator +from pydantic import ( + BaseModel, + Field, + StrictBool, + StrictFloat, + StrictInt, + StrictStr, + validator, +) from typing import Optional, Union, List, Dict, Any, NamedTuple, Tuple, FrozenSet from typing_extensions import Literal, TypeGuard @@ -877,12 +885,14 @@ def from_hw_state(cls, state: HwTipStateType) -> "TipPresenceStatus": class RTPBase(BaseModel): """Parameters defined in a protocol.""" - displayName: str = Field(..., description="Display string for the parameter.") - variableName: str = Field(..., description="Python variable name of the parameter.") - description: Optional[str] = Field( + displayName: StrictStr = Field(..., description="Display string for the parameter.") + variableName: StrictStr = Field( + ..., description="Python variable name of the parameter." + ) + description: Optional[StrictStr] = Field( None, description="Detailed description of the parameter." ) - suffix: Optional[str] = Field( + suffix: Optional[StrictStr] = Field( None, description="Units (like mL, mm/sec, etc) or a custom suffix for the parameter.", ) @@ -894,17 +904,17 @@ class NumberParameter(RTPBase): type: Literal["int", "float"] = Field( ..., description="String specifying whether the number is an int or float type." ) - min: float = Field( + min: Union[StrictInt, StrictFloat] = Field( ..., description="Minimum value that the number param is allowed to have." ) - max: float = Field( + max: Union[StrictInt, StrictFloat] = Field( ..., description="Maximum value that the number param is allowed to have." ) - value: float = Field( + value: Union[StrictInt, StrictFloat] = Field( ..., description="The value assigned to the parameter; if not supplied by the client, will be assigned the default value.", ) - default: float = Field( + default: Union[StrictInt, StrictFloat] = Field( ..., description="Default value of the parameter, to be used when there is no client-specified value.", ) @@ -916,11 +926,11 @@ class BooleanParameter(RTPBase): type: Literal["bool"] = Field( default="bool", description="String specifying the type of this parameter" ) - value: bool = Field( + value: StrictBool = Field( ..., description="The value assigned to the parameter; if not supplied by the client, will be assigned the default value.", ) - default: bool = Field( + default: StrictBool = Field( ..., description="Default value of the parameter, to be used when there is no client-specified value.", ) @@ -929,8 +939,10 @@ class BooleanParameter(RTPBase): class EnumChoice(BaseModel): """Components of choices used in RTP Enum Parameters.""" - displayName: str = Field(..., description="Display string for the param's choice.") - value: Union[float, str] = Field( + displayName: StrictStr = Field( + ..., description="Display string for the param's choice." + ) + value: Union[StrictInt, StrictFloat, StrictStr] = Field( ..., description="Enum value of the param's choice." ) @@ -945,11 +957,11 @@ class EnumParameter(RTPBase): choices: List[EnumChoice] = Field( ..., description="List of valid choices for this parameter." ) - value: Union[float, str] = Field( + value: Union[StrictInt, StrictFloat, StrictStr] = Field( ..., description="The value assigned to the parameter; if not supplied by the client, will be assigned the default value.", ) - default: Union[float, str] = Field( + default: Union[StrictInt, StrictFloat, StrictStr] = Field( ..., description="Default value of the parameter, to be used when there is no client-specified value.", ) @@ -958,5 +970,5 @@ class EnumParameter(RTPBase): RunTimeParameter = Union[NumberParameter, EnumParameter, BooleanParameter] RunTimeParamValuesType = Dict[ - str, Union[float, bool, str] + StrictStr, Union[StrictInt, StrictFloat, StrictBool, StrictStr] ] # update value types as more RTP types are added From 5ddef479ca2d6719b02c3378a2fabab6d26ff765 Mon Sep 17 00:00:00 2001 From: Rhyann Clarke <146747548+rclarke0@users.noreply.github.com> Date: Thu, 16 May 2024 09:47:11 -0400 Subject: [PATCH 05/10] ABR LPC Automated Logging (#15163) # Overview # Test Plan # Changelog # Review requests # Risk assessment --- .../automation/google_sheets_tool.py | 63 ++++++++++++++++++- .../data_collection/abr_google_drive.py | 22 +++++-- .../abr_testing/data_collection/abr_lpc.py | 57 ++++++++++++++++- .../data_collection/abr_robot_error.py | 45 ++++++------- .../data_collection/read_robot_logs.py | 54 ++++++++++------ .../data_collection/single_run_log_reader.py | 7 ++- 6 files changed, 196 insertions(+), 52 deletions(-) diff --git a/abr-testing/abr_testing/automation/google_sheets_tool.py b/abr-testing/abr_testing/automation/google_sheets_tool.py index e132422a482..0a2e2bdfeb5 100644 --- a/abr-testing/abr_testing/automation/google_sheets_tool.py +++ b/abr-testing/abr_testing/automation/google_sheets_tool.py @@ -87,6 +87,25 @@ def delete_row(self, row_index: int) -> None: """Delete Row from google sheet.""" self.worksheet.delete_rows(row_index) + def batch_delete_rows(self, row_indices: List[int]) -> None: + """Batch delete rows in list of indices.""" + delete_body = { + "requests": [ + { + "deleteDimension": { + "range": { + "sheetId": 0, + "dimension": "ROWS", + "startIndex": index, + "endIndex": index + 1, + } + } + } + for index in row_indices + ] + } + self.spread_sheet.batch_update(body=delete_body) + def update_cell( self, row: int, column: int, single_data: Any ) -> Tuple[int, int, Any]: @@ -94,7 +113,7 @@ def update_cell( self.worksheet.update_cell(row, column, single_data) return row, column, single_data - def get_all_data(self) -> Dict[str, Any]: + def get_all_data(self) -> List[Dict[str, Any]]: """Get all the Data recorded from worksheet.""" return self.worksheet.get_all_records() @@ -141,3 +160,45 @@ def get_row_index_with_value(self, some_string: str, col_num: int) -> Any: print("Row not found.") return None return row_index + + def create_line_chart( + self, + titles: List[str], + series: List[Dict[str, Any]], + domains: List[Dict[str, Any]], + ) -> None: + """Create chart of data on google sheet.""" + request_body = { + "requests": [ + { + "addChart": { + "chart": { + "spec": { + "title": titles[0], + "basicChart": { + "chartType": "LINE", + "legendPosition": "RIGHT_LEGEND", + "axis": [ + {"position": "BOTTOM_AXIS", "title": titles[1]}, + {"position": "LEFT_AXIS", "title": titles[2]}, + ], + "domains": domains, + "series": series, + "headerCount": 1, + }, + }, + "position": { + "overlayPosition": { + "anchorCell": { + "sheetId": 0, + "rowIndex": 1, + "columnIndex": 1, + } + } + }, + } + } + } + ] + } + self.spread_sheet.batch_update(body=request_body) diff --git a/abr-testing/abr_testing/data_collection/abr_google_drive.py b/abr-testing/abr_testing/data_collection/abr_google_drive.py index f8a2dc8fa4f..a2a180c2bd5 100644 --- a/abr-testing/abr_testing/data_collection/abr_google_drive.py +++ b/abr-testing/abr_testing/data_collection/abr_google_drive.py @@ -32,9 +32,10 @@ def create_data_dictionary( runs_to_save: Union[Set[str], str], storage_directory: str, issue_url: str, -) -> Tuple[Dict[Any, Dict[str, Any]], List]: +) -> Tuple[Dict[str, Dict[str, Any]], List[str], Dict[str, Dict[str, Any]], List[str]]: """Pull data from run files and format into a dictionary.""" - runs_and_robots = {} + runs_and_robots: Dict[Any, Dict[str, Any]] = {} + runs_and_lpc: Dict[Any, Dict[str, Any]] = {} for filename in os.listdir(storage_directory): file_path = os.path.join(storage_directory, filename) if file_path.endswith(".json"): @@ -108,6 +109,7 @@ def create_data_dictionary( hs_dict = read_robot_logs.hs_commands(file_results) tm_dict = read_robot_logs.temperature_module_commands(file_results) notes = {"Note1": "", "Jira Link": issue_url} + row_for_lpc = {**row, **all_modules, **notes} row_2 = { **row, **all_modules, @@ -116,11 +118,15 @@ def create_data_dictionary( **tm_dict, **tc_dict, } - headers = list(row_2.keys()) + headers: List[str] = list(row_2.keys()) runs_and_robots[run_id] = row_2 + # LPC Data Recording + runs_and_lpc, headers_lpc = read_robot_logs.lpc_data( + file_results, row_for_lpc, runs_and_lpc + ) else: continue - return runs_and_robots, headers + return runs_and_robots, headers, runs_and_lpc, headers_lpc if __name__ == "__main__": @@ -164,7 +170,6 @@ def create_data_dictionary( google_sheet = google_sheets_tool.google_sheet( credentials_path, google_sheet_name, 0 ) - google_sheet_lpc = google_sheets_tool.google_sheet(credentials_path, "ABR-LPC", 0) run_ids_on_gs = google_sheet.get_column(2) run_ids_on_gs = set(run_ids_on_gs) @@ -178,9 +183,14 @@ def create_data_dictionary( run_ids_on_gd, run_ids_on_gs ) # Add missing runs to google sheet - runs_and_robots, headers = create_data_dictionary( + runs_and_robots, headers, runs_and_lpc, headers_lpc = create_data_dictionary( missing_runs_from_gs, storage_directory, "" ) read_robot_logs.write_to_local_and_google_sheet( runs_and_robots, storage_directory, google_sheet_name, google_sheet, headers ) + # Add LPC to google sheet + google_sheet_lpc = google_sheets_tool.google_sheet(credentials_path, "ABR-LPC", 0) + read_robot_logs.write_to_local_and_google_sheet( + runs_and_lpc, storage_directory, "ABR-LPC", google_sheet_lpc, headers_lpc + ) diff --git a/abr-testing/abr_testing/data_collection/abr_lpc.py b/abr-testing/abr_testing/data_collection/abr_lpc.py index dd880d09c37..c39e9017edb 100644 --- a/abr-testing/abr_testing/data_collection/abr_lpc.py +++ b/abr-testing/abr_testing/data_collection/abr_lpc.py @@ -1 +1,56 @@ -"""Get Unique LPC Values from Run logs.""" +"""Automated LPC Data Analysis.""" +import os +import argparse +from abr_testing.automation import google_sheets_tool +import sys + + +def remove_duplicate_data() -> None: + """Determine unique sets of data.""" + seen = set() + new_values = [] + row_indices = [] + sheet_data = google_sheet_lpc.get_all_data() + for i, row in enumerate(sheet_data): + key = ( + row["Robot"], + row["Software Version"], + row["Errors"], + row["Slot"], + row["Module"], + row["Adapter"], + row["X"], + row["Y"], + row["Z"], + ) + + if key not in seen: + seen.add(key) + new_values.append(row) + else: + row_indices.append(i) + if len(row_indices) > 0: + google_sheet_lpc.batch_delete_rows(row_indices) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Read run logs on google drive.") + parser.add_argument( + "storage_directory", + metavar="STORAGE_DIRECTORY", + type=str, + nargs=1, + help="Path to long term storage directory for run logs.", + ) + args = parser.parse_args() + storage_directory = args.storage_directory[0] + try: + credentials_path = os.path.join(storage_directory, "credentials.json") + except FileNotFoundError: + print(f"Add credentials.json file to: {storage_directory}.") + sys.exit() + google_sheet_lpc = google_sheets_tool.google_sheet(credentials_path, "ABR-LPC", 0) + print(len(google_sheet_lpc.get_all_data())) + remove_duplicate_data() + num_of_rows = print(len(google_sheet_lpc.get_all_data())) + # TODO: automate data analysis diff --git a/abr-testing/abr_testing/data_collection/abr_robot_error.py b/abr-testing/abr_testing/data_collection/abr_robot_error.py index 0eb67061e58..2d0f35e2de5 100644 --- a/abr-testing/abr_testing/data_collection/abr_robot_error.py +++ b/abr-testing/abr_testing/data_collection/abr_robot_error.py @@ -7,9 +7,7 @@ import shutil import os import subprocess -import json import sys -import gspread # type: ignore[import] def get_error_runs_from_robot(ip: str) -> List[str]: @@ -145,6 +143,7 @@ def get_error_info_from_robot( whole_description_str, run_log_file_path, ) = get_error_info_from_robot(ip, one_run, storage_directory) + affects_version = "internal release - any" # Get Calibration Data saved_file_path_calibration, calibration = read_robot_logs.get_calibration_offsets( ip, storage_directory @@ -183,35 +182,31 @@ def get_error_info_from_robot( # CONNECT TO GOOGLE DRIVE credentials_path = os.path.join(storage_directory, "credentials.json") google_sheet_name = "ABR-run-data" - try: - google_drive = google_drive_tool.google_drive( - credentials_path, - "1Cvej0eadFOTZr9ILRXJ0Wg65ymOtxL4m", - "rhyann.clarke@opentrons.ocm", - ) - print("Connected to google drive.") - except json.decoder.JSONDecodeError: - print( - "Credential file is damaged. Get from https://console.cloud.google.com/apis/credentials" - ) - sys.exit() + google_drive = google_drive_tool.google_drive( + credentials_path, + "1Cvej0eadFOTZr9ILRXJ0Wg65ymOtxL4m", + "rhyann.clarke@opentrons.ocm", + ) # CONNECT TO GOOGLE SHEET - try: - google_sheet = google_sheets_tool.google_sheet( - credentials_path, google_sheet_name, 0 - ) - print(f"Connected to google sheet: {google_sheet_name}") - except gspread.exceptions.APIError: - print("ERROR: Check google sheet name. Check credentials file.") - sys.exit() + google_sheet = google_sheets_tool.google_sheet( + credentials_path, google_sheet_name, 0 + ) # WRITE ERRORED RUN TO GOOGLE SHEET error_run_log = os.path.join(error_folder_path, os.path.basename(run_log_file_path)) google_drive.upload_file(error_run_log) run_id = os.path.basename(error_run_log).split("_")[1].split(".")[0] - runs_and_robots, headers = abr_google_drive.create_data_dictionary( - run_id, error_folder_path, issue_url - ) + ( + runs_and_robots, + headers, + runs_and_lpc, + headers_lpc, + ) = abr_google_drive.create_data_dictionary(run_id, error_folder_path, issue_url) read_robot_logs.write_to_local_and_google_sheet( runs_and_robots, storage_directory, google_sheet_name, google_sheet, headers ) print("Wrote run to ABR-run-data") + # Add LPC to google sheet + google_sheet_lpc = google_sheets_tool.google_sheet(credentials_path, "ABR-LPC", 0) + read_robot_logs.write_to_local_and_google_sheet( + runs_and_lpc, storage_directory, "ABR-LPC", google_sheet_lpc, headers_lpc + ) diff --git a/abr-testing/abr_testing/data_collection/read_robot_logs.py b/abr-testing/abr_testing/data_collection/read_robot_logs.py index 21f63094a0b..b1d5dcd9ead 100644 --- a/abr-testing/abr_testing/data_collection/read_robot_logs.py +++ b/abr-testing/abr_testing/data_collection/read_robot_logs.py @@ -15,11 +15,17 @@ import sys -def lpc_data(file_results: Dict[str, Any], protocol_info: Dict) -> List[Dict[str, Any]]: +def lpc_data( + file_results: Dict[str, Any], + protocol_info: Dict[str, Any], + runs_and_lpc: Dict[str, Any], +) -> Tuple[Dict[str, Dict[str, Any]], List[str]]: """Get labware offsets from one run log.""" offsets = file_results.get("labwareOffsets", "") - all_offsets: List[Dict[str, Any]] = [] + n = 0 + # TODO: per UNIQUE slot AND LABWARE TYPE only keep the most recent LPC recording if len(offsets) > 0: + unique_offsets: Dict[Any, Any] = {} for offset in offsets: labware_type = offset.get("definitionUri", "") slot = offset["location"].get("slotName", "") @@ -29,19 +35,32 @@ def lpc_data(file_results: Dict[str, Any], protocol_info: Dict) -> List[Dict[str y_offset = offset["vector"].get("y", 0.0) z_offset = offset["vector"].get("z", 0.0) created_at = offset.get("createdAt", "") - row = { - "createdAt": created_at, - "Labware Type": labware_type, - "Slot": slot, - "Module": module_location, - "Adapter": adapter, - "X": x_offset, - "Y": y_offset, - "Z": z_offset, - } - row2 = {**protocol_info, **row} - all_offsets.append(row2) - return all_offsets + if ( + slot, + labware_type, + ) not in unique_offsets or created_at > unique_offsets[ + (slot, labware_type) + ][ + "createdAt" + ]: + unique_offsets[(slot, labware_type)] = { + **protocol_info, + "createdAt": created_at, + "Labware Type": labware_type, + "Slot": slot, + "Module": module_location, + "Adapter": adapter, + "X": x_offset, + "Y": y_offset, + "Z": z_offset, + } + for item in unique_offsets: + run_id = protocol_info["Run_ID"] + "_" + str(n) + runs_and_lpc[run_id] = unique_offsets[item] + n += 1 + headers_lpc = list(unique_offsets[(slot, labware_type)].keys()) + + return runs_and_lpc, headers_lpc def command_time(command: Dict[str, str]) -> Tuple[float, float]: @@ -323,13 +342,12 @@ def write_to_local_and_google_sheet( """Write data dictionary to google sheet and local csv.""" sheet_location = os.path.join(storage_directory, file_name) file_exists = os.path.exists(sheet_location) and os.path.getsize(sheet_location) > 0 - list_of_runs = list(runs_and_robots.keys()) with open(sheet_location, "a", newline="") as f: writer = csv.writer(f) if not file_exists: writer.writerow(header) - for run in range(len(list_of_runs)): - row = runs_and_robots[list_of_runs[run]].values() + for run in runs_and_robots: + row = runs_and_robots[run].values() row_list = list(row) writer.writerow(row_list) google_sheet.write_header(header) diff --git a/abr-testing/abr_testing/data_collection/single_run_log_reader.py b/abr-testing/abr_testing/data_collection/single_run_log_reader.py index df078929338..b16ffd1df97 100644 --- a/abr-testing/abr_testing/data_collection/single_run_log_reader.py +++ b/abr-testing/abr_testing/data_collection/single_run_log_reader.py @@ -33,7 +33,12 @@ sys.exit() # Get Runs from Storage and Read Logs run_ids_in_storage = read_robot_logs.get_run_ids_from_storage(run_log_file_path) - runs_and_robots, header = abr_google_drive.create_data_dictionary( + ( + runs_and_robots, + header, + runs_and_lpc, + lpc_headers, + ) = abr_google_drive.create_data_dictionary( run_ids_in_storage, run_log_file_path, "" ) list_of_runs = list(runs_and_robots.keys()) From c06ffeea8988cad70ecf3283e9236e2a535356e6 Mon Sep 17 00:00:00 2001 From: Derek Maggio Date: Thu, 16 May 2024 06:47:54 -0700 Subject: [PATCH 06/10] test: add v2.18 smoke test protocol (#14946) # Overview Add 2.18 smoke tests for Flex and OT-2 Add change log to pass tests # Test Plan - [x] Test the tests by making sure the tests actually test things as they should be tested --- ...S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py | 610 ++++++++++++++++++ ...S_v2_13_P300M_P20S_HS_TC_TM_SmokeTestV3.py | 16 + ...S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3.py | 43 +- ...S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3.py | 51 +- ...S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3.py | 59 +- ...S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3.py | 70 +- ...S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3.py | 595 +++++++++++++++++ 7 files changed, 1428 insertions(+), 16 deletions(-) create mode 100644 app-testing/files/protocols/Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py create mode 100644 app-testing/files/protocols/OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3.py diff --git a/app-testing/files/protocols/Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py b/app-testing/files/protocols/Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py new file mode 100644 index 00000000000..1e4e4c12060 --- /dev/null +++ b/app-testing/files/protocols/Flex_S_v2_18_P1000_96_GRIP_HS_MB_TC_TM_Smoke.py @@ -0,0 +1,610 @@ +############# +# CHANGELOG # +############# + +# ---- +# 2.18 +# ---- + +# - labware.set_offset +# - Runtime Parameters added +# - TrashContainer.top() and Well.top() now return objects of the same type +# - pipette.drop_tip() if location argument not specified the tips will be dropped at different locations in the bin +# - pipette.drop_tip() if location is specified, the tips will be dropped in the same place every time + +# ---- +# 2.17 +# ---- + +# NOTHING NEW +# This protocol is exactly the same as 2.16 Smoke Test V3 +# The only difference is the API version in the metadata +# There were no new positive test cases for 2.17 +# The negative test cases are captured in the 2.17 dispense changes protocol + +# ---- +# 2.16 +# ---- + +# - prepare_to_aspirate added +# - fixed_trash property changed +# - instrument_context.trash_container property changed + +# ---- +# 2.15 +# ---- + +# - move_labware added - Manual Deck State Modification +# - ProtocolContext.load_adapter added +# - OFF_DECK location added + +from opentrons import protocol_api, types + +metadata = { + "protocolName": "Flex Smoke Test - v2.18", + "author": "Derek Maggio ", +} + +requirements = { + "robotType": "OT-3", + "apiLevel": "2.18", +} + +############# +### FLAGS ### +############# + +# prefer to move off deck, instead of waste chute disposal, if possible +PREFER_MOVE_OFF_DECK = True + +################# +### CONSTANTS ### +################# + +HEATER_SHAKER_ADAPTER_NAME = "opentrons_96_pcr_adapter" +HEATER_SHAKER_NAME = "heaterShakerModuleV1" +MAGNETIC_BLOCK_NAME = "magneticBlockV1" +TEMPERATURE_MODULE_ADAPTER_NAME = "opentrons_96_well_aluminum_block" +TEMPERATURE_MODULE_NAME = "temperature module gen2" +THERMOCYCLER_NAME = "thermocycler module gen2" + +TIPRACK_96_ADAPTER_NAME = "opentrons_flex_96_tiprack_adapter" +TIPRACK_96_NAME = "opentrons_flex_96_tiprack_1000ul" + +PIPETTE_96_CHANNEL_NAME = "flex_96channel_1000" + +############################## +# Runtime Parameters Support # +############################## + +# -------------------------- # +# Added in API version: 2.18 # +# -------------------------- # + + +def add_parameters(parameters: protocol_api.Parameters): + reservoir_choices = [ + {"display_name": "Agilent 1 Well 290 mL", "value": "agilent_1_reservoir_290ml"}, + {"display_name": "Nest 1 Well 290 mL", "value": "nest_1_reservoir_290ml"}, + ] + + well_plate_choices = [ + {"display_name": "Nest 96 Well 100 µL", "value": "nest_96_wellplate_100ul_pcr_full_skirt"}, + {"display_name": "Corning 96 Well 360 µL", "value": "corning_96_wellplate_360ul_flat"}, + {"display_name": "Opentrons Tough 96 Well 200 µL", "value": "opentrons_96_wellplate_200ul_pcr_full_skirt"}, + ] + + parameters.add_str( + variable_name="reservoir_name", + display_name="Reservoir Name", + description="Name of the reservoir", + default="nest_1_reservoir_290ml", + choices=reservoir_choices, + ) + + parameters.add_str( + variable_name="well_plate_name", + display_name="Well Plate Name", + description="Name of the well plate", + default="nest_96_wellplate_100ul_pcr_full_skirt", + choices=well_plate_choices, + ) + + parameters.add_bool( + variable_name="use_gripper", + display_name="Use Gripper", + description="Use Gripper for labware movements?", + default=True, + ) + + parameters.add_bool( + variable_name="reset_after_each_move", + display_name="Reset After Each Move", + description="Reset labware after each move?", + default=True, + ) + + parameters.add_float( + variable_name="heater_shaker_temperature", + display_name="Heater Shaker Temperature", + description="Temperature to set the heater shaker to", + default=75.0, + minimum=37.0, + maximum=100.0, + unit="°C", + ) + + parameters.add_int( + variable_name="heater_shaker_speed", + display_name="Heater Shaker Shake Speed", + description="Speed to set the heater shaker to", + default=1000, + minimum=200, + maximum=3000, + unit="seconds", + ) + + +def run(ctx: protocol_api.ProtocolContext) -> None: + + ############################## + # Runtime Parameters Support # + ############################## + + # -------------------------- # + # Added in API version: 2.18 # + # -------------------------- # + + PCR_PLATE_96_NAME = ctx.params.well_plate_name + RESERVOIR_NAME = ctx.params.reservoir_name + USING_GRIPPER = ctx.params.use_gripper + RESET_AFTER_EACH_MOVE = ctx.params.reset_after_each_move + HEATER_SHAKER_TEMPERATURE: float = ctx.params.heater_shaker_temperature + HEATER_SHAKER_SPEED: int = ctx.params.heater_shaker_speed + + ################ + ### FIXTURES ### + ################ + + trash_bin = ctx.load_trash_bin("B3") + waste_chute = ctx.load_waste_chute() + + ############### + ### MODULES ### + ############### + thermocycler = ctx.load_module(THERMOCYCLER_NAME) # A1 & B1 + magnetic_block = ctx.load_module(MAGNETIC_BLOCK_NAME, "C1") + heater_shaker = ctx.load_module(HEATER_SHAKER_NAME, "A3") + temperature_module = ctx.load_module(TEMPERATURE_MODULE_NAME, "D1") + + thermocycler.open_lid() + heater_shaker.open_labware_latch() + + ####################### + ### MODULE ADAPTERS ### + ####################### + + temperature_module_adapter = temperature_module.load_adapter(TEMPERATURE_MODULE_ADAPTER_NAME) + heater_shaker_adapter = heater_shaker.load_adapter(HEATER_SHAKER_ADAPTER_NAME) + + adapters = [temperature_module_adapter, heater_shaker_adapter] + + ############### + ### LABWARE ### + ############### + + source_reservoir = ctx.load_labware(RESERVOIR_NAME, "D2") + dest_pcr_plate = ctx.load_labware(PCR_PLATE_96_NAME, "C2") + + tip_rack_1 = ctx.load_labware(TIPRACK_96_NAME, "A2", adapter=TIPRACK_96_ADAPTER_NAME) + tip_rack_adapter = tip_rack_1.parent + + tip_rack_2 = ctx.load_labware(TIPRACK_96_NAME, "C3") + tip_rack_3 = ctx.load_labware(TIPRACK_96_NAME, "C4") + + tip_racks = [tip_rack_1, tip_rack_2, tip_rack_3] + + ########################## + ### PIPETTE DEFINITION ### + ########################## + + pipette_96_channel = ctx.load_instrument(PIPETTE_96_CHANNEL_NAME, mount="left", tip_racks=tip_racks) + pipette_96_channel.trash_container = trash_bin + + assert isinstance(pipette_96_channel.trash_container, protocol_api.TrashBin) + + ######################## + ### LOAD SOME LIQUID ### + ######################## + + water = ctx.define_liquid(name="water", description="High Quality H₂O", display_color="#42AB2D") + source_reservoir.wells_by_name()["A1"].load_liquid(liquid=water, volume=29000) + + ################################ + ### GRIPPER LABWARE MOVEMENT ### + ################################ + + def get_disposal_preference(): + """ + Get the disposal preference based on the PREFER_MOVE_OFF_DECK flag. + + Returns: + tuple: A tuple containing the disposal preference. The first element is the location preference, + either `protocol_api.OFF_DECK` or `waste_chute`. The second element is a boolean indicating + whether the gripper is being used or not. + """ + return (protocol_api.OFF_DECK, not USING_GRIPPER) if PREFER_MOVE_OFF_DECK else (waste_chute, USING_GRIPPER) + + def run_moves(labware, move_sequences, reset_location, use_gripper): + """ + Perform a series of moves for a given labware using specified move sequences. + + Will perform 2 versions of the moves: + 1. Moves to each location in the sequence, resetting to the reset location after each move. + 2. Moves to each location in the sequence, resetting to the reset location after all moves. + + Args: + labware (str): The labware to be moved. + move_sequences (list): A list of move sequences, where each sequence is a list of locations. + reset_location (str): The location to reset the labware after each move sequence. + use_gripper (bool): Flag indicating whether to use the gripper during the moves. + """ + + def move_to_locations(labware_to_move, move_locations, reset_after_each_move, use_gripper, reset_location): + """ + Move the labware to the specified locations. + + Args: + labware_to_move (str): The labware to be moved. + move_locations (list): A list of locations to move the labware to. + reset_after_each_move (bool): Flag indicating whether to reset the labware after each move. + use_gripper (bool): Flag indicating whether to use the gripper during the moves. + reset_location (str): The location to reset the labware after each move sequence. + """ + + def reset_labware(): + """ + Reset the labware to the reset location. + """ + ctx.move_labware(labware_to_move, reset_location, use_gripper=use_gripper) + + if len(move_locations) == 0: + return + + for location in move_locations: + ctx.move_labware(labware_to_move, location, use_gripper=use_gripper) + + if reset_after_each_move: + reset_labware() + + if not reset_after_each_move: + reset_labware() + + for move_sequence in move_sequences: + move_to_locations(labware, move_sequence, RESET_AFTER_EACH_MOVE, use_gripper, reset_location) + move_to_locations(labware, move_sequence, not RESET_AFTER_EACH_MOVE, use_gripper, reset_location) + + def test_gripper_moves(): + """ + Function to test the movement of the gripper in various locations. + + This function contains several helper functions to perform the movement of labware using a gripper. + Each function performs a sequence of moves, starting with a specific location on the deck. + + Args: + None + + Returns: + None + """ + + def deck_moves(labware, reset_location): + """ + Function to perform the movement of labware, with the inital position being on the deck. + + Args: + pcr_plate (str): The labware to be moved on the deck. + reset_location (str): The reset location on the deck. + + Returns: + None + """ + deck_move_sequence = [ + ["B2"], # Deck Moves + ["C3"], # Staging Area Slot 3 Moves + ["C4", "D4"], # Staging Area Slot 4 Moves + [thermocycler, temperature_module_adapter, heater_shaker_adapter, magnetic_block], # Module Moves + ] + + run_moves(labware, deck_move_sequence, reset_location, USING_GRIPPER) + + def staging_area_slot_3_moves(labware, reset_location): + """ + Function to perform the movement of labware, with the inital position being on staging area slot 3. + + Args: + labware (str): The labware to be moved in staging area slot 3. + reset_location (str): The reset location in staging area slot 3. + + Returns: + None + """ + staging_area_slot_3_move_sequence = [ + ["B2", "C2"], # Deck Moves + [], # Don't have Staging Area Slot 3 open + ["C4", "D4"], # Staging Area Slot 4 Moves + [thermocycler, temperature_module_adapter, heater_shaker_adapter, magnetic_block], # Module Moves + ] + + run_moves(labware, staging_area_slot_3_move_sequence, reset_location, USING_GRIPPER) + + def staging_area_slot_4_moves(labware, reset_location): + """ + Function to perform the movement of labware, with the inital position being on staging area slot 4. + + Args: + labware (str): The labware to be moved in staging area slot 4. + reset_location (str): The reset location in staging area slot 4. + + Returns: + None + """ + staging_area_slot_4_move_sequence = [ + ["C2", "B2"], # Deck Moves + ["C3"], # Staging Area Slot 3 Moves + ["C4"], # Staging Area Slot 4 Moves + [thermocycler, temperature_module_adapter, heater_shaker_adapter, magnetic_block], # Module Moves + ] + + run_moves(labware, staging_area_slot_4_move_sequence, reset_location, USING_GRIPPER) + + def module_moves(labware, module_locations): + """ + Function to perform the movement of labware, with the inital position being on a module. + + Args: + labware (str): The labware to be moved with modules. + module_locations (list): The locations of the modules. + + Returns: + None + """ + module_move_sequence = [ + ["C2", "B2"], # Deck Moves + ["C3"], # Staging Area Slot 3 Moves + ["C4", "D4"], # Staging Area Slot 4 Moves + ] + + for module_starting_location in module_locations: + labware_move_to_locations = module_locations.copy() + labware_move_to_locations.remove(module_starting_location) + all_sequences = module_move_sequence.copy() + all_sequences.append(labware_move_to_locations) + ctx.move_labware(labware, module_starting_location, use_gripper=USING_GRIPPER) + run_moves(labware, all_sequences, module_starting_location, USING_GRIPPER) + + DECK_MOVE_RESET_LOCATION = "C2" + STAGING_AREA_SLOT_3_RESET_LOCATION = "C3" + STAGING_AREA_SLOT_4_RESET_LOCATION = "D4" + + deck_moves(dest_pcr_plate, DECK_MOVE_RESET_LOCATION) + + ctx.move_labware(dest_pcr_plate, STAGING_AREA_SLOT_3_RESET_LOCATION, use_gripper=USING_GRIPPER) + staging_area_slot_3_moves(dest_pcr_plate, STAGING_AREA_SLOT_3_RESET_LOCATION) + + ctx.move_labware(dest_pcr_plate, STAGING_AREA_SLOT_4_RESET_LOCATION, use_gripper=USING_GRIPPER) + staging_area_slot_4_moves(dest_pcr_plate, STAGING_AREA_SLOT_4_RESET_LOCATION) + + module_locations = [thermocycler, magnetic_block] + adapters + module_moves(dest_pcr_plate, module_locations) + + ctx.move_labware(dest_pcr_plate, DECK_MOVE_RESET_LOCATION, use_gripper=USING_GRIPPER) + + def test_manual_moves(): + # In C4 currently + ctx.move_labware(source_reservoir, "D4", use_gripper=not USING_GRIPPER) + + def test_pipetting(): + def test_partial_tip_pickup_usage(): + pipette_96_channel.configure_nozzle_layout(style=protocol_api.COLUMN, start="A12") + + for i in range(1, 13): + + pipette_96_channel.pick_up_tip(tip_rack_2[f"A{i}"]) + + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.dispense(5, dest_pcr_plate[f"A{i}"]) + + if i == 1: + ctx.pause( + "Watch the next 6 tips drop in the waste chute. They should drop in the same location of the waste chute each time." + ) + + if i == 7: + ctx.pause( + "Watch the next 6 tips drop in the waste chute. They should drop in different locations of the waste chute each time." + ) + + if i <= 6: + pipette_96_channel.drop_tip(waste_chute) + else: + pipette_96_channel.drop_tip() + + # leave this dropping in waste chute, do not use get_disposal_preference + # want to test partial drop + ctx.move_labware(tip_rack_2, waste_chute, use_gripper=USING_GRIPPER) + + def test_full_tip_rack_usage(): + pipette_96_channel.configure_nozzle_layout(style=protocol_api.ALL, start="A1") + pipette_96_channel.pick_up_tip(tip_rack_1["A1"]) + + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.air_gap(height=30) + + pipette_96_channel.blow_out(waste_chute) + + pipette_96_channel.aspirate(5, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.air_gap(height=30) + pipette_96_channel.blow_out(trash_bin) + + pipette_96_channel.aspirate(10, source_reservoir["A1"]) + pipette_96_channel.touch_tip() + + pipette_96_channel.dispense(10, dest_pcr_plate["A1"]) + pipette_96_channel.mix(repetitions=5, volume=15) + pipette_96_channel.return_tip() + + ctx.move_labware(tip_rack_1, get_disposal_preference()[0], use_gripper=get_disposal_preference()[1]) + ctx.move_labware(tip_rack_3, tip_rack_adapter, use_gripper=USING_GRIPPER) + + pipette_96_channel.pick_up_tip(tip_rack_3["A1"]) + pipette_96_channel.transfer( + volume=10, + source=source_reservoir["A1"], + dest=dest_pcr_plate["A1"], + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="trash", + mix_before=(3, 5), + mix_after=(1, 5), + ) + pipette_96_channel.return_tip() + + test_partial_tip_pickup_usage() + test_full_tip_rack_usage() + + def test_module_usage(): + def test_thermocycler(): + thermocycler.close_lid() + + thermocycler.set_block_temperature(75.0, hold_time_seconds=5.0) + thermocycler.set_lid_temperature(80.0) + thermocycler.deactivate() + + def test_heater_shaker(): + heater_shaker.open_labware_latch() + heater_shaker.close_labware_latch() + + heater_shaker.set_target_temperature(HEATER_SHAKER_TEMPERATURE) + heater_shaker.set_and_wait_for_shake_speed(HEATER_SHAKER_SPEED) + heater_shaker.wait_for_temperature() + + heater_shaker.deactivate_heater() + heater_shaker.deactivate_shaker() + + def test_temperature_module(): + temperature_module.set_temperature(80) + temperature_module.set_temperature(10) + temperature_module.deactivate() + + def test_magnetic_block(): + pass + + test_thermocycler() + test_heater_shaker() + test_temperature_module() + test_magnetic_block() + + def test_labware_set_offset(): + """Test the labware.set_offset method.""" + ###################### + # labware.set_offset # + ###################### + + # -------------------------- # + # Added in API version: 2.18 # + # -------------------------- # + + SET_OFFSET_AMOUNT = 10.0 + ctx.move_labware(labware=source_reservoir, new_location=protocol_api.OFF_DECK, use_gripper=False) + pipette_96_channel.pick_up_tip(tip_rack_3["A1"]) + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be at the LPC calibrated height.") + + dest_pcr_plate.set_offset( + x=0.0, + y=0.0, + z=SET_OFFSET_AMOUNT, + ) + + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + ctx.pause( + "Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be 10mm higher than the LPC calibrated height." + ) + + ctx.move_labware(labware=dest_pcr_plate, new_location="D2", use_gripper=False) + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of the PCR Plate, well A1, in slot D2? It should be at the LPC calibrated height.") + + dest_pcr_plate.set_offset( + x=0.0, + y=0.0, + z=SET_OFFSET_AMOUNT, + ) + + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + ctx.pause( + "Is the pipette tip in the middle of the PCR Plate, well A1, in slot D2? It should be 10mm higher than the LPC calibrated height." + ) + + ctx.move_labware(labware=dest_pcr_plate, new_location="C2", use_gripper=False) + pipette_96_channel.move_to(dest_pcr_plate.wells_by_name()["A1"].top()) + + ctx.pause( + "Is the pipette tip in the middle of the PCR Plate, well A1, in slot C2? It should be 10mm higher than the LPC calibrated height." + ) + + ctx.move_labware(labware=source_reservoir, new_location="D2", use_gripper=False) + pipette_96_channel.move_to(source_reservoir.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of the reservoir , well A1, in slot D2? It should be at the LPC calibrated height.") + + pipette_96_channel.return_tip() + ctx.move_labware(tip_rack_3, get_disposal_preference()[0], use_gripper=get_disposal_preference()[1]) + + ctx.pause("!!!!!!!!!!YOU NEED TO REDO LPC!!!!!!!!!!") + + def test_unique_top_methods(): + """ + Test the unique top() methods for TrashBin and WasteChute. + + Well objects should remain the same + """ + ######################## + # unique top() methods # + ######################## + + # ---------------------------- # + # Changed in API version: 2.18 # + # ---------------------------- # + + assert isinstance(trash_bin.top(), protocol_api.TrashBin) + assert isinstance(waste_chute.top(), protocol_api.WasteChute) + assert isinstance(source_reservoir.wells_by_name()["A1"].top(), types.Location) + + ################################################################################################### + ### THE ORDER OF THESE FUNCTION CALLS MATTER. CHANGING THEM WILL CAUSE THE PROTOCOL NOT TO WORK ### + ################################################################################################### + test_pipetting() + test_gripper_moves() + test_module_usage() + test_manual_moves() + test_labware_set_offset() + test_unique_top_methods() + + ################################################################################################### + ### THE ORDER OF THESE FUNCTION CALLS MATTER. CHANGING THEM WILL CAUSE THE PROTOCOL NOT TO WORK ### + ################################################################################################### + + +# Cannot test in this protocol +# - Waste Chute w/ Lid diff --git a/app-testing/files/protocols/OT2_S_v2_13_P300M_P20S_HS_TC_TM_SmokeTestV3.py b/app-testing/files/protocols/OT2_S_v2_13_P300M_P20S_HS_TC_TM_SmokeTestV3.py index da7b3ab385b..990081a9354 100644 --- a/app-testing/files/protocols/OT2_S_v2_13_P300M_P20S_HS_TC_TM_SmokeTestV3.py +++ b/app-testing/files/protocols/OT2_S_v2_13_P300M_P20S_HS_TC_TM_SmokeTestV3.py @@ -12,6 +12,14 @@ requirements = {"robotType": "OT-2", "apiLevel": "2.13"} +############# +# CHANGELOG # +############# + +# 2.13 + +# - Heater-Shaker Module support added + def run(ctx: protocol_api.ProtocolContext) -> None: """This method is run by the protocol engine.""" @@ -58,6 +66,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + ######################### + # Heater-Shaker Support # + ######################### + + # -------------------------- # + # Added in API version: 2.13 # + # -------------------------- # + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) temperature_module = ctx.load_module("temperature module gen2", temperature_position) diff --git a/app-testing/files/protocols/OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3.py b/app-testing/files/protocols/OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3.py index 4ff0f563d37..50a0e707f38 100644 --- a/app-testing/files/protocols/OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3.py +++ b/app-testing/files/protocols/OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3.py @@ -12,6 +12,23 @@ requirements = {"robotType": "OT-2", "apiLevel": "2.14"} +############# +# CHANGELOG # +############# + +# ---- +# 2.14 +# ---- + +# - ProtocolContext.defined_liquid and Well.load_liquid added +# - load_labware without parameters should still find the labware + +# ---- +# 2.13 +# ---- + +# - Heater-Shaker Module support added + def run(ctx: protocol_api.ProtocolContext) -> None: """This method is run by the protocol engine.""" @@ -58,6 +75,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + ######################### + # Heater-Shaker Support # + ######################### + + # -------------------------- # + # Added in API version: 2.13 # + # -------------------------- # + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) temperature_module = ctx.load_module("temperature module gen2", temperature_position) @@ -71,7 +96,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: hs_plate = hs_module.load_labware("opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt") tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") - # A 2.14 difference, no params specified, still should find it. + ################################### + # Load Labware with no parameters # + ################################### + + # -------------------------- # + # Fixed in API version: 2.14 # + # -------------------------- # + custom_labware = ctx.load_labware( "cpx_4_tuberack_100ul", custom_lw_position, @@ -102,7 +134,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: logo_destination_plate.wells_by_name()["E5"], ] - # >= 2.14 define_liquid and load_liquid + ####################################### + # define_liquid & load_liquid Support # + ####################################### + + # -------------------------- # + # Added in API version: 2.14 # + # -------------------------- # + water = ctx.define_liquid( name="water", description="H₂O", display_color="#42AB2D" ) # subscript 2 https://www.compart.com/en/unicode/U+2082 diff --git a/app-testing/files/protocols/OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3.py b/app-testing/files/protocols/OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3.py index aeb151c2267..4e91ce6964f 100644 --- a/app-testing/files/protocols/OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3.py +++ b/app-testing/files/protocols/OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3.py @@ -12,6 +12,31 @@ requirements = {"robotType": "OT-2", "apiLevel": "2.15"} +############# +# CHANGELOG # +############# + +# ---- +# 2.15 +# ---- + +# - move_labware added - Manual Deck State Modification +# - ProtocolContext.load_adapter added +# - OFF_DECK location added + +# ---- +# 2.14 +# ---- + +# - ProtocolContext.defined_liquid and Well.load_liquid added +# - load_labware without parameters should still find the labware + +# ---- +# 2.13 +# ---- + +# - Heater-Shaker Module support added + def run(ctx: protocol_api.ProtocolContext) -> None: """This method is run by the protocol engine.""" @@ -58,6 +83,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + ######################### + # Heater-Shaker Support # + ######################### + + # -------------------------- # + # Added in API version: 2.13 # + # -------------------------- # + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) temperature_module = ctx.load_module("temperature module gen2", temperature_position) @@ -72,7 +105,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: hs_plate = hs_module.load_labware(name="nest_96_wellplate_100ul_pcr_full_skirt", adapter="opentrons_96_pcr_adapter") tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") - # A 2.14 difference, no params specified, still should find it. + ################################### + # Load Labware with no parameters # + ################################### + + # -------------------------- # + # Fixed in API version: 2.14 # + # -------------------------- # + custom_labware = ctx.load_labware( "cpx_4_tuberack_100ul", custom_lw_position, @@ -103,7 +143,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: logo_destination_plate.wells_by_name()["E5"], ] - # >= 2.14 define_liquid and load_liquid + ####################################### + # define_liquid & load_liquid Support # + ####################################### + + # -------------------------- # + # Added in API version: 2.14 # + # -------------------------- # + water = ctx.define_liquid( name="water", description="H₂O", display_color="#42AB2D" ) # subscript 2 https://www.compart.com/en/unicode/U+2082 diff --git a/app-testing/files/protocols/OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3.py b/app-testing/files/protocols/OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3.py index 4c0ceafb2ba..7b2de5155f0 100644 --- a/app-testing/files/protocols/OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3.py +++ b/app-testing/files/protocols/OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3.py @@ -12,6 +12,39 @@ requirements = {"robotType": "OT-2", "apiLevel": "2.16"} +############# +# CHANGELOG # +############# + +# ---- +# 2.16 +# ---- + +# - prepare_to_aspirate added +# - fixed_trash property changed +# - instrument_context.trash_container property changed + +# ---- +# 2.15 +# ---- + +# - move_labware added - Manual Deck State Modification +# - ProtocolContext.load_adapter added +# - OFF_DECK location added + +# ---- +# 2.14 +# ---- + +# - ProtocolContext.defined_liquid and Well.load_liquid added +# - load_labware without parameters should still find the labware + +# ---- +# 2.13 +# ---- + +# - Heater-Shaker Module support added + def run(ctx: protocol_api.ProtocolContext) -> None: """This method is run by the protocol engine.""" @@ -58,6 +91,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + ######################### + # Heater-Shaker Support # + ######################### + + # -------------------------- # + # Added in API version: 2.13 # + # -------------------------- # + # modules https://docs.opentrons.com/v2/new_modules.html#available-modules hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) temperature_module = ctx.load_module("temperature module gen2", temperature_position) @@ -72,7 +113,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: hs_plate = hs_module.load_labware(name="nest_96_wellplate_100ul_pcr_full_skirt", adapter="opentrons_96_pcr_adapter") tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") - # A 2.14 difference, no params specified, still should find it. + ################################### + # Load Labware with no parameters # + ################################### + + # -------------------------- # + # Fixed in API version: 2.14 # + # -------------------------- # + custom_labware = ctx.load_labware( "cpx_4_tuberack_100ul", custom_lw_position, @@ -103,7 +151,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: logo_destination_plate.wells_by_name()["E5"], ] - # >= 2.14 define_liquid and load_liquid + ####################################### + # define_liquid & load_liquid Support # + ####################################### + + # -------------------------- # + # Added in API version: 2.14 # + # -------------------------- # + water = ctx.define_liquid( name="water", description="H₂O", display_color="#42AB2D" ) # subscript 2 https://www.compart.com/en/unicode/U+2082 diff --git a/app-testing/files/protocols/OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3.py b/app-testing/files/protocols/OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3.py index 1c0c1f9802d..822e64ab6e1 100644 --- a/app-testing/files/protocols/OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3.py +++ b/app-testing/files/protocols/OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3.py @@ -12,19 +12,48 @@ requirements = {"robotType": "OT-2", "apiLevel": "2.17"} +############# +# CHANGELOG # +############# -######################### -#### LOOK AT THIS ####### -######################### +# ---- +# 2.17 +# ---- +# NOTHING NEW # This protocol is exactly the same as 2.16 Smoke Test V3 # The only difference is the API version in the metadata # There were no new positive test cases for 2.17 # The negative test cases are captured in the 2.17 dispense changes protcol -######################### -#### LOOK AT THIS ####### -######################### +# ---- +# 2.16 +# ---- + +# - prepare_to_aspirate added +# - fixed_trash property changed +# - instrument_context.trash_container property changed + +# ---- +# 2.15 +# ---- + +# - move_labware added - Manual Deck State Modification +# - ProtocolContext.load_adapter added +# - OFF_DECK location added + +# ---- +# 2.14 +# ---- + +# - ProtocolContext.defined_liquid and Well.load_liquid added +# - load_labware without parameters should still find the labware + +# ---- +# 2.13 +# ---- + +# - Heater-Shaker Module support added def run(ctx: protocol_api.ProtocolContext) -> None: @@ -72,7 +101,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) - # modules https://docs.opentrons.com/v2/new_modules.html#available-modules + ######################### + # Heater-Shaker Support # + ######################### + + # -------------------------- # + # Added in API version: 2.13 # + # -------------------------- # + hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) temperature_module = ctx.load_module("temperature module gen2", temperature_position) thermocycler_module = ctx.load_module("thermocycler module gen2") @@ -86,7 +122,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: hs_plate = hs_module.load_labware(name="nest_96_wellplate_100ul_pcr_full_skirt", adapter="opentrons_96_pcr_adapter") tc_plate = thermocycler_module.load_labware("nest_96_wellplate_100ul_pcr_full_skirt") - # A 2.14 difference, no params specified, still should find it. + ################################### + # Load Labware with no parameters # + ################################### + + # -------------------------- # + # Fixed in API version: 2.14 # + # -------------------------- # + custom_labware = ctx.load_labware( "cpx_4_tuberack_100ul", custom_lw_position, @@ -117,7 +160,14 @@ def run(ctx: protocol_api.ProtocolContext) -> None: logo_destination_plate.wells_by_name()["E5"], ] - # >= 2.14 define_liquid and load_liquid + ####################################### + # define_liquid & load_liquid Support # + ####################################### + + # -------------------------- # + # Added in API version: 2.14 # + # -------------------------- # + water = ctx.define_liquid( name="water", description="H₂O", display_color="#42AB2D" ) # subscript 2 https://www.compart.com/en/unicode/U+2082 @@ -147,7 +197,7 @@ def run(ctx: protocol_api.ProtocolContext) -> None: # Added in API version: 2.15 # # -------------------------- # - # Putting steps for this at beginning of protocol so you can do the manual stuff + # Putting steps for this at beginning of protocol so y # >= 2.14 define_liquid and load_liquidou can do the manual stuff # then walk away to let the rest of the protocol execute # The test flow is as follows: diff --git a/app-testing/files/protocols/OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3.py b/app-testing/files/protocols/OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3.py new file mode 100644 index 00000000000..a724789eb1f --- /dev/null +++ b/app-testing/files/protocols/OT2_S_v2_18_P300M_P20S_HS_TC_TM_SmokeTestV3.py @@ -0,0 +1,595 @@ +"""Smoke Test v3.0 """ + +# https://opentrons.atlassian.net/projects/RQA?selectedItem=com.atlassian.plugins.atlassian-connect-plugin:com.kanoah.test-manager__main-project-page#!/testCase/QB-T497 + +############# +# CHANGELOG # +############# + +# ---- +# 2.18 +# ---- + +# - labware.set_offset +# - Runtime Parameters added +# - TrashContainer.top() and Well.top() now return objects of the same type +# - pipette.drop_tip() if location argument not specified the tips will be dropped at different locations in the bin +# - pipette.drop_tip() if location is specified, the tips will be dropped in the same place every time + +# ---- +# 2.17 +# ---- + +# NOTHING NEW +# This protocol is exactly the same as 2.16 Smoke Test V3 +# The only difference is the API version in the metadata +# There were no new positive test cases for 2.17 +# The negative test cases are captured in the 2.17 dispense changes protocol + +# ---- +# 2.16 +# ---- + +# - prepare_to_aspirate added +# - fixed_trash property changed +# - instrument_context.trash_container property changed + +# ---- +# 2.15 +# ---- + +# - move_labware added - Manual Deck State Modification +# - ProtocolContext.load_adapter added +# - OFF_DECK location added + +# ---- +# 2.14 +# ---- + +# - ProtocolContext.defined_liquid and Well.load_liquid added +# - load_labware without parameters should still find the labware + +# ---- +# 2.13 +# ---- + +# - Heater-Shaker Module support added + +from opentrons import protocol_api, types + +metadata = { + "protocolName": "🛠️ 2.18 Smoke Test V3 🪄", + "author": "Opentrons Engineering ", + "source": "Software Testing Team", + "description": ("Description of the protocol that is longish \n has \n returns and \n emoji 😊 ⬆️ "), +} + +requirements = {"robotType": "OT-2", "apiLevel": "2.18"} + +############################## +# Runtime Parameters Support # +############################## + +# -------------------------- # +# Added in API version: 2.18 # +# -------------------------- # + + +def add_parameters(parameters: protocol_api.Parameters): + reservoir_choices = [ + {"display_name": "Nest 12 Well 15 mL", "value": "nest_12_reservoir_15ml"}, + {"display_name": "USA Scientific 12 Well 22 mL", "value": "usascientific_12_reservoir_22ml"}, + ] + + well_plate_choices = [ + {"display_name": "Nest 96 Well 100 µL", "value": "nest_96_wellplate_100ul_pcr_full_skirt"}, + {"display_name": "Corning 96 Well 360 µL", "value": "corning_96_wellplate_360ul_flat"}, + {"display_name": "Opentrons Tough 96 Well 200 µL", "value": "opentrons_96_wellplate_200ul_pcr_full_skirt"}, + ] + + parameters.add_str( + variable_name="reservoir_name", + display_name="Reservoir Name", + description="Name of the reservoir", + default="nest_12_reservoir_15ml", + choices=reservoir_choices, + ) + + parameters.add_str( + variable_name="well_plate_name", + display_name="Well Plate Name", + description="Name of the well plate", + default="nest_96_wellplate_100ul_pcr_full_skirt", + choices=well_plate_choices, + ) + + parameters.add_int( + variable_name="delay_time", + display_name="Delay Time", + description="Time to delay in seconds", + default=3, + minimum=1, + maximum=10, + unit="seconds", + ) + + parameters.add_bool( + variable_name="robot_lights", + display_name="Robot Lights", + description="Turn on the robot lights?", + default=True, + ) + + parameters.add_float( + variable_name="heater_shaker_temperature", + display_name="Heater Shaker Temperature", + description="Temperature to set the heater shaker to", + default=38.0, + minimum=37.0, + maximum=100.0, + unit="°C", + ) + + +def run(ctx: protocol_api.ProtocolContext) -> None: + """This method is run by the protocol engine.""" + + ############################## + # Runtime Parameters Support # + ############################## + + # -------------------------- # + # Added in API version: 2.18 # + # -------------------------- # + + RESERVOIR_NAME: str = ctx.params.reservoir_name + WELL_PLATE_NAME: str = ctx.params.well_plate_name + DELAY_TIME: int = ctx.params.delay_time + ROBOT_LIGHTS: bool = ctx.params.robot_lights + HEATER_SHAKER_TEMPERATURE: float = ctx.params.heater_shaker_temperature + + ctx.set_rail_lights(ROBOT_LIGHTS) + ctx.comment(f"Let there be light! {ctx.rail_lights_on} 🌠🌠🌠") + ctx.comment(f"Is the door is closed? {ctx.door_closed} 🚪🚪🚪") + ctx.comment(f"Is this a simulation? {ctx.is_simulating()} 🔮🔮🔮") + ctx.comment(f"Running against API Version: {ctx.api_version}") + + # deck positions + tips_300ul_position = "5" + tips_20ul_position = "4" + dye_source_position = "3" + logo_position = "2" + temperature_position = "9" + custom_lw_position = "6" + hs_position = "1" + + # Thermocycler has a default position that covers Slots 7, 8, 10, and 11. + # This is the only valid location for the Thermocycler on the OT-2 deck. + # This position is a default parameter when declaring the TC so you do not need to specify. + + # 300ul tips + tips_300ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_300ul", + location=tips_300ul_position, + label="300ul tips", + ) + ] + + # 20ul tips + tips_20ul = [ + ctx.load_labware( + load_name="opentrons_96_tiprack_20ul", + location=tips_20ul_position, + label="20ul tips", + ) + ] + + # pipettes + pipette_left = ctx.load_instrument(instrument_name="p300_multi_gen2", mount="left", tip_racks=tips_300ul) + + pipette_right = ctx.load_instrument(instrument_name="p20_single_gen2", mount="right", tip_racks=tips_20ul) + + ######################### + # Heater-Shaker Support # + ######################### + + # -------------------------- # + # Added in API version: 2.13 # + # -------------------------- # + + hs_module = ctx.load_module("heaterShakerModuleV1", hs_position) + temperature_module = ctx.load_module("temperature module gen2", temperature_position) + thermocycler_module = ctx.load_module("thermocycler module gen2") + + # module labware + temp_adapter = temperature_module.load_adapter("opentrons_96_well_aluminum_block") + temp_plate = temp_adapter.load_labware( + WELL_PLATE_NAME, + label="Temperature-Controlled plate", + ) + hs_plate = hs_module.load_labware(name=WELL_PLATE_NAME, adapter="opentrons_96_pcr_adapter") + tc_plate = thermocycler_module.load_labware(WELL_PLATE_NAME) + + ################################### + # Load Labware with no parameters # + ################################### + + # -------------------------- # + # Fixed in API version: 2.14 # + # -------------------------- # + + custom_labware = ctx.load_labware( + "cpx_4_tuberack_100ul", + custom_lw_position, + label="4 custom tubes", + ) + + # create plates and pattern list + logo_destination_plate = ctx.load_labware( + load_name=WELL_PLATE_NAME, + location=logo_position, + label="logo destination", + ) + + dye_container = ctx.load_labware( + load_name=RESERVOIR_NAME, + location=dye_source_position, + label="dye container", + ) + + dye_source = dye_container.wells_by_name()["A2"] + + # Well Location set-up + dye_destination_wells = [ + logo_destination_plate.wells_by_name()["C7"], + logo_destination_plate.wells_by_name()["D6"], + logo_destination_plate.wells_by_name()["D7"], + logo_destination_plate.wells_by_name()["D8"], + logo_destination_plate.wells_by_name()["E5"], + ] + + ####################################### + # define_liquid & load_liquid Support # + ####################################### + + # -------------------------- # + # Added in API version: 2.14 # + # -------------------------- # + + water = ctx.define_liquid( + name="water", description="H₂O", display_color="#42AB2D" + ) # subscript 2 https://www.compart.com/en/unicode/U+2082 + + acetone = ctx.define_liquid( + name="acetone", description="C₃H₆O", display_color="#38588a" + ) # subscript 3 https://www.compart.com/en/unicode/U+2083 + # subscript 6 https://www.compart.com/en/unicode/U+2086 + + dye_container.wells_by_name()["A1"].load_liquid(liquid=water, volume=4000) + dye_container.wells_by_name()["A2"].load_liquid(liquid=water, volume=2000) + dye_container.wells_by_name()["A5"].load_liquid(liquid=acetone, volume=555.55555) + + # 2 different liquids in the same well + dye_container.wells_by_name()["A8"].load_liquid(liquid=water, volume=900.00) + dye_container.wells_by_name()["A8"].load_liquid(liquid=acetone, volume=1001.11) + + hs_module.close_labware_latch() + + pipette_right.pick_up_tip() + + ################################## + # Manual Deck State Modification # + ################################## + + # -------------------------- # + # Added in API version: 2.15 # + # -------------------------- # + + # Putting steps for this at beginning of protocol so y # >= 2.14 define_liquid and load_liquidou can do the manual stuff + # then walk away to let the rest of the protocol execute + + # The test flow is as follows: + # 1. Remove the existing PCR plate from slot 2 + # 2. Move the reservoir from slot 3 to slot 2 + # 3. Pickup P20 tip, move pipette to reservoir A1 in slot 2 + # 4. Pause and ask user to validate that the tip is in the middle of reservoir A1 in slot 2 + # 5. Move the reservoir back to slot 3 from slot 2 + # 6. Move pipette to reservoir A1 in slot 3 + # 7. Pause and ask user to validate that the tip is in the middle of reservoir A1 in slot 3 + # 8. Move custom labware from slot 6 to slot 2 + # 9. Move pipette to well A1 in slot 2 + # 10. Pause and ask user to validate that the tip is in the middle of well A1 in slot 2 + # 11. Move the custom labware back to slot 6 from slot 2 + # 12. Move pipette to well A1 in slot 6 + # 13. Pause and ask user to validate that the tip is in the middle of well A1 in slot 6 + # 14. Move the offdeck PCR plate back to slot 2 + # 15. Move pipette to well A1 in slot 2 + # 16. Pause and ask user to validate that the tip is in the middle of well A1 in slot 2 + + # In effect, nothing will actually change to the protocol, + # but we will be able to test that the UI responds appropriately. + + # Note: + # logo_destination_plate is a nest_96_wellplate_100ul_pcr_full_skirt - starting position is slot 2 + # dye_container is aRESERVOIR_NAME- starting position is slot 3 + + # Step 1 + ctx.move_labware( + labware=logo_destination_plate, + new_location=protocol_api.OFF_DECK, + ) + + # Step 2 + ctx.move_labware(labware=dye_container, new_location="2") + + # Step 3 + pipette_right.move_to(location=dye_container.wells_by_name()["A1"].top()) + + # Step 4 + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 2?") + + # Step 5 + ctx.move_labware(labware=dye_container, new_location="3") + + # Step 6 + pipette_right.move_to(location=dye_container.wells_by_name()["A1"].top()) + + # Step 7 + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 3?") + + # Step 8 + ctx.move_labware(labware=custom_labware, new_location="2") + + # Step 9 + pipette_right.move_to(location=custom_labware.wells_by_name()["A1"].top()) + + # Step 10 + ctx.pause("Is the pipette tip in the middle of custom labware A1 in slot 2?") + + # Step 11 + ctx.move_labware(labware=custom_labware, new_location="6") + + # Step 12 + pipette_right.move_to(location=custom_labware.wells_by_name()["A1"].top()) + + # Step 13 + ctx.pause("Is the pipette tip in the middle of custom labware A1 in slot 6?") + + # Step 14 + ctx.move_labware(labware=logo_destination_plate, new_location="2") + + # Step 15 + pipette_right.move_to(location=logo_destination_plate.wells_by_name()["A1"].top()) + + # Step 16 + ctx.pause("Is the pipette tip in the middle of well A1 in slot 2?") + + ####################### + # prepare_to_aspirate # + ####################### + + # -------------------------- # + # Added in API version: 2.16 # + # -------------------------- # + + pipette_right.prepare_to_aspirate() + pipette_right.move_to(dye_container.wells_by_name()["A1"].bottom(z=2)) + ctx.pause( + "Testing prepare_to_aspirate - watch pipette until next pause.\n The pipette should only move up out of the well after it has aspirated." + ) + pipette_right.aspirate(10, dye_container.wells_by_name()["A1"].bottom(z=2)) + ctx.pause("Did the pipette move up out of the well, only once, after aspirating?") + pipette_right.dispense(10, dye_container.wells_by_name()["A1"].bottom(z=2)) + + ######################################### + # protocol_context.fixed_trash property # + ######################################### + + # ---------------------------- # + # Changed in API version: 2.16 # + # ---------------------------- # + + pipette_right.move_to(ctx.fixed_trash) + ctx.pause("Is the pipette over the trash? Pipette will home after this pause.") + ctx.home() + + ############################################### + # instrument_context.trash_container property # + ############################################### + + # ---------------------------- # + # Changed in API version: 2.16 # + # ---------------------------- # + + pipette_right.move_to(pipette_right.trash_container) + ctx.pause("Is the pipette over the trash?") + + # Distribute dye + pipette_right.distribute( + volume=18, + source=dye_source, + dest=dye_destination_wells, + new_tip="never", + ) + pipette_right.drop_tip() + + # transfer + transfer_destinations = [ + logo_destination_plate.wells_by_name()["A11"], + logo_destination_plate.wells_by_name()["B11"], + logo_destination_plate.wells_by_name()["C11"], + ] + pipette_right.pick_up_tip() + pipette_right.transfer( + volume=60, + source=dye_container.wells_by_name()["A2"], + dest=transfer_destinations, + new_tip="never", + touch_tip=True, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + mix_after=(1, 20), + mix_touch_tip=True, + ) + + # consolidate + pipette_right.consolidate( + volume=20, + source=transfer_destinations, + dest=dye_container.wells_by_name()["A5"], + new_tip="never", + touch_tip=False, + blow_out=True, + blowout_location="destination well", + mix_before=(3, 20), + ) + + # well to well + pipette_right.return_tip() + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=5, location=logo_destination_plate.wells_by_name()["A11"]) + pipette_right.air_gap(volume=10) + ctx.delay(seconds=DELAY_TIME) + pipette_right.dispense(volume=5, location=logo_destination_plate.wells_by_name()["H11"]) + + # move to + pipette_right.move_to(logo_destination_plate.wells_by_name()["E12"].top()) + pipette_right.move_to(logo_destination_plate.wells_by_name()["E11"].bottom()) + pipette_right.blow_out() + # touch tip + # pipette ends in the middle of the well as of 6.3.0 in all touch_tip + pipette_right.touch_tip(location=logo_destination_plate.wells_by_name()["H1"]) + ctx.pause("Is the pipette tip in the middle of the well?") + pipette_right.return_tip() + + # Play with the modules + temperature_module.await_temperature(25) + + hs_module.set_and_wait_for_shake_speed(466) + ctx.delay(seconds=DELAY_TIME) + + hs_module.set_and_wait_for_temperature(HEATER_SHAKER_TEMPERATURE) + + thermocycler_module.open_lid() + thermocycler_module.close_lid() + thermocycler_module.set_lid_temperature(38) # 37 is the minimum + thermocycler_module.set_block_temperature(temperature=28, hold_time_seconds=5) + thermocycler_module.deactivate_block() + thermocycler_module.deactivate_lid() + thermocycler_module.open_lid() + + hs_module.deactivate_shaker() + + # dispense to modules + + # to temperature module + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=15, location=dye_source) + pipette_right.dispense(volume=15, location=temp_plate.well(0)) + pipette_right.drop_tip() + + # to heater shaker + pipette_left.pick_up_tip() + pipette_left.aspirate(volume=50, location=dye_source) + pipette_left.dispense(volume=50, location=hs_plate.well(0)) + hs_module.set_and_wait_for_shake_speed(350) + ctx.delay(DELAY_TIME) + hs_module.deactivate_shaker() + + # to custom labware + # This labware does not EXIST!!!! so... + # Use tip rack lid to catch dye on wet run + pipette_right.pick_up_tip() + pipette_right.aspirate(volume=10, location=dye_source, rate=2.0) + pipette_right.dispense(volume=10, location=custom_labware.well(3), rate=1.5) + pipette_right.drop_tip() + + # to thermocycler + pipette_left.aspirate(volume=75, location=dye_source) + pipette_left.dispense(volume=60, location=tc_plate.wells_by_name()["A6"]) + pipette_left.drop_tip() + + ######################## + # unique top() methods # + ######################## + + # ---------------------------- # + # Changed in API version: 2.18 # + # ---------------------------- # + + assert isinstance(ctx.fixed_trash.top(), protocol_api.TrashBin) + assert isinstance(dye_container.wells_by_name()["A1"].top(), types.Location) + + ############################# + # drop_tip location changes # + ############################# + + # ---------------------------- # + # Changed in API version: 2.18 # + # ---------------------------- # + + ctx.pause("Watch the next 5 tips drop in the trash. They should drop in different locations of the trash each time.") + for _ in range(5): + pipette_right.pick_up_tip() + pipette_right.drop_tip() + + ctx.pause("Watch the next 5 tips drop in the trash. They should drop in the same location of the trash each time.") + for _ in range(5): + pipette_right.pick_up_tip() + pipette_right.drop_tip(location=ctx.fixed_trash) + + ###################### + # labware.set_offset # + ###################### + + # -------------------------- # + # Added in API version: 2.18 # + # -------------------------- # + + SET_OFFSET_AMOUNT = 10.0 + + pipette_right.pick_up_tip() + + ctx.move_labware(labware=logo_destination_plate, new_location=protocol_api.OFF_DECK) + pipette_right.move_to(dye_container.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 3? It should be at the LPC calibrated height.") + + dye_container.set_offset( + x=0.0, + y=0.0, + z=SET_OFFSET_AMOUNT, + ) + + pipette_right.move_to(dye_container.wells_by_name()["A1"].top()) + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 3? It should be 10mm higher than the LPC calibrated height.") + + ctx.move_labware(labware=dye_container, new_location="2") + pipette_right.move_to(dye_container.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 2? It should be at the LPC calibrated height.") + + dye_container.set_offset( + x=0.0, + y=0.0, + z=SET_OFFSET_AMOUNT, + ) + + pipette_right.move_to(dye_container.wells_by_name()["A1"].top()) + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 2? It should be 10mm higher than the LPC calibrated height.") + + ctx.move_labware(labware=dye_container, new_location="3") + pipette_right.move_to(dye_container.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of reservoir A1 in slot 3? It should be 10mm higher than the LPC calibrated height.") + + ctx.move_labware(labware=logo_destination_plate, new_location="2") + pipette_right.move_to(logo_destination_plate.wells_by_name()["A1"].top()) + + ctx.pause("Is the pipette tip in the middle of well A1 in slot 2? It should be at the LPC calibrated height.") + + ctx.pause("!!!!!!!!!!YOU NEED TO REDO LPC!!!!!!!!!!") + + pipette_right.return_tip() From d6cdb70741b8f28a77d659c462805bcc6d07bcf8 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Thu, 16 May 2024 10:15:32 -0400 Subject: [PATCH 07/10] feat(api): Return a defined `tipPhysicallyMissing` error from `pickUpTip` commands (#15176) --- .../protocol_engine/actions/actions.py | 25 ++- .../protocol_engine/commands/__init__.py | 5 +- .../protocol_engine/commands/command.py | 2 + .../commands/command_unions.py | 12 +- .../protocol_engine/commands/pick_up_tip.py | 114 +++++++++--- .../protocol_engine/commands/save_position.py | 4 +- .../protocol_engine/error_recovery_policy.py | 36 ++-- .../execution/command_executor.py | 25 +-- .../protocol_engine/state/commands.py | 15 +- .../protocol_engine/commands/conftest.py | 7 + .../commands/test_pick_up_tip.py | 100 ++++++---- .../execution/test_command_executor.py | 175 ++++++++++++++++-- 12 files changed, 401 insertions(+), 119 deletions(-) diff --git a/api/src/opentrons/protocol_engine/actions/actions.py b/api/src/opentrons/protocol_engine/actions/actions.py index adcf4f9e40b..146051346b7 100644 --- a/api/src/opentrons/protocol_engine/actions/actions.py +++ b/api/src/opentrons/protocol_engine/actions/actions.py @@ -14,7 +14,12 @@ from opentrons_shared_data.errors import EnumeratedError -from ..commands import Command, CommandCreate, CommandPrivateResult +from ..commands import ( + Command, + CommandCreate, + CommandDefinedErrorData, + CommandPrivateResult, +) from ..error_recovery_policy import ErrorRecoveryType from ..notes.notes import CommandNote from ..types import ( @@ -158,13 +163,25 @@ class FailCommandAction: """An ID to assign to the command's error. Must be unique to this occurrence of the error. + + todo(mm, 2024-05-13): This is redundant with `error` when it's a defined error. """ failed_at: datetime - """When the command failed.""" + """When the command failed. + + todo(mm, 2024-05-13): This is redundant with `error` when it's a defined error. + """ - error: EnumeratedError - """The underlying exception that caused this command to fail.""" + error: Union[CommandDefinedErrorData, EnumeratedError] + """The error that caused the command to fail. + + If it was a defined error, this should be the `DefinedErrorData` that the command + returned. + + If it was an undefined error, this should be the underlying exception + that caused the command to fail, represented as an `EnumeratedError`. + """ notes: List[CommandNote] """Overwrite the command's `.notes` with these.""" diff --git a/api/src/opentrons/protocol_engine/commands/__init__.py b/api/src/opentrons/protocol_engine/commands/__init__.py index 123425e464f..23fcc6e0aca 100644 --- a/api/src/opentrons/protocol_engine/commands/__init__.py +++ b/api/src/opentrons/protocol_engine/commands/__init__.py @@ -37,7 +37,7 @@ CommandResult, CommandType, CommandPrivateResult, - CommandT, + CommandDefinedErrorData, ) from .aspirate import ( @@ -332,10 +332,9 @@ "CommandResult", "CommandType", "CommandPrivateResult", - "CommandT", + "CommandDefinedErrorData", # base interfaces "AbstractCommandImpl", - "AbstractCommandWithPrivateResultImpl", "BaseCommand", "BaseCommandCreate", "CommandStatus", diff --git a/api/src/opentrons/protocol_engine/commands/command.py b/api/src/opentrons/protocol_engine/commands/command.py index 2ece79c0213..04846b54fc0 100644 --- a/api/src/opentrons/protocol_engine/commands/command.py +++ b/api/src/opentrons/protocol_engine/commands/command.py @@ -22,6 +22,7 @@ from opentrons.hardware_control import HardwareControlAPI +from ..resources import ModelUtils from ..errors import ErrorOccurrence from ..notes import CommandNote, CommandNoteAdder @@ -264,6 +265,7 @@ def __init__( tip_handler: execution.TipHandler, run_control: execution.RunControlHandler, rail_lights: execution.RailLightsHandler, + model_utils: ModelUtils, status_bar: execution.StatusBarHandler, command_note_adder: CommandNoteAdder, ) -> None: diff --git a/api/src/opentrons/protocol_engine/commands/command_unions.py b/api/src/opentrons/protocol_engine/commands/command_unions.py index 7674508cc96..9196cdf89cd 100644 --- a/api/src/opentrons/protocol_engine/commands/command_unions.py +++ b/api/src/opentrons/protocol_engine/commands/command_unions.py @@ -1,10 +1,12 @@ """Union types of concrete command definitions.""" -from typing import Union, TypeVar +from typing import Union from typing_extensions import Annotated from pydantic import Field +from .command import DefinedErrorData + from . import heater_shaker from . import magnetic_module from . import temperature_module @@ -203,6 +205,8 @@ PickUpTipCreate, PickUpTipResult, PickUpTipCommandType, + TipPhysicallyMissingError, + TipPhysicallyMissingErrorInternalData, ) from .touch_tip import ( @@ -624,4 +628,8 @@ ConfigureNozzleLayoutPrivateResult, ] -CommandT = TypeVar("CommandT", bound=Command) +# All `DefinedErrorData`s that implementations will actually return in practice. +# There's just one right now, but this will eventually be a Union. +CommandDefinedErrorData = DefinedErrorData[ + TipPhysicallyMissingError, TipPhysicallyMissingErrorInternalData +] diff --git a/api/src/opentrons/protocol_engine/commands/pick_up_tip.py b/api/src/opentrons/protocol_engine/commands/pick_up_tip.py index 30716e9dc40..b9780cd3e34 100644 --- a/api/src/opentrons/protocol_engine/commands/pick_up_tip.py +++ b/api/src/opentrons/protocol_engine/commands/pick_up_tip.py @@ -1,17 +1,28 @@ """Pick up tip command request, result, and implementation models.""" from __future__ import annotations +from dataclasses import dataclass +from opentrons_shared_data.errors import ErrorCodes from pydantic import Field -from typing import TYPE_CHECKING, Optional, Type +from typing import TYPE_CHECKING, Optional, Type, Union from typing_extensions import Literal +from opentrons.protocol_engine.errors.exceptions import TipNotAttachedError + +from ..errors import ErrorOccurrence +from ..resources import ModelUtils from ..types import DeckPoint from .pipetting_common import ( PipetteIdMixin, WellLocationMixin, DestinationPositionResult, ) -from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData -from ..errors.error_occurrence import ErrorOccurrence +from .command import ( + AbstractCommandImpl, + BaseCommand, + BaseCommandCreate, + DefinedErrorData, + SuccessData, +) if TYPE_CHECKING: from ..state import StateView @@ -50,25 +61,56 @@ class PickUpTipResult(DestinationPositionResult): ) -class PickUpTipImplementation( - AbstractCommandImpl[PickUpTipParams, SuccessData[PickUpTipResult, None]] -): +class TipPhysicallyMissingError(ErrorOccurrence): + """Returned when sensors determine that no tip was physically picked up. + + That space in the tip rack is marked internally as not having any tip, + as if the tip were consumed by a pickup. + + The pipette will act as if no tip was picked up. So, you won't be able to aspirate + anything, and movement commands will assume there is no tip hanging off the bottom + of the pipette. + """ + + errorType: Literal["tipPhysicallyMissing"] = "tipPhysicallyMissing" + errorCode: str = ErrorCodes.TIP_PICKUP_FAILED.value.code + detail: str = "No tip detected." + + +@dataclass +class TipPhysicallyMissingErrorInternalData: + """Internal-to-ProtocolEngine data about a TipPhysicallyMissingError.""" + + pipette_id: str + labware_id: str + well_name: str + + +_ExecuteReturn = Union[ + SuccessData[PickUpTipResult, None], + DefinedErrorData[TipPhysicallyMissingError, TipPhysicallyMissingErrorInternalData], +] + + +class PickUpTipImplementation(AbstractCommandImpl[PickUpTipParams, _ExecuteReturn]): """Pick up tip command implementation.""" def __init__( self, state_view: StateView, tip_handler: TipHandler, + model_utils: ModelUtils, movement: MovementHandler, **kwargs: object, ) -> None: self._state_view = state_view self._tip_handler = tip_handler + self._model_utils = model_utils self._movement = movement async def execute( self, params: PickUpTipParams - ) -> SuccessData[PickUpTipResult, None]: + ) -> Union[SuccessData[PickUpTipResult, None], _ExecuteReturn]: """Move to and pick up a tip using the requested pipette.""" pipette_id = params.pipetteId labware_id = params.labwareId @@ -82,24 +124,46 @@ async def execute( well_location=well_location, ) - tip_geometry = await self._tip_handler.pick_up_tip( - pipette_id=pipette_id, - labware_id=labware_id, - well_name=well_name, - ) - - return SuccessData( - public=PickUpTipResult( - tipVolume=tip_geometry.volume, - tipLength=tip_geometry.length, - tipDiameter=tip_geometry.diameter, - position=DeckPoint(x=position.x, y=position.y, z=position.z), - ), - private=None, - ) - - -class PickUpTip(BaseCommand[PickUpTipParams, PickUpTipResult, ErrorOccurrence]): + try: + tip_geometry = await self._tip_handler.pick_up_tip( + pipette_id=pipette_id, + labware_id=labware_id, + well_name=well_name, + ) + except TipNotAttachedError as e: + return DefinedErrorData( + public=TipPhysicallyMissingError( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + wrappedErrors=[ + ErrorOccurrence.from_failed( + id=self._model_utils.generate_id(), + createdAt=self._model_utils.get_timestamp(), + error=e, + ) + ], + ), + private=TipPhysicallyMissingErrorInternalData( + pipette_id=pipette_id, + labware_id=labware_id, + well_name=well_name, + ), + ) + else: + return SuccessData( + public=PickUpTipResult( + tipVolume=tip_geometry.volume, + tipLength=tip_geometry.length, + tipDiameter=tip_geometry.diameter, + position=DeckPoint(x=position.x, y=position.y, z=position.z), + ), + private=None, + ) + + +class PickUpTip( + BaseCommand[PickUpTipParams, PickUpTipResult, TipPhysicallyMissingError] +): """Pick up tip command model.""" commandType: PickUpTipCommandType = "pickUpTip" diff --git a/api/src/opentrons/protocol_engine/commands/save_position.py b/api/src/opentrons/protocol_engine/commands/save_position.py index 41b2cb74641..988e4b762a7 100644 --- a/api/src/opentrons/protocol_engine/commands/save_position.py +++ b/api/src/opentrons/protocol_engine/commands/save_position.py @@ -53,11 +53,11 @@ class SavePositionImplementation( def __init__( self, gantry_mover: GantryMover, - model_utils: Optional[ModelUtils] = None, + model_utils: ModelUtils, **kwargs: object, ) -> None: self._gantry_mover = gantry_mover - self._model_utils = model_utils or ModelUtils() + self._model_utils = model_utils async def execute( self, params: SavePositionParams diff --git a/api/src/opentrons/protocol_engine/error_recovery_policy.py b/api/src/opentrons/protocol_engine/error_recovery_policy.py index 6285e7ae37a..b41665e6ea9 100644 --- a/api/src/opentrons/protocol_engine/error_recovery_policy.py +++ b/api/src/opentrons/protocol_engine/error_recovery_policy.py @@ -1,12 +1,15 @@ # noqa: D100 import enum -from typing import Protocol - -from opentrons_shared_data.errors import EnumeratedError, ErrorCodes +from typing import Optional, Protocol from opentrons.config import feature_flags as ff -from opentrons.protocol_engine.commands import Command +from opentrons.protocol_engine.commands import ( + Command, + CommandDefinedErrorData, + PickUpTip, +) +from opentrons.protocol_engine.commands.pick_up_tip import TipPhysicallyMissingError class ErrorRecoveryType(enum.Enum): @@ -36,17 +39,24 @@ class ErrorRecoveryPolicy(Protocol): This describes a function that Protocol Engine calls after each command failure, with the details of that failure. The implementation should inspect those details and return an appropriate `ErrorRecoveryType`. + + Args: + failed_command: The command that failed, in its final `status=="failed"` state. + defined_error_data: If the command failed with a defined error, details about + that error. If the command failed with an undefined error, `None`. + By design, this callable isn't given details about undefined errors, + since it would be fragile to rely on them. """ @staticmethod def __call__( # noqa: D102 - failed_command: Command, exception: Exception + failed_command: Command, defined_error_data: Optional[CommandDefinedErrorData] ) -> ErrorRecoveryType: ... def error_recovery_by_ff( - failed_command: Command, exception: Exception + failed_command: Command, defined_error_data: Optional[CommandDefinedErrorData] ) -> ErrorRecoveryType: """Use API feature flags to decide how to handle an error. @@ -56,20 +66,20 @@ def error_recovery_by_ff( # todo(mm, 2024-03-18): Do we need to do anything explicit here to disable # error recovery on the OT-2? if ff.enable_error_recovery_experiments() and _is_recoverable( - failed_command, exception + failed_command, defined_error_data ): return ErrorRecoveryType.WAIT_FOR_RECOVERY else: return ErrorRecoveryType.FAIL_RUN -def _is_recoverable(failed_command: Command, exception: Exception) -> bool: +def _is_recoverable( + failed_command: Command, error_data: Optional[CommandDefinedErrorData] +) -> bool: if ( - failed_command.commandType == "pickUpTip" - and isinstance(exception, EnumeratedError) - # Hack(?): It seems like this should be ErrorCodes.TIP_PICKUP_FAILED, but that's - # not what gets raised in practice. - and exception.code == ErrorCodes.UNEXPECTED_TIP_REMOVAL + isinstance(failed_command, PickUpTip) + and error_data is not None + and isinstance(error_data.public, TipPhysicallyMissingError) ): return True else: diff --git a/api/src/opentrons/protocol_engine/execution/command_executor.py b/api/src/opentrons/protocol_engine/execution/command_executor.py index ca397baec02..40c2bf31a54 100644 --- a/api/src/opentrons/protocol_engine/execution/command_executor.py +++ b/api/src/opentrons/protocol_engine/execution/command_executor.py @@ -2,7 +2,6 @@ import asyncio from logging import getLogger from typing import Optional, List, Protocol -from typing_extensions import assert_never from opentrons.hardware_control import HardwareControlAPI @@ -128,6 +127,7 @@ async def execute(self, command_id: str) -> None: tip_handler=self._tip_handler, run_control=self._run_control, rail_lights=self._rail_lights, + model_utils=self._model_utils, status_bar=self._status_bar, command_note_adder=note_tracker, ) @@ -168,16 +168,9 @@ async def execute(self, command_id: str) -> None: error_id=self._model_utils.generate_id(), failed_at=self._model_utils.get_timestamp(), notes=note_tracker.get_notes(), - # todo(mm, 2024-03-13): - # When a command fails recoverably, and we handle it with - # WAIT_FOR_RECOVERY or CONTINUE, we want to update our logical - # protocol state as if the command succeeded. (e.g. if a tip - # pickup failed, pretend that it succeeded and that the tip is now - # on the pipette.) However, this currently does the opposite, - # acting as if the command never executed. type=self._error_recovery_policy( running_command, - error, + None, ), ) ) @@ -198,6 +191,14 @@ async def execute(self, command_id: str) -> None: ) else: # The command encountered a defined error. - # TODO(mm, 2024-05-10): Once commands start returning DefinedErrorData, - # handle it here by dispatching a FailCommandAction. - assert_never(result) + self._action_dispatcher.dispatch( + FailCommandAction( + error=result, + command_id=running_command.id, + running_command=running_command, + error_id=result.public.id, + failed_at=result.public.createdAt, + notes=note_tracker.get_notes(), + type=self._error_recovery_policy(running_command, result), + ) + ) diff --git a/api/src/opentrons/protocol_engine/state/commands.py b/api/src/opentrons/protocol_engine/state/commands.py index 7500b16d631..8a4098b0a8b 100644 --- a/api/src/opentrons/protocol_engine/state/commands.py +++ b/api/src/opentrons/protocol_engine/state/commands.py @@ -268,16 +268,19 @@ def handle_action(self, action: Action) -> None: # noqa: C901 self._state.command_history.set_command_succeeded(succeeded_command) elif isinstance(action, FailCommandAction): - error_occurrence = ErrorOccurrence.from_failed( - id=action.error_id, - createdAt=action.failed_at, - error=action.error, - ) + if isinstance(action.error, EnumeratedError): + public_error_occurrence = ErrorOccurrence.from_failed( + id=action.error_id, + createdAt=action.failed_at, + error=action.error, + ) + else: + public_error_occurrence = action.error.public self._update_to_failed( command_id=action.command_id, failed_at=action.failed_at, - error_occurrence=error_occurrence, + error_occurrence=public_error_occurrence, error_recovery_type=action.type, notes=action.notes, ) diff --git a/api/tests/opentrons/protocol_engine/commands/conftest.py b/api/tests/opentrons/protocol_engine/commands/conftest.py index aad3cf21d4a..99046f7c84a 100644 --- a/api/tests/opentrons/protocol_engine/commands/conftest.py +++ b/api/tests/opentrons/protocol_engine/commands/conftest.py @@ -14,6 +14,7 @@ StatusBarHandler, TipHandler, ) +from opentrons.protocol_engine.resources.model_utils import ModelUtils from opentrons.protocol_engine.state import StateView @@ -65,6 +66,12 @@ def rail_lights(decoy: Decoy) -> RailLightsHandler: return decoy.mock(cls=RailLightsHandler) +@pytest.fixture +def model_utils(decoy: Decoy) -> ModelUtils: + """Get a mocked out ModelUtils.""" + return decoy.mock(cls=ModelUtils) + + @pytest.fixture def status_bar(decoy: Decoy) -> StatusBarHandler: """Get a mocked out StatusBarHandler.""" diff --git a/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py b/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py index d44f769ab76..1e24a8033f1 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py +++ b/api/tests/opentrons/protocol_engine/commands/test_pick_up_tip.py @@ -1,59 +1,46 @@ """Test pick up tip commands.""" -import pytest -from decoy import Decoy +from datetime import datetime + +from decoy import Decoy, matchers from opentrons.types import MountType, Point from opentrons.protocol_engine import WellLocation, WellOffset, DeckPoint -from opentrons.protocol_engine.types import TipGeometry -from opentrons.protocol_engine.state import StateView +from opentrons.protocol_engine.errors import TipNotAttachedError from opentrons.protocol_engine.execution import MovementHandler, TipHandler +from opentrons.protocol_engine.resources import ModelUtils +from opentrons.protocol_engine.state import StateView +from opentrons.protocol_engine.types import TipGeometry -from opentrons.protocol_engine.commands.command import SuccessData +from opentrons.protocol_engine.commands.command import DefinedErrorData, SuccessData from opentrons.protocol_engine.commands.pick_up_tip import ( PickUpTipParams, PickUpTipResult, PickUpTipImplementation, + TipPhysicallyMissingError, + TipPhysicallyMissingErrorInternalData, ) -@pytest.fixture -def mock_state_view(decoy: Decoy) -> StateView: - """Get a mock StateView.""" - return decoy.mock(cls=StateView) - - -@pytest.fixture -def mock_movement_handler(decoy: Decoy) -> MovementHandler: - """Get a mock MovementHandler.""" - return decoy.mock(cls=MovementHandler) - - -@pytest.fixture -def mock_tip_handler(decoy: Decoy) -> TipHandler: - """Get a mock TipHandler.""" - return decoy.mock(cls=TipHandler) - - -async def test_pick_up_tip_implementation( +async def test_success( decoy: Decoy, - mock_state_view: StateView, - mock_movement_handler: MovementHandler, - mock_tip_handler: TipHandler, + state_view: StateView, + movement: MovementHandler, + tip_handler: TipHandler, + model_utils: ModelUtils, ) -> None: """A PickUpTip command should have an execution implementation.""" subject = PickUpTipImplementation( - state_view=mock_state_view, - movement=mock_movement_handler, - tip_handler=mock_tip_handler, + state_view=state_view, + movement=movement, + tip_handler=tip_handler, + model_utils=model_utils, ) - decoy.when(mock_state_view.pipettes.get_mount("pipette-id")).then_return( - MountType.LEFT - ) + decoy.when(state_view.pipettes.get_mount("pipette-id")).then_return(MountType.LEFT) decoy.when( - await mock_movement_handler.move_to_well( + await movement.move_to_well( pipette_id="pipette-id", labware_id="labware-id", well_name="A3", @@ -62,7 +49,7 @@ async def test_pick_up_tip_implementation( ).then_return(Point(x=111, y=222, z=333)) decoy.when( - await mock_tip_handler.pick_up_tip( + await tip_handler.pick_up_tip( pipette_id="pipette-id", labware_id="labware-id", well_name="A3", @@ -87,3 +74,46 @@ async def test_pick_up_tip_implementation( ), private=None, ) + + +async def test_tip_physically_missing_error( + decoy: Decoy, + state_view: StateView, + movement: MovementHandler, + tip_handler: TipHandler, + model_utils: ModelUtils, +) -> None: + """It should return a TipPhysicallyMissingError if the HW API indicates that.""" + subject = PickUpTipImplementation( + state_view=state_view, + movement=movement, + tip_handler=tip_handler, + model_utils=model_utils, + ) + + pipette_id = "pipette-id" + labware_id = "labware-id" + well_name = "well-name" + error_id = "error-id" + error_created_at = datetime(1234, 5, 6) + + decoy.when( + await tip_handler.pick_up_tip( + pipette_id=pipette_id, labware_id=labware_id, well_name=well_name + ) + ).then_raise(TipNotAttachedError()) + decoy.when(model_utils.generate_id()).then_return(error_id) + decoy.when(model_utils.get_timestamp()).then_return(error_created_at) + + result = await subject.execute( + PickUpTipParams(pipetteId=pipette_id, labwareId=labware_id, wellName=well_name) + ) + + assert result == DefinedErrorData( + public=TipPhysicallyMissingError.construct( + id=error_id, createdAt=error_created_at, wrappedErrors=[matchers.Anything()] + ), + private=TipPhysicallyMissingErrorInternalData( + pipette_id=pipette_id, labware_id=labware_id, well_name=well_name + ), + ) diff --git a/api/tests/opentrons/protocol_engine/execution/test_command_executor.py b/api/tests/opentrons/protocol_engine/execution/test_command_executor.py index 57d370eef8f..2bc4a65d859 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_command_executor.py +++ b/api/tests/opentrons/protocol_engine/execution/test_command_executor.py @@ -1,7 +1,7 @@ """Smoke tests for the CommandExecutor class.""" import asyncio from datetime import datetime -from typing import Any, Optional, Type, cast +from typing import Any, Optional, Type, Union, cast import pytest from decoy import Decoy, matchers @@ -10,7 +10,6 @@ from opentrons.hardware_control import HardwareControlAPI, OT2HardwareControlAPI from opentrons.protocol_engine import errors -from opentrons.protocol_engine.commands.command import SuccessData from opentrons.protocol_engine.error_recovery_policy import ( ErrorRecoveryPolicy, ErrorRecoveryType, @@ -34,6 +33,7 @@ CommandStatus, Command, ) +from opentrons.protocol_engine.commands.command import DefinedErrorData, SuccessData from opentrons.protocol_engine.execution import ( CommandExecutor, @@ -212,12 +212,19 @@ class _TestCommandResult(BaseModel): bar: str = "bar" -class _TestCommandImpl( - AbstractCommandImpl[_TestCommandParams, SuccessData[_TestCommandResult, None]] -): - async def execute( - self, params: _TestCommandParams - ) -> SuccessData[_TestCommandResult, None]: +class _TestCommandDefinedError(ErrorOccurrence): + errorType: str = "testCommandDefinedError" + detail: str = "test command defined error" + + +_TestCommandReturn = Union[ + SuccessData[_TestCommandResult, None], + DefinedErrorData[_TestCommandDefinedError, None], +] + + +class _TestCommandImpl(AbstractCommandImpl[_TestCommandParams, _TestCommandReturn]): + async def execute(self, params: _TestCommandParams) -> _TestCommandReturn: raise NotImplementedError() @@ -330,6 +337,7 @@ class _TestCommand( tip_handler=mock_tip_handler, run_control=run_control, rail_lights=rail_lights, + model_utils=model_utils, status_bar=status_bar, command_note_adder=command_note_tracker, ) @@ -358,31 +366,27 @@ class _TestCommand( @pytest.mark.parametrize( - ["command_error", "expected_error", "unexpected_error"], + ["command_error", "expected_error"], [ ( errors.ProtocolEngineError(message="oh no"), matchers.ErrorMatching(errors.ProtocolEngineError, match="oh no"), - False, ), ( EStopActivatedError(), matchers.ErrorMatching(PE_EStopActivatedError), - True, ), ( RuntimeError("oh no"), matchers.ErrorMatching(PythonException, match="oh no"), - True, ), ( asyncio.CancelledError(), matchers.ErrorMatching(errors.RunStoppedError), - False, ), ], ) -async def test_execute_raises_protocol_engine_error( +async def test_execute_undefined_error( decoy: Decoy, hardware_api: HardwareControlAPI, state_store: StateStore, @@ -402,9 +406,8 @@ async def test_execute_raises_protocol_engine_error( error_recovery_policy: ErrorRecoveryPolicy, command_error: Exception, expected_error: Any, - unexpected_error: bool, ) -> None: - """It should handle an error occuring during execution.""" + """It should handle an undefined error raised from execution.""" TestCommandImplCls = decoy.mock(func=_TestCommandImpl) command_impl = decoy.mock(cls=_TestCommandImpl) @@ -479,6 +482,7 @@ class _TestCommand( tip_handler=mock_tip_handler, run_control=run_control, rail_lights=rail_lights, + model_utils=model_utils, status_bar=status_bar, command_note_adder=command_note_tracker, ) @@ -494,7 +498,7 @@ class _TestCommand( datetime(year=2023, month=3, day=3), ) - decoy.when(error_recovery_policy(matchers.Anything(), expected_error)).then_return( + decoy.when(error_recovery_policy(matchers.Anything(), None)).then_return( ErrorRecoveryType.WAIT_FOR_RECOVERY ) @@ -515,3 +519,140 @@ class _TestCommand( ) ), ) + + +async def test_execute_defined_error( + decoy: Decoy, + subject: CommandExecutor, + hardware_api: HardwareControlAPI, + state_store: StateStore, + action_dispatcher: ActionDispatcher, + equipment: EquipmentHandler, + movement: MovementHandler, + mock_gantry_mover: GantryMover, + labware_movement: LabwareMovementHandler, + pipetting: PipettingHandler, + mock_tip_handler: TipHandler, + run_control: RunControlHandler, + rail_lights: RailLightsHandler, + status_bar: StatusBarHandler, + model_utils: ModelUtils, + command_note_tracker: CommandNoteTracker, + error_recovery_policy: ErrorRecoveryPolicy, +) -> None: + """It should handle a defined error returned from execution.""" + TestCommandImplCls = decoy.mock(func=_TestCommandImpl) + command_impl = decoy.mock(cls=_TestCommandImpl) + + class _TestCommand( + BaseCommand[_TestCommandParams, _TestCommandResult, ErrorOccurrence] + ): + commandType: str = "testCommand" + params: _TestCommandParams + result: Optional[_TestCommandResult] + + _ImplementationCls: Type[_TestCommandImpl] = TestCommandImplCls + + command_params = _TestCommandParams() + command_id = "command-id" + created_at = datetime(year=2021, month=1, day=1) + started_at = datetime(year=2022, month=2, day=2) + failed_at = datetime(year=2023, month=3, day=3) + error_id = "error-id" + returned_error = DefinedErrorData( + public=_TestCommandDefinedError(id=error_id, createdAt=failed_at), + private=None, + ) + queued_command = cast( + Command, + _TestCommand( + id=command_id, + key="command-key", + createdAt=created_at, + status=CommandStatus.QUEUED, + params=command_params, + ), + ) + running_command = cast( + Command, + _TestCommand( + id=command_id, + key="command-key", + createdAt=created_at, + startedAt=started_at, + status=CommandStatus.RUNNING, + params=command_params, + ), + ) + command_notes = [ + CommandNote( + noteKind="warning", + shortMessage="hello", + longMessage="test command note", + source="test", + ) + ] + + decoy.when(state_store.commands.get(command_id=command_id)).then_return( + queued_command + ) + + decoy.when( + action_dispatcher.dispatch( + RunCommandAction(command_id=command_id, started_at=started_at) + ) + ).then_do( + lambda _: decoy.when( + state_store.commands.get(command_id=command_id) + ).then_return(running_command) + ) + + decoy.when( + queued_command._ImplementationCls( + state_view=state_store, + hardware_api=hardware_api, + equipment=equipment, + movement=movement, + gantry_mover=mock_gantry_mover, + labware_movement=labware_movement, + pipetting=pipetting, + tip_handler=mock_tip_handler, + run_control=run_control, + rail_lights=rail_lights, + model_utils=model_utils, + status_bar=status_bar, + command_note_adder=command_note_tracker, + ) + ).then_return( + command_impl # type: ignore[arg-type] + ) + + decoy.when(command_note_tracker.get_notes()).then_return(command_notes) + + decoy.when(await command_impl.execute(command_params)).then_return(returned_error) + + decoy.when(model_utils.generate_id()).then_return(error_id) + decoy.when(model_utils.get_timestamp()).then_return(started_at, failed_at) + + decoy.when( + error_recovery_policy( + matchers.Anything(), + returned_error, # type: ignore[arg-type] + ) + ).then_return(ErrorRecoveryType.WAIT_FOR_RECOVERY) + + await subject.execute("command-id") + + decoy.verify( + action_dispatcher.dispatch( + FailCommandAction( + command_id="command-id", + running_command=running_command, + error_id="error-id", + failed_at=datetime(year=2023, month=3, day=3), + error=returned_error, # type: ignore[arg-type] + type=ErrorRecoveryType.WAIT_FOR_RECOVERY, + notes=command_notes, + ) + ) + ) From 1be63cd829baa8d2e02b927cb0ebf33a6bc386c3 Mon Sep 17 00:00:00 2001 From: Max Marrone Date: Thu, 16 May 2024 10:27:32 -0400 Subject: [PATCH 08/10] refactor(api): Move opentrons.initialize() to its own file (#15191) --- api/.flake8 | 2 - api/src/opentrons/__init__.py | 132 +++--------------- api/src/opentrons/_resources_path.py | 6 + api/src/opentrons/config/types.py | 15 +- .../hardware_control/emulation/smoothie.py | 2 +- .../hardware_control/initialization.py | 114 +++++++++++++++ .../integration/test_controller.py | 2 +- .../hardware_control/test_initialization.py | 13 ++ api/tests/opentrons/test_init.py | 13 -- api/tests/opentrons/test_resources_path.py | 10 ++ api/tests/test_init.py | 26 ++++ g-code-testing/cli.py | 2 +- .../g_code_parsing/g_code_engine.py | 2 +- .../protocol/protocol_configurations.py | 2 +- .../g_code_parsing/test_g_code_engine.py | 2 +- g-code-testing/tests/test_cli.py | 2 +- .../tests/test_g_code_comparison.py | 2 +- robot-server/robot_server/hardware.py | 3 +- 18 files changed, 207 insertions(+), 143 deletions(-) create mode 100644 api/src/opentrons/_resources_path.py create mode 100644 api/src/opentrons/hardware_control/initialization.py create mode 100644 api/tests/opentrons/hardware_control/test_initialization.py delete mode 100644 api/tests/opentrons/test_init.py create mode 100644 api/tests/opentrons/test_resources_path.py create mode 100644 api/tests/test_init.py diff --git a/api/.flake8 b/api/.flake8 index ee1a726e611..b17e915630b 100644 --- a/api/.flake8 +++ b/api/.flake8 @@ -28,7 +28,6 @@ noqa-require-code = true # string lints in these modules; remove entries as they are fixed per-file-ignores = setup.py:ANN,D - src/opentrons/__init__.py:ANN,D src/opentrons/execute.py:ANN,D src/opentrons/simulate.py:ANN,D src/opentrons/types.py:ANN,D @@ -47,7 +46,6 @@ per-file-ignores = src/opentrons/util/linal.py:ANN,D src/opentrons/util/entrypoint_util.py:ANN,D src/opentrons/util/helpers.py:ANN,D - tests/opentrons/test_init.py:ANN,D tests/opentrons/test_types.py:ANN,D tests/opentrons/conftest.py:ANN,D tests/opentrons/calibration_storage/*:ANN,D diff --git a/api/src/opentrons/__init__.py b/api/src/opentrons/__init__.py index 086c663da0e..922b1914cb6 100755 --- a/api/src/opentrons/__init__.py +++ b/api/src/opentrons/__init__.py @@ -1,47 +1,33 @@ -import os +# noqa: D104 -from pathlib import Path import logging -import re -from typing import Any, List, Tuple - -from opentrons.drivers.serial_communication import get_ports_by_name -from opentrons.hardware_control import ( - API as HardwareAPI, - ThreadManager, - ThreadManagedHardware, - types as hw_types, -) - -from opentrons.config import ( - feature_flags as ff, - name, - robot_configs, - IS_ROBOT, - ROBOT_FIRMWARE_DIR, -) -from opentrons.util import logging_config -from opentrons.protocols.types import ApiDeprecationError -from opentrons.protocols.api_support.types import APIVersion +from typing import List + +from opentrons.config import feature_flags as ff from ._version import version -HERE = os.path.abspath(os.path.dirname(__file__)) __version__ = version LEGACY_MODULES = ["robot", "reset", "instruments", "containers", "labware", "modules"] -__all__ = ["version", "__version__", "HERE", "config"] +__all__ = ["version", "__version__", "config"] def __getattr__(attrname: str) -> None: - """ - Prevent import of legacy modules from global to officially - deprecate Python API Version 1.0. + """Prevent import of legacy modules from global. + + This is to officially deprecate Python API Version 1.0. """ if attrname in LEGACY_MODULES: + # Local imports for performance. This case is not hit frequently, and we + # don't want to drag these imports in any time anything is imported from + # anywhere in the `opentrons` package. + from opentrons.protocols.types import ApiDeprecationError + from opentrons.protocols.api_support.types import APIVersion + raise ApiDeprecationError(APIVersion(1, 0)) raise AttributeError(attrname) @@ -53,98 +39,18 @@ def __dir__() -> List[str]: log = logging.getLogger(__name__) -SMOOTHIE_HEX_RE = re.compile("smoothie-(.*).hex") - - -def _find_smoothie_file() -> Tuple[Path, str]: - resources: List[Path] = [] - - # Search for smoothie files in /usr/lib/firmware first then fall back to - # value packed in wheel - if IS_ROBOT: - resources.extend(ROBOT_FIRMWARE_DIR.iterdir()) # type: ignore - - resources_path = Path(HERE) / "resources" - resources.extend(resources_path.iterdir()) - - for path in resources: - matches = SMOOTHIE_HEX_RE.search(path.name) - if matches: - branch_plus_ref = matches.group(1) - return path, branch_plus_ref - raise OSError(f"Could not find smoothie firmware file in {resources_path}") - - -def _get_motor_control_serial_port() -> Any: - port = os.environ.get("OT_SMOOTHIE_EMULATOR_URI") - - if port is None: - smoothie_id = os.environ.get("OT_SMOOTHIE_ID", "AMA") - # TODO(mc, 2021-08-01): raise a more informative exception than - # IndexError if a valid serial port is not found - port = get_ports_by_name(device_name=smoothie_id)[0] - - log.info(f"Connecting to motor controller at port {port}") - return port - - +# todo(mm, 2024-05-15): Having functions in the package's top-level __init__.py +# can cause problems with import performance and circular dependencies. Can this +# be moved elsewhere? def should_use_ot3() -> bool: """Return true if ot3 hardware controller should be used.""" if ff.enable_ot3_hardware_controller(): try: + # Try this OT-3-specific import as an extra check in case the feature + # flag is mistakenly enabled on an OT-2 for some reason. from opentrons_hardware.drivers.can_bus import CanDriver # noqa: F401 return True except ModuleNotFoundError: log.exception("Cannot use OT3 Hardware controller.") return False - - -async def _create_thread_manager() -> ThreadManagedHardware: - """Build the hardware controller wrapped in a ThreadManager. - - .. deprecated:: 4.6 - ThreadManager is on its way out. - """ - if os.environ.get("ENABLE_VIRTUAL_SMOOTHIE"): - log.info("Initialized robot using virtual Smoothie") - thread_manager: ThreadManagedHardware = ThreadManager( - HardwareAPI.build_hardware_simulator - ) - elif should_use_ot3(): - from opentrons.hardware_control.ot3api import OT3API - - thread_manager = ThreadManager( - ThreadManager.nonblocking_builder(OT3API.build_hardware_controller), - use_usb_bus=ff.rear_panel_integration(), - status_bar_enabled=ff.status_bar_enabled(), - feature_flags=hw_types.HardwareFeatureFlags.build_from_ff(), - ) - else: - thread_manager = ThreadManager( - ThreadManager.nonblocking_builder(HardwareAPI.build_hardware_controller), - port=_get_motor_control_serial_port(), - firmware=_find_smoothie_file(), - feature_flags=hw_types.HardwareFeatureFlags.build_from_ff(), - ) - - try: - await thread_manager.managed_thread_ready_async() - except RuntimeError: - log.exception("Could not build hardware controller, forcing virtual") - thread_manager = ThreadManager(HardwareAPI.build_hardware_simulator) - - return thread_manager - - -async def initialize() -> ThreadManagedHardware: - """ - Initialize the Opentrons hardware returning a hardware instance. - """ - robot_conf = robot_configs.load() - logging_config.log_init(robot_conf.log_level) - - log.info(f"API server version: {version}") - log.info(f"Robot Name: {name()}") - - return await _create_thread_manager() diff --git a/api/src/opentrons/_resources_path.py b/api/src/opentrons/_resources_path.py new file mode 100644 index 00000000000..afd4d5fd938 --- /dev/null +++ b/api/src/opentrons/_resources_path.py @@ -0,0 +1,6 @@ +"""The path to the package's `resources/` directory.""" + +from pathlib import Path + +_THIS = Path(__file__) +RESOURCES_PATH = (_THIS.parent / "resources").absolute() diff --git a/api/src/opentrons/config/types.py b/api/src/opentrons/config/types.py index f13d5a5e6e3..264a9779c6c 100644 --- a/api/src/opentrons/config/types.py +++ b/api/src/opentrons/config/types.py @@ -1,8 +1,11 @@ from enum import Enum from dataclasses import dataclass, asdict, fields -from typing import Dict, Tuple, TypeVar, Generic, List, cast, Optional +from typing import Dict, Tuple, TypeVar, Generic, List, cast, Optional, TYPE_CHECKING from typing_extensions import TypedDict, Literal -from opentrons.hardware_control.types import OT3AxisKind, InstrumentProbeType + +if TYPE_CHECKING: + # Work around circular import. + from opentrons.hardware_control.types import OT3AxisKind, InstrumentProbeType class AxisDict(TypedDict): @@ -31,7 +34,7 @@ def __getitem__(self, key: GantryLoad) -> Vt: return cast(Vt, asdict(self)[key.value]) -PerPipetteAxisSettings = ByGantryLoad[Dict[OT3AxisKind, float]] +PerPipetteAxisSettings = ByGantryLoad[Dict["OT3AxisKind", float]] class CurrentDictDefault(TypedDict): @@ -82,7 +85,7 @@ class OT3MotionSettings: def by_gantry_load( self, gantry_load: GantryLoad - ) -> Dict[str, Dict[OT3AxisKind, float]]: + ) -> Dict[str, Dict["OT3AxisKind", float]]: return dict( (field.name, getattr(self, field.name)[gantry_load]) for field in fields(self) @@ -96,7 +99,7 @@ class OT3CurrentSettings: def by_gantry_load( self, gantry_load: GantryLoad - ) -> Dict[str, Dict[OT3AxisKind, float]]: + ) -> Dict[str, Dict["OT3AxisKind", float]]: return dict( (field.name, getattr(self, field.name)[gantry_load]) for field in fields(self) @@ -139,7 +142,7 @@ class LiquidProbeSettings: aspirate_while_sensing: bool auto_zero_sensor: bool num_baseline_reads: int - data_files: Optional[Dict[InstrumentProbeType, str]] + data_files: Optional[Dict["InstrumentProbeType", str]] @dataclass(frozen=True) diff --git a/api/src/opentrons/hardware_control/emulation/smoothie.py b/api/src/opentrons/hardware_control/emulation/smoothie.py index d9b828011e1..04ee2bab7d2 100644 --- a/api/src/opentrons/hardware_control/emulation/smoothie.py +++ b/api/src/opentrons/hardware_control/emulation/smoothie.py @@ -7,9 +7,9 @@ import re from typing import Optional, Dict -from opentrons import _find_smoothie_file from opentrons.drivers import utils from opentrons.drivers.smoothie_drivers.constants import GCODE, HOMED_POSITION +from opentrons.hardware_control.initialization import _find_smoothie_file from opentrons.hardware_control.emulation.parser import Command, Parser from .abstract_emulator import AbstractEmulator diff --git a/api/src/opentrons/hardware_control/initialization.py b/api/src/opentrons/hardware_control/initialization.py new file mode 100644 index 00000000000..db6c6571fe0 --- /dev/null +++ b/api/src/opentrons/hardware_control/initialization.py @@ -0,0 +1,114 @@ +import os + +from pathlib import Path +import logging +import re +from typing import Any, List, Tuple + +from opentrons import should_use_ot3 +from opentrons.drivers.serial_communication import get_ports_by_name +from opentrons.hardware_control import ( + API as HardwareAPI, + ThreadManager, + ThreadManagedHardware, + types as hw_types, +) + +from opentrons.config import ( + feature_flags as ff, + name, + robot_configs, + IS_ROBOT, + ROBOT_FIRMWARE_DIR, +) +from opentrons.util import logging_config + +from opentrons._resources_path import RESOURCES_PATH +from opentrons._version import version + + +SMOOTHIE_HEX_RE = re.compile("smoothie-(.*).hex") + + +log = logging.getLogger(__name__) + + +def _find_smoothie_file() -> Tuple[Path, str]: + resources: List[Path] = [] + + # Search for smoothie files in /usr/lib/firmware first then fall back to + # value packed in wheel + if IS_ROBOT: + resources.extend(ROBOT_FIRMWARE_DIR.iterdir()) # type: ignore + + resources.extend(RESOURCES_PATH.iterdir()) + + for path in resources: + matches = SMOOTHIE_HEX_RE.search(path.name) + if matches: + branch_plus_ref = matches.group(1) + return path, branch_plus_ref + raise OSError(f"Could not find smoothie firmware file in {RESOURCES_PATH}") + + +def _get_motor_control_serial_port() -> Any: + port = os.environ.get("OT_SMOOTHIE_EMULATOR_URI") + + if port is None: + smoothie_id = os.environ.get("OT_SMOOTHIE_ID", "AMA") + # TODO(mc, 2021-08-01): raise a more informative exception than + # IndexError if a valid serial port is not found + port = get_ports_by_name(device_name=smoothie_id)[0] + + log.info(f"Connecting to motor controller at port {port}") + return port + + +async def _create_thread_manager() -> ThreadManagedHardware: + """Build the hardware controller wrapped in a ThreadManager. + + .. deprecated:: 4.6 + ThreadManager is on its way out. + """ + if os.environ.get("ENABLE_VIRTUAL_SMOOTHIE"): + log.info("Initialized robot using virtual Smoothie") + thread_manager: ThreadManagedHardware = ThreadManager( + HardwareAPI.build_hardware_simulator + ) + elif should_use_ot3(): + from opentrons.hardware_control.ot3api import OT3API + + thread_manager = ThreadManager( + ThreadManager.nonblocking_builder(OT3API.build_hardware_controller), + use_usb_bus=ff.rear_panel_integration(), + status_bar_enabled=ff.status_bar_enabled(), + feature_flags=hw_types.HardwareFeatureFlags.build_from_ff(), + ) + else: + thread_manager = ThreadManager( + ThreadManager.nonblocking_builder(HardwareAPI.build_hardware_controller), + port=_get_motor_control_serial_port(), + firmware=_find_smoothie_file(), + feature_flags=hw_types.HardwareFeatureFlags.build_from_ff(), + ) + + try: + await thread_manager.managed_thread_ready_async() + except RuntimeError: + log.exception("Could not build hardware controller, forcing virtual") + thread_manager = ThreadManager(HardwareAPI.build_hardware_simulator) + + return thread_manager + + +async def initialize() -> ThreadManagedHardware: + """ + Initialize the Opentrons hardware returning a hardware instance. + """ + robot_conf = robot_configs.load() + logging_config.log_init(robot_conf.log_level) + + log.info(f"API server version: {version}") + log.info(f"Robot Name: {name()}") + + return await _create_thread_manager() diff --git a/api/tests/opentrons/hardware_control/integration/test_controller.py b/api/tests/opentrons/hardware_control/integration/test_controller.py index 4efbc9243a1..a3d71bf4121 100644 --- a/api/tests/opentrons/hardware_control/integration/test_controller.py +++ b/api/tests/opentrons/hardware_control/integration/test_controller.py @@ -1,9 +1,9 @@ from typing import Iterator import pytest -from opentrons import _find_smoothie_file from opentrons.config.robot_configs import build_config from opentrons.hardware_control import Controller +from opentrons.hardware_control.initialization import _find_smoothie_file from opentrons.hardware_control.emulation.settings import Settings from opentrons.types import Mount diff --git a/api/tests/opentrons/hardware_control/test_initialization.py b/api/tests/opentrons/hardware_control/test_initialization.py new file mode 100644 index 00000000000..f892d746684 --- /dev/null +++ b/api/tests/opentrons/hardware_control/test_initialization.py @@ -0,0 +1,13 @@ +import pytest +from pathlib import Path + +from opentrons.hardware_control import initialization + + +def test_find_smoothie_file(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + dummy_file = tmp_path / "smoothie-edge-2cac98asda.hex" + dummy_file.write_text("hello") + monkeypatch.setattr(initialization, "ROBOT_FIRMWARE_DIR", tmp_path) + + monkeypatch.setattr(initialization, "IS_ROBOT", True) + assert initialization._find_smoothie_file() == (dummy_file, "edge-2cac98asda") diff --git a/api/tests/opentrons/test_init.py b/api/tests/opentrons/test_init.py deleted file mode 100644 index b48f4f52f24..00000000000 --- a/api/tests/opentrons/test_init.py +++ /dev/null @@ -1,13 +0,0 @@ -import pytest -from pathlib import Path - - -def test_find_smoothie_file(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: - import opentrons - - dummy_file = tmp_path / "smoothie-edge-2cac98asda.hex" - dummy_file.write_text("hello") - monkeypatch.setattr(opentrons, "ROBOT_FIRMWARE_DIR", tmp_path) - - monkeypatch.setattr(opentrons, "IS_ROBOT", True) - assert opentrons._find_smoothie_file() == (dummy_file, "edge-2cac98asda") diff --git a/api/tests/opentrons/test_resources_path.py b/api/tests/opentrons/test_resources_path.py new file mode 100644 index 00000000000..31bdb23181b --- /dev/null +++ b/api/tests/opentrons/test_resources_path.py @@ -0,0 +1,10 @@ +"""Unit tests for opentrons._resources_path.""" + + +from opentrons._resources_path import RESOURCES_PATH + + +def test_resources_path() -> None: + """Make sure the resource path is basically accessible.""" + matches = list(RESOURCES_PATH.glob("smoothie-*")) + assert matches diff --git a/api/tests/test_init.py b/api/tests/test_init.py new file mode 100644 index 00000000000..4f421d88bac --- /dev/null +++ b/api/tests/test_init.py @@ -0,0 +1,26 @@ +"""Tests for the top-level __init__.py.""" + +import pytest + +from opentrons.protocols.types import ApiDeprecationError + + +def test_legacy_imports() -> None: + """Certain imports should raise ApiDeprecationErrors.""" + with pytest.raises(ApiDeprecationError): + from opentrons import robot # noqa: F401 + + with pytest.raises(ApiDeprecationError): + from opentrons import reset # noqa: F401 + + with pytest.raises(ApiDeprecationError): + from opentrons import instruments # noqa: F401 + + with pytest.raises(ApiDeprecationError): + from opentrons import containers # noqa: F401 + + with pytest.raises(ApiDeprecationError): + from opentrons import labware # noqa: F401 + + with pytest.raises(ApiDeprecationError): + from opentrons import modules # noqa: F401 diff --git a/g-code-testing/cli.py b/g-code-testing/cli.py index 3476827a391..650fc4fb28a 100644 --- a/g-code-testing/cli.py +++ b/g-code-testing/cli.py @@ -18,7 +18,7 @@ Union, ) -from opentrons import APIVersion +from opentrons.protocols.api_support.types import APIVersion from g_code_parsing.errors import UnparsableCLICommandError from g_code_parsing.g_code_differ import GCodeDiffer diff --git a/g-code-testing/g_code_parsing/g_code_engine.py b/g-code-testing/g_code_parsing/g_code_engine.py index 29e5b046e7f..9b735fdface 100644 --- a/g-code-testing/g_code_parsing/g_code_engine.py +++ b/g-code-testing/g_code_parsing/g_code_engine.py @@ -5,7 +5,6 @@ from typing import AsyncGenerator, Callable, Iterator, Union from collections import namedtuple -from opentrons import APIVersion from opentrons.hardware_control.emulation.settings import Settings from opentrons.protocol_engine import create_protocol_engine, Config, DeckType from opentrons.protocol_reader.protocol_source import ( @@ -15,6 +14,7 @@ PythonProtocolConfig, ) from opentrons.protocol_runner.protocol_runner import create_protocol_runner +from opentrons.protocols.api_support.types import APIVersion from opentrons.protocols.parse import parse from opentrons.protocols.execution import execute from opentrons.protocols.api_support import deck_type diff --git a/g-code-testing/g_code_test_data/protocol/protocol_configurations.py b/g-code-testing/g_code_test_data/protocol/protocol_configurations.py index ba8de92e0d8..ea2e61e21dc 100644 --- a/g-code-testing/g_code_test_data/protocol/protocol_configurations.py +++ b/g-code-testing/g_code_test_data/protocol/protocol_configurations.py @@ -1,4 +1,4 @@ -from opentrons import APIVersion +from opentrons.protocols.api_support.types import APIVersion from opentrons.hardware_control.emulation.settings import ( Settings, diff --git a/g-code-testing/tests/g_code_parsing/test_g_code_engine.py b/g-code-testing/tests/g_code_parsing/test_g_code_engine.py index 6d941d9f7e6..efc61861eb3 100644 --- a/g-code-testing/tests/g_code_parsing/test_g_code_engine.py +++ b/g-code-testing/tests/g_code_parsing/test_g_code_engine.py @@ -1,7 +1,7 @@ import pytest import os -from opentrons import APIVersion +from opentrons.protocols.api_support.types import APIVersion from g_code_parsing.g_code_engine import GCodeEngine from g_code_parsing.g_code_program.supported_text_modes import ( diff --git a/g-code-testing/tests/test_cli.py b/g-code-testing/tests/test_cli.py index 305c60ad081..e4f18d11abd 100644 --- a/g-code-testing/tests/test_cli.py +++ b/g-code-testing/tests/test_cli.py @@ -7,7 +7,7 @@ ) import pytest -from opentrons import APIVersion +from opentrons.protocols.api_support.types import APIVersion from cli import ( GCodeCLI, diff --git a/g-code-testing/tests/test_g_code_comparison.py b/g-code-testing/tests/test_g_code_comparison.py index 54a8268fd2f..26da501378c 100644 --- a/g-code-testing/tests/test_g_code_comparison.py +++ b/g-code-testing/tests/test_g_code_comparison.py @@ -1,5 +1,5 @@ import pytest -from opentrons import APIVersion +from opentrons.protocols.api_support.types import APIVersion from g_code_parsing.g_code_differ import GCodeDiffer from g_code_test_data.g_code_configuration import ProtocolGCodeConfirmConfig diff --git a/robot-server/robot_server/hardware.py b/robot-server/robot_server/hardware.py index 2994248a302..02390265cc2 100644 --- a/robot-server/robot_server/hardware.py +++ b/robot-server/robot_server/hardware.py @@ -20,7 +20,8 @@ from opentrons_shared_data import deck from opentrons_shared_data.robot.dev_types import RobotType, RobotTypeEnum -from opentrons import initialize as initialize_api, should_use_ot3 +from opentrons import should_use_ot3 +from opentrons.hardware_control.initialization import initialize as initialize_api from opentrons.config import ( IS_ROBOT, ARCHITECTURE, From 9c739b61ef8230e372b3ffa2bb3a4d2d8f412fb3 Mon Sep 17 00:00:00 2001 From: koji Date: Thu, 16 May 2024 10:58:22 -0400 Subject: [PATCH 09/10] fix(opentrons-ai-client): fix ChatContainer layout issue (#15182) * fix(opentrons-ai-client): fix ChatContainer layout issue --- opentrons-ai-client/README.md | 7 ++++ .../src/organisms/ChatContainer/index.tsx | 32 ++++++++----------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/opentrons-ai-client/README.md b/opentrons-ai-client/README.md index 5296a41b882..c2a15875311 100644 --- a/opentrons-ai-client/README.md +++ b/opentrons-ai-client/README.md @@ -13,8 +13,13 @@ To get started: clone the `Opentrons/opentrons` repository, set up your computer ```shell # change into the cloned directory cd opentrons + # prerequisite: install dependencies as specified in project setup make setup + +# if you have done the setup already, you can run the following instead of make setup +make teardown-js && make setup-js + # launch the dev server make -C opentrons-ai-client dev ``` @@ -27,6 +32,7 @@ The UI stack is built using: - [Babel][] - [Vite][] - [Jotai][] +- [styled-components][] Some important directories: @@ -61,5 +67,6 @@ TBD [babel]: https://babeljs.io/ [vite]: https://vitejs.dev/ [jotai]: https://jotai.org/ +[styled-components]: https://styled-components.com/ [bundle-analyzer]: https://github.com/webpack-contrib/webpack-bundle-analyzer [opentrons-ai-server]: https://github.com/Opentrons/opentrons/tree/edge/opentrons-ai-server diff --git a/opentrons-ai-client/src/organisms/ChatContainer/index.tsx b/opentrons-ai-client/src/organisms/ChatContainer/index.tsx index 5eaa44888a0..1e81e312bcd 100644 --- a/opentrons-ai-client/src/organisms/ChatContainer/index.tsx +++ b/opentrons-ai-client/src/organisms/ChatContainer/index.tsx @@ -7,8 +7,6 @@ import { COLORS, DIRECTION_COLUMN, Flex, - POSITION_ABSOLUTE, - POSITION_RELATIVE, SPACING, StyledText, TYPOGRAPHY, @@ -27,14 +25,13 @@ export function ChatContainer(): JSX.Element { padding={`${SPACING.spacing40} ${SPACING.spacing40} ${SPACING.spacing24}`} backgroundColor={COLORS.grey10} width="100%" + id="ChatContainer" + flexDirection={DIRECTION_COLUMN} + gridGap={SPACING.spacing40} > {/* This will be updated when input textbox and function are implemented */} - + {t('opentronsai')} {/* Prompt Guide remain as a reference for users. */} @@ -49,24 +46,21 @@ export function ChatContainer(): JSX.Element { )) : null} - - - {t('disclaimer')} - + + + + {t('disclaimer')} ) } const ChatDataContainer = styled(Flex)` - max-height: calc(100vh); - overflow-y: auto; flex-direction: ${DIRECTION_COLUMN}; grid-gap: ${SPACING.spacing12}; width: 100%; From cfdcdf6ece88c660291b957a00524086239a9ab3 Mon Sep 17 00:00:00 2001 From: koji Date: Thu, 16 May 2024 10:58:59 -0400 Subject: [PATCH 10/10] feat(opentrons-ai-client): add auth0 package (#15148) * feat(opentrons-ai-client): add auth0 package --- opentrons-ai-client/package.json | 1 + opentrons-ai-client/src/App.test.tsx | 43 +++++++++++++++++-- opentrons-ai-client/src/App.tsx | 42 ++++++++++++++++-- .../localization/en/protocol_generator.json | 3 ++ opentrons-ai-client/src/main.tsx | 17 ++++++-- .../__tests__/ChatDisplay.test.tsx | 6 ++- .../src/molecules/ChatDisplay/index.tsx | 4 +- .../src/molecules/InputPrompt/index.tsx | 40 +++++++++++------ .../src/molecules/Loading/index.tsx | 27 ++++++++++++ opentrons-ai-client/src/resources/types.ts | 4 +- package.json | 3 +- yarn.lock | 12 ++++++ 12 files changed, 173 insertions(+), 29 deletions(-) create mode 100644 opentrons-ai-client/src/molecules/Loading/index.tsx diff --git a/opentrons-ai-client/package.json b/opentrons-ai-client/package.json index dfd8069c7b1..3742fbe70c7 100644 --- a/opentrons-ai-client/package.json +++ b/opentrons-ai-client/package.json @@ -19,6 +19,7 @@ }, "homepage": "https://github.com/Opentrons/opentrons", "dependencies": { + "@auth0/auth0-react": "2.2.4", "@fontsource/public-sans": "5.0.3", "@opentrons/components": "link:../components", "axios": "^0.21.1", diff --git a/opentrons-ai-client/src/App.test.tsx b/opentrons-ai-client/src/App.test.tsx index 4ae3494a53c..cbc13739b45 100644 --- a/opentrons-ai-client/src/App.test.tsx +++ b/opentrons-ai-client/src/App.test.tsx @@ -1,29 +1,66 @@ import React from 'react' -import { screen } from '@testing-library/react' -import { describe, it, vi, beforeEach } from 'vitest' +import { fireEvent, screen } from '@testing-library/react' +import { describe, it, vi, beforeEach, expect } from 'vitest' +import * as auth0 from '@auth0/auth0-react' import { renderWithProviders } from './__testing-utils__' +import { i18n } from './i18n' import { SidePanel } from './molecules/SidePanel' import { ChatContainer } from './organisms/ChatContainer' +import { Loading } from './molecules/Loading' import { App } from './App' +vi.mock('@auth0/auth0-react') + +const mockLogout = vi.fn() + vi.mock('./molecules/SidePanel') vi.mock('./organisms/ChatContainer') +vi.mock('./molecules/Loading') const render = (): ReturnType => { - return renderWithProviders() + return renderWithProviders(, { + i18nInstance: i18n, + }) } describe('App', () => { beforeEach(() => { vi.mocked(SidePanel).mockReturnValue(
mock SidePanel
) vi.mocked(ChatContainer).mockReturnValue(
mock ChatContainer
) + vi.mocked(Loading).mockReturnValue(
mock Loading
) + }) + + it('should render loading screen when isLoading is true', () => { + ;(auth0 as any).useAuth0 = vi.fn().mockReturnValue({ + isAuthenticated: false, + isLoading: true, + }) + render() + screen.getByText('mock Loading') }) it('should render text', () => { + ;(auth0 as any).useAuth0 = vi.fn().mockReturnValue({ + isAuthenticated: true, + isLoading: false, + }) render() screen.getByText('mock SidePanel') screen.getByText('mock ChatContainer') + screen.getByText('Logout') + }) + + it('should call a mock function when clicking logout button', () => { + ;(auth0 as any).useAuth0 = vi.fn().mockReturnValue({ + isAuthenticated: true, + isLoading: false, + logout: mockLogout, + }) + render() + const logoutButton = screen.getByText('Logout') + fireEvent.click(logoutButton) + expect(mockLogout).toHaveBeenCalled() }) }) diff --git a/opentrons-ai-client/src/App.tsx b/opentrons-ai-client/src/App.tsx index 268a61b2e7f..6879985dc71 100644 --- a/opentrons-ai-client/src/App.tsx +++ b/opentrons-ai-client/src/App.tsx @@ -1,12 +1,48 @@ import React from 'react' -import { DIRECTION_ROW, Flex } from '@opentrons/components' +import { useAuth0 } from '@auth0/auth0-react' +import { useTranslation } from 'react-i18next' + +import { + DIRECTION_ROW, + Flex, + Link as LinkButton, + POSITION_ABSOLUTE, + POSITION_RELATIVE, + TYPOGRAPHY, +} from '@opentrons/components' import { SidePanel } from './molecules/SidePanel' import { ChatContainer } from './organisms/ChatContainer' +import { Loading } from './molecules/Loading' + +export function App(): JSX.Element | null { + const { t } = useTranslation('protocol_generator') + const { isAuthenticated, logout, isLoading, loginWithRedirect } = useAuth0() + + React.useEffect(() => { + if (!isAuthenticated && !isLoading) { + loginWithRedirect() + } + }, [isAuthenticated, isLoading]) + + if (isLoading) { + return + } + + if (!isAuthenticated) { + return null + } -export function App(): JSX.Element { return ( - + + + logout()} + textDecoration={TYPOGRAPHY.textDecorationUnderline} + > + {t('logout')} + + diff --git a/opentrons-ai-client/src/assets/localization/en/protocol_generator.json b/opentrons-ai-client/src/assets/localization/en/protocol_generator.json index 739611e853e..a2cdfb12256 100644 --- a/opentrons-ai-client/src/assets/localization/en/protocol_generator.json +++ b/opentrons-ai-client/src/assets/localization/en/protocol_generator.json @@ -5,6 +5,9 @@ "copy_code": "Copy code", "disclaimer": "OpentronsAI can make mistakes. Review your protocol before running it on an Opentrons robot.", "got_feedback": "Got feedback? We love to hear it.", + "loading": "Loading...", + "login": "Login", + "logout": "Logout", "make_sure_your_prompt": "Make sure your prompt includes the following:", "metadata": "Metadata: Three pieces of information.", "modules": "Modules: Thermocycler or Temperature Module.", diff --git a/opentrons-ai-client/src/main.tsx b/opentrons-ai-client/src/main.tsx index b7a003ddeca..f36640d349a 100644 --- a/opentrons-ai-client/src/main.tsx +++ b/opentrons-ai-client/src/main.tsx @@ -1,6 +1,7 @@ import React from 'react' import ReactDOM from 'react-dom/client' import { I18nextProvider } from 'react-i18next' +import { Auth0Provider } from '@auth0/auth0-react' import { GlobalStyle } from './atoms/GlobalStyle' import { i18n } from './i18n' @@ -10,10 +11,18 @@ const rootElement = document.getElementById('root') if (rootElement != null) { ReactDOM.createRoot(rootElement).render( - - - - + + + + + + ) } else { diff --git a/opentrons-ai-client/src/molecules/ChatDisplay/__tests__/ChatDisplay.test.tsx b/opentrons-ai-client/src/molecules/ChatDisplay/__tests__/ChatDisplay.test.tsx index 98fd30274ee..0c51b7771f2 100644 --- a/opentrons-ai-client/src/molecules/ChatDisplay/__tests__/ChatDisplay.test.tsx +++ b/opentrons-ai-client/src/molecules/ChatDisplay/__tests__/ChatDisplay.test.tsx @@ -17,8 +17,9 @@ describe('ChatDisplay', () => { props = { chat: { role: 'assistant', - content: 'mock text from the backend', + reply: 'mock text from the backend', }, + chatId: 'mockId', } }) it('should display response from the backend and label', () => { @@ -33,8 +34,9 @@ describe('ChatDisplay', () => { props = { chat: { role: 'user', - content: 'mock text from user input', + reply: 'mock text from user input', }, + chatId: 'mockId', } render(props) screen.getByText('You') diff --git a/opentrons-ai-client/src/molecules/ChatDisplay/index.tsx b/opentrons-ai-client/src/molecules/ChatDisplay/index.tsx index a8b844af08c..7559fea0a0a 100644 --- a/opentrons-ai-client/src/molecules/ChatDisplay/index.tsx +++ b/opentrons-ai-client/src/molecules/ChatDisplay/index.tsx @@ -27,7 +27,7 @@ interface ChatDisplayProps { export function ChatDisplay({ chat, chatId }: ChatDisplayProps): JSX.Element { const { t } = useTranslation('protocol_generator') const [isCopied, setIsCopied] = React.useState(false) - const { role, content } = chat + const { role, reply } = chat const isUser = role === 'user' const handleClickCopy = async (): Promise => { @@ -71,7 +71,7 @@ export function ChatDisplay({ chat, chatId }: ChatDisplayProps): JSX.Element { code: CodeText, }} > - {content} + {reply} {role === 'assistant' ? ( (null) const [loading, setLoading] = React.useState(false) - const [error, setError] = React.useState('') + // ToDo (kk:05/15/2024) this will be used in the future + // const [error, setError] = React.useState('') + + const { getAccessTokenSilently } = useAuth0() const userPrompt = watch('userPrompt') ?? '' @@ -49,19 +53,29 @@ export function InputPrompt(): JSX.Element { return rowsNum } + // ToDo (kk:05/15/2024) This will be moved to a better place const fetchData = async (prompt: string): Promise => { if (prompt !== '') { setLoading(true) try { - const response = await axios.post(url, { - headers: { - 'Content-Type': 'application/json', + const accessToken = await getAccessTokenSilently({ + authorizationParams: { + audience: 'sandbox-ai-api', }, - query: prompt, }) + const postData = { + message: prompt, + fake: false, + } + const headers = { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + } + const response = await axios.post(url, postData, { headers }) setData(response.data) } catch (err) { - setError('Error fetching data from the API.') + // setError('Error fetching data from the API.') + console.error(`error: ${err}`) } finally { setLoading(false) } @@ -71,7 +85,7 @@ export function InputPrompt(): JSX.Element { const handleClick = (): void => { const userInput: ChatData = { role: 'user', - content: userPrompt, + reply: userPrompt, } setChatData(chatData => [...chatData, userInput]) void fetchData(userPrompt) @@ -84,11 +98,11 @@ export function InputPrompt(): JSX.Element { }, [preparedPrompt, setValue]) React.useEffect(() => { - if (submitted && data && !loading) { - const { role, content } = data.data + if (submitted && data != null && !loading) { + const { role, reply } = data const assistantResponse: ChatData = { role, - content, + reply, } setChatData(chatData => [...chatData, assistantResponse]) setSubmitted(false) @@ -96,7 +110,7 @@ export function InputPrompt(): JSX.Element { }, [data, loading, submitted]) // ToDo (kk:05/02/2024) This is also temp. Asking the design about error. - console.error('error', error) + // console.error('error', error) return ( diff --git a/opentrons-ai-client/src/molecules/Loading/index.tsx b/opentrons-ai-client/src/molecules/Loading/index.tsx new file mode 100644 index 00000000000..c715812b749 --- /dev/null +++ b/opentrons-ai-client/src/molecules/Loading/index.tsx @@ -0,0 +1,27 @@ +import React from 'react' +import { useTranslation } from 'react-i18next' +import { + ALIGN_CENTER, + DIRECTION_COLUMN, + Flex, + Icon, + JUSTIFY_CENTER, + SPACING, + StyledText, +} from '@opentrons/components' + +export function Loading(): JSX.Element { + const { t } = useTranslation('protocol_generator') + return ( + + {t('loading')} + + + ) +} diff --git a/opentrons-ai-client/src/resources/types.ts b/opentrons-ai-client/src/resources/types.ts index a0f5ebca959..16d9239ec68 100644 --- a/opentrons-ai-client/src/resources/types.ts +++ b/opentrons-ai-client/src/resources/types.ts @@ -2,5 +2,7 @@ export interface ChatData { /** assistant: ChatGPT API, user: user */ role: 'assistant' | 'user' /** content ChatGPT API return or user prompt */ - content: string + reply: string + /** for testing purpose will be removed and this is not used in the app */ + fake?: boolean } diff --git a/package.json b/package.json index d440ede1742..0dbe9839d3a 100755 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "step-generation", "api-client", "react-api-client", - "usb-bridge/node-client" + "usb-bridge/node-client", + "opentrons-ai-client" ] }, "config": { diff --git a/yarn.lock b/yarn.lock index 269ab6f11a2..3b307160966 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,6 +30,18 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" +"@auth0/auth0-react@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@auth0/auth0-react/-/auth0-react-2.2.4.tgz#7f21751a219d4e0e019141819f00e76e436176dd" + integrity sha512-l29PQC0WdgkCoOc6WeMAY26gsy/yXJICW0jHfj0nz8rZZphYKrLNqTRWFFCMJY+sagza9tSgB1kG/UvQYgGh9A== + dependencies: + "@auth0/auth0-spa-js" "^2.1.3" + +"@auth0/auth0-spa-js@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@auth0/auth0-spa-js/-/auth0-spa-js-2.1.3.tgz#aabf6f439e41edbeef0cf4766ad754e5b47616e5" + integrity sha512-NMTBNuuG4g3rame1aCnNS5qFYIzsTUV5qTFPRfTyYFS1feS6jsCBR+eTq9YkxCp1yuoM2UIcjunPaoPl77U9xQ== + "@aw-web-design/x-default-browser@1.4.126": version "1.4.126" resolved "https://registry.yarnpkg.com/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz#43e4bd8f0314ed907a8718d7e862a203af79bc16"