diff --git a/.eslintignore b/.eslintignore index 66c604018..844f76987 100644 --- a/.eslintignore +++ b/.eslintignore @@ -954,12 +954,6 @@ packages/app-mobile/components/NoteEditor/SelectionFormatting.js.map packages/app-mobile/components/NoteEditor/types.d.ts packages/app-mobile/components/NoteEditor/types.js packages/app-mobile/components/NoteEditor/types.js.map -packages/app-mobile/components/NotesBar.d.ts -packages/app-mobile/components/NotesBar.js -packages/app-mobile/components/NotesBar.js.map -packages/app-mobile/components/NotesBarListItem.d.ts -packages/app-mobile/components/NotesBarListItem.js -packages/app-mobile/components/NotesBarListItem.js.map packages/app-mobile/components/ScreenHeader.d.ts packages/app-mobile/components/ScreenHeader.js packages/app-mobile/components/ScreenHeader.js.map @@ -969,18 +963,12 @@ packages/app-mobile/components/SelectDateTimeDialog.js.map packages/app-mobile/components/SideMenu.d.ts packages/app-mobile/components/SideMenu.js packages/app-mobile/components/SideMenu.js.map -packages/app-mobile/components/checkbox.d.ts -packages/app-mobile/components/checkbox.js -packages/app-mobile/components/checkbox.js.map packages/app-mobile/components/getResponsiveValue.d.ts packages/app-mobile/components/getResponsiveValue.js packages/app-mobile/components/getResponsiveValue.js.map packages/app-mobile/components/getResponsiveValue.test.d.ts packages/app-mobile/components/getResponsiveValue.test.js packages/app-mobile/components/getResponsiveValue.test.js.map -packages/app-mobile/components/global-style.d.ts -packages/app-mobile/components/global-style.js -packages/app-mobile/components/global-style.js.map packages/app-mobile/components/screens/ConfigScreen.d.ts packages/app-mobile/components/screens/ConfigScreen.js packages/app-mobile/components/screens/ConfigScreen.js.map @@ -993,12 +981,6 @@ packages/app-mobile/components/screens/UpgradeSyncTargetScreen.js.map packages/app-mobile/components/screens/encryption-config.d.ts packages/app-mobile/components/screens/encryption-config.js packages/app-mobile/components/screens/encryption-config.js.map -packages/app-mobile/components/searchNotes.d.ts -packages/app-mobile/components/searchNotes.js -packages/app-mobile/components/searchNotes.js.map -packages/app-mobile/components/useStyles.d.ts -packages/app-mobile/components/useStyles.js -packages/app-mobile/components/useStyles.js.map packages/app-mobile/gulpfile.d.ts packages/app-mobile/gulpfile.js packages/app-mobile/gulpfile.js.map diff --git a/.eslintrc.js b/.eslintrc.js index ce0734cf6..83de6e456 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -29,7 +29,6 @@ module.exports = { // React Native variables '__DEV__': 'readonly', - 'JSX': 'readonly', // Clipper variables 'browserSupportsPromises_': true, diff --git a/.gitignore b/.gitignore index abbe8d75f..ed38fd08e 100644 --- a/.gitignore +++ b/.gitignore @@ -942,12 +942,6 @@ packages/app-mobile/components/NoteEditor/SelectionFormatting.js.map packages/app-mobile/components/NoteEditor/types.d.ts packages/app-mobile/components/NoteEditor/types.js packages/app-mobile/components/NoteEditor/types.js.map -packages/app-mobile/components/NotesBar.d.ts -packages/app-mobile/components/NotesBar.js -packages/app-mobile/components/NotesBar.js.map -packages/app-mobile/components/NotesBarListItem.d.ts -packages/app-mobile/components/NotesBarListItem.js -packages/app-mobile/components/NotesBarListItem.js.map packages/app-mobile/components/ScreenHeader.d.ts packages/app-mobile/components/ScreenHeader.js packages/app-mobile/components/ScreenHeader.js.map @@ -957,18 +951,12 @@ packages/app-mobile/components/SelectDateTimeDialog.js.map packages/app-mobile/components/SideMenu.d.ts packages/app-mobile/components/SideMenu.js packages/app-mobile/components/SideMenu.js.map -packages/app-mobile/components/checkbox.d.ts -packages/app-mobile/components/checkbox.js -packages/app-mobile/components/checkbox.js.map packages/app-mobile/components/getResponsiveValue.d.ts packages/app-mobile/components/getResponsiveValue.js packages/app-mobile/components/getResponsiveValue.js.map packages/app-mobile/components/getResponsiveValue.test.d.ts packages/app-mobile/components/getResponsiveValue.test.js packages/app-mobile/components/getResponsiveValue.test.js.map -packages/app-mobile/components/global-style.d.ts -packages/app-mobile/components/global-style.js -packages/app-mobile/components/global-style.js.map packages/app-mobile/components/screens/ConfigScreen.d.ts packages/app-mobile/components/screens/ConfigScreen.js packages/app-mobile/components/screens/ConfigScreen.js.map @@ -981,12 +969,6 @@ packages/app-mobile/components/screens/UpgradeSyncTargetScreen.js.map packages/app-mobile/components/screens/encryption-config.d.ts packages/app-mobile/components/screens/encryption-config.js packages/app-mobile/components/screens/encryption-config.js.map -packages/app-mobile/components/searchNotes.d.ts -packages/app-mobile/components/searchNotes.js -packages/app-mobile/components/searchNotes.js.map -packages/app-mobile/components/useStyles.d.ts -packages/app-mobile/components/useStyles.js -packages/app-mobile/components/useStyles.js.map packages/app-mobile/gulpfile.d.ts packages/app-mobile/gulpfile.js packages/app-mobile/gulpfile.js.map diff --git a/package.json b/package.json index 55fd57b18..d397954ca 100644 --- a/package.json +++ b/package.json @@ -86,9 +86,5 @@ "node-gyp": "^8.4.1", "nodemon": "^2.0.9" }, - "packageManager": "yarn@3.1.1", - "resolutions": { - "@types/react": "17.0.14", - "@types/react-dom": "17.0.14" - } + "packageManager": "yarn@3.1.1" } diff --git a/packages/app-mobile/components/NotesBar.tsx b/packages/app-mobile/components/NotesBar.tsx deleted file mode 100644 index 0dd7a922b..000000000 --- a/packages/app-mobile/components/NotesBar.tsx +++ /dev/null @@ -1,293 +0,0 @@ -import * as React from 'react'; -import { View, Text, TextInput, TouchableOpacity, FlatList, StyleSheet } from 'react-native'; -import { State } from '@joplin/lib/reducer'; -import { themeStyle } from './global-style'; -const { connect } = require('react-redux'); -const Icon = require('react-native-vector-icons/Ionicons').default; -const { _ } = require('@joplin/lib/locale'); -import { Style } from './global-style'; -import Note from '@joplin/lib/models/Note'; -import NotesBarListItem from './NotesBarListItem'; -import Folder from '@joplin/lib/models/Folder'; -import searchNotes from './searchNotes'; - -interface Props { - themeId: number; - notes: any[]; - todoCheckbox_change: (checked: boolean)=> void; - selectedFolderId: string; - activeFolderId: string; - dispatch: any; - selectedNoteId: string; - settings: any; -} - -function NotesBarComponent(props: Props) { - - const [query, setQuery] = React.useState(''); - const [notes, setNotes] = React.useState(props.notes); - const theme: Style = React.useMemo(() => themeStyle(props.themeId), [props.themeId]); - - const styles = (): Style => { - const styles: Style = { - container: { - flex: 1, - width: '100%', - backgroundColor: theme.backgroundColor3, - }, - horizontalFlex: { - flexDirection: 'row', - }, - title: { - alignItems: 'center', - }, - titleText: { - fontSize: 16, - }, - closeIcon: { - fontSize: 30, - paddingTop: 8, - paddingBottom: 8, - paddingRight: theme.marginRight, - paddingLeft: theme.marginLeft, - }, - top: { - color: theme.color, - }, - topContainer: { - width: '100%', - justifyContent: 'space-between', - paddingLeft: theme.marginLeft, - }, - padding: { - paddingLeft: theme.marginLeft, - paddingRight: theme.marginRight, - paddingTop: 12, - paddingBottom: 12, - }, - titleIcon: { - fontSize: 22, - marginRight: 4, - }, - divider: { - backgroundColor: theme.dividerColor, - height: 1, - width: '100%', - }, - nativeInput: { - fontSize: theme.fontSize, - flex: 1, - paddingRight: 8, - }, - searchIcon: { - fontSize: 22, - }, - searchInput: { - alignItems: 'center', - backgroundColor: theme.backgroundColor, - paddingLeft: 8, - borderRadius: 4, - borderWidth: 1, - borderColor: theme.dividerColor, - height: 42, - flex: 1, - }, - button: { - height: 42, - width: 42, - backgroundColor: theme.color4, - alignItems: 'center', - justifyContent: 'center', - borderRadius: 4, - flex: 0.5, - marginLeft: 8, - }, - buttonIcon: { - color: theme.backgroundColor, - fontSize: 22, - }, - inputGroup: { - justifyContent: 'space-between', - }, - }; - - return StyleSheet.create(styles); - }; - - const titleComp = ( - - - {_('Notes')} - - ); - - const dividerComp = ( - - ); - - const handleNotesBarClose = () => { - props.dispatch({ type: 'NOTES_BAR_CLOSE' }); - }; - - const closeButtonComp = ( - - - - ); - - const renderIconButton = (icon: JSX.Element, onPress: ()=> Promise, label: string) => { - return ( - - {icon} - - ); - }; - - - const handleNewNote = async (isTodo: boolean) => { - let folderId = props.selectedFolderId !== Folder.conflictFolderId() ? props.selectedFolderId : null; - if (!folderId) folderId = props.activeFolderId; - - props.dispatch({ - type: 'NAV_BACK', - }); - - const newNote = await Note.save({ - parent_id: folderId, - is_todo: isTodo ? 1 : 0, - }, { provisional: true }); - - props.dispatch({ - type: 'NAV_GO', - routeName: 'Note', - noteId: newNote.id, - }); - }; - - const addNoteButtonComp = renderIconButton(, () => handleNewNote(false), _('New note')); - const addTodoButtonComp = renderIconButton(, () => handleNewNote(true), _('New to-do')); - - const topComp = ( - - - {titleComp} - {closeButtonComp} - - {dividerComp} - - ); - - const refreshSearch = async () => { - const notes = await searchNotes(query, props.settings['db.ftsEnabled'], props.dispatch); - setNotes(notes); - }; - - const handleQuerySubmit = async () => { - const trimmedQuery = query.trim(); - - if (!trimmedQuery) { - props.dispatch({ - type: 'SEARCH_QUERY', - query: '', - }); - } else { - props.dispatch({ - type: 'SEARCH_QUERY', - query: trimmedQuery, - }); - } - - setQuery(trimmedQuery); - await refreshSearch(); - }; - - const searchInputComp = ( - - - - - - ); - - const inputGroupComp = ( - - - {searchInputComp} - {addNoteButtonComp} - {addTodoButtonComp} - - {dividerComp} - - ); - - let flatListRef: any = React.useRef(null); - - const onRenderItem = React.useCallback(({ item }: { item: any }) => { - if (item.is_todo) { - return ; - } else { - return ; - } - }, [props.todoCheckbox_change]); - - const NotesBarListComp = ( - item.id} - getItemLayout={(data, index) => ( - { - length: data.length, - offset: (theme.fontSize + styles().padding.paddingTop + styles().padding.paddingBottom) * index, - viewOffset: (theme.fontSize + styles().padding.paddingTop + styles().padding.paddingBottom), - index, - } - )} - ref={(ref: any) => { flatListRef = ref; }} - /> - ); - - // Scroll the notesbar to selected note item after rendering - React.useEffect(() => { - const selectedItemIndex = notes.findIndex(item => item.id === props.selectedNoteId); - if (selectedItemIndex >= 0) { - flatListRef.scrollToIndex({ index: selectedItemIndex }); - } - }); - - // Update the notesbar when a note item changes - React.useEffect(() => { - setNotes(props.notes); - }, [props.notes]); - - return ( - - {topComp} - {inputGroupComp} - { NotesBarListComp } - - ); -} - -const NotesBar = connect((state: State) => { - return { - themeId: state.settings.theme, - notes: state.notes, - activeFolderId: state.settings.activeFolderId, - selectedFolderId: state.selectedFolderId, - selectedNoteId: state.selectedNoteIds[0], - settings: state.settings, - }; -})(NotesBarComponent); - -export default NotesBar; diff --git a/packages/app-mobile/components/NotesBarListItem.tsx b/packages/app-mobile/components/NotesBarListItem.tsx deleted file mode 100644 index 9c5331cfa..000000000 --- a/packages/app-mobile/components/NotesBarListItem.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import * as React from 'react'; -import Checkbox from './checkbox'; -import Note from '@joplin/lib/models/Note'; -import { View, TouchableOpacity, Text, StyleSheet } from 'react-native'; -import { Style } from './global-style'; -import { State } from '@joplin/lib/reducer'; -const { connect } = require('react-redux'); -const { _ } = require('@joplin/lib/locale'); -import shim from '@joplin/lib/shim'; -import { themeStyle } from './global-style'; - - -interface NoteListProps { - note: any; - themeId: number; - todoCheckbox_change: (checked: boolean)=> void; - dispatch: Function; - selectedNoteId: string; -} - -const NotesBarListItemComponent = function(props: NoteListProps) { - const note = props.note ?? {}; - const isTodo = !!Number(note.is_todo); - - const styles = (): Style => { - const themeId = props.themeId; - const theme = themeStyle(themeId); - - const styles: Style = { - horizontalFlex: { - flexDirection: 'row', - }, - padding: { - paddingLeft: theme.marginLeft, - paddingRight: theme.marginRight, - paddingTop: 12, - paddingBottom: 12, - }, - button: { - height: 42, - width: 42, - backgroundColor: theme.color4, - alignItems: 'center', - justifyContent: 'center', - borderRadius: 4, - flex: 0.5, - marginLeft: 8, - }, - itemText: { - fontSize: theme.fontSize, - color: theme.color, - paddingTop: 12, - paddingBottom: 12, - }, - checkbox: { - paddingRight: 10, - paddingLeft: theme.marginLeft, - paddingTop: 12, - paddingBottom: 12, - color: theme.color, - }, - selectedItem: props.selectedNoteId === note.id ? { - backgroundColor: theme.dividerColor, - } : null, - item: { - borderBottomWidth: 1, - borderColor: theme.dividerColor, - }, - }; - - return StyleSheet.create(styles); - }; - - const onTodoCheckboxChange = async (checked: boolean) => { - await props.todoCheckbox_change(checked); - }; - - const onPress = async () => { - if (!note) return; - if (note.encryption_applied) return; - - props.dispatch({ - type: 'NAV_BACK', - }); - - shim.setTimeout(() => { - props.dispatch({ - type: 'NAV_GO', - routeName: 'Note', - noteId: note.id, - }); - }, 5); - }; - - const noteTitle = Note.displayTitle(note); - let item; - - if (isTodo) { - item = ( - - - onTodoCheckboxChange(checked)} - accessibilityLabel={_('to-do: %s', noteTitle)} - /> - {noteTitle} - - - ); - } else { - item = ( - - - {noteTitle} - - - ); - } - - return item; -}; - -const NotesBarListItem = connect((state: State) => { - return { - themeId: state.settings.theme, - selectedNoteId: state.selectedNoteIds[0], - }; -})(NotesBarListItemComponent); - -export default NotesBarListItem; diff --git a/packages/app-mobile/components/checkbox.tsx b/packages/app-mobile/components/checkbox.tsx deleted file mode 100644 index 748be95bc..000000000 --- a/packages/app-mobile/components/checkbox.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import * as React from 'react'; -const Component = React.Component; -const { View, TouchableHighlight } = require('react-native'); -const Icon = require('react-native-vector-icons/Ionicons').default; -Icon.loadFont(); - -interface Style { - [key: string]: any; -} -interface Props { - style: Style; - checked: boolean; - onChange: (checked: boolean)=> void; - accessibilityLabel?: string; -} - -interface State { - checked: boolean; -} - -const styles: Style = { - checkboxIcon: { - fontSize: 20, - height: 22, - // marginRight: 10, - }, -}; - -class Checkbox extends Component { - - public constructor(props: Props) { - super(props); - this.state = { - checked: false, - }; - } - - public UNSAFE_componentWillMount() { - this.setState({ checked: this.props.checked }); - } - - public UNSAFE_componentWillReceiveProps(newProps: Props) { - if ('checked' in newProps) { - this.setState({ checked: newProps.checked }); - } - } - - private onPress() { - const newChecked = !this.state.checked; - this.setState({ checked: newChecked }); - if (this.props.onChange) this.props.onChange(newChecked); - } - - public render() { - const iconName = this.state.checked ? 'md-checkbox-outline' : 'md-square-outline'; - - const style: Style = this.props.style ? Object.assign({}, this.props.style) : {}; - style.justifyContent = 'center'; - style.alignItems = 'center'; - - const checkboxIconStyle = Object.assign({}, styles.checkboxIcon); - if (style.color) checkboxIconStyle.color = style.color; - - if (style.paddingTop) checkboxIconStyle.marginTop = style.paddingTop; - if (style.paddingBottom) checkboxIconStyle.marginBottom = style.paddingBottom; - if (style.paddingLeft) checkboxIconStyle.marginLeft = style.paddingLeft; - if (style.paddingRight) checkboxIconStyle.marginRight = style.paddingRight; - - const thStyle = { - justifyContent: 'center', - alignItems: 'center', - }; - - if (style && style.display === 'none') return ; - - // if (style.display) thStyle.display = style.display; - - return ( - this.onPress()} - style={thStyle} - accessibilityRole="checkbox" - accessibilityState={{ - checked: this.state.checked, - }} - accessibilityLabel={this.props.accessibilityLabel ?? ''}> - - - ); - } -} - -export default Checkbox; diff --git a/packages/app-mobile/components/global-style.ts b/packages/app-mobile/components/global-style.ts deleted file mode 100644 index 10b884688..000000000 --- a/packages/app-mobile/components/global-style.ts +++ /dev/null @@ -1,115 +0,0 @@ -import Setting from '@joplin/lib/models/Setting'; -const { Platform } = require('react-native'); -import { themeById } from '@joplin/lib/theme'; - -export interface Style { - [key: string]: any; -} - -interface Fonts { - [key: number]: string; -} - -interface ThemeCache { - [key: string]: any; -} - -const baseStyle = { - appearance: 'light', - fontSize: 16, - noteViewerFontSize: 16, - margin: 15, // No text and no interactive component should be within this margin - itemMarginTop: 10, - itemMarginBottom: 10, - fontSizeSmaller: 14, - disabledOpacity: 0.2, - lineHeight: '1.6em', -}; - -const themeCache_: ThemeCache = {}; - -function addExtraStyles(style: Style) { - style.marginRight = style.margin; - style.marginLeft = style.margin; - style.marginTop = style.margin; - style.marginBottom = style.margin; - - style.icon = { - color: style.color, - fontSize: 30, - }; - - style.lineInput = { - color: style.color, - backgroundColor: style.backgroundColor, - borderBottomWidth: 1, - borderColor: style.dividerColor, - paddingBottom: 0, - }; - - if (Platform.OS === 'ios') { - delete style.lineInput.borderBottomWidth; - delete style.lineInput.borderColor; - } - - style.buttonRow = { - flexDirection: 'row', - borderTopWidth: 1, - borderTopColor: style.dividerColor, - paddingTop: 10, - }; - - style.normalText = { - color: style.color, - fontSize: style.fontSize, - }; - - style.urlText = { - color: style.urlColor, - fontSize: style.fontSize, - }; - - style.headerStyle = { - color: style.color, - fontSize: style.fontSize * 1.2, - fontWeight: 'bold', - }; - - style.headerWrapperStyle = { - backgroundColor: style.headerBackgroundColor, - }; - - style.keyboardAppearance = style.appearance; - - return style; -} - -export function editorFont(fontId?: number) { - // IMPORTANT: The font mapping must match the one in Setting.js - const fonts: Fonts = { - [Setting.FONT_DEFAULT]: null, - [Setting.FONT_MENLO]: 'Menlo', - [Setting.FONT_COURIER_NEW]: 'Courier New', - [Setting.FONT_AVENIR]: 'Avenir', - [Setting.FONT_MONOSPACE]: 'monospace', - }; - if (!fontId) { - // console.warn('Editor font not set! Falling back to default font."'); - fontId = Setting.FONT_DEFAULT; - } - return fonts[fontId]; -} - -export function themeStyle(theme?: number) { - if (!theme) { - console.warn('Theme not set! Defaulting to Light theme.'); - theme = Setting.THEME_LIGHT; - } - - const cacheKey = [theme].join('-'); - if (themeCache_[cacheKey]) return themeCache_[cacheKey]; - - const output = Object.assign({}, baseStyle, themeById(theme)); - themeCache_[cacheKey] = addExtraStyles(output); - return themeCache_[cacheKey]; -} diff --git a/packages/app-mobile/components/note-item.js b/packages/app-mobile/components/note-item.js index 1ac208fb7..f6d8dab3b 100644 --- a/packages/app-mobile/components/note-item.js +++ b/packages/app-mobile/components/note-item.js @@ -2,7 +2,7 @@ const React = require('react'); const Component = React.Component; const { connect } = require('react-redux'); const { Text, TouchableOpacity, View, StyleSheet } = require('react-native'); -const Checkbox = require('./checkbox.js').default; +const { Checkbox } = require('./checkbox.js'); const Note = require('@joplin/lib/models/Note').default; const time = require('@joplin/lib/time').default; const { themeStyle } = require('./global-style.js'); diff --git a/packages/app-mobile/components/screens/Note.tsx b/packages/app-mobile/components/screens/Note.tsx index cd5f9a15a..1da9db9f9 100644 --- a/packages/app-mobile/components/screens/Note.tsx +++ b/packages/app-mobile/components/screens/Note.tsx @@ -3,7 +3,6 @@ import uuid from '@joplin/lib/uuid'; import Setting from '@joplin/lib/models/Setting'; import shim from '@joplin/lib/shim'; import UndoRedoService from '@joplin/lib/services/UndoRedoService'; -import { State } from '@joplin/lib/reducer'; import NoteBodyViewer from '../NoteBodyViewer/NoteBodyViewer'; import checkPermissions from '../../utils/checkPermissions'; import NoteEditor from '../NoteEditor/NoteEditor'; @@ -11,7 +10,7 @@ import { ChangeEvent, UndoRedoDepthChangeEvent } from '../NoteEditor/types'; const FileViewer = require('react-native-file-viewer').default; const React = require('react'); -import { Platform, Keyboard, View, TextInput, StyleSheet, Linking, Image, Share, PermissionsAndroid, Animated, TouchableOpacity, Dimensions, PanResponder } from 'react-native'; +const { Platform, Keyboard, View, TextInput, StyleSheet, Linking, Image, Share, PermissionsAndroid } = require('react-native'); const { connect } = require('react-redux'); // const { MarkdownEditor } = require('@joplin/lib/../MarkdownEditor/index.js'); const RNFS = require('react-native-fs'); @@ -30,12 +29,12 @@ const mimeUtils = require('@joplin/lib/mime-utils.js').mime; import ScreenHeader from '../ScreenHeader'; const NoteTagsDialog = require('./NoteTagsDialog'); import time from '@joplin/lib/time'; -import Checkbox from '../checkbox'; +const { Checkbox } = require('../checkbox.js'); const { _ } = require('@joplin/lib/locale'); import { reg } from '@joplin/lib/registry'; import ResourceFetcher from '@joplin/lib/services/ResourceFetcher'; const { BaseScreenComponent } = require('../base-screen.js'); -import { themeStyle, editorFont } from '../global-style'; +const { themeStyle, editorFont } = require('../global-style.js'); const { dialogs } = require('../../utils/dialogs.js'); const DialogBox = require('react-native-dialogbox').default; const DocumentPicker = require('react-native-document-picker').default; @@ -46,23 +45,20 @@ import { ImagePickerResponse } from 'react-native-image-picker'; import SelectDateTimeDialog from '../SelectDateTimeDialog'; import ShareExtension from '../../utils/ShareExtension.js'; import CameraView from '../CameraView'; -import NotesBar from '../NotesBar'; import { NoteEntity } from '@joplin/lib/services/database/types'; import Logger from '@joplin/lib/Logger'; const urlUtils = require('@joplin/lib/urlUtils'); -const Icon = require('react-native-vector-icons/Feather').default; -import getResponsiveValue from '../getResponsiveValue'; const emptyArray: any[] = []; const logger = Logger.create('screens/Note'); class NoteScreenComponent extends BaseScreenComponent { - public static navigationOptions(): any { + static navigationOptions(): any { return { header: null }; } - public constructor() { + constructor() { super(); this.state = { note: Note.new(), @@ -91,9 +87,6 @@ class NoteScreenComponent extends BaseScreenComponent { canUndo: false, canRedo: false, }, - - notesBarWidth: this.getNotesBarWidth(), - isTablet: Dimensions.get('window').width >= 768, }; this.saveActionQueues_ = {}; @@ -205,7 +198,7 @@ class NoteScreenComponent extends BaseScreenComponent { if (msg.indexOf('file://') === 0) { throw new Error(_('Links with protocol "%s" are not supported', 'file://')); } else { - await Linking.openURL(msg); + Linking.openURL(msg); } } } catch (error) { @@ -246,8 +239,6 @@ class NoteScreenComponent extends BaseScreenComponent { this.onBodyViewerCheckboxChange = this.onBodyViewerCheckboxChange.bind(this); this.onBodyChange = this.onBodyChange.bind(this); this.onUndoRedoDepthChange = this.onUndoRedoDepthChange.bind(this); - this.onNotesBarToggle = this.onNotesBarToggle.bind(this); - this.handleScreenWidthChange_ = this.handleScreenWidthChange_.bind(this); } private useEditorBeta(): boolean { @@ -290,27 +281,7 @@ class NoteScreenComponent extends BaseScreenComponent { }); } - private getNotesBarWidth = () => { - const notesBarWidth = getResponsiveValue({ - sm: 250, - md: 260, - lg: 270, - xl: 280, - xxl: 290, - }); - - return notesBarWidth; - }; - - // Update state that depends on the screen width when the screen width changes ( the device orientation changess) - private handleScreenWidthChange_() { - this.setState({ - notesBarWidth: this.getNotesBarWidth(), - isTablet: Dimensions.get('window').width >= 768, - }); - } - - private screenHeader_undoButtonPress() { + screenHeader_undoButtonPress() { if (this.useEditorBeta()) { this.editorRef.current.undo(); } else { @@ -318,7 +289,7 @@ class NoteScreenComponent extends BaseScreenComponent { } } - private screenHeader_redoButtonPress() { + screenHeader_redoButtonPress() { if (this.useEditorBeta()) { this.editorRef.current.redo(); } else { @@ -326,13 +297,13 @@ class NoteScreenComponent extends BaseScreenComponent { } } - private undoState(noteBody: string = null) { + undoState(noteBody: string = null) { return { body: noteBody === null ? this.state.note.body : noteBody, }; } - private styles() { + styles() { const themeId = this.props.themeId; const theme = themeStyle(themeId); @@ -351,7 +322,6 @@ class NoteScreenComponent extends BaseScreenComponent { flex: 1, paddingLeft: theme.marginLeft, paddingRight: theme.marginRight, - paddingBottom: Platform.OS === 'ios' ? 40 : 0, // Add extra space to allow scrolling past end of document, and also to fix this: // https://github.com/laurent22/joplin/issues/1437 @@ -417,84 +387,17 @@ class NoteScreenComponent extends BaseScreenComponent { paddingBottom: 10, // Added for iOS (Not needed for Android??) }; - styles.noteMainComp = { - flex: 1, - flexDirection: 'row', - position: 'relative', - }; - - styles.notesBarContainer = { - position: 'relative', - left: this.notesBarPosition, - top: 0, - width: this.state.notesBarWidth, - height: '100%', - }; - - styles.noteComp = { - position: 'relative', - top: 0, - left: this.notePosition, - width: this.noteWidth, - }; - - styles.noteActionButton = { - width: 54, - height: 54, - backgroundColor: theme.backgroundColor3, - borderWidth: 1, - borderColor: theme.dividerColor, - alignItems: 'center', - justifyContent: 'center', - }; - - styles.noteActionButtonActive = { - ...styles.noteActionButton, - borderWidth: 0, - backgroundColor: theme.color4, - }; - - styles.noteActionButton1 = { - borderBottomWidth: 0, - borderTopLeftRadius: 8, - borderTopRightRadius: 8, - }; - - styles.noteActionButton2 = { - // Removing this temporarily till second noteAction is implemented - // borderBottomLeftRadius: 8, - // borderBottomRightRadius: 8, - borderRadius: 8, - }; - - styles.noteActionButtonIcon = { - fontSize: 30, - color: theme.color, - }; - - styles.noteActionButtonIconActive = { - ...styles.noteActionButtonIcon, - color: theme.backgroundColor, - }; - - styles.noteActionButtonGroup = { - position: 'absolute', - top: '8%', - right: '3%', - transform: [{ translateY: this.noteActionsPositionY }], - }; - if (this.state.HACK_webviewLoadingState === 1) styles.titleTextInput.marginTop = 1; this.styles_[cacheKey] = StyleSheet.create(styles); return this.styles_[cacheKey]; } - private isModified() { + isModified() { return shared.isModified(this); } - private async requestGeoLocationPermissions() { + async requestGeoLocationPermissions() { if (!Setting.value('trackLocation')) return; const response = await checkPermissions(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, { @@ -511,7 +414,7 @@ class NoteScreenComponent extends BaseScreenComponent { } } - public async componentDidMount() { + async componentDidMount() { BackButtonService.addHandler(this.backHandler); NavService.addHandler(this.navHandler); @@ -532,75 +435,13 @@ class NoteScreenComponent extends BaseScreenComponent { // has already been granted, it doesn't slow down opening the note. If it hasn't // been granted, the popup will open anyway. void this.requestGeoLocationPermissions(); - - this.unsubscribeScreenWidthChangeHandler_ = Dimensions.addEventListener('change', this.handleScreenWidthChange_); } - private animateNotesBarOpen = () => { - Animated.parallel([ - Animated.spring( - this.notesBarPosition, - { - toValue: 0, - useNativeDriver: false, - } - ), - Animated.spring( - this.notePosition, - { - toValue: 0, - useNativeDriver: false, - } - ), - Animated.spring( - this.noteWidth, - { - toValue: Dimensions.get('window').width - this.state.notesBarWidth, - useNativeDriver: false, - } - ), - ]).start(); - }; - - private animateNotesBarClose = () => { - Animated.parallel([ - Animated.spring( - this.notesBarPosition, - { - toValue: -1 * this.state.notesBarWidth, - useNativeDriver: false, - } - ), - Animated.spring( - this.notePosition, - { - toValue: -1 * this.state.notesBarWidth, - useNativeDriver: false, - } - ), - Animated.spring( - this.noteWidth, - { - toValue: Dimensions.get('window').width, - useNativeDriver: false, - } - ), - ]).start(); - }; - - private onNotesBarToggle = async () => { - if (this.props.showNotesBar) { - this.props.dispatch({ type: 'NOTES_BAR_CLOSE' }); - } else { - this.props.dispatch({ type: 'NOTES_BAR_OPEN' }); - } - }; - - private onMarkForDownload(event: any) { + onMarkForDownload(event: any) { void ResourceFetcher.instance().markForDownload(event.resourceId); } - public componentDidUpdate(prevProps: any) { + componentDidUpdate(prevProps: any) { if (this.doFocusUpdate_) { this.doFocusUpdate_ = false; this.focusUpdate(); @@ -612,17 +453,9 @@ class NoteScreenComponent extends BaseScreenComponent { options: this.sideMenuOptions(), }); } - - if (this.props.showNotesBar !== prevProps.showNotesBar) { - if (this.props.showNotesBar) { - this.animateNotesBarOpen(); - } else { - this.animateNotesBarClose(); - } - } } - public componentWillUnmount() { + componentWillUnmount() { BackButtonService.removeHandler(this.backHandler); NavService.removeHandler(this.navHandler); @@ -637,34 +470,15 @@ class NoteScreenComponent extends BaseScreenComponent { // It cannot theoretically be undefined, since componentDidMount should always be called before // componentWillUnmount, but with React Native the impossible often becomes possible. if (this.undoRedoService_) this.undoRedoService_.off('stackChange', this.undoRedoService_stackChange); - - if (this.unsubscribeScreenWidthChangeHandler_) { - this.unsubscribeScreenWidthChangeHandler_.remove(); - this.unsubscribeScreenWidthChangeHandler_ = null; - } } - public componentWillMount() { - if (this.props.showNotesBar) { - this.notesBarPosition = new Animated.Value(0); - this.notePosition = new Animated.Value(0); - this.noteWidth = new Animated.Value(Dimensions.get('window').width - 250); - } else { - this.notesBarPosition = new Animated.Value(-1 * this.state.notesBarWidth); - this.notePosition = new Animated.Value(-1 * this.state.notesBarWidth); - this.noteWidth = new Animated.Value(Dimensions.get('window').width); - } - - this.noteActionsPositionY = new Animated.Value(0); - } - - private title_changeText(text: string) { + title_changeText(text: string) { shared.noteComponent_change(this, 'title', text); this.setState({ newAndNoTitleChangeNoteId: null }); this.scheduleSave(); } - private body_changeText(text: string) { + body_changeText(text: string) { if (!this.undoRedoService_.canUndo) { this.undoRedoService_.push(this.undoState()); } else { @@ -675,7 +489,7 @@ class NoteScreenComponent extends BaseScreenComponent { this.scheduleSave(); } - private body_selectionChange(event: any) { + body_selectionChange(event: any) { if (this.useEditorBeta()) { this.selection = event.selection; } else { @@ -683,34 +497,34 @@ class NoteScreenComponent extends BaseScreenComponent { } } - private makeSaveAction() { + makeSaveAction() { return async () => { return shared.saveNoteButton_press(this); }; } - private saveActionQueue(noteId: string) { + saveActionQueue(noteId: string) { if (!this.saveActionQueues_[noteId]) { this.saveActionQueues_[noteId] = new AsyncActionQueue(500); } return this.saveActionQueues_[noteId]; } - private scheduleSave() { + scheduleSave() { this.saveActionQueue(this.state.note.id).push(this.makeSaveAction()); } - private async saveNoteButton_press(folderId: string = null) { + async saveNoteButton_press(folderId: string = null) { await shared.saveNoteButton_press(this, folderId); Keyboard.dismiss(); } - private async saveOneProperty(name: string, value: any) { + async saveOneProperty(name: string, value: any) { await shared.saveOneProperty(this, name, value); } - private async deleteNote_onPress() { + async deleteNote_onPress() { const note = this.state.note; if (!note.id) return; @@ -743,7 +557,7 @@ class NoteScreenComponent extends BaseScreenComponent { } } - private async imageDimensions(uri: string) { + async imageDimensions(uri: string) { return new Promise((resolve, reject) => { Image.getSize( uri, @@ -757,7 +571,7 @@ class NoteScreenComponent extends BaseScreenComponent { }); } - private showImagePicker(options: any) { + showImagePicker(options: any) { return new Promise((resolve) => { ImagePicker.launchImageLibrary(options, (response: any) => { resolve(response); @@ -765,7 +579,7 @@ class NoteScreenComponent extends BaseScreenComponent { }); } - private async resizeImage(localFilePath: string, targetPath: string, mimeType: string) { + async resizeImage(localFilePath: string, targetPath: string, mimeType: string) { const maxSize = Resource.IMAGE_MAX_DIMENSION; const dimensions: any = await this.imageDimensions(localFilePath); @@ -814,7 +628,7 @@ class NoteScreenComponent extends BaseScreenComponent { return true; } - private async attachFile(pickerResponse: any, fileType: string) { + async attachFile(pickerResponse: any, fileType: string) { if (!pickerResponse) { // User has cancelled return; @@ -932,11 +746,11 @@ class NoteScreenComponent extends BaseScreenComponent { } } - private takePhoto_onPress() { + takePhoto_onPress() { this.setState({ showCamera: true }); } - private cameraView_onPhoto(data: any) { + cameraView_onPhoto(data: any) { void this.attachFile( { uri: data.uri, @@ -948,7 +762,7 @@ class NoteScreenComponent extends BaseScreenComponent { this.setState({ showCamera: false }); } - private cameraView_onCancel() { + cameraView_onCancel() { this.setState({ showCamera: false }); } @@ -959,34 +773,34 @@ class NoteScreenComponent extends BaseScreenComponent { } } - private toggleIsTodo_onPress() { + toggleIsTodo_onPress() { shared.toggleIsTodo_onPress(this); this.scheduleSave(); } - private tags_onPress() { + tags_onPress() { if (!this.state.note || !this.state.note.id) return; this.setState({ noteTagDialogShown: true }); } - private async share_onPress() { + async share_onPress() { await Share.share({ message: `${this.state.note.title}\n\n${this.state.note.body}`, title: this.state.note.title, }); } - private properties_onPress() { + properties_onPress() { this.props.dispatch({ type: 'SIDE_MENU_OPEN' }); } - public setAlarm_onPress() { + setAlarm_onPress() { this.setState({ alarmDialogShown: true }); } - private async onAlarmDialogAccept(date: Date) { + async onAlarmDialogAccept(date: Date) { const newNote = Object.assign({}, this.state.note); newNote.todo_due = date ? date.getTime() : 0; @@ -995,40 +809,40 @@ class NoteScreenComponent extends BaseScreenComponent { this.setState({ alarmDialogShown: false }); } - private onAlarmDialogReject() { + onAlarmDialogReject() { this.setState({ alarmDialogShown: false }); } - private async showOnMap_onPress() { + async showOnMap_onPress() { if (!this.state.note.id) return; const note = await Note.load(this.state.note.id); try { const url = Note.geolocationUrl(note); - await Linking.openURL(url); + Linking.openURL(url); } catch (error) { this.props.dispatch({ type: 'SIDE_MENU_CLOSE' }); await dialogs.error(this, error.message); } } - private async showSource_onPress() { + async showSource_onPress() { if (!this.state.note.id) return; const note = await Note.load(this.state.note.id); try { - await Linking.openURL(note.source_url); + Linking.openURL(note.source_url); } catch (error) { await dialogs.error(this, error.message); } } - private copyMarkdownLink_onPress() { + copyMarkdownLink_onPress() { const note = this.state.note; Clipboard.setString(Note.markdownTag(note)); } - private sideMenuOptions() { + sideMenuOptions() { const note = this.state.note; if (!note) return []; @@ -1080,7 +894,7 @@ class NoteScreenComponent extends BaseScreenComponent { if (buttonId === 'attachPhoto') void this.attachPhoto_onPress(); } - private menuOptions() { + menuOptions() { const note = this.state.note; const isTodo = note && !!note.is_todo; const isSaved = note && note.id; @@ -1164,11 +978,11 @@ class NoteScreenComponent extends BaseScreenComponent { return output; } - private async todoCheckbox_change(checked: boolean) { + async todoCheckbox_change(checked: boolean) { await this.saveOneProperty('todo_completed', checked ? time.unixMs() : 0); } - public scheduleFocusUpdate() { + scheduleFocusUpdate() { if (this.focusUpdateIID_) shim.clearTimeout(this.focusUpdateIID_); this.focusUpdateIID_ = shim.setTimeout(() => { @@ -1177,7 +991,7 @@ class NoteScreenComponent extends BaseScreenComponent { }, 100); } - private focusUpdate() { + focusUpdate() { if (this.focusUpdateIID_) shim.clearTimeout(this.focusUpdateIID_); this.focusUpdateIID_ = null; @@ -1195,7 +1009,7 @@ class NoteScreenComponent extends BaseScreenComponent { // } } - private async folderPickerOptions_valueChanged(itemValue: any) { + async folderPickerOptions_valueChanged(itemValue: any) { const note = this.state.note; const isProvisionalNote = this.props.provisionalNoteIds.includes(note.id); @@ -1216,7 +1030,7 @@ class NoteScreenComponent extends BaseScreenComponent { }); } - private folderPickerOptions() { + folderPickerOptions() { const options = { enabled: true, selectedFolderId: this.state.folder ? this.state.folder.id : null, @@ -1229,7 +1043,7 @@ class NoteScreenComponent extends BaseScreenComponent { return this.folderPickerOptions_; } - private onBodyViewerLoadEnd() { + onBodyViewerLoadEnd() { shim.setTimeout(() => { this.setState({ HACK_webviewLoadingState: 1 }); shim.setTimeout(() => { @@ -1238,11 +1052,11 @@ class NoteScreenComponent extends BaseScreenComponent { }, 5); } - private onBodyViewerCheckboxChange(newBody: string) { + onBodyViewerCheckboxChange(newBody: string) { void this.saveOneProperty('body', newBody); } - public render() { + render() { if (this.state.isLoading) { return ( @@ -1319,6 +1133,7 @@ class NoteScreenComponent extends BaseScreenComponent { placeholderTextColor={theme.colorFaded} // need some extra padding for iOS so that the keyboard won't cover last line of the note // see https://github.com/laurent22/joplin/issues/3607 + paddingBottom={ Platform.OS === 'ios' ? 40 : 0} /> ); } else { @@ -1397,65 +1212,6 @@ class NoteScreenComponent extends BaseScreenComponent { const noteTagDialog = !this.state.noteTagDialogShown ? null : ; - // Different styles for when the note actions are active or not - const notesBarToggleIconStyle = this.props.showNotesBar ? this.styles().noteActionButtonIconActive : this.styles().noteActionButtonIcon; - const notesBarToggleStyle = this.props.showNotesBar ? this.styles().noteActionButtonActive : this.styles().noteActionButton; - - const handleNoteActionsDrag = (gestureState: any) => { - const minY = 160; - const maxY = 0.8 * Dimensions.get('window').height; - - let newY = gestureState.moveY; - - if (newY < minY) { - newY = minY; - } else if (newY > maxY) { - newY = maxY; - } - - this.noteActionsPositionY.setValue(newY - 162); - }; - - // Pan responder that handles making the note actions draggable. - // The note actions need to be draggable, because they could - // potentially obstruct some portion of a note's content - const noteActionsDragResponder = PanResponder.create({ - // Only start dragging after moving at least 10px — this prevents clicks from dragging instead - // of triggering onPress events - onMoveShouldSetPanResponder: (_evt, gestureState) => { - return Math.abs(gestureState.dx) > 10 || Math.abs(gestureState.dy) > 10; - }, - onPanResponderMove: (_e: any, gestureState: any) => { - handleNoteActionsDrag(gestureState); - }, - }); - - // Note actions are the notesbar and split layout toggle button - const noteActionButtonGroupComp = ( - - {/* Temporarily hiding the split layout button till it's implemented */} - {/* - - */} - - - - - ); - - const noteMainComp = ( - - - - - - {titleComp} - {bodyComponent} - - { this.state.isTablet && noteActionButtonGroupComp } - - ); - return ( - {noteMainComp} + {titleComp} + {bodyComponent} {actionButtonComp} @@ -1488,7 +1245,7 @@ class NoteScreenComponent extends BaseScreenComponent { } } -const NoteScreen = connect((state: State) => { +const NoteScreen = connect((state: any) => { return { noteId: state.selectedNoteIds.length ? state.selectedNoteIds[0] : null, noteHash: state.selectedNoteHash, @@ -1504,7 +1261,6 @@ const NoteScreen = connect((state: State) => { provisionalNoteIds: state.provisionalNoteIds, highlightedWords: state.highlightedWords, useEditorBeta: state.settings['editor.beta'], - showNotesBar: state.showMobileNotesBar, }; })(NoteScreenComponent); diff --git a/packages/app-mobile/components/screens/search.js b/packages/app-mobile/components/screens/search.js index f26196f90..50b8a4806 100644 --- a/packages/app-mobile/components/screens/search.js +++ b/packages/app-mobile/components/screens/search.js @@ -5,12 +5,13 @@ const { connect } = require('react-redux'); const { ScreenHeader } = require('../ScreenHeader'); const Icon = require('react-native-vector-icons/Ionicons').default; const { _ } = require('@joplin/lib/locale'); +const Note = require('@joplin/lib/models/Note').default; const { NoteItem } = require('../note-item.js'); const { BaseScreenComponent } = require('../base-screen.js'); const { themeStyle } = require('../global-style.js'); const DialogBox = require('react-native-dialogbox').default; +const SearchEngineUtils = require('@joplin/lib/services/searchengine/SearchEngineUtils').default; const SearchEngine = require('@joplin/lib/services/searchengine/SearchEngine').default; -import searchNotes from '../searchNotes'; Icon.loadFont(); @@ -100,7 +101,25 @@ class SearchScreenComponent extends BaseScreenComponent { query = query === null ? this.state.query.trim : query.trim(); - const notes = await searchNotes(query, this.props.settings['db.ftsEnabled'], this.props.dispatch); + let notes = []; + + if (query) { + if (this.props.settings['db.ftsEnabled']) { + notes = await SearchEngineUtils.notesForQuery(query, true); + } else { + const p = query.split(' '); + const temp = []; + for (let i = 0; i < p.length; i++) { + const t = p[i].trim(); + if (!t) continue; + temp.push(t); + } + + notes = await Note.previews(null, { + anywherePattern: `*${temp.join('*')}*`, + }); + } + } if (!this.isMounted_) return; diff --git a/packages/app-mobile/components/searchNotes.ts b/packages/app-mobile/components/searchNotes.ts deleted file mode 100644 index 0bb15e0d5..000000000 --- a/packages/app-mobile/components/searchNotes.ts +++ /dev/null @@ -1,42 +0,0 @@ -import SearchEngineUtils from '@joplin/lib/services/searchengine/SearchEngineUtils'; -import SearchEngine from '@joplin/lib/services/searchengine/SearchEngine'; -import Note from '@joplin/lib/models/Note'; -import { NoteEntity } from '@joplin/lib/services/database/types'; - -// Returns notes from a search query and sets highlighted words -// Be sure to use 'await' keyword or the function might not work properly -// Eg. await HandleNoteQuery(); - -const searchNotes = async (query: string, dbFtsEnabled: boolean, dispatch: (action: Object)=> void): Promise => { - let notes = []; - - if (query) { - if (dbFtsEnabled) { - notes = await SearchEngineUtils.notesForQuery(query, true); - } else { - const p = query.split(' '); - const temp = []; - for (let i = 0; i < p.length; i++) { - const t = p[i].trim(); - if (!t) continue; - temp.push(t); - } - - notes = await Note.previews(null, { - anywherePattern: `*${temp.join('*')}*`, - }); - } - - const parsedQuery = await SearchEngine.instance().parseQuery(query); - const highlightedWords = SearchEngine.instance().allParsedQueryTerms(parsedQuery); - - dispatch({ - type: 'SET_HIGHLIGHTED', - words: highlightedWords, - }); - } - - return notes; -}; - -export default searchNotes; diff --git a/packages/app-mobile/components/useStyles.ts b/packages/app-mobile/components/useStyles.ts deleted file mode 100644 index ca71bdd26..000000000 --- a/packages/app-mobile/components/useStyles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { StyleSheet } from 'react-native'; -import { Style } from './global-style'; -import { themeStyle } from './global-style'; - -const useStyles = (stylingFunction: (theme: Style)=> Style, themeId?: number) => { - const theme = themeStyle(themeId); - const styles = stylingFunction(theme); - - return StyleSheet.create(styles); -}; - -export default useStyles; diff --git a/packages/app-mobile/ios/Podfile.lock b/packages/app-mobile/ios/Podfile.lock index fb73158b6..f2afc9b78 100644 --- a/packages/app-mobile/ios/Podfile.lock +++ b/packages/app-mobile/ios/Podfile.lock @@ -229,7 +229,7 @@ PODS: - React - react-native-get-random-values (1.7.1): - React-Core - - react-native-image-picker (2.3.4): + - react-native-image-picker (4.10.0): - React-Core - react-native-image-resizer (1.4.5): - React-Core @@ -533,7 +533,7 @@ SPEC CHECKSUMS: react-native-document-picker: 20f652c2402d3ddc81f396d8167c3bd978add4a2 react-native-geolocation: c956aeb136625c23e0dce0467664af2c437888c9 react-native-get-random-values: 2c4ff6b44cb71291dabe9a8ae87d3877dcf387da - react-native-image-picker: c6d75c4ab2cf46f9289f341242b219cb3c1180d3 + react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8 react-native-image-resizer: d9fb629a867335bdc13230ac2a58702bb8c8828f react-native-netinfo: 3d3769f0d65de15c83a9bf1346f8be71de5a24bf react-native-rsa-native: 1f6bba06dd02f0e652a66a384c75c270f7a0062f diff --git a/packages/app-mobile/jest.config.js b/packages/app-mobile/jest.config.js index 32bffb4ff..ba1e91f68 100644 --- a/packages/app-mobile/jest.config.js +++ b/packages/app-mobile/jest.config.js @@ -15,9 +15,5 @@ module.exports = { testPathIgnorePatterns: ['/node_modules/'], - 'transformIgnorePatterns': [ - 'node_modules/(?!@codemirror)/', - ], - slowTestThreshold: 40, }; diff --git a/packages/app-mobile/package.json b/packages/app-mobile/package.json index f255ad747..796e349e7 100644 --- a/packages/app-mobile/package.json +++ b/packages/app-mobile/package.json @@ -27,14 +27,11 @@ "@react-native-community/netinfo": "^6.0.0", "@react-native-community/push-notification-ios": "^1.6.0", "@react-native-community/slider": "^3.0.3", - "@types/react-test-renderer": "^18.0.0", "assert-browserify": "^2.0.0", "buffer": "^5.0.8", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", "events": "^3.2.0", - "jest": "^28.1.3", - "jest-environment-jsdom": "^28.1.3", "joplin-rn-alarm-notification": "^1.0.5", "jsc-android": "241213.1.0", "md5": "^2.2.1", @@ -92,21 +89,20 @@ "@codemirror/view": "^6.0.0", "@joplin/tools": "~2.9", "@lezer/highlight": "^1.0.0", - "@testing-library/react-native": "^11.0.0", "@types/fs-extra": "^9.0.13", "@types/jest": "^28.1.3", - "@types/node": "^18.7.6", "@types/react-native": "^0.64.4", "@types/react-redux": "^7.1.24", "babel-plugin-module-resolver": "^4.1.0", "execa": "^4.0.0", "fs-extra": "^8.1.0", "gulp": "^4.0.2", + "jest": "^28.1.1", + "jest-environment-jsdom": "^28.1.3", "jetifier": "^1.6.5", "jsdom": "^20.0.0", "metro-react-native-babel-preset": "^0.66.2", "nodemon": "^2.0.12", - "react-test-renderer": "17.0.2", "ts-jest": "^28.0.5", "ts-loader": "^9.3.1", "ts-node": "^10.9.1", diff --git a/packages/app-mobile/root.tsx b/packages/app-mobile/root.tsx index 8f852607b..128802be8 100644 --- a/packages/app-mobile/root.tsx +++ b/packages/app-mobile/root.tsx @@ -64,7 +64,7 @@ const { SearchScreen } = require('./components/screens/search.js'); const { OneDriveLoginScreen } = require('./components/screens/onedrive-login.js'); import EncryptionConfigScreen from './components/screens/encryption-config'; const { DropboxLoginScreen } = require('./components/screens/dropbox-login.js'); -import { MenuProvider } from 'react-native-popup-menu'; +const { MenuContext } = require('react-native-popup-menu'); import SideMenu from './components/SideMenu'; const { SideMenuContent } = require('./components/side-menu-content.js'); const { SideMenuContentNote } = require('./components/side-menu-content-note.js'); @@ -75,7 +75,7 @@ const { FileApiDriverLocal } = require('@joplin/lib/file-api-driver-local'); import ResourceFetcher from '@joplin/lib/services/ResourceFetcher'; import SearchEngine from '@joplin/lib/services/searchengine/SearchEngine'; const WelcomeUtils = require('@joplin/lib/WelcomeUtils'); -import { themeStyle } from './components/global-style'; +const { themeStyle } = require('./components/global-style.js'); import SyncTargetRegistry from '@joplin/lib/SyncTargetRegistry'; const SyncTargetFilesystem = require('@joplin/lib/SyncTargetFilesystem.js'); const SyncTargetNextcloud = require('@joplin/lib/SyncTargetNextcloud.js'); @@ -378,17 +378,6 @@ const appReducer = (state = appDefaultState, action: any) => { newState.isOnMobileData = action.isOnMobileData; break; - case 'NOTES_BAR_OPEN': - - newState = Object.assign({}, state); - newState.showMobileNotesBar = true; - break; - - case 'NOTES_BAR_CLOSE': - - newState = Object.assign({}, state); - newState.showMobileNotesBar = false; - break; } } catch (error) { error.message = `In reducer: ${error.message} Action: ${JSON.stringify(action)}`; @@ -930,7 +919,7 @@ class AppComponent extends React.Component { }} > - + @@ -939,7 +928,7 @@ class AppComponent extends React.Component { this.dropdownAlert_ = ref} tapToCloseEnabled={true} /> - + ); diff --git a/packages/app-mobile/tsconfig.json b/packages/app-mobile/tsconfig.json index df08fdfdd..6f91f4aa3 100644 --- a/packages/app-mobile/tsconfig.json +++ b/packages/app-mobile/tsconfig.json @@ -13,7 +13,6 @@ "tools/*.ts", ], "compilerOptions": { - "types": ["jest", "node", "react-test-renderer"], - "allowSyntheticDefaultImports": true + "types": ["jest", "node"] } } diff --git a/packages/lib/reducer.ts b/packages/lib/reducer.ts index a25836fd3..7d3214ba9 100644 --- a/packages/lib/reducer.ts +++ b/packages/lib/reducer.ts @@ -96,7 +96,6 @@ export interface State { hasEncryptedItems: boolean; needApiAuth: boolean; profileConfig: ProfileConfig; - showMobileNotesBar: boolean; // Extra reducer keys go here: pluginService: PluginServiceState; @@ -157,7 +156,6 @@ export const defaultState: State = { }, backwardHistoryNotes: [], forwardHistoryNotes: [], - showMobileNotesBar: false, // pluginsLegacy is the original plugin system, which eventually was used only for GotoAnything. // GotoAnything should be refactored to part of core and when it's done the pluginsLegacy key can // be removed. It was originally named "plugins", then renamed "pluginsLegacy" so as not to conflict diff --git a/packages/lib/theme.ts b/packages/lib/theme.ts index 665428ca8..cd1f4e0bc 100644 --- a/packages/lib/theme.ts +++ b/packages/lib/theme.ts @@ -23,7 +23,7 @@ const themes: any = { [Setting.THEME_OLED_DARK]: theme_oledDark, }; -export function themeById(themeId: number) { +export function themeById(themeId: string) { if (!themes[themeId]) throw new Error(`Invalid theme ID: ${themeId}`); const output = Object.assign({}, themes[themeId]); diff --git a/yarn.lock b/yarn.lock index 0b265381a..7bc157cb8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3330,6 +3330,20 @@ __metadata: languageName: node linkType: hard +"@jest/console@npm:^28.1.1": + version: 28.1.1 + resolution: "@jest/console@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^28.1.1 + jest-util: ^28.1.1 + slash: ^3.0.0 + checksum: ddf3b9e9b003a99d6686ecd89c263fda8f81303277f64cca6e434106fa3556c456df6023cdba962851df16880e044bfbae264daa5f67f7ac28712144b5f1007e + languageName: node + linkType: hard + "@jest/console@npm:^28.1.3": version: 28.1.3 resolution: "@jest/console@npm:28.1.3" @@ -3380,6 +3394,48 @@ __metadata: languageName: node linkType: hard +"@jest/core@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/core@npm:28.1.2" + dependencies: + "@jest/console": ^28.1.1 + "@jest/reporters": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^28.0.2 + jest-config: ^28.1.2 + jest-haste-map: ^28.1.1 + jest-message-util: ^28.1.1 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.1 + jest-resolve-dependencies: ^28.1.2 + jest-runner: ^28.1.2 + jest-runtime: ^28.1.2 + jest-snapshot: ^28.1.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + jest-watcher: ^28.1.1 + micromatch: ^4.0.4 + pretty-format: ^28.1.1 + rimraf: ^3.0.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: dd67cc911cf770550b3bdde39ec78d2cc3814d66008e3b0184c6a2b66380bb425fed07e81d6488eaf459257f38207822f04fcf7f05626a366b8b36542dce7137 + languageName: node + linkType: hard + "@jest/core@npm:^28.1.3": version: 28.1.3 resolution: "@jest/core@npm:28.1.3" @@ -3443,6 +3499,18 @@ __metadata: languageName: node linkType: hard +"@jest/environment@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/environment@npm:28.1.2" + dependencies: + "@jest/fake-timers": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + jest-mock: ^28.1.1 + checksum: 5bffc464e9d2fdf7561305bc02844faebfed2ffed54c015561a8d39a3ea129d375aa408b724546fef6246881100770ff43637c2da667db80f0b26235b6a40c98 + languageName: node + linkType: hard + "@jest/environment@npm:^28.1.3": version: 28.1.3 resolution: "@jest/environment@npm:28.1.3" @@ -3455,6 +3523,15 @@ __metadata: languageName: node linkType: hard +"@jest/expect-utils@npm:^28.1.1": + version: 28.1.1 + resolution: "@jest/expect-utils@npm:28.1.1" + dependencies: + jest-get-type: ^28.0.2 + checksum: 46a2ad754b10bc649c36a5914f887bea33a43bb868946508892a73f1da99065b17167dc3c0e3e299c7cea82c6be1e9d816986e120d7ae3e1be511f64cfc1d3d3 + languageName: node + linkType: hard + "@jest/expect-utils@npm:^28.1.3": version: 28.1.3 resolution: "@jest/expect-utils@npm:28.1.3" @@ -3464,6 +3541,16 @@ __metadata: languageName: node linkType: hard +"@jest/expect@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/expect@npm:28.1.2" + dependencies: + expect: ^28.1.1 + jest-snapshot: ^28.1.2 + checksum: ee470cdd3a6a64a251ba66629cf95c508cc8b2b9ce1928459baacffa0bf297f5ad715c2352e73f24e7d3880e3699b03923e037919b712901e6db259293ad73a6 + languageName: node + linkType: hard + "@jest/expect@npm:^28.1.3": version: 28.1.3 resolution: "@jest/expect@npm:28.1.3" @@ -3488,6 +3575,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/fake-timers@npm:28.1.2" + dependencies: + "@jest/types": ^28.1.1 + "@sinonjs/fake-timers": ^9.1.2 + "@types/node": "*" + jest-message-util: ^28.1.1 + jest-mock: ^28.1.1 + jest-util: ^28.1.1 + checksum: d6e6b1a12fe84335d9cc6087b4e590c3b9b855edaff11742d2167827f415459704ab1eae9b3543603898b6a0789b2cc7863f12469f8479257315effb844fe6bd + languageName: node + linkType: hard + "@jest/fake-timers@npm:^28.1.3": version: 28.1.3 resolution: "@jest/fake-timers@npm:28.1.3" @@ -3513,6 +3614,17 @@ __metadata: languageName: node linkType: hard +"@jest/globals@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/globals@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/expect": ^28.1.2 + "@jest/types": ^28.1.1 + checksum: f07b7d0a2d08bd4b1e5f0862d835b522578495301ad50109d08c13d367b18a712c2406b62fe0c0a6513998d2caeb3eb650da47d14b22fde7850983537e309045 + languageName: node + linkType: hard + "@jest/globals@npm:^28.1.3": version: 28.1.3 resolution: "@jest/globals@npm:28.1.3" @@ -3560,6 +3672,44 @@ __metadata: languageName: node linkType: hard +"@jest/reporters@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/reporters@npm:28.1.2" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^28.1.1 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@jridgewell/trace-mapping": ^0.3.13 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^28.1.1 + jest-util: ^28.1.1 + jest-worker: ^28.1.1 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + terminal-link: ^2.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 26aa66e8eae2599f9bf6c5f594fce7d3a42f821678a10aa7014022cd4dd13d1aea7feba31abd1f01599ae416c7ab828232a74a97d8c352b8b58c699888955bdd + languageName: node + linkType: hard + "@jest/reporters@npm:^28.1.3": version: 28.1.3 resolution: "@jest/reporters@npm:28.1.3" @@ -3650,6 +3800,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-result@npm:^28.1.1": + version: 28.1.1 + resolution: "@jest/test-result@npm:28.1.1" + dependencies: + "@jest/console": ^28.1.1 + "@jest/types": ^28.1.1 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 8812db2649a09ed423ccb33cf76162a996fc781156a489d4fd86e22615b523d72ca026c68b3699a1ea1ea274146234e09db636c49d7ea2516e0e1bb229f3013d + languageName: node + linkType: hard + "@jest/test-result@npm:^28.1.3": version: 28.1.3 resolution: "@jest/test-result@npm:28.1.3" @@ -3675,6 +3837,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-sequencer@npm:^28.1.1": + version: 28.1.1 + resolution: "@jest/test-sequencer@npm:28.1.1" + dependencies: + "@jest/test-result": ^28.1.1 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + slash: ^3.0.0 + checksum: acfa3b7ff18478aaa9ac54d6013f951e1be2133a09ea5ca6b248eb80340e5cac71420f1357ef87d2780cb2adb2411fbacbbffcb6ac7f93a0b24cc76be5a42afa + languageName: node + linkType: hard + "@jest/test-sequencer@npm:^28.1.3": version: 28.1.3 resolution: "@jest/test-sequencer@npm:28.1.3" @@ -3710,6 +3884,29 @@ __metadata: languageName: node linkType: hard +"@jest/transform@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/transform@npm:28.1.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^28.1.1 + "@jridgewell/trace-mapping": ^0.3.13 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^1.4.0 + fast-json-stable-stringify: ^2.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.1 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.1 + checksum: cd8d1bdf1a5831cdf91934dd0af1d29d4d2bcad92feb9bf7555fc0e1152cb01a9206410380af0f6221a623ffc9b6f6e6dded429d01d87b85b0777cf9d4425127 + languageName: node + linkType: hard + "@jest/transform@npm:^28.1.3": version: 28.1.3 resolution: "@jest/transform@npm:28.1.3" @@ -3771,6 +3968,20 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^28.1.1": + version: 28.1.1 + resolution: "@jest/types@npm:28.1.1" + dependencies: + "@jest/schemas": ^28.0.2 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 3c35d3674e08da1e4bb27b8303a59c71fd19a852ff7c7827305462f48ef224b5334aa50e0d547470e1cca1f2dd15a0cff51b46618b8e61e7196908504b29f08f + languageName: node + linkType: hard + "@jest/types@npm:^28.1.3": version: 28.1.3 resolution: "@jest/types@npm:28.1.3" @@ -3921,13 +4132,10 @@ __metadata: "@react-native-community/netinfo": ^6.0.0 "@react-native-community/push-notification-ios": ^1.6.0 "@react-native-community/slider": ^3.0.3 - "@testing-library/react-native": ^11.0.0 "@types/fs-extra": ^9.0.13 "@types/jest": ^28.1.3 - "@types/node": ^18.7.6 "@types/react-native": ^0.64.4 "@types/react-redux": ^7.1.24 - "@types/react-test-renderer": ^18.0.0 assert-browserify: ^2.0.0 babel-plugin-module-resolver: ^4.1.0 buffer: ^5.0.8 @@ -3937,7 +4145,7 @@ __metadata: execa: ^4.0.0 fs-extra: ^8.1.0 gulp: ^4.0.2 - jest: ^28.1.3 + jest: ^28.1.1 jest-environment-jsdom: ^28.1.3 jetifier: ^1.6.5 joplin-rn-alarm-notification: ^1.0.5 @@ -3973,7 +4181,6 @@ __metadata: react-native-version-info: ^1.1.0 react-native-webview: ^10.9.2 react-redux: 5.0.7 - react-test-renderer: 17.0.2 redux: 4.0.0 rn-fetch-blob: ^0.12.0 stream: 0.0.2 @@ -6105,19 +6312,6 @@ __metadata: languageName: node linkType: hard -"@testing-library/react-native@npm:^11.0.0": - version: 11.0.0 - resolution: "@testing-library/react-native@npm:11.0.0" - dependencies: - pretty-format: ^28.1.3 - peerDependencies: - react: ">=16.0.0" - react-native: ">=0.59" - react-test-renderer: ">=16.0.0" - checksum: 04b13b38ac0a81425635136a64af1dcae2593591253dea62fac036c3e8525dbf4970816b5fe3f6298dfc71d5b9e2d77467c166bfc413f8632eecd173fed083ca - languageName: node - linkType: hard - "@tootallnate/once@npm:1": version: 1.1.2 resolution: "@tootallnate/once@npm:1.1.2" @@ -6737,13 +6931,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.7.6": - version: 18.7.14 - resolution: "@types/node@npm:18.7.14" - checksum: 99cf28ff854100158de875cca23c7acc3cc01dfee526a52b90b7f36767c821bcbaf2be0a98a70f06f3b78f3c60639168ff949d725b61e2e124f9f71f1fb8043d - languageName: node - linkType: hard - "@types/nodemailer@npm:^6.4.1": version: 6.4.4 resolution: "@types/nodemailer@npm:6.4.4" @@ -6835,12 +7022,12 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:17.0.14": - version: 17.0.14 - resolution: "@types/react-dom@npm:17.0.14" +"@types/react-dom@npm:^16.9.0": + version: 16.9.16 + resolution: "@types/react-dom@npm:16.9.16" dependencies: - "@types/react": "*" - checksum: b54cd0ef573236b3d87fe7493e6d1c36d8b4ca37a3b46364272a5c91ac178e3296b68ea1aeb299ce68f12ad663c5720ee890d0539b14881c6754bdcbdb0befa0 + "@types/react": ^16 + checksum: ff65a2a36d493ed6a9032f8a96f06074d940ca63c82d400e21e6ba16d25762b4f5c8cd352b93eb3b7aa820e158b7a6b16e5daffec2a512fa6327b00036cde0a8 languageName: node linkType: hard @@ -6895,23 +7082,46 @@ __metadata: languageName: node linkType: hard -"@types/react-test-renderer@npm:^18.0.0": - version: 18.0.0 - resolution: "@types/react-test-renderer@npm:18.0.0" - dependencies: - "@types/react": "*" - checksum: 6afc938a1d7618d88ab8793e251f0bd5981bf3f08c1b600f74df3f8800b92589ea534dc6dcb7c8d683893fcc740bf8d7843a42bf2dae59785cfe88f004bd7b0b - languageName: node - linkType: hard - -"@types/react@npm:17.0.14": - version: 17.0.14 - resolution: "@types/react@npm:17.0.14" +"@types/react@npm:*, @types/react@npm:^17.0.20": + version: 17.0.37 + resolution: "@types/react@npm:17.0.37" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: ca2eca8f33ddbcba46932efeb8affdd274ea5800ea38bf8bc8de205808d09de21ea1f3d6ab156573aca393b912f0d908826cc6ad92470a3f2b6c34e70d5f75db + checksum: e68b0d59aa69577fc6a6d654b25d5d8408625498f4c483f160b557fac21e840f6e8807cbde93e9f039949b6d624a019b1990d18499c1d65aecf3605c25e30242 + languageName: node + linkType: hard + +"@types/react@npm:16.9.55": + version: 16.9.55 + resolution: "@types/react@npm:16.9.55" + dependencies: + "@types/prop-types": "*" + csstype: ^3.0.2 + checksum: fe0fa5b9783fc00580a82b417b4a1d4916f634290a43388c6ba3ac77b18b31046e81602f474fc878a717d406604dbe73a9d6b804ccefcff7cf46a70f0ac2d06a + languageName: node + linkType: hard + +"@types/react@npm:^16": + version: 16.14.28 + resolution: "@types/react@npm:16.14.28" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: c3ef0c479e0c53f62057cae6dfe89785c855e697ea106e7c71da18210307a8d90a7f6bd285ca1370ee1ce859b1c241e173f4c6d0fab73c35e1d321d30b4dc4cc + languageName: node + linkType: hard + +"@types/react@npm:^16.9.55": + version: 16.14.21 + resolution: "@types/react@npm:16.14.21" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: 9660ea0a2c7ad364295c1e5abd6b98a05fd372a0f06f97850f60fcc254bcec766d19b101c0acc382746a4e0b71848d88097a1db7124e3fd441c0472fb6b3f849 languageName: node linkType: hard @@ -8906,6 +9116,23 @@ __metadata: languageName: node linkType: hard +"babel-jest@npm:^28.1.2": + version: 28.1.2 + resolution: "babel-jest@npm:28.1.2" + dependencies: + "@jest/transform": ^28.1.2 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^28.1.1 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 1aa605ef4dfae3a557fbed8b9d1ba1c2678ba910d0ff3931fad8dc2a150a8ef220a456a86f3b441f5cd4f97f973c2f721fc74ea6a26432766c5ab501a967f8c8 + languageName: node + linkType: hard + "babel-jest@npm:^28.1.3": version: 28.1.3 resolution: "babel-jest@npm:28.1.3" @@ -8986,6 +9213,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-jest-hoist@npm:^28.1.1": + version: 28.1.1 + resolution: "babel-plugin-jest-hoist@npm:28.1.1" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 5fb9ad012e4613e7d321b61a875371dd10e171ef3df2e9c87be25fda62c3c7ad759821e40a9da18f611054727309c38f10e3502583f697312cb9cd1e92616756 + languageName: node + linkType: hard + "babel-plugin-jest-hoist@npm:^28.1.3": version: 28.1.3 resolution: "babel-plugin-jest-hoist@npm:28.1.3" @@ -9249,6 +9488,18 @@ __metadata: languageName: node linkType: hard +"babel-preset-jest@npm:^28.1.1": + version: 28.1.1 + resolution: "babel-preset-jest@npm:28.1.1" + dependencies: + babel-plugin-jest-hoist: ^28.1.1 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: c581a81967aa30eba71a5a5a28eca2cc082901f3e6823c17e5b4ef7ba10f1347494a8e77d785b09ba7e86d3f902f2e13f5b75854d2af7bf9b489924629a87bad + languageName: node + linkType: hard + "babel-preset-jest@npm:^28.1.3": version: 28.1.3 resolution: "babel-preset-jest@npm:28.1.3" @@ -15722,6 +15973,19 @@ __metadata: languageName: node linkType: hard +"expect@npm:^28.1.1": + version: 28.1.1 + resolution: "expect@npm:28.1.1" + dependencies: + "@jest/expect-utils": ^28.1.1 + jest-get-type: ^28.0.2 + jest-matcher-utils: ^28.1.1 + jest-message-util: ^28.1.1 + jest-util: ^28.1.1 + checksum: 6e557b681f4cfb0bf61efad50c5787cc6eb4596a3c299be69adc83fcad0265b5f329b997c2bb7ec92290e609681485616e51e16301a7f0ba3c57139b337c9351 + languageName: node + linkType: hard + "expect@npm:^28.1.3": version: 28.1.3 resolution: "expect@npm:28.1.3" @@ -20275,6 +20539,16 @@ __metadata: languageName: node linkType: hard +"jest-changed-files@npm:^28.0.2": + version: 28.0.2 + resolution: "jest-changed-files@npm:28.0.2" + dependencies: + execa: ^5.0.0 + throat: ^6.0.1 + checksum: 389d4de4b26de3d2c6e23783ef4e23f827a9a79cfebd2db7c6ff74727198814469ee1e1a89f0e6d28a94e3c632ec45b044c2400a0793b8591e18d07b4b421784 + languageName: node + linkType: hard + "jest-changed-files@npm:^28.1.3": version: 28.1.3 resolution: "jest-changed-files@npm:28.1.3" @@ -20285,6 +20559,33 @@ __metadata: languageName: node linkType: hard +"jest-circus@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-circus@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/expect": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/types": ^28.1.1 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + is-generator-fn: ^2.0.0 + jest-each: ^28.1.1 + jest-matcher-utils: ^28.1.1 + jest-message-util: ^28.1.1 + jest-runtime: ^28.1.2 + jest-snapshot: ^28.1.2 + jest-util: ^28.1.1 + pretty-format: ^28.1.1 + slash: ^3.0.0 + stack-utils: ^2.0.3 + throat: ^6.0.1 + checksum: c8f2e024e438f4ca9a6fb8c4f2dfbf843761fad63e82f603a8b167ead5ea3d2d1b99b695242a12017a32c17f8cb2a338e2eb8cdf37d5d71478fcf1650fd9c391 + languageName: node + linkType: hard + "jest-circus@npm:^28.1.3": version: 28.1.3 resolution: "jest-circus@npm:28.1.3" @@ -20335,6 +20636,33 @@ __metadata: languageName: node linkType: hard +"jest-cli@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-cli@npm:28.1.2" + dependencies: + "@jest/core": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/types": ^28.1.1 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^28.1.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 527873c25755f5a8fc630d61bf856d6f933aace9ff9b35fcc47ac954e5f957ae621ec499bf571b8da51d7fd3760b220f9bf02ccf1710c9821430173e34073c41 + languageName: node + linkType: hard + "jest-cli@npm:^28.1.3": version: 28.1.3 resolution: "jest-cli@npm:28.1.3" @@ -20393,6 +20721,44 @@ __metadata: languageName: node linkType: hard +"jest-config@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-config@npm:28.1.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^28.1.1 + "@jest/types": ^28.1.1 + babel-jest: ^28.1.2 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^28.1.2 + jest-environment-node: ^28.1.2 + jest-get-type: ^28.0.2 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.1 + jest-runner: ^28.1.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^28.1.1 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: ddc4de7a286d087a0f88813171498a85d64eb6b22aa8915ab6860661e0b445d1d5773d61b928ff9c3f5c47b20576838dc4565d20f4d77c94ba886421d61544d4 + languageName: node + linkType: hard + "jest-config@npm:^28.1.3": version: 28.1.3 resolution: "jest-config@npm:28.1.3" @@ -20522,6 +20888,19 @@ __metadata: languageName: node linkType: hard +"jest-each@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-each@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + jest-util: ^28.1.1 + pretty-format: ^28.1.1 + checksum: 91965603f898d5e29150995333f5b193aa37f36b232fc9ffd1be546236e7e47f5df4eca1f25ee45eb549e0866f4769d6a8045591703454b505d18e9fe2b18572 + languageName: node + linkType: hard + "jest-each@npm:^28.1.3": version: 28.1.3 resolution: "jest-each@npm:28.1.3" @@ -20580,6 +20959,20 @@ __metadata: languageName: node linkType: hard +"jest-environment-node@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-environment-node@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/fake-timers": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + jest-mock: ^28.1.1 + jest-util: ^28.1.1 + checksum: cee61a3e25cc032ce6a3320ce8829dae9295fa84ea2f220fddd496ba876807cdc88397dc5a6362e60e44b7e14a91d7b448ffb2031bda7955276f69c9e1bd93fc + languageName: node + linkType: hard + "jest-environment-node@npm:^28.1.3": version: 28.1.3 resolution: "jest-environment-node@npm:28.1.3" @@ -20654,6 +21047,29 @@ __metadata: languageName: node linkType: hard +"jest-haste-map@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-haste-map@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.1 + jest-worker: ^28.1.1 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: db31a2a83906277d96b79017742c433c1573b322d061632a011fb1e184cf6f151f94134da09da7366e4477e8716f280efa676b4cc04a8544c13ce466a44102e8 + languageName: node + linkType: hard + "jest-haste-map@npm:^28.1.3": version: 28.1.3 resolution: "jest-haste-map@npm:28.1.3" @@ -20713,6 +21129,16 @@ __metadata: languageName: node linkType: hard +"jest-leak-detector@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-leak-detector@npm:28.1.1" + dependencies: + jest-get-type: ^28.0.2 + pretty-format: ^28.1.1 + checksum: 379a15ad7bed4f6d11414cc0131a5a592ac9c0b12a5933c522b292209a325b12a852e2330144fb59c82420a89712e46f2c244a881722473e241ad1c487fc476d + languageName: node + linkType: hard + "jest-leak-detector@npm:^28.1.3": version: 28.1.3 resolution: "jest-leak-detector@npm:28.1.3" @@ -20735,7 +21161,7 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^28.0.0": +"jest-matcher-utils@npm:^28.0.0, jest-matcher-utils@npm:^28.1.1": version: 28.1.1 resolution: "jest-matcher-utils@npm:28.1.1" dependencies: @@ -20776,6 +21202,23 @@ __metadata: languageName: node linkType: hard +"jest-message-util@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-message-util@npm:28.1.1" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^28.1.1 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^28.1.1 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: cca23b9a0103c8fb7006a6d21e67a204fcac4289e1a3961450a4a1ad62eb37087c2a19a26337d3c0ea9f82c030a80dda79ac8ec34a18bf3fd5eca3fd55bef957 + languageName: node + linkType: hard + "jest-message-util@npm:^28.1.3": version: 28.1.3 resolution: "jest-message-util@npm:28.1.3" @@ -20803,6 +21246,16 @@ __metadata: languageName: node linkType: hard +"jest-mock@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-mock@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + "@types/node": "*" + checksum: 285716d062bd9403830d9f5c90dc414a17495a4e31b82e7789806dac5ea924364fe308a1a8a3151f1055b87cf811e09fab2e2699e53be9972a2657883dd48614 + languageName: node + linkType: hard + "jest-mock@npm:^28.1.3": version: 28.1.3 resolution: "jest-mock@npm:28.1.3" @@ -20850,6 +21303,16 @@ __metadata: languageName: node linkType: hard +"jest-resolve-dependencies@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-resolve-dependencies@npm:28.1.2" + dependencies: + jest-regex-util: ^28.0.2 + jest-snapshot: ^28.1.2 + checksum: 2f822678b5469019abab398d0e72eb804a68a9f9ab01b707dd16ebf6f294fe5d4345121e83ad63811c30fe77b7f9bb59003fb03a7215f5f140a2bd5dd193d193 + languageName: node + linkType: hard + "jest-resolve-dependencies@npm:^28.1.3": version: 28.1.3 resolution: "jest-resolve-dependencies@npm:28.1.3" @@ -20876,6 +21339,23 @@ __metadata: languageName: node linkType: hard +"jest-resolve@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-resolve@npm:28.1.1" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + jest-pnp-resolver: ^1.2.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + resolve: ^1.20.0 + resolve.exports: ^1.1.0 + slash: ^3.0.0 + checksum: cda5c472fe5b50b91696d90d5c3a72d0f5ff188ecad18816b4085fbac0bad53c0a9abff94c3bf41c7ced24256cf8e34f0b03f1c9e05464e8efcd0f03560d6699 + languageName: node + linkType: hard + "jest-resolve@npm:^28.1.3": version: 28.1.3 resolution: "jest-resolve@npm:28.1.3" @@ -20921,6 +21401,35 @@ __metadata: languageName: node linkType: hard +"jest-runner@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-runner@npm:28.1.2" + dependencies: + "@jest/console": ^28.1.1 + "@jest/environment": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.10.2 + graceful-fs: ^4.2.9 + jest-docblock: ^28.1.1 + jest-environment-node: ^28.1.2 + jest-haste-map: ^28.1.1 + jest-leak-detector: ^28.1.1 + jest-message-util: ^28.1.1 + jest-resolve: ^28.1.1 + jest-runtime: ^28.1.2 + jest-util: ^28.1.1 + jest-watcher: ^28.1.1 + jest-worker: ^28.1.1 + source-map-support: 0.5.13 + throat: ^6.0.1 + checksum: 51e46779e6c834269de22ba20528b4a1f1df2fe0785dfacb6e5188a552089cef625a49f480db7fa93ed8a11e49de197c9a204c390515cd2f7f4e24474a4f2c6b + languageName: node + linkType: hard + "jest-runner@npm:^28.1.3": version: 28.1.3 resolution: "jest-runner@npm:28.1.3" @@ -20987,6 +21496,36 @@ __metadata: languageName: node linkType: hard +"jest-runtime@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-runtime@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/fake-timers": ^28.1.2 + "@jest/globals": ^28.1.2 + "@jest/source-map": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + execa: ^5.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + jest-message-util: ^28.1.1 + jest-mock: ^28.1.1 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.1 + jest-snapshot: ^28.1.2 + jest-util: ^28.1.1 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: d9a2f45a7b21f239b12448e4fb82c0893e94fdd644fa9315a936251ffbe128d73e9daf3645bc1526a0f3850e79d271bd5b71aa7699a9990c0cd52e51ee13b2f2 + languageName: node + linkType: hard + "jest-runtime@npm:^28.1.3": version: 28.1.3 resolution: "jest-runtime@npm:28.1.3" @@ -21051,6 +21590,37 @@ __metadata: languageName: node linkType: hard +"jest-snapshot@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-snapshot@npm:28.1.2" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/babel__traverse": ^7.0.6 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^28.1.1 + graceful-fs: ^4.2.9 + jest-diff: ^28.1.1 + jest-get-type: ^28.0.2 + jest-haste-map: ^28.1.1 + jest-matcher-utils: ^28.1.1 + jest-message-util: ^28.1.1 + jest-util: ^28.1.1 + natural-compare: ^1.4.0 + pretty-format: ^28.1.1 + semver: ^7.3.5 + checksum: 5c33c8b05d387d4fa4516556dc6fdeca4d7c0a1d48bfb31d05d5bf182988713800a35b0f7d4d9e40e3646edbde095aba36bb1b64a8d9bac40e34f76e90ddb482 + languageName: node + linkType: hard + "jest-snapshot@npm:^28.1.3": version: 28.1.3 resolution: "jest-snapshot@npm:28.1.3" @@ -21110,6 +21680,20 @@ __metadata: languageName: node linkType: hard +"jest-util@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-util@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: bca1601099d6a4c3c4ba997b8c035a698f23b9b04a0a284a427113f7d0399f7402ba9f4d73812328e6777bf952bf93dfe3d3edda6380a6ca27cdc02768d601e0 + languageName: node + linkType: hard + "jest-validate@npm:^26.5.2, jest-validate@npm:^26.6.2": version: 26.6.2 resolution: "jest-validate@npm:26.6.2" @@ -21124,6 +21708,20 @@ __metadata: languageName: node linkType: hard +"jest-validate@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-validate@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + leven: ^3.1.0 + pretty-format: ^28.1.1 + checksum: 7bb5427d9b5ef4efc218aaf1f2a4282ebcc66458a6c40aa9fd2914aab967d3157352fb37ea46c83c1bc640ccf997ca3edee4d7aa109dccc02a7c821bac192104 + languageName: node + linkType: hard + "jest-validate@npm:^28.1.3": version: 28.1.3 resolution: "jest-validate@npm:28.1.3" @@ -21153,6 +21751,22 @@ __metadata: languageName: node linkType: hard +"jest-watcher@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-watcher@npm:28.1.1" + dependencies: + "@jest/test-result": ^28.1.1 + "@jest/types": ^28.1.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.10.2 + jest-util: ^28.1.1 + string-length: ^4.0.1 + checksum: 60ee90a3b760db2bc57173a0f3fc44f3162491e1ca4cf6a0e99d40bea3825e2a20c47c3ba13ebcbaea09cd2e4fe338c41841a972d9fe49ed7bbf3f34d2734ebd + languageName: node + linkType: hard + "jest-watcher@npm:^28.1.3": version: 28.1.3 resolution: "jest-watcher@npm:28.1.3" @@ -21191,6 +21805,17 @@ __metadata: languageName: node linkType: hard +"jest-worker@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-worker@npm:28.1.1" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 28519c43b4007e60a3756d27f1e7884192ee9161b6a9587383a64b6535f820cc4868e351a67775e0feada41465f48ccf323a8db34ae87e15a512ddac5d1424b2 + languageName: node + linkType: hard + "jest-worker@npm:^28.1.3": version: 28.1.3 resolution: "jest-worker@npm:28.1.3" @@ -21215,6 +21840,25 @@ __metadata: languageName: node linkType: hard +"jest@npm:^28.1.1": + version: 28.1.2 + resolution: "jest@npm:28.1.2" + dependencies: + "@jest/core": ^28.1.2 + "@jest/types": ^28.1.1 + import-local: ^3.0.2 + jest-cli: ^28.1.2 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 8ad37088c42cd5a6decb54c61dfe6a45131a50dfe4c805aef1228cae4ca91b0fc7dfe2991ea771d88118151f5f1697d113b6f45c9b0d88b2ece2aac229e77150 + languageName: node + linkType: hard + "jest@npm:^28.1.3": version: 28.1.3 resolution: "jest@npm:28.1.3" @@ -27742,13 +28386,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e - languageName: node - linkType: hard - "react-is@npm:^16.12.0, react-is@npm:^16.13.1, react-is@npm:^16.7.0, react-is@npm:^16.8.1, react-is@npm:^16.8.6": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -27756,13 +28393,20 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^17.0.1, react-is@npm:^17.0.2": +"react-is@npm:^17.0.1": version: 17.0.2 resolution: "react-is@npm:17.0.2" checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8 languageName: node linkType: hard +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + languageName: node + linkType: hard + "react-lifecycles-compat@npm:^3.0.4": version: 3.0.4 resolution: "react-lifecycles-compat@npm:3.0.4" @@ -28110,32 +28754,6 @@ __metadata: languageName: node linkType: hard -"react-shallow-renderer@npm:^16.13.1": - version: 16.15.0 - resolution: "react-shallow-renderer@npm:16.15.0" - dependencies: - object-assign: ^4.1.1 - react-is: ^16.12.0 || ^17.0.0 || ^18.0.0 - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 6052c7e3e9627485120ebd8257f128aad8f56386fe8d42374b7743eac1be457c33506d153c7886b4e32923c0c352d402ab805ef9ca02dbcd8393b2bdeb6e5af8 - languageName: node - linkType: hard - -"react-test-renderer@npm:17.0.2": - version: 17.0.2 - resolution: "react-test-renderer@npm:17.0.2" - dependencies: - object-assign: ^4.1.1 - react-is: ^17.0.2 - react-shallow-renderer: ^16.13.1 - scheduler: ^0.20.2 - peerDependencies: - react: 17.0.2 - checksum: e6b5c6ed2a0bde2c34f1ab9523ff9bc4c141a271daf730d6b852374e83acc0155d58ab71a318251e953ebfa65b8bebb9c5dce3eba1ccfcbef7cc4e1e8261c401 - languageName: node - linkType: hard - "react-test-renderer@npm:^16.14.0": version: 16.14.0 resolution: "react-test-renderer@npm:16.14.0" @@ -32112,6 +32730,13 @@ __metadata: languageName: node linkType: hard +"throat@npm:^6.0.1": + version: 6.0.1 + resolution: "throat@npm:6.0.1" + checksum: 782d4171ee4e3cf947483ed2ff1af3e17cc4354c693b9d339284f61f99fbc401d171e0b0d2db3295bb7d447630333e9319c174ebd7ef315c6fb791db9675369c + languageName: node + linkType: hard + "through2-filter@npm:^3.0.0": version: 3.0.0 resolution: "through2-filter@npm:3.0.0"