diff --git a/front/.env.example b/front/.env.example index 02a33b537..e39840f2f 100644 --- a/front/.env.example +++ b/front/.env.example @@ -1,4 +1,5 @@ REACT_APP_SERVER_BASE_URL=http://localhost:3000 +GENERATE_SOURCEMAP=false # ———————— Optional ———————— # REACT_APP_SERVER_AUTH_URL=http://localhost:3000/auth diff --git a/front/package.json b/front/package.json index 8bd4ec959..224f33ee4 100644 --- a/front/package.json +++ b/front/package.json @@ -15,6 +15,7 @@ "@floating-ui/react": "^0.24.3", "@hello-pangea/dnd": "^16.2.0", "@hookform/resolvers": "^3.1.1", + "@sniptt/guards": "^0.2.0", "@tabler/icons-react": "^2.30.0", "@tanstack/react-virtual": "^3.0.0-alpha.0", "@types/node": "^16.18.4", diff --git a/front/src/hooks/useCombinedRefs.ts b/front/src/hooks/useCombinedRefs.ts index 1b2f715f2..525f7a15f 100644 --- a/front/src/hooks/useCombinedRefs.ts +++ b/front/src/hooks/useCombinedRefs.ts @@ -1,10 +1,11 @@ import React, { Ref, RefCallback } from 'react'; +import { isFunction } from '@sniptt/guards'; export const useCombinedRefs = (...refs: (Ref | undefined)[]): RefCallback => (node: T) => { for (const ref of refs) { - if (typeof ref === 'function') { + if (isFunction(ref)) { ref(node); } else if (ref !== null && ref !== undefined) { (ref as React.MutableRefObject).current = node; diff --git a/front/src/modules/activities/components/ActivityComments.tsx b/front/src/modules/activities/components/ActivityComments.tsx index 2a1053327..4c96a5d80 100644 --- a/front/src/modules/activities/components/ActivityComments.tsx +++ b/front/src/modules/activities/components/ActivityComments.tsx @@ -1,5 +1,6 @@ import { getOperationName } from '@apollo/client/utilities'; import styled from '@emotion/styled'; +import { isNonEmptyString } from '@sniptt/guards'; import { useRecoilValue } from 'recoil'; import { v4 } from 'uuid'; @@ -10,7 +11,6 @@ import { } from '@/ui/input/components/AutosizeTextInput'; import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; import { Activity, useCreateCommentMutation } from '~/generated/graphql'; -import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { Comment } from '../comment/Comment'; import { GET_ACTIVITY } from '../graphql/queries/getActivity'; diff --git a/front/src/modules/ui/data/field/types/guards/isFieldBooleanValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldBooleanValue.ts index f604c97f4..70dfe4c0c 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldBooleanValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldBooleanValue.ts @@ -1,9 +1,8 @@ +import { isBoolean } from '@sniptt/guards'; + import { FieldBooleanValue } from '../FieldMetadata'; // TODO: add yup export const isFieldBooleanValue = ( fieldValue: unknown, -): fieldValue is FieldBooleanValue => - fieldValue !== null && - fieldValue !== undefined && - typeof fieldValue === 'boolean'; +): fieldValue is FieldBooleanValue => isBoolean(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldChipValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldChipValue.ts index f62b98ed9..1be6f1737 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldChipValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldChipValue.ts @@ -1,9 +1,8 @@ +import { isString } from '@sniptt/guards'; + import { FieldChipValue } from '../FieldMetadata'; // TODO: add yup export const isFieldChipValue = ( fieldValue: unknown, -): fieldValue is FieldChipValue => - fieldValue !== null && - fieldValue !== undefined && - typeof fieldValue === 'string'; +): fieldValue is FieldChipValue => isString(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldDateValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldDateValue.ts index 50400b022..c84f9264b 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldDateValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldDateValue.ts @@ -1,8 +1,8 @@ +import { isNull, isString } from '@sniptt/guards'; + import { FieldDateValue } from '../FieldMetadata'; // TODO: add yup export const isFieldDateValue = ( fieldValue: unknown, -): fieldValue is FieldDateValue => - fieldValue === null || - (fieldValue !== undefined && typeof fieldValue === 'string'); +): fieldValue is FieldDateValue => isNull(fieldValue) || isString(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldEmailValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldEmailValue.ts index 72ffdd649..0594b8ee4 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldEmailValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldEmailValue.ts @@ -1,9 +1,8 @@ +import { isString } from '@sniptt/guards'; + import { FieldEmailValue } from '../FieldMetadata'; // TODO: add yup export const isFieldEmailValue = ( fieldValue: unknown, -): fieldValue is FieldEmailValue => - fieldValue !== null && - fieldValue !== undefined && - typeof fieldValue === 'string'; +): fieldValue is FieldEmailValue => isString(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldMoneyValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldMoneyValue.ts index 7820c0592..6dad1dae3 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldMoneyValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldMoneyValue.ts @@ -1,8 +1,8 @@ +import { isNull, isNumber } from '@sniptt/guards'; + import { FieldMoneyValue } from '../FieldMetadata'; // TODO: add yup export const isFieldMoneyValue = ( fieldValue: unknown, -): fieldValue is FieldMoneyValue => - fieldValue === null || - (fieldValue !== undefined && typeof fieldValue === 'number'); +): fieldValue is FieldMoneyValue => isNull(fieldValue) || isNumber(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldNumberValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldNumberValue.ts index 65ae00aa7..4ab45262d 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldNumberValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldNumberValue.ts @@ -1,8 +1,8 @@ +import { isNull, isNumber } from '@sniptt/guards'; + import { FieldNumberValue } from '../FieldMetadata'; // TODO: add yup export const isFieldNumberValue = ( fieldValue: unknown, -): fieldValue is FieldNumberValue => - fieldValue === null || - (fieldValue !== undefined && typeof fieldValue === 'number'); +): fieldValue is FieldNumberValue => isNull(fieldValue) || isNumber(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldPhoneValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldPhoneValue.ts index e9975573c..e8634d77b 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldPhoneValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldPhoneValue.ts @@ -1,9 +1,8 @@ +import { isString } from '@sniptt/guards'; + import { FieldPhoneValue } from '../FieldMetadata'; // TODO: add yup export const isFieldPhoneValue = ( fieldValue: unknown, -): fieldValue is FieldPhoneValue => - fieldValue !== null && - fieldValue !== undefined && - typeof fieldValue === 'string'; +): fieldValue is FieldPhoneValue => isString(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldProbabilityValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldProbabilityValue.ts index c1e06a319..134a0e9e5 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldProbabilityValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldProbabilityValue.ts @@ -1,9 +1,8 @@ +import { isNumber } from '@sniptt/guards'; + import { FieldProbabilityValue } from '../FieldMetadata'; // TODO: add yup export const isFieldProbabilityValue = ( fieldValue: unknown, -): fieldValue is FieldProbabilityValue => - fieldValue !== null && - fieldValue !== undefined && - typeof fieldValue === 'number'; +): fieldValue is FieldProbabilityValue => isNumber(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldRelationValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldRelationValue.ts index 6a21a855f..4a620bb4d 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldRelationValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldRelationValue.ts @@ -1,7 +1,9 @@ +import { isObject, isUndefined } from '@sniptt/guards'; + import { FieldRelationValue } from '../FieldMetadata'; // TODO: add yup export const isFieldRelationValue = ( fieldValue: unknown, ): fieldValue is FieldRelationValue => - fieldValue !== undefined && typeof fieldValue === 'object'; + !isUndefined(fieldValue) && isObject(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldTextValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldTextValue.ts index 2d5d382db..77efd6973 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldTextValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldTextValue.ts @@ -1,9 +1,8 @@ +import { isString } from '@sniptt/guards'; + import { FieldTextValue } from '../FieldMetadata'; // TODO: add yup export const isFieldTextValue = ( fieldValue: unknown, -): fieldValue is FieldTextValue => - fieldValue !== null && - fieldValue !== undefined && - typeof fieldValue === 'string'; +): fieldValue is FieldTextValue => isString(fieldValue); diff --git a/front/src/modules/ui/data/field/types/guards/isFieldURLValue.ts b/front/src/modules/ui/data/field/types/guards/isFieldURLValue.ts index 4ad6f0036..a4a50120e 100644 --- a/front/src/modules/ui/data/field/types/guards/isFieldURLValue.ts +++ b/front/src/modules/ui/data/field/types/guards/isFieldURLValue.ts @@ -1,9 +1,8 @@ +import { isString } from '@sniptt/guards'; + import { FieldURLValue } from '../FieldMetadata'; // TODO: add yup export const isFieldURLValue = ( fieldValue: unknown, -): fieldValue is FieldURLValue => - fieldValue !== null && - fieldValue !== undefined && - typeof fieldValue === 'string'; +): fieldValue is FieldURLValue => isString(fieldValue); diff --git a/front/src/modules/ui/display/chip/components/EntityChip.tsx b/front/src/modules/ui/display/chip/components/EntityChip.tsx index 1d7325925..574be1ba4 100644 --- a/front/src/modules/ui/display/chip/components/EntityChip.tsx +++ b/front/src/modules/ui/display/chip/components/EntityChip.tsx @@ -1,10 +1,10 @@ import * as React from 'react'; import { useNavigate } from 'react-router-dom'; import { useTheme } from '@emotion/react'; +import { isNonEmptyString } from '@sniptt/guards'; import { IconComponent } from '@/ui/display/icon/types/IconComponent'; import { Avatar, AvatarType } from '@/users/components/Avatar'; -import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { Chip, ChipVariant } from './Chip'; diff --git a/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx b/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx index 382816501..e48af44fc 100644 --- a/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx +++ b/front/src/modules/ui/input/relation-picker/components/MultipleEntitySelect.tsx @@ -1,4 +1,5 @@ import { useRef } from 'react'; +import { isNonEmptyString } from '@sniptt/guards'; import debounce from 'lodash.debounce'; import { DropdownMenu } from '@/ui/layout/dropdown/components/DropdownMenu'; @@ -9,7 +10,6 @@ import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { MenuItemMultiSelectAvatar } from '@/ui/navigation/menu-item/components/MenuItemMultiSelectAvatar'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { Avatar } from '@/users/components/Avatar'; -import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { EntityForSelect } from '../types/EntityForSelect'; diff --git a/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx b/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx index 850b3ac0f..b6e177cb5 100644 --- a/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx +++ b/front/src/modules/ui/input/relation-picker/components/SingleEntitySelectBase.tsx @@ -1,4 +1,5 @@ import { useRef } from 'react'; +import { isNonEmptyString } from '@sniptt/guards'; import { Key } from 'ts-key-enum'; import { IconPlus } from '@/ui/display/icon'; @@ -11,7 +12,6 @@ import { MenuItemSelectAvatar } from '@/ui/navigation/menu-item/components/MenuI import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { Avatar } from '@/users/components/Avatar'; import { assertNotNull } from '~/utils/assert'; -import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { CreateButtonId, EmptyButtonId } from '../constants'; import { useEntitySelectScroll } from '../hooks/useEntitySelectScroll'; diff --git a/front/src/modules/users/components/Avatar.tsx b/front/src/modules/users/components/Avatar.tsx index 3ee8aca28..96861ecb5 100644 --- a/front/src/modules/users/components/Avatar.tsx +++ b/front/src/modules/users/components/Avatar.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; import styled from '@emotion/styled'; +import { isNonEmptyString } from '@sniptt/guards'; -import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { stringToHslColor } from '~/utils/string-to-hsl'; import { getImageAbsoluteURIOrBase64 } from '../utils/getProfilePictureAbsoluteURI'; diff --git a/front/src/pages/auth/VerifyEffect.tsx b/front/src/pages/auth/VerifyEffect.tsx index a8f00eb66..5f97ffbce 100644 --- a/front/src/pages/auth/VerifyEffect.tsx +++ b/front/src/pages/auth/VerifyEffect.tsx @@ -1,11 +1,11 @@ import { useEffect } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; +import { isNonEmptyString } from '@sniptt/guards'; import { useAuth } from '@/auth/hooks/useAuth'; import { useIsLogged } from '@/auth/hooks/useIsLogged'; import { AppPath } from '../../modules/types/AppPath'; -import { isNonEmptyString } from '../../utils/isNonEmptyString'; export const VerifyEffect = () => { const [searchParams] = useSearchParams(); diff --git a/front/src/pages/impersonate/ImpersonateEffect.tsx b/front/src/pages/impersonate/ImpersonateEffect.tsx index 3fdb43da3..66c0a8fa8 100644 --- a/front/src/pages/impersonate/ImpersonateEffect.tsx +++ b/front/src/pages/impersonate/ImpersonateEffect.tsx @@ -1,5 +1,6 @@ import { useCallback, useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; +import { isNonEmptyString } from '@sniptt/guards'; import { useRecoilState, useSetRecoilState } from 'recoil'; import { useIsLogged } from '@/auth/hooks/useIsLogged'; @@ -8,7 +9,6 @@ import { tokenPairState } from '@/auth/states/tokenPairState'; import { useImpersonateMutation } from '~/generated/graphql'; import { AppPath } from '../../modules/types/AppPath'; -import { isNonEmptyString } from '../../utils/isNonEmptyString'; export const ImpersonateEffect = () => { const navigate = useNavigate(); diff --git a/front/src/pages/people/__stories__/People.inputs.stories.tsx b/front/src/pages/people/__stories__/People.inputs.stories.tsx index a74695013..ff6be56fa 100644 --- a/front/src/pages/people/__stories__/People.inputs.stories.tsx +++ b/front/src/pages/people/__stories__/People.inputs.stories.tsx @@ -1,4 +1,5 @@ import { getOperationName } from '@apollo/client/utilities'; +import { isString } from '@sniptt/guards'; import { expect } from '@storybook/jest'; import { Meta } from '@storybook/react'; import { userEvent, within } from '@storybook/testing-library'; @@ -116,7 +117,7 @@ const editRelationMocks = ( ) => [ ...graphqlMocks.filter((graphqlMock) => { if ( - typeof graphqlMock.info.operationName === 'string' && + isString(graphqlMock.info.operationName) && [ getOperationName(UPDATE_ONE_PERSON), getOperationName(SEARCH_COMPANY_QUERY), diff --git a/front/src/testing/decorators/CatalogDecorator.tsx b/front/src/testing/decorators/CatalogDecorator.tsx index b510c36f9..ab43a7df1 100644 --- a/front/src/testing/decorators/CatalogDecorator.tsx +++ b/front/src/testing/decorators/CatalogDecorator.tsx @@ -1,5 +1,6 @@ import { ComponentProps, JSX } from 'react'; import styled from '@emotion/styled'; +import { isNumber, isString } from '@sniptt/guards'; import { Decorator } from '@storybook/react'; const StyledColumnTitle = styled.h1` @@ -75,6 +76,9 @@ const emptyDimension = { props: () => ({}), } as CatalogDimension; +const isStringOrNumber = (term: unknown): term is string | number => + isString(term) || isNumber(term); + export type CatalogDimension< ComponentType extends React.ElementType = () => JSX.Element, > = { @@ -108,30 +112,26 @@ export const CatalogDecorator: Decorator = (Story, context) => { {dimension4.labels?.(value4) ?? - (['string', 'number'].includes(typeof value4) ? value4 : '')} + (isStringOrNumber(value4) ? value4 : '')} {dimension3.values.map((value3: any) => ( {dimension3.labels?.(value3) ?? - (['string', 'number'].includes(typeof value3) ? value3 : '')} + (isStringOrNumber(value3) ? value3 : '')} {dimension2.values.map((value2: any) => ( {dimension2.labels?.(value2) ?? - (['string', 'number'].includes(typeof value2) - ? value2 - : '')} + (isStringOrNumber(value2) ? value2 : '')} {dimension1.values.map((value1: any) => { return ( {dimension1.labels?.(value1) ?? - (['string', 'number'].includes(typeof value1) - ? value1 - : '')} + (isStringOrNumber(value1) ? value1 : '')} ( const nestedKey = Object.keys(filterElement.is)[0] as string; if ( item[key as keyof typeof item] && - typeof item[key as keyof typeof item] === 'object' + isObject(item[key as keyof typeof item]) ) { const nestedItem = item[key as keyof typeof item]; return ( @@ -116,7 +117,7 @@ export const filterAndSortData = ( const sortDirection = firstOrderBy[key as unknown as keyof typeof firstOrderBy]; - if (typeof itemAValue === 'string' && typeof itemBValue === 'string') { + if (isString(itemAValue) && isString(itemBValue)) { return sortDirection === 'desc' ? itemBValue.localeCompare(itemAValue) : -itemBValue.localeCompare(itemAValue); diff --git a/front/src/utils/cast-as-integer-or-null.ts b/front/src/utils/cast-as-integer-or-null.ts index d5ed76d22..b49655b06 100644 --- a/front/src/utils/cast-as-integer-or-null.ts +++ b/front/src/utils/cast-as-integer-or-null.ts @@ -1,3 +1,5 @@ +import { isNull, isNumber, isString } from '@sniptt/guards'; + import { logError } from './logError'; const DEBUG_MODE = false; @@ -11,13 +13,13 @@ export const canBeCastAsIntegerOrNull = ( return false; } - if (typeof probableNumberOrNull === 'number') { + if (isNumber(probableNumberOrNull)) { if (DEBUG_MODE) logError('typeof probableNumberOrNull === "number"'); return Number.isInteger(probableNumberOrNull); } - if (probableNumberOrNull === null) { + if (isNull(probableNumberOrNull)) { if (DEBUG_MODE) logError('probableNumberOrNull === null'); return true; @@ -29,7 +31,7 @@ export const canBeCastAsIntegerOrNull = ( return true; } - if (typeof probableNumberOrNull === 'string') { + if (isString(probableNumberOrNull)) { const stringAsNumber = +probableNumberOrNull; if (isNaN(stringAsNumber)) { @@ -54,7 +56,7 @@ export const castAsIntegerOrNull = ( throw new Error('Cannot cast to number or null'); } - if (probableNumberOrNull === null) { + if (isNull(probableNumberOrNull)) { return null; } @@ -62,11 +64,11 @@ export const castAsIntegerOrNull = ( return null; } - if (typeof probableNumberOrNull === 'number') { + if (isNumber(probableNumberOrNull)) { return probableNumberOrNull; } - if (typeof probableNumberOrNull === 'string') { + if (isString(probableNumberOrNull)) { return +probableNumberOrNull; } diff --git a/front/src/utils/cast-as-positive-integer-or-null.ts b/front/src/utils/cast-as-positive-integer-or-null.ts index 1a95db9a5..726596887 100644 --- a/front/src/utils/cast-as-positive-integer-or-null.ts +++ b/front/src/utils/cast-as-positive-integer-or-null.ts @@ -1,3 +1,5 @@ +import { isInteger, isNull, isNumber, isString } from '@sniptt/guards'; + export const canBeCastAsPositiveIntegerOrNull = ( probablePositiveNumberOrNull: string | undefined | number | null, ): probablePositiveNumberOrNull is number | null => { @@ -5,14 +7,14 @@ export const canBeCastAsPositiveIntegerOrNull = ( return false; } - if (typeof probablePositiveNumberOrNull === 'number') { + if (isNumber(probablePositiveNumberOrNull)) { return ( Number.isInteger(probablePositiveNumberOrNull) && Math.sign(probablePositiveNumberOrNull) !== -1 ); } - if (probablePositiveNumberOrNull === null) { + if (isNull(probablePositiveNumberOrNull)) { return true; } @@ -20,14 +22,14 @@ export const canBeCastAsPositiveIntegerOrNull = ( return true; } - if (typeof probablePositiveNumberOrNull === 'string') { + if (isString(probablePositiveNumberOrNull)) { const stringAsNumber = +probablePositiveNumberOrNull; if (isNaN(stringAsNumber)) { return false; } - if (Number.isInteger(stringAsNumber) && Math.sign(stringAsNumber) !== -1) { + if (isInteger(stringAsNumber) && Math.sign(stringAsNumber) !== -1) { return true; } } @@ -52,11 +54,11 @@ export const castAsPositiveIntegerOrNull = ( return null; } - if (typeof probablePositiveNumberOrNull === 'number') { + if (isNumber(probablePositiveNumberOrNull)) { return probablePositiveNumberOrNull; } - if (typeof probablePositiveNumberOrNull === 'string') { + if (isString(probablePositiveNumberOrNull)) { return +probablePositiveNumberOrNull; } diff --git a/front/src/utils/date-utils.ts b/front/src/utils/date-utils.ts index 9cb5d617f..5b782a0fe 100644 --- a/front/src/utils/date-utils.ts +++ b/front/src/utils/date-utils.ts @@ -1,3 +1,4 @@ +import { isDate, isNumber, isString } from '@sniptt/guards'; import { differenceInCalendarDays, formatDistanceToNow } from 'date-fns'; import { DateTime } from 'luxon'; @@ -10,11 +11,11 @@ export const parseDate = (dateToParse: Date | string | number) => { if (!dateToParse) { throw new Error(`Invalid date passed to formatPastDate: "${dateToParse}"`); - } else if (typeof dateToParse === 'string') { + } else if (isString(dateToParse)) { formattedDate = DateTime.fromISO(dateToParse); - } else if (dateToParse instanceof Date) { + } else if (isDate(dateToParse)) { formattedDate = DateTime.fromJSDate(dateToParse); - } else if (typeof dateToParse === 'number') { + } else if (isNumber(dateToParse)) { formattedDate = DateTime.fromMillis(dateToParse); } diff --git a/front/src/utils/isNonEmptyString.ts b/front/src/utils/isNonEmptyString.ts deleted file mode 100644 index b5b42f151..000000000 --- a/front/src/utils/isNonEmptyString.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { isDefined } from './isDefined'; - -export const isNonEmptyString = ( - probableNonEmptyString: string | undefined | null, -): probableNonEmptyString is string => { - if ( - isDefined(probableNonEmptyString) && - typeof probableNonEmptyString === 'string' && - probableNonEmptyString !== '' - ) { - return true; - } - - return false; -}; diff --git a/front/yarn.lock b/front/yarn.lock index 34257458f..7a49f909e 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -3922,6 +3922,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sniptt/guards@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@sniptt/guards/-/guards-0.2.0.tgz#6b95d259bfd77c5db2945605e033cdcfcea97eba" + integrity sha512-QNxknl5YcrxpLtP99iEvNEJRlfXtIfpkvcEWHJKD6bHUr93dsH6OZGUF6reVBddKs1ps44lndSMoDK2Dz0n6ZQ== + "@storybook/addon-actions@7.3.0", "@storybook/addon-actions@^7.0.22": version "7.3.0" resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-7.3.0.tgz#fb1663a2810918a4147edebc5c7ff056d6ec7e94"