@meonode/ui 0.4.5 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -5
- package/dist/components/meonode-unmounter.client.d.ts +19 -0
- package/dist/components/meonode-unmounter.client.d.ts.map +1 -0
- package/dist/components/meonode-unmounter.client.js +13 -0
- package/dist/components/registry.client.d.ts +9 -1
- package/dist/components/registry.client.d.ts.map +1 -1
- package/dist/components/registry.client.js +14 -1
- package/dist/components/styled-renderer.client.d.ts.map +1 -1
- package/dist/components/styled-renderer.client.js +2 -2
- package/dist/constants/common.const.d.ts +2 -1
- package/dist/constants/common.const.d.ts.map +1 -1
- package/dist/constants/common.const.js +1 -1
- package/dist/core.node.d.ts +43 -125
- package/dist/core.node.d.ts.map +1 -1
- package/dist/core.node.js +51 -186
- package/dist/helper/common.helper.d.ts +1 -1
- package/dist/helper/common.helper.d.ts.map +1 -1
- package/dist/hoc/component.hoc.js +2 -2
- package/dist/main.d.ts +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +3 -2
- package/dist/types/node.type.d.ts +3 -17
- package/dist/types/node.type.d.ts.map +1 -1
- package/dist/util/mount-tracker.util.d.ts +26 -0
- package/dist/util/mount-tracker.util.d.ts.map +1 -0
- package/dist/util/mount-tracker.util.js +15 -0
- package/dist/util/navigation-cache-manager.util.d.ts +36 -0
- package/dist/util/navigation-cache-manager.util.d.ts.map +1 -0
- package/dist/util/navigation-cache-manager.util.js +19 -0
- package/dist/util/node.util.d.ts +155 -0
- package/dist/util/node.util.d.ts.map +1 -0
- package/dist/util/node.util.js +172 -0
- package/dist/util/theme.util.d.ts +108 -0
- package/dist/util/theme.util.d.ts.map +1 -0
- package/dist/util/theme.util.js +117 -0
- package/package.json +5 -2
- package/dist/helper/mount-tracker.helper.d.ts +0 -16
- package/dist/helper/mount-tracker.helper.d.ts.map +0 -1
- package/dist/helper/mount-tracker.helper.js +0 -8
- package/dist/helper/navigation-cache-manager.helper.d.ts +0 -38
- package/dist/helper/navigation-cache-manager.helper.d.ts.map +0 -1
- package/dist/helper/navigation-cache-manager.helper.js +0 -34
- package/dist/helper/node.helper.d.ts +0 -70
- package/dist/helper/node.helper.d.ts.map +0 -1
- package/dist/helper/node.helper.js +0 -112
- package/dist/helper/safe-cache-manager.helper.d.ts +0 -21
- package/dist/helper/safe-cache-manager.helper.d.ts.map +0 -1
- package/dist/helper/safe-cache-manager.helper.js +0 -33
- package/dist/helper/theme.helper.d.ts +0 -15
- package/dist/helper/theme.helper.d.ts.map +0 -1
- package/dist/helper/theme.helper.js +0 -16
package/CHANGELOG.md
CHANGED
|
@@ -2,18 +2,48 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
## [0.4.7] - 2025-11-17
|
|
6
|
+
|
|
7
|
+
### Fixes
|
|
8
|
+
- **core/cache:** optimize navigation cache debounce timing and enhance stableKey handling ([`fff6f207`](https://github.com/l7aromeo/meonode-ui/commit/fff6f2070a06cc5ad461a2f992b111fb957fae6f))
|
|
9
|
+
- Adjust navigation cleanup debounce duration dynamically based on cache size for better performance.
|
|
10
|
+
- Change stableKey and _lastSignature to be optional to better represent their possible undefined state.
|
|
11
|
+
- Refactor _getStableKey to return undefined on server instead of empty string.
|
|
12
|
+
- Optimize critical props extraction by introducing NodeUtil.extractCriticalProps helper.
|
|
13
|
+
- Improve client-side caching logic to avoid lookups when stableKey is absent.
|
|
14
|
+
- Remove unused imports and redundant code in node.util.ts; improve shallowEqual implementation.
|
|
15
|
+
- Update createPropSignature to return undefined on server and use getElementTypeName directly.
|
|
16
|
+
- Add detailed comments and refine hashString combining FNV-1a and djb2 hashes for robustness.
|
|
17
|
+
|
|
18
|
+
## [0.4.6] - 2025-11-17
|
|
19
|
+
|
|
20
|
+
### Fixes
|
|
21
|
+
- **core/cache:** enhance memoization & caching system to prevent memory leaks and ensure safe lifecycle management ([`253d7d00`](https://github.com/l7aromeo/meonode-ui/commit/253d7d006121dc588a51580d5120c7123a5f8777))
|
|
22
|
+
This introduces a robust, three-layered cleanup strategy to ensure cache integrity:
|
|
23
|
+
1. An immediate, lifecycle-driven cleanup via the new `MeoNodeUnmounter` component.
|
|
24
|
+
2. A debounced, event-driven cleanup for SPA navigations via `NavigationCacheManagerUtil`.
|
|
25
|
+
3. A final, GC-driven safety net using the `FinalizationRegistry` API.
|
|
26
|
+
|
|
27
|
+
### Refactor
|
|
28
|
+
- **core:** migrate core logic from `src/helper/` to a new `src/util/` directory for better separation of concerns.
|
|
29
|
+
- **core:** extract internal utility functions from `core.node.ts` into `node.util.ts`.
|
|
30
|
+
- **core:** make internal caches on `BaseNode` public to support the new externalized management architecture.
|
|
31
|
+
|
|
32
|
+
### Chore
|
|
33
|
+
- **tooling:** enable TypeScript's `strict: true` mode and update codebase to be fully compliant.
|
|
34
|
+
- **tooling:** add CommonJS (`require`) exports to `package.json` for improved module compatibility.
|
|
35
|
+
- **tooling:** add `NODE_OPTIONS='--expose-gc'` to the test script to allow for explicit garbage collection during tests.
|
|
36
|
+
- **tests:** refine test suite by standardizing `afterEach` hooks and updating memoization tests to directly validate internal caching.
|
|
7
37
|
|
|
8
38
|
## [0.4.5] - 2025-11-15
|
|
9
39
|
|
|
10
40
|
### Feat
|
|
11
|
-
- **cache**: implement robust cache management and theme caching ([`
|
|
41
|
+
- **cache**: implement robust cache management and theme caching ([`9ed749f6`](https://github.com/l7aromeo/meonode-ui/commit/9ed749f6d877fdc8b6a736788add13225b07dd63))
|
|
12
42
|
Refactor NavigationCacheManager for robustness, add memory monitoring and auto-cleanup.
|
|
13
43
|
Implement LRU eviction for ThemeResolverCache and integrate with BaseNode cache clearing.
|
|
14
44
|
|
|
15
45
|
### Refactor
|
|
16
|
-
- **test**: split node.test.ts into smaller, more focused test files ([`
|
|
46
|
+
- **test**: split node.test.ts into smaller, more focused test files ([`930f998e`](https://github.com/l7aromeo/meonode-ui/commit/930f998e5f91faef3ff42fcafc6b02fc23f422ff))
|
|
17
47
|
This commit refactors the test suite by splitting the monolithic `node.test.ts`
|
|
18
48
|
file into several smaller, more focused test files, each covering a specific
|
|
19
49
|
aspect of the BaseNode functionality.
|
|
@@ -28,7 +58,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
28
58
|
- **core**: pass disableEmotion flag to _renderProcessedNode for improved processing ([`b68e3d4`](https://github.com/l7aromeo/meonode-ui/commit/b68e3d49a732ee590805a0298f733b800a9b172d))
|
|
29
59
|
|
|
30
60
|
### Chore
|
|
31
|
-
- **test**: adjust performance test cleanup by removing cache clearing from afterEach ([`
|
|
61
|
+
- **test**: adjust performance test cleanup by removing cache clearing from afterEach ([`f72cea5e`](https://github.com/l7aromeo/meonode-ui/commit/f72cea5ef983fdaba012a7d446b58c7da06f5e1a))
|
|
32
62
|
|
|
33
63
|
## [0.4.4] - 2025-11-15
|
|
34
64
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* `MeoNodeUnmounter` is a client-side React component responsible for cleaning up
|
|
4
|
+
* resources associated with a rendered node when it unmounts.
|
|
5
|
+
*
|
|
6
|
+
* It uses a `useEffect` hook to register a cleanup function that runs when the component
|
|
7
|
+
* unmounts or when its `stableKey` changes. The cleanup function checks if the node
|
|
8
|
+
* identified by `stableKey` is currently tracked as mounted. If it is, it removes
|
|
9
|
+
* the node from `BaseNode.elementCache` and untracks its mount status using `MountTrackerUtil`.
|
|
10
|
+
* @param {object} props The component's props.
|
|
11
|
+
* @param {string} props.stableKey A unique identifier for the rendered node.
|
|
12
|
+
* @param {ReactNode} [props.children] The children to be rendered by this component.
|
|
13
|
+
* @returns {ReactNode} The `children` passed to the component.
|
|
14
|
+
*/
|
|
15
|
+
export default function MeoNodeUnmounter({ stableKey, children }: {
|
|
16
|
+
stableKey: string;
|
|
17
|
+
children?: ReactNode;
|
|
18
|
+
}): ReactNode;
|
|
19
|
+
//# sourceMappingURL=meonode-unmounter.client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meonode-unmounter.client.d.ts","sourceRoot":"","sources":["../../src/components/meonode-unmounter.client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,OAAO,CAAA;AAIjE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAaxH"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";import{useEffect,useEffectEvent}from"react";import{MountTrackerUtil}from"../util/mount-tracker.util.js";import{BaseNode}from"../core.node.js";/**
|
|
2
|
+
* `MeoNodeUnmounter` is a client-side React component responsible for cleaning up
|
|
3
|
+
* resources associated with a rendered node when it unmounts.
|
|
4
|
+
*
|
|
5
|
+
* It uses a `useEffect` hook to register a cleanup function that runs when the component
|
|
6
|
+
* unmounts or when its `stableKey` changes. The cleanup function checks if the node
|
|
7
|
+
* identified by `stableKey` is currently tracked as mounted. If it is, it removes
|
|
8
|
+
* the node from `BaseNode.elementCache` and untracks its mount status using `MountTrackerUtil`.
|
|
9
|
+
* @param {object} props The component's props.
|
|
10
|
+
* @param {string} props.stableKey A unique identifier for the rendered node.
|
|
11
|
+
* @param {ReactNode} [props.children] The children to be rendered by this component.
|
|
12
|
+
* @returns {ReactNode} The `children` passed to the component.
|
|
13
|
+
*/export default function MeoNodeUnmounter(a){var b=a.stableKey,c=a.children,d=useEffectEvent(function(){MountTrackerUtil.mountedNodes.has(b)&&(BaseNode.elementCache["delete"](b),MountTrackerUtil.untrackMount(b))});return useEffect(function(){return function(){return d()}},[]),c}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { type ReactElement } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Style registry for Emotion to support SSR/streaming in Next.js App Router.
|
|
4
|
+
*
|
|
5
|
+
* - Creates a single Emotion cache instance in compat mode.
|
|
6
|
+
* - Uses `useServerInsertedHTML` to inline critical CSS collected during render.
|
|
7
|
+
* @param children React subtree that consumes Emotion styles.
|
|
8
|
+
* @returns React element that provides the cache and injects critical CSS during SSR.
|
|
9
|
+
*/
|
|
2
10
|
export default function StyleRegistry({ children }: {
|
|
3
11
|
children: ReactElement;
|
|
4
|
-
}): ReactElement<
|
|
12
|
+
}): ReactElement<import("../main").FinalNodeProps, string | import("react").JSXElementConstructor<any>>;
|
|
5
13
|
//# sourceMappingURL=registry.client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.client.d.ts","sourceRoot":"","sources":["../../src/components/registry.client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.client.d.ts","sourceRoot":"","sources":["../../src/components/registry.client.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,YAAY,EAAY,MAAM,OAAO,CAAA;AAWlE;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,YAAY,CAAA;CAAE,yGA4B7E"}
|
|
@@ -1 +1,14 @@
|
|
|
1
|
-
"use client";function _slicedToArray(a,b){return _arrayWithHoles(a)||_iterableToArrayLimit(a,b)||_unsupportedIterableToArray(a,b)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(b,c){if(b){if("string"==typeof b)return _arrayLikeToArray(b,c);var a={}.toString.call(b).slice(8,-1);return"Object"===a&&b.constructor&&(a=b.constructor.name),"Map"===a||"Set"===a?Array.from(b):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?_arrayLikeToArray(b,c):void 0}}function _arrayLikeToArray(b,c){(null==c||c>b.length)&&(c=b.length);for(var d=0,f=Array(c);d<c;d++)f[d]=b[d];return f}function _iterableToArrayLimit(b,c){var d=null==b?null:"undefined"!=typeof Symbol&&b[Symbol.iterator]||b["@@iterator"];if(null!=d){var g,h,j,k,l=[],a=!0,m=!1;try{if(j=(d=d.call(b)).next,0===c){if(Object(d)!==d)return;a=!1}else for(;!(a=(g=j.call(d)).done)&&(l.push(g.value),l.length!==c);a=!0);}catch(a){m=!0,h=a}finally{try{if(!a&&null!=d["return"]&&(k=d["return"](),Object(k)!==k))return}finally{if(m)throw h}}return l}}function _arrayWithHoles(a){if(Array.isArray(a))return a}import{createElement,useState}from"react";import{CacheProvider}from"@emotion/react";import createCache from"@emotion/cache";import{Node}from"../core.node.js";import{useServerInsertedHTML}from"next/navigation.js"
|
|
1
|
+
"use client";function _slicedToArray(a,b){return _arrayWithHoles(a)||_iterableToArrayLimit(a,b)||_unsupportedIterableToArray(a,b)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(b,c){if(b){if("string"==typeof b)return _arrayLikeToArray(b,c);var a={}.toString.call(b).slice(8,-1);return"Object"===a&&b.constructor&&(a=b.constructor.name),"Map"===a||"Set"===a?Array.from(b):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?_arrayLikeToArray(b,c):void 0}}function _arrayLikeToArray(b,c){(null==c||c>b.length)&&(c=b.length);for(var d=0,f=Array(c);d<c;d++)f[d]=b[d];return f}function _iterableToArrayLimit(b,c){var d=null==b?null:"undefined"!=typeof Symbol&&b[Symbol.iterator]||b["@@iterator"];if(null!=d){var g,h,j,k,l=[],a=!0,m=!1;try{if(j=(d=d.call(b)).next,0===c){if(Object(d)!==d)return;a=!1}else for(;!(a=(g=j.call(d)).done)&&(l.push(g.value),l.length!==c);a=!0);}catch(a){m=!0,h=a}finally{try{if(!a&&null!=d["return"]&&(k=d["return"](),Object(k)!==k))return}finally{if(m)throw h}}return l}}function _arrayWithHoles(a){if(Array.isArray(a))return a}import{createElement,useState}from"react";import{CacheProvider}from"@emotion/react";import createCache from"@emotion/cache";import{Node}from"../core.node.js";import{useServerInsertedHTML}from"next/navigation.js";// Emotion cache setup
|
|
2
|
+
function createEmotionCache(){return createCache({key:"meonode-css"})}/**
|
|
3
|
+
* Style registry for Emotion to support SSR/streaming in Next.js App Router.
|
|
4
|
+
*
|
|
5
|
+
* - Creates a single Emotion cache instance in compat mode.
|
|
6
|
+
* - Uses `useServerInsertedHTML` to inline critical CSS collected during render.
|
|
7
|
+
* @param children React subtree that consumes Emotion styles.
|
|
8
|
+
* @returns React element that provides the cache and injects critical CSS during SSR.
|
|
9
|
+
*/export default function StyleRegistry(a){var b=a.children,c=useState(function(){var a=createEmotionCache();return a.compat=!0,a}),d=_slicedToArray(c,1),e=d[0];// Lazily create a single Emotion cache; enable compat for SSR/legacy Emotion APIs.
|
|
10
|
+
// During server rendering, collect styles inserted into the cache and inline them in the HTML.
|
|
11
|
+
// Provide the Emotion cache to descendants.
|
|
12
|
+
return useServerInsertedHTML(function(){// Ensure deterministic output by sorting ids.
|
|
13
|
+
var a=Object.keys(e.inserted).sort(),b=a.map(function(a){return e.inserted[a]}).join(""),c=a.join(" ");return b?createElement("style",{"data-emotion":"".concat(e.key," ").concat(c),dangerouslySetInnerHTML:{__html:b}}):null;// Insert a single style tag with the tracked Emotion ids.
|
|
14
|
+
}),Node(CacheProvider,{value:e,children:b}).render()}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styled-renderer.client.d.ts","sourceRoot":"","sources":["../../src/components/styled-renderer.client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"styled-renderer.client.d.ts","sourceRoot":"","sources":["../../src/components/styled-renderer.client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAc,MAAM,OAAO,CAAA;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAInE,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,WAAW;IACxD,OAAO,EAAE,CAAC,CAAA;IACV,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,GAAG,EAAE,OAAO,CAAA;CACb;AAED;;;;;;;;;GASG;AACH,iBAAwB,cAAc,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAChG,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,OAAO,CAoB/C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use client";var _excluded=["element","children"],_excluded2=["css"];function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==_typeof(b)?b:b+""}function _toPrimitive(a,b){if("object"!=_typeof(a)||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=_typeof(d))return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&{}.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function _objectWithoutPropertiesLoose(a,b){if(null==a)return{};var c={};for(var d in a)if({}.hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}import{useContext}from"react";import{jsx}from"@emotion/react";import{
|
|
1
|
+
"use client";var _excluded=["element","children"],_excluded2=["css"];function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==_typeof(b)?b:b+""}function _toPrimitive(a,b){if("object"!=_typeof(a)||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=_typeof(d))return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&{}.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function _objectWithoutPropertiesLoose(a,b){if(null==a)return{};var c={};for(var d in a)if({}.hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}import{useContext}from"react";import{jsx}from"@emotion/react";import{ThemeContext}from"./theme-provider.client.js";import{ThemeUtil}from"../util/theme.util.js";/**
|
|
2
2
|
* A client-side component that renders a styled element using Emotion.
|
|
3
3
|
* It resolves theme values and applies default styles.
|
|
4
4
|
* @template E The type of the HTML element to render.
|
|
@@ -7,4 +7,4 @@
|
|
|
7
7
|
* @param children Optional children to be rendered inside the element.
|
|
8
8
|
* @param props
|
|
9
9
|
* @returns {JSX.Element} The rendered JSX element.
|
|
10
|
-
*/export default function StyledRenderer(a){var b=a.element,c=a.children,d=_objectWithoutProperties(a,_excluded),e=useContext(ThemeContext),f=null===e||void 0===e?void 0:e.theme,g=d.css,h=_objectWithoutProperties(d,_excluded2),i=g,j=h;f&&(i=resolveObjWithTheme(g,f,{processFunctions:!0}),j=resolveObjWithTheme(h,f,{processFunctions:!1}));var k=resolveDefaultStyle(i);return jsx(b,_objectSpread(_objectSpread({},j),{},{css:k}),c)}StyledRenderer.displayName="Styled";
|
|
10
|
+
*/export default function StyledRenderer(a){var b=a.element,c=a.children,d=_objectWithoutProperties(a,_excluded),e=useContext(ThemeContext),f=null===e||void 0===e?void 0:e.theme,g=d.css,h=_objectWithoutProperties(d,_excluded2),i=g,j=h;f&&(i=ThemeUtil.resolveObjWithTheme(g,f,{processFunctions:!0}),j=ThemeUtil.resolveObjWithTheme(h,f,{processFunctions:!1}));var k=ThemeUtil.resolveDefaultStyle(i);return jsx(b,_objectSpread(_objectSpread({},j),{},{css:k}),c)}StyledRenderer.displayName="Styled";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const NO_STYLE_TAGS: readonly ["html", "head", "meta", "link", "script", "style", "noscript", "template", "slot", "base", "param", "source", "track", "wbr", "embed", "object", "iframe", "frame", "frameset", "applet", "bgsound", "noembed", "noframes"];
|
|
2
2
|
export declare const noStyleTagsSet: Set<"applet" | "base" | "bgsound" | "embed" | "frame" | "frameset" | "head" | "html" | "iframe" | "link" | "meta" | "noembed" | "noframes" | "noscript" | "object" | "param" | "script" | "slot" | "source" | "style" | "template" | "track" | "wbr">;
|
|
3
3
|
export type NO_STYLE_TAGS = typeof NO_STYLE_TAGS;
|
|
4
|
-
export declare
|
|
4
|
+
export declare let __DEBUG__: boolean;
|
|
5
|
+
export declare function setDebugMode(enabled: boolean): void;
|
|
5
6
|
//# sourceMappingURL=common.const.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.const.d.ts","sourceRoot":"","sources":["../../src/constants/common.const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,uOAwBhB,CAAA;AAEV,eAAO,MAAM,cAAc,uPAAyB,CAAA;AACpD,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA;AAEhD,eAAO,
|
|
1
|
+
{"version":3,"file":"common.const.d.ts","sourceRoot":"","sources":["../../src/constants/common.const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,uOAwBhB,CAAA;AAEV,eAAO,MAAM,cAAc,uPAAyB,CAAA;AACpD,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA;AAEhD,eAAO,IAAI,SAAS,SAAQ,CAAA;AAE5B,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,QAK5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export var NO_STYLE_TAGS=["html","head","meta","link","script","style","noscript","template","slot","base","param","source","track","wbr","embed","object","iframe","frame","frameset","applet","bgsound","noembed","noframes"];export var noStyleTagsSet=new Set(NO_STYLE_TAGS);export var
|
|
1
|
+
export var NO_STYLE_TAGS=["html","head","meta","link","script","style","noscript","template","slot","base","param","source","track","wbr","embed","object","iframe","frame","frameset","applet","bgsound","noembed","noframes"];export var noStyleTagsSet=new Set(NO_STYLE_TAGS);export var __DEBUG__=!1;export function setDebugMode(a){__DEBUG__=a,__DEBUG__&&console.log("[MeoNode] Debug mode enabled.")}
|
package/dist/core.node.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReactElement } from 'react';
|
|
2
|
-
import type { Children, FinalNodeProps, HasRequiredProps, MergedProps, NodeElementType, NodeInstance, NodePortal, NodeProps, PropsOf, DependencyList, ElementCacheEntry } from './types/node.type.js';
|
|
2
|
+
import type { Children, FinalNodeProps, HasRequiredProps, MergedProps, NodeElementType, NodeInstance, NodePortal, NodeProps, PropProcessingCache, PropsOf, DependencyList, ElementCacheEntry } from './types/node.type.js';
|
|
3
3
|
/**
|
|
4
4
|
* The core abstraction of the MeoNode library. It wraps a React element or component,
|
|
5
5
|
* providing a unified interface for processing props, normalizing children, and handling styles.
|
|
@@ -8,26 +8,19 @@ import type { Children, FinalNodeProps, HasRequiredProps, MergedProps, NodeEleme
|
|
|
8
8
|
* @class BaseNode
|
|
9
9
|
* @template E - The type of React element or component this node represents.
|
|
10
10
|
*/
|
|
11
|
-
export declare class BaseNode<E extends NodeElementType>
|
|
11
|
+
export declare class BaseNode<E extends NodeElementType> {
|
|
12
|
+
instanceId: string;
|
|
12
13
|
element: E;
|
|
13
14
|
rawProps: Partial<NodeProps<E>>;
|
|
14
15
|
readonly isBaseNode: boolean;
|
|
15
16
|
private _props?;
|
|
16
17
|
private readonly _deps?;
|
|
17
|
-
|
|
18
|
-
private static _isServer;
|
|
19
|
-
private static _propProcessingCache;
|
|
20
|
-
private static _isValidElement;
|
|
21
|
-
private static _isStyleProp;
|
|
22
|
-
static _elementCache: Map<string, ElementCacheEntry>;
|
|
23
|
-
private static _portalInfrastructure;
|
|
24
|
-
private static readonly CACHE_SIZE_LIMIT = 500;
|
|
25
|
-
private static readonly CACHE_CLEANUP_BATCH = 50;
|
|
18
|
+
stableKey?: string;
|
|
26
19
|
private _lastPropsRef;
|
|
27
|
-
private _lastSignature
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
private _lastSignature?;
|
|
21
|
+
static elementCache: Map<string, ElementCacheEntry>;
|
|
22
|
+
static propProcessingCache: Map<string, PropProcessingCache>;
|
|
23
|
+
static scheduledCleanup: boolean;
|
|
31
24
|
private static _navigationStarted;
|
|
32
25
|
constructor(element: E, rawProps?: Partial<NodeProps<E>>, deps?: DependencyList);
|
|
33
26
|
/**
|
|
@@ -45,34 +38,6 @@ export declare class BaseNode<E extends NodeElementType> implements NodeInstance
|
|
|
45
38
|
* @getter deps
|
|
46
39
|
*/
|
|
47
40
|
get dependencies(): DependencyList | undefined;
|
|
48
|
-
/**
|
|
49
|
-
* FNV-1a hash function.
|
|
50
|
-
* @method _fnv1aHash
|
|
51
|
-
*/
|
|
52
|
-
private static _fnv1aHash;
|
|
53
|
-
/**
|
|
54
|
-
* djb2 hash function.
|
|
55
|
-
* @method _djb2Hash
|
|
56
|
-
*/
|
|
57
|
-
private static _djb2Hash;
|
|
58
|
-
/**
|
|
59
|
-
* Combines FNV-1a and djb2 hash functions for a more robust signature.
|
|
60
|
-
* @method _hashString
|
|
61
|
-
*/
|
|
62
|
-
private static _hashString;
|
|
63
|
-
/**
|
|
64
|
-
* Performs a shallow equality check between two objects.
|
|
65
|
-
* @method _shallowEqual
|
|
66
|
-
*/
|
|
67
|
-
private _shallowEqual;
|
|
68
|
-
/**
|
|
69
|
-
* Generates a stable identifier for the given element type.
|
|
70
|
-
* For primitive types (strings), it returns the string itself.
|
|
71
|
-
* For component types (functions, classes, exotic components), it generates
|
|
72
|
-
* and caches a unique ID using a WeakMap to ensure stability across calls.
|
|
73
|
-
* @method _getStableElementId
|
|
74
|
-
*/
|
|
75
|
-
private static _getStableElementId;
|
|
76
41
|
/**
|
|
77
42
|
* Generates or returns a cached signature representing the props shape and values.
|
|
78
43
|
* The signature is used as a stable key for caching prop-derived computations (e.g. CSS extraction).
|
|
@@ -81,85 +46,45 @@ export declare class BaseNode<E extends NodeElementType> implements NodeInstance
|
|
|
81
46
|
* containing only style-related keys, event handlers, className/css and a `_keyCount` to avoid
|
|
82
47
|
* expensive serialization of huge objects while still retaining reasonable cache discrimination.
|
|
83
48
|
* - Stores the last props reference and computed signature to speed up repeated calls with the same object.
|
|
49
|
+
* @param key Key passed for prefix if exist
|
|
84
50
|
* @param props The props object to create a signature for.
|
|
85
51
|
* @returns A compact string signature suitable for use as a cache key.
|
|
86
52
|
*/
|
|
87
|
-
private
|
|
88
|
-
/**
|
|
89
|
-
* Creates a unique, stable signature from the element type and props.
|
|
90
|
-
* This signature includes the element's type to prevent collisions between different components
|
|
91
|
-
* and handles primitive values in arrays and objects for better caching.
|
|
92
|
-
* @method _createPropSignature
|
|
93
|
-
*/
|
|
94
|
-
private static _createPropSignature;
|
|
95
|
-
/**
|
|
96
|
-
* Retrieves computed CSS props from the cache with LRU tracking.
|
|
97
|
-
* Access time and hit count are tracked for smarter eviction.
|
|
98
|
-
* @method _getCachedCssProps
|
|
99
|
-
*/
|
|
100
|
-
private static _getCachedCssProps;
|
|
101
|
-
/**
|
|
102
|
-
* Implements an LRU eviction strategy that removes multiple entries at once.
|
|
103
|
-
* It uses a scoring system where older and less frequently used entries have a higher eviction priority.
|
|
104
|
-
* @method _evictLRUEntries
|
|
105
|
-
*/
|
|
106
|
-
private static _evictLRUEntries;
|
|
53
|
+
private _getStableKey;
|
|
107
54
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
|
|
111
|
-
private _processProps;
|
|
112
|
-
/**
|
|
113
|
-
* Determines if a node should update based on its dependency array.
|
|
114
|
-
* Uses a shallow comparison, similar to React's `useMemo` and `useCallback`.
|
|
115
|
-
* @method _shouldNodeUpdate
|
|
116
|
-
*/
|
|
117
|
-
private static _shouldNodeUpdate;
|
|
118
|
-
/**
|
|
119
|
-
* Processes the `children` prop of a node. It handles single children, arrays of children,
|
|
120
|
-
* and function-as-a-child render props, passing them to `_processRawNode` for normalization.
|
|
121
|
-
* @method _processChildren
|
|
122
|
-
*/
|
|
123
|
-
private _processChildren;
|
|
124
|
-
/**
|
|
125
|
-
* The core normalization function for a single child. It takes any valid `NodeElement`
|
|
126
|
-
* (primitive, React element, function, `BaseNode` instance) and converts it into a standardized `BaseNode`
|
|
127
|
-
* instance if it isn't one already. This ensures a consistent structure for the iterative renderer.
|
|
128
|
-
* @method _processRawNode
|
|
129
|
-
*/
|
|
130
|
-
private static _processRawNode;
|
|
131
|
-
/**
|
|
132
|
-
* A helper to reliably identify if a given function is a "function-as-a-child" (render prop)
|
|
133
|
-
* rather than a standard Function Component.
|
|
134
|
-
* @method _isFunctionChild
|
|
135
|
-
*/
|
|
136
|
-
private static _isFunctionChild;
|
|
137
|
-
/**
|
|
138
|
-
* A special internal React component used to render "function-as-a-child" (render prop) patterns.
|
|
139
|
-
* When a `BaseNode` receives a function as its `children` prop, it wraps that function
|
|
140
|
-
* inside this `_functionRenderer` component. This component then executes the render function
|
|
141
|
-
* and processes its return value, normalizing it into a renderable ReactNode.
|
|
55
|
+
* FinalizationRegistry for cleaning up `elementCache` entries when the associated `BaseNode` instance
|
|
56
|
+
* is garbage-collected. This helps prevent memory leaks by ensuring that cache entries for
|
|
57
|
+
* unreferenced nodes are eventually removed.
|
|
142
58
|
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
* @
|
|
146
|
-
* @param {Object} props The properties passed to the renderer.
|
|
147
|
-
* @param {Function} props.render The function-as-a-child to execute.
|
|
148
|
-
* @param {boolean} [props.disableEmotion] Inherited flag to disable Emotion styling for children.
|
|
149
|
-
* @returns {ReactNode | null | undefined} The processed and rendered output of the render function.
|
|
59
|
+
* The held value must include `cacheKey` which is used to identify and delete the corresponding
|
|
60
|
+
* entry from `BaseNode.elementCache`.
|
|
61
|
+
* @public
|
|
150
62
|
*/
|
|
151
|
-
|
|
63
|
+
static cacheCleanupRegistry: FinalizationRegistry<{
|
|
64
|
+
cacheKey: string;
|
|
65
|
+
instanceId: string;
|
|
66
|
+
}>;
|
|
152
67
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
68
|
+
* FinalizationRegistry for cleaning up portal DOM containers and their associated React roots
|
|
69
|
+
* when the owning `BaseNode` instance is garbage-collected.
|
|
70
|
+
*
|
|
71
|
+
* The held value must include:
|
|
72
|
+
* - `domElement`: the container `HTMLDivElement` appended to `document.body`.
|
|
73
|
+
* - `reactRoot`: an object with an `unmount()` method to unmount the React root.
|
|
157
74
|
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
75
|
+
* On cleanup the registry handler will attempt to:
|
|
76
|
+
* 1. Unmount the React root (errors are swallowed in non-production builds with logging).
|
|
77
|
+
* 2. Remove the `domElement` from the DOM if it is still connected.
|
|
78
|
+
*
|
|
79
|
+
* This prevents detached portal containers from leaking memory in long-running client apps.
|
|
80
|
+
* @private
|
|
161
81
|
*/
|
|
162
|
-
|
|
82
|
+
static portalCleanupRegistry: FinalizationRegistry<{
|
|
83
|
+
domElement: HTMLDivElement;
|
|
84
|
+
reactRoot: {
|
|
85
|
+
unmount(): void;
|
|
86
|
+
};
|
|
87
|
+
}>;
|
|
163
88
|
/**
|
|
164
89
|
* Renders the `BaseNode` and its entire subtree into a ReactElement, with support for opt-in reactivity
|
|
165
90
|
* via dependency arrays and inherited blocking.
|
|
@@ -175,18 +100,6 @@ export declare class BaseNode<E extends NodeElementType> implements NodeInstance
|
|
|
175
100
|
* @method render
|
|
176
101
|
*/
|
|
177
102
|
render(parentBlocked?: boolean): ReactElement<FinalNodeProps>;
|
|
178
|
-
/**
|
|
179
|
-
* Registers a node instance with the MountTracker for unmount tracking.
|
|
180
|
-
* This is only executed on the client-side.
|
|
181
|
-
* @method registerUnmount
|
|
182
|
-
*/
|
|
183
|
-
static registerUnmount(node: BaseNode<any>): void;
|
|
184
|
-
/**
|
|
185
|
-
* Ensures that the necessary DOM element and React root are available for portal rendering.
|
|
186
|
-
* This is only executed on the client-side.
|
|
187
|
-
* @method _ensurePortalInfrastructure
|
|
188
|
-
*/
|
|
189
|
-
private _ensurePortalInfrastructure;
|
|
190
103
|
/**
|
|
191
104
|
* Renders the node into a React Portal, mounting it directly under `document.body`.
|
|
192
105
|
* Returns a handle with `update` and `unmount` methods to control the portal's lifecycle.
|
|
@@ -195,6 +108,11 @@ export declare class BaseNode<E extends NodeElementType> implements NodeInstance
|
|
|
195
108
|
toPortal(): NodePortal;
|
|
196
109
|
/**
|
|
197
110
|
* A static method to clear all internal caches.
|
|
111
|
+
*
|
|
112
|
+
* This method performs manual cleanup of all cache entries, calling their
|
|
113
|
+
* `onEvict` callbacks before clearing. Note that FinalizationRegistry entries
|
|
114
|
+
* are not manually cleared as they will be garbage collected naturally when
|
|
115
|
+
* the associated nodes are collected.
|
|
198
116
|
* @method clearCaches
|
|
199
117
|
*/
|
|
200
118
|
static clearCaches(): void;
|
package/dist/core.node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.node.d.ts","sourceRoot":"","sources":["../src/core.node.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"core.node.d.ts","sourceRoot":"","sources":["../src/core.node.ts"],"names":[],"mappings":"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"}
|