From 546cc28f7b042c7bf62b99522e891df5e9173043 Mon Sep 17 00:00:00 2001 From: "Robert (Jamie) Munro" Date: Tue, 14 Oct 2025 14:28:04 +0100 Subject: [PATCH 1/4] feat: Add plugin to fix import extensions --- packages/webui/eslint.config.mjs | 6 ++++++ packages/webui/package.json | 1 + packages/yarn.lock | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/packages/webui/eslint.config.mjs b/packages/webui/eslint.config.mjs index 2017e806bb..ec90f85955 100644 --- a/packages/webui/eslint.config.mjs +++ b/packages/webui/eslint.config.mjs @@ -1,5 +1,6 @@ import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' import pluginReact from 'eslint-plugin-react' +import importExtensionsPlugin from 'eslint-plugin-import-extensions' import globals from 'globals' const tmpRules = { @@ -11,6 +12,8 @@ const tmpRules = { '@typescript-eslint/unbound-method': 'off', '@typescript-eslint/no-misused-promises': 'off', '@typescript-eslint/no-unnecessary-type-assertion': 'off', + 'import-extensions/require-extensions': ['error', { expectedExtensions: ['js'] }], + 'import-extensions/require-index': ['error', { expectedExtensions: ['js'] }], } const extendedRules = await generateEslintConfig({ @@ -20,6 +23,9 @@ const extendedRules = await generateEslintConfig({ }) extendedRules.push( { + plugins: { + 'import-extensions': importExtensionsPlugin, + }, settings: { react: { version: 'detect', diff --git a/packages/webui/package.json b/packages/webui/package.json index 7d379c8c04..4cbf15da20 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -107,6 +107,7 @@ "@welldone-software/why-did-you-render": "^4.3.2", "@xmldom/xmldom": "^0.8.10", "babel-jest": "^29.7.0", + "eslint-plugin-import-extensions": "^0.1.5", "globals": "^15.14.0", "sass": "^1.83.4", "sinon": "^14.0.2", diff --git a/packages/yarn.lock b/packages/yarn.lock index 883f845e84..5997876708 100644 --- a/packages/yarn.lock +++ b/packages/yarn.lock @@ -6446,6 +6446,7 @@ __metadata: cubic-spline: "npm:^3.0.3" deep-extend: "npm:0.6.0" ejson: "npm:^2.2.3" + eslint-plugin-import-extensions: "npm:^0.1.5" globals: "npm:^15.14.0" i18next: "npm:^21.10.0" i18next-browser-languagedetector: "npm:^6.1.8" @@ -14052,6 +14053,15 @@ asn1@evs-broadcast/node-asn1: languageName: node linkType: hard +"eslint-plugin-import-extensions@npm:^0.1.5": + version: 0.1.5 + resolution: "eslint-plugin-import-extensions@npm:0.1.5" + peerDependencies: + eslint: "*" + checksum: 10/a65e74e8ebe3aa951d90c78687e1f32d7fe3e2a8b5b3851cc321a3002a71ca3b884c2ad7f9621bea2b10efde306df2244d8d7814fc8bb3986341afacefd8f5f4 + languageName: node + linkType: hard + "eslint-plugin-jest@npm:^28.11.0": version: 28.11.0 resolution: "eslint-plugin-jest@npm:28.11.0" From e7c68b11d24638a85d4d3cce4c7443730808a349 Mon Sep 17 00:00:00 2001 From: "Robert (Jamie) Munro" Date: Wed, 15 Oct 2025 16:40:17 +0100 Subject: [PATCH 2/4] chore: Remove empty file This was confusing ESLint because it effectively overrode packages/webui/src/client/ui/Collections.ts --- packages/webui/src/client/ui/Collections/index.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/webui/src/client/ui/Collections/index.ts diff --git a/packages/webui/src/client/ui/Collections/index.ts b/packages/webui/src/client/ui/Collections/index.ts deleted file mode 100644 index e69de29bb2..0000000000 From 33949dadaa639f1564defcc38cd9289895a28ee9 Mon Sep 17 00:00:00 2001 From: "Robert (Jamie) Munro" Date: Wed, 15 Oct 2025 17:20:06 +0100 Subject: [PATCH 3/4] chore: Ensure all imports have .js extension where applicable By running eslint --fix --- .../lib/Components/MultiLineIntInput.tsx | 2 +- packages/webui/src/client/lib/Moment.tsx | 2 +- .../src/client/lib/__tests__/lib.test.ts | 2 +- packages/webui/src/client/ui/RundownView.tsx | 4 +-- .../ui/RundownView/CasparCGRestartButtons.tsx | 12 +++---- .../ui/RundownView/RundownDetachedShelf.tsx | 14 ++++---- .../RundownHeader/RundownHeader.tsx | 32 +++++++++---------- .../RundownHeader/RundownReloadResponse.ts | 14 ++++---- .../RundownHeader/TimingDisplay.tsx | 18 +++++------ .../useRundownPlaylistOperations.tsx | 22 ++++++------- .../ui/RundownView/RundownSorensenContext.tsx | 16 +++++----- .../RundownViewContextProviders.tsx | 12 +++---- .../RundownView/RundownViewSubscriptions.ts | 10 +++--- .../client/ui/RundownView/WarningDisplay.tsx | 4 +-- .../ui/RundownView/useQueueMiniShelfAdlib.ts | 16 +++++----- .../PackageManager/AccessorTableRow.tsx | 2 +- packages/webui/src/client/ui/Shelf/Shelf.tsx | 6 ++-- 17 files changed, 94 insertions(+), 94 deletions(-) diff --git a/packages/webui/src/client/lib/Components/MultiLineIntInput.tsx b/packages/webui/src/client/lib/Components/MultiLineIntInput.tsx index 06d67cc450..c6e2a3dc22 100644 --- a/packages/webui/src/client/lib/Components/MultiLineIntInput.tsx +++ b/packages/webui/src/client/lib/Components/MultiLineIntInput.tsx @@ -1,4 +1,4 @@ -import { IntInputControl } from './IntInput' +import { IntInputControl } from './IntInput.js' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faPlus, faTrash } from '@fortawesome/free-solid-svg-icons' import { useMemo } from 'react' diff --git a/packages/webui/src/client/lib/Moment.tsx b/packages/webui/src/client/lib/Moment.tsx index d5064d4dc9..77ed7fbeb8 100644 --- a/packages/webui/src/client/lib/Moment.tsx +++ b/packages/webui/src/client/lib/Moment.tsx @@ -1,6 +1,6 @@ import Moment, { MomentProps } from 'react-moment' import moment from 'moment' -import { useCurrentTime } from './lib' +import { useCurrentTime } from './lib.js' /** * Use instead of , its result is synced with getCurrentTime() diff --git a/packages/webui/src/client/lib/__tests__/lib.test.ts b/packages/webui/src/client/lib/__tests__/lib.test.ts index 4e12adc640..a94b3b7284 100644 --- a/packages/webui/src/client/lib/__tests__/lib.test.ts +++ b/packages/webui/src/client/lib/__tests__/lib.test.ts @@ -1,4 +1,4 @@ -import { useCurrentTime } from '../lib' // Adjust the import path as needed +import { useCurrentTime } from '../lib.js' // Adjust the import path as needed import { act, renderHook } from '@testing-library/react' describe('useCurrentTime Hook', () => { diff --git a/packages/webui/src/client/ui/RundownView.tsx b/packages/webui/src/client/ui/RundownView.tsx index 59822a4031..599febd043 100644 --- a/packages/webui/src/client/ui/RundownView.tsx +++ b/packages/webui/src/client/ui/RundownView.tsx @@ -27,7 +27,7 @@ import { maintainFocusOnPartInstance, scrollToPartInstance, getHeaderHeight, -} from '../lib/viewPort' +} from '../lib/viewPort.js' import { AfterBroadcastForm } from './AfterBroadcastForm.js' import { RundownRightHandControls } from './RundownView/RundownRightHandControls.js' import { PeripheralDevicesAPI } from '../lib/clientAPI.js' @@ -38,7 +38,7 @@ import { } from './RundownView/RundownNotifier.js' import { NotificationCenterPanel } from '../lib/notifications/NotificationCenterPanel.js' import { NotificationCenter, NoticeLevel, Notification } from '../lib/notifications/notifications.js' -import { SupportPopUp } from './SupportPopUp' +import { SupportPopUp } from './SupportPopUp.js' import { KeyboardFocusIndicator } from '../lib/KeyboardFocusIndicator.js' import { PeripheralDeviceType } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' import { doUserAction, UserAction } from '../lib/clientUserAction.js' diff --git a/packages/webui/src/client/ui/RundownView/CasparCGRestartButtons.tsx b/packages/webui/src/client/ui/RundownView/CasparCGRestartButtons.tsx index 008db1720a..4f5d8d0186 100644 --- a/packages/webui/src/client/ui/RundownView/CasparCGRestartButtons.tsx +++ b/packages/webui/src/client/ui/RundownView/CasparCGRestartButtons.tsx @@ -7,12 +7,12 @@ import { DEFAULT_TSR_ACTION_TIMEOUT_TIME } from '@sofie-automation/shared-lib/di import { PeripheralDeviceType } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' import React, { memo, useCallback } from 'react' import { useTranslation } from 'react-i18next' -import { PeripheralDevices } from '../../collections' -import { callPeripheralDeviceAction } from '../../lib/clientAPI' -import { doModalDialog } from '../../lib/ModalDialog' -import { NotificationCenter, NoticeLevel, Notification } from '../../lib/notifications/notifications' -import { useTracker } from '../../lib/ReactMeteorData/ReactMeteorData' -import { i18nTranslator } from '../i18n' +import { PeripheralDevices } from '../../collections/index.js' +import { callPeripheralDeviceAction } from '../../lib/clientAPI.js' +import { doModalDialog } from '../../lib/ModalDialog.js' +import { NotificationCenter, NoticeLevel, Notification } from '../../lib/notifications/notifications.js' +import { useTracker } from '../../lib/ReactMeteorData/ReactMeteorData.js' +import { i18nTranslator } from '../i18n.js' export const CasparCGRestartButtons = memo(function CasparCGRestartButtons({ studioId }: { studioId: StudioId }) { const { t } = useTranslation() diff --git a/packages/webui/src/client/ui/RundownView/RundownDetachedShelf.tsx b/packages/webui/src/client/ui/RundownView/RundownDetachedShelf.tsx index ff4cbd3cfb..bcf1cbdd52 100644 --- a/packages/webui/src/client/ui/RundownView/RundownDetachedShelf.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownDetachedShelf.tsx @@ -4,13 +4,13 @@ import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/Sho import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles' import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios' import { useContext } from 'react' -import { ErrorBoundary } from '../../lib/ErrorBoundary' -import { PreviewPopUpContextProvider } from '../PreviewPopUp/PreviewPopUpContext' -import { Shelf } from '../Shelf/Shelf' -import { UserPermissionsContext } from '../UserPermissions' -import { RundownSorensenContext } from './RundownSorensenContext' -import { RundownTimingProvider } from './RundownTiming/RundownTimingProvider' -import { Settings } from '../../lib/Settings' +import { ErrorBoundary } from '../../lib/ErrorBoundary.js' +import { PreviewPopUpContextProvider } from '../PreviewPopUp/PreviewPopUpContext.js' +import { Shelf } from '../Shelf/Shelf.js' +import { UserPermissionsContext } from '../UserPermissions.js' +import { RundownSorensenContext } from './RundownSorensenContext.js' +import { RundownTimingProvider } from './RundownTiming/RundownTimingProvider.js' +import { Settings } from '../../lib/Settings.js' import { RundownLayoutShelfBase } from '@sofie-automation/meteor-lib/dist/collections/RundownLayouts' interface RundownDetachedShelfProps { diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx index ffbf52f145..71894f848a 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx @@ -2,39 +2,39 @@ import React, { useCallback, useContext, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import * as CoreIcon from '@nrk/core-icons/jsx' import ClassNames from 'classnames' -import Escape from '../../../lib/Escape' +import Escape from '../../../lib/Escape.js' import Tooltip from 'rc-tooltip' import { NavLink } from 'react-router-dom' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { Rundown, getRundownNrcsName } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { ContextMenu, MenuItem, ContextMenuTrigger } from '@jstarpl/react-contextmenu' -import { PieceUi } from '../../SegmentTimeline/SegmentTimelineContainer' -import { RundownSystemStatus } from '../RundownSystemStatus' -import { getHelpMode } from '../../../lib/localStorage' -import { reloadRundownPlaylistClick } from '../RundownNotifier' -import { useRundownViewEventBusListener } from '../../../lib/lib' +import { PieceUi } from '../../SegmentTimeline/SegmentTimelineContainer.js' +import { RundownSystemStatus } from '../RundownSystemStatus.js' +import { getHelpMode } from '../../../lib/localStorage.js' +import { reloadRundownPlaylistClick } from '../RundownNotifier.js' +import { useRundownViewEventBusListener } from '../../../lib/lib.js' import { RundownLayoutRundownHeader } from '@sofie-automation/meteor-lib/dist/collections/RundownLayouts' -import { contextMenuHoldToDisplayTime } from '../../../lib/lib' +import { contextMenuHoldToDisplayTime } from '../../../lib/lib.js' import { ActivateRundownPlaylistEvent, DeactivateRundownPlaylistEvent, IEventContext, RundownViewEvents, } from '@sofie-automation/meteor-lib/dist/triggers/RundownViewEventBus' -import { RundownLayoutsAPI } from '../../../lib/rundownLayouts' +import { RundownLayoutsAPI } from '../../../lib/rundownLayouts.js' import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/ShowStyleVariant' -import { BucketAdLibItem } from '../../Shelf/RundownViewBuckets' -import { IAdLibListItem } from '../../Shelf/AdLibListItem' -import { ShelfDashboardLayout } from '../../Shelf/ShelfDashboardLayout' +import { BucketAdLibItem } from '../../Shelf/RundownViewBuckets.js' +import { IAdLibListItem } from '../../Shelf/AdLibListItem.js' +import { ShelfDashboardLayout } from '../../Shelf/ShelfDashboardLayout.js' import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios' import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles' -import { UserPermissionsContext } from '../../UserPermissions' -import * as RundownResolver from '../../../lib/RundownResolver' +import { UserPermissionsContext } from '../../UserPermissions.js' +import * as RundownResolver from '../../../lib/RundownResolver.js' import Navbar from 'react-bootstrap/Navbar' -import { WarningDisplay } from '../WarningDisplay' -import { TimingDisplay } from './TimingDisplay' -import { checkRundownTimes, useRundownPlaylistOperations } from './useRundownPlaylistOperations' +import { WarningDisplay } from '../WarningDisplay.js' +import { TimingDisplay } from './TimingDisplay.js' +import { checkRundownTimes, useRundownPlaylistOperations } from './useRundownPlaylistOperations.js' interface IRundownHeaderProps { playlist: DBRundownPlaylist diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownReloadResponse.ts b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownReloadResponse.ts index a858db9caf..50bcdc01e5 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownReloadResponse.ts +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownReloadResponse.ts @@ -1,20 +1,20 @@ -import { RundownPlaylists, Rundowns } from '../../../collections' +import { RundownPlaylists, Rundowns } from '../../../collections/index.js' import { ReloadRundownPlaylistResponse, TriggerReloadDataResponse, } from '@sofie-automation/meteor-lib/dist/api/userActions' import _ from 'underscore' -import { RundownPlaylistCollectionUtil } from '../../../collections/rundownPlaylistUtil' +import { RundownPlaylistCollectionUtil } from '../../../collections/rundownPlaylistUtil.js' import * as i18next from 'i18next' -import { UserPermissions } from '../../UserPermissions' -import { NoticeLevel, Notification, NotificationCenter } from '../../../lib/notifications/notifications' +import { UserPermissions } from '../../UserPermissions.js' +import { NoticeLevel, Notification, NotificationCenter } from '../../../lib/notifications/notifications.js' import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { getRundownNrcsName } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { UserAction } from '@sofie-automation/meteor-lib/dist/userAction' import { Tracker } from 'meteor/tracker' -import { doUserAction } from '../../../lib/clientUserAction' -import { MeteorCall } from '../../../lib/meteorApi' -import { doModalDialog } from '../../../lib/ModalDialog' +import { doUserAction } from '../../../lib/clientUserAction.js' +import { MeteorCall } from '../../../lib/meteorApi.js' +import { doModalDialog } from '../../../lib/ModalDialog.js' export function handleRundownPlaylistReloadResponse( t: i18next.TFunction, diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/TimingDisplay.tsx b/packages/webui/src/client/ui/RundownView/RundownHeader/TimingDisplay.tsx index 53c9134642..a99b53f505 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/TimingDisplay.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/TimingDisplay.tsx @@ -3,15 +3,15 @@ import { DBRundownPlaylist, RundownHoldState } from '@sofie-automation/corelib/d import { PlaylistTiming } from '@sofie-automation/corelib/dist/playout/rundownTiming' import { RundownLayoutRundownHeader } from '@sofie-automation/meteor-lib/dist/collections/RundownLayouts' import { useTranslation } from 'react-i18next' -import * as RundownResolver from '../../../lib/RundownResolver' -import { AutoNextStatus } from '../RundownTiming/AutoNextStatus' -import { CurrentPartOrSegmentRemaining } from '../RundownTiming/CurrentPartOrSegmentRemaining' -import { NextBreakTiming } from '../RundownTiming/NextBreakTiming' -import { PlaylistEndTiming } from '../RundownTiming/PlaylistEndTiming' -import { PlaylistStartTiming } from '../RundownTiming/PlaylistStartTiming' -import { RundownName } from '../RundownTiming/RundownName' -import { TimeOfDay } from '../RundownTiming/TimeOfDay' -import { useTiming } from '../RundownTiming/withTiming' +import * as RundownResolver from '../../../lib/RundownResolver.js' +import { AutoNextStatus } from '../RundownTiming/AutoNextStatus.js' +import { CurrentPartOrSegmentRemaining } from '../RundownTiming/CurrentPartOrSegmentRemaining.js' +import { NextBreakTiming } from '../RundownTiming/NextBreakTiming.js' +import { PlaylistEndTiming } from '../RundownTiming/PlaylistEndTiming.js' +import { PlaylistStartTiming } from '../RundownTiming/PlaylistStartTiming.js' +import { RundownName } from '../RundownTiming/RundownName.js' +import { TimeOfDay } from '../RundownTiming/TimeOfDay.js' +import { useTiming } from '../RundownTiming/withTiming.js' interface ITimingDisplayProps { rundownPlaylist: DBRundownPlaylist diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/useRundownPlaylistOperations.tsx b/packages/webui/src/client/ui/RundownView/RundownHeader/useRundownPlaylistOperations.tsx index 8f29d6e7ce..83d4dc525f 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/useRundownPlaylistOperations.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/useRundownPlaylistOperations.tsx @@ -1,28 +1,28 @@ import { SerializedUserError, UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { ClientAPI } from '@sofie-automation/meteor-lib/dist/api/client' import { UserAction } from '@sofie-automation/meteor-lib/dist/userAction' -import { doUserAction } from '../../../lib/clientUserAction' -import { MeteorCall } from '../../../lib/meteorApi' -import { doModalDialog } from '../../../lib/ModalDialog' +import { doUserAction } from '../../../lib/clientUserAction.js' +import { MeteorCall } from '../../../lib/meteorApi.js' +import { doModalDialog } from '../../../lib/ModalDialog.js' import { useTranslation } from 'react-i18next' import React, { useContext, useEffect, useMemo } from 'react' -import { UserPermissions, UserPermissionsContext } from '../../UserPermissions' +import { UserPermissions, UserPermissionsContext } from '../../UserPermissions.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { logger } from '../../../lib/logging' +import { logger } from '../../../lib/logging.js' import * as i18next from 'i18next' -import { NoticeLevel, Notification, NotificationCenter } from '../../../lib/notifications/notifications' +import { NoticeLevel, Notification, NotificationCenter } from '../../../lib/notifications/notifications.js' import { Meteor } from 'meteor/meteor' import { Tracker } from 'meteor/tracker' import RundownViewEventBus, { RundownViewEvents } from '@sofie-automation/meteor-lib/dist/triggers/RundownViewEventBus' -import { handleRundownPlaylistReloadResponse } from './RundownReloadResponse' -import { scrollToPartInstance } from '../../../lib/viewPort' -import { hashSingleUseToken } from '../../../lib/lib' +import { handleRundownPlaylistReloadResponse } from './RundownReloadResponse.js' +import { scrollToPartInstance } from '../../../lib/viewPort.js' +import { hashSingleUseToken } from '../../../lib/lib.js' import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios' -import { getCurrentTime } from '../../../lib/systemTime' +import { getCurrentTime } from '../../../lib/systemTime.js' import { PlaylistTiming } from '@sofie-automation/corelib/dist/playout/rundownTiming' -import { REHEARSAL_MARGIN } from '../WarningDisplay' +import { REHEARSAL_MARGIN } from '../WarningDisplay.js' import { RundownPlaylistTiming } from '@sofie-automation/blueprints-integration' class RundownPlaylistOperationsService { diff --git a/packages/webui/src/client/ui/RundownView/RundownSorensenContext.tsx b/packages/webui/src/client/ui/RundownView/RundownSorensenContext.tsx index 12b81a19a9..012a0899d5 100644 --- a/packages/webui/src/client/ui/RundownView/RundownSorensenContext.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownSorensenContext.tsx @@ -3,14 +3,14 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/Rund import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles' import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios' import { useContext } from 'react' -import { isEventInInputField } from '../../lib/lib' -import { isModalShowing } from '../../lib/ModalDialog' -import { useTracker } from '../../lib/ReactMeteorData/ReactMeteorData' -import { RundownPlaylistClientUtil } from '../../lib/rundownPlaylistUtil' -import { SorensenContext } from '../../lib/SorensenContext' -import { TriggersHandler } from '../../lib/triggers/TriggersHandler' -import { UIParts } from '../Collections' -import { UserPermissionsContext } from '../UserPermissions' +import { isEventInInputField } from '../../lib/lib.js' +import { isModalShowing } from '../../lib/ModalDialog.js' +import { useTracker } from '../../lib/ReactMeteorData/ReactMeteorData.js' +import { RundownPlaylistClientUtil } from '../../lib/rundownPlaylistUtil.js' +import { SorensenContext } from '../../lib/SorensenContext.js' +import { TriggersHandler } from '../../lib/triggers/TriggersHandler.js' +import { UIParts } from '../Collections.js' +import { UserPermissionsContext } from '../UserPermissions.js' interface RundownSorensenContextProps { playlist: DBRundownPlaylist diff --git a/packages/webui/src/client/ui/RundownView/RundownViewContextProviders.tsx b/packages/webui/src/client/ui/RundownView/RundownViewContextProviders.tsx index a5eb33429e..40dce89d00 100644 --- a/packages/webui/src/client/ui/RundownView/RundownViewContextProviders.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownViewContextProviders.tsx @@ -1,11 +1,11 @@ import React from 'react' -import { RundownTimingProvider } from './RundownTiming/RundownTimingProvider' -import StudioContext from './StudioContext' -import { RundownPlaylistOperationsContextProvider } from './RundownHeader/useRundownPlaylistOperations' -import { PreviewPopUpContextProvider } from '../PreviewPopUp/PreviewPopUpContext' -import { SelectedElementProvider } from './SelectedElementsContext' +import { RundownTimingProvider } from './RundownTiming/RundownTimingProvider.js' +import StudioContext from './StudioContext.js' +import { RundownPlaylistOperationsContextProvider } from './RundownHeader/useRundownPlaylistOperations.js' +import { PreviewPopUpContextProvider } from '../PreviewPopUp/PreviewPopUpContext.js' +import { SelectedElementProvider } from './SelectedElementsContext.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { Settings } from '../../lib/Settings' +import { Settings } from '../../lib/Settings.js' import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios' import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' diff --git a/packages/webui/src/client/ui/RundownView/RundownViewSubscriptions.ts b/packages/webui/src/client/ui/RundownView/RundownViewSubscriptions.ts index 6b3ae37bdd..bf858738f9 100644 --- a/packages/webui/src/client/ui/RundownView/RundownViewSubscriptions.ts +++ b/packages/webui/src/client/ui/RundownView/RundownViewSubscriptions.ts @@ -3,17 +3,17 @@ import { useSubscriptionIfEnabledReadyOnce, useSubscriptions, useTracker, -} from '../../lib/ReactMeteorData/react-meteor-data' +} from '../../lib/ReactMeteorData/react-meteor-data.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub' -import { meteorSubscribe } from '../../lib/meteorApi' +import { meteorSubscribe } from '../../lib/meteorApi.js' import { PartInstanceId, RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { RundownPlaylists, Rundowns } from '../../collections' -import { RundownPlaylistCollectionUtil } from '../../collections/rundownPlaylistUtil' +import { RundownPlaylists, Rundowns } from '../../collections/index.js' +import { RundownPlaylistCollectionUtil } from '../../collections/rundownPlaylistUtil.js' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { useRundownAndShowStyleIdsForPlaylist } from '../util/useRundownAndShowStyleIdsForPlaylist' +import { useRundownAndShowStyleIdsForPlaylist } from '../util/useRundownAndShowStyleIdsForPlaylist.js' export function useRundownViewSubscriptions(playlistId: RundownPlaylistId): boolean { const requiredSubsReady: boolean[] = [] diff --git a/packages/webui/src/client/ui/RundownView/WarningDisplay.tsx b/packages/webui/src/client/ui/RundownView/WarningDisplay.tsx index da4a811214..1be1cb6416 100644 --- a/packages/webui/src/client/ui/RundownView/WarningDisplay.tsx +++ b/packages/webui/src/client/ui/RundownView/WarningDisplay.tsx @@ -2,8 +2,8 @@ import type { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel import { PlaylistTiming } from '@sofie-automation/corelib/dist/playout/rundownTiming' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' -import { ModalDialog } from '../../lib/ModalDialog' -import { useCurrentTime } from '../../lib/lib' +import { ModalDialog } from '../../lib/ModalDialog.js' +import { useCurrentTime } from '../../lib/lib.js' export const REHEARSAL_MARGIN = 1 * 60 * 1000 diff --git a/packages/webui/src/client/ui/RundownView/useQueueMiniShelfAdlib.ts b/packages/webui/src/client/ui/RundownView/useQueueMiniShelfAdlib.ts index 015e5ac8c0..e1f15747f3 100644 --- a/packages/webui/src/client/ui/RundownView/useQueueMiniShelfAdlib.ts +++ b/packages/webui/src/client/ui/RundownView/useQueueMiniShelfAdlib.ts @@ -1,11 +1,11 @@ import { useCallback, useEffect, useMemo, useRef } from 'react' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' -import { NotificationCenter, NoticeLevel, Notification } from '../../lib/notifications/notifications' -import { doUserAction, UserAction } from '../../lib/clientUserAction' -import { MeteorCall } from '../../lib/meteorApi' +import { NotificationCenter, NoticeLevel, Notification } from '../../lib/notifications/notifications.js' +import { doUserAction, UserAction } from '../../lib/clientUserAction.js' +import { MeteorCall } from '../../lib/meteorApi.js' import { PartInstance } from '@sofie-automation/meteor-lib/dist/collections/PartInstances' -import { AdLibPieceUi, AdlibSegmentUi } from '../../lib/shelf' +import { AdLibPieceUi, AdlibSegmentUi } from '../../lib/shelf.js' import { ExecuteActionResult } from '@sofie-automation/corelib/dist/worker/studio' import { PartInstanceId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { useTranslation } from 'react-i18next' @@ -17,10 +17,10 @@ import { MiniShelfQueueAdLibEvent, RundownViewEvents, } from '@sofie-automation/meteor-lib/dist/triggers/RundownViewEventBus' -import { useRundownViewEventBusListener } from '../../lib/lib' -import { RundownLayoutsAPI } from '../../lib/rundownLayouts' -import { matchFilter } from '../Shelf/AdLibListView' -import { useFetchAndFilter } from '../Shelf/AdLibPanel' +import { useRundownViewEventBusListener } from '../../lib/lib.js' +import { RundownLayoutsAPI } from '../../lib/rundownLayouts.js' +import { matchFilter } from '../Shelf/AdLibListView.js' +import { useFetchAndFilter } from '../Shelf/AdLibPanel.js' import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles' export type QueueMiniShelfAdlibFunction = (e: any, forward: boolean) => void diff --git a/packages/webui/src/client/ui/Settings/Studio/PackageManager/AccessorTableRow.tsx b/packages/webui/src/client/ui/Settings/Studio/PackageManager/AccessorTableRow.tsx index 27512b0945..9417e8f70d 100644 --- a/packages/webui/src/client/ui/Settings/Studio/PackageManager/AccessorTableRow.tsx +++ b/packages/webui/src/client/ui/Settings/Studio/PackageManager/AccessorTableRow.tsx @@ -17,7 +17,7 @@ import { TextInputControl } from '../../../../lib/Components/TextInput.js' import { DropdownInputControl, getDropdownInputOptions } from '../../../../lib/Components/DropdownInput.js' import { OverrideOpHelper, WrappedOverridableItemNormal } from '../../util/OverrideOpHelper.js' import { CheckboxControl } from '../../../../lib/Components/Checkbox.js' -import { IntInputControl } from '../../../../lib/Components/IntInput' +import { IntInputControl } from '../../../../lib/Components/IntInput.js' import Button from 'react-bootstrap/Button' interface AccessorTableRowProps { diff --git a/packages/webui/src/client/ui/Shelf/Shelf.tsx b/packages/webui/src/client/ui/Shelf/Shelf.tsx index 3948ab2fbb..415c9fb29e 100644 --- a/packages/webui/src/client/ui/Shelf/Shelf.tsx +++ b/packages/webui/src/client/ui/Shelf/Shelf.tsx @@ -41,11 +41,11 @@ import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/Sho import { ShelfDisplayOptions } from '../../lib/shelf.js' import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles' import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios' -import { Buckets } from '../../collections' -import { UserPermissionsContext } from '../UserPermissions' +import { Buckets } from '../../collections/index.js' +import { UserPermissionsContext } from '../UserPermissions.js' import { useLocation } from 'react-router' import { IStudioSettings } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { Settings } from '../../lib/Settings' +import { Settings } from '../../lib/Settings.js' import { ParsedQuery, parse as queryStringParse } from 'query-string' import { ShelfTabs } from '@sofie-automation/meteor-lib/dist/uiTypes/ShelfTabs' From ec010559a121fbef7081d88fb6b2fe7da150c19b Mon Sep 17 00:00:00 2001 From: "Robert (Jamie) Munro" Date: Thu, 16 Oct 2025 16:07:30 +0100 Subject: [PATCH 4/4] Fix execute permission of pre-commit hook Needed on Linux macOS and other unix-like systems. --- .husky/pre-commit | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100644 new mode 100755