launchdarkly-react-client-sdk
Advanced tools
Comparing version 3.5.0 to 3.6.0
@@ -1,2 +0,2 @@ | ||
"use strict";var e=require("react"),t=require("launchdarkly-js-client-sdk"),r=require("lodash.camelcase"),n=require("hoist-non-react-statics");function o(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e);const i={useCamelCaseFlagKeys:!0,sendEventsOnFlagRead:!0},a=e.createContext({flags:{},flagKeyMap:{},ldClient:void 0}),{Provider:l,Consumer:c}=a,u=e=>{var t;return null!=(t=e.context)?t:e.user},p=e=>{const t={};for(const n in e)0!==n.indexOf("$")&&(t[r(n)]=e[n]);return t},f=(e,t)=>{const r={};for(const n in e)t&&void 0===t[n]||(r[n]=e[n].current);return r},d=(e,t)=>{const r=e.allFlags();return t?Object.keys(t).reduce(((e,n)=>(e[n]=Object.prototype.hasOwnProperty.call(r,n)?r[n]:t[n],e)),{}):r};function y(e,t,n=i,o){const s=function(e,t){if(void 0===t)return e;return Object.keys(t).reduce(((t,r)=>(h(e,r)&&(t[r]=e[r]),t)),{})}(t,o),{useCamelCaseFlagKeys:a=!0}=n,[l,c={}]=a?function(e){const t={},n={};for(const o in e){if(0===o.indexOf("$"))continue;const s=r(o);t[s]=e[o],n[s]=o}return[t,n]}(s):[s];return{flags:n.sendEventsOnFlagRead?O(e,l,c,a):l,flagKeyMap:c}}function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function O(e,t,r,n){return new Proxy(t,{get(t,o,s){const i=Reflect.get(t,o,s),a=n&&h(r,o)||h(t,o);if("symbol"==typeof o||!a)return i;if(void 0===i)return;const l=n?r[o]:o;return e.variation(l,i)}})}p.camelCaseKeys=p;const b={wrapperName:"react-client-sdk",wrapperVersion:"3.5.0",sendEventsOnlyForVariation:!0};var g=Object.defineProperty,v=Object.defineProperties,m=Object.getOwnPropertyDescriptors,x=Object.getOwnPropertySymbols,j=Object.prototype.hasOwnProperty,C=Object.prototype.propertyIsEnumerable,P=(e,t,r)=>t in e?g(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,w=(e,t)=>{for(var r in t||(t={}))j.call(t,r)&&P(e,r,t[r]);if(x)for(var r of x(t))C.call(t,r)&&P(e,r,t[r]);return e},F=(e,t)=>v(e,m(t)),E=(e,t,r)=>new Promise(((n,o)=>{var s=e=>{try{a(r.next(e))}catch(e){o(e)}},i=e=>{try{a(r.throw(e))}catch(e){o(e)}},a=e=>e.done?n(e.value):Promise.resolve(e.value).then(s,i);a((r=r.apply(e,t)).next())}));class D extends e.Component{constructor(e){super(e),this.getReactOptions=()=>w(w({},i),this.props.reactOptions),this.subscribeToChanges=e=>{const{flags:t}=this.props;e.on("change",(r=>{const n=this.getReactOptions(),o=f(r,t),s=w(w({},this.state.unproxiedFlags),o);Object.keys(o).length>0&&this.setState((r=>w(F(w({},r),{unproxiedFlags:s}),y(e,s,n,t))))}))},this.onFailed=(e,t)=>{this.setState((e=>F(w({},e),{error:t})))},this.onReady=(e,t,r)=>{const n=d(e,r);this.setState((o=>w(F(w({},o),{unproxiedFlags:n}),y(e,n,t,r))))},this.prepareLDClient=()=>E(this,null,(function*(){var e;const{clientSideID:r,flags:n,options:o}=this.props;let s=yield this.props.ldClient;const i=this.getReactOptions();let a,l=this.state.unproxiedFlags;if(s)l=d(s,n);else{const c=null!=(e=u(this.props))?e:{anonymous:!0,kind:"user"};s=t.initialize(r,c,w(w({},b),o));try{yield s.waitForInitialization(this.props.timeout),l=d(s,n)}catch(e){a=e,(null==a?void 0:a.name.toLowerCase().includes("timeout"))&&(s.on("failed",this.onFailed),s.on("ready",(()=>{this.onReady(s,i,n)})))}}this.setState((e=>F(w(F(w({},e),{unproxiedFlags:l}),y(s,l,i,n)),{ldClient:s,error:a}))),this.subscribeToChanges(s)}));const{options:r}=e;if(this.state={flags:{},unproxiedFlags:{},flagKeyMap:{}},r){const{bootstrap:e}=r;if(e&&"localStorage"!==e){const{useCamelCaseFlagKeys:t}=this.getReactOptions();this.state={flags:t?p(e):e,unproxiedFlags:e,flagKeyMap:{}}}}}componentDidMount(){return E(this,null,(function*(){const{deferInitialization:e}=this.props;e&&!u(this.props)||(yield this.prepareLDClient())}))}componentDidUpdate(e){return E(this,null,(function*(){const{deferInitialization:t}=this.props,r=!u(e)&&u(this.props);t&&r&&(yield this.prepareLDClient())}))}render(){const{flags:t,flagKeyMap:r,ldClient:n,error:o}=this.state;return e.createElement(l,{value:{flags:t,flagKeyMap:r,ldClient:n,error:o}},this.props.children)}}var S=Object.defineProperty,k=Object.defineProperties,K=Object.getOwnPropertyDescriptors,L=Object.getOwnPropertySymbols,I=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable,z=(e,t,r)=>t in e?S(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,M=(e,t)=>{for(var r in t||(t={}))I.call(t,r)&&z(e,r,t[r]);if(L)for(var r of L(t))R.call(t,r)&&z(e,r,t[r]);return e};var q=Object.defineProperty,T=Object.defineProperties,V=Object.getOwnPropertyDescriptors,$=Object.getOwnPropertySymbols,N=Object.prototype.hasOwnProperty,U=Object.prototype.propertyIsEnumerable,W=(e,t,r)=>t in e?q(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,A=(e,t)=>{for(var r in t||(t={}))N.call(t,r)&&W(e,r,t[r]);if($)for(var r of $(t))U.call(t,r)&&W(e,r,t[r]);return e},B=(e,t)=>T(e,V(t));var G=Object.defineProperty,H=Object.getOwnPropertySymbols,J=Object.prototype.hasOwnProperty,Q=Object.prototype.propertyIsEnumerable,X=(e,t,r)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Y=(e,t)=>{for(var r in t||(t={}))J.call(t,r)&&X(e,r,t[r]);if(H)for(var r of H(t))Q.call(t,r)&&X(e,r,t[r]);return e};exports.LDProvider=D,exports.asyncWithLDProvider=function(r){return n=this,o=null,s=function*(){var n,o;const{clientSideID:s,flags:a,options:c,reactOptions:p}=r,h=A(A({},i),p),O=null!=(n=u(r))?n:{anonymous:!0,kind:"user"};let g,v={};const m=null!=(o=yield r.ldClient)?o:t.initialize(s,O,A(A({},b),c));try{yield m.waitForInitialization(r.timeout),v=d(m,a)}catch(e){g=e}const x=(null==c?void 0:c.bootstrap)&&"localStorage"!==c.bootstrap?c.bootstrap:v;return({children:t})=>{const[r,n]=e.useState((()=>B(A({unproxiedFlags:x},y(m,x,h,a)),{ldClient:m,error:g})));e.useEffect((()=>{function e(e){const t=f(e,a);Object.keys(t).length>0&&n((e=>{const r=A(A({},e.unproxiedFlags),t);return A(B(A({},e),{unproxiedFlags:r}),y(m,r,h,a))}))}function t(){const e=d(m,a);n((t=>A(B(A({},t),{unproxiedFlags:e}),y(m,e,h,a))))}function r(e){n((t=>B(A({},t),{error:e})))}return m.on("change",e),(null==g?void 0:g.name.toLowerCase().includes("timeout"))&&(m.on("failed",r),m.on("ready",t)),function(){m.off("change",e),m.off("failed",r),m.off("ready",t)}}),[]);const o=((e,t)=>{var r={};for(var n in e)N.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&$)for(var n of $(e))t.indexOf(n)<0&&U.call(e,n)&&(r[n]=e[n]);return r})(r,["unproxiedFlags"]);return e.createElement(l,{value:o},t)}},new Promise(((e,t)=>{var r=e=>{try{a(s.next(e))}catch(e){t(e)}},i=e=>{try{a(s.throw(e))}catch(e){t(e)}},a=t=>t.done?e(t.value):Promise.resolve(t.value).then(r,i);a((s=s.apply(n,o)).next())}));var n,o,s},exports.camelCaseKeys=p,exports.defaultReactOptions=i,exports.useFlags=()=>{const{flags:t}=e.useContext(a);return t},exports.useLDClient=()=>{const{ldClient:t}=e.useContext(a);return t},exports.useLDClientError=function(){const{error:t}=e.useContext(a);return t},exports.withLDConsumer=function(e={clientOnly:!1}){return function(t){return r=>s.createElement(c,null,(({flags:n,ldClient:o})=>e.clientOnly?s.createElement(t,Y({ldClient:o},r)):s.createElement(t,Y({flags:n,ldClient:o},r))))}},exports.withLDProvider=function(e){return function(t){const{reactOptions:r}=e,o=M(M({},i),r),a=(l=M({},e),k(l,K({reactOptions:o})));var l;function c(e){return s.createElement(D,M({},a),s.createElement(t,M({},e)))}return n(c,t),c}},Object.keys(t).forEach((function(e){"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:function(){return t[e]}})})); | ||
"use strict";var e=require("react"),t=require("launchdarkly-js-client-sdk"),r=require("lodash.camelcase"),n=require("hoist-non-react-statics");function o(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e);const i=()=>e.createContext({flags:{},flagKeyMap:{},ldClient:void 0}),a={useCamelCaseFlagKeys:!0,sendEventsOnFlagRead:!0,reactContext:i()},l=e=>{var t;return null!=(t=e.context)?t:e.user},c=e=>{const t={};for(const n in e)0!==n.indexOf("$")&&(t[r(n)]=e[n]);return t},u=(e,t)=>{const r={};for(const n in e)t&&void 0===t[n]||(r[n]=e[n].current);return r},p=(e,t)=>{const r=e.allFlags();return t?Object.keys(t).reduce(((e,n)=>(e[n]=Object.prototype.hasOwnProperty.call(r,n)?r[n]:t[n],e)),{}):r};function f(e,t,n=a,o){const s=function(e,t){if(void 0===t)return e;return Object.keys(t).reduce(((t,r)=>(d(e,r)&&(t[r]=e[r]),t)),{})}(t,o),{useCamelCaseFlagKeys:i=!0}=n,[l,c={}]=i?function(e){const t={},n={};for(const o in e){if(0===o.indexOf("$"))continue;const s=r(o);t[s]=e[o],n[s]=o}return[t,n]}(s):[s];return{flags:n.sendEventsOnFlagRead?y(e,l,c,i):l,flagKeyMap:c}}function d(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function y(e,t,r,n){return new Proxy(t,{get(t,o,s){const i=Reflect.get(t,o,s),a=n&&d(r,o)||d(t,o);if("symbol"==typeof o||!a)return i;if(void 0===i)return;const l=n?r[o]:o;return e.variation(l,i)}})}c.camelCaseKeys=c;const h={wrapperName:"react-client-sdk",wrapperVersion:"3.6.0",sendEventsOnlyForVariation:!0};var O=Object.defineProperty,g=Object.defineProperties,b=Object.getOwnPropertyDescriptors,v=Object.getOwnPropertySymbols,x=Object.prototype.hasOwnProperty,m=Object.prototype.propertyIsEnumerable,C=(e,t,r)=>t in e?O(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,j=(e,t)=>{for(var r in t||(t={}))x.call(t,r)&&C(e,r,t[r]);if(v)for(var r of v(t))m.call(t,r)&&C(e,r,t[r]);return e},P=(e,t)=>g(e,b(t)),w=(e,t,r)=>new Promise(((n,o)=>{var s=e=>{try{a(r.next(e))}catch(e){o(e)}},i=e=>{try{a(r.throw(e))}catch(e){o(e)}},a=e=>e.done?n(e.value):Promise.resolve(e.value).then(s,i);a((r=r.apply(e,t)).next())}));class F extends e.Component{constructor(e){super(e),this.getReactOptions=()=>j(j({},a),this.props.reactOptions),this.subscribeToChanges=e=>{const{flags:t}=this.props;e.on("change",(r=>{const n=this.getReactOptions(),o=u(r,t),s=j(j({},this.state.unproxiedFlags),o);Object.keys(o).length>0&&this.setState((r=>j(P(j({},r),{unproxiedFlags:s}),f(e,s,n,t))))}))},this.onFailed=(e,t)=>{this.setState((e=>P(j({},e),{error:t})))},this.onReady=(e,t,r)=>{const n=p(e,r);this.setState((o=>j(P(j({},o),{unproxiedFlags:n}),f(e,n,t,r))))},this.prepareLDClient=()=>w(this,null,(function*(){var e;const{clientSideID:r,flags:n,options:o}=this.props;let s=yield this.props.ldClient;const i=this.getReactOptions();let a,c=this.state.unproxiedFlags;if(s)c=p(s,n);else{const u=null!=(e=l(this.props))?e:{anonymous:!0,kind:"user"};s=t.initialize(r,u,j(j({},h),o));try{yield s.waitForInitialization(this.props.timeout),c=p(s,n)}catch(e){a=e,(null==a?void 0:a.name.toLowerCase().includes("timeout"))&&(s.on("failed",this.onFailed),s.on("ready",(()=>{this.onReady(s,i,n)})))}}this.setState((e=>P(j(P(j({},e),{unproxiedFlags:c}),f(s,c,i,n)),{ldClient:s,error:a}))),this.subscribeToChanges(s)}));const{options:r}=e;if(this.state={flags:{},unproxiedFlags:{},flagKeyMap:{}},r){const{bootstrap:e}=r;if(e&&"localStorage"!==e){const{useCamelCaseFlagKeys:t}=this.getReactOptions();this.state={flags:t?c(e):e,unproxiedFlags:e,flagKeyMap:{}}}}}componentDidMount(){return w(this,null,(function*(){const{deferInitialization:e}=this.props;e&&!l(this.props)||(yield this.prepareLDClient())}))}componentDidUpdate(e){return w(this,null,(function*(){const{deferInitialization:t}=this.props,r=!l(e)&&l(this.props);t&&r&&(yield this.prepareLDClient())}))}render(){const{flags:t,flagKeyMap:r,ldClient:n,error:o}=this.state,{reactContext:s}=this.getReactOptions();return e.createElement(s.Provider,{value:{flags:t,flagKeyMap:r,ldClient:n,error:o}},this.props.children)}}var E=Object.defineProperty,D=Object.defineProperties,S=Object.getOwnPropertyDescriptors,k=Object.getOwnPropertySymbols,K=Object.prototype.hasOwnProperty,L=Object.prototype.propertyIsEnumerable,R=(e,t,r)=>t in e?E(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,I=(e,t)=>{for(var r in t||(t={}))K.call(t,r)&&R(e,r,t[r]);if(k)for(var r of k(t))L.call(t,r)&&R(e,r,t[r]);return e};var z=Object.defineProperty,M=Object.defineProperties,q=Object.getOwnPropertyDescriptors,T=Object.getOwnPropertySymbols,V=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable,N=(e,t,r)=>t in e?z(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,U=(e,t)=>{for(var r in t||(t={}))V.call(t,r)&&N(e,r,t[r]);if(T)for(var r of T(t))$.call(t,r)&&N(e,r,t[r]);return e},W=(e,t)=>M(e,q(t));var A=Object.defineProperty,B=Object.getOwnPropertySymbols,G=Object.prototype.hasOwnProperty,H=Object.prototype.propertyIsEnumerable,J=(e,t,r)=>t in e?A(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Q=(e,t)=>{for(var r in t||(t={}))G.call(t,r)&&J(e,r,t[r]);if(B)for(var r of B(t))H.call(t,r)&&J(e,r,t[r]);return e};exports.LDProvider=F,exports.asyncWithLDProvider=function(r){return n=this,o=null,s=function*(){var n,o;const{clientSideID:s,flags:i,options:c,reactOptions:d}=r,y=U(U({},a),d),O=null!=(n=l(r))?n:{anonymous:!0,kind:"user"};let g,b={};const v=null!=(o=yield r.ldClient)?o:t.initialize(s,O,U(U({},h),c));try{yield v.waitForInitialization(r.timeout),b=p(v,i)}catch(e){g=e}const x=(null==c?void 0:c.bootstrap)&&"localStorage"!==c.bootstrap?c.bootstrap:b;return({children:t})=>{const[r,n]=e.useState((()=>W(U({unproxiedFlags:x},f(v,x,y,i)),{ldClient:v,error:g})));e.useEffect((()=>{function e(e){const t=u(e,i);Object.keys(t).length>0&&n((e=>{const r=U(U({},e.unproxiedFlags),t);return U(W(U({},e),{unproxiedFlags:r}),f(v,r,y,i))}))}function t(){const e=p(v,i);n((t=>U(W(U({},t),{unproxiedFlags:e}),f(v,e,y,i))))}function r(e){n((t=>W(U({},t),{error:e})))}return v.on("change",e),(null==g?void 0:g.name.toLowerCase().includes("timeout"))&&(v.on("failed",r),v.on("ready",t)),function(){v.off("change",e),v.off("failed",r),v.off("ready",t)}}),[]);const o=((e,t)=>{var r={};for(var n in e)V.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&T)for(var n of T(e))t.indexOf(n)<0&&$.call(e,n)&&(r[n]=e[n]);return r})(r,["unproxiedFlags"]),{reactContext:s}=y;return e.createElement(s.Provider,{value:o},t)}},new Promise(((e,t)=>{var r=e=>{try{a(s.next(e))}catch(e){t(e)}},i=e=>{try{a(s.throw(e))}catch(e){t(e)}},a=t=>t.done?e(t.value):Promise.resolve(t.value).then(r,i);a((s=s.apply(n,o)).next())}));var n,o,s},exports.camelCaseKeys=c,exports.defaultReactOptions=a,exports.reactSdkContextFactory=i,exports.useFlags=t=>{const{flags:r}=e.useContext(null!=t?t:a.reactContext);return r},exports.useLDClient=t=>{const{ldClient:r}=e.useContext(null!=t?t:a.reactContext);return r},exports.useLDClientError=function(t){const{error:r}=e.useContext(null!=t?t:a.reactContext);return r},exports.withLDConsumer=function(e={clientOnly:!1}){return function(t){var r;const n=null!=(r=e.reactContext)?r:a.reactContext;return r=>s.createElement(n.Consumer,null,(({flags:n,ldClient:o})=>e.clientOnly?s.createElement(t,Q({ldClient:o},r)):s.createElement(t,Q({flags:n,ldClient:o},r))))}},exports.withLDProvider=function(e){return function(t){const{reactOptions:r}=e,o=I(I({},a),r),i=(l=I({},e),D(l,S({reactOptions:o})));var l;function c(e){return s.createElement(F,I({},i),s.createElement(t,I({},e)))}return n(c,t),c}},Object.keys(t).forEach((function(e){"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:function(){return t[e]}})})); | ||
//# sourceMappingURL=index.js.map |
@@ -1,2 +0,2 @@ | ||
import*as e from"react";import t,{createContext as r,Component as n,useState as o,useEffect as i,useContext as s}from"react";import{initialize as a}from"launchdarkly-js-client-sdk";export*from"launchdarkly-js-client-sdk";import l from"lodash.camelcase";import c from"hoist-non-react-statics";const p={useCamelCaseFlagKeys:!0,sendEventsOnFlagRead:!0},u=r({flags:{},flagKeyMap:{},ldClient:void 0}),{Provider:f,Consumer:d}=u,y=e=>{var t;return null!=(t=e.context)?t:e.user},h=e=>{const t={};for(const r in e)0!==r.indexOf("$")&&(t[l(r)]=e[r]);return t},g=(e,t)=>{const r={};for(const n in e)t&&void 0===t[n]||(r[n]=e[n].current);return r},O=(e,t)=>{const r=e.allFlags();return t?Object.keys(t).reduce(((e,n)=>(e[n]=Object.prototype.hasOwnProperty.call(r,n)?r[n]:t[n],e)),{}):r};function b(e,t,r=p,n){const o=function(e,t){if(void 0===t)return e;return Object.keys(t).reduce(((t,r)=>(m(e,r)&&(t[r]=e[r]),t)),{})}(t,n),{useCamelCaseFlagKeys:i=!0}=r,[s,a={}]=i?function(e){const t={},r={};for(const n in e){if(0===n.indexOf("$"))continue;const o=l(n);t[o]=e[n],r[o]=n}return[t,r]}(o):[o];return{flags:r.sendEventsOnFlagRead?v(e,s,a,i):s,flagKeyMap:a}}function m(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function v(e,t,r,n){return new Proxy(t,{get(t,o,i){const s=Reflect.get(t,o,i),a=n&&m(r,o)||m(t,o);if("symbol"==typeof o||!a)return s;if(void 0===s)return;const l=n?r[o]:o;return e.variation(l,s)}})}h.camelCaseKeys=h;const j={wrapperName:"react-client-sdk",wrapperVersion:"3.5.0",sendEventsOnlyForVariation:!0};var w=Object.defineProperty,C=Object.defineProperties,P=Object.getOwnPropertyDescriptors,x=Object.getOwnPropertySymbols,F=Object.prototype.hasOwnProperty,E=Object.prototype.propertyIsEnumerable,S=(e,t,r)=>t in e?w(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,k=(e,t)=>{for(var r in t||(t={}))F.call(t,r)&&S(e,r,t[r]);if(x)for(var r of x(t))E.call(t,r)&&S(e,r,t[r]);return e},D=(e,t)=>C(e,P(t)),I=(e,t,r)=>new Promise(((n,o)=>{var i=e=>{try{a(r.next(e))}catch(e){o(e)}},s=e=>{try{a(r.throw(e))}catch(e){o(e)}},a=e=>e.done?n(e.value):Promise.resolve(e.value).then(i,s);a((r=r.apply(e,t)).next())}));class K extends n{constructor(e){super(e),this.getReactOptions=()=>k(k({},p),this.props.reactOptions),this.subscribeToChanges=e=>{const{flags:t}=this.props;e.on("change",(r=>{const n=this.getReactOptions(),o=g(r,t),i=k(k({},this.state.unproxiedFlags),o);Object.keys(o).length>0&&this.setState((r=>k(D(k({},r),{unproxiedFlags:i}),b(e,i,n,t))))}))},this.onFailed=(e,t)=>{this.setState((e=>D(k({},e),{error:t})))},this.onReady=(e,t,r)=>{const n=O(e,r);this.setState((o=>k(D(k({},o),{unproxiedFlags:n}),b(e,n,t,r))))},this.prepareLDClient=()=>I(this,null,(function*(){var e;const{clientSideID:t,flags:r,options:n}=this.props;let o=yield this.props.ldClient;const i=this.getReactOptions();let s,l=this.state.unproxiedFlags;if(o)l=O(o,r);else{const c=null!=(e=y(this.props))?e:{anonymous:!0,kind:"user"};o=a(t,c,k(k({},j),n));try{yield o.waitForInitialization(this.props.timeout),l=O(o,r)}catch(e){s=e,(null==s?void 0:s.name.toLowerCase().includes("timeout"))&&(o.on("failed",this.onFailed),o.on("ready",(()=>{this.onReady(o,i,r)})))}}this.setState((e=>D(k(D(k({},e),{unproxiedFlags:l}),b(o,l,i,r)),{ldClient:o,error:s}))),this.subscribeToChanges(o)}));const{options:t}=e;if(this.state={flags:{},unproxiedFlags:{},flagKeyMap:{}},t){const{bootstrap:e}=t;if(e&&"localStorage"!==e){const{useCamelCaseFlagKeys:t}=this.getReactOptions();this.state={flags:t?h(e):e,unproxiedFlags:e,flagKeyMap:{}}}}}componentDidMount(){return I(this,null,(function*(){const{deferInitialization:e}=this.props;e&&!y(this.props)||(yield this.prepareLDClient())}))}componentDidUpdate(e){return I(this,null,(function*(){const{deferInitialization:t}=this.props,r=!y(e)&&y(this.props);t&&r&&(yield this.prepareLDClient())}))}render(){const{flags:e,flagKeyMap:r,ldClient:n,error:o}=this.state;return t.createElement(f,{value:{flags:e,flagKeyMap:r,ldClient:n,error:o}},this.props.children)}}var R=Object.defineProperty,M=Object.defineProperties,L=Object.getOwnPropertyDescriptors,z=Object.getOwnPropertySymbols,T=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable,$=(e,t,r)=>t in e?R(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,N=(e,t)=>{for(var r in t||(t={}))T.call(t,r)&&$(e,r,t[r]);if(z)for(var r of z(t))V.call(t,r)&&$(e,r,t[r]);return e};function U(t){return function(r){const{reactOptions:n}=t,o=N(N({},p),n),i=(s=N({},t),M(s,L({reactOptions:o})));var s;function a(t){return e.createElement(K,N({},i),e.createElement(r,N({},t)))}return c(a,r),a}}var q=Object.defineProperty,A=Object.defineProperties,B=Object.getOwnPropertyDescriptors,G=Object.getOwnPropertySymbols,H=Object.prototype.hasOwnProperty,J=Object.prototype.propertyIsEnumerable,Q=(e,t,r)=>t in e?q(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,W=(e,t)=>{for(var r in t||(t={}))H.call(t,r)&&Q(e,r,t[r]);if(G)for(var r of G(t))J.call(t,r)&&Q(e,r,t[r]);return e},X=(e,t)=>A(e,B(t));function Y(e){return r=this,n=null,s=function*(){var r,n;const{clientSideID:s,flags:l,options:c,reactOptions:u}=e,d=W(W({},p),u),h=null!=(r=y(e))?r:{anonymous:!0,kind:"user"};let m,v={};const w=null!=(n=yield e.ldClient)?n:a(s,h,W(W({},j),c));try{yield w.waitForInitialization(e.timeout),v=O(w,l)}catch(e){m=e}const C=(null==c?void 0:c.bootstrap)&&"localStorage"!==c.bootstrap?c.bootstrap:v;return({children:e})=>{const[r,n]=o((()=>X(W({unproxiedFlags:C},b(w,C,d,l)),{ldClient:w,error:m})));i((()=>{function e(e){const t=g(e,l);Object.keys(t).length>0&&n((e=>{const r=W(W({},e.unproxiedFlags),t);return W(X(W({},e),{unproxiedFlags:r}),b(w,r,d,l))}))}function t(){const e=O(w,l);n((t=>W(X(W({},t),{unproxiedFlags:e}),b(w,e,d,l))))}function r(e){n((t=>X(W({},t),{error:e})))}return w.on("change",e),(null==m?void 0:m.name.toLowerCase().includes("timeout"))&&(w.on("failed",r),w.on("ready",t)),function(){w.off("change",e),w.off("failed",r),w.off("ready",t)}}),[]);const s=((e,t)=>{var r={};for(var n in e)H.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&G)for(var n of G(e))t.indexOf(n)<0&&J.call(e,n)&&(r[n]=e[n]);return r})(r,["unproxiedFlags"]);return t.createElement(f,{value:s},e)}},new Promise(((e,t)=>{var o=e=>{try{a(s.next(e))}catch(e){t(e)}},i=e=>{try{a(s.throw(e))}catch(e){t(e)}},a=t=>t.done?e(t.value):Promise.resolve(t.value).then(o,i);a((s=s.apply(r,n)).next())}));var r,n,s}var Z=Object.defineProperty,_=Object.getOwnPropertySymbols,ee=Object.prototype.hasOwnProperty,te=Object.prototype.propertyIsEnumerable,re=(e,t,r)=>t in e?Z(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,ne=(e,t)=>{for(var r in t||(t={}))ee.call(t,r)&&re(e,r,t[r]);if(_)for(var r of _(t))te.call(t,r)&&re(e,r,t[r]);return e};function oe(t={clientOnly:!1}){return function(r){return n=>e.createElement(d,null,(({flags:o,ldClient:i})=>t.clientOnly?e.createElement(r,ne({ldClient:i},n)):e.createElement(r,ne({flags:o,ldClient:i},n))))}}const ie=()=>{const{flags:e}=s(u);return e},se=()=>{const{ldClient:e}=s(u);return e};function ae(){const{error:e}=s(u);return e}export{K as LDProvider,Y as asyncWithLDProvider,h as camelCaseKeys,p as defaultReactOptions,ie as useFlags,se as useLDClient,ae as useLDClientError,oe as withLDConsumer,U as withLDProvider}; | ||
import*as e from"react";import t,{createContext as r,Component as n,useState as o,useEffect as a,useContext as i}from"react";import{initialize as s}from"launchdarkly-js-client-sdk";export*from"launchdarkly-js-client-sdk";import l from"lodash.camelcase";import c from"hoist-non-react-statics";const p=()=>r({flags:{},flagKeyMap:{},ldClient:void 0}),u={useCamelCaseFlagKeys:!0,sendEventsOnFlagRead:!0,reactContext:p()},f=e=>{var t;return null!=(t=e.context)?t:e.user},d=e=>{const t={};for(const r in e)0!==r.indexOf("$")&&(t[l(r)]=e[r]);return t},y=(e,t)=>{const r={};for(const n in e)t&&void 0===t[n]||(r[n]=e[n].current);return r},h=(e,t)=>{const r=e.allFlags();return t?Object.keys(t).reduce(((e,n)=>(e[n]=Object.prototype.hasOwnProperty.call(r,n)?r[n]:t[n],e)),{}):r};function g(e,t,r=u,n){const o=function(e,t){if(void 0===t)return e;return Object.keys(t).reduce(((t,r)=>(O(e,r)&&(t[r]=e[r]),t)),{})}(t,n),{useCamelCaseFlagKeys:a=!0}=r,[i,s={}]=a?function(e){const t={},r={};for(const n in e){if(0===n.indexOf("$"))continue;const o=l(n);t[o]=e[n],r[o]=n}return[t,r]}(o):[o];return{flags:r.sendEventsOnFlagRead?b(e,i,s,a):i,flagKeyMap:s}}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function b(e,t,r,n){return new Proxy(t,{get(t,o,a){const i=Reflect.get(t,o,a),s=n&&O(r,o)||O(t,o);if("symbol"==typeof o||!s)return i;if(void 0===i)return;const l=n?r[o]:o;return e.variation(l,i)}})}d.camelCaseKeys=d;const m={wrapperName:"react-client-sdk",wrapperVersion:"3.6.0",sendEventsOnlyForVariation:!0};var v=Object.defineProperty,C=Object.defineProperties,x=Object.getOwnPropertyDescriptors,j=Object.getOwnPropertySymbols,w=Object.prototype.hasOwnProperty,P=Object.prototype.propertyIsEnumerable,F=(e,t,r)=>t in e?v(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,E=(e,t)=>{for(var r in t||(t={}))w.call(t,r)&&F(e,r,t[r]);if(j)for(var r of j(t))P.call(t,r)&&F(e,r,t[r]);return e},S=(e,t)=>C(e,x(t)),k=(e,t,r)=>new Promise(((n,o)=>{var a=e=>{try{s(r.next(e))}catch(e){o(e)}},i=e=>{try{s(r.throw(e))}catch(e){o(e)}},s=e=>e.done?n(e.value):Promise.resolve(e.value).then(a,i);s((r=r.apply(e,t)).next())}));class D extends n{constructor(e){super(e),this.getReactOptions=()=>E(E({},u),this.props.reactOptions),this.subscribeToChanges=e=>{const{flags:t}=this.props;e.on("change",(r=>{const n=this.getReactOptions(),o=y(r,t),a=E(E({},this.state.unproxiedFlags),o);Object.keys(o).length>0&&this.setState((r=>E(S(E({},r),{unproxiedFlags:a}),g(e,a,n,t))))}))},this.onFailed=(e,t)=>{this.setState((e=>S(E({},e),{error:t})))},this.onReady=(e,t,r)=>{const n=h(e,r);this.setState((o=>E(S(E({},o),{unproxiedFlags:n}),g(e,n,t,r))))},this.prepareLDClient=()=>k(this,null,(function*(){var e;const{clientSideID:t,flags:r,options:n}=this.props;let o=yield this.props.ldClient;const a=this.getReactOptions();let i,l=this.state.unproxiedFlags;if(o)l=h(o,r);else{const c=null!=(e=f(this.props))?e:{anonymous:!0,kind:"user"};o=s(t,c,E(E({},m),n));try{yield o.waitForInitialization(this.props.timeout),l=h(o,r)}catch(e){i=e,(null==i?void 0:i.name.toLowerCase().includes("timeout"))&&(o.on("failed",this.onFailed),o.on("ready",(()=>{this.onReady(o,a,r)})))}}this.setState((e=>S(E(S(E({},e),{unproxiedFlags:l}),g(o,l,a,r)),{ldClient:o,error:i}))),this.subscribeToChanges(o)}));const{options:t}=e;if(this.state={flags:{},unproxiedFlags:{},flagKeyMap:{}},t){const{bootstrap:e}=t;if(e&&"localStorage"!==e){const{useCamelCaseFlagKeys:t}=this.getReactOptions();this.state={flags:t?d(e):e,unproxiedFlags:e,flagKeyMap:{}}}}}componentDidMount(){return k(this,null,(function*(){const{deferInitialization:e}=this.props;e&&!f(this.props)||(yield this.prepareLDClient())}))}componentDidUpdate(e){return k(this,null,(function*(){const{deferInitialization:t}=this.props,r=!f(e)&&f(this.props);t&&r&&(yield this.prepareLDClient())}))}render(){const{flags:e,flagKeyMap:r,ldClient:n,error:o}=this.state,{reactContext:a}=this.getReactOptions();return t.createElement(a.Provider,{value:{flags:e,flagKeyMap:r,ldClient:n,error:o}},this.props.children)}}var I=Object.defineProperty,K=Object.defineProperties,R=Object.getOwnPropertyDescriptors,M=Object.getOwnPropertySymbols,L=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable,T=(e,t,r)=>t in e?I(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,V=(e,t)=>{for(var r in t||(t={}))L.call(t,r)&&T(e,r,t[r]);if(M)for(var r of M(t))z.call(t,r)&&T(e,r,t[r]);return e};function $(t){return function(r){const{reactOptions:n}=t,o=V(V({},u),n),a=(i=V({},t),K(i,R({reactOptions:o})));var i;function s(t){return e.createElement(D,V({},a),e.createElement(r,V({},t)))}return c(s,r),s}}var N=Object.defineProperty,U=Object.defineProperties,q=Object.getOwnPropertyDescriptors,A=Object.getOwnPropertySymbols,B=Object.prototype.hasOwnProperty,G=Object.prototype.propertyIsEnumerable,H=(e,t,r)=>t in e?N(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,J=(e,t)=>{for(var r in t||(t={}))B.call(t,r)&&H(e,r,t[r]);if(A)for(var r of A(t))G.call(t,r)&&H(e,r,t[r]);return e},Q=(e,t)=>U(e,q(t));function W(e){return r=this,n=null,i=function*(){var r,n;const{clientSideID:i,flags:l,options:c,reactOptions:p}=e,d=J(J({},u),p),O=null!=(r=f(e))?r:{anonymous:!0,kind:"user"};let b,v={};const C=null!=(n=yield e.ldClient)?n:s(i,O,J(J({},m),c));try{yield C.waitForInitialization(e.timeout),v=h(C,l)}catch(e){b=e}const x=(null==c?void 0:c.bootstrap)&&"localStorage"!==c.bootstrap?c.bootstrap:v;return({children:e})=>{const[r,n]=o((()=>Q(J({unproxiedFlags:x},g(C,x,d,l)),{ldClient:C,error:b})));a((()=>{function e(e){const t=y(e,l);Object.keys(t).length>0&&n((e=>{const r=J(J({},e.unproxiedFlags),t);return J(Q(J({},e),{unproxiedFlags:r}),g(C,r,d,l))}))}function t(){const e=h(C,l);n((t=>J(Q(J({},t),{unproxiedFlags:e}),g(C,e,d,l))))}function r(e){n((t=>Q(J({},t),{error:e})))}return C.on("change",e),(null==b?void 0:b.name.toLowerCase().includes("timeout"))&&(C.on("failed",r),C.on("ready",t)),function(){C.off("change",e),C.off("failed",r),C.off("ready",t)}}),[]);const i=((e,t)=>{var r={};for(var n in e)B.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&A)for(var n of A(e))t.indexOf(n)<0&&G.call(e,n)&&(r[n]=e[n]);return r})(r,["unproxiedFlags"]),{reactContext:s}=d;return t.createElement(s.Provider,{value:i},e)}},new Promise(((e,t)=>{var o=e=>{try{s(i.next(e))}catch(e){t(e)}},a=e=>{try{s(i.throw(e))}catch(e){t(e)}},s=t=>t.done?e(t.value):Promise.resolve(t.value).then(o,a);s((i=i.apply(r,n)).next())}));var r,n,i}var X=Object.defineProperty,Y=Object.getOwnPropertySymbols,Z=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable,ee=(e,t,r)=>t in e?X(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,te=(e,t)=>{for(var r in t||(t={}))Z.call(t,r)&&ee(e,r,t[r]);if(Y)for(var r of Y(t))_.call(t,r)&&ee(e,r,t[r]);return e};function re(t={clientOnly:!1}){return function(r){var n;const o=null!=(n=t.reactContext)?n:u.reactContext;return n=>e.createElement(o.Consumer,null,(({flags:o,ldClient:a})=>t.clientOnly?e.createElement(r,te({ldClient:a},n)):e.createElement(r,te({flags:o,ldClient:a},n))))}}const ne=e=>{const{flags:t}=i(null!=e?e:u.reactContext);return t},oe=e=>{const{ldClient:t}=i(null!=e?e:u.reactContext);return t};function ae(e){const{error:t}=i(null!=e?e:u.reactContext);return t}export{D as LDProvider,W as asyncWithLDProvider,d as camelCaseKeys,u as defaultReactOptions,p as reactSdkContextFactory,ne as useFlags,oe as useLDClient,ae as useLDClientError,re as withLDConsumer,$ as withLDProvider}; | ||
//# sourceMappingURL=index.js.map |
@@ -0,8 +1,46 @@ | ||
import * as launchdarkly_js_client_sdk from 'launchdarkly-js-client-sdk'; | ||
import { LDFlagSet, LDClient, LDContext, LDOptions } from 'launchdarkly-js-client-sdk'; | ||
export * from 'launchdarkly-js-client-sdk'; | ||
import * as React from 'react'; | ||
import React__default, { Component, PropsWithChildren, ReactNode } from 'react'; | ||
import * as launchdarkly_js_client_sdk from 'launchdarkly-js-client-sdk'; | ||
import { LDContext, LDOptions, LDFlagSet, LDClient } from 'launchdarkly-js-client-sdk'; | ||
export * from 'launchdarkly-js-client-sdk'; | ||
/** | ||
* Controls the props the wrapped component receives from the `LDConsumer` HOC. | ||
*/ | ||
interface ConsumerOptions { | ||
/** | ||
* If true then the wrapped component only receives the `ldClient` instance | ||
* and nothing else. | ||
*/ | ||
clientOnly: boolean; | ||
reactContext?: React.Context<ReactSdkContext>; | ||
} | ||
/** | ||
* The possible props the wrapped component can receive from the `LDConsumer` HOC. | ||
*/ | ||
interface LDProps { | ||
/** | ||
* A map of feature flags from their keys to their values. | ||
* Keys are camelCased using `lodash.camelcase`. | ||
*/ | ||
flags?: LDFlagSet; | ||
/** | ||
* An instance of `LDClient` from the LaunchDarkly JS SDK (`launchdarkly-js-client-sdk`) | ||
* | ||
* @see https://docs.launchdarkly.com/sdk/client-side/javascript | ||
*/ | ||
ldClient?: LDClient; | ||
} | ||
/** | ||
* withLDConsumer is a function which accepts an optional options object and returns a function | ||
* which accepts your React component. This function returns a HOC with flags | ||
* and the ldClient instance injected via props. | ||
* | ||
* @param options - If you need only the `ldClient` instance and not flags, then set `{ clientOnly: true }` | ||
* to only pass the ldClient prop to your component. Defaults to `{ clientOnly: false }`. | ||
* @return A HOC with flags and the `ldClient` instance injected via props | ||
*/ | ||
declare function withLDConsumer(options?: ConsumerOptions): <P>(WrappedComponent: React.ComponentType<P & LDProps>) => (props: P) => React.JSX.Element; | ||
/** | ||
* Initialization options for the LaunchDarkly React SDK. These are in addition to the options exposed | ||
@@ -33,2 +71,6 @@ * by [[LDOptions]] which are common to both the JavaScript and React SDKs. | ||
sendEventsOnFlagRead?: boolean; | ||
/** | ||
* The react context to use within the provider objects. | ||
*/ | ||
reactContext?: React.Context<ReactSdkContext>; | ||
} | ||
@@ -41,2 +83,3 @@ /** | ||
sendEventsOnFlagRead: boolean; | ||
reactContext: React.Context<ReactSdkContext>; | ||
}; | ||
@@ -149,2 +192,29 @@ /** | ||
/** | ||
* The sdk context stored in the Provider state and passed to consumers. | ||
*/ | ||
interface ReactSdkContext { | ||
/** | ||
* JavaScript proxy that will trigger a LDClient#variation call on flag read in order | ||
* to register a flag evaluation event in LaunchDarkly. Empty {} initially | ||
* until flags are fetched from the LaunchDarkly servers. | ||
*/ | ||
flags: LDFlagSet; | ||
/** | ||
* Map of camelized flag keys to their original unmodified form. Empty if useCamelCaseFlagKeys option is false. | ||
*/ | ||
flagKeyMap: LDFlagKeyMap; | ||
/** | ||
* An instance of `LDClient` from the LaunchDarkly JS SDK (`launchdarkly-js-client-sdk`). | ||
* This will be be undefined initially until initialization is complete. | ||
* | ||
* @see https://docs.launchdarkly.com/sdk/client-side/javascript | ||
*/ | ||
ldClient?: LDClient; | ||
/** | ||
* LaunchDarkly client initialization error, if there was one. | ||
*/ | ||
error?: Error; | ||
} | ||
interface ProviderState { | ||
@@ -181,2 +251,3 @@ error?: Error; | ||
sendEventsOnFlagRead: boolean; | ||
reactContext: React__default.Context<ReactSdkContext>; | ||
}; | ||
@@ -243,39 +314,2 @@ subscribeToChanges: (ldClient: LDClient) => void; | ||
/** | ||
* Controls the props the wrapped component receives from the `LDConsumer` HOC. | ||
*/ | ||
interface ConsumerOptions { | ||
/** | ||
* If true then the wrapped component only receives the `ldClient` instance | ||
* and nothing else. | ||
*/ | ||
clientOnly: boolean; | ||
} | ||
/** | ||
* The possible props the wrapped component can receive from the `LDConsumer` HOC. | ||
*/ | ||
interface LDProps { | ||
/** | ||
* A map of feature flags from their keys to their values. | ||
* Keys are camelCased using `lodash.camelcase`. | ||
*/ | ||
flags?: LDFlagSet; | ||
/** | ||
* An instance of `LDClient` from the LaunchDarkly JS SDK (`launchdarkly-js-client-sdk`) | ||
* | ||
* @see https://docs.launchdarkly.com/sdk/client-side/javascript | ||
*/ | ||
ldClient?: LDClient; | ||
} | ||
/** | ||
* withLDConsumer is a function which accepts an optional options object and returns a function | ||
* which accepts your React component. This function returns a HOC with flags | ||
* and the ldClient instance injected via props. | ||
* | ||
* @param options - If you need only the `ldClient` instance and not flags, then set `{ clientOnly: true }` | ||
* to only pass the ldClient prop to your component. Defaults to `{ clientOnly: false }`. | ||
* @return A HOC with flags and the `ldClient` instance injected via props | ||
*/ | ||
declare function withLDConsumer(options?: ConsumerOptions): <P>(WrappedComponent: React.ComponentType<P & LDProps>) => (props: P) => React.JSX.Element; | ||
/** | ||
* `useFlags` is a custom hook which returns all feature flags. It uses the `useContext` primitive | ||
@@ -286,5 +320,7 @@ * to access the LaunchDarkly context set up by `withLDProvider`. As such you will still need to | ||
* | ||
* @param reactContext If specified, the provided React context will be used. | ||
* | ||
* @return All the feature flags configured in your LaunchDarkly project | ||
*/ | ||
declare const useFlags: <T extends LDFlagSet = LDFlagSet>() => T; | ||
declare const useFlags: <T extends LDFlagSet = LDFlagSet>(reactContext?: React__default.Context<ReactSdkContext>) => T; | ||
@@ -297,5 +333,7 @@ /** | ||
* | ||
* @param reactContext If specified, the custom React context will be used. | ||
* | ||
* @return The `launchdarkly-js-client-sdk` `LDClient` object | ||
*/ | ||
declare const useLDClient: () => launchdarkly_js_client_sdk.LDClient | undefined; | ||
declare const useLDClient: (reactContext?: React__default.Context<ReactSdkContext>) => launchdarkly_js_client_sdk.LDClient | undefined; | ||
@@ -305,5 +343,7 @@ /** | ||
* | ||
* @param reactContext If specified, the custom React context will be used. | ||
* | ||
* @return The `launchdarkly-js-client-sdk` `LDClient` initialization error | ||
*/ | ||
declare function useLDClientError(): Error | undefined; | ||
declare function useLDClientError(reactContext?: React__default.Context<ReactSdkContext>): Error | undefined; | ||
@@ -326,2 +366,10 @@ /** | ||
export { type AllFlagsLDClient, type AsyncProviderConfig, type EnhancedComponent, type LDFlagKeyMap, LDProvider, type LDReactOptions, type ProviderConfig, asyncWithLDProvider, camelCaseKeys, defaultReactOptions, useFlags, useLDClient, useLDClientError, withLDConsumer, withLDProvider }; | ||
/** | ||
* `reactSdkContextFactory` is a function useful for creating a React context for use with | ||
* all the providers and consumers in this library. | ||
* | ||
* @return a React Context | ||
*/ | ||
declare const reactSdkContextFactory: () => React.Context<ReactSdkContext>; | ||
export { type AllFlagsLDClient, type AsyncProviderConfig, type EnhancedComponent, type LDFlagKeyMap, type LDProps, LDProvider, type LDReactOptions, type ProviderConfig, type ReactSdkContext, asyncWithLDProvider, camelCaseKeys, defaultReactOptions, reactSdkContextFactory, useFlags, useLDClient, useLDClientError, withLDConsumer, withLDProvider }; |
{ | ||
"name": "launchdarkly-react-client-sdk", | ||
"version": "3.5.0", | ||
"version": "3.6.0", | ||
"description": "LaunchDarkly SDK for React", | ||
@@ -53,3 +53,3 @@ "author": "LaunchDarkly <team@launchdarkly.com>", | ||
"@rollup/plugin-terser": "^0.4.3", | ||
"@rollup/plugin-typescript": "^11.1.2", | ||
"@rollup/plugin-typescript": "^12.1.1", | ||
"@testing-library/dom": "^10.4.0", | ||
@@ -67,3 +67,3 @@ "@testing-library/jest-dom": "^6.4.8", | ||
"@types/react-test-renderer": "^18.0.0", | ||
"esbuild": "^0.23.0", | ||
"esbuild": "^0.24.0", | ||
"eslint": "^9.8.0", | ||
@@ -83,3 +83,3 @@ "jest": "^29.7.0", | ||
"ts-jest": "^29.2.2", | ||
"tslint": "^6.1.3", | ||
"tslib": "^2.8.1", | ||
"typedoc": "^0.26.5", | ||
@@ -86,0 +86,0 @@ "typescript": "^5.5.4", |
import { createContext } from 'react'; | ||
import { LDClient, LDFlagSet } from 'launchdarkly-js-client-sdk'; | ||
import { LDFlagKeyMap } from './types'; | ||
import { ReactSdkContext } from './types'; | ||
/** | ||
* The sdk context stored in the Provider state and passed to consumers. | ||
* `reactSdkContextFactory` is a function useful for creating a React context for use with | ||
* all the providers and consumers in this library. | ||
* | ||
* @return a React Context | ||
*/ | ||
interface ReactSdkContext { | ||
/** | ||
* JavaScript proxy that will trigger a LDClient#variation call on flag read in order | ||
* to register a flag evaluation event in LaunchDarkly. Empty {} initially | ||
* until flags are fetched from the LaunchDarkly servers. | ||
*/ | ||
flags: LDFlagSet; | ||
/** | ||
* Map of camelized flag keys to their original unmodified form. Empty if useCamelCaseFlagKeys option is false. | ||
*/ | ||
flagKeyMap: LDFlagKeyMap; | ||
/** | ||
* An instance of `LDClient` from the LaunchDarkly JS SDK (`launchdarkly-js-client-sdk`). | ||
* This will be be undefined initially until initialization is complete. | ||
* | ||
* @see https://docs.launchdarkly.com/sdk/client-side/javascript | ||
*/ | ||
ldClient?: LDClient; | ||
/** | ||
* LaunchDarkly client initialization error, if there was one. | ||
*/ | ||
error?: Error; | ||
} | ||
const reactSdkContextFactory = () => createContext<ReactSdkContext>({ flags: {}, flagKeyMap: {}, ldClient: undefined }); | ||
/** | ||
* @ignore | ||
*/ | ||
const context = createContext<ReactSdkContext>({ flags: {}, flagKeyMap: {}, ldClient: undefined }); | ||
const context = reactSdkContextFactory(); | ||
const { | ||
@@ -50,3 +26,3 @@ /** | ||
export { Provider, Consumer, ReactSdkContext }; | ||
export { Provider, Consumer, ReactSdkContext, reactSdkContextFactory }; | ||
export default context; |
@@ -9,2 +9,3 @@ import LDProvider from './provider'; | ||
import { camelCaseKeys } from './utils'; | ||
import { reactSdkContextFactory } from './context'; | ||
@@ -17,2 +18,3 @@ export * from './types'; | ||
camelCaseKeys, | ||
reactSdkContextFactory, | ||
useFlags, | ||
@@ -19,0 +21,0 @@ useLDClient, |
import { LDClient, LDContext, LDFlagSet, LDOptions } from 'launchdarkly-js-client-sdk'; | ||
import * as React from 'react'; | ||
import defaultReactContext from './context'; | ||
@@ -31,2 +32,7 @@ /** | ||
sendEventsOnFlagRead?: boolean; | ||
/** | ||
* The react context to use within the provider objects. | ||
*/ | ||
reactContext?: React.Context<ReactSdkContext>; | ||
} | ||
@@ -37,3 +43,7 @@ | ||
*/ | ||
export const defaultReactOptions = { useCamelCaseFlagKeys: true, sendEventsOnFlagRead: true }; | ||
export const defaultReactOptions = { | ||
useCamelCaseFlagKeys: true, | ||
sendEventsOnFlagRead: true, | ||
reactContext: defaultReactContext, | ||
}; | ||
@@ -160,2 +170,34 @@ /** | ||
export { type LDProps } from './withLDConsumer'; | ||
/** | ||
* The sdk context stored in the Provider state and passed to consumers. | ||
*/ | ||
export interface ReactSdkContext { | ||
/** | ||
* JavaScript proxy that will trigger a LDClient#variation call on flag read in order | ||
* to register a flag evaluation event in LaunchDarkly. Empty {} initially | ||
* until flags are fetched from the LaunchDarkly servers. | ||
*/ | ||
flags: LDFlagSet; | ||
/** | ||
* Map of camelized flag keys to their original unmodified form. Empty if useCamelCaseFlagKeys option is false. | ||
*/ | ||
flagKeyMap: LDFlagKeyMap; | ||
/** | ||
* An instance of `LDClient` from the LaunchDarkly JS SDK (`launchdarkly-js-client-sdk`). | ||
* This will be be undefined initially until initialization is complete. | ||
* | ||
* @see https://docs.launchdarkly.com/sdk/client-side/javascript | ||
*/ | ||
ldClient?: LDClient; | ||
/** | ||
* LaunchDarkly client initialization error, if there was one. | ||
*/ | ||
error?: Error; | ||
} | ||
export * from 'launchdarkly-js-client-sdk'; |
import { LDFlagSet } from 'launchdarkly-js-client-sdk'; | ||
import { useContext } from 'react'; | ||
import context, { ReactSdkContext } from './context'; | ||
import React, { useContext } from 'react'; | ||
import { defaultReactOptions, ReactSdkContext } from './types'; | ||
@@ -11,10 +11,11 @@ /** | ||
* | ||
* @param reactContext If specified, the provided React context will be used. | ||
* | ||
* @return All the feature flags configured in your LaunchDarkly project | ||
*/ | ||
const useFlags = <T extends LDFlagSet = LDFlagSet>(): T => { | ||
const { flags } = useContext<ReactSdkContext>(context); | ||
const useFlags = <T extends LDFlagSet = LDFlagSet>(reactContext?: React.Context<ReactSdkContext>): T => { | ||
const { flags } = useContext<ReactSdkContext>(reactContext ?? defaultReactOptions.reactContext); | ||
return flags as T; | ||
}; | ||
export default useFlags; |
@@ -1,4 +0,5 @@ | ||
import { useContext } from 'react'; | ||
import context from './context'; | ||
import React, { useContext } from 'react'; | ||
import { defaultReactOptions, ReactSdkContext } from './types'; | ||
// eslint:disable:max-line-length | ||
/** | ||
@@ -10,6 +11,8 @@ * `useLDClient` is a custom hook which returns the underlying [LaunchDarkly JavaScript SDK client object](https://launchdarkly.github.io/js-client-sdk/interfaces/LDClient.html). | ||
* | ||
* @param reactContext If specified, the custom React context will be used. | ||
* | ||
* @return The `launchdarkly-js-client-sdk` `LDClient` object | ||
*/ | ||
const useLDClient = () => { | ||
const { ldClient } = useContext(context); | ||
const useLDClient = (reactContext?: React.Context<ReactSdkContext>) => { | ||
const { ldClient } = useContext(reactContext ?? defaultReactOptions.reactContext); | ||
@@ -16,0 +19,0 @@ return ldClient; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
149697
1178