UNPKG

@expressive/react

Version:
168 lines (161 loc) 4.9 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/adapter.ts var adapter_exports = {}; __export(adapter_exports, { Pragma: () => Pragma3 }); module.exports = __toCommonJS(adapter_exports); // src/model.as.ts var import_mvc2 = require("@expressive/mvc"); // src/context.ts var import_mvc = require("@expressive/mvc"); var import_react = require("react"); var Lookup = (0, import_react.createContext)(new import_mvc.Context()); import_mvc.Context.use = (create) => { const ambient = (0, import_react.useContext)(Lookup); return create ? (0, import_react.useMemo)(() => ambient.push(), []) : ambient; }; function createProvider(context, children) { return (0, import_react.createElement)(Lookup.Provider, { key: context.id, value: context, children }); } // src/model.as.ts import_mvc2.Model.as = function(render) { if (this === import_mvc2.Model) throw new Error("Cannot create component from base Model."); const Component = (props) => { const local = this.use((self) => { self.set(props); if (props.is) return props.is(self); }); local.set(props); return createProvider(import_mvc.Context.get(local), render(props, local)); }; Component.Model = this; Component.displayName = this.name; return Component; }; // src/model.use.ts var import_mvc3 = require("@expressive/mvc"); var import_adapter = require("./adapter"); import_mvc3.Model.use = function(argument, repeat) { const context = import_mvc3.Context.use(true); const render = import_adapter.Pragma.useFactory((refresh) => { let enabled; let local; const instance = new this(argument); context.include(instance); const unwatch = instance.get((current) => { local = current; if (enabled) refresh(); }); function didMount() { enabled = true; return () => { unwatch(); context.pop(); instance.set(null); }; } return (props) => { import_adapter.Pragma.useLifecycle(didMount); if (enabled && repeat && props) { enabled = false; if (typeof props == "function") { props.call(instance, instance); props = void 0; } const update = instance.set(props); if (update) update.then(() => enabled = true); else enabled = true; } return local; }; }); return render(argument); }; // src/model.get.ts var import_mvc4 = require("@expressive/mvc"); var import_adapter2 = require("./adapter"); import_mvc4.Model.get = function(argument) { const context = import_adapter2.Pragma.useContext(); const render = import_adapter2.Pragma.useFactory((refresh) => { function forceUpdate(action) { if (typeof action == "function") action = action(); refresh(); if (action) return action.finally(refresh); } const instance = context.get(this); if (!instance) if (argument === false) return () => void 0; else throw new Error(`Could not find ${this} in context.`); let unwatch; let value; unwatch = (0, import_mvc4.createEffect)(instance, (current) => { if (typeof argument === "function") { const next = argument.call(current, current, forceUpdate); if (next === value) return; value = next; } else value = current; if (unwatch) refresh(); }, argument === true); if (value instanceof Promise) { let error; unwatch(); value.then((x) => value = x, (e) => error = e).finally(refresh); value = null; return () => { if (error) throw error; return value === void 0 ? null : value; }; } if (value === null) { unwatch(); return () => null; } return () => { import_adapter2.Pragma.useLifecycle(() => unwatch); return value === void 0 ? null : value; }; }); return render(); }; // src/adapter.ts var Pragma3 = {}; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Pragma }); //# sourceMappingURL=adapter.js.map