UNPKG

@expressive/react

Version:
191 lines (184 loc) 5.88 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; 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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); 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 = __toESM(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, fallback, name) { if (context instanceof import_mvc.default) context = import_mvc.Context.get(context); const element = (0, import_react.createElement)(Lookup.Provider, { key: context.id, value: context, children }); return fallback !== void 0 ? (0, import_react.createElement)(import_react.Suspense, { fallback, name }, element) : element; } // 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( local, render(props, local), props.fallback || local.fallback, String(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 ready; let local; const instance = new this(argument); context.include(instance); const unwatch = (0, import_mvc3.createEffect)(instance, (current) => { local = current; if (ready) refresh(); }); function didMount() { ready = true; return () => { unwatch(); context.pop(); instance.set(null); }; } return (props) => { import_adapter.Pragma.useLifecycle(didMount); if (ready && repeat && props) { ready = false; if (typeof props == "function") { props.call(instance, instance); props = void 0; } const update = instance.set(props); if (update) update.then(() => ready = true); else ready = 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) => { const instance = context.get(this); if (!instance) if (argument === false) return () => void 0; else throw new Error(`Could not find ${this} in context.`); let ready; let value; const unwatch = (0, import_mvc4.createEffect)(instance, (current) => { if (typeof argument === "function") { const next = argument.call(current, current, update); if (next === value) return; value = next; } else value = current; if (ready) 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; } ; function update(action) { if (typeof action == "function") action = action(); refresh(); if (action) return action.finally(refresh); } function didMount() { ready = true; return unwatch; } return () => { import_adapter2.Pragma.useLifecycle(didMount); 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