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.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/directives/bind.d.ts +8 -0
  4. package/dist/directives/bind.d.ts.map +1 -0
  5. package/dist/directives/bind.js +69 -0
  6. package/dist/directives/bind.js.map +1 -0
  7. package/dist/directives/evaluator.d.ts +40 -0
  8. package/dist/directives/evaluator.d.ts.map +1 -0
  9. package/dist/directives/evaluator.js +125 -0
  10. package/dist/directives/evaluator.js.map +1 -0
  11. package/dist/directives/for.d.ts +9 -0
  12. package/dist/directives/for.d.ts.map +1 -0
  13. package/dist/directives/for.js +67 -0
  14. package/dist/directives/for.js.map +1 -0
  15. package/dist/directives/html.d.ts +8 -0
  16. package/dist/directives/html.d.ts.map +1 -0
  17. package/dist/directives/html.js +11 -0
  18. package/dist/directives/html.js.map +1 -0
  19. package/dist/directives/if.d.ts +12 -0
  20. package/dist/directives/if.d.ts.map +1 -0
  21. package/dist/directives/if.js +15 -0
  22. package/dist/directives/if.js.map +1 -0
  23. package/dist/directives/index.d.ts +16 -0
  24. package/dist/directives/index.d.ts.map +1 -0
  25. package/dist/directives/index.js +16 -0
  26. package/dist/directives/index.js.map +1 -0
  27. package/dist/directives/model.d.ts +8 -0
  28. package/dist/directives/model.d.ts.map +1 -0
  29. package/dist/directives/model.js +38 -0
  30. package/dist/directives/model.js.map +1 -0
  31. package/dist/directives/on.d.ts +8 -0
  32. package/dist/directives/on.d.ts.map +1 -0
  33. package/dist/directives/on.js +50 -0
  34. package/dist/directives/on.js.map +1 -0
  35. package/dist/directives/show.d.ts +8 -0
  36. package/dist/directives/show.d.ts.map +1 -0
  37. package/dist/directives/show.js +11 -0
  38. package/dist/directives/show.js.map +1 -0
  39. package/dist/directives/text.d.ts +12 -0
  40. package/dist/directives/text.d.ts.map +1 -0
  41. package/dist/directives/text.js +15 -0
  42. package/dist/directives/text.js.map +1 -0
  43. package/dist/directives/types.d.ts +27 -0
  44. package/dist/directives/types.d.ts.map +1 -0
  45. package/dist/directives/types.js +7 -0
  46. package/dist/directives/types.js.map +1 -0
  47. package/dist/dom/createNode.d.ts +14 -0
  48. package/dist/dom/createNode.d.ts.map +1 -0
  49. package/dist/dom/createNode.js +304 -0
  50. package/dist/dom/createNode.js.map +1 -0
  51. package/dist/dom/events.d.ts +22 -0
  52. package/dist/dom/events.d.ts.map +1 -0
  53. package/dist/dom/events.js +104 -0
  54. package/dist/dom/events.js.map +1 -0
  55. package/dist/dom/updateProps.d.ts +15 -0
  56. package/dist/dom/updateProps.d.ts.map +1 -0
  57. package/dist/dom/updateProps.js +51 -0
  58. package/dist/dom/updateProps.js.map +1 -0
  59. package/dist/index.d.ts +20 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +24 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/jquery/bridge.d.ts +39 -0
  64. package/dist/jquery/bridge.d.ts.map +1 -0
  65. package/dist/jquery/bridge.js +59 -0
  66. package/dist/jquery/bridge.js.map +1 -0
  67. package/dist/providers/storage.d.ts +24 -0
  68. package/dist/providers/storage.d.ts.map +1 -0
  69. package/dist/providers/storage.js +126 -0
  70. package/dist/providers/storage.js.map +1 -0
  71. package/dist/renderer/hydrate.d.ts +22 -0
  72. package/dist/renderer/hydrate.d.ts.map +1 -0
  73. package/dist/renderer/hydrate.js +105 -0
  74. package/dist/renderer/hydrate.js.map +1 -0
  75. package/dist/renderer/mount.d.ts +15 -0
  76. package/dist/renderer/mount.d.ts.map +1 -0
  77. package/dist/renderer/mount.js +70 -0
  78. package/dist/renderer/mount.js.map +1 -0
  79. package/dist/renderer/patch.d.ts +15 -0
  80. package/dist/renderer/patch.d.ts.map +1 -0
  81. package/dist/renderer/patch.js +147 -0
  82. package/dist/renderer/patch.js.map +1 -0
  83. package/dist/router/index.d.ts +15 -0
  84. package/dist/router/index.d.ts.map +1 -0
  85. package/dist/router/index.js +263 -0
  86. package/dist/router/index.js.map +1 -0
  87. package/dist/router/types.d.ts +67 -0
  88. package/dist/router/types.d.ts.map +1 -0
  89. package/dist/router/types.js +5 -0
  90. package/dist/router/types.js.map +1 -0
  91. package/dist/state/store.d.ts +15 -0
  92. package/dist/state/store.d.ts.map +1 -0
  93. package/dist/state/store.js +36 -0
  94. package/dist/state/store.js.map +1 -0
  95. package/package.json +42 -0
  96. package/tsconfig.base.json +28 -0
  97. 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"}
@@ -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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"}