@siddh-dev/fabric 0.1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +430 -0
  3. package/dist/core/component/ComponentInstance.d.ts +2 -0
  4. package/dist/core/component/ComponentInstance.js +15 -0
  5. package/dist/core/component/ComponentInstance.js.map +1 -0
  6. package/dist/core/component/ComponentRuntime.d.ts +3 -0
  7. package/dist/core/component/ComponentRuntime.js +19 -0
  8. package/dist/core/component/ComponentRuntime.js.map +1 -0
  9. package/dist/core/hooks/HookRuntime.d.ts +3 -0
  10. package/dist/core/hooks/HookRuntime.js +11 -0
  11. package/dist/core/hooks/HookRuntime.js.map +1 -0
  12. package/dist/core/hooks/useEffect.d.ts +4 -0
  13. package/dist/core/hooks/useEffect.js +68 -0
  14. package/dist/core/hooks/useEffect.js.map +1 -0
  15. package/dist/core/hooks/useState.d.ts +7 -0
  16. package/dist/core/hooks/useState.js +35 -0
  17. package/dist/core/hooks/useState.js.map +1 -0
  18. package/dist/core/jsx/jsx-dev-runtime.d.ts +2 -0
  19. package/dist/core/jsx/jsx-dev-runtime.js +5 -0
  20. package/dist/core/jsx/jsx-dev-runtime.js.map +1 -0
  21. package/dist/core/jsx/jsx-runtime.d.ts +3 -0
  22. package/dist/core/jsx/jsx-runtime.js +8 -0
  23. package/dist/core/jsx/jsx-runtime.js.map +1 -0
  24. package/dist/core/jsx/jsx.d.ts +68 -0
  25. package/dist/core/jsx/jsx.js +46 -0
  26. package/dist/core/jsx/jsx.js.map +1 -0
  27. package/dist/core/scheduler/Scheduler.d.ts +3 -0
  28. package/dist/core/scheduler/Scheduler.js +21 -0
  29. package/dist/core/scheduler/Scheduler.js.map +1 -0
  30. package/dist/core/vnode/VNode.d.ts +34 -0
  31. package/dist/core/vnode/VNode.js +24 -0
  32. package/dist/core/vnode/VNode.js.map +1 -0
  33. package/dist/core/vnode/createElement.d.ts +2 -0
  34. package/dist/core/vnode/createElement.js +5 -0
  35. package/dist/core/vnode/createElement.js.map +1 -0
  36. package/dist/dom/DOMProperties.d.ts +2 -0
  37. package/dist/dom/DOMProperties.js +46 -0
  38. package/dist/dom/DOMProperties.js.map +1 -0
  39. package/dist/dom/EventSystem.d.ts +7 -0
  40. package/dist/dom/EventSystem.js +53 -0
  41. package/dist/dom/EventSystem.js.map +1 -0
  42. package/dist/dom/Reconciler.d.ts +20 -0
  43. package/dist/dom/Reconciler.js +326 -0
  44. package/dist/dom/Reconciler.js.map +1 -0
  45. package/dist/index.d.ts +6 -0
  46. package/dist/index.js +6 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/runtime/createRoot.d.ts +6 -0
  49. package/dist/runtime/createRoot.js +25 -0
  50. package/dist/runtime/createRoot.js.map +1 -0
  51. package/package.json +56 -0
@@ -0,0 +1,326 @@
1
+ import { createComponentInstance } from "../core/component/ComponentInstance.js";
2
+ import { runComponent } from "../core/component/ComponentRuntime.js";
3
+ import { cleanupEffects, executeEffects } from "../core/hooks/useEffect.js";
4
+ import { setDOMProperty } from "./DOMProperties.js";
5
+ import { EventSystem } from "./EventSystem.js";
6
+ import { VNode } from "../core/vnode/VNode.js";
7
+ export class Reconciler {
8
+ eventSystem;
9
+ constructor() {
10
+ this.eventSystem =
11
+ new EventSystem();
12
+ }
13
+ patch(parent, oldVNode, newVNode, dom) {
14
+ if (oldVNode === null &&
15
+ newVNode === null) {
16
+ return null;
17
+ }
18
+ if (oldVNode === null &&
19
+ newVNode !== null) {
20
+ return this.mount(parent, newVNode, dom);
21
+ }
22
+ if (newVNode === null &&
23
+ oldVNode !== null) {
24
+ this.unmount(parent, oldVNode, dom);
25
+ return null;
26
+ }
27
+ if (oldVNode === null ||
28
+ newVNode === null) {
29
+ return null;
30
+ }
31
+ if (this.shouldReplace(oldVNode, newVNode)) {
32
+ const newDom = this.mount(parent, newVNode, dom);
33
+ this.unmount(parent, oldVNode, dom, newDom);
34
+ return newDom;
35
+ }
36
+ if (this.isComponent(newVNode)) {
37
+ return this.updateComponent(parent, oldVNode, newVNode, dom);
38
+ }
39
+ if (this.isTextVNode(newVNode)) {
40
+ return this.updateText(oldVNode, newVNode, dom);
41
+ }
42
+ return this.updateElement(parent, oldVNode, newVNode, dom);
43
+ }
44
+ mount(parent, vnode, before) {
45
+ if (this.isComponent(vnode)) {
46
+ return this.mountComponent(parent, vnode, before);
47
+ }
48
+ if (this.isTextVNode(vnode)) {
49
+ const text = document.createTextNode(String(vnode.children[0] ??
50
+ ""));
51
+ vnode.dom =
52
+ text;
53
+ this.insertNode(parent, text, before);
54
+ return text;
55
+ }
56
+ const element = document.createElement(vnode.type);
57
+ vnode.dom =
58
+ element;
59
+ this.updateProps(element, {}, vnode.props);
60
+ const children = this.normalizeChildren(vnode);
61
+ for (const child of children) {
62
+ this.mount(element, child, null);
63
+ }
64
+ this.insertNode(parent, element, before);
65
+ return element;
66
+ }
67
+ mountComponent(parent, vnode, before) {
68
+ const component = vnode.type;
69
+ const instance = createComponentInstance(component, vnode.props);
70
+ vnode.instance =
71
+ instance;
72
+ let renderedVNode = null;
73
+ runComponent(instance, () => {
74
+ renderedVNode =
75
+ component(vnode.props);
76
+ });
77
+ if (renderedVNode === null) {
78
+ throw new Error("A Fabric component must return a VNode.");
79
+ }
80
+ instance.renderedVNode =
81
+ renderedVNode;
82
+ const componentDom = this.mount(parent, renderedVNode, before);
83
+ instance.dom =
84
+ componentDom;
85
+ instance.mounted =
86
+ true;
87
+ vnode.dom =
88
+ componentDom;
89
+ instance.update =
90
+ () => {
91
+ if (!instance.mounted ||
92
+ instance.renderedVNode ===
93
+ null) {
94
+ return;
95
+ }
96
+ let nextRenderedVNode = null;
97
+ runComponent(instance, () => {
98
+ nextRenderedVNode =
99
+ instance.component(instance.props);
100
+ });
101
+ if (nextRenderedVNode ===
102
+ null) {
103
+ throw new Error("A Fabric component must return a VNode.");
104
+ }
105
+ const updatedDom = this.patch(parent, instance.renderedVNode, nextRenderedVNode, instance.dom);
106
+ instance.renderedVNode =
107
+ nextRenderedVNode;
108
+ instance.dom =
109
+ updatedDom;
110
+ executeEffects(instance);
111
+ };
112
+ executeEffects(instance);
113
+ return componentDom;
114
+ }
115
+ updateComponent(parent, oldVNode, newVNode, dom) {
116
+ const instance = oldVNode.instance;
117
+ if (instance === null) {
118
+ return this.mount(parent, newVNode, dom);
119
+ }
120
+ instance.props =
121
+ newVNode.props;
122
+ newVNode.instance =
123
+ instance;
124
+ let nextRenderedVNode = null;
125
+ runComponent(instance, () => {
126
+ nextRenderedVNode =
127
+ instance.component(newVNode.props);
128
+ });
129
+ if (nextRenderedVNode ===
130
+ null) {
131
+ throw new Error("A Fabric component must return a VNode.");
132
+ }
133
+ const updatedDom = this.patch(parent, instance.renderedVNode, nextRenderedVNode, instance.dom);
134
+ instance.renderedVNode =
135
+ nextRenderedVNode;
136
+ instance.dom =
137
+ updatedDom;
138
+ newVNode.dom =
139
+ updatedDom;
140
+ executeEffects(instance);
141
+ return updatedDom;
142
+ }
143
+ updateElement(parent, oldVNode, newVNode, dom) {
144
+ if (!(dom instanceof HTMLElement)) {
145
+ return this.mount(parent, newVNode, dom);
146
+ }
147
+ const element = dom;
148
+ newVNode.dom =
149
+ element;
150
+ this.updateProps(element, oldVNode.props, newVNode.props);
151
+ this.updateChildren(element, oldVNode, newVNode);
152
+ return element;
153
+ }
154
+ updateText(oldVNode, newVNode, dom) {
155
+ if (!(dom instanceof Text)) {
156
+ return null;
157
+ }
158
+ const oldText = String(oldVNode.children[0] ??
159
+ "");
160
+ const newText = String(newVNode.children[0] ??
161
+ "");
162
+ if (oldText !== newText) {
163
+ dom.nodeValue =
164
+ newText;
165
+ }
166
+ newVNode.dom =
167
+ dom;
168
+ return dom;
169
+ }
170
+ updateChildren(parent, oldVNode, newVNode) {
171
+ const oldChildren = this.normalizeChildren(oldVNode);
172
+ const newChildren = this.normalizeChildren(newVNode);
173
+ const oldRecords = oldChildren.map(child => ({
174
+ vnode: child,
175
+ dom: child.dom ??
176
+ document.createTextNode("")
177
+ }));
178
+ const used = new Set();
179
+ let unkeyedCursor = 0;
180
+ for (let newIndex = 0; newIndex <
181
+ newChildren.length; newIndex++) {
182
+ const newChild = newChildren[newIndex];
183
+ let matched = null;
184
+ if (newChild.key !== null) {
185
+ matched =
186
+ oldRecords.find(record => !used.has(record) &&
187
+ record.vnode.key ===
188
+ newChild.key) ?? null;
189
+ }
190
+ else {
191
+ while (unkeyedCursor <
192
+ oldRecords.length) {
193
+ const candidate = oldRecords[unkeyedCursor];
194
+ unkeyedCursor++;
195
+ if (used.has(candidate)) {
196
+ continue;
197
+ }
198
+ if (candidate.vnode.key ===
199
+ null) {
200
+ matched =
201
+ candidate;
202
+ break;
203
+ }
204
+ }
205
+ }
206
+ if (matched !== null) {
207
+ used.add(matched);
208
+ const updatedDom = this.patch(parent, matched.vnode, newChild, matched.dom);
209
+ if (updatedDom !== null) {
210
+ const reference = parent.childNodes[newIndex] ?? null;
211
+ this.moveNode(parent, updatedDom, reference);
212
+ }
213
+ continue;
214
+ }
215
+ const reference = parent.childNodes[newIndex] ?? null;
216
+ this.mount(parent, newChild, reference);
217
+ }
218
+ for (const record of oldRecords) {
219
+ if (used.has(record)) {
220
+ continue;
221
+ }
222
+ this.unmount(parent, record.vnode, record.dom);
223
+ }
224
+ }
225
+ updateProps(element, oldProps, newProps) {
226
+ const keys = new Set([
227
+ ...Object.keys(oldProps),
228
+ ...Object.keys(newProps)
229
+ ]);
230
+ for (const key of keys) {
231
+ if (key === "key") {
232
+ continue;
233
+ }
234
+ const oldValue = oldProps[key];
235
+ const newValue = newProps[key];
236
+ if (key.startsWith("on")) {
237
+ if (oldValue !==
238
+ newValue) {
239
+ this.eventSystem.updateEvent(element, key, newValue);
240
+ }
241
+ continue;
242
+ }
243
+ if (oldValue ===
244
+ newValue) {
245
+ continue;
246
+ }
247
+ setDOMProperty(element, key, newValue);
248
+ }
249
+ }
250
+ unmount(parent, vnode, dom, replacement = null) {
251
+ if (this.isComponent(vnode)) {
252
+ const instance = vnode.instance;
253
+ if (instance !== null) {
254
+ if (instance.renderedVNode !==
255
+ null) {
256
+ this.unmount(parent, instance.renderedVNode, instance.dom, replacement);
257
+ }
258
+ cleanupEffects(instance);
259
+ instance.mounted =
260
+ false;
261
+ instance.update =
262
+ null;
263
+ instance.dom =
264
+ null;
265
+ instance.renderedVNode =
266
+ null;
267
+ }
268
+ vnode.instance =
269
+ null;
270
+ vnode.dom =
271
+ null;
272
+ return;
273
+ }
274
+ if (dom instanceof HTMLElement) {
275
+ this.eventSystem.removeAllEvents(dom);
276
+ }
277
+ if (dom !== null &&
278
+ dom.parentNode === parent &&
279
+ dom !== replacement) {
280
+ parent.removeChild(dom);
281
+ }
282
+ vnode.dom =
283
+ null;
284
+ }
285
+ normalizeChildren(vnode) {
286
+ if (vnode.normalizedChildren !==
287
+ null) {
288
+ return vnode.normalizedChildren;
289
+ }
290
+ const normalized = vnode.children.map(child => child instanceof VNode
291
+ ? child
292
+ : new VNode("#text", {}, [
293
+ String(child)
294
+ ]));
295
+ vnode.normalizedChildren =
296
+ normalized;
297
+ return normalized;
298
+ }
299
+ insertNode(parent, node, before) {
300
+ parent.insertBefore(node, before);
301
+ }
302
+ moveNode(parent, node, reference) {
303
+ if (node === reference) {
304
+ return;
305
+ }
306
+ parent.insertBefore(node, reference);
307
+ }
308
+ isComponent(vnode) {
309
+ return (typeof vnode.type ===
310
+ "function");
311
+ }
312
+ isTextVNode(vnode) {
313
+ return (vnode.type ===
314
+ "#text");
315
+ }
316
+ shouldReplace(oldVNode, newVNode) {
317
+ if (this.isTextVNode(oldVNode) ||
318
+ this.isTextVNode(newVNode)) {
319
+ return (this.isTextVNode(oldVNode) !==
320
+ this.isTextVNode(newVNode));
321
+ }
322
+ return (oldVNode.type !==
323
+ newVNode.type);
324
+ }
325
+ }
326
+ //# sourceMappingURL=Reconciler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reconciler.js","sourceRoot":"","sources":["../../src/dom/Reconciler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { createElement } from "./core/vnode/createElement.js";
2
+ export { jsx } from "./core/jsx/jsx.js";
3
+ export { useState } from "./core/hooks/useState.js";
4
+ export { useEffect } from "./core/hooks/useEffect.js";
5
+ export { createRoot } from "./runtime/createRoot.js";
6
+ export type { VNode } from "./core/vnode/VNode.js";
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { createElement } from "./core/vnode/createElement.js";
2
+ export { jsx } from "./core/jsx/jsx.js";
3
+ export { useState } from "./core/hooks/useState.js";
4
+ export { useEffect } from "./core/hooks/useEffect.js";
5
+ export { createRoot } from "./runtime/createRoot.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAC,GAAG,EAAC,MAAM,mBAAmB,CAAC;AAEtC,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,2BAA2B,CAAC;AAEpD,OAAO,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { VNode } from "../core/vnode/VNode.js";
2
+ export interface IRoot {
3
+ render(vnode: VNode): void;
4
+ unmount(): void;
5
+ }
6
+ export declare function createRoot(container: HTMLElement): IRoot;
@@ -0,0 +1,25 @@
1
+ import { Reconciler } from "../dom/Reconciler.js";
2
+ export function createRoot(container) {
3
+ const reconciler = new Reconciler();
4
+ let currentVNode = null;
5
+ let currentDom = null;
6
+ return {
7
+ render(vnode) {
8
+ currentDom =
9
+ reconciler.patch(container, currentVNode, vnode, currentDom);
10
+ currentVNode =
11
+ vnode;
12
+ },
13
+ unmount() {
14
+ if (currentVNode === null) {
15
+ return;
16
+ }
17
+ reconciler.patch(container, currentVNode, null, currentDom);
18
+ currentVNode =
19
+ null;
20
+ currentDom =
21
+ null;
22
+ }
23
+ };
24
+ }
25
+ //# sourceMappingURL=createRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createRoot.js","sourceRoot":"","sources":["../../src/runtime/createRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACb,MAAM,sBAAsB,CAAC;AAc9B,MAAM,UAAU,UAAU,CACtB,SAAsB;IAEtB,MAAM,UAAU,GACZ,IAAI,UAAU,EAAE,CAAC;IAErB,IAAI,YAAY,GAEH,IAAI,CAAC;IAElB,IAAI,UAAU,GAED,IAAI,CAAC;IAElB,OAAO;QACH,MAAM,CACF,KAAY;YAEZ,UAAU;gBACN,UAAU,CAAC,KAAK,CACZ,SAAS,EAET,YAAY,EAEZ,KAAK,EAEL,UAAU,CACb,CAAC;YAEN,YAAY;gBACR,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACH,IACI,YAAY,KAAK,IAAI,EACvB,CAAC;gBACC,OAAO;YACX,CAAC;YAED,UAAU,CAAC,KAAK,CACZ,SAAS,EAET,YAAY,EAEZ,IAAI,EAEJ,UAAU,CACb,CAAC;YAEF,YAAY;gBACR,IAAI,CAAC;YAET,UAAU;gBACN,IAAI,CAAC;QACb,CAAC;KACJ,CAAC;AACN,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@siddh-dev/fabric",
3
+ "version": "0.1.0",
4
+ "description": "A lightweight frontend UI runtime built from scratch with TypeScript.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./jsx-runtime": {
14
+ "types": "./dist/core/jsx/jsx-runtime.d.ts",
15
+ "import": "./dist/core/jsx/jsx-runtime.js"
16
+ },
17
+ "./jsx-dev-runtime": {
18
+ "types": "./dist/core/jsx/jsx-dev-runtime.d.ts",
19
+ "import": "./dist/core/jsx/jsx-dev-runtime.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "keywords": [
26
+ "ui",
27
+ "frontend",
28
+ "runtime",
29
+ "typescript",
30
+ "javascript",
31
+ "virtual-dom",
32
+ "jsx"
33
+ ],
34
+ "author": "Siddhant Mul",
35
+ "license": "MIT",
36
+ "devEngines": {
37
+ "packageManager": {
38
+ "name": "pnpm",
39
+ "version": "11.25.0",
40
+ "onFail": "download"
41
+ }
42
+ },
43
+ "devDependencies": {
44
+ "jsdom": "^30.1.0",
45
+ "typescript": "^7.0.2",
46
+ "vitest": "^5.0.1"
47
+ },
48
+ "scripts": {
49
+ "dev": "tsc --watch",
50
+ "clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
51
+ "build": "pnpm clean && tsc",
52
+ "check": "tsc --noEmit",
53
+ "test": "vitest",
54
+ "test:run": "vitest run"
55
+ }
56
+ }