react-elegant-ui
Version:
Elegant UI components, made by BEM best practices for react
180 lines (179 loc) • 6.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useRegistry = exports.useRegistries = exports.useComponentRegistry = exports.registryContext = exports.RegistryConsumer = exports.Registry = exports.ComponentRegistryConsumer = void 0;
exports.withRegistry = withRegistry;
var _react = _interopRequireWildcard(require("react"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
// Imported from @bem-react/di. Source: https://github.com/bem/bem-react/blob/master/packages/di/di.tsx
// This file forked from https://github.com/bem/bem-react/blob/95cb27909cc232d3676b4d010b5b9b8cf171e8e3/packages/di/di.tsx
// Reason: no maintenance
// Original contributors: @yarastqt @awinogradov @Vittly @isqua @artems
var __assign = void 0 && (void 0).__assign || function () {
__assign = Object.assign || function (t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var registryContext = exports.registryContext = /*#__PURE__*/(0, _react.createContext)({});
var RegistriesConsumer = registryContext.Consumer;
var RegistryProvider = registryContext.Provider;
function withRegistry() {
// Use arguments instead of rest-arguments to get faster and more compact code.
var registries = [].slice.call(arguments);
return function WithRegistry(Component) {
var RegistryResolver = function (props) {
var providedRegistriesRef = (0, _react.useRef)(null);
return /*#__PURE__*/_react.default.createElement(RegistriesConsumer, null, function (contextRegistries) {
if (providedRegistriesRef.current === null) {
var providedRegistries = __assign({}, contextRegistries);
for (var i = 0; i < registries.length; i++) {
var registry = registries[i];
var overrides = providedRegistries[registry.id];
// eslint-disable-next-line no-nested-ternary
providedRegistries[registry.id] = registry.overridable ? overrides ? registry.merge(overrides) : registry : registry && overrides ? overrides.merge(registry) : registry;
}
providedRegistriesRef.current = providedRegistries;
}
return /*#__PURE__*/_react.default.createElement(RegistryProvider, {
value: providedRegistriesRef.current
}, /*#__PURE__*/(0, _react.createElement)(Component, props));
});
};
return RegistryResolver;
};
}
var RegistryConsumer = function (props) {
return /*#__PURE__*/_react.default.createElement(RegistriesConsumer, null, function (registries) {
return props.children(registries[props.id].snapshot());
});
};
/**
* @deprecated consider using 'RegistryConsumer' instead
*/
exports.RegistryConsumer = RegistryConsumer;
var ComponentRegistryConsumer = exports.ComponentRegistryConsumer = RegistryConsumer;
var useRegistries = function () {
return (0, _react.useContext)(registryContext);
};
exports.useRegistries = useRegistries;
var useRegistry = function (id) {
var registries = useRegistries();
return registries[id].snapshot();
};
/**
* @deprecated consider using 'useRegistry' instead
*/
exports.useRegistry = useRegistry;
var useComponentRegistry = exports.useComponentRegistry = useRegistry;
var registryOverloadMark = 'RegistryOverloadHMark';
function withOverload(overload) {
return {
$symbol: registryOverloadMark,
overload: overload
};
}
function isOverload(entity) {
return entity.$symbol === registryOverloadMark;
}
var Registry = exports.Registry = /** @class */function () {
function Registry(_a) {
var id = _a.id,
_b = _a.overridable,
overridable = _b === void 0 ? true : _b;
this.entities = {};
this.id = id;
this.overridable = overridable;
}
/**
* Set registry entry by id.
*
* @param id entry id
* @param entity valid registry entity
*/
Registry.prototype.set = function (id, entity) {
this.entities[id] = entity;
return this;
};
/**
* Set extender for registry entry by id.
*
* @param id entry id
* @param overload valid registry entity extender
*/
Registry.prototype.extends = function (id, overload) {
this.entities[id] = withOverload(overload);
return this;
};
/**
* Set react entities in registry via object literal.
*
* @param entitiesSet set of valid registry entities
*/
Registry.prototype.fill = function (entitiesSet) {
for (var key in entitiesSet) {
this.entities[key] = entitiesSet[key];
}
return this;
};
/**
* Get entry from registry by id.
*
* @param id entry id
*/
Registry.prototype.get = function (id) {
return this.entities[id];
};
/**
* Returns raw entities from registry.
*/
Registry.prototype.snapshot = function () {
return this.entities;
};
/**
* Override entities by external registry.
* @internal
*
* @param otherRegistry external registry
*/
Registry.prototype.merge = function (otherRegistry) {
var clone = new Registry({
id: this.id,
overridable: this.overridable
});
clone.fill(this.entities);
if (!otherRegistry) return clone;
var otherRegistryEntities = otherRegistry.snapshot();
for (var entityName in otherRegistryEntities) {
if (!otherRegistryEntities.hasOwnProperty(entityName)) continue;
clone.entities[entityName] = this.mergeEntities(clone.entities[entityName], otherRegistryEntities[entityName]);
}
return clone;
};
/**
* Returns extended or replaced entity
*
* @param base base implementation
* @param overrides overridden implementation
*/
Registry.prototype.mergeEntities = function (base, overrides) {
if (isOverload(overrides)) {
if (!base) return overrides;
if (isOverload(base)) {
// If both entities are hocs, then create compose-hoc
return withOverload(function (Base) {
return overrides.overload(base.overload(Base));
});
}
return overrides.overload(base);
}
return overrides;
};
return Registry;
}();