UNPKG

8.13 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.getOverride = getOverride;
7exports.getOverrideProps = getOverrideProps;
8exports.toObjectOverride = toObjectOverride;
9exports.getOverrides = getOverrides;
10exports.mergeOverrides = mergeOverrides;
11exports.mergeOverride = mergeOverride;
12exports.mergeConfigurationOverrides = mergeConfigurationOverrides;
13
14var React = _interopRequireWildcard(require("react"));
15
16var _reactIs = require("react-is");
17
18var _deepMerge = _interopRequireDefault(require("../utils/deep-merge.js"));
19
20function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
22function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
23
24function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
26function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
27
28function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
29
30function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
31
32function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
33
34function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
35
36/**
37 * Given an override argument, returns the component implementation override if it exists
38 */
39// eslint-disable-next-line flowtype/no-weak-types
40function getOverride(override) {
41 if ((0, _reactIs.isValidElementType)(override)) {
42 return override;
43 } // Check if override is OverrideObjectT
44
45
46 if (override && _typeof(override) === 'object') {
47 // Remove this 'any' once this flow issue is fixed:
48 // https://github.com/facebook/flow/issues/6666
49 // eslint-disable-next-line flowtype/no-weak-types
50 return override.component;
51 } // null/undefined
52
53
54 return override;
55}
56/**
57 * Given an override argument, returns the override props that should be passed
58 * to the component when rendering it.
59 */
60
61
62function getOverrideProps(override) {
63 if (override && _typeof(override) === 'object') {
64 if (_typeof(override.props) === 'object') {
65 return _objectSpread({}, override.props, {
66 $style: override.style
67 });
68 } else {
69 return {
70 $style: override.style
71 };
72 }
73 }
74
75 return {};
76}
77/**
78 * Coerces an override argument into an override object
79 * (sometimes it is just an override component)
80 */
81
82
83function toObjectOverride(override) {
84 if ((0, _reactIs.isValidElementType)(override)) {
85 return {
86 // eslint-disable-next-line flowtype/no-weak-types
87 component: override
88 };
89 } // Flow can't figure out that typeof 'function' above will
90 // catch React.StatelessFunctionalComponent
91 // (probably related to https://github.com/facebook/flow/issues/6666)
92 // eslint-disable-next-line flowtype/no-weak-types
93
94
95 return override || {};
96}
97/**
98 * Get a convenient override array that will always have [component, props]
99 */
100
101/* eslint-disable flowtype/no-weak-types */
102
103
104function getOverrides(override, defaultComponent) {
105 var Component = getOverride(override) || defaultComponent;
106
107 if (override && _typeof(override) === 'object' && typeof override.props === 'function') {
108 // TODO(v11)
109 if (process.env.NODE_ENV !== "production") {
110 console.warn('baseui:Overrides Props as a function will be removed in the next major version.');
111 }
112
113 var DynamicOverride = React.forwardRef(function (props, ref) {
114 var mappedProps = override.props(props);
115 var nextProps = getOverrideProps(_objectSpread({}, override, {
116 props: mappedProps
117 }));
118 return React.createElement(Component, _extends({
119 ref: ref
120 }, nextProps));
121 });
122 DynamicOverride.displayName = Component.displayName;
123 return [DynamicOverride, {}];
124 }
125
126 var props = getOverrideProps(override);
127 return [Component, props];
128}
129/* eslint-enable flowtype/no-weak-types */
130
131/**
132 * Merges two overrides objects – this is useful if you want to inject your own
133 * overrides into a child component, but also accept further overrides from
134 * from upstream. See `mergeOverride` below.
135 */
136
137
138function mergeOverrides() {
139 var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
140 var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
141 var merged = Object.assign({}, target, source);
142 var allIdentifiers = Object.keys(merged); // const allIdentifiers = Object.keys({...target, ...source});
143
144 return allIdentifiers.reduce(function (acc, name) {
145 acc[name] = mergeOverride(toObjectOverride(target[name]), toObjectOverride(source[name]));
146 return acc;
147 }, {});
148}
149/**
150 * Merges two override objects using the following behavior:
151 * - Component implementation from the source (parent) replaces target
152 * - Props and styles are both deep merged
153 */
154
155
156function mergeOverride(target, source) {
157 // Shallow merge should handle `component`
158 var merged = _objectSpread({}, target, {}, source);
159
160 if (target.props && source.props) {
161 merged.props = mergeConfigurationOverrides(target.props, source.props);
162 }
163
164 if (target.style && source.style) {
165 merged.style = mergeConfigurationOverrides(target.style, source.style);
166 }
167
168 return merged;
169}
170/**
171 * Since style or props overrides can be an object *or* a function, we need to handle
172 * the case that one of them is a function. We do this by returning a new
173 * function that deep merges the result of each style override
174 */
175
176
177function mergeConfigurationOverrides(target, source) {
178 // Simple case of both objects
179 if (_typeof(target) === 'object' && _typeof(source) === 'object') {
180 return (0, _deepMerge.default)({}, target, source);
181 } // At least one is a function, return a new composite function
182
183
184 return function () {
185 return (0, _deepMerge.default)({}, typeof target === 'function' ? target.apply(void 0, arguments) : target, typeof source === 'function' ? source.apply(void 0, arguments) : source);
186 };
187}
\No newline at end of file