From 40f47e0af464b39212887cbfac9199b9c20d4a3e Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 4 Apr 2024 07:30:11 +0000 Subject: [PATCH 01/18] Add themeability --- ...ould-be-applied-inside-web-chat-1-snap.png | Bin 0 -> 28649 bytes __tests__/html/theme/simple.html | 67 +++++++ __tests__/html/theme/simple.js | 5 + packages/api/src/hooks/Composer.tsx | 181 +++++------------- packages/api/src/index.ts | 12 +- .../patchStyleOptionsFromDeprecatedProps.js | 21 +- packages/component/src/Composer.tsx | 64 +++++-- packages/component/src/index.ts | 20 +- .../src/providers/Theme/ThemeProvider.tsx | 117 +++++++++++ .../src/providers/Theme/private/Context.ts | 45 +++++ .../src/providers/Theme/useTheme.tsx | 7 + 11 files changed, 359 insertions(+), 180 deletions(-) create mode 100644 __tests__/__image_snapshots__/html/simple-js-theme-applied-outside-of-web-chat-should-be-applied-inside-web-chat-1-snap.png create mode 100644 __tests__/html/theme/simple.html create mode 100644 __tests__/html/theme/simple.js create mode 100644 packages/component/src/providers/Theme/ThemeProvider.tsx create mode 100644 packages/component/src/providers/Theme/private/Context.ts create mode 100644 packages/component/src/providers/Theme/useTheme.tsx diff --git a/__tests__/__image_snapshots__/html/simple-js-theme-applied-outside-of-web-chat-should-be-applied-inside-web-chat-1-snap.png b/__tests__/__image_snapshots__/html/simple-js-theme-applied-outside-of-web-chat-should-be-applied-inside-web-chat-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6539657a79a2307d7e4541a6c4a64622025630 GIT binary patch literal 28649 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 LRpd%#jQsu|@2u=> literal 0 HcmV?d00001 diff --git a/__tests__/html/theme/simple.html b/__tests__/html/theme/simple.html new file mode 100644 index 0000000000..9c6160d9d9 --- /dev/null +++ b/__tests__/html/theme/simple.html @@ -0,0 +1,67 @@ + + + + + + + + + + + +
+ + + diff --git a/__tests__/html/theme/simple.js b/__tests__/html/theme/simple.js new file mode 100644 index 0000000000..2373d46723 --- /dev/null +++ b/__tests__/html/theme/simple.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('theme applied outside of Web Chat', () => { + test('should be applied inside Web Chat', () => runHTML('theme/simple')); +}); diff --git a/packages/api/src/hooks/Composer.tsx b/packages/api/src/hooks/Composer.tsx index 9bb3efee18..375ee980ae 100644 --- a/packages/api/src/hooks/Composer.tsx +++ b/packages/api/src/hooks/Composer.tsx @@ -110,7 +110,7 @@ const DISPATCHERS = { function createCardActionContext({ cardActionMiddleware, directLine, dispatch, markAllAsAcknowledged, ponyfill }) { const runMiddleware = applyMiddleware( 'card action', - ...singleToArray(cardActionMiddleware), + ...cardActionMiddleware, createDefaultCardActionMiddleware() )({ dispatch }); @@ -150,7 +150,7 @@ function createCardActionContext({ cardActionMiddleware, directLine, dispatch, m function createGroupActivitiesContext({ groupActivitiesMiddleware, groupTimestamp, ponyfill }) { const runMiddleware = applyMiddleware( 'group activities', - ...singleToArray(groupActivitiesMiddleware), + ...groupActivitiesMiddleware, createDefaultGroupActivitiesMiddleware({ groupTimestamp, ponyfill }) ); @@ -221,35 +221,14 @@ type ComposerCoreProps = Readonly<{ typingIndicatorMiddleware?: OneOrMany; userID?: string; username?: string; - - /** @deprecated Please use "activityMiddleware" instead. */ - activityRenderer?: any; // TODO: [P4] Remove on or after 2022-06-15. - /** @deprecated Please use "activityStatusMiddleware" instead. */ - activityStatusRenderer?: any; // TODO: [P4] Remove on or after 2022-06-15. - /** @deprecated Please use "attachmentMiddleware" instead. */ - attachmentRenderer?: any; // TODO: [P4] Remove on or after 2022-06-15. - /** @deprecated Please use "avatarMiddleware" instead. */ - avatarRenderer?: any; // TODO: [P4] Remove on or after 2022-06-15. - /** @deprecated Please use "styleOptions.groupTimestamp" instead. */ - groupTimestamp?: boolean | number; // TODO: [P4] Remove on or after 2022-01-01 - /** @deprecated Please use "styleOptions.sendTimeout" instead. */ - sendTimeout?: number; // TODO: [P4] Remove on or after 2022-01-01. - /** @deprecated Please use "toastMiddleware" instead. */ - toastRenderer?: any; // TODO: [P4] Remove on or after 2022-06-15. - /** @deprecated Please use "typingIndicatorRenderer" instead. */ - typingIndicatorRenderer?: any; // TODO: [P4] Remove on or after 2022-06-15. }>; const ComposerCore = ({ activityMiddleware, - activityRenderer, activityStatusMiddleware, - activityStatusRenderer, attachmentForScreenReaderMiddleware, attachmentMiddleware, - attachmentRenderer, avatarMiddleware, - avatarRenderer, cardActionMiddleware, children, dir, @@ -258,7 +237,6 @@ const ComposerCore = ({ downscaleImageToDataURL, grammars, groupActivitiesMiddleware, - groupTimestamp, internalErrorBoxClass, locale, onTelemetry, @@ -266,13 +244,10 @@ const ComposerCore = ({ renderMarkdown, scrollToEndButtonMiddleware, selectVoice, - sendTimeout, sendTypingIndicator, styleOptions, toastMiddleware, - toastRenderer, typingIndicatorMiddleware, - typingIndicatorRenderer, userID, username }: ComposerCoreProps) => { @@ -283,18 +258,14 @@ const ComposerCore = ({ const patchedDir = useMemo(() => (dir === 'ltr' || dir === 'rtl' ? dir : 'auto'), [dir]); const patchedGrammars = useMemo(() => grammars || [], [grammars]); const patchedStyleOptions = useMemo( - () => normalizeStyleOptions(patchStyleOptionsFromDeprecatedProps(styleOptions, { groupTimestamp, sendTimeout })), - [groupTimestamp, sendTimeout, styleOptions] + () => normalizeStyleOptions(patchStyleOptionsFromDeprecatedProps(styleOptions)), + [styleOptions] ); useEffect(() => { dispatch(setLanguage(locale)); }, [dispatch, locale]); - useEffect(() => { - typeof sendTimeout === 'number' && dispatch(setSendTimeout(sendTimeout)); - }, [dispatch, sendTimeout]); - useEffect(() => { dispatch(setSendTypingIndicator(!!sendTypingIndicator)); }, [dispatch, sendTypingIndicator]); @@ -319,7 +290,14 @@ const ComposerCore = ({ const markAllAsAcknowledged = useMarkAllAsAcknowledged(); const cardActionContext = useMemo( - () => createCardActionContext({ cardActionMiddleware, directLine, dispatch, markAllAsAcknowledged, ponyfill }), + () => + createCardActionContext({ + cardActionMiddleware: Object.freeze([...singleToArray(cardActionMiddleware)]), + directLine, + dispatch, + markAllAsAcknowledged, + ponyfill + }), [cardActionMiddleware, directLine, dispatch, markAllAsAcknowledged, ponyfill] ); @@ -331,7 +309,7 @@ const ComposerCore = ({ const groupActivitiesContext = useMemo( () => createGroupActivitiesContext({ - groupActivitiesMiddleware, + groupActivitiesMiddleware: Object.freeze([...singleToArray(groupActivitiesMiddleware)]), groupTimestamp: patchedStyleOptions.groupTimestamp, ponyfill }), @@ -381,14 +359,8 @@ const ComposerCore = ({ [telemetryDimensionsRef] ); - const patchedActivityRenderer = useMemo(() => { - activityRenderer && - console.warn( - 'Web Chat: "activityRenderer" is deprecated and will be removed on 2022-06-15, please use "activityMiddleware" instead.' - ); - - return ( - activityRenderer || + const patchedActivityRenderer = useMemo( + () => applyMiddlewareForRenderer( 'activity', { strict: false }, @@ -402,26 +374,20 @@ const ComposerCore = ({ throw new Error('No activity to render'); } } - )({}) - ); - }, [activityMiddleware, activityRenderer]); - - const patchedActivityStatusRenderer = useMemo(() => { - activityStatusRenderer && - console.warn( - 'Web Chat: "activityStatusRenderer" is deprecated and will be removed on 2022-06-15, please use "activityStatusMiddleware" instead.' - ); + )({}), + [activityMiddleware] + ); - return ( - activityStatusRenderer || + const patchedActivityStatusRenderer = useMemo( + () => applyMiddlewareForRenderer( 'activity status', { strict: false }, ...singleToArray(activityStatusMiddleware), () => () => () => false - )({}) - ); - }, [activityStatusMiddleware, activityStatusRenderer]); + )({}), + [activityStatusMiddleware] + ); const patchedAttachmentForScreenReaderRenderer = useMemo( () => @@ -448,56 +414,37 @@ const ComposerCore = ({ [attachmentForScreenReaderMiddleware] ); - const patchedAttachmentRenderer = useMemo(() => { - if (attachmentRenderer) { - console.warn( - 'Web Chat: "attachmentRenderer" is deprecated and will be removed on 2022-06-15, please use "attachmentMiddleware" instead.' - ); - - return attachmentRenderer; - } - - // Attachment renderer - return applyMiddlewareForLegacyRenderer( - 'attachment', - ...singleToArray(attachmentMiddleware), - () => + const patchedAttachmentRenderer = useMemo( + () => + applyMiddlewareForLegacyRenderer( + 'attachment', + ...singleToArray(attachmentMiddleware), () => - ({ attachment }) => { - if (attachment) { - throw new Error(`No renderer for attachment of type "${attachment.contentType}"`); - } else { - throw new Error('No attachment to render'); + () => + ({ attachment }) => { + if (attachment) { + throw new Error(`No renderer for attachment of type "${attachment.contentType}"`); + } else { + throw new Error('No attachment to render'); + } } - } - )({}); - }, [attachmentMiddleware, attachmentRenderer]); - - const patchedAvatarRenderer = useMemo(() => { - avatarRenderer && - console.warn( - 'Web Chat: "avatarRenderer" is deprecated and will be removed on 2022-06-15, please use "avatarMiddleware" instead.' - ); + )({}), + [attachmentMiddleware] + ); - return ( - avatarRenderer || + const patchedAvatarRenderer = useMemo( + () => applyMiddlewareForRenderer( 'avatar', { strict: false }, ...singleToArray(avatarMiddleware), () => () => () => false - )({}) - ); - }, [avatarMiddleware, avatarRenderer]); - - const patchedToastRenderer = useMemo(() => { - toastRenderer && - console.warn( - 'Web Chat: "toastRenderer" is deprecated and will be removed on 2022-06-15, please use "toastMiddleware" instead.' - ); + )({}), + [avatarMiddleware] + ); - return ( - toastRenderer || + const patchedToastRenderer = useMemo( + () => applyMiddlewareForRenderer( 'toast', { strict: false }, @@ -511,26 +458,20 @@ const ComposerCore = ({ throw new Error('No notification to render'); } } - )({}) - ); - }, [toastMiddleware, toastRenderer]); - - const patchedTypingIndicatorRenderer = useMemo(() => { - typingIndicatorRenderer && - console.warn( - 'Web Chat: "typingIndicatorRenderer" is deprecated and will be removed on 2022-06-15, please use "typingIndicatorMiddleware" instead.' - ); + )({}), + [toastMiddleware] + ); - return ( - typingIndicatorRenderer || + const patchedTypingIndicatorRenderer = useMemo( + () => applyMiddlewareForRenderer( 'typing indicator', { strict: false }, ...singleToArray(typingIndicatorMiddleware), () => () => () => false - )({}) - ); - }, [typingIndicatorMiddleware, typingIndicatorRenderer]); + )({}), + [typingIndicatorMiddleware] + ); const scrollToEndButtonRenderer: ScrollToEndButtonComponentFactory = useMemo( () => @@ -638,14 +579,10 @@ const ComposerCore = ({ */ ComposerCore.defaultProps = { activityMiddleware: undefined, - activityRenderer: undefined, activityStatusMiddleware: undefined, - activityStatusRenderer: undefined, attachmentForScreenReaderMiddleware: undefined, attachmentMiddleware: undefined, - attachmentRenderer: undefined, avatarMiddleware: undefined, - avatarRenderer: undefined, cardActionMiddleware: undefined, children: undefined, dir: 'auto', @@ -653,7 +590,6 @@ ComposerCore.defaultProps = { downscaleImageToDataURL: undefined, grammars: [], groupActivitiesMiddleware: undefined, - groupTimestamp: undefined, internalErrorBoxClass: undefined, locale: window.navigator.language || 'en-US', onTelemetry: undefined, @@ -661,27 +597,20 @@ ComposerCore.defaultProps = { renderMarkdown: undefined, scrollToEndButtonMiddleware: undefined, selectVoice: undefined, - sendTimeout: undefined, sendTypingIndicator: false, styleOptions: {}, toastMiddleware: undefined, - toastRenderer: undefined, typingIndicatorMiddleware: undefined, - typingIndicatorRenderer: undefined, userID: '', username: '' }; ComposerCore.propTypes = { activityMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), - activityRenderer: PropTypes.func, activityStatusMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), - activityStatusRenderer: PropTypes.func, attachmentForScreenReaderMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), attachmentMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), - attachmentRenderer: PropTypes.func, avatarMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), - avatarRenderer: PropTypes.func, cardActionMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), children: PropTypes.any, dir: PropTypes.oneOf(['auto', 'ltr', 'rtl']), @@ -704,7 +633,6 @@ ComposerCore.propTypes = { downscaleImageToDataURL: PropTypes.func, grammars: PropTypes.arrayOf(PropTypes.string), groupActivitiesMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), - groupTimestamp: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]), internalErrorBoxClass: PropTypes.func, // This is for internal use only. We don't allow customization of error box. locale: PropTypes.string, onTelemetry: PropTypes.func, @@ -712,13 +640,10 @@ ComposerCore.propTypes = { renderMarkdown: PropTypes.func, scrollToEndButtonMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), selectVoice: PropTypes.func, - sendTimeout: PropTypes.number, sendTypingIndicator: PropTypes.bool, styleOptions: PropTypes.any, toastMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), - toastRenderer: PropTypes.func, typingIndicatorMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), - typingIndicatorRenderer: PropTypes.func, userID: PropTypes.string, username: PropTypes.string }; diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index d1c5aebdf1..63049542f2 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,5 +1,10 @@ -import { localize } from './localization/Localize'; +import StyleOptions, { StrictStyleOptions } from './StyleOptions'; +import defaultStyleOptions from './defaultStyleOptions'; import * as hooks from './hooks'; +import Composer, { ComposerProps } from './hooks/Composer'; +import concatMiddleware from './hooks/middleware/concatMiddleware'; +import { localize } from './localization/Localize'; +import normalizeStyleOptions from './normalizeStyleOptions'; import ActivityMiddleware, { ActivityComponentFactory } from './types/ActivityMiddleware'; import AttachmentForScreenReaderMiddleware, { AttachmentForScreenReaderComponentFactory @@ -7,13 +12,8 @@ import AttachmentForScreenReaderMiddleware, { import AttachmentMiddleware, { RenderAttachment } from './types/AttachmentMiddleware'; import AvatarMiddleware, { AvatarComponentFactory } from './types/AvatarMiddleware'; import CardActionMiddleware, { PerformCardAction } from './types/CardActionMiddleware'; -import Composer, { ComposerProps } from './hooks/Composer'; -import concatMiddleware from './hooks/middleware/concatMiddleware'; -import defaultStyleOptions from './defaultStyleOptions'; import GroupActivitiesMiddleware, { GroupActivities } from './types/GroupActivitiesMiddleware'; -import normalizeStyleOptions from './normalizeStyleOptions'; import ScrollToEndButtonMiddleware, { ScrollToEndButtonComponentFactory } from './types/ScrollToEndButtonMiddleware'; -import StyleOptions, { StrictStyleOptions } from './StyleOptions'; import ToastMiddleware, { RenderToast } from './types/ToastMiddleware'; import TypingIndicatorMiddleware, { RenderTypingIndicator } from './types/TypingIndicatorMiddleware'; import WebSpeechPonyfill from './types/WebSpeechPonyfill'; diff --git a/packages/api/src/patchStyleOptionsFromDeprecatedProps.js b/packages/api/src/patchStyleOptionsFromDeprecatedProps.js index 3bb49013ef..bd426a4183 100644 --- a/packages/api/src/patchStyleOptionsFromDeprecatedProps.js +++ b/packages/api/src/patchStyleOptionsFromDeprecatedProps.js @@ -3,26 +3,7 @@ import updateIn from 'simple-update-in'; // TODO: [P4] We should add a notice for people who want to use "styleSet" instead of "styleOptions". // "styleSet" is actually CSS stylesheet and it is based on the DOM tree. // DOM tree may change from time to time, thus, maintaining "styleSet" becomes a constant effort. -export default function patchStyleOptionsFromDeprecatedProps( - styleOptions, - { groupTimestamp: groupTimestampFromProps, sendTimeout: sendTimeoutFromProps } -) { - if (typeof groupTimestampFromProps !== 'undefined' && typeof styleOptions.groupTimestamp === 'undefined') { - console.warn( - 'Web Chat: "groupTimestamp" has been moved to "styleOptions". This deprecation migration will be removed on or after January 1 2022.' - ); - - styleOptions = updateIn(styleOptions, ['groupTimestamp'], () => groupTimestampFromProps); - } - - if (typeof sendTimeoutFromProps !== 'undefined' && typeof styleOptions.sendTimeout === 'undefined') { - console.warn( - 'Web Chat: "sendTimeout" has been moved to "styleOptions". This deprecation migration will be removed on or after January 1 2022.' - ); - - styleOptions = updateIn(styleOptions, ['sendTimeout'], () => sendTimeoutFromProps); - } - +export default function patchStyleOptionsFromDeprecatedProps(styleOptions) { if (styleOptions.slowConnectionAfter < 0) { console.warn('Web Chat: "slowConnectionAfter" cannot be negative, will set to 0.'); diff --git a/packages/component/src/Composer.tsx b/packages/component/src/Composer.tsx index 3316e2d60e..3f270fe8e4 100644 --- a/packages/component/src/Composer.tsx +++ b/packages/component/src/Composer.tsx @@ -29,6 +29,7 @@ import createDefaultTypingIndicatorMiddleware from './Middleware/TypingIndicator import ActivityTreeComposer from './providers/ActivityTree/ActivityTreeComposer'; import SendBoxComposer from './providers/internal/SendBox/SendBoxComposer'; import ModalDialogComposer from './providers/ModalDialog/ModalDialogComposer'; +import useTheme from './providers/Theme/useTheme'; import addTargetBlankToHyperlinksMarkdown from './Utils/addTargetBlankToHyperlinksMarkdown'; import createCSSKey from './Utils/createCSSKey'; import downscaleImageToDataURL from './Utils/downscaleImageToDataURL'; @@ -293,6 +294,7 @@ const Composer: FC = ({ extraStyleSet, renderMarkdown, scrollToEndButtonMiddleware, + styleOptions, styleSet, suggestedActionsAccessKey, toastMiddleware, @@ -301,55 +303,82 @@ const Composer: FC = ({ ...composerProps }) => { const { nonce, onTelemetry } = composerProps; + const theme = useTheme(); const patchedActivityMiddleware = useMemo( - () => [...singleToArray(activityMiddleware), ...createDefaultActivityMiddleware()], - [activityMiddleware] + () => [...singleToArray(activityMiddleware), ...theme.activityMiddleware, ...createDefaultActivityMiddleware()], + [activityMiddleware, theme.activityMiddleware] ); const patchedActivityStatusMiddleware = useMemo( - () => [...singleToArray(activityStatusMiddleware), ...createDefaultActivityStatusMiddleware()], - [activityStatusMiddleware] + () => [ + ...singleToArray(activityStatusMiddleware), + ...theme.activityStatusMiddleware, + ...createDefaultActivityStatusMiddleware() + ], + [activityStatusMiddleware, theme.activityStatusMiddleware] ); const patchedAttachmentForScreenReaderMiddleware = useMemo( () => [ ...singleToArray(attachmentForScreenReaderMiddleware), + ...theme.attachmentForScreenReaderMiddleware, ...createDefaultAttachmentForScreenReaderMiddleware() ], - [attachmentForScreenReaderMiddleware] + [attachmentForScreenReaderMiddleware, theme.attachmentForScreenReaderMiddleware] ); const patchedAttachmentMiddleware = useMemo( - () => [...singleToArray(attachmentMiddleware), ...createDefaultAttachmentMiddleware()], - [attachmentMiddleware] + () => [ + ...singleToArray(attachmentMiddleware), + ...theme.attachmentMiddleware, + ...createDefaultAttachmentMiddleware() + ], + [attachmentMiddleware, theme.attachmentMiddleware] ); const patchedAvatarMiddleware = useMemo( - () => [...singleToArray(avatarMiddleware), ...createDefaultAvatarMiddleware()], - [avatarMiddleware] + () => [...singleToArray(avatarMiddleware), ...theme.avatarMiddleware, ...createDefaultAvatarMiddleware()], + [avatarMiddleware, theme.avatarMiddleware] ); const patchedCardActionMiddleware = useMemo( - () => [...singleToArray(cardActionMiddleware), ...createDefaultCardActionMiddleware()], - [cardActionMiddleware] + () => [ + ...singleToArray(cardActionMiddleware), + ...theme.cardActionMiddleware, + ...createDefaultCardActionMiddleware() + ], + [cardActionMiddleware, theme.cardActionMiddleware] ); const patchedToastMiddleware = useMemo( - () => [...singleToArray(toastMiddleware), ...createDefaultToastMiddleware()], - [toastMiddleware] + () => [...singleToArray(toastMiddleware), ...theme.toastMiddleware, ...createDefaultToastMiddleware()], + [toastMiddleware, theme.toastMiddleware] ); const patchedTypingIndicatorMiddleware = useMemo( - () => [...singleToArray(typingIndicatorMiddleware), ...createDefaultTypingIndicatorMiddleware()], - [typingIndicatorMiddleware] + () => [ + ...singleToArray(typingIndicatorMiddleware), + ...theme.typingIndicatorMiddleware, + ...createDefaultTypingIndicatorMiddleware() + ], + [typingIndicatorMiddleware, theme.typingIndicatorMiddleware] ); const defaultScrollToEndButtonMiddleware = useMemo(() => createDefaultScrollToEndButtonMiddleware(), []); const patchedScrollToEndButtonMiddleware = useMemo( - () => [...singleToArray(scrollToEndButtonMiddleware), ...defaultScrollToEndButtonMiddleware], - [defaultScrollToEndButtonMiddleware, scrollToEndButtonMiddleware] + () => [ + ...singleToArray(scrollToEndButtonMiddleware), + ...theme.scrollToEndButtonMiddleware, + ...defaultScrollToEndButtonMiddleware + ], + [defaultScrollToEndButtonMiddleware, scrollToEndButtonMiddleware, theme.scrollToEndButtonMiddleware] + ); + + const patchedStyleOptions = useMemo( + () => ({ ...theme.styleOptions, ...styleOptions }), + [styleOptions, theme.styleOptions] ); return ( @@ -365,6 +394,7 @@ const Composer: FC = ({ internalErrorBoxClass={node_env === 'development' ? ErrorBox : undefined} nonce={nonce} scrollToEndButtonMiddleware={patchedScrollToEndButtonMiddleware} + styleOptions={patchedStyleOptions} toastMiddleware={patchedToastMiddleware} typingIndicatorMiddleware={patchedTypingIndicatorMiddleware} {...composerProps} diff --git a/packages/component/src/index.ts b/packages/component/src/index.ts index b015d94dad..6f107bbfcf 100644 --- a/packages/component/src/index.ts +++ b/packages/component/src/index.ts @@ -1,4 +1,4 @@ -import { concatMiddleware, hooks as apiHooks, localize } from 'botframework-webchat-api'; +import { hooks as apiHooks, concatMiddleware, localize } from 'botframework-webchat-api'; import ReactWebChat, { ReactWebChatProps } from './ReactWebChat'; @@ -6,18 +6,18 @@ import Composer, { ComposerProps } from './Composer'; import AccessKeySinkSurface from './Utils/AccessKeySink/Surface'; -import BasicWebChat, { BasicWebChatProps } from './BasicWebChat'; import BasicConnectivityStatus from './BasicConnectivityStatus'; import BasicSendBox from './BasicSendBox'; import BasicToaster from './BasicToaster'; import BasicTranscript from './BasicTranscript'; +import BasicWebChat, { BasicWebChatProps } from './BasicWebChat'; import Avatar from './Activity/Avatar'; import Bubble from './Activity/Bubble'; -import ErrorBox from './ErrorBox'; -import SendStatus, { connectSendStatus } from './ActivityStatus/SendStatus/SendStatus'; import SpeakActivity, { connectSpeakActivity } from './Activity/Speak'; +import SendStatus, { connectSendStatus } from './ActivityStatus/SendStatus/SendStatus'; import Timestamp from './ActivityStatus/Timestamp'; +import ErrorBox from './ErrorBox'; import AudioContent from './Attachment/AudioContent'; import FileContent from './Attachment/FileContent'; @@ -31,17 +31,18 @@ import YouTubeContent from './Attachment/YouTubeContent'; import DictationInterims, { connectDictationInterims } from './SendBox/DictationInterims'; import MicrophoneButton, { connectMicrophoneButton } from './SendBox/MicrophoneButton'; import SendButton, { connectSendButton } from './SendBox/SendButton'; -import SendTextBox from './SendBox/TextBox'; import SuggestedActions, { connectSuggestedActions } from './SendBox/SuggestedActions'; +import SendTextBox from './SendBox/TextBox'; import UploadButton, { connectUploadButton } from './SendBox/UploadButton'; -import connectToWebChat from './connectToWebChat'; -import Context from './hooks/internal/WebChatUIContext'; +import createCoreAttachmentMiddleware from './Attachment/createMiddleware'; import createCoreActivityMiddleware from './Middleware/Activity/createCoreMiddleware'; import createCoreActivityStatusMiddleware from './Middleware/ActivityStatus/createCoreMiddleware'; -import createCoreAttachmentMiddleware from './Attachment/createMiddleware'; import createStyleSet from './Styles/createStyleSet'; import getTabIndex from './Utils/TypeFocusSink/getTabIndex'; +import connectToWebChat from './connectToWebChat'; +import Context from './hooks/internal/WebChatUIContext'; +import ThemeProvider from './providers/Theme/ThemeProvider'; import withEmoji from './withEmoji/withEmoji'; import * as componentHooks from './hooks/index'; @@ -56,6 +57,7 @@ const version = process.env.npm_package_version; const Components = { BasicWebChat, Composer, + ThemeProvider, // Components for restructuring BasicWebChat AccessKeySinkSurface, @@ -104,9 +106,9 @@ export default ReactWebChat; export { Components, + Context, concatMiddleware, connectToWebChat, - Context, createCoreActivityMiddleware, createCoreActivityStatusMiddleware, createCoreAttachmentMiddleware, diff --git a/packages/component/src/providers/Theme/ThemeProvider.tsx b/packages/component/src/providers/Theme/ThemeProvider.tsx new file mode 100644 index 0000000000..e992c469ea --- /dev/null +++ b/packages/component/src/providers/Theme/ThemeProvider.tsx @@ -0,0 +1,117 @@ +import React, { memo, useContext, useMemo, type ReactNode } from 'react'; + +import Context, { type ContextType } from './private/Context'; + +type Props = Readonly<{ children?: ReactNode | undefined } & Partial>; + +const EMPTY_ARRAY = Object.freeze([] as const); + +const ThemeProvider = ({ + children, + activityMiddleware, + activityStatusMiddleware, + attachmentForScreenReaderMiddleware, + attachmentMiddleware, + avatarMiddleware, + cardActionMiddleware, + groupActivitiesMiddleware, + scrollToEndButtonMiddleware, + styleOptions, + toastMiddleware, + typingIndicatorMiddleware +}: Props) => { + const existingContext = useContext(Context); + + const mergedActivityMiddleware = useMemo( + () => Object.freeze([...(activityMiddleware || []), ...existingContext.activityMiddleware]), + [activityMiddleware, existingContext.activityMiddleware] + ); + + const mergedActivityStatusMiddleware = useMemo( + () => Object.freeze([...(activityStatusMiddleware || EMPTY_ARRAY), ...existingContext.activityStatusMiddleware]), + [activityStatusMiddleware, existingContext.activityStatusMiddleware] + ); + + const mergedAttachmentForScreenReaderMiddleware = useMemo( + () => + Object.freeze([ + ...(attachmentForScreenReaderMiddleware || EMPTY_ARRAY), + ...existingContext.attachmentForScreenReaderMiddleware + ]), + [attachmentForScreenReaderMiddleware, existingContext.attachmentForScreenReaderMiddleware] + ); + + const mergedAttachmentMiddleware = useMemo( + () => Object.freeze([...(attachmentMiddleware || EMPTY_ARRAY), ...existingContext.attachmentMiddleware]), + [attachmentMiddleware, existingContext.attachmentMiddleware] + ); + + const mergedAvatarMiddleware = useMemo( + () => Object.freeze([...(avatarMiddleware || EMPTY_ARRAY), ...existingContext.avatarMiddleware]), + [avatarMiddleware, existingContext.avatarMiddleware] + ); + + const mergedCardActionMiddleware = useMemo( + () => Object.freeze([...(cardActionMiddleware || EMPTY_ARRAY), ...existingContext.cardActionMiddleware]), + [cardActionMiddleware, existingContext.cardActionMiddleware] + ); + + const mergedGroupActivitiesMiddleware = useMemo( + () => Object.freeze([...(groupActivitiesMiddleware || EMPTY_ARRAY), ...existingContext.groupActivitiesMiddleware]), + [groupActivitiesMiddleware, existingContext.groupActivitiesMiddleware] + ); + + const mergedScrollToEndButtonMiddleware = useMemo( + () => + Object.freeze([...(scrollToEndButtonMiddleware || EMPTY_ARRAY), ...existingContext.scrollToEndButtonMiddleware]), + [scrollToEndButtonMiddleware, existingContext.scrollToEndButtonMiddleware] + ); + + const mergedStyleOptions = useMemo( + () => Object.freeze({ ...styleOptions, ...existingContext.styleOptions }), + [styleOptions, existingContext.styleOptions] + ); + + const mergedToastMiddleware = useMemo( + () => Object.freeze([...(toastMiddleware || EMPTY_ARRAY), ...existingContext.toastMiddleware]), + [toastMiddleware, existingContext.toastMiddleware] + ); + + const mergedTypingIndicatorMiddleware = useMemo( + () => Object.freeze([...(typingIndicatorMiddleware || EMPTY_ARRAY), ...existingContext.typingIndicatorMiddleware]), + [typingIndicatorMiddleware, existingContext.typingIndicatorMiddleware] + ); + + const context = useMemo( + () => ({ + activityMiddleware: mergedActivityMiddleware, + activityStatusMiddleware: mergedActivityStatusMiddleware, + attachmentForScreenReaderMiddleware: mergedAttachmentForScreenReaderMiddleware, + attachmentMiddleware: mergedAttachmentMiddleware, + avatarMiddleware: mergedAvatarMiddleware, + cardActionMiddleware: mergedCardActionMiddleware, + groupActivitiesMiddleware: mergedGroupActivitiesMiddleware, + scrollToEndButtonMiddleware: mergedScrollToEndButtonMiddleware, + styleOptions: mergedStyleOptions, + toastMiddleware: mergedToastMiddleware, + typingIndicatorMiddleware: mergedTypingIndicatorMiddleware + }), + [ + mergedActivityMiddleware, + mergedActivityStatusMiddleware, + mergedAttachmentForScreenReaderMiddleware, + mergedAttachmentMiddleware, + mergedAvatarMiddleware, + mergedCardActionMiddleware, + mergedGroupActivitiesMiddleware, + mergedScrollToEndButtonMiddleware, + mergedStyleOptions, + mergedToastMiddleware, + mergedTypingIndicatorMiddleware + ] + ); + + return {children}; +}; + +export default memo(ThemeProvider); diff --git a/packages/component/src/providers/Theme/private/Context.ts b/packages/component/src/providers/Theme/private/Context.ts new file mode 100644 index 0000000000..53cf57538f --- /dev/null +++ b/packages/component/src/providers/Theme/private/Context.ts @@ -0,0 +1,45 @@ +import type { + ActivityMiddleware, + ActivityStatusMiddleware, + AttachmentForScreenReaderMiddleware, + AttachmentMiddleware, + AvatarMiddleware, + CardActionMiddleware, + GroupActivitiesMiddleware, + ScrollToEndButtonMiddleware, + StyleOptions, + ToastMiddleware, + TypingIndicatorMiddleware +} from 'botframework-webchat-api'; +import { createContext } from 'react'; + +const EMPTY_ARRAY = Object.freeze([] as const); +const EMPTY_OBJECT = Object.freeze({} as const); + +export type ContextType = { + activityMiddleware: readonly ActivityMiddleware[]; + activityStatusMiddleware: readonly ActivityStatusMiddleware[]; + attachmentForScreenReaderMiddleware: readonly AttachmentForScreenReaderMiddleware[]; + attachmentMiddleware: readonly AttachmentMiddleware[]; + avatarMiddleware: readonly AvatarMiddleware[]; + cardActionMiddleware: readonly CardActionMiddleware[]; + groupActivitiesMiddleware: readonly GroupActivitiesMiddleware[]; + scrollToEndButtonMiddleware: readonly ScrollToEndButtonMiddleware[]; + styleOptions: StyleOptions; + toastMiddleware: readonly ToastMiddleware[]; + typingIndicatorMiddleware: readonly TypingIndicatorMiddleware[]; +}; + +export default createContext({ + activityMiddleware: EMPTY_ARRAY, + activityStatusMiddleware: EMPTY_ARRAY, + attachmentForScreenReaderMiddleware: EMPTY_ARRAY, + attachmentMiddleware: EMPTY_ARRAY, + avatarMiddleware: EMPTY_ARRAY, + cardActionMiddleware: EMPTY_ARRAY, + groupActivitiesMiddleware: EMPTY_ARRAY, + scrollToEndButtonMiddleware: EMPTY_ARRAY, + styleOptions: EMPTY_OBJECT, + toastMiddleware: EMPTY_ARRAY, + typingIndicatorMiddleware: EMPTY_ARRAY +}); diff --git a/packages/component/src/providers/Theme/useTheme.tsx b/packages/component/src/providers/Theme/useTheme.tsx new file mode 100644 index 0000000000..738bc89efb --- /dev/null +++ b/packages/component/src/providers/Theme/useTheme.tsx @@ -0,0 +1,7 @@ +import { useContext } from 'react'; + +import Context from './private/Context'; + +export default function useTheme() { + return useContext(Context); +} From c093d6f2696662209f4977a2e6b2c984648b3e58 Mon Sep 17 00:00:00 2001 From: William Wong Date: Sun, 7 Apr 2024 21:49:04 +0000 Subject: [PATCH 02/18] Add sendBoxMiddleware --- ...based-on-last-activity-received-1-snap.png | Bin 0 -> 16037 bytes ...based-on-last-activity-received-2-snap.png | Bin 0 -> 17647 bytes ...based-on-last-activity-received-3-snap.png | Bin 0 -> 25026 bytes ...hould-decorate-default-send-box-1-snap.png | Bin 0 -> 14965 bytes ...should-replace-default-send-box-1-snap.png | Bin 0 -> 15450 bytes ...se-should-hide-default-send-box-1-snap.png | Bin 0 -> 11687 bytes ...bel-standalone-should-render-ui-1-snap.png | Bin 0 -> 15484 bytes ...-warn-and-show-default-send-box-1-snap.png | Bin 0 -> 5987 bytes .../sendBoxMiddleware/changeModality.html | 141 ++++++++++++++++++ .../html/sendBoxMiddleware/changeModality.js | 5 + .../html/sendBoxMiddleware/decorate.html | 47 ++++++ __tests__/html/sendBoxMiddleware/decorate.js | 5 + __tests__/html/sendBoxMiddleware/replace.html | 35 +++++ __tests__/html/sendBoxMiddleware/replace.js | 5 + .../html/sendBoxMiddleware/returnFalse.html | 34 +++++ .../html/sendBoxMiddleware/returnFalse.js | 5 + .../html/sendBoxMiddleware/warnIfInvalid.html | 28 ++++ .../html/sendBoxMiddleware/warnIfInvalid.js | 5 + __tests__/html/simple.babelStandalone.html | 41 +++++ __tests__/html/simple.babelStandalone.js | 5 + packages/api/package-lock.json | 56 ++++++- packages/api/package.json | 5 +- packages/api/src/hooks/Composer.tsx | 14 +- .../src/hooks/internal/SendBoxMiddleware.ts | 48 ++++++ .../internal/SendBoxToolbarMiddleware.ts | 46 ++++++ packages/api/src/index.ts | 36 ++++- packages/component/package-lock.json | 70 ++++++++- packages/component/package.json | 4 +- packages/component/src/BasicWebChat.tsx | 9 +- packages/component/src/Composer.tsx | 40 ++++- .../src/{ => SendBox}/BasicSendBox.tsx | 35 ++--- .../src/SendBox/createMiddleware.tsx | 16 ++ packages/component/src/hooks/index.ts | 2 +- packages/component/src/index.ts | 2 +- .../src/globals/pageConditions/index.js | 2 + .../pageConditions/warnMessageLogged.js | 30 ++++ 36 files changed, 725 insertions(+), 46 deletions(-) create mode 100644 __tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-2-snap.png create mode 100644 __tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-3-snap.png create mode 100644 __tests__/__image_snapshots__/html/decorate-js-send-box-middlware-should-decorate-default-send-box-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/replace-js-send-box-middlware-should-replace-default-send-box-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/return-false-js-send-box-middlware-when-return-false-should-hide-default-send-box-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/simple-babel-standalone-js-simple-when-using-babel-standalone-should-render-ui-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-middlware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png create mode 100644 __tests__/html/sendBoxMiddleware/changeModality.html create mode 100644 __tests__/html/sendBoxMiddleware/changeModality.js create mode 100644 __tests__/html/sendBoxMiddleware/decorate.html create mode 100644 __tests__/html/sendBoxMiddleware/decorate.js create mode 100644 __tests__/html/sendBoxMiddleware/replace.html create mode 100644 __tests__/html/sendBoxMiddleware/replace.js create mode 100644 __tests__/html/sendBoxMiddleware/returnFalse.html create mode 100644 __tests__/html/sendBoxMiddleware/returnFalse.js create mode 100644 __tests__/html/sendBoxMiddleware/warnIfInvalid.html create mode 100644 __tests__/html/sendBoxMiddleware/warnIfInvalid.js create mode 100644 __tests__/html/simple.babelStandalone.html create mode 100644 __tests__/html/simple.babelStandalone.js create mode 100644 packages/api/src/hooks/internal/SendBoxMiddleware.ts create mode 100644 packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts rename packages/component/src/{ => SendBox}/BasicSendBox.tsx (80%) create mode 100644 packages/component/src/SendBox/createMiddleware.tsx create mode 100644 packages/test/page-object/src/globals/pageConditions/warnMessageLogged.js diff --git a/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-1-snap.png b/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..8cfba80144a6a261cb2ca1cf4b4924cdacae3e22 GIT binary patch literal 16037 zcmeHuWmuH!`z>~0Yy(sf*lt0T+zN=a2_gzehcFf(sdR(eLP0=LKpLcTq@~>|1~p0z zjZy;)Aq+jlS+D==T<8Do#Mkrl%ib3b?>z7GJomcSTKDpax~kIF%^aIqSXj0ypFgX? z!m{cX3(M-e8`t9}*&IE|_|GbP4W-j8S#|q|SXlmKQ9gT0%O!HO)73$1dTC`s_w)?g z7sdDGqSpe2Hv3u`oIH8%&4td*Z3d~a)=dWmT4v}P`HANeZ4Udf-V3?+=e^x$|M=$( ztH_r_GHciT^MIGvb!GW(jp&&}H&>sPA74HVI$HPdx6MOqe% zoyW8GkUS>t)sk~AMV`1EA$hxbah}nXXRax%pL4b$S&dq;vUJFok!3tRr>N+5sXN~? zR5_kj9MJF&Vf`%m0?XH(SAuA;1*{pQWz zmK|@iml!cCvX&(b24mE@f*GZqY0z~2`t^~d2%8+|Zci$&YxAiJucZu9g_kio;+ToA za?Xv<0b%;{KZn)YFVywc%vQM1+Rz)410OzosBdSN4b;svFe!7J&cVL;J$;(DjZ3=a-a6L0;((eOW6x=A%dXO*hYud; zO%FGX;vN(%F=r#f^g~6AE(Xy^vtylQ+$7KGrUKhu#TPeYycSZ;qHmW@Jj%cI{XPC< zxH1Ng+xDEL|UY`;zM@jEovwq7PI=P~YSVp>0Ndd7;1B38PgZwJZUW(I`z`#Q9 z#a^D~WHlbvty}XCDg|i0_2i=}Sy^R-%@>m94GKibrIWsiNl6ASE^jL z-s>-!VcYwOor}xbb73kQk97;lx1@@29=rKiJ6)&t^y$+XCeZi39zSN;mT#H-`0-SCgMlAdYQmY22GS+?3vwZ>hU9q~<*-#5gS#S`h3|EnIl3_mh9Pm{|b3$d!~e z8@An=?EA`Qal^(Y%WJ}qbXZ8}B9HfCwocZSR29)OEvm75=FCW|<^VnEV%Te$@zREd zN3-4DB+KTE%eaR(O^GKx+RB+^S{pv}E$&RXyl3$t)yTuj3k!7e^jOJwNI1=Xye#?J zhety*?YF7*i7JjLN{f~^*TRq9__WT_nRwgTiWPHubLIkWSl;b!c_5nQx7bqx0s=vO z-A990SwVddwG^p?@D_@*cNlZ?r0}Eg9_S0zT&f{IgPDt1fT=bl%+`}P$>lsn- z01TD-)TbPOU%lJY)01b>Bv3X#5E1_OwR&^xixi(?%y2i?xW5?R-Q!XFmly!MSwRi5Y z^`TN3thQ@M)!M71?{$^A7b@rMF?RV^(@;z6=2p(*Q_`90T{|4SyvnUx-u#OVlWoY& z$+;MGDdKo$O+g`^-1xj1m~b&j827oRW~_+DO)j_?Bj0Js745p#v(+TDHTKl~(t-JR zYqqz%we78`VQyTw(k^%F+n?y8IlK5(U81qZFy)+wtb4-4yxS9TS&X|+*Cl%Lt498< zY@B>zv6bv0%)BUCKKJ^ekB=eNLMsB)wEMCN)?`c-ul)M3y;`pFa@Wj+ShO#k%hdvf!AFHD_=BkuAVmbvAdEqKm$ngx{xyxOpx+e(+@nI9Hb8!6Sm z+lneH8)#2d*+Xwi4-E?=cKy)TIK zw!+)v( zlRc%QY}SU#B(M2IUe|mvblxc3Np;S9_wNVevpWtdrT`)@sH*DV0eq=7PLZ;%8l1}#%Fuufz|@G zb2Co>K<@pgFJ62aE@3$^UHt0RUM@MeMtV`wr3kl6fqs4rj^KnoOC7RtCfZiMc|($x zyKj4rE5j6hF72Ejd-RZmWwRD8bXk|ZDH@Js!pkKup zmz3REezoYvCS6kII#%{U)JOx$4G1d@1kI|MH!(A-uGzh7SMRikgTvH1>)E2b%mj2d z<$Bjb`|1$k;qUQ2cJ}rXj>B369;WM(<>{6=xw+a}T3Q1+e(gFtq@<)k9~kqFOQ-Wo zS{}BUUB7WdFwt}QM0-x6=CuNkc{>TK7WM6NQ_qH}WO7}Uj3t-^Ew6Nv*ojS~_+!C~ z+jCz<9o^X-MwV%}%*n~w&BoR*r7qMO-BYk%#_8hEpFa}^F59jAGLsL^)Ue6*3kc9b z?-4hz=k@27YojTK9li1B^qDhF72Ycvf+vGi!G6Z<>aHm3>+1(4STv=XSNgKGy}5Qj zL`eTNK&?a5e(>7?keqJXqA%r%nVFfpTufNl(DaEv|BP+i)~Dv~7p2mEL0~y{uAxpW z*op=S(^6ND1^Tz=e(;{{bnX`^xezQ6?P!!SXY2a&r^?y0574hJ)aDA&>c_6{af>N> zHY(G-l$Ow(X=pjzm?|J7)CdrkaGSa{O{Y@q$4dUHYL^erR*MX5Y0=}tJDLtm@B30! zHJQf;wm@S_+4Y@&IH1`oFzO?K?~4Jx$SloMyhS9e8zy9*Yi})A( zYHk+IWD;rYnEZU-F7oH0p&{V4)@WOPa72WlvM;XFMN+v(QNitQAwpk)YeLMRH1}yN~ ziEWx4At(?51qBkw?aamQx3=-rg$d$T)US2}k>rr~cpL4~vuS#$LFvVzOZ7w#^x^T+ z3pH{I3qNk1h8C_9^fDymkQk%5e&s!@=*yC)W$v>UBQ4o&1=bM*HDU2!(3dL~`$bXY zNkAx~Gq0fg6AiL9MuBut@#!~hU86*D#j*iVZc2(0al2f9yke#NcYng`x-ASPtE?k| zU7>X*0_nfhh~Ms#t&NbRj62$ASqlhwmzAO7R7{Tw=-}v3Or|qo^9fr@lf*7=w zy5?B$}`eHOq+NUZR!YdF|S@&D*zA`C~j@<9S1UUtiG5NNhNO==Iz7r_6S_ ztF;$cHxxV4r=W*aaIpv_W>TMe_FN$jMc5$kTap{ zr%!NnbQVFSf*fiksE4Jc4TvpH(@xKG7}8i8bFR?T(9l373<>mB-B2DcWdsl}1%wes zofza>n5Zc%<m=F9zV)VwXn9WfM3)J+xPg9>CvM{+1c1k zB)eSV%Vydvjh+9zX=c_A=9LL_Vc)aIOtRY}mu5T^uN3Ik=3G#6V$r<4b?kmuxo64r zNNWSIN%-i|@7(Sq*&5EOR;@Xe#ZIFZ&!0cnN!Jmkl-1(~Fd7%Z7<1<4T>Sj~^CN7E zzXt4=x{d=QBnq>0+)LM#3DU0(A{B<>Geq~@$|K)#OiWC!LC|fFPgv`NO}jEK$1AdP za9CUl7th8;{w_9J!+c6f?7Y8zYmRZ5TPv{73I~+??Aagmmh5=z&f@&jzj?uNx2Zu5 zM%FDRxA&s0-{Z$`AWW)jYNjkJCi6$cqGVm`xxMDDQQR*=NBy&AL)$=Ygl87>-o4eo zH4l^uL`ikzcxyqR{yg&|u`dw2#^j;q%!sXA(&%g0#J2m}|Tn8K-ypW99IXroeMpgGe@MPigK1?Qr=)6{W&Bq1j>Q}Kaab6mnEjGd=)Le^!vHFr@H0%J6g26DwdO( z(YnG*lc0ygf zr2)7nqRb)VlwngcdVCbN&8k(aaHk?E)9UE(c=t5@TvOnkF8YV~wfAeu(_FiE_caOk z5%TZdyOU)AydYIaQ6|VSd=~>~R}DaAnO8HZ>sW#&*Rbr;R6}uZfXvHRuTmaA-e}}L znqT$h%QJ_xH3_gZ=m9cg>P>0dOU4z{EB5|bMFSjUlS@(3+E|9P*P=^U`@22fGZPTA zso=Alw{F!&yO*O6T3zt^L~{ALj*pMe9EJ?`WO9q$4$!2b`nVP}2|0z8t~~P>t5>fU zcb~C>PIq&BV$dbMpr7(IhCkeO<>Gv>u5mU|_f&EW&aE2jwgM=!@853)AuM9gU9mh( z&V(^FQztXt0$8-vOjgYw9K40=$gCM@R5JixTjG%3Ku)v;@u`disfc7_1N6}!iW<}+ zPh5jl=L8II0k0rP%5S{Ac{3r|2&WVh5@L#iB(w+t9@a3s*xA`lIVEkxb2Sx80s;aG z+HY5MhKQ1Eh-L~c>Mp%(Tx6Gs^K8Khj{>^#;DH$cXfi=OOr6s1&w>_*@fzlu`kR=T z%wOSA2@yJ~?6k5p+fF5UTies>^7HbitK3ya6U$KD;9#y zx$jc?ZNO@&Ve>= z|M+B=^@m4Wy~y!Ag8ZL&WyNB(uisoJmW#Vl$J+|#;ZZJs@Zg7g_wJ4GtjzgP8Ni%^ zFJI1AS6AoGGiVXKYU<%(nMNheHgA8fZ-+fn)UdQ~{(4ub>!Gjg!Ulb*NAMm1$2MH$ z+M1D{K0E~XL{v}~)`60Sf{|!P9hEcI=nGHxc`yYSAan@a8Vd2&!vH(B!y%0HiG+RsIK#cctk=f!2?}49| zH@ADQkv??jQ#$44*BAU)=ZesF`MFrYW?{|rovFdgteZAv!!mJ^Q}CF(W7(MUoHh|H z=bnMKPk3zZ%kwm0dHJr~a)@`r8vwN$Po?0k;k~uOeO)qEbUnzNXu ztE>O8fB9%+#LBug=Nt(BW>!{B{Hk07$})YZA(_CUe$`pCK0h`=ox@=GoyCrfnuCA; ztxkX@jcyO#2SrT=-*&Me%n(AE0>};)c`}`*N85F`a)_&=LS<>=0>|Ee!krHe2^q+b zRE?5$T^11#(7^9!6%PxLsYb5-!N*}l9_tZgDOT(IBTJ-{3=u+#RLBkVtoY-w{&#BA)JPO9>XjqXj}j^HQ=i=D8>Y<;&2}WC&>hk?S&>Gv5%!4wo(I-}@WVfpQCg zazYP7#H*MzhgMP#|G`I@AL#2#iH$u81~y?~iM!ADwV`X%u0w-Q_@lo8{u)c1Z}ai; z4#xR#YoNJyGoICz9dsfw|IzXy)m8e=`j2&%xaUs*?w|3J8aYSN z=6hDQRJGZ#>3?cfG?&sm*GyKZYG1!R(!2ar#4fI_mqHhrl3qBPo>y|BPIqFxO#9)j zaOC8bWDo0fIe06UKlb<6*3;8VRbAwB4Y;{$=gzve4HJUo(%0N_ZiAxU^M14<`=SRL{F7V3Yt@kC4`}cRsQ-hLGaUmG!b7T}P-Z(;{Ta1T?DUl{^cEV%e_daA`vQ`Z zx;QGZ!!Q~Ntslk4H`I7*7oixRemM}u@o3psFiZXN<>xRa$`ps5C4hc6SV~paIqhx* zp@5@y>fE_=(KL1;y&v;3r~z|xbHatuHRKe(6^ky27rR9Gzz}ak`^u8$e3^-%#%Yi} z3lf1jk@PPo$|J4ip!$hPleEjPSY1xP4LgOouM2}J!8B?B*PeoW9BegaL(%wCNF*|B1}h@YQdZkU)^8_W{x`UGY69Xoy&-O+?|2;|NIV74gnc>Z?&38@2S zbPX1dkh9yw!{R5q_}fr2qYw8O6HMLU`t{dK1CkZlgfhumhOgKRPG;3!c)PH$%dHwG zJWw<@(dpc+k9{`6{H4IE^;m?IeNt1(jeFKiXsMoNJ+ZJLtG+MK3$A@w5B)t$@Pvut^K)J9PQ1PLId8&EBmSRiI_a(i;BB7DNe1A2AI#@0b2-7Cw5VPTkm z=sNWW>xLAccQH*K%{8MOSB~~mP?MW}iOER|D%1+3Tb^1u?!DqpY$rJ8XV})J7*^!q zz+6N!07r)Kzek%5Z%>z+{`&E6bFrgkHH9LXtLbce_T0HvNL?Iw=U6F2mC!`DE0&tc zCarW``}XY%2@R#~d(~Ux_kfjM=$BiR0(}std^lfpY3~X5Jxb@+NQ;V6h)$w+;ezkF zb?fwD4vYe>-r$SXYKg1#!R(a+6%$zLME%HVVm`%L~WPT2O8DYPrSKyEpqohdtrgiUl@mrSk7KIeGR$cjZCSc@#%=%)^ zb$4S}h&*5ah_%zZz*Dv{oF`3wZ2UhB`1L!V+^}w)tG~upmXueerLybR&9AJnsc_E) z4Xpq9!3PchPM!anyD_=3v429X9r^oP#f=*kYdBbbedyW$zX=tl{d)BP0#?VrLMJ65vk z4*s)&`y1ZqCFFTc%|&<+T0su*QPUyry8Jh9(Zb-3_xET_Znh&HR}kjmnV6 z=}74;aTes|J&Ux0cD_YZ-9k7l0%Z+wd0u5ylCQsi6A1as;NV2`!6CG=XS@#|JxasJ z7lzZxjc;vl5W>_niI{2tEH-c3)(l}vOx!V;)`k}q%zU)!$LiEy=id7gz6N1yLkk^| zkufB!Lim&YRLc+V-^+S$Sie3kCFT6*KptISFEtN>luN2x83XNY?@PF+jU* zgINVTNy=^gulOG4lefD{_2E#Z85UxvP;=2GqN~@e(azB<4O&w4@$sQ!sm;Vx0bG0# zfUZkS*P@z#>B4}6xOC|GxCt6xB?zMeHZCq<<>-d}*h1>vRci<Xr+Haw(_BUL~L_5>xsp;Aj> zpY?G=0AaJl2?2o%Fb11)OsaX6F))HN7z}gz$dJ}avQdc+&WzB~xI}rNyT6~jV;76p zmPPq{W0-GjH51k+Pc5gCS8FQAW=Wu&Ari&oOGOZsfXZ1?gXyD@$dAc2Q zY9g)rl_bTi6C=9P;cZqOgSlCU<;xqTwQi-1JC=b)8C_dikf(3+nhDc2@(LBf|59H4 z)ONo9<&PLgrR8}wa&d3G;(Uh843N`NX=O$-#!;%UqepvosWDZaKIt|yl_rBRKc)Dd zX>IB7jQ3JLMcVJlk^C%S={B>`<=f>GX@a-f8qGT6D*eiaC*7ug>CY}j+;(f~UmVtz zrw7P0p6YgHZ{Yr=@4Q&fEFBJb%1O%|`{*y}*2EPp-)Uy#Ma?pH+z=|vD9hp$|7Gmc zUdYVQ)YBWXdhEy0cmLrhTACZ@Xc^i=R43=dzG?F=DsJS64?dpFpab~!vv~f-jfcy!)~xnu zZU)11Cmo4rZG+D+?x<(Sdbb@oiATsXx7dg&J~fBz4DWf z-qYjJ42tDKj_CdD*&J*@P5!)gI`MStvuD3nV&+nBo_Vq=OGO}fYjTO6ye0xbi*=7! zUZ^@sULeP_{CL!`VQ=L9{~m|0e5Q+Fd;pP^KV?ul*U0w4rc=bpkcB14*FLO$gyo$? z^6gwfhL6Bu|e>IEll^R*rw3-r046yP6zgzeI9a|rAc?2Vj@8GW#1N%-#YAT$j;4XF+1upOu z4O7!3;xTaGqKETRbE4|{H49sfSism0JBmkzg{6Wf89$p3O?IChgCEI|^+H<;e)%%N zhHrVzg^L##PqnT7k$e!)LIk$3Lhu+X%r$hq^kVAz8RdTQEuVS3GXNx4Qd+h3G&Jf{ z$F{1mZr-c`+=Y?p@x5*BkI&>2vCP?VGVTZZ!X<+@SO49e2^v7_U%rKpNPnctFaA11BXMCMN+#wc#E1zbBOLmL@cLn#6N#2I7;(I*XoIYKL>l3x z1mhIom>YS`_ZLI*%Q1*C4GfQD7#is*DPMAJz;4E=Q*hEO>msFyA%8H&toRkEt#f#( z2_b?Q{r(ni*%Xwck$tTM;edb*JK{z}H5^}EwUe7W3q0j86eE!#>R`#nQB<+g8;bTP zeCAP@{z&;VR>o;01>TLIprFdpWSNON3WW;mG827SMY<_$1{4(|ZSSp^7J&Y{LG2Lc z?$Tsv#mlfE*y);JF^E~c2Fn#Dm0v;RqY-L{smb-8sW%4tqF{|4j%t~Ztw2-^S5g2K zOeArh?h~8xBQ2gr7bfifDWn_S2RPLgH%ysr-n_XU`Hx0u08Fkl56DYTlkMD2-i3>2 z3AyGQ7)XUKo{CvnRB{|{{0?6-38aF^8?GSzBys)YM&)|=fqBH3z`4^Afx&1<%Gcms zN08#!|!BoT`d6=7pzOT>tL z5Z1dUq)Tvkcp7|C@GfQiAqF`_Ji)SA2&7YxkMCSiojKvyYb7e&|-b53#-Fmb-B zwzg@qzZ$-zB&Ng!nZ}ptFlR;)`uj_{o}iPkxM0-^9zA-Q*cK!my^y?vg__ba6eNE2 z9ZM&?(lk;<;xL*|6%Z7xW|Y^N5c_!Sado)- z%`bn*Ezk85W9ncScSMjRH95K-Qy8%Qdi!F|zI##kmyd4TwoM1hJ>RsJgJOQKC%z>p zdDZV3UonIiV!eZ~aThR*)=Ip$Pif zVEf~a4#LWy(LoNw)No8M8B9;4DyZb*2RlFPco@xHKU71*tp%&RW0CRk{b>pF`j3{} z7`zjEN9+n_frL{xTG*{atBYzvCQ$A11p((`2aCr^h|;*KUV0S<&Z)Z9FF`Ze3<=88 zEXl@nU9}y2kHV#?)@xrT&WV3U6l-z$fH9g1OoSwix}q5CKE-ICRMGI+#x(^4gqX|| z)q&hoV!KUAZTdh>!|KXFdwY9?Fw&6-CZa0oNr0j6CQrrql~H?IhzsLYl98Gql5-Z_ zICUSJh8W1Xhh+h$Y@4I*Ja#ckUKLM7f!3aPLduQ*UfI$Rh5-%-FPfYl- zv$r9Neth-f#F?3Ii@B_WAkRloNboEOQqQ(yM;xxXYg6RD$CZH}K73$9c|w#T5tY+e zN^z2oL(vjzhXoRg&9T6(BocQCnk%c;u3hVL`d3Xq`-Uts;~RhV-dB^S1#LdSpj3&W z-MOK*otJapzErQJg;a2FY1k0|Q_A2Lb)gLP!-$qqpVuY)#bsN%F|sfr%VL zj@H-bvMf)WPd~;JM0|nhCfLj9{DL_Thl%Gi^O1qu7NoB1m(|1>{g$OSZ@Sb;gyvbd zA18mt*h>eVXqrxD8hUv;yk2B*BxJBIF%NmL0PM!HcO9V=^)?XXgkl4@yZ!qKf`1!LS*o)709(f73BGt~O=TT9kuC?=42j7MEyb(@k z^$UuNB;0Y^4k;sE*{JGdn_Om?IVMI#bOl0}2!aSn$f2KraHu1LvJDNYzdAIX7$$-v zpc4_{IU@C7|I-}RKr}G~$HyF5JHoI+Vls=c_(yvgy=>sq5Nf75ImRmuU458%l??q{ ztqLzsO3@&^VBprJ;>F2oBA(8t5^|WI|MM=ZU`%o@5-Jo0vm0lNtrdjOgFmMOaXj|6 zcN>vN(@eT}8TCTM>y_*A5w<`6h{YiLrHtHPf1N&c>J*VH!n`UG9hr_eh8C*B5s@td z9uTC_Rabuo&`!j?A;=z&$FF~=seX)B#k-=FWsV_R+F7})_`tkkI*)7{YSjIK@PPoV zG5g&*8tB`OP^QGR0hXy2=5-QxewpVQV|P-l@EW?X z1_`eOJ}3OXbl}cHrKr~dWs7gI{}4SK8+dDZaUKaiEe(wzVmJ-VI(*>3&x{5>Vha9y zNZ~dOMyIVp#83jb<p(~X+&8t$aVdcdF|63(CpjC-Qg8o~%q!StyZ!5GoGMQ;(n%I=*zdp7l< zb`gZv0a!MfAcFPW&?hE*YRcgfLadCr4fCn9!Mf4QaaH^=kyH<4_I}R013HX#PZ-gg zL~yR)JmGTg1w?cbNX~P!h{!R*8q0@8O(cg4JM5~r=XAup?&!E8hp9Uz7|)4IgVG~{ z!r02ie+&4%jD6K^FUCd@7lI*O`5f0DSBTgj9C0Wn1b-?=lll>bX-f5qYiMX702FZx z68P^7lj=$%+y*y{`GPUeml=Ee!T$3a0TJABn4r{-B74Fkz>NB^l$1VxLSvWK^6jDT z-SffKU-=byCQ|FJUgtDDK3)NBC_}ITfrl4BQ^)UJ`&kwbN6EX$j-R^WN1^cY^QU9# zA5DV=BjNJvhlbI!)ht!EajOlar#1V~aBtzR1|@(|rXbxMU1!O{!uDg+;5k24J_bhn zH3KXxzENXu6yAA#;R#v8vZ(lZEn+IHcH1~u?yQQE-%z{bzk7x$D?Hy;t?F8-(}L#` zewW3ZDl%SNEy6IGZ8ht1lf9+taiM}ql+#rMokk~OR_3x~;+blR z$;>PnhL7Zi?F(6g-_3HA;0?5iDP1&g{NmhM*zHDj93Lwgs|g^Z6*?O|d47RcIZ(Ez zWDIUYmirK2w`0Y;zjJ3tQ8|5KW;%=6!`khb>^;|KJC!mnO;U&od@^BVczxuwvW7+4 zc(Is|#BjrB=T09UH)^M2=y-7`X(kK*pu~eJw~*r8$$5J&t7OS(ym)1a;%pSi-Q{Rl zfK}c&EY?4;kj0QNP&<8ZyzPunDZRelgPLhPYUDhcUrslzo62G?jeAo4dB%-q3oGWc z+<&YZFLv&lFq*9Ln&G( SE&km(i}E?uvstIF-uoZ%UIwH9 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-2-snap.png b/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-2-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..14df4066c39a775e8bd25b96596f35734ee9dac5 GIT binary patch literal 17647 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 Uwd3)BFd-D>mE{snT)FjM0GpCPEdT%j literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-3-snap.png b/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-3-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..2efb82c75fb7e32fc3cc73b8727a5c93f2915e4a GIT binary patch literal 25026 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 F^dB8eHGTj9 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/decorate-js-send-box-middlware-should-decorate-default-send-box-1-snap.png b/__tests__/__image_snapshots__/html/decorate-js-send-box-middlware-should-decorate-default-send-box-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..f14ef87ba14a47448d7ec07a6507ad380c0ee1c3 GIT binary patch literal 14965 zcmeHuXH=8v_igN5XH;}-I4W2`ML|Sbupt5}9i*!WNEhkd-Vjg_5CwwLJ4!DRM^RcJ z^iEJZ1c=lCA#nFQ|GU<`A8uLq>s`N3<5Ec8_j%6QXO}b2l&{FGTfKcXi9}i_fAPF3 ziL~eziM06c%H{Z*kJ~$A@t;L@s&Z#ZDU~}1NTk0>^5@T}JBJRpyV$Ewau-Im{w}|{ z;?t`%mSWRB@B6AtGw$Afel0MMCnHn!3|CXSW_1=fZ>}zAOJLsn!$()@tiFFS>e|vj zSLXk`Z~5umu|F=B%+GVrh;*!7b#voW_qx8Wo%HKjZZf$dF0OW_y`GC{w56omSA4vs zNu<*=D^HM4JwLtVZsdRd@Sj8YPbK`P3;xpu|LKDNbiseR;Q!k$5UA>q+_H5mv%fl0 z;PBz3%2Co6Kh0~`B5vHcp&t3zi}PcViOGE1XvwR6&!0b6y?C+2W!)bn&xEnDvDblt z(K$J%3P)J%J-%PRp6y&q>f6J|7o{q<=hX6bB;UPNq@M>D|KI-*XTB~Y#O%k5ZG-Lk z+2-{L(Z7G+&NQpN;5Gei_e8r>hlaT}U78)bcnO!BT`RkF$Bx9pxgMddmfK`9C|>N5 z_CW?UUy9dn|K+z)A3p5$`Rn-EKmYtQZ+@0JInzfG{QK|I<-tO13m37r+Ye?ZnOYT* zDH4svS~|wrTqXH@$Kewuv^U<;Yg5g+K82GFx|2V4*xV|5`ez(W);gxE1W*JS1!)CGBDJCW-9R}3{ZVG*# zz7f)zW!-N6>eVa9zA&d*YC&nh0o{tXqJpB2cjvu%^A~5Fvf%#li3-2bj~5@iyKl03 z#O-?D@JZh3E|J|CsQdPW*^N}{RLghX$HNS2D_?VEn558@^3go}XntR~TY|%`Kr^$< zWqE3`R~nLav(p)$t=lEaD=SZmq{mV`TfTn#=3(8DZt5rhX=c3dop$qSIa%4}041_n zc86#F_wV1eZ{3Ppw@ae#0O`s4U7vKVbHDrh`_sBcuX=AeGQ{#);D{H8Q7ATr++mw! z&19V|JUqr??e+oG@k+`4rTOcYuiJj}!SZ!uE^RNiiCppzJ7xQoCg7VWVuVp zbz`^OU9^Pwyc;(@Tn;@|&FeXR-J#uifO}qXr$)@9TpXkV* zbB~)Q8x3ugWVjikx2nFNOrxWsn%;_96tGA8T%P&(WD@Uv^4b^DnpLYl8WsC$xVlGY z%h}s!gv_w>1Z>)STxNQLkBEympFMZ($o~C5QVQo?TXEVUA@nT6Jo|Y1)yM01xi$=9*~5 zQ+|rH+f>ujKldd$4!3OCxzlpEB{O}Sh{^N|rs#5Wf;$vEt)+JOP4JhSl|{e#8S9JrV`G-BN|c- zQyrKMW^FmP49?u3R$&dwEFqiWs<=bUy6)QsnIsOY(9o{0Qkr>(;@r84I#wn)i&jd= zv}jDwN;R0}vb(WWPb}#6#_6NM58QL{)yOFhZis$?|rMzpj zKhlp}GgzPKFc2L)*kX}d|Jj36Ih%ub>aUb!P5AzzvKh5`4$Kp`s{RfM*>d=5gi7Rv zcs!xRo$jY5^zh_(wO9pz6ow#Cvc^F(Bl#?I6kHy6sx{Mn=1#jyU)Xk0^Vhw!5W9bV z?Ap9JYGJNVrscCo{^$8wi(RK~pZ@sqUNYzQdtqVW6E}*U3bTis z(_>94-tx=qWLt*;;Z#Ok1zkM_Tra=2Tu>sC#~D!fInvk1_oTG znoarTXJ%#wI|>Vlqo@dz)S`IJ=RRJyBL*!mi^mJF&r><~c&*B%OD`Idv?IkB&gax( zE>+)KvZ6pHU8X$Vv0jCXkNe8koS6D~u#ubiX~nKho4V4AZxud*s;<+;HmfU~3oG08w|4-E-&;PHnbN=#;*#H#W3TK89IsaAh&5`%A;U z=3Q7G-rnBH+UX|bCp-cz4=U;O?91;?YG1hUm_3!0bU5HV14cS1Rj=22xL@CXk9g!$8a{b$5?epg! zqPxo6+Mn|XUh+Sp{i%pH=VpNN>KoU(sPV&Tu_9t49(aOqakpsHZi>2JBZ|4K0DrlA?ZMpkP(N3)Nws2`TokCA8jW*;X#yBRQ zWn8|6HH@OlynC0#;?2PEKllE;V%Hyk{5|k>#5O2aG59DsI3OS(@ZCFRyW+E_Ppdi> z=A9gdnpEWF42+#8f$cK7vJpil?v;sfZDIGE;TyWNb7HCs?Jd*sPoYgevR z_T!Zn5PcjG@plh?7N}zmoZPr+Q~d|oHS!Y7Q>$06&M>Qu5oYFf`z!Lv?>K20SNE4f zl77CXe!k;m?nr!WcumtsBcYNUMf}_aUcX{DadB~N|A`8*j*DXpF1Zsmiu63+@of~D z%1mqdJfH#3AAdv$rsSLzDxCWSl!|`%a4Fg~xr`~*IIb4bcs^kNW%s;4czB{Q&p1*? z1q2j|{dTi+Q#2Aa$=Ss?XqtlR>~V|66b+0n3CE$UCQ|%H&3O)qn0578R=TX=$-#Ox zs_Ue?XYcbMwe|%5D&kaBA|InPHFtTlpFe&2J6CV4kAcoqS5}TdLF>fF#}i$WiH5Uk zN;?xK=|pCZeM(O^HUY01%Owj7kKOmp7cdeWE_$}f-=5LcmSy!WrC>~N8yPyGJ2AyGbH|6q0G6VM6$=t+%7J`p2BhB%ru5H) z6~WCUe|r?e>PEZX3uR?x{(SW*`nrjl$u%*T-@OhBiYXT=Y;&XRlk<(k)ASro?SA9z z=$J*H3<(J#2QOK?xUAsr+%}tM2``c}{0%pI{cwq?=?WFK2wJ^n4Y-+&i{bAMPma|i zW{P%tjFWEg!CXBRsj^L5w#1~Rr3sfyy-RqJU-ZbcLa$^rjKxgISiei+7S2vUK%fS# zEb2Muyl(r661SmzVF6dqgf3BA@`uPsht8r^7^ke$nwmjQhd~;8=B0{#cO}-{Nzl#o zQ0e*18L0)ANtEFZC>dL~elqqR$zvX6-J6PwJJ{3R9TySt#f^f=rkUgGCo|vFcgNK= zkEoQ0GfQxH3jScy1=*>3xvG**BZtQomG|=ToyU(ifQ)*iC@CtA=kDa;=@~yiE6LcX zu}#;E-)kh0*HlI26`4CxySg~ntad-e_TiH!oFN}tsJNPHv-F#dXU?1%Z2B0fnRNA+ z9k(n{kUySA`DcExE!Qrj&kmEbhqp7XEJx9Oex{H7WLr&bEx$at8=2J?Ezl+CG2?Ei z#SgC4<3ToWNQ!4r-I#Q*`E(2q``wRcz)5CA4(3};1 z)PU6zjf{R`w2Ij;7e&4x2pGo#+0zE)apM5-l~gxbu@oSnA;=dRsBKMJHwOf+V09sHXaG~ z_y3S<*Ea|$R7R&aZc>tZj~8;a!34?o-6{T|(ZKEUiuF6I0NN3d1%hO<0Vs(SleczZ zj=pf~pZm-H z+029@JoyRxeq}0TN(+YJNz0}Pueq+>=509ynYcP~@>LX$b9!lF#&g`HGj0+zxen+> z@DZJK6CdKh<#=7rV|?c=%yanV8};mb_U_v!YC`)9Q}O~-Q=^R+N0*lwVxkM^9|k~=c`nZ@!o6ERd-jar@1Teolg!3nS+f|W^+*K?z< z4_7&|sB9ff|3{A=HDe0h0*o^_1!(Jr99yF`>(*rw;BeBa<>qep-}hu?WdmLMa*9B% zEJ3D-Plc*;?D7$7A?U&Qs)s{EmOC&QA+yTSVFX{F^3F+Vd-gDy%;5Eys1~M#HUU}z;pOPkWKZragRbB-($?%o!Hi>X*|Ec-y1Lr2 z_Oe(r;M)=pPB4#b@O16sg)+g^t0?^=2M?BXc6M4$^j8OkgbYxrpD3NjMBWJ-KNq!O zwBgH=jLURN&yjG+b5@N8|^nde!@LR(OgYYYt>L!ORKK zLLqxp=C#>L%b4&K?!Vx>(+syT;c^MZYt>!yirgq_(Lm#M?cXE9DO9rEym_;;4dvMN z`>11j-|@%`KA%R~^WB74&FRI~Ilq>B`}$`6{CSO86YUKu*VuP_x5vaQ{sRYem6cy+ z-m3lzP&Fbxf2PP6+##tfIlX3Y3RJ!5N`%?ptcUV{9#3!odcIywl|9K!u_(+eX{q3p`t+q96mm=t+s0Z)FUUFUJQveIm=8n9J;P|d(Ky@(EQ!lU{SlWBfv|Naa6F1+|H zzUPu`c5G~HB9zf{A0G`+NR)ylVD2O7V2S#+-+3?< z)u4?hem>YROH*NEK*oc(J%8~+-O@7Y@!D-4hFh~0{UOF;F8FMhm++AIVF9V1)Y|=h ztD*Y0$Ln~uZ%+U-G%pW2VmvYq;~^0Mgz>N3p6B2IUOf|PZwmFh{rHWC8#iv;jGqR< z8H6}Vs1ru{pD?T8TetI+G5`t$s!@b4rPga{3s$Ld`t)6f*Mf(94f;F|g0w%g(SR5L zo53AkzuxSDyYY{Dw&?(I;&rj+D=BVJ_y=TG4#%6T9WSK9oP?Y-!+PKT9?LBS?%`^aA zr-3?&sy%SJ1&}b3)3u%e4shTK(Z>F_7Ad3JjkFLE;yD1$;gjMA{bW){c?31%V0)}y zwMqpKU(njGr?B8lj4g$W7pn?f#$UgD`7^A0@7}#%-4vc|#H^U|(DQZwfB4P0~fhYufC+sHT! zzJ^k05^dBog3pnCL^rDm^3?*QhGEOY!=sI{NFWrn@D12hna7QOyeaPbSn*EmUGqSy zzTAZiEkJl{u*M8F!;OB!$cTDi9!6B=vZYI#0IkE`LZ8zB83foQ!L2ZHoL$NSzZ8~- z1tn2lRwm%&78M;G!k3SUG7O;p^k~gi9ek<$r{;9icg+i7H|Ksm*^Mg7YX16Y4FSGW z<%aV$`JoWqIyet2!15HBeG?&!fLIwDWag?^#(ezz+V4(U4gIrXcLuzaI*5k3x6apr zYe8?`+$x-(OdWBpwHB$|NWCB_$#IhkB;h-NZa=jy8!L$@fz7c(svkG^hxwtR&T{S46D{`I{ac| zbVMec%1WYKTO|br%VD#@D`|FHfLj4U`3B6fiRGYvB3;QvBz8L8L#S>@V7}l7H$*>5 zs)y?vEJf!RSUrKNyyP$a`^yqCd(?CXS6P2zn?_{}EF*?jaOfE(&F-(@CR`d2syr-u zkEEn7YDf)SAK%uJY0*ce;yK<*yJZbFrW*blo~OBg1WZ4A_%P0i#b6kN#GDH@^vq?` z`z9vr9R_M-QQi}bz93!eY7n2p0~2O^U?K7FLlU5e360I3);Bh30#8T;Wp;0 z3gKY{hKHxXO)l%RmEkngZ<;XFwAS-VT~(4AeaP$la}i93^Mn-x)(X^~GkB~%O5-)H zg+oFKh}N3WIaP~!@|r?19QmtorgsNx&)ujfKIw6qh${|%qF82L1rVr-kr`DRyQ`w2 zVp81dCfWoS89C48aH#9!J3~Aa5@}PDa96G%n|{=;x2A#x4Qp)k}0VAcDOfrPOKDo zDyMO0RX`f&1`g%2OZw^83ioiLF8 zmAPqY0E~+oGJm?cq%Mi?v=a|L=wdZ7P+M&Jg7Aj;W!j71P``_%QufZ5vxnYCQ_yy&G zl@A|1I&|>hMIdN>oJwSw)aP!!Y<~7OC7RtjN=j5jZu!6*K@NS5ZQ`wJ1R&u|VX`#n{;Qg`Lj@)%Em}AQdUv5_|&~ z{J*u8p4kn{!qQRzcB|Ujeq`s>)v2=zE$ZUlg9X60DmP7nLeoHXnKz~+gCsGD->WoG z8}sE5Gy{W)lldZ@ID;PXM#p|gUXW}1>EG8W$Ad2M=?H(Q`%OoZh5ehKj zyk=UpHef~x6i~Z;@(9pI;|$~RvfrP3qJz%j&Ndci;dR|QxGY#_7}GSzkv21%&oePF zOjt({JVoG^l?;G?aGkBwFg z)`8_hwMl}vpo^h01TH&CHktnYtKt2*73FlgSb8m`^Xb#4X#=&fy0~*f#S&3Phx@pX zA@i6dS0Ys_HJreQESnB%R^h^DSvk2@G*E5~X z$@u2Ys|E()PB(l-I`}SKzC7s?D$`2Tq0qR_?4H|GYC8kh+2aR@sS@=1_04(S8@R?h^@jL6byv`ce`Z#_e?Yg~Zsv^h}Azzn#?p!9{9hL371 z$(Ene-6`;PTQTJ{I;s_hq}4zF{4)h03IcCmy?V&cYc5jMvZ?C+{rgEsG98g3IGgg$ z)Kcbeg5iAp_GE+G?sS_DviI}npFsZKHV^nkw7apWK`&okyMFz8L!{gWUE~TK%wyv= z=u^`xqoy2#xMmGF=sp~g{F0ElRrcuB&?8mzmXS|*T}w=Z-tT@+DS9Drcg<&dh{x}) zF9R1A{gk^)EbxVL-|YH*PWevdx(JE17611X`ro8_OtK1BL{3**IkE-JR?w9i7poJbX|g)! zct2j4`CKriiZHfpyM7$nx9=S6-tF*i_y&-bX~N0ySfLU5_>P?&zdR8dkL33860#cd z_Z1%%-)~+OagW#i_ZjYpQ(GhWtv3nAtB20%$yuUl7-(}W}pE=kePuY*b+ zoPV|G=l!^;({gfh7Koo(@|{xA^P+dUF9KpYp?<4Yu6)TySd9MNqt2Um?Mg-;9TF5& zbekHg=F!sIBTvY_#uWX@o?ycS;>)OR*|bYAY_uSF;Gaa{9&Vw%Fav`iz7p6gmfu|y z1$@wKfVU8cLr2tf2#1ayZ-i&r(`Y2k>&NbZ9iWU^cqLpa9}K-X9%TK=}-Wd#pg&oI2qWdG6df zhsk;^=3rtfK=a82G;chyM6ljsS`ZlrGF}PDL&U-S^3Bc7a0y=Xv99|fh%hgCxd;9N z%)!>zAtA)?XqbhOZXciacxnVqHVZE!IW%-9ROY|i2cNfX-L-32nyja;9z~Z~XydT3 zaRBr<=O2ZFv{6^AeBufPtFZ1ARJqS~(HhJzKKb0-T*7q(Q$8?Y9|4M-T2-Y?uw#@2 zagS514wlEJO(f5ibBqU{L7N;V`c+u5f?zvQ06PVLLY!5=|3+x2a`oyPB#`lVqC|w8 zgV-A}sSJ(3e}A#ODp1)!Ab=3^g!w<#T?!ZGrRzlhFLs1Y-oSn?AhZS~VW0dU@D7E_ zCr?x~^j003PF@vT0mxxBvaQ<{DsGZUTX!57T0xQ<)vzJm-b}bof8P3k_`|X{MWz0v zFK33%0FdTcOG`r?Hj~wA!)Ib+V#*M4ixtlJ&?hmE zO@+3TDr@l%UT{!|#LYcLQC?of#H80{-D;Aa?Qu6pMsWn4A0{;xO&VYBIhSB3>K}!! z)PG+}u2bIzXdc8ty1u zIGfxVO6pHX;(Dmc-iaAV@nA(e3$0kb91x=bLqF%1(c<6Vv^Mr*8YjZvYe6)Fb&kT|t6I!G z>l-hH2+JZT*)HvxL7%LRRcZus+G8g5!(gn(aEr%4VuG@$V?Yztw8J{*479R;6r5!$ z{0kzYM?e?&=1m;(j5u_2PYN6R2X(0De`OLroWTqhGW=Jw5Zg+GLk1#o@W_$N(EbFi z1xbs>(-HoZ|HKoSxief2n>~|wtuj=+1-CmwWgE!X82L%Zpa2K4ZqWdO6)CsdLmji- zREh}c)9GYzv_<&QLfna z(yEbX*m}pLUh@&@65Lp2 zIH!P=XfFVTc~jbZ>-^!9Fc8fEX#e6M9J7o5#1aTb&_EtDMGZ#{wto_n6>Q<&U`uA= z*!cJ)fxWN;h_w#dC5q>4yn)B0hR<#p1ALcM-!Pax;S>-D`_AUGHY_FJVlV@I9Im8d zX=y0|$HeG<`7#3Ecu-7C3nNSoQ7Lw(_~I4lf8IXI?^ca5%9!4N;DDA}l9y@+-w+TD z^2nWWX%4W!Cy&Y)GeC?ajh&-|*n_jRwIu>zME6N^bMCmd%gAqPkxUT#Xy1#AEieZX z^z*ZVgbWQvTww(#<6JG^1v8jL5R5tI=GPh<9UYHf9juM@gW|?Rs$scHo%kROV8Kbd z<;#|tVciHDFt5z(PI1)Qpf&N?iI`bLVhQbE2Ok6R&LL1J0C*z|kN=tuxp$(Gmn8!x zAPwTsK!Zphf{yA7$RmS)L;Pa2;#Pc=;GR8a;L6medQJ*L#cDd|^R3$^d>+UWi)FSC zuQ^HEYLL}aq ziXe@+T_D+jPh8Y$o8TxoX8)Rcx4zPd)&^$C$8MlIOYu_JJGP5iC#9twWA!AE<-Rn( z-r0K*>V@O&3~@lji3oC(d&K_oQoR=x1wu6l6spDd6W;{~TQ$4g@g3cxQtGhs9dXnq zW;+qFgNS*Ir~!gXN=njGvi0*F;fb`QU4P&@IT(!wNkljSYh2mW^D`}p_Oa9dR&P&_ z#-OQ`ow%vmow&%1n&J}0@`?)ZNQAlM##XOb1xc5&D8zgA7*|;8GuD9@jc}BRPX+)c zn!!i))e&CVF${1rS_Uq%IJWJ=H=jDOJR#BIs``??=s#?W{ZnFRWK&pi@j8|Vdtrz(w@3ufPRg1lgnXJE;W7Q-C&W#bz)fFq1nL&wz{*ozXKowk(RbE$HH4#X=!zJq#VztP5TBWVkIzVsea;=zLf`+ zSJ-~o0U zg)2k8p@%9)qMu!0BZZw-U2IKhK+3z57dyp(ML?n|!!u;~JqYXv4Pm%4k9eTlp})h3 z_aKm*7>&H%DR2~EgM9!;(A%?TkAkA28n8snvc9xyG!AF0aQU(Z_#zSWf$9*$3j{u| z%U9BVsOfmco8#w}tXQuO&xKDO+(`?W7*6@>uVF~t)oa%hETS&eP=?S>gaJXga0o~H zkz)`WQj3=?!HY;Cbi9b1+;xG=_E@hUO1E43I=0&~EZRs{U*+iVfo=U5c^D~|utv^0IaQpPB4kws>}^ucX$+UXUDET@T>v{ZFyz-*spURA=dc6+ z1X+=J``1}xW8*^*G8ho`!~~XCt&O=XdZTD1u?Rid`JLF2f+uZ{AO*(U6%3@l0)77r zFaCN@*uKQZ6^N_@LjFNui7Wn#WNolDHXq{LI zT9(*aS-yT}Tsf4Z5>& z9Zj!!caYgQ56)Cax$BzMtL-6nlCOR|OEA78*==LgBz7?|^_8S2U%wTzNda0N!UQL_ zFfmz2snV2bvqRzqqYostp<(=yz9nGSI1Xk4iZYOol|2R#Ia25HzP7d&dHr6DvhyHX zY)-37A0gFTp|Lmb-kmBrlJkx8Y=wGwaaT21J#mGXL7NvXT14Og{$^(7t_0aq&R<)< zx$NpJ0oRX`4=CvPaH!b`Ady8B1ffnqg7R<4>?F9RqKB% pw74C`LnP9b>l@&+OfD=^zFWu)Xjh%W|3^xam%Va6gLh^!Hz9@wkv8QI(D75QmII6crl z-%3S^{<1%{H2>t^=U152#2lOx+InC_J6|`l%SQ2_?yB`C7P{TvL_Ki(T(DYQ_>w~_ z1P;t5DgU8~Z1$b3*)HC-UJcHfPMKDe+L4J|CZ}C#QLSn1c813#I$cEM)7;6tIU*t- zR$ZPgqOsUU$etgoQni)(DbW zzka<+@l25bW3Qn$y(35N%$Pal!atVpVScX6UVRCcO==fM) zW8(D%5;D@#2bzoSp0u+|@E+}n|L33I+!GG@e??3H%ab%+~C8w{#r#~+?O3laa>+8$&7A~ww&`aEQ z`t7e}QEDa@0aNL>{@6^5*gxKwJ6xfaV4la{Zenp;On%#i@9*t1@*9-hx^x}uQV&}A z4qTJbONcpF8fH7%Q|H}$SEcH?w!}dV4f~21s*FW`u0?lFf4;y~I5}audL%T5HZamr zzW>673tikyXN9{mE`_(3b6)g|E|ZDTOVp1)Lf<-F{&I~(TdaluL}63JLwa3R{7G$E z-b7o($}s%I!ohZq^UT@vfB5({7YAkT_8M%lnIGV~Wy_Y)s*^fXymznG?!P|&rCoJ` zmj#EeR4iS0Z=HsJ@$sx@4t1%cqg>}{-n$ohK4TB1x%hX#+WjW8bh~PYA79^OW#5fV z+g3ZnEKy(H{`2F#VWqVxX7;f<3}q$Oa&yl&Z{NN13+rzxXp*kW^%`Q!oqfD+-MZd7 zYess$pTPLdm09xJwpH!)=<8W}Y5$Fdb&ouFwuQHrv4VqtPdxVIN*=!}FMR=$8yPGM0 ze9@{Mr+Vwt$*0L0r^Ve}sZ@06&Wh8^Wc7!gmabmyq?r5T3TLNaq}$r9yJjTcJkL9w z)PUI1rDwl=`=(#u?`M)`Q+{sj9=-1V=95V%IeS4+aP#inbOUp*!uoW3>o;%SxKEA` ztP1M?KDBt+vU66#M+S7qT}mMvbuw^kMm9Eah40@R;_Mx#g;Q2m6oEfJk#e@PABgfrQ~VLT#%#B+%y_e$jJI#!rg%zB47OGdanzX+&iO_KLVjXRvPo>ZeXZS> z7pHlSLR3K)8l_UuU%(vcuC;&v&tmV6CpWfv^fk!U3fM{`eXU|qAo2Wc{_KZ5%|LWISvpSPAc_&7?s?#k?mS7ULd-~2W>hLld-Os`)!FKx^Iqe63 z?G;_FFx=v#`Dn$*`QtV=IWfh;vSCo zMKdSe0DSj`65#|VfbS-d^_nfYbZPU@okDhx)b#j`Yk&X!CH`bAo9%$d&akglU~n=1 zif1oe^`O=8W4NNTn)mRJ37*g@*@6hFBQ8;Yz=ah0R0I&AhlF*zH~?x8z$vvKV`v}7Yz zk%{o@)kP1b8P;qZ!;1_@F3`#^s9wfMyNQChDq%> z|9ZxZ8M)S$@cHTf$Qr|90-5RW>V@GZc})cW?QN^%P`oEl}Ql;-)r{dO$+(A|sMuKP|5 zZr;3^3IIADDx;^HW^){4WiKstmBz)3smcytf=`>E-b19PFrie%_h+LDSYS1hCr5A-yO~S##>q{< z)|pWaVX~JM^phUUm^m}uPcYhGn7485+PCf9!xm$KQtBx!EtcpAeGr5SbO}N7&Kpwx z$H*`>ZR)IyJ!f_6&Yj^2e~cAo=PRbA!}48TgE7)(BRevkn^N#LUAV`GTh3muNij>r zshEyZ0KEFf#>QdXqf#bEBUN1vwR0Gp;o1@V?R~DbU6D6$-TD~%pVLry--D@HJ5p=G zT)gg39B|&QD(;?sva#DiZt2g%_~4-b{Py&lBi7;U_a2>73LcF2?++Y2aKKaN55?7Z z?W0k<<3E4?Jiq(Z_~Z|3wJdo9idDFJfPZz0nMvhy?aH|0(OcCvxwNs5pFjU%r+d$X z({m12)Um8tjh~+F+Pr1UahhwRTdi&D$I$v0r?295o<}%km*kXzdg$UvkJN?>ACBV~ z{PF{OzHDJIQG#0|_XzK(G=|>kJ=3YaNqA@I#PT2)j519swH$BL|L6xMK&d+y{AOU( zEqj>Bx~*XaAo)W~EbR0nqb%Bm*qoYncKWKO>L`QdiN~X_Td^NJsjAW??F?YM4?dAw zoA0s~^H8Gwef2-LZdH_oY&>U0QJ;xHz%vA$QS#ee93;gl_r7S7GWF!+)kTyz+-+yc zMh5$Z!%$mUHs)8}@_Nu5w>I|5^&2<(WEz11x)9;_wycoyRpU$hXv4z1|ym94X8^!N3qa2bcny|a6oZHpJtK!OB9d7YHLv0 zd_iB1LvhyWce5E6{=RWTuv>zTT8O#BIaSeG8m@zasLE{e?;e`!FPJu`ZJiYFVG=5_ zBkJAt1*OC517%lwWTX2ha@oI2NhwkjOtS{{q{3xaHWgY}^m>Il;bM3LA3`<;5#Aje z<*f;pz(>8Xa+_LLH@61rI6Ycw0Fvts`WA^2j5xi!^K3ji1^=X-D;0B|z##A&4N~te zam*6yp!o6Q0;YxHyWErT7_qjM&pY2OQm^`OZ(Vf^bt(Fns+d3iR65?NF?*{L!-Eex zJ>rl#P^ws9!+x*@-x5xM8ib@PgX?q>y$%eE2eZoqnIT9?uxi1|tp^H zh=ei7=*9)tFfACZO3$Y!7}Mo|$C1HOMf-kUo^h(>&Fc##6WYome3-l1sz?pt<@Z5l z>HGTT76nN$=Pun~$ypZt!d$I3wlzH4(QOg z7J~aZfU~loe2u}xd%wIq%NvaJzx9so0BNV6@9QPHaAC%+WwP}Emb`P}{-4G*iyFZh za$3Vodcf^cx1RfGcjo^G|(F`M5 zI+$0iLjquklF35X~7=^cr$&6JIeJ5I}r?b*K)*_9XkB-0;c`Dd3iYp4<0na zBUXcCwS9Wj?ZQwjn5=-Nu_AAdgZu*INkW5D7+(gg)l@@6!e&317|Y>;(dj`@HSj&w z7ULkdJAC;|ZS>38to&qEm$o?c)y|78|KKlN{Co`TJ_P@1ob4K~>{vhSv#5}YtEwGn zE*=3N7xMPM33wTqc0aN1m;cxZU5f-u=7>x#9w7go`#X{#-IQ5;WA>&iJ?o{VH?3K- zrZO@A7lU;bXi;f=?p)_`7>QBX{IX6+z@GWDjuP;q$y>`v?1=K}hVIk4cZRGQ(?}hK! zp#3lgeM;aBV&w@sLN~=!wO=QPbx}C!r8f9sos3ax%#|xwbhBM;?}~5N1P9_dlKH{Q z^O4=T(-`8stBw`RnRPnVWVMtO6CER~tgH{dWe1&oUEOjA4y!M_TLGj=^YrP{1irz& zyIdkdWepOHSXT2yMNdMvZTB5N&rt2+1x)+l!Zgsr1`ZBMJKefs9_{kbq!GGa@k~oA z`@CwAf?2j@mJZK%NSl1-lP6E?Aa0eNd6D0gNoPabFu`J%Z9Z{e5oP=_=b*=Ee-jgC zNW%GVZ!v@PF!e@iOq^S7B%wE|UR`Le%J=gDJMTcPdk+*YS2C6FdwqH4yx)HN439>J z+EtwxP7E2qlnH*~2@oAU4B2GEm-}ejtk^3W{l*&Wb3B-!qT8GrUL6_Ruc>*f=+4UM zkD;=%+qUU~a8|`oLwrX)c)4DF3ZfH@9!;D7`s)}`SuvvF;kcw2&HJ04;Gv25qXg72 z8kJ*2msfd#Il5vp#T|RHj~r9Dg4zAx;5D6ZX9WX>lR+#s%FE0B`&kLE#db zg~xF1s*0Bj+G{nbT3j$SYJwNmf;3M6=w${ew0~y|U<{jG6J1`jk>UIF?KM%K5Yq!- zOyRDFYYPGb`Z)zE&b*{cmqf}URCMsoLs`;x?t+ejeNK~JPwD-P%{o!L>rfNK)4FhAD>5W^oL^JwHaWr!NS`rl-j_L2zNf%)U#wKJGQ_d7cPjptMQQOjhpSX7sbH%C=H7+eeyg*}eF+h_J++5;bEa~CdZ42c^Py_Vz9C>SEOGNGVa`^W4 znm;qz@Z}j|uSigQU!h<;!XhJkYTt|c@rPdmaO&|#)^J)H+lu!U6%}&p*B9E= zrt~VUdjROO^rPoiXi3e5Uy>144G-n`fw}ASrbxVlCm;>R}N$;^yEJ$>LL9pKEW=8MmG! z=llR}eeulEw^}okZ(HgAr3A;2 zK}|*5TYFFc{r9h>5h~2Q!H=?(CMob;I0#()Rqt)Z{J*H?o66V(moaKHrvzixISmZD zB4I`$mRezQ15P1$5wvM4oPY>=9f(^p+9!-g``*}w#v2JE==#06c}o$0NJkRXd+S}DO8aBxWFL<{RFmuF!Vr`_*z%4@PSs8T z$o+3S|CH5F`q36NWGzWA>-pwPY(u{k`e0v9|3m41zFZK69~Y`%wzG8VJbVapQGjBB zZvhx40ond;u(~=JhK^`hWf-)#@7^65^*D3pDKQJi2b%M^4D|pWc%T(AW1F}ioU9mZ ztD^(f)8>hFdbo}$x|y^Red+wW8+TNIdMh|@n+oaYbQIyU8-4Gav-n>)9Bfl9+yd8S@sm=z}~8HB>}=fUcy zn8ttodWz5`6OB`+9y?`sZs@OVA0PK5W11)!Cl?qbc7rV?GzHT`7vW{wHRb1F^u?|{ zc*~R7)M|PCuDnS`90)UoYYU7So5s9==R*7y-#!mWno@SImVtZEm*d0|AWx66U`VA> z2_k{G^^EO|>9HRDpb6aeQwWP{%sL-WI3&J;9(bWRP?D!50ynl2)e)y5<)<5@E__AE zDR7ONeZH<70%pQgdF!T4hl$FAMKi^_et(KhSzcNq9MNzue$8-cVALH3ULqY~!hW0fXfrBbf-dX~`|1^==!HeHEGz>e~0zasCckyAFZBh zD)^(gT2uX0c*L_Om<#kzp1}$^twOdh9NTBX!NK#F4}`a5>SJ!vA@T37I_5DHge)u}*^77j4 zpB@d-pY5j+tBKJYlheTZfN^Y#chS_+8p_YKDPP+^J#*$v!UB5hSjE;!_{@`_n#50j zwBy3Q{=Bg$6(4Q>u0DWL4fN%dv4(z%t5qc1)JeT6$>=1|c&G393(ktljZ3r{XXGgq zb0j~NU=;Z?~|o$$opzE%o+S z>a5$Q@jX@}CG6_Rs{uQ+2Hs{EwK=abo!n3dTR@uzA6Tu_tpP?W$qdjA>4-<_fgp0A z=swLG4OuMQ?FS4w z%B~CF{~qfLNH$J)fFjNC8FPwIb$M>)(dfpDkis-#eg1r`8+NN76t1#IpQ-GLn16`l zYh^Y1dH*6KSJyPqsJF17&yF?0lLu@|*8!pItv^M+1aI=}AGMgYDk~IIFtwpMbbNl2 z0UtpChbUtoefRFaN+;hApp3RqM~ft!AJFSCIc(6gF4tA&D(2Y;P+do8V{II?vpoU8l|{tkc0?s*%# z1Gw7*3`)oJlmNmI91oP-HCcbX?%GhU=fHQuqPSTuv3~r{STW=$NE(KmmWqqpc{KTD z5+f8JG+AGum^VzDHEUKK@K+vpM-lWW5n-g1OMTE-D40?$UbFWldk54{Vao9S)I}+~uA|5}AGbu3(h$A|5nXsLWk1Z`|Ud9xz(o%`AxeX3Af8 ze)Qxj)dj-@dcWO}$~aSa%Lo)U87`c%dygTqmmw#XN545Kh*l1xiIjhL#k1R-MQ-k; zQ}l`N7!B?K2V+>~05n6Oau0;j=*n*JPe-WH7bNmB&waH(a%Yu5_bsq78PzGac=73j zx5d)8oGmhhfdp%#9)YZ58=LOWu^ad(%LJ1uBw|=x#i^%kcZe`BmtKe2nv8R&uxuR~ zv#U+=FScsh*QGv#2J{MQC;e1+)V=$I%)+{|JIy+efl~I+9~qAyukpbQ+S<4X+H`ch zImjgb#4|Yr9Qvu2REgc5FI0v;!1}i(jE5vgV-pkY43h4F-k-HvPPsDrdgdZS@H--Q z;mlcTg)5BsNLUHWdR#i$n}t0;Ta+H~pC0|l*ki4dsH1;*)LKf7-w{n=&7V3xX~2$~ z@#?F(Dr=E&)vJb0|5b+fSyHT-!rv;GS--T*j{3h1q9+%+5{+RMKU<`QjcW^4VNM6U z?j5V{0Vi}F?l}G|CdPE&tH{>^a*@lHE{%S@XF5tkAZa7=Iza4y%DXS_-uMk7C=sKm zgiS;fSi$5im3(+laFz8i)C_VLij1>94k&dXz3D=Jst1H%dN&jE3bmW!ttRrr`o1-0 z{n?b3K%|N!p(j2f4AgFX^hr30>#6WMDgcDK{~50u#HCF=S2|p#($oRJgaps{^ylDy z_L%RtZr(f&rI^{*A&=BrFF+ z6SmDE+Ay-s4%8%(hU=-sAve|&pK3<2o%4j3C< zm9at6wg}l_OQ!Zeo-xy{uR)c1qAA~RJ2IDK)2tI3fvfIGmqn_c#E7WEH;-f%Olhl6 z4Tlh71rBM0Ql!NoR@?-o=rh(A>iW%iEoA<2Fd7%ZpEF-?zt?>^5C$($#0^mp`aT|3 zNH&qwJ`89y>Ipp7dMf<2Tlgw?4`ibOXOjqRO^X3_12|g{VowkfbN?fo1b1ezEs;4f zh&ztCeh@kmE2twD3Cqj*BpQ|`2sx_>T|v@{hZHSqMIzgiW`n$u?U8eWEsS$0}Jlr*&h zaT4(r8_&O6KvVeD8>*043jcM(AxZx8(eHn~q&}m7u{RUUiAX4l+2ZBP2_ZgAd$`T^ zDdeyXd^V!#an0$tkJge94XEwfJ1dp$M@Gs~k;gxTVttMa27v6xI)s6#X(T30%h+R7 zNis3mh*zph^w&7(zz`8?DzLK6AWKI<&XA8bPj?{ zkecDSB{83&FuSp#QEP#n2>W~|)8L3=js>o)0&IBM;>Ax?c%JLt4FdAxKtrWmT{!Bq_dzw5k-dU2a`fn+@hHLCgi~zbm0;i_PaX zIIwl4t)K&Xa1xky67&hU0BNV*%ph&}OfxjQt$RAU4l4jiA>%M4EhJKn*b#;AS3M(_l#5r$7eYeb{(X0%c@_mQ_Y0|`R{~0;MT!81CXqMyt-CI~EXbI8L zeX?&BwE~mPzrEbjxvwEBD_e-XjmRV%#HZ@sS8{$<-e2u3`Aak~u=)z7{gcgd^mlpm zP3i<~HqhxC&ibAC?CP9FZ6Cc|-d&zKXPf1RVAIA!muJjMJO6E8b)rH4Lnb$LDzb40 z#MY3M_*@}7b$2OVViT2T`68Uy^+3d=U45_i!+@?j8>H68@&(PyM*LkJt+6QGru=Qh zx??nRuhwM%RbzChJ}4TQDhz>wNyZU!WbmiK3!Wh>@+uWmG*2QM4de?Un|@k!M(-8V z!SdiE#$&(`>+ksy`gfKub~?H~Ke-C2`W%zWhbfz4l6jQe7+EYjTQr}{&x#~Bipc#Fh8{rcuAEe805O`d&r*pI<-OCnTH9M+Zi$fQZS04O+)RU2^x2`YW< zi~w`ca$f%GEoc6QZjXkw_%rOmOoRXYpm)oU_Hi>ih&sE<=Xag*M)dWV=4NCoBt}%J zpb6x+>&we%@{qV=8C6xIjYlJofkgg+A&BSPv|+;`An8w2)j5cn&rcvfn1wyCSAuS^NKse%WjY0%o*u}w2AS9{>&|qcd4kcua!R4`w zs(kL_ACMCnpiw5k6-TIC{C&sgKS_Q8a0LBEFDAojQHB-VFT_k^5wA*+4XUq^B|!;qV18-n!@#mW&1JZ^og1?&Qx(CG+5xso0Yr>(4@wHO?KvLQuH#r~2pm?-j_ zdQ4YraG)DTg@S(gO8_WGn3WW6JnYQ7tJUfSeB@B6(3|7C^Wl+mk%WO+1-@iQmc;0Ed85?#(sjrc$qB(Tx1$kRh7Az(8aZcFh8I@` zj9dHRw#}6n?ntTg;5?s>kB_&q0==I{EL=?NGPc5`@B5;ndOUny@v4<8ZAHc8e$@={h7xY&Nlpv6S@PB?2cN zK{o=fC&2*YjiDFRh|%Y5C3v!LEFL08L!@zIBZZgA<{LE? zFzHjODEuWTC`ORe z(}L2Z(-aggIt(g6{9qo8*ZJLf+dlu)ft2Y7PW5Re(siIcTm5{Ua|f<3lQ*ss@Ie|k zl;jKf_WeG~=kUJ=oB}wvU90FBEMAk->=6&#ZGfeK0qVFij7T8__TT)}PQ4Z(B7{C= z@fenQr+iRg;OG_c<;$(fs*jO{`{n#$>sCY&|6Ogt_Cd$g{)iMDL(R*x8vWe>1EOCs z1=qfF9B5kCU&wjR@ExS)jeoxl-c^NUI;mi)*V%|Ngn0KV25&4BRlk9XV7g$55Xiie zGICGYc?)N12L~&=H-jrp#fAVO#jwelWG{j{cm8}`1Qs!(1s@>*tE|1yz4yT(L5>TH ziuiJZ&RB*tVHc&tTY4IE3~1ZHfBUz;!zL{R>^W}%JfkB80r8Q6O01F9yFHKL2gqPU zg)^o&wmH-lE*Y7dgs*DTw;r51XW{Uuht=887A4-W&eNXybS+?b$$17w?)YSORDQpL zkXKkS){ZcS5F?EGMD&5|opeQ)>V(UjQE)U8Yn-jia;fRgMa#+3s+=!w;$wVZ6_Sk1J zNOzpPF!3w@=EkUF$XZhK$nsDX-0i%{!P0Da%k)l zhZFu7)7xrijaFtzaoY$Wlb zObwsxAL&EH@|ig#H~}}*V5+SJGj!SN)e4)thng#<9)S;oJ$GZBpb}qqUXNQWRk`eu z8_^d~{-C0?&OstV@Dg+d5;I_QxUY{Osx422SphDsLzKbInT?i_K8#JXzmI{($Uv!kWa_u*jMUNSg47a}z2rbkp&D zi zdgL?Id}@5^%A}BfRU26NwdPrRPEU>515kMzV@N~_%<*d1z$k!hdq!9evYnII4j@vt z|KuLR#^KlH^SfjViZ7|h!Nlr@{H3OXXVn4WlyZ-$1qgjf?n5SElt15=EP~x#rCNbl zISDQJbDtLklQcZcYZWCW0SHzSY$Y+QIpZDE2;dWRL_#o%)sUZ?zVO9ru;~(k)}hl$ zCbXf%DW_MNi^Nsl^wnpwxlF7aEE55aQSCoBFi?wzC~8M!(7Xr-Y~H_st4V^;UW|^d zEK%o6%63&BP{hgbe8n)4;qUR98(yBh(dau=CMGHAh)R12;mXAhtOJ~1_eyOQqbK{W z^`MtnL+u=E{#qeMRPy0_Ye}j{T%;cSzAjK{>H_S{N*_}?6>O(?wGaE2n7keAz(?Di z8ov0<9Ky+FfWMl6E)qt5C~%c6%>gw^*21w^e-mzd1-$EX0F!j^vWIkH(vhvbTgw%l zfCxZGvJgU06kkHZH|zvo?d9ch*=#ZsWc3p6V;Q#=dq~dMkjWVB<(e28K2Q_%u)-cZ zunAHdeLzjcTh+sQbbu2h27i(KEO;kuG~y{BaXOIJh-scjkQ?b#o=%pf+x$sY|K(s- z*TCetJ|X-vQx)2s?Wp^aI#>q|7aF)^1Rrzn|Tz3H_{ z7n+M|;!keG7XRh3&3EzODYR085euT%b#n{SQoZB4HekA3vUfB9h}sPOAR; wU?BF2$k(+hLOD^9;9vgt|8`O}J#$CjKVF6{0eSeJg+-_bj~+%X9|(b;MOuNuDad^YQ`})t^-8yLYs`;#bDJ-L&0fDI4ng;a|@`XQO+| zX8Gpm1%^A{?r2}8yKJRxcULLxg!|nvH|k#U%g~CF(I`=Z^!clY2 zJ7WLv-ud%1=atr9djaovH8`(C-j7wQZXdP#vioe=THOcVwBvr=gn^Y2tNk=~O{P&Un_T|4~_^(O+ zLx%t0@IRXPj~o9J1pnVcDf@Z#qdRw=p1&-SR8vzEe3_PN-&Q9}QxT0uXKVA+%r}83 zo64>5r{K9bIk|ax7cn${P#qe~&CYW3@u`&B_MgQb6q-%9w6$I9q*_PaRaA^z&^c`y z@V}R7I>}GPP!AGiO=Nt@+HgSzR@R(>JfkH~;$8xNf1_E%erYb+OgEC(+>EpkpJPBs zKip}S`&eqf-&03nlk&*K4(6Xde$;29kts4UvEWX?NghE#HSuw;6fwJ@q?a#G3mBF0 z=dO&o^**Tj`IV2)t8Z=|=a<2|R7AnJOa(I8?yOJE`&_!ixJ&Q9w^F{8S3cg8bSJ=V zt#+H2msdF}E6eBiT(qb!*$%h6kdbXv?x1*nD&Bjwa=tI$q?%AxYg+4L)02wE*!wct ze~sW7DY1EfQP4OuO2Ei=p(ia?#<%Qne_n1WJ11WgmUq+pr==)%0C^(UE}5^btyz;A z(PrLF;!cydx0VLg6<(anO449N)}a`RTNx>hjE&81dc#UlXnv-t|G{HzoNYDR+FH!& zE5m!sf|{So@2uj)?2C7HyjaET^oK}sf0;ki$v3W4wb)5hQC2R#k?8l+m^Q`u1uchz zJ*kWaFN5j4{N8eJdrdAVdyV756Wkto*uH$s8dh0;`_I2S;>6444i?lgmpvUE^2af&gR*%mq!pG^ML>y z(aPRk@(T9p?azz-IT(xP(9&jh-*&^2$8^Rw#KZg2q?a#AG_JzNHA7EBsT-lQk zdxmVx(2#!h&UDDiOqiVPjIapG_h4%<&wXj&A~Um%sBK@Nkz;K?d36kHZOy~ObDd|$ ztiZHZzOHU}F~|O3ck6nq?A|hAQf$KS*8^;C`kNC+k6_2DN*~0Ca8=lSesaX4kx_3y z*V)YfV9R6Xjra(mOBPGRDpmpuZ*6TYbD8@(DLExA2$fL6Wa?FqtU*IV!{bMHvPjrk z-^{xYA0AszCFnJ-R7(`pl4DElNduo!QUrK-S{-UO?zOeF{Dq>vMGj#SI?t>^IXqC2 z#$$Z^+B^N!KE%+l+-x~{{_F14ki2Pt ztlv)IK)y+iEN(ZVLM=lrfq|Z0YZa%RXQ)H@B}YkV6CxV>Zm;V2_*Cf@nC88^rgU=f zcZVZBrAv-t>_|K)L%s~ht4b@g`SyE9oZhrY^BdNTK{J07_(TmXA&p(e=f^uG_A{%$ z?0C9{)Z9t- zLY!mWH#5ra;8jw*lxO~n^K98r|Br`@tyskDJ|I8BX2h2|>mh61_NQb3DE%Ng68k^O z_-YfZAJAO->-LEgC&C+ijjvw2wzZg3kZn@!VOZl;1P#_EU6&x`sT_V?^+QsgQF)Za z_uj}dNA&J8q04Q1%oF?NC7mG=Un{#adCbb%+O|9Cj^e-rH2Pbv0f7^pqgOBhYY7>1 zv|wx^|(%U0hxJGt@b7zdFQY z#T`E)=zHYY$sc7ThhE>c+8Ya&Dfz@hA1*E~o4K!%K7g|b6s`;tZtTbe5faYo(e+bc z-KyaSb3*=Sum?Y-1Jsn2&w4jKvL;VZ4kj+1KE9lhh!;T-069p&5DEheqm_g)xHea4 zngPLD%xUuTTheOHug*EtJAX}c8ld?V zVqgTuuQ`lE9DPN|`MIkpWBFR|gV>v`NMDPKi+hpAYkln-gBh)LH;4S8QPb+aXpGFz zcis~ATK^jm>nyV#^o)EbJ&FM3H(cR7)4n|Gcr@IuKU=4Mj#hRj2@Sg?4Lni}Al1=s zH(uj?y|t&eSD`E}Jp7TKsdrjTOzqZy(e+j_htW&Mb*}SjA;6Ea0p~GNbIzTKca-kl zy)RkaB@xnF={orm!ORPI$McyQLXY1s+0i_3xlG{;TkD-x#jVsz%b6OVPxzpgBj#JTG8?R-gqf2fRtX4&!v&?ZKU($UsQzcq( zZhSt5J+U~R9=83=g1o%^GuTK*7vl5h$Ju24BxcKivtRJ5!&b*c&i3u)8kQ=5`}S?I zJ6Yk~21BS-Z~BAaH*a)+ZlATW-h7;Nl7{8EUssxa#wVToNw6OU%8|S_uqwu)-$@k} z6>kfu{l}!-e!NwSmq^Yjs59j7-!J;;yLu}vJ>3?-b+Io?>lI1LXEU>1^~{+wSIV24 zn-lw;qcL_Fk}k6^IS-bd9mZ=6YJInL0j;dtKP30(=wacoF*RM^Qj~NaK72S`N8PM@ zu{o4YOHEC!h?t+4=gcH&G_U&T(WAiELYFZk25pI;5^X=;{MhVAB$Z;i6tuHV}=w6!Dht5>V8p1K_#${}aEh*y)l57!D$ z1!~4ZVZ-SqLAO*=O&rtcuIX|jYz5M!|CN4-}1_(X2hEqN(a-^)2Dp+@Zl_^206>g>m(h+pdw+0WuS{XgW7HKaWKKS;nVicWa5sZ>5@F+1HPEI)3NY1$ugS zP!=%;EnT;Db#5p~iflQ?yy`_A2{pjG@4nXO{C$3Y=~tJWkb6Az2sN{kot<3^ z;TeYT%Ke0Oa|%k zyr%taRMd5}ZGU!u7vA_Qs!oe|SUIng%*dyEoFnXOBwr4u>!Z)l)*F#AFt8 zE(~M^?_xanzs)&3JZxC&)MTA?aylsP&Ilx^C^vgyjH2*bWz`HHC2qp_SFtqGAGTdgYv_zi4h3`EEPB zVUyAYdELMN`JCtAI)DfHrrvXm_Ctktx}<-pzFX(IaRUovgA`u7D)mMF?q?^c8)U`i*o>0zyjV^ThW_kFhoLJ_D?noYv#Hh>$PP&}BUKa9sqv3e^LL^H>ljTgZB zDIlDAL`8K5R;1(aqoWMh?V&q~u$n`9CEtbISH(RXSmEhZP8icPr4M!}Dv&hKt+ys|yVy_Fn@9&vw8=t|;k2>?$T zcIhG5GHd8B4-ge6<@j*$^piWCn>?XTO&;l8cN|G&9r+d0XG4O6i{Y$D^y<bsOZVVM=3*TSS9A-ep_m%G(-QAW#fYcY6q>f=W}CUD!45{Do- z$ACDjbaHe{5hgbA9J4w_%YIH!XemRYz5TlSM>{wPLS`m6_S>gGfLxx6<;^bUXw2xb zljjQg3Tk>xaa%gr(TXCF&xX+Yc5P7tRzAioHy{6-u#=OUqRE)zM)P+)OTs>axGTjFj19k+s8bNb$E^;iS1{>7}OZGIGE6 z^qeNF<2^|POc;Q^o(3h6n*fT^cDCi+?${b$Z)z_Vg$V_Bk_qZL2dJL0j`))WoJbVE z!6yKz_@(3uFzVt9u<5(A@6|iE9Au2VW%QO!Zla4*9cy3K<9S@^@n_ z?$JdEqEK2u9*w43G&{GH<4m3>ZUpO@KgEMnck2)x)b9K4A89+7pSMCPPh2vOcV!iK z*w^V;76!po`}=zwWB?d8xf#ZShV+`MnNTTS+g_sbgg>R0yf)#VA2ii4TvPb=RE}<* zCJ}$ox%F44B)*AnTyB;twDtXs9FLU|!=gulRURwZP&Xz{^(X4(Rs_*%YN71jvvlAj z9=?0`&bBY}-MujOJV;t5B@rwWC?EXL9!OgUzj}pmc!_0e_*-|~T>XEQj7;4Jbw6QuZL zWlf=y`?dzn3czsO4@Y(xK7y9?zSYF)P?7w_0uqseAN#+$^xWJ^pioMn4X-YNgqErT zUCYSClu_lrv{-+N<6PwrwR`tofaFO9;^&r>G(=zoQ8nrIec3uHz&)SxE5EaV4+bfv z4=pR?Qd$ApoA>Hfd4I~@1Q%L-!jFJ_AEFrrcp7cc5P-E?5bh|4H-)n0NUc^VNO>$j zynFY#sozH9qc8UV^l!pp5BW+$O;RVSOFBhrtwsyLT31!|wL`_!Nia&vlHNyBK}ari zO06NmQ-f^Xps8;jK;Xz*T*n7t1t=y+d=i!Y&IN-Cuk-uu;=VitE?omS%xe8oLTi@X z4E+r??F32p&2itgEMVPwv>-s#vuHPNw?Pxn6O?`5nWi_vFJE@=tq}`=_+J=bC@rzr zR8PKoDE*Cpvn#^PcSSVh_3IM+!L9-9FBtNn55g9?P!wgZ^PLyUH{vGto1kvY*J^%+ z;=t{RfszRc3oAdx;n&@+c8JD;`dgU}5h_y*xi}2PvhpcJuo$Y*0FTFKwS{rWIUvBe zQaWe|w%UHQ;v2iy<&jn z!z}WpZfBa>7w(-04O>s`pOKz!2#55BU1kL05I&U$4@x0ZFaWg#hUCOJrX$uW+zu3e zRAi*i@`iquTNb)Fh~1~9?)P`rJzzopTepTehnI&59m^Cm%l)Ee_J1uMtmyCg1kaBL zdqj$_la!vZb6{F(s=lpl_P^@}MUZ1$S&aBnbH^0euYoFeEGsxL+~MzekLfS33a^`9 zlJ+V@_y<~^eGiUqd8o+3qhCkQ0K`+r@@(Qax%JP-1`5p;NJM}Cmc}i0QJ2~KA+KH) zfsh>mIJ5sb+lr(Y1z=R25|#>x<5iw(4q(iqqN6cz%x7a>n*+J%=I9EFF(y{lKl)pQ^Xe zA4#Q~!0+Xui=oF!5j4qH$afh3d`L z&Uz$Nvo7DV0u)mQ;a6L0Yf&IIQ*7$r+#T(})GO(64#lruzt)TnLj7t4p`;ov;I(^X z8(tXDLEZ&0t&ylu!{h5p?S^|+tCj$5eWBsob)H z;5&+;I8P8krbPocb)>7tJc3IV1B{})Y6!)}{C}JtdVYrf+0y*%?9h`V$Lv6gnXjdk z#NdMCZgIuW_?B7goteK(i}83j&9IF!-H~A873cqI>*h@@?)gF0ZOo9{Arha@&8L9CmfSO`BecTPQ<&)8#fEXYE2fXJK^cH_Q zS=Z?UOMLqD>0ebS#;cQ^inyVjC09ekSV_;-T#(_X1}j&}NShEkJRs^9SzWa89 z$v6qX_@o(;uk9Qw(7vXNi%Sb07>8xw6C!-Ls~ePh;ON@VHlgU46GA55WA1}CqZQ6R z5GIsDhtGZgo((mY4T^k-^j0}>IE52*3U#HvkIj6;!a%M;%IN6mqvjpRVo#VI%`_v{ zflx01t)NY$9IT0gVC~O0G3se;3$?~zf{evPL_{K#o?Y6j$v{Hch`qC&32Y)n z;Tk|fN1xtaCpM^{Ul0-jm~19LKV2Lt%|YZK0M$Jt@P4%vomye=ry8zf8`}G8TU#$6 zrhF6BpBDOTs3)|r&tg_aiQ9ta)4*@N3;^@<>OdHV* ze%FnF$xx;NJEeoBS`boffxbEE$k!Fe1~yS~{IsO#QDE_G2ukj~zLcD-5OlH9f2!1h zdXQQ8(OoC8b@0fD%wW0YVyRE!R`bR*@#HkPLj5y?sxf&t2lDCM;ohqoA0L92h=_~J zDY9s`h2sxri0{fzZO-H0lj!9a$e`X9mNX*dJa-KZLRH`Qj+~D_y?yBb<+K<5oK4d0 zA#f{{@)coW4T#y0zzMFzx_|tM+t0yLB%lG+#P9AcfiiPj=urei__eD`57zaJqNt>V z2#5D>E@iI}ONp6%tEQ&lKWr79m6UWFK6!=UcE1OF8e?&yJjUlDaHt9>eKkPWdXntn z&del{587dN*3y2WPR25q$=K;BWT84>I1xqRSi7a`M2>Cn92KgZy#Nd)n`x%fo0yQ_?fA8K~2-Njzz8bMA!3&i`rkPN!E?Tr%sD; zmSC%e(PFsW%?stuK#E41n&GfjT^`Fr=FnNCkU>ncio>cPt(HPY0|;Z0hcSr;%F4l| zHoZ-txiuDlHi$1G7**}LRt9d)5HfrONZj-&_)IfHV~YasxSF?%4+okp3B_DM#8t@sK;jC-gx% zAVY=4fjlfUD$u$Wct0`AmOoU~)yv@wN7`dh0%BrfJNI;LNPqDiHf+E{h@i>ya+Klr z_PWDeY&AIDkQ%htt|AE}HSRrw->-RONYv7D-w5;poOtb!#Rh5OZ~*Z;V8@D(%T70j zWY43S%@bK1TAPi8d6z@=iWoA(f@u=$Q`vl?zpQ0$B7Qf^eW9lj z1f1yO?#}=sbo<&3Pmi6-^`{(OWMaa=l?YG*hCt$gjLpD8cHi4$%)4wi8mNWzVZI^2 z%llQZayERj9Tm9N5*O1Ef2((-+>t{hu1U`f$7o#lsPXL5SamtL!jr^Ah`EE7GfM0u z7=n7No6g+m2Jv19THOE)qs+z^`bPF3P{%`S{uEy+%KooB(6os3s-_(71)#$Ar)d2P zSwwAzke;pSf}smP_#2@q*WGrWsml`t z(du9Wum8(3g7LSb#d6fqPtVU^l7XVWLO6Gzxv$lpdDLq?EPnVD@w~AE0~P)R@~YSz z*}~(q(48q!@h8EbQUANw3wf7s>t$(jSw`7X-5#Euoy}B^T&FydTFw~;x&Gtx(__Fv zeA|;$lZgg^o)HldsmhTJz7Cf?l8#VO^lMK3KVM|j`F`t6w2)ao$Tc(TbZma*J(z>@ zZ+G_g_CmPEst5yhUskGhtj>2#H~2&!a3r8<2#K}7kkm?Cd>i9iAor>R6EMn)1c6tL*&Ac1+W zT~h#j*9Jth9mr)KB||op2{RW%n39ED6zG9zMg(MokP4lQ?ux&qg-p&6Zveb;AAxJ@ zu8(=pB%%(Z`r(@}WwHg9vjqg?TzDfs{t(J;aj<|wIL|`0e@%M_+l_>{g4N3+Z&*Z? zuPKFUTU)1tD9Ef2IHeN4TDxtEP$@!4JW^6d;Wq(pkUo|Ph1t@($Q%G>fZCho=cq7>fu|&a;vlpi z1P#r|%$x;x&4K6yQ=<;nhBFIbCp;BWM<8%yb%;J`Y3a6#Ho1;Qh^CRrEEi0IA#yVq z7+G2)Ll7inha_sT<=wTBTHkW`XZrK!&w~$M9GT?j`4#uvN)&)gz@!QWejPo)=KT;U zA~B}zuT zu;L8f2G@)szvkuU?uKq=WMdORBjqqXGsDHRBhn1_aD%BhpOBC`2;l+PqJA(BE-Um@ zoq@Hx1N0fr*nM7kFi7J@@Vb^j+H2mNaUgQa?L;UkmL ze=cLXA(|clRC|_~kGvcJq{N3_9IvfL1|-1seAlnvLy`h0Qte6?D{vWF;4!*kOE}SR zDIK6wWI6?QXvO-_QOJ DS^k=j literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/simple-babel-standalone-js-simple-when-using-babel-standalone-should-render-ui-1-snap.png b/__tests__/__image_snapshots__/html/simple-babel-standalone-js-simple-when-using-babel-standalone-should-render-ui-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecccb151f09fe1f88a714f093cc6d78caa27052 GIT binary patch literal 15484 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 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-middlware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png b/__tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-middlware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..ef517bd0361f706538fd9ed7d0cc5a30ed113203 GIT binary patch literal 5987 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 Hc + + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxMiddleware/changeModality.js b/__tests__/html/sendBoxMiddleware/changeModality.js new file mode 100644 index 0000000000..792772b7c6 --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/changeModality.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxMiddlware', () => { + test('should change modality based on last activity received', () => runHTML('sendBoxMiddleware/changeModality')); +}); diff --git a/__tests__/html/sendBoxMiddleware/decorate.html b/__tests__/html/sendBoxMiddleware/decorate.html new file mode 100644 index 0000000000..20b8582a08 --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/decorate.html @@ -0,0 +1,47 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxMiddleware/decorate.js b/__tests__/html/sendBoxMiddleware/decorate.js new file mode 100644 index 0000000000..932239a3f4 --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/decorate.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxMiddlware', () => { + test('should decorate default send box', () => runHTML('sendBoxMiddleware/decorate')); +}); diff --git a/__tests__/html/sendBoxMiddleware/replace.html b/__tests__/html/sendBoxMiddleware/replace.html new file mode 100644 index 0000000000..d1424f397e --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/replace.html @@ -0,0 +1,35 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxMiddleware/replace.js b/__tests__/html/sendBoxMiddleware/replace.js new file mode 100644 index 0000000000..8c6d855ea2 --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/replace.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxMiddlware', () => { + test('should replace default send box', () => runHTML('sendBoxMiddleware/replace')); +}); diff --git a/__tests__/html/sendBoxMiddleware/returnFalse.html b/__tests__/html/sendBoxMiddleware/returnFalse.html new file mode 100644 index 0000000000..c16b0ea361 --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/returnFalse.html @@ -0,0 +1,34 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxMiddleware/returnFalse.js b/__tests__/html/sendBoxMiddleware/returnFalse.js new file mode 100644 index 0000000000..5c0e05a32b --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/returnFalse.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxMiddlware', () => { + test('when return false should hide default send box', () => runHTML('sendBoxMiddleware/returnFalse')); +}); diff --git a/__tests__/html/sendBoxMiddleware/warnIfInvalid.html b/__tests__/html/sendBoxMiddleware/warnIfInvalid.html new file mode 100644 index 0000000000..79e0228fc5 --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/warnIfInvalid.html @@ -0,0 +1,28 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxMiddleware/warnIfInvalid.js b/__tests__/html/sendBoxMiddleware/warnIfInvalid.js new file mode 100644 index 0000000000..76d51113cf --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/warnIfInvalid.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxMiddlware', () => { + test('when passing invalid should warn and show default send box', () => runHTML('sendBoxMiddleware/warnIfInvalid')); +}); diff --git a/__tests__/html/simple.babelStandalone.html b/__tests__/html/simple.babelStandalone.html new file mode 100644 index 0000000000..ec77a9cb6f --- /dev/null +++ b/__tests__/html/simple.babelStandalone.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + +
+ + + diff --git a/__tests__/html/simple.babelStandalone.js b/__tests__/html/simple.babelStandalone.js new file mode 100644 index 0000000000..4defcfc4df --- /dev/null +++ b/__tests__/html/simple.babelStandalone.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('simple', () => { + test('when using @babel/standalone should render UI.', () => runHTML('simple.babelStandalone.html')); +}); diff --git a/packages/api/package-lock.json b/packages/api/package-lock.json index 68732b23f3..4631230e3b 100644 --- a/packages/api/package-lock.json +++ b/packages/api/package-lock.json @@ -12,10 +12,12 @@ "globalize": "1.7.0", "math-random": "2.0.1", "prop-types": "15.8.1", + "react-chain-of-responsibility": "^0.1.0", "react-redux": "7.2.9", "redux": "5.0.0", "simple-update-in": "2.2.0", - "use-ref-from": "^0.1.0" + "use-ref-from": "^0.1.0", + "valibot": "^0.30.0" }, "devDependencies": { "@babel/cli": "^7.18.10", @@ -33,6 +35,7 @@ "globalize-compiler": "^1.1.1", "iana-tz-data": "^2019.1.0", "node-dev": "^8.0.0", + "type-fest": "^4.15.0", "typescript": "^5.3.2" }, "peerDependencies": { @@ -3503,6 +3506,19 @@ "react-is": "^16.13.1" } }, + "node_modules/react-chain-of-responsibility": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/react-chain-of-responsibility/-/react-chain-of-responsibility-0.1.0.tgz", + "integrity": "sha512-bNBPtXPOiOOjV8EqVouFRP3Ip0arQtROO8uvoJaOe9CrLp5ehu/zEDq2vxTh9imopPmB7CG/M4ecMbfhYI18XA==", + "dependencies": { + "@babel/runtime-corejs3": "^7.24.1", + "prop-types": "^15.8.1", + "react-chain-of-responsibility": "^0.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -3832,6 +3848,18 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/type-fest": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.15.0.tgz", + "integrity": "sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", @@ -3929,6 +3957,11 @@ "react": ">=16.8.0" } }, + "node_modules/valibot": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.30.0.tgz", + "integrity": "sha512-5POBdbSkM+3nvJ6ZlyQHsggisfRtyT4tVTo1EIIShs6qCdXJnyWU5TJ68vr8iTg5zpOLjXLRiBqNx+9zwZz/rA==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6568,6 +6601,16 @@ "react-is": "^16.13.1" } }, + "react-chain-of-responsibility": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/react-chain-of-responsibility/-/react-chain-of-responsibility-0.1.0.tgz", + "integrity": "sha512-bNBPtXPOiOOjV8EqVouFRP3Ip0arQtROO8uvoJaOe9CrLp5ehu/zEDq2vxTh9imopPmB7CG/M4ecMbfhYI18XA==", + "requires": { + "@babel/runtime-corejs3": "^7.24.1", + "prop-types": "^15.8.1", + "react-chain-of-responsibility": "^0.1.0" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -6827,6 +6870,12 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "type-fest": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.15.0.tgz", + "integrity": "sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==", + "dev": true + }, "typescript": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", @@ -6886,6 +6935,11 @@ "use-ref-from": "^0.1.0" } }, + "valibot": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.30.0.tgz", + "integrity": "sha512-5POBdbSkM+3nvJ6ZlyQHsggisfRtyT4tVTo1EIIShs6qCdXJnyWU5TJ68vr8iTg5zpOLjXLRiBqNx+9zwZz/rA==" + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/packages/api/package.json b/packages/api/package.json index b30bc099c9..4629839b30 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -62,6 +62,7 @@ "globalize-compiler": "^1.1.1", "iana-tz-data": "^2019.1.0", "node-dev": "^8.0.0", + "type-fest": "^4.15.0", "typescript": "^5.3.2" }, "dependencies": { @@ -69,10 +70,12 @@ "globalize": "1.7.0", "math-random": "2.0.1", "prop-types": "15.8.1", + "react-chain-of-responsibility": "^0.1.0", "react-redux": "7.2.9", "redux": "5.0.0", "simple-update-in": "2.2.0", - "use-ref-from": "^0.1.0" + "use-ref-from": "^0.1.0", + "valibot": "^0.30.0" }, "peerDependencies": { "react": ">= 16.8.6", diff --git a/packages/api/src/hooks/Composer.tsx b/packages/api/src/hooks/Composer.tsx index 375ee980ae..ab4b7c65f5 100644 --- a/packages/api/src/hooks/Composer.tsx +++ b/packages/api/src/hooks/Composer.tsx @@ -64,6 +64,8 @@ import createCustomEvent from '../utils/createCustomEvent'; import isObject from '../utils/isObject'; import mapMap from '../utils/mapMap'; import normalizeLanguage from '../utils/normalizeLanguage'; +import { SendBoxMiddlewareProvider, type SendBoxMiddleware } from './internal/SendBoxMiddleware'; +import { SendBoxToolbarMiddlewareProvider, type SendBoxToolbarMiddleware } from './internal/SendBoxToolbarMiddleware'; import Tracker from './internal/Tracker'; import { default as WebChatAPIContext } from './internal/WebChatAPIContext'; import WebChatReduxContext, { useDispatch } from './internal/WebChatReduxContext'; @@ -215,6 +217,8 @@ type ComposerCoreProps = Readonly<{ ) => string; scrollToEndButtonMiddleware?: OneOrMany; selectVoice?: (voices: (typeof window.SpeechSynthesisVoice)[], activity: WebChatActivity) => void; + sendBoxMiddleware?: readonly SendBoxMiddleware[] | undefined; + sendBoxToolbarMiddleware?: readonly SendBoxToolbarMiddleware[] | undefined; sendTypingIndicator?: boolean; styleOptions?: StyleOptions; toastMiddleware?: OneOrMany; @@ -244,6 +248,8 @@ const ComposerCore = ({ renderMarkdown, scrollToEndButtonMiddleware, selectVoice, + sendBoxMiddleware, + sendBoxToolbarMiddleware, sendTypingIndicator, styleOptions, toastMiddleware, @@ -563,8 +569,12 @@ const ComposerCore = ({ return ( - {typeof children === 'function' ? children(context) : children} - + + + {typeof children === 'function' ? children(context) : children} + + + {onTelemetry && } diff --git a/packages/api/src/hooks/internal/SendBoxMiddleware.ts b/packages/api/src/hooks/internal/SendBoxMiddleware.ts new file mode 100644 index 0000000000..21c5dc4b89 --- /dev/null +++ b/packages/api/src/hooks/internal/SendBoxMiddleware.ts @@ -0,0 +1,48 @@ +import { warnOnce } from 'botframework-webchat-core'; +import { createChainOfResponsibility, type ComponentMiddleware } from 'react-chain-of-responsibility'; +import { type EmptyObject } from 'type-fest'; +import { any, array, custom, safeParse, type Output } from 'valibot'; + +type SendBoxMiddlewareProps = { className?: string | undefined }; +type SendBoxMiddlewareRequest = EmptyObject; +type SendBoxMiddleware = ComponentMiddleware; + +const validateSendBoxMiddleware = custom( + input => typeof input === 'function', + 'Middleware must be a function.' +); + +const sendBoxMiddlewareSchema = array(any([validateSendBoxMiddleware])); + +const isSendBoxMiddleware = (middleware: unknown): middleware is Output => + safeParse(sendBoxMiddlewareSchema, middleware).success; + +const warnInvalid = warnOnce('"sendBoxMiddleware" prop is invalid'); + +const rectifySendBoxMiddleware = (middleware: unknown): readonly SendBoxMiddleware[] => { + if (middleware) { + if (isSendBoxMiddleware(middleware)) { + return Object.isFrozen(middleware) ? middleware : Object.freeze([...middleware]); + } + + warnInvalid(); + } + + return Object.freeze([]); +}; + +const { Provider: SendBoxMiddlewareProvider, Proxy: SendBoxMiddlewareProxy } = createChainOfResponsibility< + SendBoxMiddlewareRequest, + SendBoxMiddlewareProps +>(); + +export { + SendBoxMiddlewareProvider, + SendBoxMiddlewareProxy, + rectifySendBoxMiddleware, + type SendBoxMiddleware, + type SendBoxMiddlewareProps, + type SendBoxMiddlewareRequest +}; + +// TODO: [P1] Dedupe with SendBoxToolbarMiddleware. diff --git a/packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts b/packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts new file mode 100644 index 0000000000..ea68da395d --- /dev/null +++ b/packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts @@ -0,0 +1,46 @@ +import { warnOnce } from 'botframework-webchat-core'; +import { createChainOfResponsibility, type ComponentMiddleware } from 'react-chain-of-responsibility'; +import { type EmptyObject } from 'type-fest'; +import { any, array, custom, safeParse, type Output } from 'valibot'; + +type SendBoxToolbarMiddlewareProps = { className?: string | undefined }; +type SendBoxToolbarMiddlewareRequest = EmptyObject; +type SendBoxToolbarMiddleware = ComponentMiddleware; + +const validateSendBoxToolbarMiddleware = custom( + input => typeof input === 'function', + 'Middleware must be a function.' +); + +const sendBoxToolbarMiddlewareSchema = array(any([validateSendBoxToolbarMiddleware])); + +const isSendBoxToolbarMiddleware = (middleware: unknown): middleware is Output => + safeParse(sendBoxToolbarMiddlewareSchema, middleware).success; + +const warnInvalid = warnOnce('botframework-webchat: "sendBoxToolbarMiddleware" prop is invalid.'); + +const rectifySendBoxToolbarMiddleware = (middleware: unknown): readonly SendBoxToolbarMiddleware[] => { + if (middleware) { + if (isSendBoxToolbarMiddleware(middleware)) { + return Object.isFrozen(middleware) ? middleware : Object.freeze([...middleware]); + } + + warnInvalid(); + } + + return Object.freeze([]); +}; + +const { Provider: SendBoxToolbarMiddlewareProvider, Proxy: SendBoxToolbarMiddlewareProxy } = + createChainOfResponsibility(); + +export { + SendBoxToolbarMiddlewareProvider, + SendBoxToolbarMiddlewareProxy, + rectifySendBoxToolbarMiddleware, + type SendBoxToolbarMiddleware, + type SendBoxToolbarMiddlewareProps, + type SendBoxToolbarMiddlewareRequest +}; + +// TODO: [P1] Dedupe with SendBoxToolbarToolbarMiddleware. diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 63049542f2..f7d012cf1b 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -2,10 +2,25 @@ import StyleOptions, { StrictStyleOptions } from './StyleOptions'; import defaultStyleOptions from './defaultStyleOptions'; import * as hooks from './hooks'; import Composer, { ComposerProps } from './hooks/Composer'; +import { + SendBoxMiddlewareProxy, + rectifySendBoxMiddleware, + type SendBoxMiddleware, + type SendBoxMiddlewareProps, + type SendBoxMiddlewareRequest +} from './hooks/internal/SendBoxMiddleware'; +import { + SendBoxToolbarMiddlewareProxy, + rectifySendBoxToolbarMiddleware, + type SendBoxToolbarMiddleware, + type SendBoxToolbarMiddlewareProps, + type SendBoxToolbarMiddlewareRequest +} from './hooks/internal/SendBoxToolbarMiddleware'; import concatMiddleware from './hooks/middleware/concatMiddleware'; import { localize } from './localization/Localize'; import normalizeStyleOptions from './normalizeStyleOptions'; import ActivityMiddleware, { ActivityComponentFactory } from './types/ActivityMiddleware'; +import { type ActivityStatusMiddleware, type RenderActivityStatus } from './types/ActivityStatusMiddleware'; import AttachmentForScreenReaderMiddleware, { AttachmentForScreenReaderComponentFactory } from './types/AttachmentForScreenReaderMiddleware'; @@ -19,9 +34,18 @@ import TypingIndicatorMiddleware, { RenderTypingIndicator } from './types/Typing import WebSpeechPonyfill from './types/WebSpeechPonyfill'; import WebSpeechPonyfillFactory from './types/WebSpeechPonyfillFactory'; -import type { ActivityStatusMiddleware, RenderActivityStatus } from './types/ActivityStatusMiddleware'; - -export { Composer, concatMiddleware, defaultStyleOptions, hooks, localize, normalizeStyleOptions }; +export { + Composer, + SendBoxMiddlewareProxy, + SendBoxToolbarMiddlewareProxy, + concatMiddleware, + defaultStyleOptions, + hooks, + localize, + normalizeStyleOptions, + rectifySendBoxMiddleware, + rectifySendBoxToolbarMiddleware +}; export type { ActivityComponentFactory, @@ -43,6 +67,12 @@ export type { RenderTypingIndicator, ScrollToEndButtonComponentFactory, ScrollToEndButtonMiddleware, + SendBoxMiddleware, + SendBoxMiddlewareProps, + SendBoxMiddlewareRequest, + SendBoxToolbarMiddleware, + SendBoxToolbarMiddlewareProps, + SendBoxToolbarMiddlewareRequest, StrictStyleOptions, StyleOptions, ToastMiddleware, diff --git a/packages/component/package-lock.json b/packages/component/package-lock.json index d9f86e9d3a..3f37373263 100644 --- a/packages/component/package-lock.json +++ b/packages/component/package-lock.json @@ -21,6 +21,7 @@ "memoize-one": "6.0.0", "merge-refs": "1.2.2", "prop-types": "15.8.1", + "react-chain-of-responsibility": "^0.1.0", "react-dictate-button": "2.0.1", "react-film": "3.1.1-main.df870ea", "react-redux": "7.2.9", @@ -28,7 +29,8 @@ "react-scroll-to-bottom": "4.2.0", "redux": "5.0.0", "simple-update-in": "2.2.0", - "use-ref-from": "0.1.0" + "use-ref-from": "^0.1.0", + "valibot": "^0.30.0" }, "devDependencies": { "@babel/cli": "^7.18.10", @@ -4156,6 +4158,36 @@ "react-is": "^16.13.1" } }, + "node_modules/react-chain-of-responsibility": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/react-chain-of-responsibility/-/react-chain-of-responsibility-0.1.0.tgz", + "integrity": "sha512-bNBPtXPOiOOjV8EqVouFRP3Ip0arQtROO8uvoJaOe9CrLp5ehu/zEDq2vxTh9imopPmB7CG/M4ecMbfhYI18XA==", + "dependencies": { + "@babel/runtime-corejs3": "^7.24.1", + "prop-types": "^15.8.1", + "react-chain-of-responsibility": "^0.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-chain-of-responsibility/node_modules/@babel/runtime-corejs3": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", + "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/react-chain-of-responsibility/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/react-dictate-button": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/react-dictate-button/-/react-dictate-button-2.0.1.tgz", @@ -4800,6 +4832,11 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/valibot": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.30.0.tgz", + "integrity": "sha512-5POBdbSkM+3nvJ6ZlyQHsggisfRtyT4tVTo1EIIShs6qCdXJnyWU5TJ68vr8iTg5zpOLjXLRiBqNx+9zwZz/rA==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7832,6 +7869,32 @@ "react-is": "^16.13.1" } }, + "react-chain-of-responsibility": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/react-chain-of-responsibility/-/react-chain-of-responsibility-0.1.0.tgz", + "integrity": "sha512-bNBPtXPOiOOjV8EqVouFRP3Ip0arQtROO8uvoJaOe9CrLp5ehu/zEDq2vxTh9imopPmB7CG/M4ecMbfhYI18XA==", + "requires": { + "@babel/runtime-corejs3": "^7.24.1", + "prop-types": "^15.8.1", + "react-chain-of-responsibility": "^0.1.0" + }, + "dependencies": { + "@babel/runtime-corejs3": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", + "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "requires": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + } + } + }, "react-dictate-button": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/react-dictate-button/-/react-dictate-button-2.0.1.tgz", @@ -8325,6 +8388,11 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, + "valibot": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.30.0.tgz", + "integrity": "sha512-5POBdbSkM+3nvJ6ZlyQHsggisfRtyT4tVTo1EIIShs6qCdXJnyWU5TJ68vr8iTg5zpOLjXLRiBqNx+9zwZz/rA==" + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/packages/component/package.json b/packages/component/package.json index 28fb32c240..04fc07af05 100644 --- a/packages/component/package.json +++ b/packages/component/package.json @@ -108,6 +108,7 @@ "memoize-one": "6.0.0", "merge-refs": "1.2.2", "prop-types": "15.8.1", + "react-chain-of-responsibility": "^0.1.0", "react-dictate-button": "2.0.1", "react-film": "3.1.1-main.df870ea", "react-redux": "7.2.9", @@ -115,7 +116,8 @@ "react-scroll-to-bottom": "4.2.0", "redux": "5.0.0", "simple-update-in": "2.2.0", - "use-ref-from": "0.1.0" + "use-ref-from": "^0.1.0", + "valibot": "^0.30.0" }, "peerDependencies": { "react": ">= 16.8.6", diff --git a/packages/component/src/BasicWebChat.tsx b/packages/component/src/BasicWebChat.tsx index 97f80708f4..98d8b7d40c 100644 --- a/packages/component/src/BasicWebChat.tsx +++ b/packages/component/src/BasicWebChat.tsx @@ -1,18 +1,17 @@ /* eslint no-magic-numbers: ["error", { "ignore": [0, 1, 2] }] */ /* eslint react/no-unsafe: off */ -import { hooks } from 'botframework-webchat-api'; +import { SendBoxMiddlewareProxy, hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { FC } from 'react'; -import AccessKeySinkSurface from './Utils/AccessKeySink/Surface'; import BasicConnectivityStatus from './BasicConnectivityStatus'; -import BasicSendBox from './BasicSendBox'; import BasicToaster from './BasicToaster'; import BasicTranscript from './BasicTranscript'; -import useStyleSet from './hooks/useStyleSet'; +import AccessKeySinkSurface from './Utils/AccessKeySink/Surface'; import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; +import useStyleSet from './hooks/useStyleSet'; const { useStyleOptions } = hooks; @@ -66,7 +65,7 @@ const BasicWebChat: FC = ({ className, role }) => { {!options.hideToaster && } - {!options.hideSendBox && } + ); }; diff --git a/packages/component/src/Composer.tsx b/packages/component/src/Composer.tsx index 3f270fe8e4..8beac20366 100644 --- a/packages/component/src/Composer.tsx +++ b/packages/component/src/Composer.tsx @@ -1,12 +1,23 @@ import createEmotion from '@emotion/css/create-instance'; -import { Composer as APIComposer, hooks, WebSpeechPonyfillFactory } from 'botframework-webchat-api'; +import type { + ComposerProps as APIComposerProps, + SendBoxMiddleware, + SendBoxToolbarMiddleware +} from 'botframework-webchat-api'; +import { + Composer as APIComposer, + hooks, + rectifySendBoxMiddleware, + rectifySendBoxToolbarMiddleware, + WebSpeechPonyfillFactory +} from 'botframework-webchat-api'; import { singleToArray } from 'botframework-webchat-core'; import classNames from 'classnames'; import MarkdownIt from 'markdown-it'; import PropTypes from 'prop-types'; +import type { FC, ReactNode } from 'react'; import React, { memo, useCallback, useMemo, useRef, useState } from 'react'; import { Composer as SayComposer } from 'react-say'; -import createStyleSet from './Styles/createStyleSet'; import createDefaultAttachmentMiddleware from './Attachment/createMiddleware'; import Dictation from './Dictation'; @@ -30,17 +41,16 @@ import ActivityTreeComposer from './providers/ActivityTree/ActivityTreeComposer' import SendBoxComposer from './providers/internal/SendBox/SendBoxComposer'; import ModalDialogComposer from './providers/ModalDialog/ModalDialogComposer'; import useTheme from './providers/Theme/useTheme'; +import createDefaultSendBoxMiddleware from './SendBox/createMiddleware'; +import createStyleSet from './Styles/createStyleSet'; +import { type ContextOf } from './types/ContextOf'; +import { type FocusSendBoxInit } from './types/internal/FocusSendBoxInit'; +import { type FocusTranscriptInit } from './types/internal/FocusTranscriptInit'; import addTargetBlankToHyperlinksMarkdown from './Utils/addTargetBlankToHyperlinksMarkdown'; import createCSSKey from './Utils/createCSSKey'; import downscaleImageToDataURL from './Utils/downscaleImageToDataURL'; import mapMap from './Utils/mapMap'; -import type { ComposerProps as APIComposerProps } from 'botframework-webchat-api'; -import type { FC, ReactNode } from 'react'; -import type { ContextOf } from './types/ContextOf'; -import { type FocusSendBoxInit } from './types/internal/FocusSendBoxInit'; -import { type FocusTranscriptInit } from './types/internal/FocusTranscriptInit'; - const { useGetActivityByKey, useReferenceGrammarID, useStyleOptions } = hooks; const node_env = process.env.node_env || process.env.NODE_ENV; @@ -294,6 +304,8 @@ const Composer: FC = ({ extraStyleSet, renderMarkdown, scrollToEndButtonMiddleware, + sendBoxMiddleware: sendBoxMiddlewareFromProps, + sendBoxToolbarMiddleware: sendBoxToolbarMiddlewareFromProps, styleOptions, styleSet, suggestedActionsAccessKey, @@ -381,6 +393,16 @@ const Composer: FC = ({ [styleOptions, theme.styleOptions] ); + const sendBoxMiddleware = useMemo( + () => Object.freeze([...rectifySendBoxMiddleware(sendBoxMiddlewareFromProps), ...createDefaultSendBoxMiddleware()]), + [sendBoxMiddlewareFromProps] + ); + + const sendBoxToolbarMiddleware = useMemo( + () => Object.freeze([...rectifySendBoxToolbarMiddleware(sendBoxToolbarMiddlewareFromProps)]), + [sendBoxToolbarMiddlewareFromProps] + ); + return ( = ({ internalErrorBoxClass={node_env === 'development' ? ErrorBox : undefined} nonce={nonce} scrollToEndButtonMiddleware={patchedScrollToEndButtonMiddleware} + sendBoxMiddleware={sendBoxMiddleware} + sendBoxToolbarMiddleware={sendBoxToolbarMiddleware} styleOptions={patchedStyleOptions} toastMiddleware={patchedToastMiddleware} typingIndicatorMiddleware={patchedTypingIndicatorMiddleware} diff --git a/packages/component/src/BasicSendBox.tsx b/packages/component/src/SendBox/BasicSendBox.tsx similarity index 80% rename from packages/component/src/BasicSendBox.tsx rename to packages/component/src/SendBox/BasicSendBox.tsx index 93362c69a9..55115bf71c 100644 --- a/packages/component/src/BasicSendBox.tsx +++ b/packages/component/src/SendBox/BasicSendBox.tsx @@ -1,19 +1,18 @@ -import { Constants } from 'botframework-webchat-core'; import { hooks } from 'botframework-webchat-api'; +import { Constants } from 'botframework-webchat-core'; import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React, { FC } from 'react'; -import DictationInterims from './SendBox/DictationInterims'; -import MicrophoneButton from './SendBox/MicrophoneButton'; -import SendButton from './SendBox/SendButton'; -import SuggestedActions from './SendBox/SuggestedActions'; -import TextBox from './SendBox/TextBox'; -import UploadButton from './SendBox/UploadButton'; -import useErrorMessageId from './providers/internal/SendBox/useErrorMessageId'; -import useStyleSet from './hooks/useStyleSet'; -import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; -import useWebSpeechPonyfill from './hooks/useWebSpeechPonyfill'; +import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +import useStyleSet from '../hooks/useStyleSet'; +import useWebSpeechPonyfill from '../hooks/useWebSpeechPonyfill'; +import useErrorMessageId from '../providers/internal/SendBox/useErrorMessageId'; +import DictationInterims from './DictationInterims'; +import MicrophoneButton from './MicrophoneButton'; +import SendButton from './SendButton'; +import SuggestedActions from './SuggestedActions'; +import TextBox from './TextBox'; +import UploadButton from './UploadButton'; import type { WebChatActivity } from 'botframework-webchat-core'; @@ -48,9 +47,9 @@ function useSendBoxSpeechInterimsVisible(): [boolean] { ]; } -type BasicSendBoxProps = { +type BasicSendBoxProps = Readonly<{ className?: string; -}; +}>; const BasicSendBox: FC = ({ className }) => { const [{ hideUploadButton, sendBoxButtonAlignment }] = useStyleOptions(); @@ -97,14 +96,6 @@ const BasicSendBox: FC = ({ className }) => { ); }; -BasicSendBox.defaultProps = { - className: '' -}; - -BasicSendBox.propTypes = { - className: PropTypes.string -}; - export default BasicSendBox; export { useSendBoxSpeechInterimsVisible }; diff --git a/packages/component/src/SendBox/createMiddleware.tsx b/packages/component/src/SendBox/createMiddleware.tsx new file mode 100644 index 0000000000..c19f95ec95 --- /dev/null +++ b/packages/component/src/SendBox/createMiddleware.tsx @@ -0,0 +1,16 @@ +import { hooks, type SendBoxMiddleware, type SendBoxMiddlewareProps } from 'botframework-webchat-api'; +import React from 'react'; + +import BasicSendBox from './BasicSendBox'; + +const { useStyleOptions } = hooks; + +const HideableSendBox = ({ className }: SendBoxMiddlewareProps) => { + const [{ hideSendBox }] = useStyleOptions(); + + return hideSendBox ? false : ; +}; + +const createMiddleware = (): readonly SendBoxMiddleware[] => Object.freeze([() => () => () => HideableSendBox]); + +export default createMiddleware; diff --git a/packages/component/src/hooks/index.ts b/packages/component/src/hooks/index.ts index 4757cd1117..4cecc0d661 100644 --- a/packages/component/src/hooks/index.ts +++ b/packages/component/src/hooks/index.ts @@ -13,8 +13,8 @@ import useSendMessage from './useSendMessage'; import useStyleSet from './useStyleSet'; import useWebSpeechPonyfill from './useWebSpeechPonyfill'; -import { useSendBoxSpeechInterimsVisible } from '../BasicSendBox'; import { useTypingIndicatorVisible } from '../BasicTypingIndicator'; +import { useSendBoxSpeechInterimsVisible } from '../SendBox/BasicSendBox'; import { useMicrophoneButtonClick, useMicrophoneButtonDisabled } from '../SendBox/MicrophoneButton'; import { useTextBoxSubmit, useTextBoxValue } from '../SendBox/TextBox'; diff --git a/packages/component/src/index.ts b/packages/component/src/index.ts index 6f107bbfcf..37d2faeb8a 100644 --- a/packages/component/src/index.ts +++ b/packages/component/src/index.ts @@ -7,7 +7,7 @@ import Composer, { ComposerProps } from './Composer'; import AccessKeySinkSurface from './Utils/AccessKeySink/Surface'; import BasicConnectivityStatus from './BasicConnectivityStatus'; -import BasicSendBox from './BasicSendBox'; +import BasicSendBox from './SendBox/BasicSendBox'; import BasicToaster from './BasicToaster'; import BasicTranscript from './BasicTranscript'; import BasicWebChat, { BasicWebChatProps } from './BasicWebChat'; diff --git a/packages/test/page-object/src/globals/pageConditions/index.js b/packages/test/page-object/src/globals/pageConditions/index.js index b9c0bf8d72..9a3c27ddc9 100644 --- a/packages/test/page-object/src/globals/pageConditions/index.js +++ b/packages/test/page-object/src/globals/pageConditions/index.js @@ -22,6 +22,7 @@ import toastShown from './toastShown'; import typingIndicatorHidden from './typingIndicatorHidden'; import typingIndicatorShown from './typingIndicatorShown'; import uiConnected from './uiConnected'; +import warnMessageLogged from './warnMessageLogged'; import webChatRendered from './webChatRendered'; export { @@ -49,5 +50,6 @@ export { typingIndicatorHidden, typingIndicatorShown, uiConnected, + warnMessageLogged, webChatRendered }; diff --git a/packages/test/page-object/src/globals/pageConditions/warnMessageLogged.js b/packages/test/page-object/src/globals/pageConditions/warnMessageLogged.js new file mode 100644 index 0000000000..49592c8f23 --- /dev/null +++ b/packages/test/page-object/src/globals/pageConditions/warnMessageLogged.js @@ -0,0 +1,30 @@ +import became from './became'; + +const LOG_PATTERN = /^([^\s]*)\s([^\s]*)\s(.*)$/u; + +export default function warnMessageLogged(patternOrSubstring) { + return became( + patternOrSubstring instanceof RegExp + ? `warn message in console that match ${patternOrSubstring}` + : `warn message in console that contains "${patternOrSubstring}"`, + async () => { + const predicate = + patternOrSubstring instanceof RegExp + ? message => patternOrSubstring.test(message) + : message => message.includes(patternOrSubstring); + + return (await host.getLogs()).some(({ level, message }) => { + let parsedMessage = ''; + + try { + parsedMessage = JSON.parse(LOG_PATTERN.exec(message)[3]); + } catch { + // Intentionally left blank. + } + + return level.name_ === 'WARNING' && predicate(parsedMessage); + }); + }, + 1000 + ); +} From cf1f49acc252b1f0f25b3b4e3a56b622d3113f98 Mon Sep 17 00:00:00 2001 From: William Wong Date: Sun, 7 Apr 2024 22:02:10 +0000 Subject: [PATCH 03/18] Add immutability test --- ...ased-on-last-activity-received-1-snap.png} | Bin ...ased-on-last-activity-received-2-snap.png} | Bin ...ased-on-last-activity-received-3-snap.png} | Bin ...ould-decorate-default-send-box-1-snap.png} | Bin ...-should-be-treated-as-immutable-1-snap.png | Bin 0 -> 13260 bytes ...-should-be-treated-as-immutable-2-snap.png | Bin 0 -> 20958 bytes ...hould-replace-default-send-box-1-snap.png} | Bin ...e-should-hide-default-send-box-1-snap.png} | Bin ...warn-and-show-default-send-box-1-snap.png} | Bin .../html/sendBoxMiddleware/changeModality.js | 2 +- __tests__/html/sendBoxMiddleware/decorate.js | 2 +- .../html/sendBoxMiddleware/immutable.html | 55 ++++++++++++++++++ __tests__/html/sendBoxMiddleware/immutable.js | 5 ++ __tests__/html/sendBoxMiddleware/replace.js | 2 +- .../html/sendBoxMiddleware/returnFalse.js | 2 +- .../html/sendBoxMiddleware/warnIfInvalid.js | 2 +- 16 files changed, 65 insertions(+), 5 deletions(-) rename __tests__/__image_snapshots__/html/{change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-1-snap.png => change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-1-snap.png} (100%) rename __tests__/__image_snapshots__/html/{change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-2-snap.png => change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-2-snap.png} (100%) rename __tests__/__image_snapshots__/html/{change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-3-snap.png => change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-3-snap.png} (100%) rename __tests__/__image_snapshots__/html/{decorate-js-send-box-middlware-should-decorate-default-send-box-1-snap.png => decorate-js-send-box-middleware-should-decorate-default-send-box-1-snap.png} (100%) create mode 100644 __tests__/__image_snapshots__/html/immutable-js-send-box-middleware-when-mutated-should-be-treated-as-immutable-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/immutable-js-send-box-middleware-when-mutated-should-be-treated-as-immutable-2-snap.png rename __tests__/__image_snapshots__/html/{replace-js-send-box-middlware-should-replace-default-send-box-1-snap.png => replace-js-send-box-middleware-should-replace-default-send-box-1-snap.png} (100%) rename __tests__/__image_snapshots__/html/{return-false-js-send-box-middlware-when-return-false-should-hide-default-send-box-1-snap.png => return-false-js-send-box-middleware-when-return-false-should-hide-default-send-box-1-snap.png} (100%) rename __tests__/__image_snapshots__/html/{warn-if-invalid-js-send-box-middlware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png => warn-if-invalid-js-send-box-middleware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png} (100%) create mode 100644 __tests__/html/sendBoxMiddleware/immutable.html create mode 100644 __tests__/html/sendBoxMiddleware/immutable.js diff --git a/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-1-snap.png b/__tests__/__image_snapshots__/html/change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-1-snap.png similarity index 100% rename from __tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-1-snap.png rename to __tests__/__image_snapshots__/html/change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-1-snap.png diff --git a/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-2-snap.png b/__tests__/__image_snapshots__/html/change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-2-snap.png similarity index 100% rename from __tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-2-snap.png rename to __tests__/__image_snapshots__/html/change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-2-snap.png diff --git a/__tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-3-snap.png b/__tests__/__image_snapshots__/html/change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-3-snap.png similarity index 100% rename from __tests__/__image_snapshots__/html/change-modality-js-send-box-middlware-should-change-modality-based-on-last-activity-received-3-snap.png rename to __tests__/__image_snapshots__/html/change-modality-js-send-box-middleware-should-change-modality-based-on-last-activity-received-3-snap.png diff --git a/__tests__/__image_snapshots__/html/decorate-js-send-box-middlware-should-decorate-default-send-box-1-snap.png b/__tests__/__image_snapshots__/html/decorate-js-send-box-middleware-should-decorate-default-send-box-1-snap.png similarity index 100% rename from __tests__/__image_snapshots__/html/decorate-js-send-box-middlware-should-decorate-default-send-box-1-snap.png rename to __tests__/__image_snapshots__/html/decorate-js-send-box-middleware-should-decorate-default-send-box-1-snap.png diff --git a/__tests__/__image_snapshots__/html/immutable-js-send-box-middleware-when-mutated-should-be-treated-as-immutable-1-snap.png b/__tests__/__image_snapshots__/html/immutable-js-send-box-middleware-when-mutated-should-be-treated-as-immutable-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac96261fc320df69d3e4630612611d2a5150519 GIT binary patch literal 13260 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 MMp?Q*^6l6E14518Z~y=R literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/replace-js-send-box-middlware-should-replace-default-send-box-1-snap.png b/__tests__/__image_snapshots__/html/replace-js-send-box-middleware-should-replace-default-send-box-1-snap.png similarity index 100% rename from __tests__/__image_snapshots__/html/replace-js-send-box-middlware-should-replace-default-send-box-1-snap.png rename to __tests__/__image_snapshots__/html/replace-js-send-box-middleware-should-replace-default-send-box-1-snap.png diff --git a/__tests__/__image_snapshots__/html/return-false-js-send-box-middlware-when-return-false-should-hide-default-send-box-1-snap.png b/__tests__/__image_snapshots__/html/return-false-js-send-box-middleware-when-return-false-should-hide-default-send-box-1-snap.png similarity index 100% rename from __tests__/__image_snapshots__/html/return-false-js-send-box-middlware-when-return-false-should-hide-default-send-box-1-snap.png rename to __tests__/__image_snapshots__/html/return-false-js-send-box-middleware-when-return-false-should-hide-default-send-box-1-snap.png diff --git a/__tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-middlware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png b/__tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-middleware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png similarity index 100% rename from __tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-middlware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png rename to __tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-middleware-when-passing-invalid-should-warn-and-show-default-send-box-1-snap.png diff --git a/__tests__/html/sendBoxMiddleware/changeModality.js b/__tests__/html/sendBoxMiddleware/changeModality.js index 792772b7c6..000fe0abcf 100644 --- a/__tests__/html/sendBoxMiddleware/changeModality.js +++ b/__tests__/html/sendBoxMiddleware/changeModality.js @@ -1,5 +1,5 @@ /** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ -describe('sendBoxMiddlware', () => { +describe('sendBoxMiddleware', () => { test('should change modality based on last activity received', () => runHTML('sendBoxMiddleware/changeModality')); }); diff --git a/__tests__/html/sendBoxMiddleware/decorate.js b/__tests__/html/sendBoxMiddleware/decorate.js index 932239a3f4..d95d95ac62 100644 --- a/__tests__/html/sendBoxMiddleware/decorate.js +++ b/__tests__/html/sendBoxMiddleware/decorate.js @@ -1,5 +1,5 @@ /** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ -describe('sendBoxMiddlware', () => { +describe('sendBoxMiddleware', () => { test('should decorate default send box', () => runHTML('sendBoxMiddleware/decorate')); }); diff --git a/__tests__/html/sendBoxMiddleware/immutable.html b/__tests__/html/sendBoxMiddleware/immutable.html new file mode 100644 index 0000000000..c23e5c5e87 --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/immutable.html @@ -0,0 +1,55 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxMiddleware/immutable.js b/__tests__/html/sendBoxMiddleware/immutable.js new file mode 100644 index 0000000000..c3c6f202ec --- /dev/null +++ b/__tests__/html/sendBoxMiddleware/immutable.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxMiddleware', () => { + test('when mutated should be treated as immutable', () => runHTML('sendBoxMiddleware/immutable')); +}); diff --git a/__tests__/html/sendBoxMiddleware/replace.js b/__tests__/html/sendBoxMiddleware/replace.js index 8c6d855ea2..5ef2f03c6f 100644 --- a/__tests__/html/sendBoxMiddleware/replace.js +++ b/__tests__/html/sendBoxMiddleware/replace.js @@ -1,5 +1,5 @@ /** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ -describe('sendBoxMiddlware', () => { +describe('sendBoxMiddleware', () => { test('should replace default send box', () => runHTML('sendBoxMiddleware/replace')); }); diff --git a/__tests__/html/sendBoxMiddleware/returnFalse.js b/__tests__/html/sendBoxMiddleware/returnFalse.js index 5c0e05a32b..7b567c9c92 100644 --- a/__tests__/html/sendBoxMiddleware/returnFalse.js +++ b/__tests__/html/sendBoxMiddleware/returnFalse.js @@ -1,5 +1,5 @@ /** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ -describe('sendBoxMiddlware', () => { +describe('sendBoxMiddleware', () => { test('when return false should hide default send box', () => runHTML('sendBoxMiddleware/returnFalse')); }); diff --git a/__tests__/html/sendBoxMiddleware/warnIfInvalid.js b/__tests__/html/sendBoxMiddleware/warnIfInvalid.js index 76d51113cf..5fbd05dfb8 100644 --- a/__tests__/html/sendBoxMiddleware/warnIfInvalid.js +++ b/__tests__/html/sendBoxMiddleware/warnIfInvalid.js @@ -1,5 +1,5 @@ /** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ -describe('sendBoxMiddlware', () => { +describe('sendBoxMiddleware', () => { test('when passing invalid should warn and show default send box', () => runHTML('sendBoxMiddleware/warnIfInvalid')); }); From c4d81d76f95bb0c2a1068389dbc1f51b234f6bf3 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 02:25:47 +0000 Subject: [PATCH 04/18] Fix tests --- __tests__/hooks/useGroupTimestamp.js | 12 ------------ __tests__/hooks/useTimeoutForSend.js | 15 +-------------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/__tests__/hooks/useGroupTimestamp.js b/__tests__/hooks/useGroupTimestamp.js index 8d0f833fd2..67ccac2937 100644 --- a/__tests__/hooks/useGroupTimestamp.js +++ b/__tests__/hooks/useGroupTimestamp.js @@ -19,18 +19,6 @@ test('getter should return group timestamp set in styleOptions', async () => { expect(groupTimestamp).toMatchInlineSnapshot(`1000`); }); -test('getter should return group timestamp set in props (deprecated)', async () => { - const { pageObjects } = await setupWebDriver({ - props: { - groupTimestamp: 1000 - } - }); - - const [groupTimestamp] = await pageObjects.runHook('useGroupTimestamp'); - - expect(groupTimestamp).toMatchInlineSnapshot(`1000`); -}); - test('getter should return default group timestamp if not set in styleOptions', async () => { const { pageObjects } = await setupWebDriver(); diff --git a/__tests__/hooks/useTimeoutForSend.js b/__tests__/hooks/useTimeoutForSend.js index 1d642d7f59..a9948405f8 100644 --- a/__tests__/hooks/useTimeoutForSend.js +++ b/__tests__/hooks/useTimeoutForSend.js @@ -19,21 +19,8 @@ test('getter should return timeout for sending activity', async () => { expect(timeoutForSend).toMatchInlineSnapshot(`1000`); }); -test('getter should return timeout for sending activity if set in props', async () => { - const { pageObjects } = await setupWebDriver({ - props: { - sendTimeout: 1000 - } - }); - - const [timeoutForSend] = await pageObjects.runHook('useTimeoutForSend'); - - expect(timeoutForSend).toMatchInlineSnapshot(`1000`); -}); - -test('getter should return default timeout for sending activity if not set in props', async () => { +test('getter should return default timeout for sending activity', async () => { const { pageObjects } = await setupWebDriver(); - const [timeoutForSend] = await pageObjects.runHook('useTimeoutForSend'); expect(timeoutForSend).toMatchInlineSnapshot(`20000`); From 4c9ce38cbcea3ea98fc9dc47861bf6d58e308423 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 04:19:18 +0000 Subject: [PATCH 05/18] Build template --- .../src/hooks/internal/SendBoxMiddleware.ts | 49 +++++-------------- .../internal/SendBoxToolbarMiddleware.ts | 47 +++++------------- .../internal/private/templateMiddleware.ts | 44 +++++++++++++++++ packages/api/src/index.ts | 8 +-- packages/component/src/Composer.tsx | 12 +++-- 5 files changed, 78 insertions(+), 82 deletions(-) create mode 100644 packages/api/src/hooks/internal/private/templateMiddleware.ts diff --git a/packages/api/src/hooks/internal/SendBoxMiddleware.ts b/packages/api/src/hooks/internal/SendBoxMiddleware.ts index 21c5dc4b89..e15dc24a11 100644 --- a/packages/api/src/hooks/internal/SendBoxMiddleware.ts +++ b/packages/api/src/hooks/internal/SendBoxMiddleware.ts @@ -1,48 +1,21 @@ -import { warnOnce } from 'botframework-webchat-core'; -import { createChainOfResponsibility, type ComponentMiddleware } from 'react-chain-of-responsibility'; -import { type EmptyObject } from 'type-fest'; -import { any, array, custom, safeParse, type Output } from 'valibot'; +import templateMiddleware from './private/templateMiddleware'; -type SendBoxMiddlewareProps = { className?: string | undefined }; -type SendBoxMiddlewareRequest = EmptyObject; -type SendBoxMiddleware = ComponentMiddleware; +const { + Provider: SendBoxMiddlewareProvider, + Proxy: SendBoxMiddlewareProxy, + rectifyProps: rectifySendBoxMiddlewareProps, + types +} = templateMiddleware<{ className?: string | undefined }>('sendBoxMiddleware'); -const validateSendBoxMiddleware = custom( - input => typeof input === 'function', - 'Middleware must be a function.' -); - -const sendBoxMiddlewareSchema = array(any([validateSendBoxMiddleware])); - -const isSendBoxMiddleware = (middleware: unknown): middleware is Output => - safeParse(sendBoxMiddlewareSchema, middleware).success; - -const warnInvalid = warnOnce('"sendBoxMiddleware" prop is invalid'); - -const rectifySendBoxMiddleware = (middleware: unknown): readonly SendBoxMiddleware[] => { - if (middleware) { - if (isSendBoxMiddleware(middleware)) { - return Object.isFrozen(middleware) ? middleware : Object.freeze([...middleware]); - } - - warnInvalid(); - } - - return Object.freeze([]); -}; - -const { Provider: SendBoxMiddlewareProvider, Proxy: SendBoxMiddlewareProxy } = createChainOfResponsibility< - SendBoxMiddlewareRequest, - SendBoxMiddlewareProps ->(); +type SendBoxMiddleware = typeof types.middleware; +type SendBoxMiddlewareProps = typeof types.props; +type SendBoxMiddlewareRequest = typeof types.request; export { SendBoxMiddlewareProvider, SendBoxMiddlewareProxy, - rectifySendBoxMiddleware, + rectifySendBoxMiddlewareProps, type SendBoxMiddleware, type SendBoxMiddlewareProps, type SendBoxMiddlewareRequest }; - -// TODO: [P1] Dedupe with SendBoxToolbarMiddleware. diff --git a/packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts b/packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts index ea68da395d..164d23d6af 100644 --- a/packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts +++ b/packages/api/src/hooks/internal/SendBoxToolbarMiddleware.ts @@ -1,46 +1,21 @@ -import { warnOnce } from 'botframework-webchat-core'; -import { createChainOfResponsibility, type ComponentMiddleware } from 'react-chain-of-responsibility'; -import { type EmptyObject } from 'type-fest'; -import { any, array, custom, safeParse, type Output } from 'valibot'; +import templateMiddleware from './private/templateMiddleware'; -type SendBoxToolbarMiddlewareProps = { className?: string | undefined }; -type SendBoxToolbarMiddlewareRequest = EmptyObject; -type SendBoxToolbarMiddleware = ComponentMiddleware; +const { + Provider: SendBoxToolbarMiddlewareProvider, + Proxy: SendBoxToolbarMiddlewareProxy, + rectifyProps: rectifySendBoxToolbarMiddlewareProps, + types +} = templateMiddleware<{ className?: string | undefined }>('sendBoxToolbarMiddleware'); -const validateSendBoxToolbarMiddleware = custom( - input => typeof input === 'function', - 'Middleware must be a function.' -); - -const sendBoxToolbarMiddlewareSchema = array(any([validateSendBoxToolbarMiddleware])); - -const isSendBoxToolbarMiddleware = (middleware: unknown): middleware is Output => - safeParse(sendBoxToolbarMiddlewareSchema, middleware).success; - -const warnInvalid = warnOnce('botframework-webchat: "sendBoxToolbarMiddleware" prop is invalid.'); - -const rectifySendBoxToolbarMiddleware = (middleware: unknown): readonly SendBoxToolbarMiddleware[] => { - if (middleware) { - if (isSendBoxToolbarMiddleware(middleware)) { - return Object.isFrozen(middleware) ? middleware : Object.freeze([...middleware]); - } - - warnInvalid(); - } - - return Object.freeze([]); -}; - -const { Provider: SendBoxToolbarMiddlewareProvider, Proxy: SendBoxToolbarMiddlewareProxy } = - createChainOfResponsibility(); +type SendBoxToolbarMiddleware = typeof types.middleware; +type SendBoxToolbarMiddlewareProps = typeof types.props; +type SendBoxToolbarMiddlewareRequest = typeof types.request; export { SendBoxToolbarMiddlewareProvider, SendBoxToolbarMiddlewareProxy, - rectifySendBoxToolbarMiddleware, + rectifySendBoxToolbarMiddlewareProps, type SendBoxToolbarMiddleware, type SendBoxToolbarMiddlewareProps, type SendBoxToolbarMiddlewareRequest }; - -// TODO: [P1] Dedupe with SendBoxToolbarToolbarMiddleware. diff --git a/packages/api/src/hooks/internal/private/templateMiddleware.ts b/packages/api/src/hooks/internal/private/templateMiddleware.ts new file mode 100644 index 0000000000..ee60249a7a --- /dev/null +++ b/packages/api/src/hooks/internal/private/templateMiddleware.ts @@ -0,0 +1,44 @@ +import { warnOnce } from 'botframework-webchat-core'; +import { createChainOfResponsibility, type ComponentMiddleware } from 'react-chain-of-responsibility'; +import { type EmptyObject } from 'type-fest'; +import { any, array, custom, safeParse, type Output } from 'valibot'; + +export default function createMiddlewareFacility( + name: string +) { + type Middleware = ComponentMiddleware; + + const validateMiddleware = custom(input => typeof input === 'function', 'Middleware must be a function.'); + + const middlewareSchema = array(any([validateMiddleware])); + + const isMiddleware = (middleware: unknown): middleware is Output => + safeParse(middlewareSchema, middleware).success; + + const warnInvalid = warnOnce(`"${name}" prop is invalid`); + + const rectifyProps = (middleware: unknown): readonly Middleware[] => { + if (middleware) { + if (isMiddleware(middleware)) { + return Object.isFrozen(middleware) ? middleware : Object.freeze([...middleware]); + } + + warnInvalid(); + } + + return Object.freeze([]); + }; + + const { Provider, Proxy } = createChainOfResponsibility(); + + return { + types: { + middleware: {} as Middleware, + props: {} as Props, + request: {} as Request + }, + Provider, + Proxy, + rectifyProps + }; +} diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index f7d012cf1b..14bf88eb4c 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -4,14 +4,14 @@ import * as hooks from './hooks'; import Composer, { ComposerProps } from './hooks/Composer'; import { SendBoxMiddlewareProxy, - rectifySendBoxMiddleware, + rectifySendBoxMiddlewareProps, type SendBoxMiddleware, type SendBoxMiddlewareProps, type SendBoxMiddlewareRequest } from './hooks/internal/SendBoxMiddleware'; import { SendBoxToolbarMiddlewareProxy, - rectifySendBoxToolbarMiddleware, + rectifySendBoxToolbarMiddlewareProps, type SendBoxToolbarMiddleware, type SendBoxToolbarMiddlewareProps, type SendBoxToolbarMiddlewareRequest @@ -43,8 +43,8 @@ export { hooks, localize, normalizeStyleOptions, - rectifySendBoxMiddleware, - rectifySendBoxToolbarMiddleware + rectifySendBoxMiddlewareProps, + rectifySendBoxToolbarMiddlewareProps }; export type { diff --git a/packages/component/src/Composer.tsx b/packages/component/src/Composer.tsx index 8beac20366..fece100385 100644 --- a/packages/component/src/Composer.tsx +++ b/packages/component/src/Composer.tsx @@ -7,8 +7,8 @@ import type { import { Composer as APIComposer, hooks, - rectifySendBoxMiddleware, - rectifySendBoxToolbarMiddleware, + rectifySendBoxMiddlewareProps, + rectifySendBoxToolbarMiddlewareProps, WebSpeechPonyfillFactory } from 'botframework-webchat-api'; import { singleToArray } from 'botframework-webchat-core'; @@ -394,12 +394,16 @@ const Composer: FC = ({ ); const sendBoxMiddleware = useMemo( - () => Object.freeze([...rectifySendBoxMiddleware(sendBoxMiddlewareFromProps), ...createDefaultSendBoxMiddleware()]), + () => + Object.freeze([ + ...rectifySendBoxMiddlewareProps(sendBoxMiddlewareFromProps), + ...createDefaultSendBoxMiddleware() + ]), [sendBoxMiddlewareFromProps] ); const sendBoxToolbarMiddleware = useMemo( - () => Object.freeze([...rectifySendBoxToolbarMiddleware(sendBoxToolbarMiddlewareFromProps)]), + () => Object.freeze([...rectifySendBoxToolbarMiddlewareProps(sendBoxToolbarMiddlewareFromProps)]), [sendBoxToolbarMiddlewareFromProps] ); From 64ab3991294741e9af9021a35ed876f2d142be56 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 05:02:06 +0000 Subject: [PATCH 06/18] Move upload button to send box toolbar middleware --- packages/component/src/Composer.tsx | 7 ++++++- packages/component/src/SendBox/BasicSendBox.tsx | 7 +++---- .../Assets/AttachmentIcon.tsx | 0 .../src/SendBoxToolbar/BasicSendBoxToolbar.tsx | 14 ++++++++++++++ .../{SendBox => SendBoxToolbar}/UploadButton.tsx | 4 ++-- .../src/SendBoxToolbar/createMiddleware.tsx | 7 +++++++ packages/component/src/index.ts | 2 +- 7 files changed, 33 insertions(+), 8 deletions(-) rename packages/component/src/{SendBox => SendBoxToolbar}/Assets/AttachmentIcon.tsx (100%) create mode 100644 packages/component/src/SendBoxToolbar/BasicSendBoxToolbar.tsx rename packages/component/src/{SendBox => SendBoxToolbar}/UploadButton.tsx (98%) create mode 100644 packages/component/src/SendBoxToolbar/createMiddleware.tsx diff --git a/packages/component/src/Composer.tsx b/packages/component/src/Composer.tsx index fece100385..bd220c121a 100644 --- a/packages/component/src/Composer.tsx +++ b/packages/component/src/Composer.tsx @@ -42,6 +42,7 @@ import SendBoxComposer from './providers/internal/SendBox/SendBoxComposer'; import ModalDialogComposer from './providers/ModalDialog/ModalDialogComposer'; import useTheme from './providers/Theme/useTheme'; import createDefaultSendBoxMiddleware from './SendBox/createMiddleware'; +import createDefaultSendBoxToolbarMiddleware from './SendBoxToolbar/createMiddleware'; import createStyleSet from './Styles/createStyleSet'; import { type ContextOf } from './types/ContextOf'; import { type FocusSendBoxInit } from './types/internal/FocusSendBoxInit'; @@ -403,7 +404,11 @@ const Composer: FC = ({ ); const sendBoxToolbarMiddleware = useMemo( - () => Object.freeze([...rectifySendBoxToolbarMiddlewareProps(sendBoxToolbarMiddlewareFromProps)]), + () => + Object.freeze([ + ...rectifySendBoxToolbarMiddlewareProps(sendBoxToolbarMiddlewareFromProps), + ...createDefaultSendBoxToolbarMiddleware() + ]), [sendBoxToolbarMiddlewareFromProps] ); diff --git a/packages/component/src/SendBox/BasicSendBox.tsx b/packages/component/src/SendBox/BasicSendBox.tsx index 55115bf71c..bae4197865 100644 --- a/packages/component/src/SendBox/BasicSendBox.tsx +++ b/packages/component/src/SendBox/BasicSendBox.tsx @@ -1,4 +1,4 @@ -import { hooks } from 'botframework-webchat-api'; +import { SendBoxToolbarMiddlewareProxy, hooks } from 'botframework-webchat-api'; import { Constants } from 'botframework-webchat-core'; import classNames from 'classnames'; import React, { FC } from 'react'; @@ -12,7 +12,6 @@ import MicrophoneButton from './MicrophoneButton'; import SendButton from './SendButton'; import SuggestedActions from './SuggestedActions'; import TextBox from './TextBox'; -import UploadButton from './UploadButton'; import type { WebChatActivity } from 'botframework-webchat-core'; @@ -52,7 +51,7 @@ type BasicSendBoxProps = Readonly<{ }>; const BasicSendBox: FC = ({ className }) => { - const [{ hideUploadButton, sendBoxButtonAlignment }] = useStyleOptions(); + const [{ sendBoxButtonAlignment }] = useStyleOptions(); const [{ sendBox: sendBoxStyleSet }] = useStyleSet(); const [{ SpeechRecognition = undefined } = {}] = useWebSpeechPonyfill(); const [direction] = useDirection(); @@ -80,7 +79,7 @@ const BasicSendBox: FC = ({ className }) => { >
- {!hideUploadButton && } + {speechInterimsVisible ? ( ) : ( diff --git a/packages/component/src/SendBox/Assets/AttachmentIcon.tsx b/packages/component/src/SendBoxToolbar/Assets/AttachmentIcon.tsx similarity index 100% rename from packages/component/src/SendBox/Assets/AttachmentIcon.tsx rename to packages/component/src/SendBoxToolbar/Assets/AttachmentIcon.tsx diff --git a/packages/component/src/SendBoxToolbar/BasicSendBoxToolbar.tsx b/packages/component/src/SendBoxToolbar/BasicSendBoxToolbar.tsx new file mode 100644 index 0000000000..d1db380700 --- /dev/null +++ b/packages/component/src/SendBoxToolbar/BasicSendBoxToolbar.tsx @@ -0,0 +1,14 @@ +import { hooks, type SendBoxToolbarMiddlewareProps } from 'botframework-webchat-api'; +import React, { memo } from 'react'; + +import UploadButton from './UploadButton'; + +const { useStyleOptions } = hooks; + +function BasicSendBoxToolbar({ className }: SendBoxToolbarMiddlewareProps) { + const [{ hideUploadButton }] = useStyleOptions(); + + return !hideUploadButton && ; +} + +export default memo(BasicSendBoxToolbar); diff --git a/packages/component/src/SendBox/UploadButton.tsx b/packages/component/src/SendBoxToolbar/UploadButton.tsx similarity index 98% rename from packages/component/src/SendBox/UploadButton.tsx rename to packages/component/src/SendBoxToolbar/UploadButton.tsx index 8a2e7d2ef3..ad87b3a8a9 100644 --- a/packages/component/src/SendBox/UploadButton.tsx +++ b/packages/component/src/SendBoxToolbar/UploadButton.tsx @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'; import React, { useCallback, useRef, type FC, type FormEventHandler, type MouseEventHandler } from 'react'; import { useRefFrom } from 'use-ref-from'; +import IconButton from '../SendBox/IconButton'; import downscaleImageToDataURL from '../Utils/downscaleImageToDataURL/index'; import connectToWebChat from '../connectToWebChat'; import useMakeThumbnail from '../hooks/internal/useMakeThumbnail'; @@ -12,7 +13,6 @@ import useFocus from '../hooks/useFocus'; import useStyleSet from '../hooks/useStyleSet'; import useSubmit from '../providers/internal/SendBox/useSubmit'; import AttachmentIcon from './Assets/AttachmentIcon'; -import IconButton from './IconButton'; const { useDisabled, useSendBoxAttachments, useLocalizer, useStyleOptions } = hooks; @@ -102,7 +102,7 @@ const UploadButton: FC = ({ className }) => { const [disabled] = useDisabled(); const [sendBoxAttachments, setSendBoxAttachments] = useSendBoxAttachments(); const focus = useFocus(); - const inputRef = useRef(); + const inputRef = useRef(null); const localize = useLocalizer(); const makeThumbnail = useMakeThumbnail(); const rootClassName = useStyleToEmotionObject()(ROOT_STYLE) + ''; diff --git a/packages/component/src/SendBoxToolbar/createMiddleware.tsx b/packages/component/src/SendBoxToolbar/createMiddleware.tsx new file mode 100644 index 0000000000..a009b1c860 --- /dev/null +++ b/packages/component/src/SendBoxToolbar/createMiddleware.tsx @@ -0,0 +1,7 @@ +import { type SendBoxMiddleware } from 'botframework-webchat-api'; + +import BasicSendBoxToolbar from './BasicSendBoxToolbar'; + +const createMiddleware = (): readonly SendBoxMiddleware[] => Object.freeze([() => () => () => BasicSendBoxToolbar]); + +export default createMiddleware; diff --git a/packages/component/src/index.ts b/packages/component/src/index.ts index 37d2faeb8a..364cedc23a 100644 --- a/packages/component/src/index.ts +++ b/packages/component/src/index.ts @@ -33,7 +33,7 @@ import MicrophoneButton, { connectMicrophoneButton } from './SendBox/MicrophoneB import SendButton, { connectSendButton } from './SendBox/SendButton'; import SuggestedActions, { connectSuggestedActions } from './SendBox/SuggestedActions'; import SendTextBox from './SendBox/TextBox'; -import UploadButton, { connectUploadButton } from './SendBox/UploadButton'; +import UploadButton, { connectUploadButton } from './SendBoxToolbar/UploadButton'; import createCoreAttachmentMiddleware from './Attachment/createMiddleware'; import createCoreActivityMiddleware from './Middleware/Activity/createCoreMiddleware'; From 2965874fa0b6eb5fbe8af4e762b22eaff76a9117 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 05:11:31 +0000 Subject: [PATCH 07/18] Export BasicSendBoxToolbar --- packages/component/src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/component/src/index.ts b/packages/component/src/index.ts index 364cedc23a..4092132c6c 100644 --- a/packages/component/src/index.ts +++ b/packages/component/src/index.ts @@ -7,10 +7,11 @@ import Composer, { ComposerProps } from './Composer'; import AccessKeySinkSurface from './Utils/AccessKeySink/Surface'; import BasicConnectivityStatus from './BasicConnectivityStatus'; -import BasicSendBox from './SendBox/BasicSendBox'; import BasicToaster from './BasicToaster'; import BasicTranscript from './BasicTranscript'; import BasicWebChat, { BasicWebChatProps } from './BasicWebChat'; +import BasicSendBox from './SendBox/BasicSendBox'; +import BasicSendBoxToolbar from './SendBoxToolbar/BasicSendBoxToolbar'; import Avatar from './Activity/Avatar'; import Bubble from './Activity/Bubble'; @@ -63,6 +64,7 @@ const Components = { AccessKeySinkSurface, BasicConnectivityStatus, BasicSendBox, + BasicSendBoxToolbar, BasicToaster, BasicTranscript, From 3e26f3357134c0629829ad9d34b86bd97f8ee92a Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 05:24:03 +0000 Subject: [PATCH 08/18] Add tests --- ...corate-default-send-box-toolbar-1-snap.png | Bin 0 -> 12443 bytes ...eplace-default-send-box-toolbar-1-snap.png | Bin 0 -> 12860 bytes ...eplace-default-send-box-toolbar-2-snap.png | Bin 0 -> 15567 bytes ...d-hide-default-send-box-toolbar-1-snap.png | Bin 0 -> 11687 bytes .../sendBoxToolbarMiddleware/decorate.html | 49 ++++++++++++++++ .../html/sendBoxToolbarMiddleware/decorate.js | 5 ++ .../sendBoxToolbarMiddleware/replace.html | 54 ++++++++++++++++++ .../html/sendBoxToolbarMiddleware/replace.js | 5 ++ .../sendBoxToolbarMiddleware/returnFalse.html | 40 +++++++++++++ .../sendBoxToolbarMiddleware/returnFalse.js | 5 ++ 10 files changed, 158 insertions(+) create mode 100644 __tests__/__image_snapshots__/html/decorate-js-send-box-toolbar-middleware-should-decorate-default-send-box-toolbar-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/replace-js-send-box-toolbar-middleware-should-replace-default-send-box-toolbar-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/replace-js-send-box-toolbar-middleware-should-replace-default-send-box-toolbar-2-snap.png create mode 100644 __tests__/__image_snapshots__/html/return-false-js-send-box-toolbar-middleware-when-return-false-should-hide-default-send-box-toolbar-1-snap.png create mode 100644 __tests__/html/sendBoxToolbarMiddleware/decorate.html create mode 100644 __tests__/html/sendBoxToolbarMiddleware/decorate.js create mode 100644 __tests__/html/sendBoxToolbarMiddleware/replace.html create mode 100644 __tests__/html/sendBoxToolbarMiddleware/replace.js create mode 100644 __tests__/html/sendBoxToolbarMiddleware/returnFalse.html create mode 100644 __tests__/html/sendBoxToolbarMiddleware/returnFalse.js diff --git a/__tests__/__image_snapshots__/html/decorate-js-send-box-toolbar-middleware-should-decorate-default-send-box-toolbar-1-snap.png b/__tests__/__image_snapshots__/html/decorate-js-send-box-toolbar-middleware-should-decorate-default-send-box-toolbar-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..99504252601331c3f1c3b9298ff1884ca22e2d84 GIT binary patch literal 12443 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 UIiV)_*9IiAn$`*0u?x5U3joDZ2><{9 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/replace-js-send-box-toolbar-middleware-should-replace-default-send-box-toolbar-1-snap.png b/__tests__/__image_snapshots__/html/replace-js-send-box-toolbar-middleware-should-replace-default-send-box-toolbar-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..53d64c564e74e4004aeda9098fd3a6bf6f389c42 GIT binary patch literal 12860 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 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/replace-js-send-box-toolbar-middleware-should-replace-default-send-box-toolbar-2-snap.png b/__tests__/__image_snapshots__/html/replace-js-send-box-toolbar-middleware-should-replace-default-send-box-toolbar-2-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..1940062716359442edf4e088b5d2b85b54cb3af5 GIT binary patch literal 15567 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 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/return-false-js-send-box-toolbar-middleware-when-return-false-should-hide-default-send-box-toolbar-1-snap.png b/__tests__/__image_snapshots__/html/return-false-js-send-box-toolbar-middleware-when-return-false-should-hide-default-send-box-toolbar-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f856770f95ea484890e5f5abfb7f4835808282 GIT binary patch literal 11687 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 DS^k=j literal 0 HcmV?d00001 diff --git a/__tests__/html/sendBoxToolbarMiddleware/decorate.html b/__tests__/html/sendBoxToolbarMiddleware/decorate.html new file mode 100644 index 0000000000..bd65a53823 --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/decorate.html @@ -0,0 +1,49 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxToolbarMiddleware/decorate.js b/__tests__/html/sendBoxToolbarMiddleware/decorate.js new file mode 100644 index 0000000000..2ce2331982 --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/decorate.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxToolbarMiddleware', () => { + test('should decorate default send box toolbar', () => runHTML('sendBoxToolbarMiddleware/decorate')); +}); diff --git a/__tests__/html/sendBoxToolbarMiddleware/replace.html b/__tests__/html/sendBoxToolbarMiddleware/replace.html new file mode 100644 index 0000000000..007b6e547a --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/replace.html @@ -0,0 +1,54 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxToolbarMiddleware/replace.js b/__tests__/html/sendBoxToolbarMiddleware/replace.js new file mode 100644 index 0000000000..cb440f441b --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/replace.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxToolbarMiddleware', () => { + test('should replace default send box toolbar', () => runHTML('sendBoxToolbarMiddleware/replace')); +}); diff --git a/__tests__/html/sendBoxToolbarMiddleware/returnFalse.html b/__tests__/html/sendBoxToolbarMiddleware/returnFalse.html new file mode 100644 index 0000000000..e758d442f4 --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/returnFalse.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxToolbarMiddleware/returnFalse.js b/__tests__/html/sendBoxToolbarMiddleware/returnFalse.js new file mode 100644 index 0000000000..309d908143 --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/returnFalse.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxToolbarMiddleware', () => { + test('when return false should hide default send box toolbar', () => runHTML('sendBoxMiddleware/returnFalse')); +}); From 764e3ddb60210555fb630f8bb1b990d7da3133bf Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 06:17:13 +0000 Subject: [PATCH 09/18] Add tests --- ...-should-be-treated-as-immutable-1-snap.png | Bin 0 -> 13205 bytes ...-should-be-treated-as-immutable-2-snap.png | Bin 0 -> 20844 bytes .../sendBoxToolbarMiddleware/immutable.html | 73 ++++++++++++++++++ .../sendBoxToolbarMiddleware/immutable.js | 5 ++ .../sendBoxToolbarMiddleware/replace.html | 2 +- 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 __tests__/__image_snapshots__/html/immutable-js-send-box-toolbar-middleware-when-mutated-should-be-treated-as-immutable-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/immutable-js-send-box-toolbar-middleware-when-mutated-should-be-treated-as-immutable-2-snap.png create mode 100644 __tests__/html/sendBoxToolbarMiddleware/immutable.html create mode 100644 __tests__/html/sendBoxToolbarMiddleware/immutable.js diff --git a/__tests__/__image_snapshots__/html/immutable-js-send-box-toolbar-middleware-when-mutated-should-be-treated-as-immutable-1-snap.png b/__tests__/__image_snapshots__/html/immutable-js-send-box-toolbar-middleware-when-mutated-should-be-treated-as-immutable-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..49afde1d0c3052feb565a0cd87b049530d1b0ea3 GIT binary patch literal 13205 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 + + + + + + + + + + +

+ + + diff --git a/__tests__/html/sendBoxToolbarMiddleware/immutable.js b/__tests__/html/sendBoxToolbarMiddleware/immutable.js new file mode 100644 index 0000000000..bb6e980f32 --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/immutable.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxToolbarMiddleware', () => { + test('when mutated should be treated as immutable', () => runHTML('sendBoxToolbarMiddleware/immutable')); +}); diff --git a/__tests__/html/sendBoxToolbarMiddleware/replace.html b/__tests__/html/sendBoxToolbarMiddleware/replace.html index 007b6e547a..5263703d93 100644 --- a/__tests__/html/sendBoxToolbarMiddleware/replace.html +++ b/__tests__/html/sendBoxToolbarMiddleware/replace.html @@ -36,7 +36,7 @@ await directLine.emulateIncomingActivity('Consectetur ut veniam est veniam eu eu commodo.'); - // THEN: Should render the custom send box. + // THEN: Should render the custom send box toolbar. await pageConditions.numActivitiesShown(1); await host.snapshot(); From 4b685487d135541c4a4e1da18d3861c6aa3191fa Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 06:19:29 +0000 Subject: [PATCH 10/18] Add tests --- ...d-show-default-send-box-toolbar-1-snap.png | Bin 0 -> 5987 bytes .../warnIfInvalid.html | 28 ++++++++++++++++++ .../sendBoxToolbarMiddleware/warnIfInvalid.js | 6 ++++ 3 files changed, 34 insertions(+) create mode 100644 __tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-toolbar-middleware-when-passing-invalid-should-warn-and-show-default-send-box-toolbar-1-snap.png create mode 100644 __tests__/html/sendBoxToolbarMiddleware/warnIfInvalid.html create mode 100644 __tests__/html/sendBoxToolbarMiddleware/warnIfInvalid.js diff --git a/__tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-toolbar-middleware-when-passing-invalid-should-warn-and-show-default-send-box-toolbar-1-snap.png b/__tests__/__image_snapshots__/html/warn-if-invalid-js-send-box-toolbar-middleware-when-passing-invalid-should-warn-and-show-default-send-box-toolbar-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..ef517bd0361f706538fd9ed7d0cc5a30ed113203 GIT binary patch literal 5987 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 Hc + + + + + + + + + +
+ + + diff --git a/__tests__/html/sendBoxToolbarMiddleware/warnIfInvalid.js b/__tests__/html/sendBoxToolbarMiddleware/warnIfInvalid.js new file mode 100644 index 0000000000..97a08a0d1c --- /dev/null +++ b/__tests__/html/sendBoxToolbarMiddleware/warnIfInvalid.js @@ -0,0 +1,6 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('sendBoxToolbarMiddleware', () => { + test('when passing invalid should warn and show default send box toolbar', () => + runHTML('sendBoxToolbarMiddleware/warnIfInvalid')); +}); From e2dee405a72bc2ce0a3a9d1858f2e5475b91c056 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 08:31:54 +0000 Subject: [PATCH 11/18] Add Fluent package --- ...ent-theme-applied-should-render-1-snap.png | Bin 0 -> 14394 bytes __tests__/html/fluentTheme/simple.html | 54 + __tests__/html/fluentTheme/simple.js | 5 + docker-compose-wsl2.yml | 1 + package.json | 1 + packages/component/src/Composer.tsx | 6 +- .../src/SendBox/createMiddleware.tsx | 2 +- .../src/providers/Theme/ThemeProvider.tsx | 16 + .../src/providers/Theme/private/Context.ts | 6 + packages/component/src/types/PropsOf.ts | 8 +- packages/fluent-theme/.eslintrc.yml | 7 + packages/fluent-theme/.gitignore | 4 + packages/fluent-theme/.prettierrc.yml | 11 + packages/fluent-theme/README.md | 0 packages/fluent-theme/babel.config.json | 28 + packages/fluent-theme/package-lock.json | 2156 +++++++++++++++++ packages/fluent-theme/package.json | 69 + packages/fluent-theme/src/bundle.ts | 3 + .../src/external/ThemeProvider.tsx | 16 + packages/fluent-theme/src/index.ts | 9 + .../src/private/FluentThemeProvider.tsx | 18 + packages/fluent-theme/src/private/SendBox.tsx | 7 + packages/fluent-theme/src/tsconfig.json | 11 + packages/fluent-theme/tsup.config.js | 31 + packages/test/dev-server/src/index.js | 22 +- serve-test.json | 4 + serve.json | 4 +- 27 files changed, 2487 insertions(+), 12 deletions(-) create mode 100644 __tests__/__image_snapshots__/html/simple-js-fluent-theme-applied-should-render-1-snap.png create mode 100644 __tests__/html/fluentTheme/simple.html create mode 100644 __tests__/html/fluentTheme/simple.js create mode 100644 packages/fluent-theme/.eslintrc.yml create mode 100644 packages/fluent-theme/.gitignore create mode 100644 packages/fluent-theme/.prettierrc.yml create mode 100644 packages/fluent-theme/README.md create mode 100644 packages/fluent-theme/babel.config.json create mode 100644 packages/fluent-theme/package-lock.json create mode 100644 packages/fluent-theme/package.json create mode 100644 packages/fluent-theme/src/bundle.ts create mode 100644 packages/fluent-theme/src/external/ThemeProvider.tsx create mode 100644 packages/fluent-theme/src/index.ts create mode 100644 packages/fluent-theme/src/private/FluentThemeProvider.tsx create mode 100644 packages/fluent-theme/src/private/SendBox.tsx create mode 100644 packages/fluent-theme/src/tsconfig.json create mode 100644 packages/fluent-theme/tsup.config.js diff --git a/__tests__/__image_snapshots__/html/simple-js-fluent-theme-applied-should-render-1-snap.png b/__tests__/__image_snapshots__/html/simple-js-fluent-theme-applied-should-render-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..4ffaee22dc9fcb34bf6e235290cf85da8ee61486 GIT binary patch literal 14394 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 Cp@0_v literal 0 HcmV?d00001 diff --git a/__tests__/html/fluentTheme/simple.html b/__tests__/html/fluentTheme/simple.html new file mode 100644 index 0000000000..c95cd5df0c --- /dev/null +++ b/__tests__/html/fluentTheme/simple.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + +
+ + + diff --git a/__tests__/html/fluentTheme/simple.js b/__tests__/html/fluentTheme/simple.js new file mode 100644 index 0000000000..522552e85c --- /dev/null +++ b/__tests__/html/fluentTheme/simple.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('Fluent theme applied', () => { + test('should render', () => runHTML('fluentTheme/simple')); +}); diff --git a/docker-compose-wsl2.yml b/docker-compose-wsl2.yml index ec7b236f10..2790a72cc8 100644 --- a/docker-compose-wsl2.yml +++ b/docker-compose-wsl2.yml @@ -45,6 +45,7 @@ services: volumes: - ./__tests__/html/:/var/web/__tests__/html/ - ./packages/bundle/dist/:/var/web/packages/bundle/dist/ + - ./packages/fluent-theme/dist/:/var/web/packages/fluent-theme/dist/ - ./packages/test/harness/dist/:/var/web/packages/test/harness/dist/ - ./packages/test/page-object/dist/:/var/web/packages/test/page-object/dist/ diff --git a/package.json b/package.json index ddffbc5fba..72ee5aee03 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "precommit:eslint:component": "cd packages && cd component && npm run precommit:eslint", "precommit:eslint:core": "cd packages && cd core && npm run precommit:eslint", "precommit:eslint:directlinespeech": "cd packages && cd directlinespeech && npm run precommit:eslint", + "precommit:eslint:fluent-theme": "cd packages && cd fluent-theme && npm run precommit:eslint", "precommit:eslint:isomorphic-react-dom": "cd packages && cd isomorphic-react-dom && npm run precommit:eslint", "precommit:eslint:isomorphic-react": "cd packages && cd isomorphic-react && npm run precommit:eslint", "precommit:eslint:support-cldr-data-downloader": "cd packages && cd support && cd cldr-data-downloader && npm run precommit:eslint", diff --git a/packages/component/src/Composer.tsx b/packages/component/src/Composer.tsx index bd220c121a..ecc3af517e 100644 --- a/packages/component/src/Composer.tsx +++ b/packages/component/src/Composer.tsx @@ -398,18 +398,20 @@ const Composer: FC = ({ () => Object.freeze([ ...rectifySendBoxMiddlewareProps(sendBoxMiddlewareFromProps), + ...rectifySendBoxMiddlewareProps(theme.sendBoxMiddleware), ...createDefaultSendBoxMiddleware() ]), - [sendBoxMiddlewareFromProps] + [sendBoxMiddlewareFromProps, theme.sendBoxMiddleware] ); const sendBoxToolbarMiddleware = useMemo( () => Object.freeze([ ...rectifySendBoxToolbarMiddlewareProps(sendBoxToolbarMiddlewareFromProps), + ...rectifySendBoxToolbarMiddlewareProps(theme.sendBoxToolbarMiddleware), ...createDefaultSendBoxToolbarMiddleware() ]), - [sendBoxToolbarMiddlewareFromProps] + [sendBoxToolbarMiddlewareFromProps, theme.sendBoxToolbarMiddleware] ); return ( diff --git a/packages/component/src/SendBox/createMiddleware.tsx b/packages/component/src/SendBox/createMiddleware.tsx index c19f95ec95..268b18ed05 100644 --- a/packages/component/src/SendBox/createMiddleware.tsx +++ b/packages/component/src/SendBox/createMiddleware.tsx @@ -8,7 +8,7 @@ const { useStyleOptions } = hooks; const HideableSendBox = ({ className }: SendBoxMiddlewareProps) => { const [{ hideSendBox }] = useStyleOptions(); - return hideSendBox ? false : ; + return hideSendBox ? null : ; }; const createMiddleware = (): readonly SendBoxMiddleware[] => Object.freeze([() => () => () => HideableSendBox]); diff --git a/packages/component/src/providers/Theme/ThemeProvider.tsx b/packages/component/src/providers/Theme/ThemeProvider.tsx index e992c469ea..7e04ac9080 100644 --- a/packages/component/src/providers/Theme/ThemeProvider.tsx +++ b/packages/component/src/providers/Theme/ThemeProvider.tsx @@ -16,6 +16,8 @@ const ThemeProvider = ({ cardActionMiddleware, groupActivitiesMiddleware, scrollToEndButtonMiddleware, + sendBoxMiddleware, + sendBoxToolbarMiddleware, styleOptions, toastMiddleware, typingIndicatorMiddleware @@ -67,6 +69,16 @@ const ThemeProvider = ({ [scrollToEndButtonMiddleware, existingContext.scrollToEndButtonMiddleware] ); + const mergedSendBoxMiddleware = useMemo( + () => Object.freeze([...(sendBoxMiddleware || EMPTY_ARRAY), ...existingContext.sendBoxMiddleware]), + [sendBoxMiddleware, existingContext.sendBoxMiddleware] + ); + + const mergedSendBoxToolbarMiddleware = useMemo( + () => Object.freeze([...(sendBoxToolbarMiddleware || EMPTY_ARRAY), ...existingContext.sendBoxToolbarMiddleware]), + [sendBoxToolbarMiddleware, existingContext.sendBoxToolbarMiddleware] + ); + const mergedStyleOptions = useMemo( () => Object.freeze({ ...styleOptions, ...existingContext.styleOptions }), [styleOptions, existingContext.styleOptions] @@ -92,6 +104,8 @@ const ThemeProvider = ({ cardActionMiddleware: mergedCardActionMiddleware, groupActivitiesMiddleware: mergedGroupActivitiesMiddleware, scrollToEndButtonMiddleware: mergedScrollToEndButtonMiddleware, + sendBoxMiddleware: mergedSendBoxMiddleware, + sendBoxToolbarMiddleware: mergedSendBoxToolbarMiddleware, styleOptions: mergedStyleOptions, toastMiddleware: mergedToastMiddleware, typingIndicatorMiddleware: mergedTypingIndicatorMiddleware @@ -105,6 +119,8 @@ const ThemeProvider = ({ mergedCardActionMiddleware, mergedGroupActivitiesMiddleware, mergedScrollToEndButtonMiddleware, + mergedSendBoxMiddleware, + mergedSendBoxToolbarMiddleware, mergedStyleOptions, mergedToastMiddleware, mergedTypingIndicatorMiddleware diff --git a/packages/component/src/providers/Theme/private/Context.ts b/packages/component/src/providers/Theme/private/Context.ts index 53cf57538f..38e0e64da6 100644 --- a/packages/component/src/providers/Theme/private/Context.ts +++ b/packages/component/src/providers/Theme/private/Context.ts @@ -7,6 +7,8 @@ import type { CardActionMiddleware, GroupActivitiesMiddleware, ScrollToEndButtonMiddleware, + SendBoxMiddleware, + SendBoxToolbarMiddleware, StyleOptions, ToastMiddleware, TypingIndicatorMiddleware @@ -25,6 +27,8 @@ export type ContextType = { cardActionMiddleware: readonly CardActionMiddleware[]; groupActivitiesMiddleware: readonly GroupActivitiesMiddleware[]; scrollToEndButtonMiddleware: readonly ScrollToEndButtonMiddleware[]; + sendBoxMiddleware: readonly SendBoxMiddleware[]; + sendBoxToolbarMiddleware: readonly SendBoxToolbarMiddleware[]; styleOptions: StyleOptions; toastMiddleware: readonly ToastMiddleware[]; typingIndicatorMiddleware: readonly TypingIndicatorMiddleware[]; @@ -39,6 +43,8 @@ export default createContext({ cardActionMiddleware: EMPTY_ARRAY, groupActivitiesMiddleware: EMPTY_ARRAY, scrollToEndButtonMiddleware: EMPTY_ARRAY, + sendBoxMiddleware: EMPTY_ARRAY, + sendBoxToolbarMiddleware: EMPTY_ARRAY, styleOptions: EMPTY_OBJECT, toastMiddleware: EMPTY_ARRAY, typingIndicatorMiddleware: EMPTY_ARRAY diff --git a/packages/component/src/types/PropsOf.ts b/packages/component/src/types/PropsOf.ts index f5bf690584..5eeaf264e6 100644 --- a/packages/component/src/types/PropsOf.ts +++ b/packages/component/src/types/PropsOf.ts @@ -1,3 +1,7 @@ -import { type ComponentType } from 'react'; +import { type ComponentType, type MemoExoticComponent } from 'react'; -export type PropsOf = T extends ComponentType ? P : never; +export type PropsOf = T extends ComponentType + ? P + : T extends MemoExoticComponent> + ? P + : never; diff --git a/packages/fluent-theme/.eslintrc.yml b/packages/fluent-theme/.eslintrc.yml new file mode 100644 index 0000000000..47380c7dd7 --- /dev/null +++ b/packages/fluent-theme/.eslintrc.yml @@ -0,0 +1,7 @@ +extends: + - ../../.eslintrc.production.yml + - ../../.eslintrc.react.yml + +# TODO: #3212 When we move to React Native, we should disable this. +env: + browser: true diff --git a/packages/fluent-theme/.gitignore b/packages/fluent-theme/.gitignore new file mode 100644 index 0000000000..62ef8a24b8 --- /dev/null +++ b/packages/fluent-theme/.gitignore @@ -0,0 +1,4 @@ +/*.tgz +/dist +/lib +/node_modules diff --git a/packages/fluent-theme/.prettierrc.yml b/packages/fluent-theme/.prettierrc.yml new file mode 100644 index 0000000000..46b55893af --- /dev/null +++ b/packages/fluent-theme/.prettierrc.yml @@ -0,0 +1,11 @@ +arrowParens: avoid +bracketSameLine: false +bracketSpacing: true +endOfLine: auto +printWidth: 120 +proseWrap: preserve +quoteProps: as-needed +semi: true +singleQuote: true +tabWidth: 2 +trailingComma: none diff --git a/packages/fluent-theme/README.md b/packages/fluent-theme/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/fluent-theme/babel.config.json b/packages/fluent-theme/babel.config.json new file mode 100644 index 0000000000..4a72ef0a8d --- /dev/null +++ b/packages/fluent-theme/babel.config.json @@ -0,0 +1,28 @@ +{ + "env": { + "test": { + "plugins": ["babel-plugin-istanbul"] + } + }, + "plugins": [ + "@babel/plugin-transform-typescript", + "@babel/plugin-transform-runtime", + [ + "transform-inline-environment-variables", + { + "include": ["npm_package_version"] + } + ] + ], + "presets": [ + [ + "@babel/preset-env", + { + "forceAllTransforms": true, + "modules": "commonjs" + } + ] + ], + "sourceMaps": "inline", + "sourceRoot": "core:///" +} diff --git a/packages/fluent-theme/package-lock.json b/packages/fluent-theme/package-lock.json new file mode 100644 index 0000000000..231ab26f46 --- /dev/null +++ b/packages/fluent-theme/package-lock.json @@ -0,0 +1,2156 @@ +{ + "name": "botframework-webchat-fluent-theme", + "version": "0.0.0-0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "botframework-webchat-fluent-theme", + "version": "0.0.0-0", + "license": "MIT", + "dependencies": { + "inject-meta-tag": "^0.0.1" + }, + "devDependencies": { + "@tsconfig/strictest": "^2.0.5", + "@types/node": "^20.10.3", + "tsup": "^8.0.2", + "typescript": "^5.3.2" + }, + "peerDependencies": { + "react": ">= 16.8.6", + "react-dom": ">= 16.8.6" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", + "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz", + "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz", + "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz", + "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz", + "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz", + "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz", + "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz", + "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz", + "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz", + "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz", + "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", + "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz", + "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz", + "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz", + "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz", + "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tsconfig/strictest": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.5.tgz", + "integrity": "sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.5.tgz", + "integrity": "sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bundle-require": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.2.tgz", + "integrity": "sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==", + "dev": true, + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/core-js-pure": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", + "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/inject-meta-tag": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/inject-meta-tag/-/inject-meta-tag-0.0.1.tgz", + "integrity": "sha512-9AYU+php3XOcC1a5lWAVbnxqMHqIYZ4AGrz0CkZYydOt8MYKGVCVSTFNQNmPfV86qGWKb5TuWyUgrDZMlkooAQ==", + "dependencies": { + "@babel/runtime-corejs3": "^7.24.1", + "inject-meta-tag": "^0.0.1" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, + "node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz", + "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.1", + "@rollup/rollup-android-arm64": "4.14.1", + "@rollup/rollup-darwin-arm64": "4.14.1", + "@rollup/rollup-darwin-x64": "4.14.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.1", + "@rollup/rollup-linux-arm64-gnu": "4.14.1", + "@rollup/rollup-linux-arm64-musl": "4.14.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1", + "@rollup/rollup-linux-riscv64-gnu": "4.14.1", + "@rollup/rollup-linux-s390x-gnu": "4.14.1", + "@rollup/rollup-linux-x64-gnu": "4.14.1", + "@rollup/rollup-linux-x64-musl": "4.14.1", + "@rollup/rollup-win32-arm64-msvc": "4.14.1", + "@rollup/rollup-win32-ia32-msvc": "4.14.1", + "@rollup/rollup-win32-x64-msvc": "4.14.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tsup": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.2.tgz", + "integrity": "sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==", + "dev": true, + "dependencies": { + "bundle-require": "^4.0.0", + "cac": "^6.7.12", + "chokidar": "^3.5.1", + "debug": "^4.3.1", + "esbuild": "^0.19.2", + "execa": "^5.0.0", + "globby": "^11.0.3", + "joycon": "^3.0.1", + "postcss-load-config": "^4.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.0.2", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.20.3", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/packages/fluent-theme/package.json b/packages/fluent-theme/package.json new file mode 100644 index 0000000000..8ef3b5ca0e --- /dev/null +++ b/packages/fluent-theme/package.json @@ -0,0 +1,69 @@ +{ + "name": "botframework-webchat-fluent-theme", + "version": "0.0.0-0", + "description": "Fluent theme for Bot Framework Web Chat", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "publishConfig": { + "access": "public" + }, + "exports": { + ".": { + "import": { + "default": "./dist/index.mjs", + "types": "./dist/index.d.mts" + }, + "required": { + "default": "./dist/index.js", + "types": "./dist/index.d.ts" + } + } + }, + "author": "Microsoft Corporation", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/BotFramework-WebChat.git" + }, + "bugs": { + "url": "https://github.com/microsoft/BotFramework-WebChat/issues" + }, + "homepage": "https://github.com/microsoft/BotFramework-WebChat/packages/core#readme", + "files": [ + "dist/**/*.js", + "dist/**/*.map", + "lib/**/*", + "src/**/*" + ], + "scripts": { + "auditfix": "npm audit fix --legacy-peer-deps || exit 0", + "build": "tsup", + "bump": "npm run bump:prod && npm run bump:dev && npm run bump:auditfix", + "bump:auditfix": "npm audit fix --legacy-peer-deps || exit 0", + "bump:dev": "if [ `cat package.json | jq -r '.devDependencies | length'` -ne 0 ]; then npm install --legacy-peer-deps $(cat package.json | jq -r '(.pinDependencies // {}) as $p | ((.devDependencies // {}) | keys) | map(. + \"@\" + ($p[.] // [\"latest\"])[0]) | .[]'); fi", + "bump:prod": "if [ `cat package.json | jq -r '.dependencies | length'` -ne 0 ]; then npm install --legacy-peer-deps --save-exact $(cat package.json | jq -r '(.pinDependencies // {}) as $p | ((.dependencies // {}) | keys) | map(. + \"@\" + ($p[.] // [\"latest\"])[0]) | .[]'); fi", + "eslint": "npm run precommit", + "postauditfix": "npm run postbump", + "postbump": "cat package.json | jq '. + (.dependencies = ((.dependencies + (.localPeerDependencies // {})) | to_entries | sort_by(.key) | from_entries)) | (.devDependencies = ((.devDependencies + (.localPeerDevDependencies // {})) | to_entries | sort_by(.key) | from_entries))' > package-temp.json && mv package-temp.json package.json", + "preauditfix": "npm run prebump", + "prebump": "cat package.json | jq '(((.localPeerDependencies // {}) | keys | map([\"dependencies\", .])) + ((.localPeerDevDependencies // {}) | keys | map([\"devDependencies\", .]))) as $localPeerPaths | delpaths($localPeerPaths)' > package-temp.json && mv package-temp.json package.json", + "precommit": "npm run precommit:eslint -- src && npm run precommit:typecheck", + "precommit:eslint": "../../node_modules/.bin/eslint --report-unused-disable-directives --max-warnings 0", + "precommit:typecheck": "tsc --project ./src --emitDeclarationOnly false --esModuleInterop true --noEmit --pretty false", + "start": "npm run build -- --watch" + }, + "pinDependencies": {}, + "devDependencies": { + "@tsconfig/strictest": "^2.0.5", + "@types/node": "^20.10.3", + "tsup": "^8.0.2", + "typescript": "^5.3.2" + }, + "dependencies": { + "botframework-webchat-component": "^0.0.0-0", + "inject-meta-tag": "^0.0.1" + }, + "peerDependencies": { + "react": ">= 16.8.6" + } +} diff --git a/packages/fluent-theme/src/bundle.ts b/packages/fluent-theme/src/bundle.ts new file mode 100644 index 0000000000..23296174e1 --- /dev/null +++ b/packages/fluent-theme/src/bundle.ts @@ -0,0 +1,3 @@ +import { FluentThemeProvider } from './index'; + +globalThis.WebChat = { ...globalThis.WebChat, FluentThemeProvider }; diff --git a/packages/fluent-theme/src/external/ThemeProvider.tsx b/packages/fluent-theme/src/external/ThemeProvider.tsx new file mode 100644 index 0000000000..e456c2cdde --- /dev/null +++ b/packages/fluent-theme/src/external/ThemeProvider.tsx @@ -0,0 +1,16 @@ +import { type Components } from 'botframework-webchat-component'; + +// TODO: We should do isomorphic: +// - If loading UMD, we should look at window.WebChat.Components.ThemeProvider +// - Otherwise, we should import { type Components } from 'botframework-webchat-component' +type ThemeProviderType = (typeof Components)['ThemeProvider']; + +const { + WebChat: { + Components: { ThemeProvider } + } +} = globalThis as unknown as { + WebChat: { Components: { ThemeProvider: ThemeProviderType } }; +}; + +export default ThemeProvider; diff --git a/packages/fluent-theme/src/index.ts b/packages/fluent-theme/src/index.ts new file mode 100644 index 0000000000..cf281d1690 --- /dev/null +++ b/packages/fluent-theme/src/index.ts @@ -0,0 +1,9 @@ +import { injectMetaTag } from 'inject-meta-tag'; + +import FluentThemeProvider from './private/FluentThemeProvider'; + +declare const NPM_PACKAGE_VERSION: string; + +injectMetaTag('botframework-webchat-fluent-theme:version', NPM_PACKAGE_VERSION); + +export { FluentThemeProvider }; diff --git a/packages/fluent-theme/src/private/FluentThemeProvider.tsx b/packages/fluent-theme/src/private/FluentThemeProvider.tsx new file mode 100644 index 0000000000..4aa6ad3c81 --- /dev/null +++ b/packages/fluent-theme/src/private/FluentThemeProvider.tsx @@ -0,0 +1,18 @@ +import React, { memo, type ReactNode } from 'react'; + +import ThemeProvider from '../external/ThemeProvider'; +import SendBox from './SendBox'; + +type Props = Readonly<{ children?: ReactNode | undefined }>; + +const STYLE_OPTIONS = { bubbleBackground: '#fee' }; + +const sendBoxMiddleware = [() => () => () => SendBox]; + +const FluentThemeProvider = ({ children }: Props) => ( + + {children} + +); + +export default memo(FluentThemeProvider); diff --git a/packages/fluent-theme/src/private/SendBox.tsx b/packages/fluent-theme/src/private/SendBox.tsx new file mode 100644 index 0000000000..715a5f88e0 --- /dev/null +++ b/packages/fluent-theme/src/private/SendBox.tsx @@ -0,0 +1,7 @@ +import React, { memo } from 'react'; + +type Props = Readonly<{ className?: string | undefined }>; + +const SendBox = ({ className }: Props) =>
{'Fluent send box'}
; + +export default memo(SendBox); diff --git a/packages/fluent-theme/src/tsconfig.json b/packages/fluent-theme/src/tsconfig.json new file mode 100644 index 0000000000..649910a0cd --- /dev/null +++ b/packages/fluent-theme/src/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "jsx": "react", + "moduleResolution": "Bundler", + "skipLibCheck": true, + "target": "ESNext" + }, + "files": ["index.ts"], + "extends": "@tsconfig/strictest/tsconfig.json" +} diff --git a/packages/fluent-theme/tsup.config.js b/packages/fluent-theme/tsup.config.js new file mode 100644 index 0000000000..2358482288 --- /dev/null +++ b/packages/fluent-theme/tsup.config.js @@ -0,0 +1,31 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig([ + { + dts: true, + entry: ['./src/index.ts'], + esbuildOptions(options) { + options.define.NPM_PACKAGE_VERSION = JSON.stringify(process.env.npm_package_version); + }, + format: ['cjs', 'esm'], + sourcemap: true + }, + { + conditions: ['browser'], + entry: { + 'botframework-webchat-fluent-theme.production.min': './src/bundle.ts' + }, + esbuildOptions(options) { + options.define.NPM_PACKAGE_VERSION = JSON.stringify(process.env.npm_package_version); + options.define['process.env.NODE_ENV'] = '"production"'; + }, + format: 'iife', + minify: true, + outExtension() { + return { + js: '.js' + }; + }, + sourcemap: true + } +]); diff --git a/packages/test/dev-server/src/index.js b/packages/test/dev-server/src/index.js index 2d3b2e1d55..da89758b2d 100644 --- a/packages/test/dev-server/src/index.js +++ b/packages/test/dev-server/src/index.js @@ -1,11 +1,11 @@ -import { createProxyMiddleware } from 'http-proxy-middleware'; -import { fileURLToPath } from 'url'; -import { readFile } from 'fs/promises'; -import { resolve } from 'path'; import chalk from 'chalk'; import compression from 'compression'; import express from 'express'; +import { readFile } from 'fs/promises'; +import { createProxyMiddleware } from 'http-proxy-middleware'; +import { resolve } from 'path'; import serve from 'serve-handler'; +import { fileURLToPath } from 'url'; const { ESBUILD_TARGET = 'http://127.0.0.1:8000/', PORT = 5001 } = process.env; const resolveFromProjectRoot = resolve.bind(undefined, fileURLToPath(import.meta.url), '../../'); @@ -21,6 +21,16 @@ const resolveFromRepositoryRoot = resolveFromProjectRoot.bind(undefined, '../../ // Using compression will serve files faster from GitHub Codespaces, from 500ms to 200ms. app.use(compression()); + app.use( + '/__dist__/botframework-webchat-fluent-theme.production.min.js', + express.static( + resolve( + fileURLToPath(import.meta.url), + '../../../../fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js' + ) + ) + ); + // /__dist__/ will be serve from ESBuild development server. app.use( '/__dist__/', @@ -40,8 +50,8 @@ const resolveFromRepositoryRoot = resolveFromProjectRoot.bind(undefined, '../../ duration < 1000 ? chalk.greenBright(durationString) : duration < 2000 - ? chalk.yellowBright(durationString) - : chalk.redBright(durationString) + ? chalk.yellowBright(durationString) + : chalk.redBright(durationString) }` ); diff --git a/serve-test.json b/serve-test.json index 8607281723..3c9f210b88 100644 --- a/serve-test.json +++ b/serve-test.json @@ -19,6 +19,10 @@ "source": "/assets/transcripts/:filename", "destination": "__tests__/html/assets/transcripts/:filename" }, + { + "source": "/__dist__/botframework-webchat-fluent-theme.production.min.js", + "destination": "packages/fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js" + }, { "source": "/__dist__/webchat.js", "destination": "packages/bundle/dist/webchat.js" diff --git a/serve.json b/serve.json index 90ee3bc304..bd010634f6 100644 --- a/serve.json +++ b/serve.json @@ -8,6 +8,8 @@ { "source": "/webchat.js", "destination": "packages/bundle/dist/webchat.js" }, { "source": "/webchat-es5.js", "destination": "packages/bundle/dist/webchat-es5.js" }, { "source": "/webchat-es5.js.map", "destination": "packages/bundle/dist/webchat-es5.js.map" }, - { "source": "/webchat-minimal.js", "destination": "packages/bundle/dist/webchat-minimal.js" } + { "source": "/webchat-minimal.js", "destination": "packages/bundle/dist/webchat-minimal.js" }, + { "source": "/botframework-webchat-fluent-theme.production.min.js", "destination": "packages/fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js" }, + { "source": "/botframework-webchat-fluent-theme.production.min.js.map", "destination": "packages/fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js.map" } ] } From b12a966907fe2856d6e2c4534d094d07ec6eaf3e Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 08:37:29 +0000 Subject: [PATCH 12/18] Fix package --- package-lock.json | 21 +++++++---- packages/fluent-theme/package-lock.json | 48 ++++++++++++------------- packages/fluent-theme/package.json | 6 +++- 3 files changed, 43 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 907ea9fb0b..607bbcf145 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26495,7 +26495,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true + "dev": true, + "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { "version": "6.8.1", @@ -27371,7 +27372,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -29774,7 +29776,8 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.9", @@ -30014,7 +30017,8 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-security": { "version": "1.7.1", @@ -32455,7 +32459,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "28.0.2", @@ -38675,7 +38680,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true + "dev": true, + "requires": {} }, "tsconfig-paths": { "version": "4.1.2", @@ -39572,7 +39578,8 @@ "version": "8.14.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "dev": true + "dev": true, + "requires": {} }, "xml": { "version": "1.0.1", diff --git a/packages/fluent-theme/package-lock.json b/packages/fluent-theme/package-lock.json index 231ab26f46..064ec083f3 100644 --- a/packages/fluent-theme/package-lock.json +++ b/packages/fluent-theme/package-lock.json @@ -14,12 +14,12 @@ "devDependencies": { "@tsconfig/strictest": "^2.0.5", "@types/node": "^20.10.3", + "@types/react": "^18.2.74", "tsup": "^8.0.2", "typescript": "^5.3.2" }, "peerDependencies": { - "react": ">= 16.8.6", - "react-dom": ">= 16.8.6" + "react": ">= 16.8.6" } }, "node_modules/@babel/runtime-corejs3": { @@ -728,6 +728,22 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.74", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.74.tgz", + "integrity": "sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -918,6 +934,12 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1602,19 +1624,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1708,15 +1717,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/packages/fluent-theme/package.json b/packages/fluent-theme/package.json index 8ef3b5ca0e..d254f705b1 100644 --- a/packages/fluent-theme/package.json +++ b/packages/fluent-theme/package.json @@ -56,14 +56,18 @@ "devDependencies": { "@tsconfig/strictest": "^2.0.5", "@types/node": "^20.10.3", + "@types/react": "^18.2.74", "tsup": "^8.0.2", "typescript": "^5.3.2" }, "dependencies": { - "botframework-webchat-component": "^0.0.0-0", + "botframework-webchat-component": "0.0.0-0", "inject-meta-tag": "^0.0.1" }, "peerDependencies": { "react": ">= 16.8.6" + }, + "localPeerDependencies": { + "botframework-webchat-component": "0.0.0-0" } } From e353cb913426cadad06f2de29ac3ad5de5fc8b77 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 08:49:29 +0000 Subject: [PATCH 13/18] Add entries --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2200f47607..0cc37410a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,7 +32,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Resolves [#5083](https://github.com/microsoft/BotFramework-WebChat/issues/5083). Added `sendAttachmentOn` style option to send attachments and text in a single activity, by [@ms-jb](https://github.com/ms-jb) and [@compulim](https://github.com/compulim) - `useSendMessage` hook is updated to support sending attachments with a message - `useSendBoxAttachments` hook is added to get/set attachments in the send box -- Resolves [#5081](https://github.com/microsoft/BotFramework-WebChat/issues/5081). Added `uploadAccept` and `uploadMultiple` style options, by [@ms-jb](https://github.com/ms-jb) +- Resolves [#5081](https://github.com/microsoft/BotFramework-WebChat/issues/5081). Added `uploadAccept` and `uploadMultiple` style options, by [@ms-jb](https://github.com/ms-jb), in PR [#5048](https://github.com/microsoft/BotFramework-WebChat/pull/5048) +- Added `sendBoxMiddleware` and `sendBoxToolbarMiddleware`, by [@compulim](https://github.com/compulim), in PR [#5120](https://github.com/microsoft/BotFramework-WebChat/pull/5120) +- Added `botframework-webchat-fluent-theme` package for applying Fluent UI theme to Web Chat, by [@compulim](https://github.com/compulim), in PR [#5120](https://github.com/microsoft/BotFramework-WebChat/pull/5120) +- Added `` component to apply theme pack to Web Chat, by [@compulim](https://github.com/compulim), in PR [#5120](https://github.com/microsoft/BotFramework-WebChat/pull/5120) ### Fixed From 509a0e0473fe24a7b0fb259ae2d34289ee0f72af Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 09:12:08 +0000 Subject: [PATCH 14/18] Pack more artifacts --- .github/workflows/pull-request-validation.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pull-request-validation.yml b/.github/workflows/pull-request-validation.yml index 522cf93452..24b6206161 100644 --- a/.github/workflows/pull-request-validation.yml +++ b/.github/workflows/pull-request-validation.yml @@ -62,6 +62,7 @@ jobs: ./package.json ./package-lock.json ./packages/bundle/dist/ + ./packages/fluent-theme/dist/ ./packages/test/harness/ ./packages/test/page-object/dist/ ./serve-test.json From 041dc41539acc163aee6fce7dc77137102c4eefe Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 09:16:37 +0000 Subject: [PATCH 15/18] Fix precommit --- packages/fluent-theme/src/bundle.ts | 2 +- packages/fluent-theme/src/tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fluent-theme/src/bundle.ts b/packages/fluent-theme/src/bundle.ts index 23296174e1..b20609bf1b 100644 --- a/packages/fluent-theme/src/bundle.ts +++ b/packages/fluent-theme/src/bundle.ts @@ -1,3 +1,3 @@ import { FluentThemeProvider } from './index'; -globalThis.WebChat = { ...globalThis.WebChat, FluentThemeProvider }; +(globalThis as any).WebChat = { ...(globalThis as any).WebChat, FluentThemeProvider }; diff --git a/packages/fluent-theme/src/tsconfig.json b/packages/fluent-theme/src/tsconfig.json index 649910a0cd..0f7e726bf9 100644 --- a/packages/fluent-theme/src/tsconfig.json +++ b/packages/fluent-theme/src/tsconfig.json @@ -1,11 +1,11 @@ { "compilerOptions": { "allowSyntheticDefaultImports": true, + "checkJs": false, "jsx": "react", "moduleResolution": "Bundler", "skipLibCheck": true, "target": "ESNext" }, - "files": ["index.ts"], "extends": "@tsconfig/strictest/tsconfig.json" } From 58b5279b85c441fd026a3824f1392cc585ffc45f Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 17:47:21 +0000 Subject: [PATCH 16/18] Add typings --- packages/api/src/hooks/Composer.tsx | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/api/src/hooks/Composer.tsx b/packages/api/src/hooks/Composer.tsx index ab4b7c65f5..ea82c224c6 100644 --- a/packages/api/src/hooks/Composer.tsx +++ b/packages/api/src/hooks/Composer.tsx @@ -109,7 +109,19 @@ const DISPATCHERS = { submitSendBox }; -function createCardActionContext({ cardActionMiddleware, directLine, dispatch, markAllAsAcknowledged, ponyfill }) { +function createCardActionContext({ + cardActionMiddleware, + directLine, + dispatch, + markAllAsAcknowledged, + ponyfill +}: { + cardActionMiddleware: readonly CardActionMiddleware[]; + directLine: DirectLineJSBotConnection; + dispatch: Function; + markAllAsAcknowledged: () => void; + ponyfill: GlobalScopePonyfill; +}) { const runMiddleware = applyMiddleware( 'card action', ...cardActionMiddleware, @@ -149,7 +161,15 @@ function createCardActionContext({ cardActionMiddleware, directLine, dispatch, m }; } -function createGroupActivitiesContext({ groupActivitiesMiddleware, groupTimestamp, ponyfill }) { +function createGroupActivitiesContext({ + groupActivitiesMiddleware, + groupTimestamp, + ponyfill +}: { + groupActivitiesMiddleware: readonly GroupActivitiesMiddleware[]; + groupTimestamp: boolean | number; + ponyfill: GlobalScopePonyfill; +}) { const runMiddleware = applyMiddleware( 'group activities', ...groupActivitiesMiddleware, From 167b9cb1a5bc5e1222ff1f95ccd8c264a40236e9 Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 17:52:04 +0000 Subject: [PATCH 17/18] Sort --- serve.json | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/serve.json b/serve.json index bd010634f6..ca1cb84dec 100644 --- a/serve.json +++ b/serve.json @@ -2,14 +2,26 @@ "cleanUrls": false, "redirects": [ { "source": "/", "destination": "samples/index.html" }, + { + "source": "/botframework-webchat-fluent-theme.production.min.js", + "destination": "packages/fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js" + }, + { + "source": "/botframework-webchat-fluent-theme.production.min.js.map", + "destination": "packages/fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js.map" + }, { "source": "/directline.js", "destination": "packages/bundle/dist/directline.js" }, - { "source": "/directlinespeech.development.js", "destination": "packages/directlinespeech/dist/directlinespeech.development.js" }, - { "source": "/directlinespeech.production.min.js", "destination": "packages/directlinespeech/dist/directlinespeech.production.min.js" }, + { + "source": "/directlinespeech.development.js", + "destination": "packages/directlinespeech/dist/directlinespeech.development.js" + }, + { + "source": "/directlinespeech.production.min.js", + "destination": "packages/directlinespeech/dist/directlinespeech.production.min.js" + }, { "source": "/webchat.js", "destination": "packages/bundle/dist/webchat.js" }, { "source": "/webchat-es5.js", "destination": "packages/bundle/dist/webchat-es5.js" }, { "source": "/webchat-es5.js.map", "destination": "packages/bundle/dist/webchat-es5.js.map" }, - { "source": "/webchat-minimal.js", "destination": "packages/bundle/dist/webchat-minimal.js" }, - { "source": "/botframework-webchat-fluent-theme.production.min.js", "destination": "packages/fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js" }, - { "source": "/botframework-webchat-fluent-theme.production.min.js.map", "destination": "packages/fluent-theme/dist/botframework-webchat-fluent-theme.production.min.js.map" } + { "source": "/webchat-minimal.js", "destination": "packages/bundle/dist/webchat-minimal.js" } ] } From e08d4d7147f38f87a485dc0c2ecec13e34aa9fee Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 8 Apr 2024 17:52:09 +0000 Subject: [PATCH 18/18] Add comments --- packages/component/src/providers/Theme/ThemeProvider.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/component/src/providers/Theme/ThemeProvider.tsx b/packages/component/src/providers/Theme/ThemeProvider.tsx index 7e04ac9080..e62e7eb58f 100644 --- a/packages/component/src/providers/Theme/ThemeProvider.tsx +++ b/packages/component/src/providers/Theme/ThemeProvider.tsx @@ -24,6 +24,7 @@ const ThemeProvider = ({ }: Props) => { const existingContext = useContext(Context); + // TODO: [P1] We should reduce boilerplate code. const mergedActivityMiddleware = useMemo( () => Object.freeze([...(activityMiddleware || []), ...existingContext.activityMiddleware]), [activityMiddleware, existingContext.activityMiddleware]