UNPKG

stencil-wormhole

Version:

Pass props down component trees easily via wormholes.

70 lines (69 loc) 2.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Universe = void 0; var core_1 = require("@stencil/core"); var multiverse = new Map(); var updateConsumer = function (_a, state) { var fields = _a.fields, updater = _a.updater; fields.forEach(function (field) { updater(field, state[field]); }); }; exports.Universe = { create: function (creator, initialState) { var el = core_1.getElement(creator); var wormholes = new Map(); var universe = { wormholes: wormholes, state: initialState }; multiverse.set(creator, universe); var connectedCallback = creator.connectedCallback; creator.connectedCallback = function () { multiverse.set(creator, universe); if (connectedCallback) { connectedCallback.call(creator); } }; var disconnectedCallback = creator.disconnectedCallback; creator.disconnectedCallback = function () { multiverse.delete(creator); if (disconnectedCallback) { disconnectedCallback.call(creator); } }; el.addEventListener('openWormhole', function (event) { event.stopPropagation(); var _a = event.detail, consumer = _a.consumer, onOpen = _a.onOpen; if (wormholes.has(consumer)) return; if (typeof consumer !== 'symbol') { var connectedCallback_1 = consumer.connectedCallback, disconnectedCallback_1 = consumer.disconnectedCallback; consumer.connectedCallback = function () { wormholes.set(consumer, event.detail); if (connectedCallback_1) { connectedCallback_1.call(consumer); } }; consumer.disconnectedCallback = function () { wormholes.delete(consumer); if (disconnectedCallback_1) { disconnectedCallback_1.call(consumer); } }; } wormholes.set(consumer, event.detail); updateConsumer(event.detail, universe.state); onOpen === null || onOpen === void 0 ? void 0 : onOpen.resolve(function () { wormholes.delete(consumer); }); }); el.addEventListener('closeWormhole', function (event) { var consumer = event.detail; wormholes.delete(consumer); }); }, Provider: function (_a, children) { var state = _a.state; var creator = core_1.getRenderingRef(); if (multiverse.has(creator)) { var universe = multiverse.get(creator); universe.state = state; universe.wormholes.forEach(function (opening) { updateConsumer(opening, state); }); } return children; } };