UNPKG

alinea

Version:

[![npm](https://img.shields.io/npm/v/alinea.svg)](https://npmjs.org/package/alinea) [![install size](https://packagephobia.com/badge?p=alinea)](https://packagephobia.com/result?p=alinea)

636 lines (632 loc) 20.1 kB
import { require_react_is } from "../../chunks/chunk-3WZ466DU.js"; import { __commonJS, __toESM } from "../../chunks/chunk-U5RRZUYZ.js"; // node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js var require_hoist_non_react_statics_cjs = __commonJS({ "node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"(exports, module) { "use strict"; var reactIs = require_react_is(); var REACT_STATICS = { childContextTypes: true, contextType: true, contextTypes: true, defaultProps: true, displayName: true, getDefaultProps: true, getDerivedStateFromError: true, getDerivedStateFromProps: true, mixins: true, propTypes: true, type: true }; var KNOWN_STATICS = { name: true, length: true, prototype: true, caller: true, callee: true, arguments: true, arity: true }; var FORWARD_REF_STATICS = { "$$typeof": true, render: true, defaultProps: true, displayName: true, propTypes: true }; var MEMO_STATICS = { "$$typeof": true, compare: true, defaultProps: true, displayName: true, propTypes: true, type: true }; var TYPE_STATICS = {}; TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS; TYPE_STATICS[reactIs.Memo] = MEMO_STATICS; function getStatics(component) { if (reactIs.isMemo(component)) { return MEMO_STATICS; } return TYPE_STATICS[component["$$typeof"]] || REACT_STATICS; } var defineProperty = Object.defineProperty; var getOwnPropertyNames = Object.getOwnPropertyNames; var getOwnPropertySymbols = Object.getOwnPropertySymbols; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var getPrototypeOf = Object.getPrototypeOf; var objectPrototype = Object.prototype; function hoistNonReactStatics2(targetComponent, sourceComponent, blacklist) { if (typeof sourceComponent !== "string") { if (objectPrototype) { var inheritedComponent = getPrototypeOf(sourceComponent); if (inheritedComponent && inheritedComponent !== objectPrototype) { hoistNonReactStatics2(targetComponent, inheritedComponent, blacklist); } } var keys = getOwnPropertyNames(sourceComponent); if (getOwnPropertySymbols) { keys = keys.concat(getOwnPropertySymbols(sourceComponent)); } var targetStatics = getStatics(targetComponent); var sourceStatics = getStatics(sourceComponent); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) { var descriptor = getOwnPropertyDescriptor(sourceComponent, key); try { defineProperty(targetComponent, key, descriptor); } catch (e) { } } } } return targetComponent; } module.exports = hoistNonReactStatics2; } }); // node_modules/micro-observables/dist/micro-observables.esm.js var import_hoist_non_react_statics = __toESM(require_hoist_non_react_statics_cjs()); import React, { useState, useLayoutEffect, useMemo } from "react"; function _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); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); } var batchedUpdater; var PluginManager = /* @__PURE__ */ function() { function PluginManager2() { this._plugins = []; } var _proto = PluginManager2.prototype; _proto.use = function use(plugin) { this._plugins.push(plugin); }; _proto.onCreate = function onCreate(observable3, val) { this._plugins.forEach(function(it) { return it.onCreate == null ? void 0 : it.onCreate(observable3, val); }); }; _proto.onChange = function onChange(observable3, val, prevVal) { this._plugins.forEach(function(it) { return it.onChange == null ? void 0 : it.onChange(observable3, val, prevVal); }); }; _proto.onBecomeObserved = function onBecomeObserved(observable3) { this._plugins.forEach(function(it) { return it.onBecomeObserved == null ? void 0 : it.onBecomeObserved(observable3); }); }; _proto.onBecomeUnobserved = function onBecomeUnobserved(observable3) { this._plugins.forEach(function(it) { return it.onBecomeUnobserved == null ? void 0 : it.onBecomeUnobserved(observable3); }); }; _proto.onAttach = function onAttach(observable3, input) { this._plugins.forEach(function(it) { return it.onAttach == null ? void 0 : it.onAttach(observable3, input); }); }; _proto.onDetach = function onDetach(observable3, input) { this._plugins.forEach(function(it) { return it.onDetach == null ? void 0 : it.onDetach(observable3, input); }); }; return PluginManager2; }(); var UNSET = /* @__PURE__ */ Symbol(); var plugins = /* @__PURE__ */ new PluginManager(); var capturedInputFrames = []; var shouldCaptureNextInput = false; var batchedObservables = []; var batchDepth = 0; var BaseObservable = /* @__PURE__ */ function() { function BaseObservable2(val, options) { if (options === void 0) { options = {}; } this._prevVal = UNSET; this._inputs = []; this._outputs = []; this._listeners = []; this._attachedToInputs = false; this.onChange = this.subscribe; this._val = val; this._options = options; plugins.onCreate(this, val); } var _proto = BaseObservable2.prototype; _proto.get = function get() { var capturedInputs = capturedInputFrames[capturedInputFrames.length - 1]; if (capturedInputs && shouldCaptureNextInput) { try { shouldCaptureNextInput = false; capturedInputs.push(this); return this._get(); } finally { shouldCaptureNextInput = true; } } else { return this._get(); } }; _proto._get = function _get() { var shouldEvaluate = !this._attachedToInputs || this._prevVal !== UNSET; return shouldEvaluate ? this._evaluate() : this._val; }; _proto._evaluate = function _evaluate() { return this._val; }; _proto._set = function _set(val) { if (this._val !== val) { this._addToBatchRecursively(); this._val = val; } }; _proto.subscribe = function subscribe(listener) { var _this = this; this._listeners.push(listener); this._attachToInputs(); var listenerRemoved = false; return function() { if (!listenerRemoved) { listenerRemoved = true; _this._listeners.splice(_this._listeners.indexOf(listener), 1); _this._detachFromInputs(); } }; }; _proto.onBecomeObserved = function onBecomeObserved() { }; _proto.onBecomeUnobserved = function onBecomeUnobserved() { }; _proto.getInputs = function getInputs() { return this._inputs; }; _proto.getOptions = function getOptions() { return this._options; }; _proto.withOptions = function withOptions(options) { this._options = _extends({}, this._options, options); return this; }; BaseObservable2._captureInputs = function _captureInputs(block) { try { var capturedInputs = []; capturedInputFrames.push(capturedInputs); shouldCaptureNextInput = true; block(); return capturedInputs; } finally { capturedInputFrames.pop(); shouldCaptureNextInput = false; } }; _proto._addInput = function _addInput(input) { this._inputs.push(input); if (this._attachedToInputs) { this._attachToInput(input); } }; _proto._removeInput = function _removeInput(input) { this._inputs.splice(this._inputs.indexOf(input), 1); if (this._attachedToInputs) { this._detachFromInput(input); } }; _proto._shouldAttachToInputs = function _shouldAttachToInputs() { return this._listeners.length > 0 || this._outputs.length > 0; }; _proto._attachToInputs = function _attachToInputs() { if (!this._attachedToInputs && this._shouldAttachToInputs()) { this._attachedToInputs = true; this._val = this._evaluate(); this.onBecomeObserved(); plugins.onBecomeObserved(this); for (var _iterator = _createForOfIteratorHelperLoose(this._inputs), _step; !(_step = _iterator()).done; ) { var input = _step.value; this._attachToInput(input); input._attachToInputs(); } } }; _proto._detachFromInputs = function _detachFromInputs() { if (this._attachedToInputs && !this._shouldAttachToInputs()) { this._attachedToInputs = false; for (var _iterator2 = _createForOfIteratorHelperLoose(this._inputs), _step2; !(_step2 = _iterator2()).done; ) { var input = _step2.value; this._detachFromInput(input); input._detachFromInputs(); } this.onBecomeUnobserved(); plugins.onBecomeUnobserved(this); } }; _proto._attachToInput = function _attachToInput(input) { input._outputs.push(this); plugins.onAttach(this, input); }; _proto._detachFromInput = function _detachFromInput(input) { input._outputs.splice(input._outputs.indexOf(this), 1); plugins.onDetach(this, input); }; _proto._addToBatchRecursively = function _addToBatchRecursively() { if (this._prevVal === UNSET) { this._prevVal = this._val; for (var _iterator3 = _createForOfIteratorHelperLoose(this._outputs), _step3; !(_step3 = _iterator3()).done; ) { var output = _step3.value; output._addToBatchRecursively(); } batchedObservables.push(this); } }; BaseObservable2._batch = function _batch(block) { try { batchDepth++; if (batchDepth === 1 && batchedUpdater) { batchedUpdater(block); } else { block(); } } finally { batchDepth--; if (batchDepth === 0) { var observablesToUpdate = batchedObservables; batchedObservables = []; for (var i = observablesToUpdate.length - 1; i >= 0; i--) { var observable3 = observablesToUpdate[i]; var prevVal = observable3._prevVal; observable3._prevVal = UNSET; observable3._val = observable3._evaluate(); var val = observable3._val; if (val !== prevVal) { for (var _iterator4 = _createForOfIteratorHelperLoose(observable3._listeners.slice()), _step4; !(_step4 = _iterator4()).done; ) { var listener = _step4.value; listener(val, prevVal); } plugins.onChange(observable3, val, prevVal); } } } } }; BaseObservable2._use = function _use(plugin) { plugins.use(plugin); }; return BaseObservable2; }(); function memoize(func) { var lastArgs; var lastResult; return function(args) { var argsHaveChanged = false; if (!lastArgs || args.length !== lastArgs.length) { argsHaveChanged = true; } else { for (var i = 0; i < args.length; i++) { if (args[i] !== lastArgs[i]) { argsHaveChanged = true; break; } } } if (argsHaveChanged) { lastArgs = args; lastResult = func(args); } return lastResult; }; } function observable(val, options) { return new WritableObservable(val, options); } var Observable = /* @__PURE__ */ function(_BaseObservable) { _inheritsLoose(Observable2, _BaseObservable); function Observable2(val, options) { var _this; _this = _BaseObservable.call(this, val instanceof Observable2 ? val.get() : val, options) || this; _this.transform = _this.select; _this._updateValInput(val); return _this; } var _proto = Observable2.prototype; _proto._evaluate = function _evaluate() { return this._valInput ? this._valInput.get() : _BaseObservable.prototype._evaluate.call(this); }; _proto.select = function select(selector) { return new DerivedObservable([this], function(_ref) { var val = _ref[0]; return selector(val); }); }; _proto.onlyIf = function onlyIf(predicate) { var filteredVal = void 0; return this.select(function(val) { if (predicate(val)) { filteredVal = val; } return filteredVal; }); }; _proto["default"] = function _default(defaultVal) { return this.select(function(val) { return val != null ? val : defaultVal; }); }; _proto.as = function as() { return this; }; Observable2.select = function select(observables, selector) { return new DerivedObservable(observables, function(vals) { return selector.apply(void 0, vals); }); }; Observable2.from = function from() { for (var _len = arguments.length, observables = new Array(_len), _key = 0; _key < _len; _key++) { observables[_key] = arguments[_key]; } return new DerivedObservable(observables, function(values) { return values; }); }; Observable2.merge = function merge(observables) { return new DerivedObservable(observables, function(values) { return values; }); }; Observable2.latest = function latest() { var prevValues; for (var _len2 = arguments.length, observables = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { observables[_key2] = arguments[_key2]; } return new DerivedObservable(observables, function(values) { var val = !prevValues ? values[0] : values.find(function(it, index) { return it !== prevValues[index]; }); prevValues = values; return val; }); }; Observable2.compute = function compute(_compute) { return new ComputedObservable(_compute); }; Observable2.fromPromise = function fromPromise(promise, onError) { var obs = observable(void 0); promise.then(function(val) { return obs.set(val); }, function(e) { return onError && obs.set(onError(e)); }); return obs; }; _proto.toPromise = function toPromise() { var _this2 = this; return new Promise(function(resolve) { var unsubscribe = _this2.subscribe(function(val) { resolve(val); unsubscribe(); }); }); }; Observable2.batch = function batch(block) { BaseObservable._batch(block); }; Observable2.use = function use(plugin) { BaseObservable._use(plugin); }; _proto._updateValInput = function _updateValInput(val) { if (this._valInput !== val) { if (this._valInput) { this._removeInput(this._valInput); this._valInput = void 0; } if (val instanceof Observable2) { this._addInput(val); this._valInput = val; } } }; return Observable2; }(BaseObservable); var WritableObservable = /* @__PURE__ */ function(_Observable) { _inheritsLoose(WritableObservable2, _Observable); function WritableObservable2() { return _Observable.apply(this, arguments) || this; } var _proto2 = WritableObservable2.prototype; _proto2.set = function set(val) { var _this3 = this; this._updateValInput(val); Observable.batch(function() { return _this3._set(val instanceof Observable ? val.get() : val); }); }; _proto2.update = function update(updater) { this.set(updater(this.get())); }; _proto2.readOnly = function readOnly() { return this; }; return WritableObservable2; }(Observable); var DerivedObservable = /* @__PURE__ */ function(_Observable2) { _inheritsLoose(DerivedObservable2, _Observable2); function DerivedObservable2(computeInputs, compute) { var _this4; _this4 = _Observable2.call(this, void 0) || this; _this4._compute = memoize(compute); _this4._computeInputs = computeInputs; for (var _iterator = _createForOfIteratorHelperLoose(computeInputs), _step; !(_step = _iterator()).done; ) { var input = _step.value; _this4._addInput(input); } return _this4; } var _proto3 = DerivedObservable2.prototype; _proto3._evaluate = function _evaluate() { var computed = this._compute(this._computeInputs.map(function(input) { return input.get(); })); this._updateValInput(computed); return computed instanceof Observable ? computed.get() : computed; }; return DerivedObservable2; }(Observable); var ComputedObservable = /* @__PURE__ */ function(_Observable3) { _inheritsLoose(ComputedObservable2, _Observable3); function ComputedObservable2(compute) { var _this5; _this5 = _Observable3.call(this, void 0) || this; _this5._currentInputs = /* @__PURE__ */ new Set(); _this5._compute = compute; return _this5; } var _proto4 = ComputedObservable2.prototype; _proto4._evaluate = function _evaluate() { var _this6 = this; var value; var inputs = new Set(BaseObservable._captureInputs(function() { return value = _this6._compute(); })); inputs.forEach(function(input) { if (!_this6._currentInputs.has(input)) { _this6._addInput(input); } else { _this6._currentInputs["delete"](input); } }); this._currentInputs.forEach(function(input) { return _this6._removeInput(input); }); this._currentInputs = inputs; return value; }; return ComputedObservable2; }(Observable); function useObservable(observable3) { var _useState = useState({}), forceRender = _useState[1]; var val = observable3.get(); useLayoutEffect(function() { return observable3.subscribe(function() { return forceRender({}); }); }, [observable3]); return val; } // src/ui/util/Observable.ts function wrap(micro) { return Object.assign( function() { if (arguments.length === 1) return micro.set(arguments[0]); return micro.get(); }, { micro, select(selector) { return wrap( micro.select((val) => { const res = selector(val); return "micro" in res ? res.micro : res; }) ); } } ); } function observable2(value) { return wrap(observable(value)); } function useObservable2(observable3) { return useObservable( "micro" in observable3 ? observable3.micro : observable3 ); } export { observable2 as observable, useObservable2 as useObservable };