@ninetailed/experience.js-react 4.2.0-beta.1 → 4.2.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs CHANGED
@@ -7,20 +7,11 @@ var React = require('react');
7
7
  var experience_js = require('@ninetailed/experience.js');
8
8
  var reactIntersectionObserver = require('react-intersection-observer');
9
9
  var experience_jsShared = require('@ninetailed/experience.js-shared');
10
- var isEqual = require('lodash/isEqual');
11
- var has$1 = require('lodash/has');
12
- var _debounce = require('lodash/debounce');
13
- var values$1 = require('lodash/values');
14
- var get$1 = require('lodash/get');
10
+ var radash = require('radash');
15
11
 
16
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
17
13
 
18
14
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
19
- var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
20
- var has__default = /*#__PURE__*/_interopDefaultLegacy(has$1);
21
- var _debounce__default = /*#__PURE__*/_interopDefaultLegacy(_debounce);
22
- var values__default = /*#__PURE__*/_interopDefaultLegacy(values$1);
23
- var get__default = /*#__PURE__*/_interopDefaultLegacy(get$1);
24
15
 
25
16
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
26
17
 
@@ -1914,7 +1905,7 @@ const useProfile = () => {
1914
1905
  */
1915
1906
  React.useEffect(() => {
1916
1907
  ninetailed.onProfileChange(profileState => {
1917
- if (isEqual__default["default"](profileState, profileStateRef.current)) {
1908
+ if (radash.isEqual(profileState, profileStateRef.current)) {
1918
1909
  experience_jsShared.logger.debug('Profile State Did Not Change', profileState);
1919
1910
  return;
1920
1911
  } else {
@@ -1955,6 +1946,35 @@ const useExperiments = () => {
1955
1946
  };
1956
1947
  };
1957
1948
 
1949
+ const useExperienceSelectionMiddleware = ({
1950
+ experiences,
1951
+ baseline,
1952
+ profile
1953
+ }) => {
1954
+ const {
1955
+ plugins
1956
+ } = useNinetailed();
1957
+ const [_, setCurrentTime] = React.useState(Date.now());
1958
+ const {
1959
+ addListeners,
1960
+ removeListeners,
1961
+ middleware
1962
+ } = React.useMemo(() => experience_js.makeExperienceSelectMiddleware({
1963
+ plugins,
1964
+ experiences,
1965
+ baseline,
1966
+ profile,
1967
+ onChange: () => setCurrentTime(Date.now())
1968
+ }), [plugins, experiences, baseline, profile]);
1969
+ React.useEffect(() => {
1970
+ addListeners();
1971
+ return () => {
1972
+ removeListeners();
1973
+ };
1974
+ }, [addListeners, removeListeners]);
1975
+ return middleware;
1976
+ };
1977
+
1958
1978
  const useExperience = ({
1959
1979
  baseline,
1960
1980
  experiences
@@ -1968,6 +1988,31 @@ const useExperience = ({
1968
1988
  status,
1969
1989
  profile
1970
1990
  } = profileState;
1991
+ const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
1992
+ experiences,
1993
+ baseline,
1994
+ profile
1995
+ });
1996
+ const overrideResult = _a => {
1997
+ var {
1998
+ experience: originalExperience,
1999
+ variant: originalVariant
2000
+ } = _a,
2001
+ other = __rest(_a, ["experience", "variant"]);
2002
+ const {
2003
+ experience,
2004
+ variant
2005
+ } = experienceSelectionMiddleware({
2006
+ experience: originalExperience,
2007
+ variant: originalVariant
2008
+ });
2009
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2010
+ // @ts-ignore
2011
+ return Object.assign(Object.assign({}, other), {
2012
+ experience,
2013
+ variant
2014
+ });
2015
+ };
1971
2016
  const baseReturn = Object.assign(Object.assign({}, profileState), {
1972
2017
  hasVariants,
1973
2018
  baseline
@@ -1982,17 +2027,17 @@ const useExperience = ({
1982
2027
  if (status === 'loading') {
1983
2028
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1984
2029
  // @ts-ignore
1985
- return emptyReturn;
2030
+ return overrideResult(emptyReturn);
1986
2031
  }
1987
2032
  if (status === 'error') {
1988
2033
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1989
2034
  // @ts-ignore
1990
- return emptyReturn;
2035
+ return overrideResult(emptyReturn);
1991
2036
  }
1992
2037
  if (!profile) {
1993
2038
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1994
2039
  // @ts-ignore
1995
- return emptyReturn;
2040
+ return overrideResult(emptyReturn);
1996
2041
  }
1997
2042
  const activeExperiments = experience_js.selectActiveExperiments(experiments, profile);
1998
2043
  const experience = experience_js.selectExperience({
@@ -2003,9 +2048,9 @@ const useExperience = ({
2003
2048
  if (!experience) {
2004
2049
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2005
2050
  // @ts-ignore
2006
- return Object.assign(Object.assign({}, emptyReturn), {
2051
+ return overrideResult(Object.assign(Object.assign({}, emptyReturn), {
2007
2052
  profile
2008
- });
2053
+ }));
2009
2054
  }
2010
2055
  const audience = experience.audience;
2011
2056
  const variant = experience_js.selectExperienceVariant({
@@ -2014,7 +2059,7 @@ const useExperience = ({
2014
2059
  profile
2015
2060
  });
2016
2061
  if (!variant) {
2017
- return Object.assign(Object.assign({}, baseReturn), {
2062
+ return overrideResult(Object.assign(Object.assign({}, baseReturn), {
2018
2063
  status: 'success',
2019
2064
  loading: false,
2020
2065
  error: null,
@@ -2023,9 +2068,9 @@ const useExperience = ({
2023
2068
  audience: audience ? audience : null,
2024
2069
  profile,
2025
2070
  isPersonalized: false
2026
- });
2071
+ }));
2027
2072
  }
2028
- return Object.assign(Object.assign({}, baseReturn), {
2073
+ return overrideResult(Object.assign(Object.assign({}, baseReturn), {
2029
2074
  status: 'success',
2030
2075
  loading: false,
2031
2076
  error: null,
@@ -2034,7 +2079,7 @@ const useExperience = ({
2034
2079
  audience: audience ? audience : null,
2035
2080
  profile,
2036
2081
  isPersonalized: true
2037
- });
2082
+ }));
2038
2083
  };
2039
2084
 
2040
2085
  const useJoinExperiment = () => {
@@ -2042,35 +2087,6 @@ const useJoinExperiment = () => {
2042
2087
  return context.joinExperiment;
2043
2088
  };
2044
2089
 
2045
- const useExperienceSelectionMiddleware = ({
2046
- experiences,
2047
- baseline,
2048
- profile
2049
- }) => {
2050
- const {
2051
- plugins
2052
- } = useNinetailed();
2053
- const [_, setCurrentTime] = React.useState(Date.now());
2054
- const {
2055
- addListeners,
2056
- removeListeners,
2057
- middleware
2058
- } = React.useMemo(() => experience_js.makeExperienceSelectMiddleware({
2059
- plugins,
2060
- experiences,
2061
- baseline,
2062
- profile,
2063
- onChange: () => setCurrentTime(Date.now())
2064
- }), [plugins, experiences, baseline, profile]);
2065
- React.useEffect(() => {
2066
- addListeners();
2067
- return () => {
2068
- removeListeners();
2069
- };
2070
- }, [addListeners, removeListeners]);
2071
- return middleware;
2072
- };
2073
-
2074
2090
  const DefaultExperienceLoadingComponent = _a => {
2075
2091
  var {
2076
2092
  component: Component,
@@ -2128,8 +2144,8 @@ const Experience = _a => {
2128
2144
  const {
2129
2145
  status,
2130
2146
  hasVariants,
2131
- experience: originalExperience,
2132
- variant: originalVariant,
2147
+ experience,
2148
+ variant,
2133
2149
  audience,
2134
2150
  isPersonalized,
2135
2151
  profile
@@ -2137,18 +2153,6 @@ const Experience = _a => {
2137
2153
  baseline,
2138
2154
  experiences
2139
2155
  });
2140
- const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
2141
- experiences,
2142
- baseline,
2143
- profile
2144
- });
2145
- const {
2146
- experience,
2147
- variant
2148
- } = experienceSelectionMiddleware({
2149
- experience: originalExperience,
2150
- variant: originalVariant
2151
- });
2152
2156
  const joinExperiment = useJoinExperiment();
2153
2157
  React.useEffect(() => {
2154
2158
  if (status === 'success' && experience && profile) {
@@ -2250,7 +2254,7 @@ const ESRLoadingComponent = _a => {
2250
2254
  const {
2251
2255
  experienceVariantsMap
2252
2256
  } = useESR();
2253
- const experience = experiences.find(experience => has__default["default"](experienceVariantsMap, experience.id));
2257
+ const experience = experiences.find(experience => Object.prototype.hasOwnProperty.call(experienceVariantsMap, experience.id));
2254
2258
  if (!experience) {
2255
2259
  return jsxRuntime.jsx(Component, Object.assign({}, passthroughProps, baseline, {
2256
2260
  ninetailed: {
@@ -2305,14 +2309,16 @@ const ESRLoadingComponent = _a => {
2305
2309
 
2306
2310
  const EXPERIENCE_TRAIT_PREFIX = 'nt_experiment_';
2307
2311
 
2308
- const debounce = (fn, wait, options) => {
2312
+ const debounce = (fn, wait) => {
2309
2313
  let debouncedArgs = [];
2310
- const debouncedFn = _debounce__default["default"](() => {
2314
+ const debouncedFn = radash.debounce({
2315
+ delay: wait !== null && wait !== void 0 ? wait : 0
2316
+ }, () => {
2311
2317
  fn.call(undefined, debouncedArgs);
2312
2318
  debouncedArgs = [];
2313
- }, wait, options);
2319
+ });
2314
2320
  return (...args) => {
2315
- debouncedArgs.push(values__default["default"](args));
2321
+ debouncedArgs.push(args);
2316
2322
  debouncedFn();
2317
2323
  };
2318
2324
  };
@@ -2374,39 +2380,47 @@ const ExperimentsProvider = ({
2374
2380
  }));
2375
2381
  };
2376
2382
 
2377
- const NinetailedProvider = ({
2378
- children,
2379
- clientId,
2380
- experiments: _experiments = [],
2381
- maximumActiveExperiments,
2382
- environment,
2383
- preview,
2384
- url,
2385
- profile,
2386
- locale,
2387
- requestTimeout,
2388
- plugins: _plugins = [],
2389
- onLog,
2390
- onError
2391
- }) => {
2392
- const ninetailed = React.useMemo(() => new experience_js.Ninetailed({
2393
- clientId,
2394
- environment,
2395
- preview
2396
- }, {
2397
- url,
2398
- plugins: _plugins,
2399
- profile,
2400
- locale,
2401
- requestTimeout,
2402
- onLog,
2403
- onError
2404
- }), []);
2383
+ const NinetailedProvider = props => {
2384
+ const ninetailed = React.useMemo(() => {
2385
+ if ('ninetailed' in props) {
2386
+ return props.ninetailed;
2387
+ }
2388
+ const {
2389
+ clientId,
2390
+ environment,
2391
+ preview,
2392
+ url,
2393
+ profile,
2394
+ locale,
2395
+ requestTimeout,
2396
+ plugins = [],
2397
+ onLog,
2398
+ onError
2399
+ } = props;
2400
+ return new experience_js.Ninetailed({
2401
+ clientId,
2402
+ environment,
2403
+ preview
2404
+ }, {
2405
+ url,
2406
+ plugins,
2407
+ profile,
2408
+ locale,
2409
+ requestTimeout,
2410
+ onLog,
2411
+ onError
2412
+ });
2413
+ }, []);
2414
+ const {
2415
+ experiments = [],
2416
+ maximumActiveExperiments,
2417
+ children
2418
+ } = props;
2405
2419
  return jsxRuntime.jsx(NinetailedContext.Provider, Object.assign({
2406
2420
  value: ninetailed
2407
2421
  }, {
2408
2422
  children: jsxRuntime.jsx(ExperimentsProvider, Object.assign({
2409
- experiments: _experiments,
2423
+ experiments: experiments,
2410
2424
  maximumActiveExperiments: maximumActiveExperiments
2411
2425
  }, {
2412
2426
  children: children
@@ -2516,11 +2530,11 @@ const generateSelectors = id => {
2516
2530
  };
2517
2531
  const selectValueFromProfile = (profile, id) => {
2518
2532
  const selectors = generateSelectors(id);
2519
- const matchingSelector = selectors.find(selector => get__default["default"](profile, selector));
2533
+ const matchingSelector = selectors.find(selector => radash.get(profile, selector));
2520
2534
  if (!matchingSelector) {
2521
2535
  return null;
2522
2536
  }
2523
- return get__default["default"](profile, matchingSelector);
2537
+ return radash.get(profile, matchingSelector);
2524
2538
  };
2525
2539
  const MergeTag = ({
2526
2540
  id
package/index.js CHANGED
@@ -1,13 +1,9 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import React, { createContext, useContext, useEffect, useState, useRef, useMemo, createElement as createElement$1, useCallback } from 'react';
3
- import { selectDistribution, selectHasExperienceVariants, selectActiveExperiments, selectExperience, selectExperienceVariant, makeExperienceSelectMiddleware, Ninetailed, selectVariant } from '@ninetailed/experience.js';
3
+ import { selectDistribution, makeExperienceSelectMiddleware, selectHasExperienceVariants, selectActiveExperiments, selectExperience, selectExperienceVariant, Ninetailed, selectVariant } from '@ninetailed/experience.js';
4
4
  import { useInView } from 'react-intersection-observer';
5
5
  import { isBrowser, logger } from '@ninetailed/experience.js-shared';
6
- import isEqual from 'lodash/isEqual';
7
- import has$1 from 'lodash/has';
8
- import _debounce from 'lodash/debounce';
9
- import values$1 from 'lodash/values';
10
- import get$1 from 'lodash/get';
6
+ import { isEqual, debounce as debounce$1, get as get$1 } from 'radash';
11
7
 
12
8
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
13
9
 
@@ -1942,6 +1938,35 @@ const useExperiments = () => {
1942
1938
  };
1943
1939
  };
1944
1940
 
1941
+ const useExperienceSelectionMiddleware = ({
1942
+ experiences,
1943
+ baseline,
1944
+ profile
1945
+ }) => {
1946
+ const {
1947
+ plugins
1948
+ } = useNinetailed();
1949
+ const [_, setCurrentTime] = useState(Date.now());
1950
+ const {
1951
+ addListeners,
1952
+ removeListeners,
1953
+ middleware
1954
+ } = useMemo(() => makeExperienceSelectMiddleware({
1955
+ plugins,
1956
+ experiences,
1957
+ baseline,
1958
+ profile,
1959
+ onChange: () => setCurrentTime(Date.now())
1960
+ }), [plugins, experiences, baseline, profile]);
1961
+ useEffect(() => {
1962
+ addListeners();
1963
+ return () => {
1964
+ removeListeners();
1965
+ };
1966
+ }, [addListeners, removeListeners]);
1967
+ return middleware;
1968
+ };
1969
+
1945
1970
  const useExperience = ({
1946
1971
  baseline,
1947
1972
  experiences
@@ -1955,6 +1980,31 @@ const useExperience = ({
1955
1980
  status,
1956
1981
  profile
1957
1982
  } = profileState;
1983
+ const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
1984
+ experiences,
1985
+ baseline,
1986
+ profile
1987
+ });
1988
+ const overrideResult = _a => {
1989
+ var {
1990
+ experience: originalExperience,
1991
+ variant: originalVariant
1992
+ } = _a,
1993
+ other = __rest(_a, ["experience", "variant"]);
1994
+ const {
1995
+ experience,
1996
+ variant
1997
+ } = experienceSelectionMiddleware({
1998
+ experience: originalExperience,
1999
+ variant: originalVariant
2000
+ });
2001
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2002
+ // @ts-ignore
2003
+ return Object.assign(Object.assign({}, other), {
2004
+ experience,
2005
+ variant
2006
+ });
2007
+ };
1958
2008
  const baseReturn = Object.assign(Object.assign({}, profileState), {
1959
2009
  hasVariants,
1960
2010
  baseline
@@ -1969,17 +2019,17 @@ const useExperience = ({
1969
2019
  if (status === 'loading') {
1970
2020
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1971
2021
  // @ts-ignore
1972
- return emptyReturn;
2022
+ return overrideResult(emptyReturn);
1973
2023
  }
1974
2024
  if (status === 'error') {
1975
2025
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1976
2026
  // @ts-ignore
1977
- return emptyReturn;
2027
+ return overrideResult(emptyReturn);
1978
2028
  }
1979
2029
  if (!profile) {
1980
2030
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1981
2031
  // @ts-ignore
1982
- return emptyReturn;
2032
+ return overrideResult(emptyReturn);
1983
2033
  }
1984
2034
  const activeExperiments = selectActiveExperiments(experiments, profile);
1985
2035
  const experience = selectExperience({
@@ -1990,9 +2040,9 @@ const useExperience = ({
1990
2040
  if (!experience) {
1991
2041
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1992
2042
  // @ts-ignore
1993
- return Object.assign(Object.assign({}, emptyReturn), {
2043
+ return overrideResult(Object.assign(Object.assign({}, emptyReturn), {
1994
2044
  profile
1995
- });
2045
+ }));
1996
2046
  }
1997
2047
  const audience = experience.audience;
1998
2048
  const variant = selectExperienceVariant({
@@ -2001,7 +2051,7 @@ const useExperience = ({
2001
2051
  profile
2002
2052
  });
2003
2053
  if (!variant) {
2004
- return Object.assign(Object.assign({}, baseReturn), {
2054
+ return overrideResult(Object.assign(Object.assign({}, baseReturn), {
2005
2055
  status: 'success',
2006
2056
  loading: false,
2007
2057
  error: null,
@@ -2010,9 +2060,9 @@ const useExperience = ({
2010
2060
  audience: audience ? audience : null,
2011
2061
  profile,
2012
2062
  isPersonalized: false
2013
- });
2063
+ }));
2014
2064
  }
2015
- return Object.assign(Object.assign({}, baseReturn), {
2065
+ return overrideResult(Object.assign(Object.assign({}, baseReturn), {
2016
2066
  status: 'success',
2017
2067
  loading: false,
2018
2068
  error: null,
@@ -2021,7 +2071,7 @@ const useExperience = ({
2021
2071
  audience: audience ? audience : null,
2022
2072
  profile,
2023
2073
  isPersonalized: true
2024
- });
2074
+ }));
2025
2075
  };
2026
2076
 
2027
2077
  const useJoinExperiment = () => {
@@ -2029,35 +2079,6 @@ const useJoinExperiment = () => {
2029
2079
  return context.joinExperiment;
2030
2080
  };
2031
2081
 
2032
- const useExperienceSelectionMiddleware = ({
2033
- experiences,
2034
- baseline,
2035
- profile
2036
- }) => {
2037
- const {
2038
- plugins
2039
- } = useNinetailed();
2040
- const [_, setCurrentTime] = useState(Date.now());
2041
- const {
2042
- addListeners,
2043
- removeListeners,
2044
- middleware
2045
- } = useMemo(() => makeExperienceSelectMiddleware({
2046
- plugins,
2047
- experiences,
2048
- baseline,
2049
- profile,
2050
- onChange: () => setCurrentTime(Date.now())
2051
- }), [plugins, experiences, baseline, profile]);
2052
- useEffect(() => {
2053
- addListeners();
2054
- return () => {
2055
- removeListeners();
2056
- };
2057
- }, [addListeners, removeListeners]);
2058
- return middleware;
2059
- };
2060
-
2061
2082
  const DefaultExperienceLoadingComponent = _a => {
2062
2083
  var {
2063
2084
  component: Component,
@@ -2115,8 +2136,8 @@ const Experience = _a => {
2115
2136
  const {
2116
2137
  status,
2117
2138
  hasVariants,
2118
- experience: originalExperience,
2119
- variant: originalVariant,
2139
+ experience,
2140
+ variant,
2120
2141
  audience,
2121
2142
  isPersonalized,
2122
2143
  profile
@@ -2124,18 +2145,6 @@ const Experience = _a => {
2124
2145
  baseline,
2125
2146
  experiences
2126
2147
  });
2127
- const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
2128
- experiences,
2129
- baseline,
2130
- profile
2131
- });
2132
- const {
2133
- experience,
2134
- variant
2135
- } = experienceSelectionMiddleware({
2136
- experience: originalExperience,
2137
- variant: originalVariant
2138
- });
2139
2148
  const joinExperiment = useJoinExperiment();
2140
2149
  useEffect(() => {
2141
2150
  if (status === 'success' && experience && profile) {
@@ -2237,7 +2246,7 @@ const ESRLoadingComponent = _a => {
2237
2246
  const {
2238
2247
  experienceVariantsMap
2239
2248
  } = useESR();
2240
- const experience = experiences.find(experience => has$1(experienceVariantsMap, experience.id));
2249
+ const experience = experiences.find(experience => Object.prototype.hasOwnProperty.call(experienceVariantsMap, experience.id));
2241
2250
  if (!experience) {
2242
2251
  return jsx(Component, Object.assign({}, passthroughProps, baseline, {
2243
2252
  ninetailed: {
@@ -2292,14 +2301,16 @@ const ESRLoadingComponent = _a => {
2292
2301
 
2293
2302
  const EXPERIENCE_TRAIT_PREFIX = 'nt_experiment_';
2294
2303
 
2295
- const debounce = (fn, wait, options) => {
2304
+ const debounce = (fn, wait) => {
2296
2305
  let debouncedArgs = [];
2297
- const debouncedFn = _debounce(() => {
2306
+ const debouncedFn = debounce$1({
2307
+ delay: wait !== null && wait !== void 0 ? wait : 0
2308
+ }, () => {
2298
2309
  fn.call(undefined, debouncedArgs);
2299
2310
  debouncedArgs = [];
2300
- }, wait, options);
2311
+ });
2301
2312
  return (...args) => {
2302
- debouncedArgs.push(values$1(args));
2313
+ debouncedArgs.push(args);
2303
2314
  debouncedFn();
2304
2315
  };
2305
2316
  };
@@ -2361,39 +2372,47 @@ const ExperimentsProvider = ({
2361
2372
  }));
2362
2373
  };
2363
2374
 
2364
- const NinetailedProvider = ({
2365
- children,
2366
- clientId,
2367
- experiments: _experiments = [],
2368
- maximumActiveExperiments,
2369
- environment,
2370
- preview,
2371
- url,
2372
- profile,
2373
- locale,
2374
- requestTimeout,
2375
- plugins: _plugins = [],
2376
- onLog,
2377
- onError
2378
- }) => {
2379
- const ninetailed = useMemo(() => new Ninetailed({
2380
- clientId,
2381
- environment,
2382
- preview
2383
- }, {
2384
- url,
2385
- plugins: _plugins,
2386
- profile,
2387
- locale,
2388
- requestTimeout,
2389
- onLog,
2390
- onError
2391
- }), []);
2375
+ const NinetailedProvider = props => {
2376
+ const ninetailed = useMemo(() => {
2377
+ if ('ninetailed' in props) {
2378
+ return props.ninetailed;
2379
+ }
2380
+ const {
2381
+ clientId,
2382
+ environment,
2383
+ preview,
2384
+ url,
2385
+ profile,
2386
+ locale,
2387
+ requestTimeout,
2388
+ plugins = [],
2389
+ onLog,
2390
+ onError
2391
+ } = props;
2392
+ return new Ninetailed({
2393
+ clientId,
2394
+ environment,
2395
+ preview
2396
+ }, {
2397
+ url,
2398
+ plugins,
2399
+ profile,
2400
+ locale,
2401
+ requestTimeout,
2402
+ onLog,
2403
+ onError
2404
+ });
2405
+ }, []);
2406
+ const {
2407
+ experiments = [],
2408
+ maximumActiveExperiments,
2409
+ children
2410
+ } = props;
2392
2411
  return jsx(NinetailedContext.Provider, Object.assign({
2393
2412
  value: ninetailed
2394
2413
  }, {
2395
2414
  children: jsx(ExperimentsProvider, Object.assign({
2396
- experiments: _experiments,
2415
+ experiments: experiments,
2397
2416
  maximumActiveExperiments: maximumActiveExperiments
2398
2417
  }, {
2399
2418
  children: children
package/lib/MergeTag.d.ts CHANGED
@@ -4,6 +4,6 @@ type MergeTagProps = {
4
4
  id: string;
5
5
  };
6
6
  export declare const generateSelectors: (id: string) => string[];
7
- export declare const selectValueFromProfile: (profile: Profile, id: string) => any;
7
+ export declare const selectValueFromProfile: (profile: Profile, id: string) => unknown;
8
8
  export declare const MergeTag: React.FC<React.PropsWithChildren<MergeTagProps>>;
9
9
  export {};
@@ -1,11 +1,13 @@
1
1
  import React from 'react';
2
- import { NinetailedPlugin, ExperienceConfiguration } from '@ninetailed/experience.js';
2
+ import { Ninetailed, NinetailedPlugin, ExperienceConfiguration } from '@ninetailed/experience.js';
3
3
  import { Profile, Locale, OnErrorHandler, OnLogHandler } from '@ninetailed/experience.js-shared';
4
- export type NinetailedProviderProps = {
5
- clientId: string;
6
- environment?: string;
4
+ type ExperimentProviderProps = {
7
5
  experiments?: ExperienceConfiguration<any>[];
8
6
  maximumActiveExperiments?: number;
7
+ };
8
+ export type NinetailedProviderInstantiationProps = {
9
+ clientId: string;
10
+ environment?: string;
9
11
  preview?: boolean;
10
12
  url?: string;
11
13
  plugins?: (NinetailedPlugin | NinetailedPlugin[])[];
@@ -14,5 +16,9 @@ export type NinetailedProviderProps = {
14
16
  requestTimeout?: number;
15
17
  onLog?: OnLogHandler;
16
18
  onError?: OnErrorHandler;
17
- };
18
- export declare const NinetailedProvider: ({ children, clientId, experiments, maximumActiveExperiments, environment, preview, url, profile, locale, requestTimeout, plugins, onLog, onError, }: React.PropsWithChildren<NinetailedProviderProps>) => JSX.Element;
19
+ } & ExperimentProviderProps;
20
+ export type NinetailedProviderProps = NinetailedProviderInstantiationProps | ({
21
+ ninetailed: Ninetailed;
22
+ } & ExperimentProviderProps);
23
+ export declare const NinetailedProvider: (props: React.PropsWithChildren<NinetailedProviderProps>) => JSX.Element;
24
+ export {};
package/lib/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export type { Profile, Variant } from '@ninetailed/experience.js-shared';
2
2
  export type { ExperienceConfiguration, ExperienceType, EXPERIENCE_TRAIT_PREFIX, } from '@ninetailed/experience.js';
3
3
  export { NinetailedProvider } from './NinetailedProvider';
4
- export type { NinetailedProviderProps } from './NinetailedProvider';
4
+ export type { NinetailedProviderProps, NinetailedProviderInstantiationProps, } from './NinetailedProvider';
5
5
  export { useNinetailed } from './useNinetailed';
6
6
  export { useProfile } from './useProfile';
7
7
  export { usePersonalize } from './usePersonalize';
@@ -41,12 +41,7 @@ export declare const useProfile: () => {
41
41
  averageSessionLength: number;
42
42
  };
43
43
  };
44
- error: null; /**
45
- * This effect compares the old and new profile state before updating it.
46
- * We use a ref to avoid an infinite loop which can happen when an empty profile state was updated with no changes.
47
- * This behaviour occurred as the validation handling on the error property was not set properly in the "CreateProfile" and "UpdateProfile" endpoint types.
48
- * Furthermore, it was also observed, that it "only" occurred when the preview plugin was used in parallel.
49
- */
44
+ error: null;
50
45
  } | {
51
46
  loading: boolean;
52
47
  from: "api" | "hydrated";
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@ninetailed/experience.js-react",
3
- "version": "4.2.0-beta.1",
3
+ "version": "4.2.0-beta.10",
4
4
  "peerDependencies": {
5
5
  "react": ">=16.8.0"
6
6
  },
7
7
  "dependencies": {
8
8
  "@analytics/google-analytics": "0.5.3",
9
9
  "react-visibility-sensor": "5.1.1",
10
- "lodash": "4.17.21",
11
- "@ninetailed/experience.js": "4.2.0-beta.1",
10
+ "@ninetailed/experience.js": "4.2.0-beta.10",
12
11
  "react-intersection-observer": "8.34.0",
13
- "@ninetailed/experience.js-shared": "4.2.0-beta.1",
12
+ "@ninetailed/experience.js-shared": "4.2.0-beta.10",
13
+ "radash": "10.9.0",
14
14
  "analytics": "0.8.1"
15
15
  },
16
16
  "module": "./index.js",