UNPKG

5.61 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/createWithTheme.js"],"names":["isClassComponent","Component","Boolean","prototype","isReactComponent","createWithTheme","ThemeProvider","ThemeContext","withTheme","Comp","ThemedComponent","a","b","previous","_previous","result","render","theme","merged","_merge","props","element","c","_root","React","displayName","name","getWrappedInstance"],"mappings":";;;;;AAEA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;AAKA,IAAMA,gBAAgB,GAAG,SAAnBA,gBAAmB,CAACC,SAAD;AAAA,SACvBC,OAAO,CAACD,SAAS,CAACE,SAAV,IAAuBF,SAAS,CAACE,SAAV,CAAoBC,gBAA5C,CADgB;AAAA,CAAzB;;AAUA,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,CACtBC,aADsB,EAEtBC,YAFsB;AAAA,SAItB,SAASC,SAAT,CAAmBC,IAAnB,EAA4B;AAAA,QACpBC,eADoB;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA,iEAMf,UAACC,CAAD,EAAOC,CAAP,EAAiB;AACxB,cAAMC,QAAQ,GAAG,MAAKC,SAAtB;;AAEA,cAAID,QAAQ,IAAIA,QAAQ,CAACF,CAAT,KAAeA,CAA3B,IAAgCE,QAAQ,CAACD,CAAT,KAAeA,CAAnD,EAAsD;AACpD,mBAAOC,QAAQ,CAACE,MAAhB;AACD;;AAED,cAAMA,MAAM,GAAGJ,CAAC,IAAIC,CAAL,GAAS,wBAAUD,CAAV,EAAaC,CAAb,CAAT,GAA2BD,CAAC,IAAIC,CAA/C;AAEA,gBAAKE,SAAL,GAAiB;AAAEH,YAAAA,CAAC,EAADA,CAAF;AAAKC,YAAAA,CAAC,EAADA,CAAL;AAAQG,YAAAA,MAAM,EAANA;AAAR,WAAjB;AAEA,iBAAOA,MAAP;AACD,SAlBuB;;AAAA;;AAAA;AAAA;;AAAA;;AAAA,aAsBxBC,MAtBwB,GAsBxB,kBAAS;AAAA;;AACP,eACE,oBAAC,YAAD,CAAc,QAAd,QACG,UAAAC,KAAK,EAAI;AACR,cAAMC,MAAM,GAAG,MAAI,CAACC,MAAL,CAAYF,KAAZ,EAAmB,MAAI,CAACG,KAAL,CAAWH,KAA9B,CAAf;;AAEA,cAAII,OAAJ;;AACA,cAAIrB,gBAAgB,CAACS,IAAD,CAApB,EAA4B;AAC1B;AACA;AACAY,YAAAA,OAAO,GACL,oBAAC,IAAD,eACM,MAAI,CAACD,KADX;AAEE,cAAA,GAAG,EAAE,aAAAE,CAAC,EAAI;AACR,gBAAA,MAAI,CAACC,KAAL,GAAaD,CAAb;AACD,eAJH;AAKE,cAAA,KAAK,EAAEJ;AALT,eADF;AASD,WAZD,MAYO;AACLG,YAAAA,OAAO,GAAG,oBAAC,IAAD,eAAU,MAAI,CAACD,KAAf;AAAsB,cAAA,KAAK,EAAEF;AAA7B,eAAV;AACD;;AAED,cAAIA,MAAM,KAAK,MAAI,CAACE,KAAL,CAAWH,KAA1B,EAAiC;AAC/B;AACA,mBAAO,oBAAC,aAAD;AAAe,cAAA,KAAK,EAAEC;AAAtB,eAA+BG,OAA/B,CAAP;AACD;;AAED,iBAAOA,OAAP;AACD,SA3BH,CADF;AA+BD,OAtDuB;;AAAA;AAAA,MACIG,KAAK,CAACvB,SADV;;AAAA,oBACpBS,eADoB,iCAEUD,IAAI,CAACgB,WAAL,IAAoBhB,IAAI,CAACiB,IAFnC;;AAyD1B,QAAI1B,gBAAgB,CAACS,IAAD,CAApB,EAA4B;AAC1B;AACA;AACA;AACA;AACAC,MAAAA,eAAe,CAACP,SAAhB,CAA0BwB,kBAA1B,GAA+C,SAASA,kBAAT,GAA8B;AAC3E,eAAO,KAAKJ,KAAL,IAAc,KAAKA,KAAL,CAAWI,kBAAzB,GACH,KAAKJ,KAAL,CAAWI,kBAAX,EADG,GAEH,KAAKJ,KAFT;AAGD,OAJD;;AAMAb,MAAAA,eAAe,GAAG,qBAASA,eAAT,EAA0BD,IAA1B,CAAlB;AACD;;AAED,uCAAqBC,eAArB,EAAsCD,IAAtC;AAEA,WAAQC,eAAR;AACD,GA9EqB;AAAA,CAAxB;;eAgFeL,e","sourcesContent":["/* @flow */\n\nimport * as React from 'react';\nimport deepmerge from 'deepmerge';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\n\nimport { copyRefs } from './utils';\n\nimport type { ThemeProviderType } from './createThemeProvider';\nimport type { $DeepShape } from './types';\n\nconst isClassComponent = (Component: any) =>\n Boolean(Component.prototype && Component.prototype.isReactComponent);\n\nexport type WithThemeType<T> = <P, C: React.ComponentType<P>>(\n Comp: C\n) => C &\n React.ComponentType<\n $Diff<React.ElementConfig<C>, { theme: T }> & { theme?: $DeepShape<T> }\n >;\n\nconst createWithTheme = <T: Object, S: $DeepShape<T>>(\n ThemeProvider: ThemeProviderType<T>,\n ThemeContext: React.Context<T>\n) =>\n function withTheme(Comp: *) {\n class ThemedComponent extends React.Component<*> {\n static displayName = `withTheme(${Comp.displayName || Comp.name})`;\n\n _previous: ?{ a: T, b: ?S, result: T };\n\n _merge = (a: T, b: ?S) => {\n const previous = this._previous;\n\n if (previous && previous.a === a && previous.b === b) {\n return previous.result;\n }\n\n const result = a && b ? deepmerge(a, b) : a || b;\n\n this._previous = { a, b, result };\n\n return result;\n };\n\n _root: any;\n\n render() {\n return (\n <ThemeContext.Consumer>\n {theme => {\n const merged = this._merge(theme, this.props.theme);\n\n let element;\n if (isClassComponent(Comp)) {\n // Only add refs for class components as function components don't support them\n // It's needed to support use cases which need access to the underlying node\n element = (\n <Comp\n {...this.props}\n ref={c => {\n this._root = c;\n }}\n theme={merged}\n />\n );\n } else {\n element = <Comp {...this.props} theme={merged} />;\n }\n\n if (merged !== this.props.theme) {\n // If a theme prop was passed, expose it to the children\n return <ThemeProvider theme={merged}>{element}</ThemeProvider>;\n }\n\n return element;\n }}\n </ThemeContext.Consumer>\n );\n }\n }\n\n if (isClassComponent(Comp)) {\n // getWrappedInstance is exposed by some HOCs like react-redux's connect\n // Use it to get the ref to the underlying element\n // Also expose it to access the underlying element after wrapping\n // $FlowFixMe\n ThemedComponent.prototype.getWrappedInstance = function getWrappedInstance() {\n return this._root && this._root.getWrappedInstance\n ? this._root.getWrappedInstance()\n : this._root;\n };\n\n ThemedComponent = copyRefs(ThemedComponent, Comp);\n }\n\n hoistNonReactStatics(ThemedComponent, Comp);\n\n return (ThemedComponent: any);\n };\n\nexport default createWithTheme;\n"],"file":"createWithTheme.js"}
\No newline at end of file