UNPKG

react-elegant-ui

Version:

Elegant UI components, made by BEM best practices for react

180 lines (179 loc) 6.92 kB
"use strict"; 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; }();