@fluentui/react-northstar
Version:
A themable React component library.
98 lines (91 loc) • 3.62 kB
JavaScript
import { mergeThemes } from '@fluentui/styles';
import { isBrowser } from './isBrowser';
var defaultDocument = {
document: 'document'
};
var registeredRenderers = new WeakMap();
export var getRenderer = function getRenderer(createRenderer, target) {
var actualTarget = target || defaultDocument;
// A valid comparisons, default renderer will be used
if (!isBrowser() || typeof target === 'undefined') {
actualTarget = defaultDocument;
}
// SSR logic will be handled by condition above
// eslint-disable-next-line no-undef
if (isBrowser() && target === document) {
actualTarget = defaultDocument;
}
if (registeredRenderers.has(actualTarget)) {
return registeredRenderers.get(actualTarget);
}
// To avoid errors related to SSR as `document` may not exist we are using a fake object `defaultDocument`.
// When a value matches `defaultDocument` we will pass `undefined` to `createRenderer()` and it should handle it
// properly.
var createdRenderer = createRenderer(actualTarget === defaultDocument ? undefined : actualTarget);
registeredRenderers.set(actualTarget, createdRenderer);
return createdRenderer;
};
export var mergePerformanceOptions = function mergePerformanceOptions(target) {
for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
sources[_key - 1] = arguments[_key];
}
return Object.assign.apply(Object, [target].concat(sources));
};
export var mergeBooleanValues = function mergeBooleanValues(target) {
for (var _len2 = arguments.length, sources = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
sources[_key2 - 1] = arguments[_key2];
}
return sources.reduce(function (acc, next) {
return typeof next === 'boolean' ? next : acc;
}, target);
};
export var mergeProviderContexts = function mergeProviderContexts(createRenderer) {
var emptyContext = {
theme: {
siteVariables: {
fontSizes: {}
},
componentVariables: {},
componentStyles: {},
fontFaces: [],
staticStyles: [],
animations: {}
},
rtl: false,
disableAnimations: false,
target: isBrowser() ? document : undefined,
// eslint-disable-line no-undef
performance: {
enableSanitizeCssPlugin: process.env.NODE_ENV !== 'production',
enableStylesCaching: true,
enableVariablesCaching: true,
enableBooleanVariablesCaching: false
},
telemetry: undefined,
renderer: undefined
};
for (var _len3 = arguments.length, contexts = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
contexts[_key3 - 1] = arguments[_key3];
}
return contexts.reduce(function (acc, next) {
if (!next) return acc;
acc.theme = mergeThemes(acc.theme, next.theme);
// Latest RTL value wins
var mergedRTL = mergeBooleanValues(acc.rtl, next.rtl);
if (typeof mergedRTL === 'boolean') {
acc.rtl = mergedRTL;
}
// Use provided renderer if it is defined
acc.target = next.target || acc.target;
acc.renderer = getRenderer(createRenderer, acc.target);
// Latest disableAnimations value wins
var mergedDisableAnimations = mergeBooleanValues(acc.disableAnimations, next.disableAnimations);
if (typeof mergedDisableAnimations === 'boolean') {
acc.disableAnimations = mergedDisableAnimations;
}
acc.performance = mergePerformanceOptions(acc.performance, next.performance || {});
acc.telemetry = next.telemetry || acc.telemetry;
return acc;
}, emptyContext);
};
//# sourceMappingURL=mergeProviderContexts.js.map