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,15 @@
1
+ /**
2
+ * FeedJS Runtime - Mount
3
+ *
4
+ * Mounts VDOM to a real DOM container with directive execution.
5
+ */
6
+ import type { VNode as FeedVNode } from '@illimi/core';
7
+ /**
8
+ * Mount a VNode to a container element
9
+ */
10
+ export declare function mount(container: Element, vnode: FeedVNode, state?: any): void;
11
+ /**
12
+ * Unmount from a container
13
+ */
14
+ export declare function unmount(container: Element): void;
15
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/renderer/mount.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AAavD;;GAEG;AACH,wBAAgB,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAE,GAAQ,GAAG,IAAI,CAmCjF;AAoBD;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAShD"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * FeedJS Runtime - Mount
3
+ *
4
+ * Mounts VDOM to a real DOM container with directive execution.
5
+ */
6
+ import { createNode } from '../dom/createNode.js';
7
+ import { bindEvents, unbindEvents } from '../dom/events.js';
8
+ import { triggerFeedEvent, hasJQuery } from '../jquery/bridge.js';
9
+ // Store mounted root nodes
10
+ const mountedRoots = new WeakMap();
11
+ /**
12
+ * Mount a VNode to a container element
13
+ */
14
+ export function mount(container, vnode, state = {}) {
15
+ // Clear container
16
+ container.innerHTML = '';
17
+ console.log('[FeedJS Mount] Starting mount with state keys:', Object.keys(state));
18
+ console.log('[FeedJS Mount] VNode type:', vnode.type);
19
+ // Create scope with state
20
+ const scope = {
21
+ state,
22
+ locals: {}
23
+ };
24
+ // Create DOM from VNode
25
+ const domNode = createNode(vnode, scope);
26
+ if (domNode) {
27
+ // Mount and store reference
28
+ container.appendChild(domNode);
29
+ // Bind events if present
30
+ const context = { eventContext: {} };
31
+ bindEventsRecursive(domNode, vnode.props, context);
32
+ // Trigger mounted event (only for Elements)
33
+ if (domNode instanceof Element) {
34
+ triggerFeedEvent(domNode, 'mounted');
35
+ // jQuery bridge - use any to avoid complex typings
36
+ if (hasJQuery()) {
37
+ const jq = window.jQuery;
38
+ if (jq && typeof jq === 'function') {
39
+ jq(domNode).trigger('feedjs:mounted');
40
+ }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Bind events recursively
47
+ */
48
+ function bindEventsRecursive(domNode, props, context) {
49
+ if (domNode instanceof Element) {
50
+ bindEvents(domNode, props, context.eventContext);
51
+ // Process children
52
+ for (const child of domNode.childNodes) {
53
+ bindEventsRecursive(child, null, context);
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Unmount from a container
59
+ */
60
+ export function unmount(container) {
61
+ const root = mountedRoots.get(container);
62
+ if (root) {
63
+ if (root instanceof Element) {
64
+ unbindEvents(root);
65
+ }
66
+ container.innerHTML = '';
67
+ mountedRoots.delete(container);
68
+ }
69
+ }
70
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/renderer/mount.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAc,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOlE,2BAA2B;AAC3B,MAAM,YAAY,GAAG,IAAI,OAAO,EAAiB,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,SAAkB,EAAE,KAAgB,EAAE,QAAa,EAAE;IACzE,kBAAkB;IAClB,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,0BAA0B;IAC1B,MAAM,KAAK,GAAU;QACnB,KAAK;QACL,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,wBAAwB;IACxB,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEzC,IAAI,OAAO,EAAE,CAAC;QACZ,4BAA4B;QAC5B,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE/B,yBAAyB;QACzB,MAAM,OAAO,GAAiB,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QACnD,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEnD,4CAA4C;QAC5C,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;YAC/B,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAErC,mDAAmD;YACnD,IAAI,SAAS,EAAE,EAAE,CAAC;gBAChB,MAAM,EAAE,GAAI,MAAyC,CAAC,MAAM,CAAC;gBAC7D,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;oBAClC,EAA4D,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBACnG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,OAAa,EACb,KAAU,EACV,OAAqB;IAErB,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAC/B,UAAU,CAAC,OAAO,EAAE,KAAgC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAE5E,mBAAmB;QACnB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvC,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,SAAkB;IACxC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;QACzB,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * FeedJS Runtime - Patch Application
3
+ *
4
+ * Applies patch operations to update the DOM.
5
+ */
6
+ import type { Patch } from '@illimi/core';
7
+ /**
8
+ * Apply patches to the DOM
9
+ */
10
+ export declare function patch(container: Element, patches: Patch[]): void;
11
+ /**
12
+ * Set event context for patch application
13
+ */
14
+ export declare function setEventContext(context: Record<string, EventListener>): void;
15
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/renderer/patch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,cAAc,CAAC;AASjD;;GAEG;AACH,wBAAgB,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAKhE;AAkID;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI,CAE5E"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * FeedJS Runtime - Patch Application
3
+ *
4
+ * Applies patch operations to update the DOM.
5
+ */
6
+ import { createNode } from '../dom/createNode.js';
7
+ import { updateProps } from '../dom/updateProps.js';
8
+ import { bindEvents, unbindEvents } from '../dom/events.js';
9
+ // Event context for resolving handlers
10
+ const eventContext = {};
11
+ /**
12
+ * Apply patches to the DOM
13
+ */
14
+ export function patch(container, patches) {
15
+ // Apply patches sequentially and deterministically
16
+ for (const patchOp of patches) {
17
+ applyPatch(container, patchOp);
18
+ }
19
+ }
20
+ /**
21
+ * Apply a single patch operation
22
+ */
23
+ function applyPatch(container, patchOp) {
24
+ const patchType = patchOp.type;
25
+ if (patchType === 'CREATE') {
26
+ applyCreatePatch(container, patchOp);
27
+ }
28
+ else if (patchType === 'REMOVE') {
29
+ applyRemovePatch(container, patchOp);
30
+ }
31
+ else if (patchType === 'REPLACE') {
32
+ applyReplacePatch(container, patchOp);
33
+ }
34
+ else if (patchType === 'UPDATE_PROPS') {
35
+ applyUpdatePropsPatch(container, patchOp);
36
+ }
37
+ else if (patchType === 'MOVE') {
38
+ applyMovePatch(container, patchOp);
39
+ }
40
+ }
41
+ /**
42
+ * Apply CREATE patch
43
+ */
44
+ function applyCreatePatch(container, patchOp) {
45
+ const vnode = patchOp.node;
46
+ if (!vnode)
47
+ return;
48
+ const domNode = createNode(vnode, { state: {}, locals: {} });
49
+ if (!domNode)
50
+ return;
51
+ const index = patchOp.index ?? 0;
52
+ // Insert at position
53
+ const children = Array.from(container.childNodes);
54
+ const refNode = children[index];
55
+ if (refNode) {
56
+ container.insertBefore(domNode, refNode);
57
+ }
58
+ else {
59
+ container.appendChild(domNode);
60
+ }
61
+ // Bind events
62
+ if (domNode instanceof Element) {
63
+ bindEvents(domNode, vnode.props, eventContext);
64
+ }
65
+ }
66
+ /**
67
+ * Apply REMOVE patch
68
+ */
69
+ function applyRemovePatch(container, patchOp) {
70
+ const index = patchOp.index ?? 0;
71
+ const children = Array.from(container.childNodes);
72
+ const nodeToRemove = children[index];
73
+ if (nodeToRemove) {
74
+ // Unbind events
75
+ if (nodeToRemove instanceof Element) {
76
+ unbindEvents(nodeToRemove);
77
+ }
78
+ container.removeChild(nodeToRemove);
79
+ }
80
+ }
81
+ /**
82
+ * Apply REPLACE patch
83
+ */
84
+ function applyReplacePatch(container, patchOp) {
85
+ const vnode = patchOp.node;
86
+ if (!vnode)
87
+ return;
88
+ const domNode = createNode(vnode, { state: {}, locals: {} });
89
+ if (!domNode)
90
+ return;
91
+ const index = patchOp.index ?? 0;
92
+ const children = Array.from(container.childNodes);
93
+ const nodeToReplace = children[index];
94
+ if (nodeToReplace) {
95
+ // Unbind events from old node
96
+ if (nodeToReplace instanceof Element) {
97
+ unbindEvents(nodeToReplace);
98
+ }
99
+ container.replaceChild(domNode, nodeToReplace);
100
+ }
101
+ else {
102
+ container.appendChild(domNode);
103
+ }
104
+ // Bind events for new node
105
+ if (domNode instanceof Element) {
106
+ bindEvents(domNode, vnode.props, eventContext);
107
+ }
108
+ }
109
+ /**
110
+ * Apply UPDATE_PROPS patch
111
+ */
112
+ function applyUpdatePropsPatch(container, patchOp) {
113
+ const index = patchOp.index ?? 0;
114
+ const children = Array.from(container.childNodes);
115
+ const element = children[index];
116
+ if (element instanceof Element && patchOp.props) {
117
+ // Cast to proper type
118
+ const props = patchOp.props;
119
+ updateProps(element, null, props);
120
+ }
121
+ }
122
+ /**
123
+ * Apply MOVE patch
124
+ */
125
+ function applyMovePatch(container, patchOp) {
126
+ const fromIndex = patchOp.from ?? 0;
127
+ const toIndex = patchOp.to ?? 0;
128
+ const children = Array.from(container.childNodes);
129
+ const nodeToMove = children[fromIndex];
130
+ if (nodeToMove) {
131
+ const targetChildren = container.childNodes;
132
+ const refNode = targetChildren[toIndex];
133
+ if (refNode) {
134
+ container.insertBefore(nodeToMove, refNode);
135
+ }
136
+ else {
137
+ container.appendChild(nodeToMove);
138
+ }
139
+ }
140
+ }
141
+ /**
142
+ * Set event context for patch application
143
+ */
144
+ export function setEventContext(context) {
145
+ Object.assign(eventContext, context);
146
+ }
147
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/renderer/patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Illimi Router - Core Implementation
3
+ *
4
+ * Supports:
5
+ * - Static routes (/about)
6
+ * - Dynamic routes (/users/:id)
7
+ * - Route-local page state via pageState
8
+ * - Navigation params + query params
9
+ */
10
+ import type { RouterOptions, Router } from './types.js';
11
+ /**
12
+ * Create a router instance.
13
+ */
14
+ export declare function createRouter(options: RouterOptions): Router;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAIV,aAAa,EACb,MAAM,EAMP,MAAM,YAAY,CAAC;AAyGpB;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA2M3D"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Illimi Router - Core Implementation
3
+ *
4
+ * Supports:
5
+ * - Static routes (/about)
6
+ * - Dynamic routes (/users/:id)
7
+ * - Route-local page state via pageState
8
+ * - Navigation params + query params
9
+ */
10
+ import { mount } from '../renderer/mount.js';
11
+ function compilePath(path) {
12
+ const keys = [];
13
+ const escaped = path
14
+ .replace(/\/$/, '')
15
+ .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
16
+ .replace(/:(\w+)/g, (_m, key) => {
17
+ keys.push(key);
18
+ return '([^/]+)';
19
+ });
20
+ const normalized = escaped || '/';
21
+ const regex = new RegExp(`^${normalized}$`);
22
+ return {
23
+ // route will be attached by caller
24
+ route: { path, page: () => null },
25
+ regex,
26
+ keys,
27
+ };
28
+ }
29
+ function parsePathAndQuery(urlPath) {
30
+ const [rawPath, rawQuery = ''] = urlPath.split('?');
31
+ const path = (rawPath || '/').replace(/\/$/, '') || '/';
32
+ const query = {};
33
+ const search = new URLSearchParams(rawQuery);
34
+ search.forEach((value, key) => {
35
+ query[key] = value;
36
+ });
37
+ return { path, query };
38
+ }
39
+ function buildPath(path, options) {
40
+ let resolved = path;
41
+ if (options?.params) {
42
+ for (const [key, value] of Object.entries(options.params)) {
43
+ resolved = resolved.replace(`:${key}`, encodeURIComponent(String(value)));
44
+ }
45
+ }
46
+ if (options?.query) {
47
+ const search = new URLSearchParams();
48
+ for (const [key, value] of Object.entries(options.query)) {
49
+ if (value === null || value === undefined)
50
+ continue;
51
+ search.set(key, String(value));
52
+ }
53
+ const qs = search.toString();
54
+ if (qs) {
55
+ resolved += (resolved.includes('?') ? '&' : '?') + qs;
56
+ }
57
+ }
58
+ return resolved;
59
+ }
60
+ function matchRoute(path, compiled) {
61
+ for (const item of compiled) {
62
+ const matched = path.match(item.regex);
63
+ if (!matched)
64
+ continue;
65
+ const params = {};
66
+ for (let i = 0; i < item.keys.length; i++) {
67
+ const key = item.keys[i];
68
+ const value = matched[i + 1];
69
+ if (!key || !value)
70
+ continue;
71
+ params[key] = decodeURIComponent(value);
72
+ }
73
+ return {
74
+ route: item.route,
75
+ params,
76
+ };
77
+ }
78
+ return null;
79
+ }
80
+ function resolvePageState(route, context, getState) {
81
+ if (route.pageState !== undefined) {
82
+ return typeof route.pageState === 'function'
83
+ ? route.pageState(context)
84
+ : route.pageState;
85
+ }
86
+ return getState ? getState() : {};
87
+ }
88
+ /**
89
+ * Create a router instance.
90
+ */
91
+ export function createRouter(options) {
92
+ const { routes, root, getState, providers = [] } = options;
93
+ const compiledRoutes = routes.map((route) => {
94
+ const compiled = compilePath(route.path);
95
+ return {
96
+ ...compiled,
97
+ route,
98
+ };
99
+ });
100
+ let currentPath = '/';
101
+ let currentParams = {};
102
+ let currentQuery = {};
103
+ let currentNavParams = {};
104
+ const appContext = {};
105
+ let currentPageModule = null;
106
+ let currentRoute = null;
107
+ let currentState = {};
108
+ const subscribedTargets = new WeakSet();
109
+ function subscribeIfReactive(state) {
110
+ if (!state || typeof state !== 'object')
111
+ return;
112
+ if (subscribedTargets.has(state))
113
+ return;
114
+ const maybeSubscribe = state.subscribe;
115
+ if (typeof maybeSubscribe === 'function') {
116
+ maybeSubscribe.call(state, () => {
117
+ void reRender();
118
+ });
119
+ subscribedTargets.add(state);
120
+ }
121
+ }
122
+ function initializeProviders(list) {
123
+ for (const provider of list) {
124
+ if (!provider || !provider.key)
125
+ continue;
126
+ const value = provider.create
127
+ ? provider.create({
128
+ context: appContext,
129
+ navigate,
130
+ getCurrentPath: () => currentPath,
131
+ getParams: () => ({ ...currentParams }),
132
+ getQuery: () => ({ ...currentQuery }),
133
+ getNavigationParams: () => ({ ...currentNavParams }),
134
+ })
135
+ : provider.value;
136
+ appContext[provider.key] = value;
137
+ subscribeIfReactive(value);
138
+ }
139
+ }
140
+ function getPageContext(route) {
141
+ return {
142
+ path: currentPath,
143
+ params: { ...currentParams },
144
+ query: { ...currentQuery },
145
+ navParams: { ...currentNavParams },
146
+ context: appContext,
147
+ route,
148
+ navigate,
149
+ };
150
+ }
151
+ async function renderCurrentPage() {
152
+ if (!currentPageModule || !currentRoute)
153
+ return;
154
+ if (currentPageModule.injectStyles) {
155
+ currentPageModule.injectStyles();
156
+ }
157
+ const page = currentPageModule.default;
158
+ if (!page) {
159
+ console.error('[Illimi Router] No default export from page module');
160
+ return;
161
+ }
162
+ const context = getPageContext(currentRoute);
163
+ const state = currentState;
164
+ const vnode = page(state, context);
165
+ mount(root, vnode, state);
166
+ if (typeof currentRoute.script === 'function') {
167
+ currentRoute.script(context, state);
168
+ }
169
+ }
170
+ async function reRender() {
171
+ try {
172
+ await renderCurrentPage();
173
+ }
174
+ catch (error) {
175
+ console.error('[Illimi Router] Re-render error:', error);
176
+ }
177
+ }
178
+ async function resolve(urlPath, navParams = {}) {
179
+ const { path, query } = parsePathAndQuery(urlPath);
180
+ const matched = matchRoute(path, compiledRoutes);
181
+ if (!matched) {
182
+ console.warn('[Illimi Router] Route not found:', path);
183
+ return;
184
+ }
185
+ currentPath = path;
186
+ currentQuery = query;
187
+ currentParams = matched.params;
188
+ currentNavParams = navParams;
189
+ currentRoute = matched.route;
190
+ try {
191
+ currentPageModule = await matched.route.page();
192
+ const context = getPageContext(matched.route);
193
+ currentState = resolvePageState(matched.route, context, getState);
194
+ subscribeIfReactive(currentState);
195
+ await renderCurrentPage();
196
+ }
197
+ catch (error) {
198
+ throw new Error(`Failed to load page for path: ${currentPath} ${error instanceof Error ? error.message : 'Unknown error'}`);
199
+ }
200
+ }
201
+ function navigate(path, options = {}) {
202
+ const nextUrl = buildPath(path, options);
203
+ const { path: normalizedPath } = parsePathAndQuery(nextUrl);
204
+ if (normalizedPath === currentPath && Object.keys(options.query || {}).length === 0 && !options.replace) {
205
+ return;
206
+ }
207
+ const historyState = { navParams: options.navParams || {} };
208
+ if (options.replace) {
209
+ history.replaceState(historyState, '', nextUrl);
210
+ }
211
+ else {
212
+ history.pushState(historyState, '', nextUrl);
213
+ }
214
+ void resolve(nextUrl, historyState.navParams);
215
+ }
216
+ function handlePopState(e) {
217
+ const navParams = (e.state?.navParams || {});
218
+ void resolve(location.pathname + location.search, navParams);
219
+ }
220
+ function handleClick(e) {
221
+ const target = e.target;
222
+ const anchor = target.closest('a');
223
+ if (!anchor)
224
+ return;
225
+ const href = anchor.getAttribute('href');
226
+ if (!href)
227
+ return;
228
+ if (href.startsWith('http') || href.startsWith('#') || href.startsWith('mailto:') || href.startsWith('tel:')) {
229
+ return;
230
+ }
231
+ if (!href.startsWith('/')) {
232
+ return;
233
+ }
234
+ e.preventDefault();
235
+ navigate(href);
236
+ }
237
+ window.addEventListener('popstate', handlePopState);
238
+ document.addEventListener('click', handleClick);
239
+ initializeProviders(providers);
240
+ return {
241
+ start() {
242
+ const navParams = (history.state?.navParams || {});
243
+ void resolve(location.pathname + location.search, navParams);
244
+ },
245
+ navigate,
246
+ getCurrentPath() {
247
+ return currentPath;
248
+ },
249
+ getParams() {
250
+ return { ...currentParams };
251
+ },
252
+ getQuery() {
253
+ return { ...currentQuery };
254
+ },
255
+ getNavigationParams() {
256
+ return { ...currentNavParams };
257
+ },
258
+ getContext() {
259
+ return appContext;
260
+ },
261
+ };
262
+ }
263
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * FeedJS Router - Types
3
+ */
4
+ export interface RouteParams {
5
+ [key: string]: string;
6
+ }
7
+ export interface QueryParams {
8
+ [key: string]: string;
9
+ }
10
+ export interface NavigationParams {
11
+ [key: string]: unknown;
12
+ }
13
+ export interface AppContext {
14
+ [key: string]: unknown;
15
+ }
16
+ export interface NavigateOptions {
17
+ params?: Record<string, string | number | boolean>;
18
+ query?: Record<string, string | number | boolean | null | undefined>;
19
+ navParams?: NavigationParams;
20
+ replace?: boolean;
21
+ }
22
+ export interface ProviderHelpers {
23
+ context: AppContext;
24
+ navigate: (path: string, options?: NavigateOptions) => void;
25
+ getCurrentPath: () => string;
26
+ getParams: () => RouteParams;
27
+ getQuery: () => QueryParams;
28
+ getNavigationParams: () => NavigationParams;
29
+ }
30
+ export interface AppContextProvider {
31
+ key: string;
32
+ value?: unknown;
33
+ create?: (helpers: ProviderHelpers) => unknown;
34
+ }
35
+ export interface PageContext {
36
+ path: string;
37
+ params: RouteParams;
38
+ query: QueryParams;
39
+ navParams: NavigationParams;
40
+ context: AppContext;
41
+ route: Route;
42
+ navigate: (path: string, options?: NavigateOptions) => void;
43
+ }
44
+ export type PageStateFactory = (context: PageContext) => any;
45
+ export type RouteScript = (context: PageContext, state: any) => void;
46
+ export interface Route {
47
+ path: string;
48
+ page: () => Promise<any> | any;
49
+ pageState?: any | PageStateFactory;
50
+ script?: RouteScript;
51
+ }
52
+ export interface RouterOptions {
53
+ routes: Route[];
54
+ root: HTMLElement;
55
+ getState?: () => any;
56
+ providers?: AppContextProvider[];
57
+ }
58
+ export interface Router {
59
+ start: () => void;
60
+ navigate: (path: string, options?: NavigateOptions) => void;
61
+ getCurrentPath: () => string;
62
+ getParams: () => RouteParams;
63
+ getQuery: () => QueryParams;
64
+ getNavigationParams: () => NavigationParams;
65
+ getContext: () => AppContext;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrE,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5D,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,WAAW,CAAC;IAC7B,QAAQ,EAAE,MAAM,WAAW,CAAC;IAC5B,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;CAC7D;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,GAAG,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;AAErE,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC/B,SAAS,CAAC,EAAE,GAAG,GAAG,gBAAgB,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5D,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,WAAW,CAAC;IAC7B,QAAQ,EAAE,MAAM,WAAW,CAAC;IAC5B,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;IAC5C,UAAU,EAAE,MAAM,UAAU,CAAC;CAC9B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * FeedJS Router - Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Illimi Runtime - Reactive Store
3
+ *
4
+ * Small state container for app-level or page-level state.
5
+ */
6
+ export type Listener = () => void;
7
+ export interface Store<T extends Record<string, any>> {
8
+ get: () => T;
9
+ set: (next: T) => void;
10
+ patch: (partial: Partial<T>) => void;
11
+ update: (updater: (current: T) => T) => void;
12
+ subscribe: (listener: Listener) => () => void;
13
+ }
14
+ export declare function createStore<T extends Record<string, any>>(initial: T): Store<T>;
15
+ //# sourceMappingURL=store.d.ts.map