diff --git a/.changeset/famous-rivers-happen.md b/.changeset/famous-rivers-happen.md new file mode 100644 index 000000000..53eda2c1e --- /dev/null +++ b/.changeset/famous-rivers-happen.md @@ -0,0 +1,12 @@ +--- +"@flopflip/cypress-plugin": patch +"@flopflip/launchdarkly-adapter": patch +"@flopflip/react-broadcast": patch +"@flopflip/react-redux": patch +"@flopflip/react": patch +"@flopflip/splitio-adapter": patch +"@flopflip/test-utils": patch +"@flopflip/types": patch +--- + +Refactor to import fixes from pnpm migration to `main` diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 97% rename from .eslintrc.js rename to .eslintrc.cjs index 26f039ecc..3874ba319 100644 --- a/.eslintrc.js +++ b/.eslintrc.cjs @@ -3,6 +3,7 @@ module.exports = { sourceType: 'module', ecmaVersion: 7, ecmaFeatures: { jsx: true, modules: true }, + project: ['./tsconfig.lint.json'], }, extends: [ 'xo', diff --git a/jest-runner-test.config.js b/jest-runner-test.config.js index 1d6ae196e..e7b72dffe 100644 --- a/jest-runner-test.config.js +++ b/jest-runner-test.config.js @@ -1 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-require-imports require('@testing-library/jest-dom/extend-expect'); diff --git a/package.json b/package.json index e65de5699..97f8aeecd 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "develop": "jest --projects jest.*.config.js --watch", "lint": "jest --config jest.lint.config.js --maxWorkers 5", "pretypecheck": "rimraf packages/**/dist/", - "typecheck": "tsc --noEmit", + "typecheck": "tsc --project tsconfig.json --noEmit && tsc --project packages/cypress-plugin/tsconfig.json --noEmit", "format": "yarn format:ts && yarn format:md && yarn format:yaml", "format:ts": "prettier --write '**/*.{js, ts, tsx}'", "format:md": "prettier --parser markdown --write '**/*.md'", @@ -90,6 +90,7 @@ "eslint-plugin-testing-library": "5.1.0", "husky": "7.0.4", "jest": "27.5.1", + "jest-localstorage-mock": "2.4.19", "lint-staged": "12.3.7", "pinst": "3.0.0", "prettier": "2.6.0", diff --git a/packages/cypress-plugin/tsconfig.json b/packages/cypress-plugin/tsconfig.json new file mode 100644 index 000000000..740260fa6 --- /dev/null +++ b/packages/cypress-plugin/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "noEmit": true, + // be explicit about types included + // to avoid clashing with Jest types + "types": ["cypress"] + }, + "exclude": [""], + "include": [ + "../node_modules/cypress", + "./**/*.ts" + ] +} diff --git a/packages/launchdarkly-adapter/package.json b/packages/launchdarkly-adapter/package.json index 4f4c25665..9cfeea95a 100644 --- a/packages/launchdarkly-adapter/package.json +++ b/packages/launchdarkly-adapter/package.json @@ -29,10 +29,11 @@ "@babel/runtime": "7.17.8", "@flopflip/adapter-utilities": "1.0.24", "@flopflip/types": "4.1.20", + "@types/merge-deep": "3.0.0", "debounce-fn": "4.0.0", - "deepmerge": "4.2.2", "launchdarkly-js-client-sdk": "2.20.2", "lodash": "4.17.21", + "merge-deep": "3.0.3", "mitt": "3.0.0", "tiny-warning": "1.0.3" }, diff --git a/packages/launchdarkly-adapter/src/adapter/adapter.ts b/packages/launchdarkly-adapter/src/adapter/adapter.ts index e183cb520..b3f73bcd7 100644 --- a/packages/launchdarkly-adapter/src/adapter/adapter.ts +++ b/packages/launchdarkly-adapter/src/adapter/adapter.ts @@ -22,14 +22,13 @@ import { AdapterSubscriptionStatus, } from '@flopflip/types'; import debounce from 'debounce-fn'; -import merge from 'deepmerge'; import { + type LDClient, + type LDUser, initialize as initializeLaunchDarklyClient, - LDClient, - LDUser, } from 'launchdarkly-js-client-sdk'; -import { type LDUser as TLDUser } from 'launchdarkly-js-sdk-common'; import isEqual from 'lodash/isEqual'; +import merge from 'merge-deep'; import mitt, { Emitter } from 'mitt'; import warning from 'tiny-warning'; @@ -37,7 +36,7 @@ type TEmitterEvents = { flagsStateChange: TFlags; statusStateChange: Partial; }; -type TLaunchDarklyUser = TUser; +type TLaunchDarklyUser = TUser; type TLaunchDarklyAdapterState = { user?: TLaunchDarklyUser; client?: LDClient; diff --git a/packages/react-broadcast/src/components/configure/configure.tsx b/packages/react-broadcast/src/components/configure/configure.tsx index b31ec080b..5d00608a7 100644 --- a/packages/react-broadcast/src/components/configure/configure.tsx +++ b/packages/react-broadcast/src/components/configure/configure.tsx @@ -8,8 +8,6 @@ import { type TConfigureAdapterProps, type TFlags, type TFlagsChange, -} from '@flopflip/types'; -import { AdapterConfigurationStatus, AdapterSubscriptionStatus, } from '@flopflip/types'; @@ -101,9 +99,9 @@ const useStatusState = (): [ return [status, setStatus]; }; -const Configure = ( +function Configure( props: Props -) => { +) { const adapterIdentifiers = useMemo( () => [props.adapter.id], [props.adapter.id] @@ -164,7 +162,7 @@ const Configure = ( ); -}; +} Configure.displayName = 'ConfigureFlopflip'; Configure.defaultProps = { diff --git a/packages/react-broadcast/src/components/test-provider/test-provider.tsx b/packages/react-broadcast/src/components/test-provider/test-provider.tsx index 7e0d53ab5..e1dddfb0e 100644 --- a/packages/react-broadcast/src/components/test-provider/test-provider.tsx +++ b/packages/react-broadcast/src/components/test-provider/test-provider.tsx @@ -4,8 +4,6 @@ import { type TAdapterStatus, type TFlags, type TReconfigureAdapter, -} from '@flopflip/types'; -import { AdapterConfigurationStatus, AdapterSubscriptionStatus, } from '@flopflip/types'; @@ -32,14 +30,14 @@ const defaultProps: Pick< }, }; -const TestProvider = (props: TProps) => { +function TestProvider(props: TProps) { const adapterContextValue = createAdapterContext( props.adapterIdentifiers, props.reconfigure, props.status ); const flagsContextValue = createIntialFlagsContext( - // @ts-expect-error + // @ts-expect-error Can not remember. Sorry to myself. props.adapterIdentifiers, props.flags ); @@ -51,7 +49,7 @@ const TestProvider = (props: TProps) => { ); -}; +} TestProvider.displayName = 'TestProviderFlopFlip'; TestProvider.defaultProps = defaultProps; diff --git a/packages/react-broadcast/src/components/toggle-feature/toggle-feature.tsx b/packages/react-broadcast/src/components/toggle-feature/toggle-feature.tsx index f6ae80e85..3ac4d2d05 100644 --- a/packages/react-broadcast/src/components/toggle-feature/toggle-feature.tsx +++ b/packages/react-broadcast/src/components/toggle-feature/toggle-feature.tsx @@ -1,8 +1,8 @@ -import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import { ToggleFeature as SharedToggleFeature, TToggleFeatureProps, } from '@flopflip/react'; +import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import React from 'react'; import { useFeatureToggle } from '../../hooks/'; @@ -10,13 +10,13 @@ import { useFeatureToggle } from '../../hooks/'; type Props = { flag: TFlagName; variation?: TFlagVariation; - // eslint-disable-next-line @typescript-eslint/ban-types + } & Omit; -const ToggleFeature = (props: OwnProps) => { +function ToggleFeature(props: OwnProps) { const isFeatureEnabled = useFeatureToggle(props.flag, props.variation); return ; -}; +} ToggleFeature.displayName = 'ToggleFeature'; diff --git a/packages/react-broadcast/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx b/packages/react-broadcast/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx index 5c0af607f..3fdc8e74e 100644 --- a/packages/react-broadcast/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx +++ b/packages/react-broadcast/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx @@ -14,13 +14,13 @@ export default function branchOnFeatureToggle< UntoggledComponent?: React.ComponentType ) { return (ToggledComponent: React.ComponentType) => { - const WrappedToggledComponent = (ownProps: OwnProps) => { + function WrappedToggledComponent(ownProps: OwnProps) { const isFeatureEnabled = useFeatureToggle(flagName, flagVariation); if (isFeatureEnabled) return ; if (UntoggledComponent) return ; return null; - }; + } return WrappedToggledComponent; }; diff --git a/packages/react-broadcast/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx b/packages/react-broadcast/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx index fe43c5512..af6dd4f67 100644 --- a/packages/react-broadcast/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx +++ b/packages/react-broadcast/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx @@ -1,9 +1,9 @@ -import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import { DEFAULT_FLAG_PROP_KEY, setDisplayName, wrapDisplayName, } from '@flopflip/react'; +import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import React from 'react'; import { useFlagVariations } from '../../hooks'; @@ -16,7 +16,7 @@ export default function injectFeatureToggle< return ( Component: React.ComponentType ): React.ComponentType => { - const WrappedComponent = (ownProps: OwnProps) => { + function WrappedComponent(ownProps: OwnProps) { const [flagVariation] = useFlagVariations([flagName]); const props = { ...ownProps, @@ -24,7 +24,7 @@ export default function injectFeatureToggle< }; return ; - }; + } setDisplayName(wrapDisplayName(WrappedComponent, 'injectFeatureToggle')); diff --git a/packages/react-broadcast/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx b/packages/react-broadcast/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx index abd53ccd2..6f56c5c6a 100644 --- a/packages/react-broadcast/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx +++ b/packages/react-broadcast/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx @@ -1,9 +1,9 @@ -import { type TFlagName, type TFlags } from '@flopflip/types'; import { DEFAULT_FLAGS_PROP_KEY, setDisplayName, wrapDisplayName, } from '@flopflip/react'; +import { type TFlagName, type TFlags } from '@flopflip/types'; import React from 'react'; import { useFlagVariations } from '../../hooks'; @@ -16,7 +16,7 @@ export default function injectFeatureToggles< return ( Component: React.ComponentType ): React.ComponentType => { - const WrappedComponent = (ownProps: OwnProps) => { + function WrappedComponent(ownProps: OwnProps) { const flagVariations = useFlagVariations(flagNames); const flags = Object.fromEntries( flagNames.map((flagName, indexOfFlagName) => [ @@ -30,7 +30,7 @@ export default function injectFeatureToggles< }; return ; - }; + } setDisplayName(wrapDisplayName(WrappedComponent, 'injectFeatureToggles')); diff --git a/packages/react-redux/src/components/configure/configure.tsx b/packages/react-redux/src/components/configure/configure.tsx index 06080e887..8ddc60877 100644 --- a/packages/react-redux/src/components/configure/configure.tsx +++ b/packages/react-redux/src/components/configure/configure.tsx @@ -1,3 +1,4 @@ +import { ConfigureAdapter, useAdapterSubscription } from '@flopflip/react'; import { type TAdapter, type TConfigureAdapterChildren, @@ -5,7 +6,6 @@ import { type TFlags, } from '@flopflip/types'; import React from 'react'; -import { ConfigureAdapter, useAdapterSubscription } from '@flopflip/react'; import { useUpdateFlags, useUpdateStatus } from '../../hooks'; @@ -25,9 +25,7 @@ const defaultProps: Pick< shouldDeferAdapterConfiguration: false, }; -const Configure = ( - props: Props -) => { +function Configure(props: Props) { const adapterIdentifiers = [props.adapter.id]; const handleUpdateFlags = useUpdateFlags({ adapterIdentifiers }); const handleUpdateStatus = useUpdateStatus(); @@ -46,7 +44,7 @@ const Configure = ( {props.children} ); -}; +} Configure.displayName = 'ConfigureFlopflip'; Configure.defaultProps = defaultProps; diff --git a/packages/react-redux/src/components/toggle-feature/toggle-feature.tsx b/packages/react-redux/src/components/toggle-feature/toggle-feature.tsx index f6ae80e85..670c81b9c 100644 --- a/packages/react-redux/src/components/toggle-feature/toggle-feature.tsx +++ b/packages/react-redux/src/components/toggle-feature/toggle-feature.tsx @@ -1,8 +1,8 @@ -import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import { ToggleFeature as SharedToggleFeature, TToggleFeatureProps, } from '@flopflip/react'; +import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import React from 'react'; import { useFeatureToggle } from '../../hooks/'; @@ -10,13 +10,12 @@ import { useFeatureToggle } from '../../hooks/'; type Props = { flag: TFlagName; variation?: TFlagVariation; - // eslint-disable-next-line @typescript-eslint/ban-types } & Omit; -const ToggleFeature = (props: OwnProps) => { +function ToggleFeature(props: OwnProps) { const isFeatureEnabled = useFeatureToggle(props.flag, props.variation); return ; -}; +} ToggleFeature.displayName = 'ToggleFeature'; diff --git a/packages/react-redux/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx b/packages/react-redux/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx index 5c0af607f..3fdc8e74e 100644 --- a/packages/react-redux/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx +++ b/packages/react-redux/src/hocs/branch-on-feature-toggle/branch-on-feature-toggle.tsx @@ -14,13 +14,13 @@ export default function branchOnFeatureToggle< UntoggledComponent?: React.ComponentType ) { return (ToggledComponent: React.ComponentType) => { - const WrappedToggledComponent = (ownProps: OwnProps) => { + function WrappedToggledComponent(ownProps: OwnProps) { const isFeatureEnabled = useFeatureToggle(flagName, flagVariation); if (isFeatureEnabled) return ; if (UntoggledComponent) return ; return null; - }; + } return WrappedToggledComponent; }; diff --git a/packages/react-redux/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx b/packages/react-redux/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx index 5493b97ab..bbd3ab065 100644 --- a/packages/react-redux/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx +++ b/packages/react-redux/src/hocs/inject-feature-toggle/inject-feature-toggle.tsx @@ -1,9 +1,9 @@ -import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import { DEFAULT_FLAG_PROP_KEY, setDisplayName, wrapDisplayName, } from '@flopflip/react'; +import { type TFlagName, type TFlagVariation } from '@flopflip/types'; import React from 'react'; import { useFlagVariations } from '../../hooks'; @@ -17,7 +17,7 @@ export default >( ( Component: React.ComponentType ): React.ComponentType => { - const WrappedComponent = (ownProps: OwnProps) => { + function WrappedComponent(ownProps: OwnProps) { const [flagVariation] = useFlagVariations([flagName]); const props = { ...ownProps, @@ -25,7 +25,7 @@ export default >( }; return ; - }; + } setDisplayName(wrapDisplayName(WrappedComponent, 'injectFeatureToggle')); diff --git a/packages/react-redux/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx b/packages/react-redux/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx index f7928f4f9..9219062de 100644 --- a/packages/react-redux/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx +++ b/packages/react-redux/src/hocs/inject-feature-toggles/inject-feature-toggles.tsx @@ -1,9 +1,9 @@ -import { type TFlagName, type TFlags } from '@flopflip/types'; import { DEFAULT_FLAGS_PROP_KEY, setDisplayName, wrapDisplayName, } from '@flopflip/react'; +import { type TFlagName, type TFlags } from '@flopflip/types'; import React from 'react'; import { useFlagVariations } from '../../hooks'; @@ -17,7 +17,7 @@ export default >( ( Component: React.ComponentType ): React.ComponentType => { - const WrappedComponent = (ownProps: OwnProps) => { + function WrappedComponent(ownProps: OwnProps) { const flagVariations = useFlagVariations(flagNames); const flags = Object.fromEntries( flagNames.map((flagName, indexOfFlagName) => [ @@ -31,7 +31,7 @@ export default >( }; return ; - }; + } setDisplayName(wrapDisplayName(WrappedComponent, 'injectFeatureToggles')); diff --git a/packages/react-redux/test-utils/index.js b/packages/react-redux/test-utils/index.js index f7ec35620..1358991b0 100644 --- a/packages/react-redux/test-utils/index.js +++ b/packages/react-redux/test-utils/index.js @@ -1,9 +1,7 @@ -import { - createFlopflipReducer, - FLOPFLIP_STATE_SLICE, -} from '@flopflip/react-redux'; import { combineReducers, createStore as createReduxStore } from 'redux'; +import { createFlopflipReducer, FLOPFLIP_STATE_SLICE } from '../src/'; + const defaultInitialState = {}; const reducer = combineReducers({ diff --git a/packages/react/package.json b/packages/react/package.json index f7e1ad126..670955834 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -40,9 +40,10 @@ "dependencies": { "@babel/runtime": "7.17.8", "@flopflip/types": "4.1.20", + "@types/merge-deep": "3.0.0", "@types/react-is": "17.0.3", - "deepmerge": "4.2.2", "lodash": "4.17.21", + "merge-deep": "3.0.3", "react-is": "17.0.2", "tiny-warning": "1.0.3" }, diff --git a/packages/react/src/components/configure-adapter/configure-adapter.spec.js b/packages/react/src/components/configure-adapter/configure-adapter.spec.js index 038897dd6..cf928c26b 100644 --- a/packages/react/src/components/configure-adapter/configure-adapter.spec.js +++ b/packages/react/src/components/configure-adapter/configure-adapter.spec.js @@ -86,9 +86,9 @@ describe('rendering', () => { expect(props.render).not.toHaveBeenCalled(); - await waitFor(() => - expect(adapter.getIsConfigurationStatus).toHaveBeenCalled() - ); + await waitFor(() => { + expect(adapter.getIsConfigurationStatus).toHaveBeenCalled(); + }); }); }); }); @@ -263,12 +263,12 @@ describe('when adapter args change after adapter was configured', () => { await waitUntilStatus(); - await waitFor(() => + await waitFor(() => { expect(adapter.reconfigure).toHaveBeenCalledWith( nextAdapterArgs, expect.anything() - ) - ); + ); + }); }); }); diff --git a/packages/react/src/components/configure-adapter/configure-adapter.tsx b/packages/react/src/components/configure-adapter/configure-adapter.tsx index 1a47b0c0d..d81defe15 100644 --- a/packages/react/src/components/configure-adapter/configure-adapter.tsx +++ b/packages/react/src/components/configure-adapter/configure-adapter.tsx @@ -9,8 +9,6 @@ import { type TAdapterStatus, type TConfigureAdapterChildren, type TFlags, -} from '@flopflip/types'; -import { AdapterConfigurationStatus, AdapterInitializationStatus, } from '@flopflip/types'; @@ -34,6 +32,7 @@ export const AdapterStates = { export type TAdapterStates = ValueOf; type TProps = { + // eslint-disable-next-line react/boolean-prop-naming shouldDeferAdapterConfiguration?: boolean; adapter: TAdapter; adapterArgs: TAdapterArgs; @@ -111,14 +110,14 @@ const useAdapterStateRef = (): TUseAdapterStateRefReturn => { }; type TUsePendingAdapterArgsRefReturn = [ - React.MutableRefObject, + React.MutableRefObject, (nextReconfiguration: TAdapterReconfiguration) => void, () => TAdapterArgs ]; const usePendingAdapterArgsRef = ( appliedAdapterArgs: TAdapterArgs ): TUsePendingAdapterArgsRefReturn => { - const pendingAdapterArgsRef = useRef(null); + const pendingAdapterArgsRef = useRef(undefined); const setPendingAdapterArgs = useCallback( (nextReconfiguration: TAdapterReconfiguration): void => { @@ -139,7 +138,7 @@ const usePendingAdapterArgsRef = ( ); const unsetPendingAdapterArgs = useCallback(() => { - pendingAdapterArgsRef.current = null; + pendingAdapterArgsRef.current = undefined; }, [pendingAdapterArgsRef]); /** @@ -430,7 +429,7 @@ const usePendingAdapterArgsEffect = ({ return [reconfigureOrQueue]; }; -const ConfigureAdapter = (props: TProps) => { +function ConfigureAdapter(props: TProps) { const [appliedAdapterArgs, applyAdapterArgs] = useAppliedAdapterArgsState({ initialAdapterArgs: props.adapterArgs, }); @@ -509,7 +508,7 @@ const ConfigureAdapter = (props: TProps) => { })()} ); -}; +} ConfigureAdapter.defaultProps = { shouldDeferAdapterConfiguration: false, diff --git a/packages/react/src/components/configure-adapter/helpers.ts b/packages/react/src/components/configure-adapter/helpers.ts index 99c5dc2fa..6b31f7983 100644 --- a/packages/react/src/components/configure-adapter/helpers.ts +++ b/packages/react/src/components/configure-adapter/helpers.ts @@ -4,7 +4,7 @@ import { TConfigureAdapterChildren, TConfigureAdapterChildrenAsFunction, } from '@flopflip/types'; -import merge from 'deepmerge'; +import merge from 'merge-deep'; import { Children } from 'react'; const isFunctionChildren = ( @@ -21,7 +21,6 @@ const mergeAdapterArgs = ( ): TAdapterArgs => options.shouldOverwrite ? nextAdapterArgs - : // @ts-expect-error merging does not give correct typing - merge(previousAdapterArgs, nextAdapterArgs); + : merge(previousAdapterArgs, nextAdapterArgs); export { isEmptyChildren, isFunctionChildren, mergeAdapterArgs }; diff --git a/packages/react/src/components/reconfigure-adapter/reconfigure-adapter.ts b/packages/react/src/components/reconfigure-adapter/reconfigure-adapter.ts index bae2ddbc8..37ec65855 100644 --- a/packages/react/src/components/reconfigure-adapter/reconfigure-adapter.ts +++ b/packages/react/src/components/reconfigure-adapter/reconfigure-adapter.ts @@ -1,5 +1,5 @@ import { type TUser } from '@flopflip/types'; -import { Children, useEffect } from 'react'; +import React, { Children, useEffect } from 'react'; import useAdapterContext from '../../hooks/use-adapter-context'; diff --git a/packages/splitio-adapter/package.json b/packages/splitio-adapter/package.json index 4fdb8b715..5d4ff6c82 100644 --- a/packages/splitio-adapter/package.json +++ b/packages/splitio-adapter/package.json @@ -30,8 +30,9 @@ "@flopflip/adapter-utilities": "1.0.24", "@flopflip/types": "4.1.20", "@splitsoftware/splitio": "10.17.3", - "deepmerge": "4.2.2", - "lodash": "4.17.21" + "@types/merge-deep": "3.0.0", + "lodash": "4.17.21", + "merge-deep": "3.0.3" }, "keywords": [ "feature-flags", diff --git a/packages/splitio-adapter/src/adapter/adapter.ts b/packages/splitio-adapter/src/adapter/adapter.ts index 8296a2105..0e1200236 100644 --- a/packages/splitio-adapter/src/adapter/adapter.ts +++ b/packages/splitio-adapter/src/adapter/adapter.ts @@ -16,11 +16,11 @@ import { AdapterSubscriptionStatus, } from '@flopflip/types'; import { SplitFactory } from '@splitsoftware/splitio'; -import merge from 'deepmerge'; import camelCase from 'lodash/camelCase'; import cloneDeep from 'lodash/cloneDeep'; import isEqual from 'lodash/isEqual'; import omit from 'lodash/omit'; +import merge from 'merge-deep'; type TSplitIOAdapterState = { user?: TUser; diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 5c8ea328f..039da2422 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -19,10 +19,10 @@ "@flopflip/memory-adapter": "3.0.25", "@testing-library/jest-dom": "5.16.2", "@testing-library/react": "12.1.4", - "jest-localstorage-mock": "2.4.19", "jest-plugin-filename": "0.0.1", "jest-runner-eslint": "1.0.0", "jest-watch-yarn-workspaces": "1.1.0", - "react": "17.0.2" + "react": "17.0.2", + "react-dom": "17.0.2" } } diff --git a/packages/types/package.json b/packages/types/package.json index d105d7e23..091c10a6a 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -27,6 +27,9 @@ "feature-toggles", "types" ], + "dependencies": { + "launchdarkly-js-client-sdk": "2.20.2" + }, "devDependencies": { "typescript": "4.6.2" }, diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index f2d598abf..dc3dc1b33 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -1,8 +1,9 @@ import { type LDClient as TLDClient, type LDOptions as TLDOptions, + type LDUser, } from 'launchdarkly-js-client-sdk'; -import { type LDUser as TLDUser } from 'launchdarkly-js-sdk-common'; +import React from 'react'; export type TFlagName = string; export type TFlagVariation = @@ -51,7 +52,7 @@ export type TBaseAdapterArgs< > = { user: TUser; }; -export type TLaunchDarklyAdapterArgs = TBaseAdapterArgs & { +export type TLaunchDarklyAdapterArgs = TBaseAdapterArgs & { sdk: { clientSideId: string; clientOptions?: TLDOptions; diff --git a/throwing-console-patch.js b/throwing-console-patch.js index bb5bd82a6..678155705 100644 --- a/throwing-console-patch.js +++ b/throwing-console-patch.js @@ -1,3 +1,4 @@ +// eslint-disable-next-line const colors = require('colors/safe'); const shouldSilenceWarnings = (...messages) => @@ -7,6 +8,7 @@ const shouldNotThrowWarnings = (...messages) => [].some((msgRegex) => messages.some((msg) => msgRegex.test(msg))); const logOrThrow = (log, method, messages) => { + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions const warning = `console.${method} calls not allowed in tests`; if (process.env.CI) { if (shouldSilenceWarnings(messages)) return; @@ -23,25 +25,21 @@ const logOrThrow = (log, method, messages) => { } }; -// eslint-disable-next-line no-console const logMessage = console.log; global.console.log = (...messages) => { logOrThrow(logMessage, 'log', messages); }; -// eslint-disable-next-line no-console const logInfo = console.info; global.console.info = (...messages) => { logOrThrow(logInfo, 'info', messages); }; -// eslint-disable-next-line no-console const logWarning = console.warn; global.console.warn = (...messages) => { logOrThrow(logWarning, 'warn', messages); }; -// eslint-disable-next-line no-console const logError = console.error; global.console.error = (...messages) => { logOrThrow(logError, 'error', messages); diff --git a/tsconfig.json b/tsconfig.json index 89d004199..d43cacebc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,7 +25,8 @@ "stripInternal": true, "target": "ES2015", "allowJs": false, - "types": ["cypress", "node", "react"] + "types": ["jest"], }, + "exclude": ["packages/cypress-plugin"], "typeRoots": ["@types", "node_modules/@types"] } diff --git a/tsconfig.lint.json b/tsconfig.lint.json new file mode 100644 index 000000000..d2ccb3230 --- /dev/null +++ b/tsconfig.lint.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true, + "strict": true + }, + "exclude": [""], + "include": [ + "./**/*.ts", + "./**/*.js" + ] +} diff --git a/yarn.lock b/yarn.lock index ad0500d8f..eb665eb9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2081,11 +2081,12 @@ __metadata: "@babel/runtime": 7.17.8 "@flopflip/adapter-utilities": 1.0.24 "@flopflip/types": 4.1.20 + "@types/merge-deep": 3.0.0 debounce-fn: 4.0.0 - deepmerge: 4.2.2 globalthis: 1.0.2 launchdarkly-js-client-sdk: 2.20.2 lodash: 4.17.21 + merge-deep: 3.0.3 mitt: 3.0.0 tiny-warning: 1.0.3 languageName: unknown @@ -2175,11 +2176,12 @@ __metadata: "@babel/runtime": 7.17.8 "@flopflip/test-utils": "*" "@flopflip/types": 4.1.20 + "@types/merge-deep": 3.0.0 "@types/react": 17.0.41 "@types/react-dom": 17.0.14 "@types/react-is": 17.0.3 - deepmerge: 4.2.2 lodash: 4.17.21 + merge-deep: 3.0.3 react: 17.0.2 react-dom: 17.0.2 react-is: 17.0.2 @@ -2206,9 +2208,10 @@ __metadata: "@flopflip/adapter-utilities": 1.0.24 "@flopflip/types": 4.1.20 "@splitsoftware/splitio": 10.17.3 - deepmerge: 4.2.2 + "@types/merge-deep": 3.0.0 globalthis: 1.0.2 lodash: 4.17.21 + merge-deep: 3.0.3 languageName: unknown linkType: soft @@ -2220,11 +2223,11 @@ __metadata: "@flopflip/memory-adapter": 3.0.25 "@testing-library/jest-dom": 5.16.2 "@testing-library/react": 12.1.4 - jest-localstorage-mock: 2.4.19 jest-plugin-filename: 0.0.1 jest-runner-eslint: 1.0.0 jest-watch-yarn-workspaces: 1.1.0 react: 17.0.2 + react-dom: 17.0.2 languageName: unknown linkType: soft @@ -2232,6 +2235,7 @@ __metadata: version: 0.0.0-use.local resolution: "@flopflip/types@workspace:packages/types" dependencies: + launchdarkly-js-client-sdk: 2.20.2 typescript: 4.6.2 peerDependencies: typescript: 4.x @@ -3088,6 +3092,13 @@ __metadata: languageName: node linkType: hard +"@types/merge-deep@npm:3.0.0": + version: 3.0.0 + resolution: "@types/merge-deep@npm:3.0.0" + checksum: b1f8659a92be98b92375a91ba12a44f93250e1c4802f946f3ce1f85df711c18431a3836c211b0cf3873d6eea00f2ef29d0325079b8b01809a18246a37d025653 + languageName: node + linkType: hard + "@types/minimatch@npm:*": version: 3.0.5 resolution: "@types/minimatch@npm:3.0.5" @@ -4588,6 +4599,19 @@ __metadata: languageName: node linkType: hard +"clone-deep@npm:^0.2.4": + version: 0.2.4 + resolution: "clone-deep@npm:0.2.4" + dependencies: + for-own: ^0.1.3 + is-plain-object: ^2.0.1 + kind-of: ^3.0.2 + lazy-cache: ^1.0.3 + shallow-clone: ^0.1.2 + checksum: bcf9752052130c270c47d3e1c357497354b91d682f507e0079bec5950975b3293b619d9e100d70874606d716f2376e84956b045759a09af703e1038ecad6c438 + languageName: node + linkType: hard + "clone-response@npm:^1.0.2": version: 1.0.2 resolution: "clone-response@npm:1.0.2" @@ -5269,7 +5293,7 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:4.2.2, deepmerge@npm:^4.2.2": +"deepmerge@npm:^4.2.2": version: 4.2.2 resolution: "deepmerge@npm:4.2.2" checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b @@ -6396,6 +6420,7 @@ __metadata: eslint-plugin-testing-library: 5.1.0 husky: 7.0.4 jest: 27.5.1 + jest-localstorage-mock: 2.4.19 lint-staged: 12.3.7 pinst: 3.0.0 prettier: 2.6.0 @@ -6408,13 +6433,29 @@ __metadata: languageName: unknown linkType: soft -"for-in@npm:^1.0.2": +"for-in@npm:^0.1.3": + version: 0.1.8 + resolution: "for-in@npm:0.1.8" + checksum: f5bdad7811700ee6a0f96b33d72a1db966aea75a1f03c7245d147f8369305e709f53a55ee7ae8eaddcfa85c7c89bca78472be8f1bc605475ce5bb2c70f77f8da + languageName: node + linkType: hard + +"for-in@npm:^1.0.1, for-in@npm:^1.0.2": version: 1.0.2 resolution: "for-in@npm:1.0.2" checksum: 09f4ae93ce785d253ac963d94c7f3432d89398bf25ac7a24ed034ca393bf74380bdeccc40e0f2d721a895e54211b07c8fad7132e8157827f6f7f059b70b4043d languageName: node linkType: hard +"for-own@npm:^0.1.3": + version: 0.1.5 + resolution: "for-own@npm:0.1.5" + dependencies: + for-in: ^1.0.1 + checksum: 07eb0a2e98eb55ce13b56dd11ef4fb5e619ba7380aaec388b9eec1946153d74fa734ce409e8434020557e9489a50c34bc004d55754f5863bf7d77b441d8dee8c + languageName: node + linkType: hard + "forever-agent@npm:~0.6.1": version: 0.6.1 resolution: "forever-agent@npm:0.6.1" @@ -7311,7 +7352,7 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^1.1.5": +"is-buffer@npm:^1.0.2, is-buffer@npm:^1.1.5": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 @@ -7576,7 +7617,7 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": +"is-plain-object@npm:^2.0.1, is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" dependencies: @@ -8572,6 +8613,15 @@ __metadata: languageName: node linkType: hard +"kind-of@npm:^2.0.1": + version: 2.0.1 + resolution: "kind-of@npm:2.0.1" + dependencies: + is-buffer: ^1.0.2 + checksum: 043df2943e113bca612d26224947395e9673bb3808d94aed30e47fbf0bafd618e2a29ff0ca2d5498f64332c320fff07f0aa9d6edfc20906a93c1b8792f11759c + languageName: node + linkType: hard + "kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": version: 3.2.2 resolution: "kind-of@npm:3.2.2" @@ -8639,6 +8689,20 @@ __metadata: languageName: node linkType: hard +"lazy-cache@npm:^0.2.3": + version: 0.2.7 + resolution: "lazy-cache@npm:0.2.7" + checksum: b4538aff20db586c354f31de3ed59ea2c8d5dc4f01141bf49f07601e7ca0d7ed43a3f49362ade49b1e18ab1f3d121df0f2c9ea9b599b44dd54fb0c0db253c8b9 + languageName: node + linkType: hard + +"lazy-cache@npm:^1.0.3": + version: 1.0.4 + resolution: "lazy-cache@npm:1.0.4" + checksum: e6650c22e5de1cc3f4a0c25d2b35fe9cd400473c1b3562be9fceadf8f368d708b54d24f5aa51b321b090da65b36426823a8f706b8dbdd68270db0daba812c5d3 + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -9104,6 +9168,17 @@ __metadata: languageName: node linkType: hard +"merge-deep@npm:3.0.3": + version: 3.0.3 + resolution: "merge-deep@npm:3.0.3" + dependencies: + arr-union: ^3.1.0 + clone-deep: ^0.2.4 + kind-of: ^3.0.2 + checksum: d2eb367b8300327c66a3e1e01eb06251f51b440bf5bfa5f0f8065ae95bf3af620d21fcd0ab2eb50e74f5119aac40ffd26c85e3bf82f79082e8757675f5885d3d + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -9332,6 +9407,16 @@ __metadata: languageName: node linkType: hard +"mixin-object@npm:^2.0.1": + version: 2.0.1 + resolution: "mixin-object@npm:2.0.1" + dependencies: + for-in: ^0.1.3 + is-extendable: ^0.1.1 + checksum: 7d0eb7c2f06435fcc01d132824b4c973a0df689a117d8199d79911b506363b6f4f86a84458a63f3acfa7388f3052612cfe27105400b4932678452925a9739a4c + languageName: node + linkType: hard + "mixme@npm:^0.5.1": version: 0.5.4 resolution: "mixme@npm:0.5.4" @@ -10918,6 +11003,18 @@ __metadata: languageName: node linkType: hard +"shallow-clone@npm:^0.1.2": + version: 0.1.2 + resolution: "shallow-clone@npm:0.1.2" + dependencies: + is-extendable: ^0.1.1 + kind-of: ^2.0.1 + lazy-cache: ^0.2.3 + mixin-object: ^2.0.1 + checksum: cc4c85c6e42186fec33a81a85622c48dbcfdf280f3a7bd0800b4de57df8e365a8760aa2e31dd79df365b317dddb2fd0bbd92be0aab14dbd2de6a65992eab2177 + languageName: node + linkType: hard + "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0"