illimi-runtime 1.0.0
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/LICENSE +21 -0
- package/README.md +130 -0
- package/dist/directives/bind.d.ts +8 -0
- package/dist/directives/bind.d.ts.map +1 -0
- package/dist/directives/bind.js +69 -0
- package/dist/directives/bind.js.map +1 -0
- package/dist/directives/evaluator.d.ts +40 -0
- package/dist/directives/evaluator.d.ts.map +1 -0
- package/dist/directives/evaluator.js +125 -0
- package/dist/directives/evaluator.js.map +1 -0
- package/dist/directives/for.d.ts +9 -0
- package/dist/directives/for.d.ts.map +1 -0
- package/dist/directives/for.js +67 -0
- package/dist/directives/for.js.map +1 -0
- package/dist/directives/html.d.ts +8 -0
- package/dist/directives/html.d.ts.map +1 -0
- package/dist/directives/html.js +11 -0
- package/dist/directives/html.js.map +1 -0
- package/dist/directives/if.d.ts +12 -0
- package/dist/directives/if.d.ts.map +1 -0
- package/dist/directives/if.js +15 -0
- package/dist/directives/if.js.map +1 -0
- package/dist/directives/index.d.ts +16 -0
- package/dist/directives/index.d.ts.map +1 -0
- package/dist/directives/index.js +16 -0
- package/dist/directives/index.js.map +1 -0
- package/dist/directives/model.d.ts +8 -0
- package/dist/directives/model.d.ts.map +1 -0
- package/dist/directives/model.js +38 -0
- package/dist/directives/model.js.map +1 -0
- package/dist/directives/on.d.ts +8 -0
- package/dist/directives/on.d.ts.map +1 -0
- package/dist/directives/on.js +50 -0
- package/dist/directives/on.js.map +1 -0
- package/dist/directives/show.d.ts +8 -0
- package/dist/directives/show.d.ts.map +1 -0
- package/dist/directives/show.js +11 -0
- package/dist/directives/show.js.map +1 -0
- package/dist/directives/text.d.ts +12 -0
- package/dist/directives/text.d.ts.map +1 -0
- package/dist/directives/text.js +15 -0
- package/dist/directives/text.js.map +1 -0
- package/dist/directives/types.d.ts +27 -0
- package/dist/directives/types.d.ts.map +1 -0
- package/dist/directives/types.js +7 -0
- package/dist/directives/types.js.map +1 -0
- package/dist/dom/createNode.d.ts +14 -0
- package/dist/dom/createNode.d.ts.map +1 -0
- package/dist/dom/createNode.js +304 -0
- package/dist/dom/createNode.js.map +1 -0
- package/dist/dom/events.d.ts +22 -0
- package/dist/dom/events.d.ts.map +1 -0
- package/dist/dom/events.js +104 -0
- package/dist/dom/events.js.map +1 -0
- package/dist/dom/updateProps.d.ts +15 -0
- package/dist/dom/updateProps.d.ts.map +1 -0
- package/dist/dom/updateProps.js +51 -0
- package/dist/dom/updateProps.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/jquery/bridge.d.ts +39 -0
- package/dist/jquery/bridge.d.ts.map +1 -0
- package/dist/jquery/bridge.js +59 -0
- package/dist/jquery/bridge.js.map +1 -0
- package/dist/providers/storage.d.ts +24 -0
- package/dist/providers/storage.d.ts.map +1 -0
- package/dist/providers/storage.js +126 -0
- package/dist/providers/storage.js.map +1 -0
- package/dist/renderer/hydrate.d.ts +22 -0
- package/dist/renderer/hydrate.d.ts.map +1 -0
- package/dist/renderer/hydrate.js +105 -0
- package/dist/renderer/hydrate.js.map +1 -0
- package/dist/renderer/mount.d.ts +15 -0
- package/dist/renderer/mount.d.ts.map +1 -0
- package/dist/renderer/mount.js +70 -0
- package/dist/renderer/mount.js.map +1 -0
- package/dist/renderer/patch.d.ts +15 -0
- package/dist/renderer/patch.d.ts.map +1 -0
- package/dist/renderer/patch.js +147 -0
- package/dist/renderer/patch.js.map +1 -0
- package/dist/router/index.d.ts +15 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +263 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/types.d.ts +67 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +5 -0
- package/dist/router/types.js.map +1 -0
- package/dist/state/store.d.ts +15 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +36 -0
- package/dist/state/store.js.map +1 -0
- package/package.json +42 -0
- package/tsconfig.base.json +28 -0
- package/tsconfig.json +7 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - Event Binding System
|
|
3
|
+
*
|
|
4
|
+
* Handles event binding and cleanup for DOM elements.
|
|
5
|
+
*/
|
|
6
|
+
const boundEvents = [];
|
|
7
|
+
/**
|
|
8
|
+
* Bind events to an element based on VNode props
|
|
9
|
+
*/
|
|
10
|
+
export function bindEvents(element, props, context) {
|
|
11
|
+
if (!props)
|
|
12
|
+
return;
|
|
13
|
+
for (const [key, value] of Object.entries(props)) {
|
|
14
|
+
// Check if it's an event handler (onEventName)
|
|
15
|
+
const secondChar = key[1];
|
|
16
|
+
if (key.length < 3 || !key.startsWith('on') || !secondChar || secondChar !== secondChar.toUpperCase()) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
// Extract event name (onClick -> click)
|
|
20
|
+
const char2 = key[2];
|
|
21
|
+
if (!char2)
|
|
22
|
+
continue;
|
|
23
|
+
const eventName = char2.toLowerCase() + key.slice(3);
|
|
24
|
+
const handlerName = value;
|
|
25
|
+
// Resolve handler from context
|
|
26
|
+
const handler = context[handlerName];
|
|
27
|
+
if (!handler) {
|
|
28
|
+
console.warn(`Event handler '${handlerName}' not found in context`);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// Parse modifiers
|
|
32
|
+
const modifierMatch = eventName.match(/\.(.+)$/);
|
|
33
|
+
let actualEventName = eventName;
|
|
34
|
+
const modifiers = [];
|
|
35
|
+
if (modifierMatch && modifierMatch.index !== undefined) {
|
|
36
|
+
actualEventName = eventName.slice(0, modifierMatch.index);
|
|
37
|
+
const modVal = modifierMatch[1];
|
|
38
|
+
if (modVal) {
|
|
39
|
+
modifiers.push(...modVal.split('.'));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Create wrapped handler with modifiers
|
|
43
|
+
const wrappedHandler = createEventHandler(handler, modifiers);
|
|
44
|
+
// Add event listener
|
|
45
|
+
element.addEventListener(actualEventName, wrappedHandler, false);
|
|
46
|
+
// Store for cleanup
|
|
47
|
+
boundEvents.push({
|
|
48
|
+
element,
|
|
49
|
+
eventName: actualEventName,
|
|
50
|
+
handler: wrappedHandler,
|
|
51
|
+
options: { capture: false },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create an event handler with modifiers
|
|
57
|
+
*/
|
|
58
|
+
function createEventHandler(handler, modifiers) {
|
|
59
|
+
return (event) => {
|
|
60
|
+
let shouldCall = true;
|
|
61
|
+
// Apply modifiers
|
|
62
|
+
for (const modifier of modifiers) {
|
|
63
|
+
switch (modifier) {
|
|
64
|
+
case 'stop':
|
|
65
|
+
event.stopPropagation();
|
|
66
|
+
break;
|
|
67
|
+
case 'prevent':
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
break;
|
|
70
|
+
case 'self':
|
|
71
|
+
shouldCall = event.target === event.currentTarget;
|
|
72
|
+
break;
|
|
73
|
+
// Add more modifiers as needed
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (shouldCall) {
|
|
77
|
+
handler(event);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Unbind all events from an element
|
|
83
|
+
*/
|
|
84
|
+
export function unbindEvents(element) {
|
|
85
|
+
for (let i = boundEvents.length - 1; i >= 0; i--) {
|
|
86
|
+
const bound = boundEvents[i];
|
|
87
|
+
if (!bound)
|
|
88
|
+
continue;
|
|
89
|
+
if (bound.element === element) {
|
|
90
|
+
element.removeEventListener(bound.eventName, bound.handler, bound.options.capture);
|
|
91
|
+
boundEvents.splice(i, 1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Unbind all events globally (for cleanup)
|
|
97
|
+
*/
|
|
98
|
+
export function unbindAllEvents() {
|
|
99
|
+
for (const bound of boundEvents) {
|
|
100
|
+
bound.element.removeEventListener(bound.eventName, bound.handler, bound.options.capture);
|
|
101
|
+
}
|
|
102
|
+
boundEvents.length = 0;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/dom/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - DOM Property Updates
|
|
3
|
+
*
|
|
4
|
+
* Updates DOM node properties based on patch instructions.
|
|
5
|
+
*/
|
|
6
|
+
import type { VNodeProps } from '@illimi/core';
|
|
7
|
+
/**
|
|
8
|
+
* Update props on an existing DOM element
|
|
9
|
+
*/
|
|
10
|
+
export declare function updateProps(element: Element, oldProps: VNodeProps | null, newProps: VNodeProps | null): void;
|
|
11
|
+
/**
|
|
12
|
+
* Remove all props from an element
|
|
13
|
+
*/
|
|
14
|
+
export declare function removeProps(element: Element, props: VNodeProps | null): void;
|
|
15
|
+
//# sourceMappingURL=updateProps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateProps.d.ts","sourceRoot":"","sources":["../../src/dom/updateProps.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAkC5G;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAM5E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - DOM Property Updates
|
|
3
|
+
*
|
|
4
|
+
* Updates DOM node properties based on patch instructions.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Update props on an existing DOM element
|
|
8
|
+
*/
|
|
9
|
+
export function updateProps(element, oldProps, newProps) {
|
|
10
|
+
const allKeys = new Set([
|
|
11
|
+
...Object.keys(oldProps ?? {}),
|
|
12
|
+
...Object.keys(newProps ?? {}),
|
|
13
|
+
]);
|
|
14
|
+
for (const key of allKeys) {
|
|
15
|
+
const oldValue = oldProps?.[key];
|
|
16
|
+
const newValue = newProps?.[key];
|
|
17
|
+
if (oldValue === newValue)
|
|
18
|
+
continue;
|
|
19
|
+
// Remove if new value is null/undefined/false
|
|
20
|
+
if (newValue === null || newValue === undefined || newValue === false) {
|
|
21
|
+
element.removeAttribute(key);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// Skip framework internal directives
|
|
25
|
+
if (key.startsWith('x-') || key.startsWith('f-'))
|
|
26
|
+
continue;
|
|
27
|
+
// Event handlers - handled by event system
|
|
28
|
+
const secondChar = key[1];
|
|
29
|
+
if (key.length >= 3 && key.startsWith('on') && secondChar && secondChar === secondChar.toUpperCase()) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// Set the attribute
|
|
33
|
+
if (newValue === true) {
|
|
34
|
+
element.setAttribute(key, '');
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
element.setAttribute(key, String(newValue));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Remove all props from an element
|
|
43
|
+
*/
|
|
44
|
+
export function removeProps(element, props) {
|
|
45
|
+
if (!props)
|
|
46
|
+
return;
|
|
47
|
+
for (const key of Object.keys(props)) {
|
|
48
|
+
element.removeAttribute(key);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=updateProps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateProps.js","sourceRoot":"","sources":["../../src/dom/updateProps.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,QAA2B,EAAE,QAA2B;IACpG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;QACtB,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC9B,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;KAC/B,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,QAAQ,KAAK,QAAQ;YAAE,SAAS;QAEpC,8CAA8C;QAC9C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACtE,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAE3D,2CAA2C;QAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,IAAI,UAAU,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;YACrG,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,KAAwB;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - Public API
|
|
3
|
+
*
|
|
4
|
+
* DOM Renderer and jQuery Bridge for FeedJS
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export type { VNode, Patch, PatchType, PatchList } from '@illimi/core';
|
|
9
|
+
export { mount, unmount } from './renderer/mount.js';
|
|
10
|
+
export { patch, setEventContext } from './renderer/patch.js';
|
|
11
|
+
export { hydrate, checkHydration, setHydrationContext } from './renderer/hydrate.js';
|
|
12
|
+
export { createNode, applyProps, createElementWithChildren } from './dom/createNode.js';
|
|
13
|
+
export { updateProps, removeProps } from './dom/updateProps.js';
|
|
14
|
+
export { bindEvents, unbindEvents, unbindAllEvents } from './dom/events.js';
|
|
15
|
+
export { hasJQuery, $, initJQueryBridge, triggerFeedEvent, onFeedEvent } from './jquery/bridge.js';
|
|
16
|
+
export { createRouter } from './router/index.js';
|
|
17
|
+
export type { AppContext, AppContextProvider, Route, RouteParams, QueryParams, NavigationParams, NavigateOptions, PageContext, PageStateFactory, Router, RouterOptions, } from './router/types.js';
|
|
18
|
+
export { createStore, type Store, type Listener } from './state/store.js';
|
|
19
|
+
export { createStorageProvider, createStorageClient, type StorageClient, type StorageProviderOptions, type StorageKind, } from './providers/storage.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGrF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,EACL,SAAS,EACT,CAAC,EACD,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,KAAK,EACL,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - Public API
|
|
3
|
+
*
|
|
4
|
+
* DOM Renderer and jQuery Bridge for FeedJS
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
// Re-export from renderers
|
|
9
|
+
export { mount, unmount } from './renderer/mount.js';
|
|
10
|
+
export { patch, setEventContext } from './renderer/patch.js';
|
|
11
|
+
export { hydrate, checkHydration, setHydrationContext } from './renderer/hydrate.js';
|
|
12
|
+
// Re-export from DOM utilities
|
|
13
|
+
export { createNode, applyProps, createElementWithChildren } from './dom/createNode.js';
|
|
14
|
+
export { updateProps, removeProps } from './dom/updateProps.js';
|
|
15
|
+
export { bindEvents, unbindEvents, unbindAllEvents } from './dom/events.js';
|
|
16
|
+
// Re-export from jQuery bridge
|
|
17
|
+
export { hasJQuery, $, initJQueryBridge, triggerFeedEvent, onFeedEvent } from './jquery/bridge.js';
|
|
18
|
+
// Re-export from router
|
|
19
|
+
export { createRouter } from './router/index.js';
|
|
20
|
+
// Re-export state helpers
|
|
21
|
+
export { createStore } from './state/store.js';
|
|
22
|
+
// Re-export providers
|
|
23
|
+
export { createStorageProvider, createStorageClient, } from './providers/storage.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,2BAA2B;AAC3B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAErF,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE5E,+BAA+B;AAC/B,OAAO,EACL,SAAS,EACT,CAAC,EACD,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAE5B,wBAAwB;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAejD,0BAA0B;AAC1B,OAAO,EAAE,WAAW,EAA6B,MAAM,kBAAkB,CAAC;AAE1E,sBAAsB;AACtB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAIpB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - jQuery Bridge
|
|
3
|
+
*
|
|
4
|
+
* Optional jQuery compatibility layer.
|
|
5
|
+
*/
|
|
6
|
+
interface JQueryInstance {
|
|
7
|
+
on(event: string, handler: EventListener): JQueryInstance;
|
|
8
|
+
trigger(event: string): JQueryInstance;
|
|
9
|
+
find(selector: string): JQueryInstance;
|
|
10
|
+
append(child: Node): JQueryInstance;
|
|
11
|
+
remove(): JQueryInstance;
|
|
12
|
+
attr(name: string, value: string): JQueryInstance;
|
|
13
|
+
html(content: string): JQueryInstance;
|
|
14
|
+
text(content: string): JQueryInstance;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if jQuery is available
|
|
18
|
+
*/
|
|
19
|
+
export declare function hasJQuery(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Get jQuery-wrapped element (cached)
|
|
22
|
+
*/
|
|
23
|
+
export declare function $(element: Element): JQueryInstance | null;
|
|
24
|
+
/**
|
|
25
|
+
* Initialize jQuery bridge
|
|
26
|
+
*
|
|
27
|
+
* This must be called after jQuery is loaded
|
|
28
|
+
*/
|
|
29
|
+
export declare function initJQueryBridge(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Trigger a custom FeedJS event on an element
|
|
32
|
+
*/
|
|
33
|
+
export declare function triggerFeedEvent(element: Element, eventName: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Listen for a custom FeedJS event on an element
|
|
36
|
+
*/
|
|
37
|
+
export declare function onFeedEvent(element: Element, eventName: string, handler: EventListener): void;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/jquery/bridge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,cAAc;IACtB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC;IAC1D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC;IACvC,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,cAAc,CAAC;IACpC,MAAM,IAAI,cAAc,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC;CACvC;AAQD;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;GAEG;AACH,wBAAgB,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAUzD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CASvC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAK1E;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,IAAI,CAKN"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - jQuery Bridge
|
|
3
|
+
*
|
|
4
|
+
* Optional jQuery compatibility layer.
|
|
5
|
+
*/
|
|
6
|
+
// Store for jQuery wrapped elements
|
|
7
|
+
const jqueryCache = new WeakMap();
|
|
8
|
+
/**
|
|
9
|
+
* Check if jQuery is available
|
|
10
|
+
*/
|
|
11
|
+
export function hasJQuery() {
|
|
12
|
+
return typeof jQuery !== 'undefined' && jQuery !== null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get jQuery-wrapped element (cached)
|
|
16
|
+
*/
|
|
17
|
+
export function $(element) {
|
|
18
|
+
if (!hasJQuery())
|
|
19
|
+
return null;
|
|
20
|
+
if (jqueryCache.has(element)) {
|
|
21
|
+
return jqueryCache.get(element);
|
|
22
|
+
}
|
|
23
|
+
const wrapped = jQuery(element);
|
|
24
|
+
jqueryCache.set(element, wrapped);
|
|
25
|
+
return wrapped;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize jQuery bridge
|
|
29
|
+
*
|
|
30
|
+
* This must be called after jQuery is loaded
|
|
31
|
+
*/
|
|
32
|
+
export function initJQueryBridge() {
|
|
33
|
+
if (!hasJQuery()) {
|
|
34
|
+
console.warn('jQuery not found - jQuery bridge not initialized');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Add custom event support
|
|
38
|
+
// This allows components to communicate via jQuery events
|
|
39
|
+
console.log('jQuery bridge initialized');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Trigger a custom FeedJS event on an element
|
|
43
|
+
*/
|
|
44
|
+
export function triggerFeedEvent(element, eventName) {
|
|
45
|
+
const $el = $(element);
|
|
46
|
+
if ($el) {
|
|
47
|
+
$el.trigger(`feedjs:${eventName}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Listen for a custom FeedJS event on an element
|
|
52
|
+
*/
|
|
53
|
+
export function onFeedEvent(element, eventName, handler) {
|
|
54
|
+
const $el = $(element);
|
|
55
|
+
if ($el) {
|
|
56
|
+
$el.on(`feedjs:${eventName}`, handler);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/jquery/bridge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqBH,oCAAoC;AACpC,MAAM,WAAW,GAAG,IAAI,OAAO,EAA2B,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,IAAI,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,CAAC,CAAC,OAAgB;IAChC,IAAI,CAAC,SAAS,EAAE;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;IACnC,CAAC;IAED,MAAM,OAAO,GAAG,MAAO,CAAC,OAAO,CAAC,CAAC;IACjC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,0DAA0D;IAC1D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,SAAiB;IAClE,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,OAAO,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAgB,EAChB,SAAiB,EACjB,OAAsB;IAEtB,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,EAAE,CAAC,UAAU,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Illimi Runtime - Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Minimal local/session storage wrapper that can be injected into router context.
|
|
5
|
+
*/
|
|
6
|
+
import type { AppContextProvider } from '../router/types.js';
|
|
7
|
+
export type StorageKind = 'local' | 'session';
|
|
8
|
+
export interface StorageProviderOptions {
|
|
9
|
+
key?: string;
|
|
10
|
+
storage?: StorageKind;
|
|
11
|
+
namespace?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface StorageClient {
|
|
14
|
+
get: <T = unknown>(key: string, fallback?: T) => T | undefined;
|
|
15
|
+
set: (key: string, value: unknown) => void;
|
|
16
|
+
remove: (key: string) => void;
|
|
17
|
+
clear: () => void;
|
|
18
|
+
has: (key: string) => boolean;
|
|
19
|
+
keys: () => string[];
|
|
20
|
+
subscribe: (listener: () => void) => () => void;
|
|
21
|
+
}
|
|
22
|
+
export declare function createStorageClient(options?: StorageProviderOptions): StorageClient;
|
|
23
|
+
export declare function createStorageProvider(options?: StorageProviderOptions): AppContextProvider;
|
|
24
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/providers/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAC/D,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9B,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CACjD;AAiDD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,sBAA2B,GAAG,aAAa,CAmFvF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,kBAAkB,CAO9F"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Illimi Runtime - Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Minimal local/session storage wrapper that can be injected into router context.
|
|
5
|
+
*/
|
|
6
|
+
function canUseWindowStorage() {
|
|
7
|
+
return typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';
|
|
8
|
+
}
|
|
9
|
+
function readStorage(kind) {
|
|
10
|
+
return kind === 'session' ? window.sessionStorage : window.localStorage;
|
|
11
|
+
}
|
|
12
|
+
function createMemoryStorage() {
|
|
13
|
+
const map = new Map();
|
|
14
|
+
return {
|
|
15
|
+
get length() {
|
|
16
|
+
return map.size;
|
|
17
|
+
},
|
|
18
|
+
clear() {
|
|
19
|
+
map.clear();
|
|
20
|
+
},
|
|
21
|
+
getItem(key) {
|
|
22
|
+
return map.has(key) ? map.get(key) ?? null : null;
|
|
23
|
+
},
|
|
24
|
+
key(index) {
|
|
25
|
+
return Array.from(map.keys())[index] ?? null;
|
|
26
|
+
},
|
|
27
|
+
removeItem(key) {
|
|
28
|
+
map.delete(key);
|
|
29
|
+
},
|
|
30
|
+
setItem(key, value) {
|
|
31
|
+
map.set(key, value);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function serialize(value) {
|
|
36
|
+
return JSON.stringify(value);
|
|
37
|
+
}
|
|
38
|
+
function deserialize(value, fallback) {
|
|
39
|
+
if (value == null)
|
|
40
|
+
return fallback;
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(value);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return fallback;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function createStorageClient(options = {}) {
|
|
49
|
+
const { namespace = '', storage = 'local' } = options;
|
|
50
|
+
const store = canUseWindowStorage() ? readStorage(storage) : createMemoryStorage();
|
|
51
|
+
const listeners = new Set();
|
|
52
|
+
const prefix = namespace ? `${namespace}:` : '';
|
|
53
|
+
function fullKey(key) {
|
|
54
|
+
return `${prefix}${key}`;
|
|
55
|
+
}
|
|
56
|
+
function emit() {
|
|
57
|
+
listeners.forEach((listener) => listener());
|
|
58
|
+
}
|
|
59
|
+
if (typeof window !== 'undefined') {
|
|
60
|
+
window.addEventListener('storage', (event) => {
|
|
61
|
+
if (!event.key)
|
|
62
|
+
return;
|
|
63
|
+
if (prefix && !event.key.startsWith(prefix))
|
|
64
|
+
return;
|
|
65
|
+
emit();
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
get(key, fallback) {
|
|
70
|
+
return deserialize(store.getItem(fullKey(key)), fallback);
|
|
71
|
+
},
|
|
72
|
+
set(key, value) {
|
|
73
|
+
store.setItem(fullKey(key), serialize(value));
|
|
74
|
+
emit();
|
|
75
|
+
},
|
|
76
|
+
remove(key) {
|
|
77
|
+
store.removeItem(fullKey(key));
|
|
78
|
+
emit();
|
|
79
|
+
},
|
|
80
|
+
clear() {
|
|
81
|
+
if (!prefix) {
|
|
82
|
+
store.clear();
|
|
83
|
+
emit();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const keys = this.keys();
|
|
87
|
+
keys.forEach((key) => {
|
|
88
|
+
store.removeItem(fullKey(key));
|
|
89
|
+
});
|
|
90
|
+
emit();
|
|
91
|
+
},
|
|
92
|
+
has(key) {
|
|
93
|
+
return store.getItem(fullKey(key)) !== null;
|
|
94
|
+
},
|
|
95
|
+
keys() {
|
|
96
|
+
const result = [];
|
|
97
|
+
for (let i = 0; i < store.length; i++) {
|
|
98
|
+
const key = store.key(i);
|
|
99
|
+
if (!key)
|
|
100
|
+
continue;
|
|
101
|
+
if (!prefix) {
|
|
102
|
+
result.push(key);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (key.startsWith(prefix)) {
|
|
106
|
+
result.push(key.slice(prefix.length));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
},
|
|
111
|
+
subscribe(listener) {
|
|
112
|
+
listeners.add(listener);
|
|
113
|
+
return () => {
|
|
114
|
+
listeners.delete(listener);
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export function createStorageProvider(options = {}) {
|
|
120
|
+
const { key = 'storage' } = options;
|
|
121
|
+
return {
|
|
122
|
+
key,
|
|
123
|
+
value: createStorageClient(options),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/providers/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - Hydration
|
|
3
|
+
*
|
|
4
|
+
* Hydrates server-rendered HTML with event handlers.
|
|
5
|
+
*/
|
|
6
|
+
import type { VNode } from '@illimi/core';
|
|
7
|
+
/**
|
|
8
|
+
* Hydrate existing DOM with event handlers
|
|
9
|
+
*
|
|
10
|
+
* Reuses existing DOM nodes and attaches events without re-rendering
|
|
11
|
+
*/
|
|
12
|
+
export declare function hydrate(container: Element, vnode: VNode): void;
|
|
13
|
+
/**
|
|
14
|
+
* Check if hydration structure matches
|
|
15
|
+
* Returns true if structure matches, false otherwise
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkHydration(container: Element, vnode: VNode): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Set hydration event context
|
|
20
|
+
*/
|
|
21
|
+
export declare function setHydrationContext(context: Record<string, EventListener>): void;
|
|
22
|
+
//# sourceMappingURL=hydrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../../src/renderer/hydrate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAO1C;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAc9D;AA+BD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAExE;AA8CD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI,CAEhF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedJS Runtime - Hydration
|
|
3
|
+
*
|
|
4
|
+
* Hydrates server-rendered HTML with event handlers.
|
|
5
|
+
*/
|
|
6
|
+
import { bindEvents } from '../dom/events.js';
|
|
7
|
+
import { hasJQuery, triggerFeedEvent } from '../jquery/bridge.js';
|
|
8
|
+
// Event context for resolving handlers
|
|
9
|
+
const hydrationContext = {};
|
|
10
|
+
/**
|
|
11
|
+
* Hydrate existing DOM with event handlers
|
|
12
|
+
*
|
|
13
|
+
* Reuses existing DOM nodes and attaches events without re-rendering
|
|
14
|
+
*/
|
|
15
|
+
export function hydrate(container, vnode) {
|
|
16
|
+
// Walk the DOM tree and attach events based on VNode
|
|
17
|
+
hydrateNode(container, vnode);
|
|
18
|
+
// Trigger hydration event
|
|
19
|
+
triggerFeedEvent(container, 'hydrated');
|
|
20
|
+
// jQuery bridge
|
|
21
|
+
if (hasJQuery()) {
|
|
22
|
+
const jq = window.jQuery;
|
|
23
|
+
if (jq && typeof jq === 'function') {
|
|
24
|
+
jq(container).trigger('feedjs:hydrated');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Hydrate a single node recursively
|
|
30
|
+
*/
|
|
31
|
+
function hydrateNode(domNode, vnode) {
|
|
32
|
+
if (!(domNode instanceof Element))
|
|
33
|
+
return;
|
|
34
|
+
// Bind events from VNode props
|
|
35
|
+
if (vnode.props) {
|
|
36
|
+
bindEvents(domNode, vnode.props, hydrationContext);
|
|
37
|
+
}
|
|
38
|
+
// Recursively hydrate children
|
|
39
|
+
const domChildren = Array.from(domNode.childNodes);
|
|
40
|
+
let vnodeChildren = vnode.children;
|
|
41
|
+
if (!vnodeChildren || !Array.isArray(vnodeChildren)) {
|
|
42
|
+
// For text nodes or other simple cases
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Simple matching: match by index
|
|
46
|
+
for (let i = 0; i < domChildren.length && i < vnodeChildren.length; i++) {
|
|
47
|
+
const childDom = domChildren[i];
|
|
48
|
+
const childVNode = vnodeChildren[i];
|
|
49
|
+
if (!childDom || !childVNode)
|
|
50
|
+
continue;
|
|
51
|
+
hydrateNode(childDom, childVNode);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if hydration structure matches
|
|
56
|
+
* Returns true if structure matches, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
export function checkHydration(container, vnode) {
|
|
59
|
+
return checkNodeMatch(container, vnode);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if a DOM node matches a VNode
|
|
63
|
+
*/
|
|
64
|
+
function checkNodeMatch(domNode, vnode) {
|
|
65
|
+
if (!(domNode instanceof Element)) {
|
|
66
|
+
// Text node
|
|
67
|
+
if (typeof vnode.children === 'string') {
|
|
68
|
+
return domNode.textContent === vnode.children;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
// Check tag name
|
|
73
|
+
if (domNode.tagName.toLowerCase() !== vnode.type) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
// Check children count
|
|
77
|
+
const domChildren = Array.from(domNode.childNodes);
|
|
78
|
+
let vnodeChildren = vnode.children;
|
|
79
|
+
if (!vnodeChildren) {
|
|
80
|
+
return domChildren.length === 0;
|
|
81
|
+
}
|
|
82
|
+
if (!Array.isArray(vnodeChildren)) {
|
|
83
|
+
// Single text child
|
|
84
|
+
const firstChild = domChildren[0];
|
|
85
|
+
return domChildren.length === 1 && !!firstChild && firstChild.textContent === vnodeChildren;
|
|
86
|
+
}
|
|
87
|
+
// Recursively check children
|
|
88
|
+
for (let i = 0; i < domChildren.length && i < vnodeChildren.length; i++) {
|
|
89
|
+
const childDom = domChildren[i];
|
|
90
|
+
const childVNode = vnodeChildren[i];
|
|
91
|
+
if (!childDom || !childVNode)
|
|
92
|
+
continue;
|
|
93
|
+
if (!checkNodeMatch(childDom, childVNode)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Set hydration event context
|
|
101
|
+
*/
|
|
102
|
+
export function setHydrationContext(context) {
|
|
103
|
+
Object.assign(hydrationContext, context);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=hydrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate.js","sourceRoot":"","sources":["../../src/renderer/hydrate.ts"],"names":[],"mappings":"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"}
|