@meonode/ui
Version:
A structured approach to component composition, direct CSS-first prop styling, built-in theming, smart prop handling (including raw property pass-through), and dynamic children.
2 lines (1 loc) • 7.48 kB
JavaScript
;var e=require("react"),t=require("./helper/react-is.helper.cjs"),s=require("./helper/common.helper.cjs"),n=require("./components/styled-renderer.client.cjs"),r=require("./constant/common.const.cjs"),o=require("./util/mount-tracker.util.cjs"),i=require("./components/meonode-unmounter.client.cjs"),l=require("./util/navigation-cache-manager.util.cjs"),a=require("./util/node.util.cjs"),c=require("./util/server-emotion.util.cjs"),d=require("./util/server-theme.util.cjs"),h=require("./util/theme.util.cjs");const u=Symbol.for("@meonode/ui/BaseNode/elementCache"),m=Symbol.for("@meonode/ui/BaseNode/navigationStarted"),p=Symbol.for("@meonode/ui/BaseNode/renderContextPool"),g=Symbol.for("@meonode/ui/BaseNode/cacheCleanupRegistry");class y{static _idCounter=0;instanceId="m"+ ++y._idCounter;element;rawProps={};isBaseNode=!0;_props;_deps;stableKey;lastPropsObj;lastSignature;static get elementCache(){return s.getGlobalState(u,()=>new Map)}static get _navigationStarted(){return s.getGlobalState(m,()=>({value:!1})).value}static set _navigationStarted(e){s.getGlobalState(m,()=>({value:!1})).value=e}static get renderContextPool(){return s.getGlobalState(p,()=>[])}static acquireRenderContext(){const e=y.renderContextPool;return e.length>0?e.pop():{workStack:new Array(512),renderedElements:new Map}}static releaseRenderContext(e){y.renderContextPool.length<50&&e.workStack.length<2048&&(e.workStack.length=0,e.renderedElements.clear(),y.renderContextPool.push(e))}constructor(e,n={},r){if(!t.isValidElementType(e)){const t=s.getComponentType(e);if(a.NodeUtil.isNodeInstance(e))throw new Error("Invalid element type: MeoNode UI instance provided!");throw new Error(`Invalid element type: ${t} provided!`)}if(this.element=e,this.rawProps=n,this._deps=r,a.NodeUtil.isServer&&a.NodeUtil.providesServerTheme(e)){const e=n.theme;if(e&&"object"==typeof e&&"system"in e){const t=e;d.setActiveServerTheme(t),d.registerServerThemeVariables(t)}}const{ref:o,children:i,...c}=n;this.stableKey=this._getStableKey(c),a.NodeUtil.isServer||y._navigationStarted||(l.NavigationCacheManagerUtil.getInstance().start(),y._navigationStarted=!0)}get props(){return this._props||(this._props=a.NodeUtil.processProps(this.rawProps,this.stableKey)),this._props}get dependencies(){return this._deps}_getStableKey({key:e,...t}){if(a.NodeUtil.isServer)return;if(this.lastPropsObj===t)return this.lastSignature;this.lastPropsObj=t;const n=Object.keys(t),o=n.length;if(o>100){const e=a.NodeUtil.extractCriticalProps(t,n);this.lastSignature=a.NodeUtil.createPropSignature(this.element,e),r.__DEBUG__&&o>200&&console.warn(`MeoNode: Large props (${o} keys) on "${s.getElementTypeName(this.element)}". Consider splitting.`)}else this.lastSignature=a.NodeUtil.createPropSignature(this.element,t);return null!=e?`${String(e)}:${this.lastSignature}`:this.lastSignature}static get cacheCleanupRegistry(){return s.getGlobalState(g,()=>new FinalizationRegistry(e=>{const{cacheKey:t,instanceId:s}=e,n=y.elementCache.get(t);n?.instanceId===s&&y.elementCache.delete(t),o.MountTrackerUtil.isMounted(t)&&o.MountTrackerUtil.untrackMount(t)}))}render(r=!1){const o=a.NodeUtil.shouldCacheElement(this)?y.elementCache.get(this.stableKey):void 0,l=a.NodeUtil.shouldNodeUpdate(o?.prevDeps,this._deps,r);if(!l&&o?.renderedElement)return o.accessCount+=1,o.renderedElement;const u=!l,m=y.acquireRenderContext();let{workStack:p}=m;const{renderedElements:g}=m;let f=0;try{const r=e=>{if(e>p.length){const t=Math.max(e,p.length<<1),s=new Array(t);for(let e=0;e<f;e++)s[e]=p[e];p=s}};for(p[f++]={node:this,isProcessed:!1,blocked:u,theme:void 0};f>0;){const o=p[f-1];if(!o){f--;continue}const{node:i,isProcessed:l,blocked:u,theme:m}=o,C=(e,t)=>{const s=e.theme;return s&&"object"==typeof s&&"system"in s?s:t??d.getActiveServerTheme()};if(l){f--;const{children:r,key:o,css:l,nativeProps:u,disableEmotion:p,as:N,...v}=i.props,S=C(i.props,m);let b=i.element;null!=N&&t.isValidElementType(N)&&(b=N);let U=[];if(r){const e=Array.isArray(r)?r:[r],t=e.length;U=new Array(t);for(let s=0;s<t;s++){const t=e[s];if(a.NodeUtil.isNodeInstance(t)){const e=g.get(t);if(!e)throw new Error(`[MeoNode] Missing rendered element for child node: ${t.stableKey}`);U[s]=e}else U[s]=t}}const _=d.replaceThemeTokensWithCssVars({...v,key:o,...u});let E;if(i.element===e.Fragment||t.isFragment(i.element))E=e.createElement(i.element,{key:o},...U);else{const t=!p&&(l||!s.hasNoStyleTag(b))&&Object.keys(l||{}).length>0,r=a.NodeUtil.isServer&&"string"!=typeof b,o=t&&r&&a.NodeUtil.isClientReference(b);if(t&&!r||o){const t=a.NodeUtil.isServer?d.replaceThemeTokensWithCssVars(l):l;E=e.createElement(n.default,{element:b,..._,css:t},...U)}else if(t&&r&&!a.NodeUtil.acceptsServerCss(b)){const t=h.ThemeUtil.resolveObjWithTheme(d.replaceThemeTokensWithCssVars(l),S,{processFunctions:!0}),s=h.ThemeUtil.resolveDefaultStyle(t),n=c.compileServerEmotionClassName(s),r=[_.className,n].filter(Boolean).join(" ")||void 0,o=r?{..._,className:r}:_;E=e.createElement(b,o,...U)}else{const s=t&&(!r||a.NodeUtil.acceptsServerCss(b))?{..._,css:l}:_;E=e.createElement(b,s,...U)}}if(i!==this&&a.NodeUtil.shouldCacheElement(i)){const e=y.elementCache.get(i.stableKey);if(e)e.prevDeps=i._deps,e.renderedElement=E,e.accessCount+=1;else{const e={prevDeps:i._deps,renderedElement:E,nodeRef:new WeakRef(i),createdAt:Date.now(),accessCount:1,instanceId:i.instanceId};y.elementCache.set(i.stableKey,e),y.cacheCleanupRegistry.register(i,{cacheKey:i.stableKey,instanceId:i.instanceId},i)}}g.set(i,E)}else{o.isProcessed=!0;const e=i.props.children,t=C(i.props,m);if(e){const s=Array.isArray(e)?e:[e];let n=0;for(let e=0;e<s.length;e++)a.NodeUtil.isNodeInstance(s[e])&&n++;r(f+n);for(let e=s.length-1;e>=0;e--){const n=s[e];if(!a.NodeUtil.isNodeInstance(n))continue;const r=a.NodeUtil.shouldCacheElement(n)?y.elementCache.get(n.stableKey):void 0,o=a.NodeUtil.shouldNodeUpdate(r?.prevDeps,n._deps,u);if(!o&&r?.renderedElement){g.set(n,r.renderedElement);continue}const i=u||!o;p[f++]={node:n,isProcessed:!1,blocked:i,theme:t}}}}}let o=g.get(this);if(!a.NodeUtil.isServer&&this.stableKey&&(o=e.createElement(i.default,{node:this},o)),a.NodeUtil.shouldCacheElement(this)){const e=y.elementCache.get(this.stableKey);if(e)e.prevDeps=this._deps,e.renderedElement=o,e.accessCount+=1;else{const e={prevDeps:this._deps,renderedElement:o,nodeRef:new WeakRef(this),createdAt:Date.now(),accessCount:1,instanceId:this.instanceId};y.elementCache.set(this.stableKey,e),y.cacheCleanupRegistry.register(this,{cacheKey:this.stableKey,instanceId:this.instanceId},this)}}return o}finally{for(let e=0;e<f;e++)p[e]=null;y.releaseRenderContext({workStack:p,renderedElements:g})}}static clearCaches(){const e=Array.from(y.elementCache.keys());r.__DEBUG__&&console.log(`[MeoNode] clearCaches: Clearing ${e.length} entries`);for(const t of e){const e=y.elementCache.get(t);if(e){const s=e.nodeRef?.deref();if(s)try{y.cacheCleanupRegistry.unregister(s),s.lastSignature=void 0,s.lastPropsObj=void 0}catch{r.__DEBUG__&&console.warn(`[MeoNode] Could not unregister ${t} from FinalizationRegistry`)}}}y.elementCache.clear(),o.MountTrackerUtil.cleanup(),r.__DEBUG__&&console.log("[MeoNode] All caches cleared")}}function f(e,t={},s){return new y(e,t,s)}f.clearCaches=y.clearCaches,exports.BaseNode=y,exports.Node=f,exports.createChildrenFirstNode=function(e,t){const s=(s,n,r)=>f(e,{...t,...n,children:s},r);return s.element=e,s},exports.createNode=function(e,t){const s=(s,n)=>f(e,{...t,...s},n);return s.element=e,s};