@toyz/loom 0.9.0 → 0.10.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/dist/element/element.d.ts +3 -0
- package/dist/element/element.d.ts.map +1 -1
- package/dist/element/element.js +21 -0
- package/dist/element/element.js.map +1 -1
- package/dist/element/form.d.ts +3 -1
- package/dist/element/form.d.ts.map +1 -1
- package/dist/element/form.js +33 -24
- package/dist/element/form.js.map +1 -1
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js +69 -5
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/query/decorators.d.ts.map +1 -1
- package/dist/query/decorators.js +10 -2
- package/dist/query/decorators.js.map +1 -1
- package/dist/store/decorators.d.ts.map +1 -1
- package/dist/store/decorators.js +18 -28
- package/dist/store/decorators.js.map +1 -1
- package/dist/store/reactive.d.ts +12 -0
- package/dist/store/reactive.d.ts.map +1 -1
- package/dist/store/reactive.js +26 -0
- package/dist/store/reactive.js.map +1 -1
- package/dist/trace.d.ts +93 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +176 -0
- package/dist/trace.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { type Constructor, type Handler } from "../bus";
|
|
2
2
|
import { type LoomEvent } from "../event";
|
|
3
3
|
import { type CSSValue } from "../css";
|
|
4
|
+
import { type TraceDeps } from "../trace";
|
|
4
5
|
export declare abstract class LoomElement extends HTMLElement {
|
|
5
6
|
/** Access the LoomApp instance for inline provider resolution */
|
|
6
7
|
protected get app(): import("..").LoomApp;
|
|
7
8
|
protected shadow: ShadowRoot;
|
|
8
9
|
private cleanups;
|
|
10
|
+
/** @internal — dependency tracking for traced template projection */
|
|
11
|
+
__traceDeps: TraceDeps | null;
|
|
9
12
|
constructor();
|
|
10
13
|
/** Adopt styles — supports both tagged template and string */
|
|
11
14
|
protected css(text: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAIjD,OAAO,EAAqF,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAE7H,8BAAsB,WAAY,SAAQ,WAAW;IACnD,iEAAiE;IACjE,SAAS,KAAK,GAAG,yBAAkB;IAEnC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAsB;IACtC,qEAAqE;IACrE,WAAW,EAAE,SAAS,GAAG,IAAI,CAAQ;;IASrC,8DAA8D;IAC9D,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI;IAQzE;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAU1C,8DAA8D;IAC9D,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAMtE,yBAAyB;IACzB,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAMnD,sDAAsD;IACtD,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAM9B,uCAAuC;IACvC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAInE,0CAA0C;IAC1C,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE;IAM/D,iBAAiB,IAAI,IAAI;IAazB,oBAAoB,IAAI,IAAI;IAQ5B;;;OAGG;IACH,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI;IAE9B;;;OAGG;IACH,YAAY,IAAI,IAAI;IAEpB;;;OAGG;IACH,YAAY,IAAI,OAAO;IAMvB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAE5B,0DAA0D;IAC1D,cAAc,IAAI,IAAI;IAoDtB;;;OAGG;IACH,KAAK,IAAI,IAAI;CAKd"}
|
package/dist/element/element.js
CHANGED
|
@@ -3,11 +3,14 @@ import { adoptCSS } from "../css";
|
|
|
3
3
|
import { COMPUTED_DIRTY, REACTIVES, CONNECT_HOOKS, FIRST_UPDATED_HOOKS } from "../decorators/symbols";
|
|
4
4
|
import { morph } from "../morph";
|
|
5
5
|
import { app } from "../app";
|
|
6
|
+
import { startTrace, endTrace, hasDirtyDeps, canFastPatch, applyBindings, refreshSnapshots } from "../trace";
|
|
6
7
|
export class LoomElement extends HTMLElement {
|
|
7
8
|
/** Access the LoomApp instance for inline provider resolution */
|
|
8
9
|
get app() { return app; }
|
|
9
10
|
shadow;
|
|
10
11
|
cleanups = [];
|
|
12
|
+
/** @internal — dependency tracking for traced template projection */
|
|
13
|
+
__traceDeps = null;
|
|
11
14
|
constructor() {
|
|
12
15
|
super();
|
|
13
16
|
this.shadow = this.attachShadow({ mode: "open" });
|
|
@@ -101,15 +104,33 @@ export class LoomElement extends HTMLElement {
|
|
|
101
104
|
this._updateScheduled = false;
|
|
102
105
|
if (!this.shouldUpdate())
|
|
103
106
|
return;
|
|
107
|
+
// Tier 1 — SKIP: no traced dependency changed
|
|
108
|
+
if (this.__traceDeps && !hasDirtyDeps(this.__traceDeps))
|
|
109
|
+
return;
|
|
110
|
+
// Tier 2 — FAST PATCH: all dirty deps have bindings
|
|
111
|
+
if (this.__traceDeps && canFastPatch(this.__traceDeps)) {
|
|
112
|
+
// Dirty @computed caches (they may depend on a fast-patched reactive)
|
|
113
|
+
for (const dirtyKey of this[COMPUTED_DIRTY] ?? []) {
|
|
114
|
+
this[dirtyKey] = true;
|
|
115
|
+
}
|
|
116
|
+
applyBindings(this.__traceDeps);
|
|
117
|
+
refreshSnapshots(this.__traceDeps);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Tier 3 — FULL MORPH: structural change or first render
|
|
104
121
|
// Dirty all @computed caches
|
|
105
122
|
for (const dirtyKey of this[COMPUTED_DIRTY] ?? []) {
|
|
106
123
|
this[dirtyKey] = true;
|
|
107
124
|
}
|
|
125
|
+
// Trace reactive reads during update()
|
|
126
|
+
startTrace();
|
|
108
127
|
const result = this.update();
|
|
109
128
|
// Auto-morph if update() returned DOM nodes
|
|
110
129
|
if (result != null) {
|
|
111
130
|
morph(this.shadow, result);
|
|
112
131
|
}
|
|
132
|
+
// Capture/refresh dependency tracking + bindings
|
|
133
|
+
this.__traceDeps = endTrace();
|
|
113
134
|
if (!this._hasUpdated) {
|
|
114
135
|
this._hasUpdated = true;
|
|
115
136
|
this.firstUpdated();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAkC,MAAM,QAAQ,CAAC;AAE7D,OAAO,EAAiB,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACtG,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/element/element.ts"],"names":[],"mappings":"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"}
|
package/dist/element/form.d.ts
CHANGED
|
@@ -48,7 +48,9 @@ export interface FormState<T> {
|
|
|
48
48
|
bind(field: keyof T): (e: Event) => void;
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
|
-
* Create a FormState<T> instance —
|
|
51
|
+
* Create a FormState<T> instance — backed by Reactive primitives.
|
|
52
|
+
* All state reads go through Reactive.value (traceable),
|
|
53
|
+
* all mutations go through Reactive.set()/notify() (fires subscribers).
|
|
52
54
|
*/
|
|
53
55
|
export declare function createFormState<T extends object>(schema: FormSchema<T>, scheduleUpdate: () => void): FormState<T>;
|
|
54
56
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/element/form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/element/form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAMvC,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,8EAA8E;IAC9E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAAC;IACd,kEAAkE;IAClE,QAAQ,IAAI,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5D,iEAAiE;IACjE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1C;AAgBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,cAAc,EAAE,MAAM,IAAI,GACzB,SAAS,CAAC,CAAC,CAAC,CAgHd;AAID;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EACnC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAEb,IAAI,SAAS,MAAM,EACzB,SAAS,4BAA4B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EACzD,SAAS,6BAA6B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KACzD,4BAA4B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAgBpD"}
|
package/dist/element/form.js
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
24
|
import { LoomResult } from "../result";
|
|
25
|
+
import { Reactive } from "../store/reactive";
|
|
25
26
|
// ── Helpers ──
|
|
26
27
|
/**
|
|
27
28
|
* Read a form element's value, handling checkboxes.
|
|
@@ -34,67 +35,77 @@ function readInputValue(input) {
|
|
|
34
35
|
}
|
|
35
36
|
// ── Core ──
|
|
36
37
|
/**
|
|
37
|
-
* Create a FormState<T> instance —
|
|
38
|
+
* Create a FormState<T> instance — backed by Reactive primitives.
|
|
39
|
+
* All state reads go through Reactive.value (traceable),
|
|
40
|
+
* all mutations go through Reactive.set()/notify() (fires subscribers).
|
|
38
41
|
*/
|
|
39
42
|
export function createFormState(schema, scheduleUpdate) {
|
|
40
43
|
// Initialize all fields to empty string (or transform of empty)
|
|
41
44
|
const initial = {};
|
|
42
|
-
const
|
|
43
|
-
const errors = {};
|
|
44
|
-
const touched = new Set();
|
|
45
|
-
let validatedAll = false;
|
|
45
|
+
const initData = {};
|
|
46
46
|
for (const key of Object.keys(schema)) {
|
|
47
47
|
const fieldSchema = schema[key];
|
|
48
48
|
const raw = "";
|
|
49
49
|
const transformed = fieldSchema?.transform ? fieldSchema.transform(raw) : raw;
|
|
50
50
|
initial[key] = transformed;
|
|
51
|
-
|
|
51
|
+
initData[key] = transformed;
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
// Reactive-backed state
|
|
54
|
+
const currentR = new Reactive({ ...initData });
|
|
55
|
+
const errorsR = new Reactive({});
|
|
56
|
+
const validR = new Reactive(true);
|
|
57
|
+
const touched = new Set();
|
|
58
|
+
let validatedAll = false;
|
|
54
59
|
// Compute initial validity (without surfacing errors)
|
|
60
|
+
let initValid = true;
|
|
55
61
|
for (const key of Object.keys(schema)) {
|
|
56
62
|
const fieldSchema = schema[key];
|
|
57
63
|
if (fieldSchema?.validate) {
|
|
58
|
-
const result = fieldSchema.validate(
|
|
64
|
+
const result = fieldSchema.validate(initData[key]);
|
|
59
65
|
if (result !== true)
|
|
60
|
-
|
|
66
|
+
initValid = false;
|
|
61
67
|
}
|
|
62
68
|
}
|
|
69
|
+
validR.set(initValid);
|
|
63
70
|
// Validation — only surfaces errors for touched fields (or all if validate() was called)
|
|
64
71
|
function runValidation() {
|
|
72
|
+
const current = currentR.value;
|
|
73
|
+
const newErrors = {};
|
|
65
74
|
let allValid = true;
|
|
66
75
|
for (const key of Object.keys(schema)) {
|
|
67
76
|
const fieldSchema = schema[key];
|
|
68
77
|
if (fieldSchema?.validate) {
|
|
69
78
|
const result = fieldSchema.validate(current[key]);
|
|
70
79
|
if (result === true) {
|
|
71
|
-
|
|
80
|
+
// valid — no error
|
|
72
81
|
}
|
|
73
82
|
else {
|
|
74
83
|
allValid = false;
|
|
75
84
|
// Only surface error if field was touched or validate() was called
|
|
76
85
|
if (touched.has(key) || validatedAll) {
|
|
77
|
-
|
|
86
|
+
newErrors[key] = result;
|
|
78
87
|
}
|
|
79
88
|
}
|
|
80
89
|
}
|
|
81
90
|
}
|
|
82
|
-
|
|
91
|
+
errorsR.set(newErrors);
|
|
92
|
+
validR.set(allValid);
|
|
83
93
|
return allValid;
|
|
84
94
|
}
|
|
85
95
|
// Bind handlers cache
|
|
86
96
|
const bindCache = new Map();
|
|
87
97
|
const state = {
|
|
88
98
|
get data() {
|
|
89
|
-
return
|
|
99
|
+
return currentR.value;
|
|
90
100
|
},
|
|
91
101
|
get errors() {
|
|
92
|
-
return
|
|
102
|
+
return errorsR.value;
|
|
93
103
|
},
|
|
94
104
|
get valid() {
|
|
95
|
-
return
|
|
105
|
+
return validR.value;
|
|
96
106
|
},
|
|
97
107
|
get dirty() {
|
|
108
|
+
const current = currentR.value;
|
|
98
109
|
for (const key of Object.keys(schema)) {
|
|
99
110
|
if (current[key] !== initial[key])
|
|
100
111
|
return true;
|
|
@@ -102,15 +113,11 @@ export function createFormState(schema, scheduleUpdate) {
|
|
|
102
113
|
return false;
|
|
103
114
|
},
|
|
104
115
|
reset() {
|
|
105
|
-
|
|
106
|
-
current[key] = initial[key];
|
|
107
|
-
}
|
|
116
|
+
currentR.set({ ...initial });
|
|
108
117
|
touched.clear();
|
|
109
118
|
validatedAll = false;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
delete errors[key];
|
|
113
|
-
}
|
|
119
|
+
errorsR.set({});
|
|
120
|
+
validR.set(true);
|
|
114
121
|
scheduleUpdate();
|
|
115
122
|
},
|
|
116
123
|
validate() {
|
|
@@ -118,8 +125,8 @@ export function createFormState(schema, scheduleUpdate) {
|
|
|
118
125
|
const valid = runValidation();
|
|
119
126
|
scheduleUpdate();
|
|
120
127
|
if (valid)
|
|
121
|
-
return LoomResult.ok(
|
|
122
|
-
return LoomResult.err({ ...
|
|
128
|
+
return LoomResult.ok(currentR.value);
|
|
129
|
+
return LoomResult.err({ ...errorsR.value });
|
|
123
130
|
},
|
|
124
131
|
bind(field) {
|
|
125
132
|
const key = field;
|
|
@@ -129,7 +136,9 @@ export function createFormState(schema, scheduleUpdate) {
|
|
|
129
136
|
const raw = readInputValue(input);
|
|
130
137
|
const fieldSchema = schema[field];
|
|
131
138
|
const transformed = fieldSchema?.transform ? fieldSchema.transform(raw) : raw;
|
|
139
|
+
const current = currentR.value;
|
|
132
140
|
current[key] = transformed;
|
|
141
|
+
currentR.notify();
|
|
133
142
|
touched.add(key);
|
|
134
143
|
runValidation();
|
|
135
144
|
scheduleUpdate();
|
package/dist/element/form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/element/form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/element/form.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/jsx-runtime.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Configure via tsconfig: "jsxImportSource": "loom"
|
|
6
6
|
*/
|
|
7
7
|
import { LOOM_EVENTS } from "./morph";
|
|
8
|
+
import { startSubTrace, endSubTrace, addBinding } from "./trace";
|
|
8
9
|
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
9
10
|
const SVG_TAGS = new Set([
|
|
10
11
|
"svg", "path", "circle", "rect", "line", "polyline", "polygon",
|
|
@@ -42,11 +43,38 @@ export function jsx(tag, props) {
|
|
|
42
43
|
Object.assign(el.style, val);
|
|
43
44
|
}
|
|
44
45
|
else if (key === "className" || key === "class") {
|
|
45
|
-
if (
|
|
46
|
-
|
|
46
|
+
if (typeof val === "function") {
|
|
47
|
+
// Closure binding for class
|
|
48
|
+
startSubTrace();
|
|
49
|
+
try {
|
|
50
|
+
const res = val();
|
|
51
|
+
if (isSVG)
|
|
52
|
+
el.setAttribute("class", String(res));
|
|
53
|
+
else
|
|
54
|
+
el.className = String(res);
|
|
55
|
+
const deps = endSubTrace();
|
|
56
|
+
if (deps.size > 0) {
|
|
57
|
+
addBinding(deps, el, () => {
|
|
58
|
+
const v = val();
|
|
59
|
+
if (isSVG)
|
|
60
|
+
el.setAttribute("class", String(v));
|
|
61
|
+
else
|
|
62
|
+
el.className = String(v);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
console.error("Loom: Error executing class binding", e);
|
|
68
|
+
endSubTrace();
|
|
69
|
+
}
|
|
47
70
|
}
|
|
48
71
|
else {
|
|
49
|
-
|
|
72
|
+
if (isSVG) {
|
|
73
|
+
el.setAttribute("class", val);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
el.className = val;
|
|
77
|
+
}
|
|
50
78
|
}
|
|
51
79
|
}
|
|
52
80
|
else if (key === "htmlFor") {
|
|
@@ -67,8 +95,23 @@ export function jsx(tag, props) {
|
|
|
67
95
|
el[key] = val;
|
|
68
96
|
}
|
|
69
97
|
else {
|
|
70
|
-
|
|
71
|
-
|
|
98
|
+
// Check for closure binding: class={() => this.theme}
|
|
99
|
+
if (typeof val === "function") {
|
|
100
|
+
startSubTrace();
|
|
101
|
+
try {
|
|
102
|
+
const res = val();
|
|
103
|
+
el.setAttribute(key, String(res));
|
|
104
|
+
const deps = endSubTrace();
|
|
105
|
+
if (deps.size > 0) {
|
|
106
|
+
addBinding(deps, el, () => el.setAttribute(key, String(val())));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
// Fallback or error handling for failed binding execution
|
|
111
|
+
console.error(`Loom: Error executing binding for attribute '${key}'`, e);
|
|
112
|
+
el.setAttribute(key, "");
|
|
113
|
+
endSubTrace(); // Ensure trace stack is popped
|
|
114
|
+
}
|
|
72
115
|
}
|
|
73
116
|
else {
|
|
74
117
|
el.setAttribute(key, String(val));
|
|
@@ -94,6 +137,27 @@ function appendChildren(parent, children) {
|
|
|
94
137
|
else if (children instanceof Node) {
|
|
95
138
|
parent.appendChild(children);
|
|
96
139
|
}
|
|
140
|
+
else if (typeof children === "function") {
|
|
141
|
+
// Phase 2: Closure binding for text — {() => this.count}
|
|
142
|
+
const textNode = document.createTextNode("");
|
|
143
|
+
parent.appendChild(textNode);
|
|
144
|
+
startSubTrace();
|
|
145
|
+
try {
|
|
146
|
+
const res = children();
|
|
147
|
+
textNode.textContent = String(res);
|
|
148
|
+
const deps = endSubTrace();
|
|
149
|
+
if (deps.size > 0) {
|
|
150
|
+
// Create binding with the closure itself as the patcher
|
|
151
|
+
addBinding(deps, textNode, () => {
|
|
152
|
+
textNode.textContent = String(children());
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
console.error("Loom: Error executing text binding", e);
|
|
158
|
+
endSubTrace();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
97
161
|
else {
|
|
98
162
|
parent.appendChild(document.createTextNode(String(children)));
|
|
99
163
|
}
|
package/dist/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/query/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAyB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/query/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAyB,MAAM,SAAS,CAAC;AAM3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM/C,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,SAAS,0HAMrB,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,EAClC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAE5C,IAAI,SAAS,MAAM,EACzB,SAAS,4BAA4B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EACxD,SAAS,6BAA6B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KACxD,4BAA4B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CA0BnD"}
|
package/dist/query/decorators.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* Models interceptors after @guard: named, globally registered, DI-aware.
|
|
8
8
|
*/
|
|
9
9
|
import { createDecorator } from "../decorators/create";
|
|
10
|
+
import { Reactive } from "../store/reactive";
|
|
10
11
|
import { createApiState } from "./state";
|
|
11
12
|
import { interceptRegistry } from "./registry";
|
|
12
13
|
// Re-export for barrel
|
|
@@ -60,13 +61,20 @@ export const intercept = createDecorator((method, key, nameOrOpts) => {
|
|
|
60
61
|
export function api(fnOrOpts) {
|
|
61
62
|
return (_target, context) => {
|
|
62
63
|
const stateKey = Symbol(`api:${String(context.name)}`);
|
|
64
|
+
const traceKey = Symbol(`api:trace:${String(context.name)}`);
|
|
63
65
|
const opts = typeof fnOrOpts === "function" ? { fn: fnOrOpts } : fnOrOpts;
|
|
64
66
|
return {
|
|
65
67
|
get() {
|
|
66
68
|
if (!this[stateKey]) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
// Sentinel Reactive for trace integration — notified on every state change
|
|
70
|
+
const sentinel = new Reactive(0);
|
|
71
|
+
this[traceKey] = sentinel;
|
|
72
|
+
sentinel.subscribe(() => this.scheduleUpdate?.());
|
|
73
|
+
const notify = () => { sentinel.set((v) => v + 1); };
|
|
74
|
+
this[stateKey] = createApiState(opts, notify, this, String(context.name));
|
|
69
75
|
}
|
|
76
|
+
// Read sentinel.value so recordRead() fires during traced update()
|
|
77
|
+
this[traceKey].value;
|
|
70
78
|
return this[stateKey];
|
|
71
79
|
},
|
|
72
80
|
set(_val) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/query/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAa/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CACtC,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;IAC1B,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;IACvC,iBAAiB,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3E,CAAC,CACF,CAAC;AAEF,uCAAuC;AAEvC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,GAAG,CACjB,QAAoD;IAEpD,OAAO,CACL,OAAwD,EACxD,OAAyD,EACR,EAAE;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/query/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAa/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CACtC,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;IAC1B,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;IACvC,iBAAiB,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3E,CAAC,CACF,CAAC;AAEF,uCAAuC;AAEvC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,GAAG,CACjB,QAAoD;IAEpD,OAAO,CACL,OAAwD,EACxD,OAAyD,EACR,EAAE;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE7D,MAAM,IAAI,GACR,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE/D,OAAO;YACL,GAAG;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpB,2EAA2E;oBAC3E,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;oBAC1B,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;oBAClD,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7D,IAAI,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAI,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/E,CAAC;gBACD,mEAAmE;gBAClE,IAAI,CAAC,QAAQ,CAAsB,CAAC,KAAK,CAAC;gBAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YACD,GAAG,CAAY,IAAiB;gBAC9B,qDAAqD;YACvD,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAM,CAAC;AAIvD,qFAAqF;AACrF,eAAO,MAAM,MAAM,eAAiC,CAAC;AAErD,oFAAoF;AACpF,eAAO,MAAM,UAAU,eAAgC,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,EAC7C,MAAM,EAAE,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC7C,OAAO,EAAE,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,GAC9C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAM,CAAC;AAIvD,qFAAqF;AACrF,eAAO,MAAM,MAAM,eAAiC,CAAC;AAErD,oFAAoF;AACpF,eAAO,MAAM,UAAU,eAAgC,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,EAC7C,MAAM,EAAE,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC7C,OAAO,EAAE,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,GAC9C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CAiDvC;AAWD,KAAK,aAAa,GAAG;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,IAAI,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,EACzC,MAAM,EAAE,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC7C,OAAO,EAAE,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,GAC9C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,wBAAgB,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,EAChE,MAAM,EAAE,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC7C,OAAO,EAAE,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,KAC5C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AA+C3C;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,EAC7C,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,EACzB,OAAO,EAAE,2BAA2B,CAAC,IAAI,EAAE,CAAC,CAAC,GAC5C,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAsBnB;AAoDD;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EACpC,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE,cAAc,IAEhB,IAAI,SAAS,MAAM,EACzB,SAAS,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9C,SAAS,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,KAC9C,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CA+BzC"}
|
package/dist/store/decorators.js
CHANGED
|
@@ -41,15 +41,9 @@ export function reactive(target, context) {
|
|
|
41
41
|
});
|
|
42
42
|
return {
|
|
43
43
|
get() {
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
return target.get.call(this);
|
|
47
|
-
return this[storageKey].value;
|
|
48
|
-
},
|
|
49
|
-
set(val) {
|
|
44
|
+
// Eagerly create the Reactive on first read so recordRead() fires
|
|
45
|
+
// during traced update() calls — ensures this dep is tracked.
|
|
50
46
|
if (!this[storageKey]) {
|
|
51
|
-
// First explicit set — create Reactive with the init'd backing value,
|
|
52
|
-
// wire all subscribers, then set the new value to fire them.
|
|
53
47
|
const backingValue = target.get.call(this);
|
|
54
48
|
const r = new Reactive(backingValue);
|
|
55
49
|
this[storageKey] = r;
|
|
@@ -63,12 +57,15 @@ export function reactive(target, context) {
|
|
|
63
57
|
for (const e of (this[EMITTERS] ?? []).filter((e) => e.field === key)) {
|
|
64
58
|
r.subscribe((v) => bus.emit(e.factory(v)));
|
|
65
59
|
}
|
|
66
|
-
// Now set the new value — this fires all subscribers
|
|
67
|
-
r.set(val);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
this[storageKey].set(val);
|
|
71
60
|
}
|
|
61
|
+
return this[storageKey].value;
|
|
62
|
+
},
|
|
63
|
+
set(val) {
|
|
64
|
+
// Ensure Reactive exists (getter may not have run yet,
|
|
65
|
+
// e.g. attributeChangedCallback before connectedCallback)
|
|
66
|
+
if (!this[storageKey])
|
|
67
|
+
this[key];
|
|
68
|
+
this[storageKey].set(val);
|
|
72
69
|
},
|
|
73
70
|
init(val) {
|
|
74
71
|
return val;
|
|
@@ -140,7 +137,7 @@ const STORE_META = Symbol("loom:store:meta");
|
|
|
140
137
|
/**
|
|
141
138
|
* Create a deep proxy that intercepts mutations and notifies the Reactive.
|
|
142
139
|
*/
|
|
143
|
-
function createDeepProxy(obj,
|
|
140
|
+
function createDeepProxy(obj, reactive) {
|
|
144
141
|
const proxyCache = new WeakMap();
|
|
145
142
|
function wrap(target) {
|
|
146
143
|
if (target === null || typeof target !== "object")
|
|
@@ -157,18 +154,12 @@ function createDeepProxy(obj, onChange, persist) {
|
|
|
157
154
|
},
|
|
158
155
|
set(t, p, value, receiver) {
|
|
159
156
|
const result = Reflect.set(t, p, value, receiver);
|
|
160
|
-
|
|
161
|
-
persist.storage.set(persist.key, JSON.stringify(obj));
|
|
162
|
-
}
|
|
163
|
-
onChange();
|
|
157
|
+
reactive.notify();
|
|
164
158
|
return result;
|
|
165
159
|
},
|
|
166
160
|
deleteProperty(t, p) {
|
|
167
161
|
const result = Reflect.deleteProperty(t, p);
|
|
168
|
-
|
|
169
|
-
persist.storage.set(persist.key, JSON.stringify(obj));
|
|
170
|
-
}
|
|
171
|
-
onChange();
|
|
162
|
+
reactive.notify();
|
|
172
163
|
return result;
|
|
173
164
|
},
|
|
174
165
|
});
|
|
@@ -197,9 +188,10 @@ export function store(defaults, persist) {
|
|
|
197
188
|
const r = new Reactive(initial, persist);
|
|
198
189
|
this[reactiveKey] = r;
|
|
199
190
|
r.subscribe(() => this.scheduleUpdate?.());
|
|
200
|
-
|
|
201
|
-
this[proxyKey] = createDeepProxy(r.value, notifyChange, persist);
|
|
191
|
+
this[proxyKey] = createDeepProxy(r.value, r);
|
|
202
192
|
}
|
|
193
|
+
// Touch Reactive.value so recordRead() fires during traced update()
|
|
194
|
+
this[reactiveKey].value;
|
|
203
195
|
return this[proxyKey];
|
|
204
196
|
},
|
|
205
197
|
set(val) {
|
|
@@ -207,13 +199,11 @@ export function store(defaults, persist) {
|
|
|
207
199
|
const r = new Reactive(val, persist);
|
|
208
200
|
this[reactiveKey] = r;
|
|
209
201
|
r.subscribe(() => this.scheduleUpdate?.());
|
|
210
|
-
|
|
211
|
-
this[proxyKey] = createDeepProxy(r.value, notifyChange, persist);
|
|
202
|
+
this[proxyKey] = createDeepProxy(r.value, r);
|
|
212
203
|
}
|
|
213
204
|
else {
|
|
214
205
|
this[reactiveKey].set(val);
|
|
215
|
-
|
|
216
|
-
this[proxyKey] = createDeepProxy(this[reactiveKey].value, notifyChange, persist);
|
|
206
|
+
this[proxyKey] = createDeepProxy(this[reactiveKey].value, this[reactiveKey]);
|
|
217
207
|
}
|
|
218
208
|
},
|
|
219
209
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAS,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAc,MAAM,uBAAuB,CAAC;AACtH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAG7B;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B,EAAE,CAAC;AAEvD,wBAAwB;AAExB,qFAAqF;AACrF,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAErD,oFAAoF;AACpF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CACtB,MAA6C,EAC7C,OAA+C;IAE9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE/B,iDAAiD;IACjD,OAAO,CAAC,cAAc,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG;YACD,
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/store/reactive.d.ts
CHANGED
|
@@ -26,13 +26,25 @@ export declare class Reactive<T> {
|
|
|
26
26
|
private subs;
|
|
27
27
|
private _key?;
|
|
28
28
|
private _storage?;
|
|
29
|
+
/** Monotonic version counter — bumps on every set() and notify() */
|
|
30
|
+
private _version;
|
|
29
31
|
constructor(initial: T, persist?: PersistOptions);
|
|
30
32
|
get value(): T;
|
|
33
|
+
/** Read without triggering trace recording — used for snapshot comparisons */
|
|
34
|
+
peek(): T;
|
|
35
|
+
/** Read the version counter without triggering trace — used by hasDirtyDeps */
|
|
36
|
+
peekVersion(): number;
|
|
31
37
|
set(next: Updater<T>): void;
|
|
32
38
|
/** Subscribe to changes. Returns unsubscribe function. */
|
|
33
39
|
subscribe(fn: Subscriber<T>): () => void;
|
|
34
40
|
/** Subscribe and immediately call with current value */
|
|
35
41
|
watch(fn: Subscriber<T>): () => void;
|
|
42
|
+
/**
|
|
43
|
+
* Force-notify all subscribers without changing the value.
|
|
44
|
+
* Used for in-place mutations (e.g. deep proxy on @store)
|
|
45
|
+
* where the reference doesn't change but contents did.
|
|
46
|
+
*/
|
|
47
|
+
notify(): void;
|
|
36
48
|
/** Clear persisted data and reset to a value */
|
|
37
49
|
clear(resetTo: T): void;
|
|
38
50
|
/** Swap the storage medium at runtime (e.g. upgrade from local to remote) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../../src/store/reactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../../src/store/reactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,WAAW,CAAC;AAGhE,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AACxD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,CAAiB;IAClC,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAK;gBAET,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc;IAqBhD,IAAI,KAAK,IAAI,CAAC,CAGb;IAED,8EAA8E;IAC9E,IAAI,IAAI,CAAC;IAIT,+EAA+E;IAC/E,WAAW,IAAI,MAAM;IAIrB,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAc3B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAKxC,wDAAwD;IACxD,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAKpC;;;;OAIG;IACH,MAAM,IAAI,IAAI;IAQd,gDAAgD;IAChD,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI;IAOvB,6EAA6E;IAC7E,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;CAM3C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAe,CAC1B,CAAC,SAAS,YAAY,CACtB,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACT,OAAO,GAAE,CAAC,EAAO,EAAE,OAAO,CAAC,EAAE,cAAc;IAIvD,+DAA+D;IAC/D,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,CAAC;IAM7C,2BAA2B;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAYxC,kDAAkD;IAClD,KAAK,IAAI,IAAI;IAIb,yBAAyB;IACzB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;CAGhC"}
|
package/dist/store/reactive.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Both support optional persistent storage via StorageAdapter.
|
|
8
8
|
*/
|
|
9
|
+
import { isTracing, recordRead } from "../trace";
|
|
9
10
|
/**
|
|
10
11
|
* Observable value container. Works with any data shape.
|
|
11
12
|
* Optionally backs to a StorageAdapter for auto-persistence.
|
|
@@ -23,6 +24,8 @@ export class Reactive {
|
|
|
23
24
|
subs = new Set();
|
|
24
25
|
_key;
|
|
25
26
|
_storage;
|
|
27
|
+
/** Monotonic version counter — bumps on every set() and notify() */
|
|
28
|
+
_version = 0;
|
|
26
29
|
constructor(initial, persist) {
|
|
27
30
|
this._key = persist?.key;
|
|
28
31
|
this._storage = persist?.storage;
|
|
@@ -46,13 +49,24 @@ export class Reactive {
|
|
|
46
49
|
}
|
|
47
50
|
}
|
|
48
51
|
get value() {
|
|
52
|
+
if (isTracing())
|
|
53
|
+
recordRead(this);
|
|
49
54
|
return this._value;
|
|
50
55
|
}
|
|
56
|
+
/** Read without triggering trace recording — used for snapshot comparisons */
|
|
57
|
+
peek() {
|
|
58
|
+
return this._value;
|
|
59
|
+
}
|
|
60
|
+
/** Read the version counter without triggering trace — used by hasDirtyDeps */
|
|
61
|
+
peekVersion() {
|
|
62
|
+
return this._version;
|
|
63
|
+
}
|
|
51
64
|
set(next) {
|
|
52
65
|
const prev = this._value;
|
|
53
66
|
this._value =
|
|
54
67
|
typeof next === "function" ? next(prev) : next;
|
|
55
68
|
if (this._value !== prev) {
|
|
69
|
+
this._version++;
|
|
56
70
|
// Persist
|
|
57
71
|
if (this._key && this._storage) {
|
|
58
72
|
this._storage.set(this._key, JSON.stringify(this._value));
|
|
@@ -70,6 +84,18 @@ export class Reactive {
|
|
|
70
84
|
fn(this._value, this._value);
|
|
71
85
|
return this.subscribe(fn);
|
|
72
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Force-notify all subscribers without changing the value.
|
|
89
|
+
* Used for in-place mutations (e.g. deep proxy on @store)
|
|
90
|
+
* where the reference doesn't change but contents did.
|
|
91
|
+
*/
|
|
92
|
+
notify() {
|
|
93
|
+
this._version++;
|
|
94
|
+
if (this._key && this._storage) {
|
|
95
|
+
this._storage.set(this._key, JSON.stringify(this._value));
|
|
96
|
+
}
|
|
97
|
+
this.subs.forEach((s) => s(this._value, this._value));
|
|
98
|
+
}
|
|
73
99
|
/** Clear persisted data and reset to a value */
|
|
74
100
|
clear(resetTo) {
|
|
75
101
|
if (this._key && this._storage) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.js","sourceRoot":"","sources":["../../src/store/reactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"reactive.js","sourceRoot":"","sources":["../../src/store/reactive.ts"],"names":[],"mappings":"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"}
|
package/dist/trace.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom — Traced Template Projection
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: Dependency tracking for update().
|
|
5
|
+
* - Traces which Reactive instances are read during update()
|
|
6
|
+
* - On subsequent scheduleUpdate() calls, checks if any tracked
|
|
7
|
+
* dependency actually changed before running update()+morph().
|
|
8
|
+
* - Eliminates unnecessary renders when unrelated state changes.
|
|
9
|
+
*
|
|
10
|
+
* Phase 2: Fine-grained DOM patching via Closure Bindings.
|
|
11
|
+
* - During traced update(), function children/props are executed
|
|
12
|
+
* within a sub-trace to capture their specific dependencies.
|
|
13
|
+
* - A Binding is created linking those dependencies to the DOM node.
|
|
14
|
+
* - On subsequent updates, if all dirty deps have bindings,
|
|
15
|
+
* the element fast-patches those DOM nodes directly.
|
|
16
|
+
*/
|
|
17
|
+
import type { Reactive } from "./store/reactive";
|
|
18
|
+
/** A single Reactive→DOM binding created during traced update() */
|
|
19
|
+
export interface Binding {
|
|
20
|
+
/** The set of reactives that trigger this binding */
|
|
21
|
+
reactives: Set<Reactive<any>>;
|
|
22
|
+
/** The DOM node to patch */
|
|
23
|
+
target: Node | Element;
|
|
24
|
+
/** The closure that updates the DOM (re-evaluates the binding) */
|
|
25
|
+
patcher: () => void;
|
|
26
|
+
}
|
|
27
|
+
/** Dependency set: the Reactives that were read during a single update() call */
|
|
28
|
+
export interface TraceDeps {
|
|
29
|
+
/** Set of Reactives read during the traced update() */
|
|
30
|
+
deps: Set<Reactive<any>>;
|
|
31
|
+
/** Snapshot of each dependency's version at trace time */
|
|
32
|
+
versions: Map<Reactive<any>, number>;
|
|
33
|
+
/** Phase 2 — Reactive→DOM bindings for fast-patching */
|
|
34
|
+
bindings: Map<Reactive<any>, Binding[]>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Begin tracing. Called before update().
|
|
38
|
+
* All Reactive.value reads will be recorded.
|
|
39
|
+
*/
|
|
40
|
+
export declare function startTrace(): void;
|
|
41
|
+
/**
|
|
42
|
+
* End tracing and return the dependency set + version snapshots + bindings.
|
|
43
|
+
* Called after update() completes.
|
|
44
|
+
*/
|
|
45
|
+
export declare function endTrace(): TraceDeps;
|
|
46
|
+
/**
|
|
47
|
+
* Check if tracing is currently active.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isTracing(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Record a Reactive read. Called from Reactive.value getter
|
|
52
|
+
* when a trace is active.
|
|
53
|
+
*/
|
|
54
|
+
export declare function recordRead(reactive: Reactive<any>): void;
|
|
55
|
+
/**
|
|
56
|
+
* Start a sub-trace for a closure binding.
|
|
57
|
+
* Pushes the current activeDeps to the stack and starts a fresh set.
|
|
58
|
+
*/
|
|
59
|
+
export declare function startSubTrace(): void;
|
|
60
|
+
/**
|
|
61
|
+
* End a sub-trace and return the captured dependencies.
|
|
62
|
+
* Merges the captured deps back into the parent trace (so the component remains dirty).
|
|
63
|
+
*/
|
|
64
|
+
export declare function endSubTrace(): Set<Reactive<any>>;
|
|
65
|
+
/**
|
|
66
|
+
* Register a Reactive→DOM binding.
|
|
67
|
+
* Called by the JSX runtime when a closure binding is detected.
|
|
68
|
+
*/
|
|
69
|
+
export declare function addBinding(reactives: Set<Reactive<any>>, target: Node | Element, patcher: () => void): void;
|
|
70
|
+
/**
|
|
71
|
+
* Check if any dependency in the trace has changed since the snapshot.
|
|
72
|
+
* Returns true if at least one dependency's version differs.
|
|
73
|
+
* Returns true if trace is null (first render, always dirty).
|
|
74
|
+
*/
|
|
75
|
+
export declare function hasDirtyDeps(trace: TraceDeps | null): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Check if all dirty dependencies have bindings — if so, we can
|
|
78
|
+
* fast-patch the DOM without running update()+morph().
|
|
79
|
+
* Returns false for null trace or if any dirty dep has no binding.
|
|
80
|
+
*/
|
|
81
|
+
export declare function canFastPatch(trace: TraceDeps | null): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Apply all dirty bindings.
|
|
84
|
+
* Only patches bindings for deps that actually changed.
|
|
85
|
+
* Uses a Set to deduplicate patchers (one binding might depend on multiple changed reactives).
|
|
86
|
+
*/
|
|
87
|
+
export declare function applyBindings(trace: TraceDeps): void;
|
|
88
|
+
/**
|
|
89
|
+
* Update the snapshot versions to current.
|
|
90
|
+
* Called after a successful update()+morph() or fast-patch.
|
|
91
|
+
*/
|
|
92
|
+
export declare function refreshSnapshots(trace: TraceDeps): void;
|
|
93
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,mEAAmE;AACnE,MAAM,WAAW,OAAO;IACtB,qDAAqD;IACrD,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,kEAAkE;IAClE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACrC,wDAAwD;IACxD,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;CACzC;AAkBD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,SAAS,CAepC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAIxD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAYhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC7B,MAAM,EAAE,IAAI,GAAG,OAAO,EACtB,OAAO,EAAE,MAAM,IAAI,GAClB,IAAI,CAcN;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAM7D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAW7D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAkBpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAIvD"}
|
package/dist/trace.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom — Traced Template Projection
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: Dependency tracking for update().
|
|
5
|
+
* - Traces which Reactive instances are read during update()
|
|
6
|
+
* - On subsequent scheduleUpdate() calls, checks if any tracked
|
|
7
|
+
* dependency actually changed before running update()+morph().
|
|
8
|
+
* - Eliminates unnecessary renders when unrelated state changes.
|
|
9
|
+
*
|
|
10
|
+
* Phase 2: Fine-grained DOM patching via Closure Bindings.
|
|
11
|
+
* - During traced update(), function children/props are executed
|
|
12
|
+
* within a sub-trace to capture their specific dependencies.
|
|
13
|
+
* - A Binding is created linking those dependencies to the DOM node.
|
|
14
|
+
* - On subsequent updates, if all dirty deps have bindings,
|
|
15
|
+
* the element fast-patches those DOM nodes directly.
|
|
16
|
+
*/
|
|
17
|
+
// ── Tracer state (module-scoped) ──
|
|
18
|
+
/**
|
|
19
|
+
* The current set of dependencies being tracked.
|
|
20
|
+
* When nested tracing occurs, the parent set is pushed to `traceStack`.
|
|
21
|
+
*/
|
|
22
|
+
let activeDeps = null;
|
|
23
|
+
/** Stack of dependency sets for nested tracing (e.g. inside a binding closure) */
|
|
24
|
+
let traceStack = [];
|
|
25
|
+
/** Active bindings being collected during a traced update() */
|
|
26
|
+
let activeBindings = null;
|
|
27
|
+
// ── Public API ──
|
|
28
|
+
/**
|
|
29
|
+
* Begin tracing. Called before update().
|
|
30
|
+
* All Reactive.value reads will be recorded.
|
|
31
|
+
*/
|
|
32
|
+
export function startTrace() {
|
|
33
|
+
activeDeps = new Set();
|
|
34
|
+
traceStack = [];
|
|
35
|
+
activeBindings = new Map();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* End tracing and return the dependency set + version snapshots + bindings.
|
|
39
|
+
* Called after update() completes.
|
|
40
|
+
*/
|
|
41
|
+
export function endTrace() {
|
|
42
|
+
const deps = activeDeps ?? new Set();
|
|
43
|
+
activeDeps = null;
|
|
44
|
+
// Snapshot current versions for dirty checking
|
|
45
|
+
const versions = new Map();
|
|
46
|
+
for (const r of deps) {
|
|
47
|
+
versions.set(r, r.peekVersion());
|
|
48
|
+
}
|
|
49
|
+
const bindings = activeBindings ?? new Map();
|
|
50
|
+
activeBindings = null;
|
|
51
|
+
traceStack = [];
|
|
52
|
+
return { deps, versions, bindings };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if tracing is currently active.
|
|
56
|
+
*/
|
|
57
|
+
export function isTracing() {
|
|
58
|
+
return activeDeps !== null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Record a Reactive read. Called from Reactive.value getter
|
|
62
|
+
* when a trace is active.
|
|
63
|
+
*/
|
|
64
|
+
export function recordRead(reactive) {
|
|
65
|
+
if (activeDeps) {
|
|
66
|
+
activeDeps.add(reactive);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Start a sub-trace for a closure binding.
|
|
71
|
+
* Pushes the current activeDeps to the stack and starts a fresh set.
|
|
72
|
+
*/
|
|
73
|
+
export function startSubTrace() {
|
|
74
|
+
if (activeDeps) {
|
|
75
|
+
traceStack.push(activeDeps);
|
|
76
|
+
}
|
|
77
|
+
activeDeps = new Set();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* End a sub-trace and return the captured dependencies.
|
|
81
|
+
* Merges the captured deps back into the parent trace (so the component remains dirty).
|
|
82
|
+
*/
|
|
83
|
+
export function endSubTrace() {
|
|
84
|
+
const captured = activeDeps ?? new Set();
|
|
85
|
+
activeDeps = traceStack.pop() || null;
|
|
86
|
+
// Merge sub-trace deps into parent trace
|
|
87
|
+
if (activeDeps) {
|
|
88
|
+
for (const r of captured) {
|
|
89
|
+
activeDeps.add(r);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return captured;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Register a Reactive→DOM binding.
|
|
96
|
+
* Called by the JSX runtime when a closure binding is detected.
|
|
97
|
+
*/
|
|
98
|
+
export function addBinding(reactives, target, patcher) {
|
|
99
|
+
if (!activeBindings)
|
|
100
|
+
return;
|
|
101
|
+
const binding = { reactives, target, patcher };
|
|
102
|
+
// Register this binding for every reactive it depends on
|
|
103
|
+
for (const r of reactives) {
|
|
104
|
+
let list = activeBindings.get(r);
|
|
105
|
+
if (!list) {
|
|
106
|
+
list = [];
|
|
107
|
+
activeBindings.set(r, list);
|
|
108
|
+
}
|
|
109
|
+
list.push(binding);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if any dependency in the trace has changed since the snapshot.
|
|
114
|
+
* Returns true if at least one dependency's version differs.
|
|
115
|
+
* Returns true if trace is null (first render, always dirty).
|
|
116
|
+
*/
|
|
117
|
+
export function hasDirtyDeps(trace) {
|
|
118
|
+
if (!trace)
|
|
119
|
+
return true;
|
|
120
|
+
for (const [r, ver] of trace.versions) {
|
|
121
|
+
if (r.peekVersion() !== ver)
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if all dirty dependencies have bindings — if so, we can
|
|
128
|
+
* fast-patch the DOM without running update()+morph().
|
|
129
|
+
* Returns false for null trace or if any dirty dep has no binding.
|
|
130
|
+
*/
|
|
131
|
+
export function canFastPatch(trace) {
|
|
132
|
+
if (!trace)
|
|
133
|
+
return false;
|
|
134
|
+
if (trace.bindings.size === 0)
|
|
135
|
+
return false;
|
|
136
|
+
for (const [r, ver] of trace.versions) {
|
|
137
|
+
if (r.peekVersion() !== ver) {
|
|
138
|
+
// This dep is dirty — does it have bindings?
|
|
139
|
+
if (!trace.bindings.has(r))
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Apply all dirty bindings.
|
|
147
|
+
* Only patches bindings for deps that actually changed.
|
|
148
|
+
* Uses a Set to deduplicate patchers (one binding might depend on multiple changed reactives).
|
|
149
|
+
*/
|
|
150
|
+
export function applyBindings(trace) {
|
|
151
|
+
const patchersToRun = new Set();
|
|
152
|
+
for (const [r, ver] of trace.versions) {
|
|
153
|
+
if (r.peekVersion() !== ver) {
|
|
154
|
+
const bindings = trace.bindings.get(r);
|
|
155
|
+
if (bindings) {
|
|
156
|
+
for (const b of bindings) {
|
|
157
|
+
patchersToRun.add(b.patcher);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Execute unique patchers
|
|
163
|
+
for (const patcher of patchersToRun) {
|
|
164
|
+
patcher();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Update the snapshot versions to current.
|
|
169
|
+
* Called after a successful update()+morph() or fast-patch.
|
|
170
|
+
*/
|
|
171
|
+
export function refreshSnapshots(trace) {
|
|
172
|
+
for (const r of trace.deps) {
|
|
173
|
+
trace.versions.set(r, r.peekVersion());
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
|