resonantjs 1.1.7 β 1.1.8
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/README.md +204 -57
- package/package.json +1 -1
- package/resonant.js +82 -35
- package/resonant.min.js +1 -1
- package/resonant.min.js.map +1 -1
- package/test/mockDom.js +2 -1
- package/test/selective_rendering.test.js +140 -0
package/README.md
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
# ResonantJs
|
|
1
|
+
# ResonantJs
|
|
2
2
|
|
|
3
3
|
[](https://badge.fury.io/js/resonantjs)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
**ResonantJs** is a lightweight, powerful JavaScript framework that brings
|
|
6
|
+
**ResonantJs** is a lightweight, powerful JavaScript framework that brings reactive data-binding to vanilla JavaScript applications. Build dynamic, responsive UIs with minimal code and zero dependencies.
|
|
7
7
|
|
|
8
|
-
> **Zero dependencies β’ ~
|
|
8
|
+
> **Zero dependencies β’ ~17KB minified β’ Lightning fast β’ Easy to learn**
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Why Choose ResonantJs?
|
|
11
11
|
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
12
|
+
- **True Reactivity**: Data changes automatically update the DOM with no manual manipulation required
|
|
13
|
+
- **Attribute-Based**: Simple HTML attributes create powerful data bindings
|
|
14
|
+
- **Deep Object Support**: Full reactivity for nested objects and arrays
|
|
15
|
+
- **Built-in Persistence**: Automatic localStorage integration for data persistence
|
|
16
|
+
- **Dynamic Styling**: Conditional CSS classes and styles based on your data
|
|
17
|
+
- **Performance**: Efficient updates with minimal overhead
|
|
18
|
+
- **Tiny Footprint**: Under 17KB minified, perfect for any project size
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Quick Start
|
|
23
23
|
|
|
24
24
|
### Installation
|
|
25
25
|
|
|
@@ -55,13 +55,84 @@ npm install resonantjs
|
|
|
55
55
|
</html>
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
That's it
|
|
58
|
+
That's it. Your counter automatically updates the DOM and persists to localStorage.
|
|
59
59
|
|
|
60
60
|
---
|
|
61
61
|
|
|
62
|
-
##
|
|
62
|
+
## Build a Todo App in 5 Minutes
|
|
63
|
+
|
|
64
|
+
Copy and paste the snippet below into an `.html` file and open it in your browser.
|
|
65
|
+
|
|
66
|
+
```html
|
|
67
|
+
<!doctype html>
|
|
68
|
+
<html>
|
|
69
|
+
<head>
|
|
70
|
+
<meta charset="utf-8" />
|
|
71
|
+
<title>ResonantJs β’ 5βmin Todo</title>
|
|
72
|
+
<style>
|
|
73
|
+
.completed { text-decoration: line-through; color: #888; }
|
|
74
|
+
</style>
|
|
75
|
+
<script src="https://unpkg.com/resonantjs@latest/resonant.js"></script>
|
|
76
|
+
</head>
|
|
77
|
+
<body>
|
|
78
|
+
<h1>Todos (<span res="tasks.length"></span>)</h1>
|
|
79
|
+
|
|
80
|
+
<input placeholder="Add a task..." res="newTask" />
|
|
81
|
+
<button onclick="addTask()">Add</button>
|
|
82
|
+
|
|
83
|
+
<ul>
|
|
84
|
+
<li res="tasks" res-display="newTask === '' || name.toLowerCase().includes(newTask.toLowerCase())">
|
|
85
|
+
<input type="checkbox" res-prop="completed" />
|
|
86
|
+
<span res-prop="name" res-style="completed ? 'completed' : ''"></span>
|
|
87
|
+
<button res-onclick="removeTask">Remove</button>
|
|
88
|
+
</li>
|
|
89
|
+
</ul>
|
|
90
|
+
|
|
91
|
+
<script>
|
|
92
|
+
const resonant = new Resonant();
|
|
93
|
+
resonant.addAll({
|
|
94
|
+
newTask: '',
|
|
95
|
+
tasks: [
|
|
96
|
+
{ name: 'Learn ResonantJs', completed: false },
|
|
97
|
+
{ name: 'Ship a feature', completed: true }
|
|
98
|
+
]
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
function addTask() {
|
|
102
|
+
const title = newTask.trim();
|
|
103
|
+
if (!title) return;
|
|
104
|
+
tasks.unshift({ name: title, completed: false });
|
|
105
|
+
newTask = '';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function removeTask(item) {
|
|
109
|
+
const idx = tasks.indexOf(item);
|
|
110
|
+
if (idx !== -1) tasks.delete(idx);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Optional: observe changes
|
|
114
|
+
resonant.addCallback('tasks', (list, item, action) => {
|
|
115
|
+
console.log('[tasks]', action, item);
|
|
116
|
+
});
|
|
117
|
+
</script>
|
|
118
|
+
</body>
|
|
119
|
+
</html>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Key Takeaways
|
|
123
|
+
|
|
124
|
+
- Use `res="tasks"` on a template element inside a list container to auto-render each item
|
|
125
|
+
- Use `res-prop` inside that template to bind fields of the current item
|
|
126
|
+
- Use `res-display` for inline filtering/conditional rendering; inside lists, bare props like `completed` refer to the current item
|
|
127
|
+
- `res-style` returns a space-separated class string
|
|
128
|
+
- Event handlers referenced by `res-onclick` are global functions and receive `item` when declared with a parameter
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Core Concepts
|
|
133
|
+
|
|
134
|
+
### Data Binding (`res`)
|
|
63
135
|
|
|
64
|
-
### 1. **Data Binding** (`res`)
|
|
65
136
|
Bind HTML elements directly to your JavaScript variables:
|
|
66
137
|
|
|
67
138
|
```html
|
|
@@ -69,7 +140,8 @@ Bind HTML elements directly to your JavaScript variables:
|
|
|
69
140
|
<div res="user.profile.name"></div> <!-- Nested object property -->
|
|
70
141
|
```
|
|
71
142
|
|
|
72
|
-
###
|
|
143
|
+
### Object Properties (`res-prop`)
|
|
144
|
+
|
|
73
145
|
Bind to specific properties within objects:
|
|
74
146
|
|
|
75
147
|
```html
|
|
@@ -79,7 +151,8 @@ Bind to specific properties within objects:
|
|
|
79
151
|
</div>
|
|
80
152
|
```
|
|
81
153
|
|
|
82
|
-
###
|
|
154
|
+
### Array Rendering
|
|
155
|
+
|
|
83
156
|
Automatically render arrays with template-based elements:
|
|
84
157
|
|
|
85
158
|
```html
|
|
@@ -91,8 +164,9 @@ Automatically render arrays with template-based elements:
|
|
|
91
164
|
</ul>
|
|
92
165
|
```
|
|
93
166
|
|
|
94
|
-
###
|
|
95
|
-
|
|
167
|
+
### Conditional Display (`res-display`)
|
|
168
|
+
|
|
169
|
+
Show or hide elements based on conditions:
|
|
96
170
|
|
|
97
171
|
```html
|
|
98
172
|
<div res-display="user.isActive">Welcome back!</div>
|
|
@@ -100,7 +174,8 @@ Show/hide elements based on conditions:
|
|
|
100
174
|
<div res-display="user.role === 'admin'">Admin Panel</div>
|
|
101
175
|
```
|
|
102
176
|
|
|
103
|
-
###
|
|
177
|
+
### Dynamic Styling (`res-style`)
|
|
178
|
+
|
|
104
179
|
Apply conditional CSS classes and styles:
|
|
105
180
|
|
|
106
181
|
```html
|
|
@@ -108,7 +183,8 @@ Apply conditional CSS classes and styles:
|
|
|
108
183
|
<span res-style="'priority-' + task.priority">High Priority</span>
|
|
109
184
|
```
|
|
110
185
|
|
|
111
|
-
###
|
|
186
|
+
### Event Handling (`res-onclick`)
|
|
187
|
+
|
|
112
188
|
Bind click events with context:
|
|
113
189
|
|
|
114
190
|
```html
|
|
@@ -116,7 +192,8 @@ Bind click events with context:
|
|
|
116
192
|
<button res-onclick-remove="true">Delete Item</button>
|
|
117
193
|
```
|
|
118
194
|
|
|
119
|
-
###
|
|
195
|
+
### Computed Properties
|
|
196
|
+
|
|
120
197
|
Create reactive derived values that automatically update:
|
|
121
198
|
|
|
122
199
|
```javascript
|
|
@@ -134,7 +211,8 @@ resonant.computed('fullName', () => {
|
|
|
134
211
|
<span res="fullName"></span> <!-- Automatically shows "John Doe" -->
|
|
135
212
|
```
|
|
136
213
|
|
|
137
|
-
###
|
|
214
|
+
### Input Binding
|
|
215
|
+
|
|
138
216
|
Two-way data binding for form elements:
|
|
139
217
|
|
|
140
218
|
```html
|
|
@@ -148,9 +226,62 @@ Two-way data binding for form elements:
|
|
|
148
226
|
|
|
149
227
|
---
|
|
150
228
|
|
|
151
|
-
##
|
|
229
|
+
## Best Practices and Tips
|
|
230
|
+
|
|
231
|
+
- **Name your state clearly**: Variables you `add` become globals on `window` (e.g., `tasks`, `user`). Avoid collisions with existing globals.
|
|
232
|
+
- **List templates**: In `res="items"` templates, you can reference current item fields directly (`completed`, `name`) or as `item.completed` β both work.
|
|
233
|
+
- **Array updates**: Prefer `items.set(i, value)` over direct index assignment for clarity; both are reactive.
|
|
234
|
+
- **Batch updates**: When replacing a whole list, use `items.update(newArray)` to emit a single coherent update.
|
|
235
|
+
- **Object binding**: Use `res-prop=""` to bind an entire object to a single element when you just want to print it.
|
|
236
|
+
- **Event handlers**: `res-onclick` handlers are looked up on `window`. If your handler accepts an argument, Resonant passes the current `item`.
|
|
237
|
+
- **Quick removal**: For quick removal buttons, use `res-onclick-remove="idProp"` to delete by a unique key on each item.
|
|
238
|
+
- **Computed properties**: Track dependencies automatically. Use plain variable names inside the function (e.g., `firstName`, `lastName`). They are read-only.
|
|
239
|
+
- **Conditional expressions**: Keep display and style expressions simple and fast.
|
|
240
|
+
|
|
241
|
+
### Performance Notes
|
|
242
|
+
|
|
243
|
+
- Resonant selectively re-renders only changed array items by tracking indices and stable object keys
|
|
244
|
+
- Deeply nested objects and arrays are proxied; nested edits still update only affected DOM segments
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## API & Attribute Reference
|
|
249
|
+
|
|
250
|
+
### HTML Attributes
|
|
251
|
+
|
|
252
|
+
- `res` β bind a variable or array/template root
|
|
253
|
+
- `res-prop` β bind an object property within a `res` context; empty value binds the whole item
|
|
254
|
+
- `res-display` β boolean expression to show/hide element
|
|
255
|
+
- `res-style` β expression returning a space-separated class string
|
|
256
|
+
- `res-onclick` β call a global function; if it declares a parameter, it receives the current item
|
|
257
|
+
- `res-onclick-remove` β remove from the parent array by matching the given property (e.g., `id`)
|
|
258
|
+
|
|
259
|
+
### JavaScript API
|
|
260
|
+
|
|
261
|
+
- `const resonant = new Resonant()`
|
|
262
|
+
- `resonant.add(name, value, persist?)`
|
|
263
|
+
- `resonant.addAll(objectMap)`
|
|
264
|
+
- `resonant.addCallback(name, (newValue, item, action) => void)`
|
|
265
|
+
- `resonant.computed(name, () => value)`
|
|
266
|
+
|
|
267
|
+
### Array Helpers
|
|
268
|
+
|
|
269
|
+
Reactive arrays include these methods:
|
|
270
|
+
|
|
271
|
+
- `.push`, `.pop`, `.shift`, `.unshift`, `.splice`, `.sort`, `.reverse`
|
|
272
|
+
- `.set(index, value)`, `.delete(index)`, `.update(array)`, `.filter(fn)`, `.filterInPlace(fn)`, `.forceUpdate()`
|
|
273
|
+
|
|
274
|
+
### Callback Actions
|
|
275
|
+
|
|
276
|
+
- Scalars: `modified`
|
|
277
|
+
- Arrays: `added`, `removed`, `modified`, `updated`, `filtered`
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Key Features
|
|
282
|
+
|
|
283
|
+
### Reactive Data Management
|
|
152
284
|
|
|
153
|
-
### **Reactive Data Management**
|
|
154
285
|
```javascript
|
|
155
286
|
const resonant = new Resonant();
|
|
156
287
|
|
|
@@ -166,11 +297,12 @@ resonant.addAll({
|
|
|
166
297
|
});
|
|
167
298
|
|
|
168
299
|
// Changes automatically update the UI
|
|
169
|
-
user.name = 'Jane';
|
|
300
|
+
user.name = 'Jane'; // DOM updates instantly
|
|
170
301
|
tasks.push({ title: 'New task' }); // Array renders new item
|
|
171
302
|
```
|
|
172
303
|
|
|
173
|
-
###
|
|
304
|
+
### Callback System
|
|
305
|
+
|
|
174
306
|
React to data changes with custom logic:
|
|
175
307
|
|
|
176
308
|
```javascript
|
|
@@ -187,7 +319,8 @@ resonant.addCallback('user', (newValue, item, action) => {
|
|
|
187
319
|
});
|
|
188
320
|
```
|
|
189
321
|
|
|
190
|
-
###
|
|
322
|
+
### LocalStorage Persistence
|
|
323
|
+
|
|
191
324
|
Automatic localStorage integration:
|
|
192
325
|
|
|
193
326
|
```javascript
|
|
@@ -199,7 +332,8 @@ resonant.add('appState', { currentView: 'dashboard' }, true);
|
|
|
199
332
|
userPreferences.theme = 'light'; // Saved to localStorage
|
|
200
333
|
```
|
|
201
334
|
|
|
202
|
-
###
|
|
335
|
+
### Computed Properties
|
|
336
|
+
|
|
203
337
|
Reactive derived values that automatically recalculate:
|
|
204
338
|
|
|
205
339
|
```javascript
|
|
@@ -220,23 +354,28 @@ resonant.computed('greeting', () => {
|
|
|
220
354
|
});
|
|
221
355
|
```
|
|
222
356
|
|
|
223
|
-
###
|
|
357
|
+
### Array Operations
|
|
358
|
+
|
|
224
359
|
Full array reactivity with custom methods:
|
|
225
360
|
|
|
226
361
|
```javascript
|
|
227
362
|
// All operations trigger UI updates
|
|
228
|
-
items.push(newItem);
|
|
229
|
-
items.splice(index, 1);
|
|
230
|
-
items.update([...newItems]);
|
|
231
|
-
items.set(index, newValue);
|
|
232
|
-
items.delete(index);
|
|
363
|
+
items.push(newItem); // Add item
|
|
364
|
+
items.splice(index, 1); // Remove item
|
|
365
|
+
items.update([...newItems]); // Replace entire array
|
|
366
|
+
items.set(index, newValue); // Update specific index
|
|
367
|
+
items.delete(index); // Delete by index
|
|
368
|
+
items.filter(v => v > 0); // Non-mutating; still triggers a 'filtered' callback
|
|
369
|
+
items.filterInPlace(fn); // Mutating filter + rerender
|
|
370
|
+
items.forceUpdate(); // Force a rerender without changing contents
|
|
233
371
|
```
|
|
234
372
|
|
|
235
373
|
---
|
|
236
374
|
|
|
237
|
-
##
|
|
375
|
+
## Real-World Examples
|
|
238
376
|
|
|
239
377
|
### Todo List with Filtering
|
|
378
|
+
|
|
240
379
|
```html
|
|
241
380
|
<div>
|
|
242
381
|
<input res="newTask" placeholder="Add task..." />
|
|
@@ -296,6 +435,7 @@ updateFilter();
|
|
|
296
435
|
```
|
|
297
436
|
|
|
298
437
|
### Dashboard with Statistics
|
|
438
|
+
|
|
299
439
|
```html
|
|
300
440
|
<div class="dashboard">
|
|
301
441
|
<div class="stats">
|
|
@@ -334,9 +474,10 @@ updateFilter();
|
|
|
334
474
|
|
|
335
475
|
---
|
|
336
476
|
|
|
337
|
-
##
|
|
477
|
+
## Advanced Patterns
|
|
478
|
+
|
|
479
|
+
### Nested Data Structures
|
|
338
480
|
|
|
339
|
-
### **Nested Data Structures**
|
|
340
481
|
Handle complex, deeply nested data:
|
|
341
482
|
|
|
342
483
|
```javascript
|
|
@@ -362,7 +503,8 @@ company.departments[0].teams[0].members[0].name = 'Alice Johnson';
|
|
|
362
503
|
company.departments[0].teams[0].members.push(newMember);
|
|
363
504
|
```
|
|
364
505
|
|
|
365
|
-
###
|
|
506
|
+
### Computed Properties
|
|
507
|
+
|
|
366
508
|
Create reactive calculated values that automatically update when dependencies change:
|
|
367
509
|
|
|
368
510
|
```javascript
|
|
@@ -413,7 +555,8 @@ resonant.computed('total', () => {
|
|
|
413
555
|
<div>Total: $<span res="total"></span></div>
|
|
414
556
|
```
|
|
415
557
|
|
|
416
|
-
###
|
|
558
|
+
### Component-Like Patterns
|
|
559
|
+
|
|
417
560
|
Organize code into reusable patterns:
|
|
418
561
|
|
|
419
562
|
```javascript
|
|
@@ -438,41 +581,44 @@ function createTaskManager(containerId) {
|
|
|
438
581
|
|
|
439
582
|
---
|
|
440
583
|
|
|
441
|
-
##
|
|
584
|
+
## Examples & Demos
|
|
442
585
|
|
|
443
586
|
Explore our comprehensive examples:
|
|
444
587
|
|
|
445
588
|
- **[Basic Counter](./examples/example-basic.html)** - Simple reactive counter
|
|
446
589
|
- **[Task Manager](./examples/example-taskmanager.html)** - Complete task management app
|
|
447
590
|
- **[Houses Demo](./examples/example-houses.html)** - Complex nested data structures
|
|
448
|
-
- **[
|
|
591
|
+
- **[Tests Showcase](./examples/tests.html)** - Interactive testbed used in CI
|
|
449
592
|
|
|
450
593
|
Each example demonstrates different aspects of ResonantJs and can serve as starting points for your projects.
|
|
451
594
|
|
|
452
595
|
---
|
|
453
596
|
|
|
454
|
-
##
|
|
597
|
+
## Performance & Browser Support
|
|
598
|
+
|
|
599
|
+
### Performance
|
|
455
600
|
|
|
456
|
-
### **Performance**
|
|
457
601
|
- **Minimal overhead**: Only updates affected DOM elements
|
|
458
602
|
- **Efficient diffing**: Smart change detection for nested objects
|
|
459
603
|
- **Lazy evaluation**: Conditional expressions only run when dependencies change
|
|
460
604
|
- **Memory efficient**: Automatic cleanup of unused observers
|
|
461
605
|
|
|
462
|
-
###
|
|
463
|
-
|
|
464
|
-
-
|
|
465
|
-
-
|
|
466
|
-
-
|
|
467
|
-
-
|
|
606
|
+
### Browser Support
|
|
607
|
+
|
|
608
|
+
- Chrome 60+
|
|
609
|
+
- Firefox 55+
|
|
610
|
+
- Safari 12+
|
|
611
|
+
- Edge 79+
|
|
612
|
+
- Mobile browsers (iOS Safari, Chrome Mobile)
|
|
468
613
|
|
|
469
614
|
---
|
|
470
615
|
|
|
471
|
-
##
|
|
616
|
+
## Contributing
|
|
472
617
|
|
|
473
618
|
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
|
|
474
619
|
|
|
475
620
|
### Development Setup
|
|
621
|
+
|
|
476
622
|
```bash
|
|
477
623
|
git clone https://github.com/amurgola/ResonantJs.git
|
|
478
624
|
cd ResonantJs
|
|
@@ -481,20 +627,21 @@ npm test
|
|
|
481
627
|
```
|
|
482
628
|
|
|
483
629
|
### Running Tests
|
|
630
|
+
|
|
484
631
|
```bash
|
|
485
|
-
npm test
|
|
486
|
-
npm test -- test/specific.test.js
|
|
632
|
+
npm test # Run all tests
|
|
633
|
+
npm test -- test/specific.test.js # Run specific test file
|
|
487
634
|
```
|
|
488
635
|
|
|
489
636
|
---
|
|
490
637
|
|
|
491
|
-
##
|
|
638
|
+
## License
|
|
492
639
|
|
|
493
640
|
ResonantJs is released under the **MIT License**. See [LICENSE](LICENSE) file for details.
|
|
494
641
|
|
|
495
642
|
---
|
|
496
643
|
|
|
497
|
-
##
|
|
644
|
+
## Support & Community
|
|
498
645
|
|
|
499
646
|
- **Issues**: [GitHub Issues](https://github.com/amurgola/ResonantJs/issues)
|
|
500
647
|
- **Discussions**: [GitHub Discussions](https://github.com/amurgola/ResonantJs/discussions)
|
|
@@ -504,8 +651,8 @@ ResonantJs is released under the **MIT License**. See [LICENSE](LICENSE) file fo
|
|
|
504
651
|
|
|
505
652
|
<div align="center">
|
|
506
653
|
|
|
507
|
-
**[
|
|
654
|
+
**[Star us on GitHub](https://github.com/amurgola/ResonantJs)** β’ **[Try the Demo](./examples/example-taskmanager-simple-demo.html)** β’ **[Read the Docs](https://github.com/amurgola/ResonantJs/wiki)**
|
|
508
655
|
|
|
509
|
-
*Built with
|
|
656
|
+
*Built with care by [Andrew Paul Murgola](https://github.com/amurgola)*
|
|
510
657
|
|
|
511
658
|
</div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "resonantjs",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.8",
|
|
4
4
|
"description": "A lightweight JavaScript framework that enables reactive data-binding for building dynamic and responsive web applications. It simplifies creating interactive UIs by automatically updating the DOM when your data changes.",
|
|
5
5
|
"main": "resonant.js",
|
|
6
6
|
"repository": {
|
package/resonant.js
CHANGED
|
@@ -406,6 +406,27 @@
|
|
|
406
406
|
|
|
407
407
|
add(variableName, value, persist) {
|
|
408
408
|
value = this.persist(variableName, value, persist);
|
|
409
|
+
|
|
410
|
+
//Check if Value is a fetch promise, and resolve as toJson before adding
|
|
411
|
+
if (value.constructor.name === 'Response') {
|
|
412
|
+
value.json().then(resolvedValue => {
|
|
413
|
+
this.add(variableName, resolvedValue, persist);
|
|
414
|
+
}).catch(err => {
|
|
415
|
+
console.error(`Resonant: Error resolving fetch response for variable "${variableName}":`, err);
|
|
416
|
+
});
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Check if Value is promise, and resolve before adding
|
|
421
|
+
if (value instanceof Promise) {
|
|
422
|
+
value.then(resolvedValue => {
|
|
423
|
+
this.add(variableName, resolvedValue, persist);
|
|
424
|
+
}).catch(err => {
|
|
425
|
+
console.error(`Resonant: Error resolving promise for variable "${variableName}":`, err);
|
|
426
|
+
});
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
409
430
|
if (Array.isArray(value)) {
|
|
410
431
|
this.data[variableName] = new ObservableArray(variableName, this, ...value);
|
|
411
432
|
this.arrayDataChangeDetection[variableName] = Array.prototype.slice.call(this.data[variableName]);
|
|
@@ -820,12 +841,16 @@
|
|
|
820
841
|
template = window[tplKey];
|
|
821
842
|
}
|
|
822
843
|
|
|
844
|
+
// Build a map of existing elements by their key
|
|
823
845
|
const existingElements = new Map();
|
|
824
|
-
container.querySelectorAll(`[res="${variablePath}"][res-rendered="true"]`)
|
|
846
|
+
const existingElementsList = Array.from(container.querySelectorAll(`[res="${variablePath}"][res-rendered="true"]`));
|
|
847
|
+
existingElementsList.forEach(element => {
|
|
825
848
|
const key = element.getAttribute('res-key');
|
|
826
849
|
if (key) existingElements.set(key, element);
|
|
827
850
|
});
|
|
828
|
-
|
|
851
|
+
|
|
852
|
+
const changedSet = this._changedArrayIndices[variablePath] || this._changedArrayIndices[this._getRootAndPath(variablePath).root];
|
|
853
|
+
const usedElements = new Set();
|
|
829
854
|
|
|
830
855
|
arrayValue.forEach((instance, index) => {
|
|
831
856
|
let elementKey = null;
|
|
@@ -833,11 +858,10 @@
|
|
|
833
858
|
if (!elementKey) elementKey = String(index);
|
|
834
859
|
|
|
835
860
|
let elementToUse;
|
|
836
|
-
|
|
837
|
-
const shouldReuse = existingElements.has(elementKey) && !(changedSet && changedSet.has(index));
|
|
861
|
+
let shouldReuse = existingElements.has(elementKey) && !(changedSet && changedSet.has(index));
|
|
838
862
|
if (shouldReuse) {
|
|
839
863
|
elementToUse = existingElements.get(elementKey);
|
|
840
|
-
|
|
864
|
+
usedElements.add(elementToUse);
|
|
841
865
|
elementToUse.setAttribute("res-index", index);
|
|
842
866
|
} else {
|
|
843
867
|
elementToUse = template.cloneNode(true);
|
|
@@ -849,39 +873,57 @@
|
|
|
849
873
|
}
|
|
850
874
|
elementToUse.setAttribute("res-index", index);
|
|
851
875
|
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
876
|
+
// Only render primitive content for new elements, not reused ones
|
|
877
|
+
// But always update nested arrays/objects as they may have changed
|
|
878
|
+
if (!shouldReuse) {
|
|
879
|
+
if (!isObject(instance)) {
|
|
880
|
+
const anyPlace = elementToUse.querySelector('[res-prop=""]');
|
|
881
|
+
if (anyPlace) {
|
|
882
|
+
anyPlace.innerHTML = String(instance);
|
|
883
|
+
} else {
|
|
884
|
+
elementToUse.innerHTML = String(instance);
|
|
885
|
+
}
|
|
856
886
|
} else {
|
|
857
|
-
|
|
887
|
+
const keys = Object.keys(instance);
|
|
888
|
+
keys.forEach(key => {
|
|
889
|
+
let overrideInstanceValue = null;
|
|
890
|
+
let subEl = elementToUse.querySelector(`[res-prop="${key}"]`);
|
|
891
|
+
if (!subEl) {
|
|
892
|
+
subEl = elementToUse.querySelector('[res-prop=""]');
|
|
893
|
+
overrideInstanceValue = instance;
|
|
894
|
+
}
|
|
895
|
+
if (subEl) {
|
|
896
|
+
const value = this._resolveValue(instance, key, overrideInstanceValue);
|
|
897
|
+
const tag = subEl.tagName;
|
|
898
|
+
if ((tag === 'INPUT' || tag === 'TEXTAREA') &&
|
|
899
|
+
!Array.isArray(value) &&
|
|
900
|
+
!isObject(value)) {
|
|
901
|
+
const prev = value;
|
|
902
|
+
this._handleInputElement(
|
|
903
|
+
subEl,
|
|
904
|
+
value,
|
|
905
|
+
(newValue) => {
|
|
906
|
+
instance[key] = newValue;
|
|
907
|
+
this._queueUpdate(this._getRootAndPath(variablePath).root, 'modified', instance, key, prev, index, `${index}.${key}`);
|
|
908
|
+
}
|
|
909
|
+
);
|
|
910
|
+
}
|
|
911
|
+
else if (!Array.isArray(value) && !isObject(value)) {
|
|
912
|
+
subEl.innerHTML = value ?? '';
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
});
|
|
858
916
|
}
|
|
859
|
-
}
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// Always update nested arrays and objects (even for reused elements)
|
|
920
|
+
if (isObject(instance)) {
|
|
860
921
|
const keys = Object.keys(instance);
|
|
861
922
|
keys.forEach(key => {
|
|
862
|
-
let overrideInstanceValue = null;
|
|
863
923
|
let subEl = elementToUse.querySelector(`[res-prop="${key}"]`);
|
|
864
|
-
if (!subEl) {
|
|
865
|
-
subEl = elementToUse.querySelector('[res-prop=""]');
|
|
866
|
-
overrideInstanceValue = instance;
|
|
867
|
-
}
|
|
868
924
|
if (subEl) {
|
|
869
|
-
const value = this._resolveValue(instance, key,
|
|
870
|
-
|
|
871
|
-
if ((tag === 'INPUT' || tag === 'TEXTAREA') &&
|
|
872
|
-
!Array.isArray(value) &&
|
|
873
|
-
!isObject(value)) {
|
|
874
|
-
const prev = value;
|
|
875
|
-
this._handleInputElement(
|
|
876
|
-
subEl,
|
|
877
|
-
value,
|
|
878
|
-
(newValue) => {
|
|
879
|
-
instance[key] = newValue;
|
|
880
|
-
this._queueUpdate(this._getRootAndPath(variablePath).root, 'modified', instance, key, prev, index, `${index}.${key}`);
|
|
881
|
-
}
|
|
882
|
-
);
|
|
883
|
-
}
|
|
884
|
-
else if (Array.isArray(value)) {
|
|
925
|
+
const value = this._resolveValue(instance, key, null);
|
|
926
|
+
if (Array.isArray(value)) {
|
|
885
927
|
let parentKey = null;
|
|
886
928
|
try { parentKey = arrayValue[index]?.key; } catch (_) {}
|
|
887
929
|
this._renderNestedArray(subEl, value, parentKey, variablePath);
|
|
@@ -895,9 +937,6 @@
|
|
|
895
937
|
}
|
|
896
938
|
});
|
|
897
939
|
}
|
|
898
|
-
else {
|
|
899
|
-
subEl.innerHTML = value ?? '';
|
|
900
|
-
}
|
|
901
940
|
}
|
|
902
941
|
});
|
|
903
942
|
}
|
|
@@ -905,8 +944,16 @@
|
|
|
905
944
|
this._handleDisplayElements(elementToUse, instance, variablePath);
|
|
906
945
|
this._bindClickEvents(elementToUse, instance, arrayValue);
|
|
907
946
|
|
|
947
|
+
// Always append to ensure correct order (appendChild moves existing elements)
|
|
908
948
|
container.appendChild(elementToUse);
|
|
909
949
|
});
|
|
950
|
+
|
|
951
|
+
// Remove elements that weren't reused
|
|
952
|
+
existingElementsList.forEach(element => {
|
|
953
|
+
if (!usedElements.has(element)) {
|
|
954
|
+
element.remove();
|
|
955
|
+
}
|
|
956
|
+
});
|
|
910
957
|
}
|
|
911
958
|
|
|
912
959
|
_renderNestedArray(subEl, arrayValue, parentKey, parentVarPath) {
|
package/resonant.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{function e(e){return null!==e&&"object"==typeof e}function t(e){if("number"==typeof e)return!0;if("string"!=typeof e)return!1;const t=Number(e);return Number.isInteger(t)&&String(t)===e}const r=Symbol("resonantProxy"),s=new WeakMap;class n{constructor(e,t,...r){const s=Array.from(r);return n._createArrayProxy(s,e,t,"")}static _ensureKey(t,r){if(e(t)){if(!s.has(t)){const e=""+r._nextKeyId++;s.set(t,e)}if(!Object.prototype.hasOwnProperty.call(t,"key"))try{Object.defineProperty(t,"key",{get:()=>s.get(t),enumerable:!1,configurable:!1})}catch(e){}}}static _ensureKeysRecursive(t,r){return e(t)?Array.isArray(t)?(t.forEach(e=>n._ensureKeysRecursive(e,r)),t):(n._ensureKey(t,r),Object.keys(t).forEach(e=>{n._ensureKeysRecursive(t[e],r)}),t):t}static _wrapAny(t,s,i,o){return e(t)?t[r]?t:Array.isArray(t)?n._createArrayProxy(t.slice(),s,i,o):i._createObject(s,t,o):t}static _createArrayProxy(s,i,o,a){try{Object.defineProperty(s,r,{value:!0,enumerable:!1})}catch(e){}for(let t=0;t<s.length;t++){const r=s[t];e(r)&&n._ensureKeysRecursive(r,o),s[t]=n._wrapAny(r,i,o,a?`${a}.${t}`:`${t}`)}const l=!(!a||!String(a).length),c=(e,t)=>{const r=l?"modified":"added";o._queueUpdate(i,r,e,null,void 0,t,a)},u=(e,t)=>{const r=l?"modified":"removed";o._queueUpdate(i,r,e,null,void 0,t,a)},d=(e,t,r,s=null)=>{o._queueUpdate(i,"modified",e,s,r,t,a)},p=(e=null)=>{const t=l?"modified":"updated",r=null!==e?e:s;o._queueUpdate(i,t,r,null,void 0,null,a)};return new Proxy(s,{get(e,s,l){if(s===r)return!0;if("length"===s)return Reflect.get(e,s,l);if("set"===s)return(t,r)=>{const s=Number(t),l=e[s],c=n._wrapAny(r,i,o,a?`${a}.${s}`:`${s}`);return n._ensureKeysRecursive(c,o),e[s]=c,d(e[s],s,l),!0};if("delete"===s)return t=>{const r=Number(t);if(!Object.prototype.hasOwnProperty.call(e,r))return!0;const s=e[r];return Array.prototype.splice.call(e,r,1),u(s,r),!0};if("update"===s)return t=>{const r=Array.isArray(t)?t:[];for(let t=e.length-1;t>=0;t--){const r=e[t];e.splice(t,1),u(r,t)}const s=r.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${t}`:`${t}`);return n._ensureKeysRecursive(r,o),r});Array.prototype.push.apply(e,s),s.forEach((e,t)=>c(e,t)),p(t)};if("filterInPlace"===s)return t=>{const r=e.filter(t);for(let t=e.length-1;t>=0;t--){const r=e[t];e.splice(t,1),u(r,t)}const s=r.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${t}`:`${t}`);return n._ensureKeysRecursive(r,o),r});return Array.prototype.push.apply(e,s),s.forEach((e,t)=>c(e,t)),p(),r};if("forceUpdate"===s)return()=>{n._ensureKeysRecursive(e,o),p()};const h={push:(...t)=>{const r=e.length,s=t.map((e,t)=>{const s=n._wrapAny(e,i,o,a?`${a}.${r+t}`:`${r+t}`);return n._ensureKeysRecursive(s,o),s}),l=Array.prototype.push.apply(e,s);return s.forEach((e,t)=>c(e,r+t)),l},pop:()=>{if(!e.length)return;const t=e.length-1,r=Array.prototype.pop.call(e);return u(r,t),r},unshift:(...t)=>{const r=t.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${t}`:`${t}`);return n._ensureKeysRecursive(r,o),r}),s=Array.prototype.unshift.apply(e,r);return r.forEach((e,t)=>c(e,t)),s},shift:()=>{if(!e.length)return;const t=Array.prototype.shift.call(e);return u(t,0),t},splice:(t,r,...s)=>{const l=Number(t)||0,d=void 0===r?e.length-l:Number(r),p=e.slice(l,l+d),h=s.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${l+t}`:`${l+t}`);return n._ensureKeysRecursive(r,o),r}),y=Array.prototype.splice.call(e,l,d,...h);return p.forEach((e,t)=>u(e,l+t)),h.forEach((e,t)=>c(e,l+t)),y},sort:t=>(Array.prototype.sort.call(e,t),l),reverse:()=>(Array.prototype.reverse.call(e),l),filter:(t,r=!0)=>{const s=Array.prototype.filter.call(e,t);return r&&o._queueUpdate(i,"filtered",void 0,null,void 0,null,a),s}};if(s in h)return h[s];if("symbol"==typeof s&&s===Symbol.iterator)return e[Symbol.iterator].bind(e);if(t(s))return Reflect.get(e,s,l);const y=Reflect.get(e,s,l);return"function"==typeof y?y.bind(e):y},set(e,r,s,l){if("length"===r){const t=Number(s);if(!Number.isInteger(t)||t<0)return!1;if(t<e.length){const n=e.slice(t);return Reflect.set(e,r,s,l),n.forEach((e,r)=>u(e,t+r)),!0}return Reflect.set(e,r,s,l)}if(t(r)){const t=Number(r),c=e[t],u=n._wrapAny(s,i,o,a?`${a}.${t}`:`${t}`);n._ensureKeysRecursive(u,o);const p=Reflect.set(e,r,u,l);return d(e[t],t,c),p}return Reflect.set(e,r,s,l)},deleteProperty(e,r){if(t(r)&&Object.prototype.hasOwnProperty.call(e,r)){const t=Number(r),s=e[t],n=Reflect.deleteProperty(e,r);return u(s,t),n}return Reflect.deleteProperty(e,r)}})}}window.Resonant=class{constructor(){this.data={},this.callbacks={},this.pendingUpdates=new Map,this.arrayDataChangeDetection={},this.computedProperties={},this.computedDependencies={},this._currentComputed=null,this._nextKeyId=1,this._changedArrayIndices={}}_splitPath(e){return"string"!=typeof e?[]:e.split(".").filter(Boolean)}_getRootAndPath(e){const t=this._splitPath(e);return{root:t.shift()||e,path:t.join(".")}}_getByPath(t){const{root:r,path:s}=this._getRootAndPath(t);let n=this.data[r];if(!s)return n;const i=this._splitPath(s);for(const t of i){if(!e(n))return;n=n[t]}return n}_setByPath(t,r){const{root:s,path:n}=this._getRootAndPath(t);if(!n)return void(window[s]=r);let i=this.data[s];const o=this._splitPath(n);for(let t=0;t<o.length-1;t++){const r=o[t];e(i[r])||(i[r]={}),i=i[r]}i[o[o.length-1]]=r}_handleInputElement(e,t,r){const s=(e.type||"").toLowerCase();if("checkbox"===s){const s=!!t;e.checked!==s&&(e.checked=s),e.hasAttribute("data-resonant-bound")||(e.onchange=()=>r(!!e.checked),e.setAttribute("data-resonant-bound","true"))}else if("number"===s||"range"===s){const s=t??"";e.value!==String(s)&&(e.value=s),e.hasAttribute("data-resonant-bound")||(e.oninput=()=>{const t=e.value,s=""===t?null:Number(t);r(Number.isNaN(s)?null:s)},e.setAttribute("data-resonant-bound","true"))}else{const s=t??"";e.value!==String(s)&&(e.value=s),e.hasAttribute("data-resonant-bound")||(e.oninput=()=>r(e.value),e.setAttribute("data-resonant-bound","true"))}}persist(e,t,r){if(!r)return t;try{const r=localStorage.getItem("res_"+e);return null!=r?JSON.parse(r):(localStorage.setItem("res_"+e,JSON.stringify(t)),t)}catch(r){return console.warn("Resonant: persistence error for",e,r),t}}updatePersistantData(e){try{localStorage.getItem("res_"+e)&&localStorage.setItem("res_"+e,JSON.stringify(this.data[e]))}catch(t){console.warn("Resonant: persistence update error for",e,t)}}add(t,r,s){r=this.persist(t,r,s),Array.isArray(r)?(this.data[t]=new n(t,this,...r),this.arrayDataChangeDetection[t]=Array.prototype.slice.call(this.data[t])):e(r)?this.data[t]=this._createObject(t,r,""):this.data[t]=r,this._defineProperty(t),this.updateElement(t)}addAll(e){Object.entries(e).forEach(([e,t])=>{this.add(e,t)})}computed(e,t){this.computedProperties[e]=t,this.computedDependencies[e]=new Set,this.computedDependencies[e].clear(),this._currentComputed=e;try{const r=t();this.data[e]=r,this._defineProperty(e),this.updateElement(e)}finally{this._currentComputed=null}}_captureAccess(e){this._currentComputed&&this.computedDependencies[this._currentComputed].add(e)}_recomputeProperty(e){if(!this.computedProperties[e])return;const t=this.computedProperties[e],r=this.data[e];this.computedDependencies[e].clear(),this._currentComputed=e;try{const s=t();r!==s&&(this.data[e]=s,this.updateElement(e),this._queueUpdate(e,"modified",s,null,r))}finally{this._currentComputed=null}}_resolveValue(e,t,r=null){return r??e[t]}_createObject(t,s,i=""){const o=this,a=(s,i)=>{if(!e(s))return s;if(s[r])return s;if(Array.isArray(s))return n._createArrayProxy(s.slice(),t,o,i);n._ensureKeysRecursive(s,o);const l={get(s,l,c){if(l===r)return!0;if(o._currentComputed&&"symbol"!=typeof l){const e=i?`${t}.${i}.${String(l)}`:`${t}.${String(l)}`;o._captureAccess(t),o._captureAccess(e)}const u=Reflect.get(s,l,c);if(e(u)){const e=i?`${i}.${String(l)}`:String(l);let c;return u[r]?u:(c=Array.isArray(u)?n._createArrayProxy(u,t,o,e):a(u,e),s[l]=c,c)}return u},set(e,r,s,l){const c=e[r];if(c===s)return!0;const u=i?`${i}.${String(r)}`:String(r),d=a(s,u);n._ensureKeysRecursive(d,o);const p=Reflect.set(e,r,d,l);return o._queueUpdate(t,"modified",e,String(r),c,null,u),p},deleteProperty(e,r){const s=e[r],n=Reflect.deleteProperty(e,r);return n&&o._queueUpdate(t,"removed",null,String(r),s,null,i?`${i}.${String(r)}`:String(r)),n}};try{Object.defineProperty(s,r,{value:!0,enumerable:!1})}catch(e){}return new Proxy(s,l)};return a(s,i)}_evaluateDisplayCondition(t,r,s,n){try{let i=s||"",o=!1;if(n){const{root:t}=this._getRootAndPath(n);if(r&&e(r)){const e=new RegExp(`\\b${t}\\b`,"g");i=i.replace(e,"item");(i.match(/\b[a-zA-Z_][a-zA-Z0-9_]*\b/g)||[]).forEach(e=>{if("item"!==e&&"true"!==e&&"false"!==e&&"null"!==e&&"undefined"!==e&&Object.prototype.hasOwnProperty.call(r,e)){const t=new RegExp(`\\b${e}\\b`,"g");i=i.replace(t,`item.${e}`)}})}}try{o=!!new Function("item","state",`return (${i});`)(r,this.data)}catch(e){o=!!new Function(`return (${s});`)()}t.style.display=o?"inherit":"none"}catch(e){console.error(`Error evaluating display condition: ${s}`,e)}}_handleDisplayElements(e,t,r){e.querySelectorAll("[res-display]").forEach(e=>{const s=e.getAttribute("res-display")||"";this._evaluateDisplayCondition(e,t,s,r)})}_bindClickEvents(t,r,s){t.querySelectorAll("[res-onclick], [res-onclick-remove]").forEach(t=>{const n=t.getAttribute("res-onclick"),i=t.getAttribute("res-onclick-remove");n&&(t.onclick=()=>{const e=window&&window[n]||null;if("function"==typeof e)try{e.length>0?e(r):e()}catch(e){console.error("Resonant: onclick handler error for",n,e)}else console.warn("Resonant: onclick handler not found:",n)}),i&&(t.onclick=()=>{if(s&&Array.isArray(s)){const t=s.findIndex(t=>e(t)&&t[i]===r[i]);-1!==t&&s.splice(t,1)}})})}_defineProperty(t){Object.defineProperty(window,t,{configurable:!0,get:()=>(this._captureAccess(t),this.data[t]),set:r=>{this.computedProperties[t]?console.warn(`Cannot set computed property "${t}"`):(Array.isArray(r)?(this.data[t]=new n(t,this,...r),this.arrayDataChangeDetection[t]=Array.prototype.slice.call(this.data[t])):e(r)?this.data[t]=this._createObject(t,r,""):this.data[t]=r,this.updateElement(t),this.updateDisplayConditionalsFor(t),this.updateStylesFor(t),Array.isArray(r)||e(r)||this._queueUpdate(t,"modified",this.data[t]))}})}_queueUpdate(e,t,r,s=null,n,i=null,o=null){if(this.pendingUpdates.has(e)||this.pendingUpdates.set(e,[]),this.pendingUpdates.get(e).push({action:t,item:r,property:s,oldValue:n,index:i,path:o}),this._changedArrayIndices[e]||(this._changedArrayIndices[e]=new Set),"number"==typeof i&&i>=0)this._changedArrayIndices[e].add(i);else if("string"==typeof o){const t=o.match(/^(\d+)(\.|$)/);t&&this._changedArrayIndices[e].add(Number(t[1]))}1===this.pendingUpdates.get(e).length&&setTimeout(()=>{let t=this.pendingUpdates.get(e)||[];this.updatePersistantData(e),this.pendingUpdates.delete(e);const r=new Map;t.forEach(e=>r.set((e=>`${e.action}|${e.property??""}|${e.index??""}|${e.path??""}`)(e),e)),t=Array.from(r.values()),t.forEach(t=>{this._triggerCallbacks(e,t)});const s=new Set;t.forEach(t=>{s.add(e),t.path&&s.add(`${e}.${t.path}`)}),Object.keys(this.computedDependencies).forEach(t=>{const r=this.computedDependencies[t];for(const n of s)if(r.has(n)||r.has(e)){this._recomputeProperty(t);break}}),this.updateElement(e),this.updateDisplayConditionalsFor(e),this.updateStylesFor(e),this._changedArrayIndices[e]&&delete this._changedArrayIndices[e]},0)}_triggerCallbacks(e,t){this.callbacks[e]&&this.callbacks[e].forEach(r=>{const s=t.item||t.oldValue;try{r("undefined"!=typeof window&&void 0!==window[e]?window[e]:this.data[e],s,t.action)}catch(t){console.error("Resonant: callback error for",e,t)}})}updateElement(t){const{root:r}=this._getRootAndPath(t);document.querySelectorAll(`[res="${r}"], [res^="${r}."]`).forEach(t=>{const r=t.getAttribute("res"),s=this._getByPath(r);if("INPUT"===t.tagName||"TEXTAREA"===t.tagName)this._handleInputElement(t,s,e=>{this._setByPath(r,e);const{root:t,path:s}=this._getRootAndPath(r);this._queueUpdate(t,"modified",this._getByPath(r),s?s.split(".").pop():null,null,null,s||null)});else if(Array.isArray(s)){if("true"===t.getAttribute("res-rendered"))return;t.querySelectorAll(`[res="${r}"][res-rendered="true"]`).forEach(e=>e.remove()),this._renderArray(r,t)}else if(e(s)){t.querySelectorAll("[res-prop]").forEach(e=>{const t=e.getAttribute("res-prop");t&&t in s&&this._renderObjectProperty(e,s[t],r,t)})}else t.innerHTML=s??""}),this.updateDisplayConditionalsFor(t),this.updateStylesFor(t)}_renderObjectProperty(t,r,s,n){const i=t.tagName;if("INPUT"!==i&&"TEXTAREA"!==i||Array.isArray(r)||e(r))if(Array.isArray(r)){let n=null;const i=this._getByPath(s);if(i&&e(i))try{n=i.key}catch(e){}else{const e=t.getAttribute("res-child");e&&e.includes("--")&&(n=e.split("--")[1])}this._renderNestedArray(t,r,n,s)}else if(e(r)){t.querySelectorAll("[res-prop]").forEach(e=>{const t=e.getAttribute("res-prop");t&&t in r&&this._renderObjectProperty(e,r[t],s,t)})}else t.innerHTML=r??"";else{const e=`${s}.${n}`;this._handleInputElement(t,r,t=>{this._setByPath(e,t)})}}_renderArray(t,r){const s=this._getByPath(t),n=r.hasAttribute("res")&&r.parentElement?r.parentElement:r;let i;const o=t+"_template";window[o]?i=window[o]:(i=r.cloneNode(!0),window[o]=i,r.style.display="none",r.setAttribute("res-template","true"));const a=new Map;n.querySelectorAll(`[res="${t}"][res-rendered="true"]`).forEach(e=>{const t=e.getAttribute("res-key");t&&a.set(t,e)}),n.querySelectorAll(`[res="${t}"][res-rendered="true"]`).forEach(e=>e.remove()),s.forEach((r,o)=>{let l,c=null;try{c=r&&r.key}catch(e){}c||(c=String(o));const u=this._changedArrayIndices[t]||this._changedArrayIndices[this._getRootAndPath(t).root];if(a.has(c)&&!(u&&u.has(o))?(l=a.get(c),a.delete(c),l.setAttribute("res-index",o)):(l=i.cloneNode(!0),l.removeAttribute("res-template"),l.style.display="",l.setAttribute("res-rendered","true"),l.setAttribute("res-key",c),l.setAttribute("res",t)),l.setAttribute("res-index",o),e(r)){Object.keys(r).forEach(n=>{let i=null,a=l.querySelector(`[res-prop="${n}"]`);if(a||(a=l.querySelector('[res-prop=""]'),i=r),a){const l=this._resolveValue(r,n,i),c=a.tagName;if("INPUT"!==c&&"TEXTAREA"!==c||Array.isArray(l)||e(l))if(Array.isArray(l)){let e=null;try{e=s[o]?.key}catch(e){}this._renderNestedArray(a,l,e,t)}else if(e(l)){a.querySelectorAll("[res-prop]").forEach(e=>{const r=e.getAttribute("res-prop");r&&r in l&&this._renderObjectProperty(e,l[r],t,`${o}.${r}`)})}else a.innerHTML=l??"";else{const e=l;this._handleInputElement(a,l,s=>{r[n]=s,this._queueUpdate(this._getRootAndPath(t).root,"modified",r,n,e,o,`${o}.${n}`)})}}})}else{const e=l.querySelector('[res-prop=""]');e?e.innerHTML=String(r):l.innerHTML=String(r)}this._handleDisplayElements(l,r,t),this._bindClickEvents(l,r,s),n.appendChild(l)})}_renderNestedArray(t,r,s,n){t.__res_template||(t.__res_template=t.cloneNode(!0));const i=t.__res_template;for(t.innerHTML="";t.children&&t.children.length;)t.children[0].remove();r.forEach((o,a)=>{const l=i.cloneNode(!0);if(l.setAttribute("res-rendered","true"),l.setAttribute("res-index",a),null===o||e(o)){l.querySelectorAll("[res-prop]").forEach(e=>{const t=e.getAttribute("res-prop");if(t&&t in o){let r=null;try{r=o.key}catch(e){}e.setAttribute("res-child",(r?`${r}-`:"")+t+"--"+(s||"")),this._renderObjectProperty(e,o[t],n,t)}});const e=l.getAttribute("res-display");e&&this._evaluateDisplayCondition(l,o,e,n),this._handleDisplayElements(l,o,n),this._bindClickEvents(l,o,r)}else l.innerHTML=o;t.appendChild(l)})}updateDisplayConditionalsFor(e){document.querySelectorAll(`[res-display*="${e}"]`).forEach(t=>{const r=t.getAttribute("res-display");let s=null,n=t;for(;n;){const e=n.getAttribute&&n.getAttribute("res"),t=n.getAttribute&&n.getAttribute("res-index");if(e){const r=this._getByPath(e);if(Array.isArray(r)&&null!=t){s=r[Number(t)];break}s=r;break}n=n.parentElement}this._evaluateDisplayCondition(t,s??this.data[e],r,e)});document.querySelectorAll(`[res="${e}"] [res-display]`).forEach(t=>{const r=t.getAttribute("res-display");this._evaluateDisplayCondition(t,this.data[e],r,e)})}updateStylesFor(e){document.querySelectorAll(`[res-style*="${e}"]`).forEach(t=>{let r=t.getAttribute("res-style");try{const e=t.getAttribute("res-styles");e&&(e.split(/\s+/).filter(Boolean).forEach(e=>t.classList.remove(e)),t.removeAttribute("res-styles"));let s=t,n=null,i=null;for(;s;){const e=s.getAttribute&&s.getAttribute("res"),t=s.getAttribute&&s.getAttribute("res-index");e&&(n=e),null!=t&&(i=t),s=s.parentElement}let o=null;if(n){const e=this._getByPath(n);o=Array.isArray(e)&&null!==i?e[Number(i)]:e}let a=r;if(n){const{root:e}=this._getRootAndPath(n),t=new RegExp(`\\b${e}\\b`,"g");a=a.replace(t,"item")}const l=new Function("item","state",`return (${a});`)(o,this.data);"string"==typeof l&&l.trim()&&(l.split(/\s+/).forEach(e=>t.classList.add(e)),t.setAttribute("res-styles",l.trim()))}catch(t){console.error(`Error evaluating style for ${e}: ${r}`,t)}})}addCallback(e,t){this.callbacks[e]||(this.callbacks[e]=[]),this.callbacks[e].push(t)}},window.ObservableArray=n})();
|
|
1
|
+
(()=>{function e(e){return null!==e&&"object"==typeof e}function t(e){if("number"==typeof e)return!0;if("string"!=typeof e)return!1;const t=Number(e);return Number.isInteger(t)&&String(t)===e}const r=Symbol("resonantProxy"),s=new WeakMap;class n{constructor(e,t,...r){const s=Array.from(r);return n._createArrayProxy(s,e,t,"")}static _ensureKey(t,r){if(e(t)){if(!s.has(t)){const e=""+r._nextKeyId++;s.set(t,e)}if(!Object.prototype.hasOwnProperty.call(t,"key"))try{Object.defineProperty(t,"key",{get:()=>s.get(t),enumerable:!1,configurable:!1})}catch(e){}}}static _ensureKeysRecursive(t,r){return e(t)?Array.isArray(t)?(t.forEach(e=>n._ensureKeysRecursive(e,r)),t):(n._ensureKey(t,r),Object.keys(t).forEach(e=>{n._ensureKeysRecursive(t[e],r)}),t):t}static _wrapAny(t,s,i,o){return e(t)?t[r]?t:Array.isArray(t)?n._createArrayProxy(t.slice(),s,i,o):i._createObject(s,t,o):t}static _createArrayProxy(s,i,o,a){try{Object.defineProperty(s,r,{value:!0,enumerable:!1})}catch(e){}for(let t=0;t<s.length;t++){const r=s[t];e(r)&&n._ensureKeysRecursive(r,o),s[t]=n._wrapAny(r,i,o,a?`${a}.${t}`:`${t}`)}const l=!(!a||!String(a).length),c=(e,t)=>{const r=l?"modified":"added";o._queueUpdate(i,r,e,null,void 0,t,a)},u=(e,t)=>{const r=l?"modified":"removed";o._queueUpdate(i,r,e,null,void 0,t,a)},d=(e,t,r,s=null)=>{o._queueUpdate(i,"modified",e,s,r,t,a)},p=(e=null)=>{const t=l?"modified":"updated",r=null!==e?e:s;o._queueUpdate(i,t,r,null,void 0,null,a)};return new Proxy(s,{get(e,s,l){if(s===r)return!0;if("length"===s)return Reflect.get(e,s,l);if("set"===s)return(t,r)=>{const s=Number(t),l=e[s],c=n._wrapAny(r,i,o,a?`${a}.${s}`:`${s}`);return n._ensureKeysRecursive(c,o),e[s]=c,d(e[s],s,l),!0};if("delete"===s)return t=>{const r=Number(t);if(!Object.prototype.hasOwnProperty.call(e,r))return!0;const s=e[r];return Array.prototype.splice.call(e,r,1),u(s,r),!0};if("update"===s)return t=>{const r=Array.isArray(t)?t:[];for(let t=e.length-1;t>=0;t--){const r=e[t];e.splice(t,1),u(r,t)}const s=r.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${t}`:`${t}`);return n._ensureKeysRecursive(r,o),r});Array.prototype.push.apply(e,s),s.forEach((e,t)=>c(e,t)),p(t)};if("filterInPlace"===s)return t=>{const r=e.filter(t);for(let t=e.length-1;t>=0;t--){const r=e[t];e.splice(t,1),u(r,t)}const s=r.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${t}`:`${t}`);return n._ensureKeysRecursive(r,o),r});return Array.prototype.push.apply(e,s),s.forEach((e,t)=>c(e,t)),p(),r};if("forceUpdate"===s)return()=>{n._ensureKeysRecursive(e,o),p()};const h={push:(...t)=>{const r=e.length,s=t.map((e,t)=>{const s=n._wrapAny(e,i,o,a?`${a}.${r+t}`:`${r+t}`);return n._ensureKeysRecursive(s,o),s}),l=Array.prototype.push.apply(e,s);return s.forEach((e,t)=>c(e,r+t)),l},pop:()=>{if(!e.length)return;const t=e.length-1,r=Array.prototype.pop.call(e);return u(r,t),r},unshift:(...t)=>{const r=t.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${t}`:`${t}`);return n._ensureKeysRecursive(r,o),r}),s=Array.prototype.unshift.apply(e,r);return r.forEach((e,t)=>c(e,t)),s},shift:()=>{if(!e.length)return;const t=Array.prototype.shift.call(e);return u(t,0),t},splice:(t,r,...s)=>{const l=Number(t)||0,d=void 0===r?e.length-l:Number(r),p=e.slice(l,l+d),h=s.map((e,t)=>{const r=n._wrapAny(e,i,o,a?`${a}.${l+t}`:`${l+t}`);return n._ensureKeysRecursive(r,o),r}),y=Array.prototype.splice.call(e,l,d,...h);return p.forEach((e,t)=>u(e,l+t)),h.forEach((e,t)=>c(e,l+t)),y},sort:t=>(Array.prototype.sort.call(e,t),l),reverse:()=>(Array.prototype.reverse.call(e),l),filter:(t,r=!0)=>{const s=Array.prototype.filter.call(e,t);return r&&o._queueUpdate(i,"filtered",void 0,null,void 0,null,a),s}};if(s in h)return h[s];if("symbol"==typeof s&&s===Symbol.iterator)return e[Symbol.iterator].bind(e);if(t(s))return Reflect.get(e,s,l);const y=Reflect.get(e,s,l);return"function"==typeof y?y.bind(e):y},set(e,r,s,l){if("length"===r){const t=Number(s);if(!Number.isInteger(t)||t<0)return!1;if(t<e.length){const n=e.slice(t);return Reflect.set(e,r,s,l),n.forEach((e,r)=>u(e,t+r)),!0}return Reflect.set(e,r,s,l)}if(t(r)){const t=Number(r),c=e[t],u=n._wrapAny(s,i,o,a?`${a}.${t}`:`${t}`);n._ensureKeysRecursive(u,o);const p=Reflect.set(e,r,u,l);return d(e[t],t,c),p}return Reflect.set(e,r,s,l)},deleteProperty(e,r){if(t(r)&&Object.prototype.hasOwnProperty.call(e,r)){const t=Number(r),s=e[t],n=Reflect.deleteProperty(e,r);return u(s,t),n}return Reflect.deleteProperty(e,r)}})}}window.Resonant=class{constructor(){this.data={},this.callbacks={},this.pendingUpdates=new Map,this.arrayDataChangeDetection={},this.computedProperties={},this.computedDependencies={},this._currentComputed=null,this._nextKeyId=1,this._changedArrayIndices={}}_splitPath(e){return"string"!=typeof e?[]:e.split(".").filter(Boolean)}_getRootAndPath(e){const t=this._splitPath(e);return{root:t.shift()||e,path:t.join(".")}}_getByPath(t){const{root:r,path:s}=this._getRootAndPath(t);let n=this.data[r];if(!s)return n;const i=this._splitPath(s);for(const t of i){if(!e(n))return;n=n[t]}return n}_setByPath(t,r){const{root:s,path:n}=this._getRootAndPath(t);if(!n)return void(window[s]=r);let i=this.data[s];const o=this._splitPath(n);for(let t=0;t<o.length-1;t++){const r=o[t];e(i[r])||(i[r]={}),i=i[r]}i[o[o.length-1]]=r}_handleInputElement(e,t,r){const s=(e.type||"").toLowerCase();if("checkbox"===s){const s=!!t;e.checked!==s&&(e.checked=s),e.hasAttribute("data-resonant-bound")||(e.onchange=()=>r(!!e.checked),e.setAttribute("data-resonant-bound","true"))}else if("number"===s||"range"===s){const s=t??"";e.value!==String(s)&&(e.value=s),e.hasAttribute("data-resonant-bound")||(e.oninput=()=>{const t=e.value,s=""===t?null:Number(t);r(Number.isNaN(s)?null:s)},e.setAttribute("data-resonant-bound","true"))}else{const s=t??"";e.value!==String(s)&&(e.value=s),e.hasAttribute("data-resonant-bound")||(e.oninput=()=>r(e.value),e.setAttribute("data-resonant-bound","true"))}}persist(e,t,r){if(!r)return t;try{const r=localStorage.getItem("res_"+e);return null!=r?JSON.parse(r):(localStorage.setItem("res_"+e,JSON.stringify(t)),t)}catch(r){return console.warn("Resonant: persistence error for",e,r),t}}updatePersistantData(e){try{localStorage.getItem("res_"+e)&&localStorage.setItem("res_"+e,JSON.stringify(this.data[e]))}catch(t){console.warn("Resonant: persistence update error for",e,t)}}add(t,r,s){"Response"!==(r=this.persist(t,r,s)).constructor.name?r instanceof Promise?r.then(e=>{this.add(t,e,s)}).catch(e=>{console.error(`Resonant: Error resolving promise for variable "${t}":`,e)}):(Array.isArray(r)?(this.data[t]=new n(t,this,...r),this.arrayDataChangeDetection[t]=Array.prototype.slice.call(this.data[t])):e(r)?this.data[t]=this._createObject(t,r,""):this.data[t]=r,this._defineProperty(t),this.updateElement(t)):r.json().then(e=>{this.add(t,e,s)}).catch(e=>{console.error(`Resonant: Error resolving fetch response for variable "${t}":`,e)})}addAll(e){Object.entries(e).forEach(([e,t])=>{this.add(e,t)})}computed(e,t){this.computedProperties[e]=t,this.computedDependencies[e]=new Set,this.computedDependencies[e].clear(),this._currentComputed=e;try{const r=t();this.data[e]=r,this._defineProperty(e),this.updateElement(e)}finally{this._currentComputed=null}}_captureAccess(e){this._currentComputed&&this.computedDependencies[this._currentComputed].add(e)}_recomputeProperty(e){if(!this.computedProperties[e])return;const t=this.computedProperties[e],r=this.data[e];this.computedDependencies[e].clear(),this._currentComputed=e;try{const s=t();r!==s&&(this.data[e]=s,this.updateElement(e),this._queueUpdate(e,"modified",s,null,r))}finally{this._currentComputed=null}}_resolveValue(e,t,r=null){return r??e[t]}_createObject(t,s,i=""){const o=this,a=(s,i)=>{if(!e(s))return s;if(s[r])return s;if(Array.isArray(s))return n._createArrayProxy(s.slice(),t,o,i);n._ensureKeysRecursive(s,o);const l={get(s,l,c){if(l===r)return!0;if(o._currentComputed&&"symbol"!=typeof l){const e=i?`${t}.${i}.${String(l)}`:`${t}.${String(l)}`;o._captureAccess(t),o._captureAccess(e)}const u=Reflect.get(s,l,c);if(e(u)){const e=i?`${i}.${String(l)}`:String(l);let c;return u[r]?u:(c=Array.isArray(u)?n._createArrayProxy(u,t,o,e):a(u,e),s[l]=c,c)}return u},set(e,r,s,l){const c=e[r];if(c===s)return!0;const u=i?`${i}.${String(r)}`:String(r),d=a(s,u);n._ensureKeysRecursive(d,o);const p=Reflect.set(e,r,d,l);return o._queueUpdate(t,"modified",e,String(r),c,null,u),p},deleteProperty(e,r){const s=e[r],n=Reflect.deleteProperty(e,r);return n&&o._queueUpdate(t,"removed",null,String(r),s,null,i?`${i}.${String(r)}`:String(r)),n}};try{Object.defineProperty(s,r,{value:!0,enumerable:!1})}catch(e){}return new Proxy(s,l)};return a(s,i)}_evaluateDisplayCondition(t,r,s,n){try{let i=s||"",o=!1;if(n){const{root:t}=this._getRootAndPath(n);if(r&&e(r)){const e=new RegExp(`\\b${t}\\b`,"g");i=i.replace(e,"item");(i.match(/\b[a-zA-Z_][a-zA-Z0-9_]*\b/g)||[]).forEach(e=>{if("item"!==e&&"true"!==e&&"false"!==e&&"null"!==e&&"undefined"!==e&&Object.prototype.hasOwnProperty.call(r,e)){const t=new RegExp(`\\b${e}\\b`,"g");i=i.replace(t,`item.${e}`)}})}}try{o=!!new Function("item","state",`return (${i});`)(r,this.data)}catch(e){o=!!new Function(`return (${s});`)()}t.style.display=o?"inherit":"none"}catch(e){console.error(`Error evaluating display condition: ${s}`,e)}}_handleDisplayElements(e,t,r){e.querySelectorAll("[res-display]").forEach(e=>{const s=e.getAttribute("res-display")||"";this._evaluateDisplayCondition(e,t,s,r)})}_bindClickEvents(t,r,s){t.querySelectorAll("[res-onclick], [res-onclick-remove]").forEach(t=>{const n=t.getAttribute("res-onclick"),i=t.getAttribute("res-onclick-remove");n&&(t.onclick=()=>{const e=window&&window[n]||null;if("function"==typeof e)try{e.length>0?e(r):e()}catch(e){console.error("Resonant: onclick handler error for",n,e)}else console.warn("Resonant: onclick handler not found:",n)}),i&&(t.onclick=()=>{if(s&&Array.isArray(s)){const t=s.findIndex(t=>e(t)&&t[i]===r[i]);-1!==t&&s.splice(t,1)}})})}_defineProperty(t){Object.defineProperty(window,t,{configurable:!0,get:()=>(this._captureAccess(t),this.data[t]),set:r=>{this.computedProperties[t]?console.warn(`Cannot set computed property "${t}"`):(Array.isArray(r)?(this.data[t]=new n(t,this,...r),this.arrayDataChangeDetection[t]=Array.prototype.slice.call(this.data[t])):e(r)?this.data[t]=this._createObject(t,r,""):this.data[t]=r,this.updateElement(t),this.updateDisplayConditionalsFor(t),this.updateStylesFor(t),Array.isArray(r)||e(r)||this._queueUpdate(t,"modified",this.data[t]))}})}_queueUpdate(e,t,r,s=null,n,i=null,o=null){if(this.pendingUpdates.has(e)||this.pendingUpdates.set(e,[]),this.pendingUpdates.get(e).push({action:t,item:r,property:s,oldValue:n,index:i,path:o}),this._changedArrayIndices[e]||(this._changedArrayIndices[e]=new Set),"number"==typeof i&&i>=0)this._changedArrayIndices[e].add(i);else if("string"==typeof o){const t=o.match(/^(\d+)(\.|$)/);t&&this._changedArrayIndices[e].add(Number(t[1]))}1===this.pendingUpdates.get(e).length&&setTimeout(()=>{let t=this.pendingUpdates.get(e)||[];this.updatePersistantData(e),this.pendingUpdates.delete(e);const r=new Map;t.forEach(e=>r.set((e=>`${e.action}|${e.property??""}|${e.index??""}|${e.path??""}`)(e),e)),t=Array.from(r.values()),t.forEach(t=>{this._triggerCallbacks(e,t)});const s=new Set;t.forEach(t=>{s.add(e),t.path&&s.add(`${e}.${t.path}`)}),Object.keys(this.computedDependencies).forEach(t=>{const r=this.computedDependencies[t];for(const n of s)if(r.has(n)||r.has(e)){this._recomputeProperty(t);break}}),this.updateElement(e),this.updateDisplayConditionalsFor(e),this.updateStylesFor(e),this._changedArrayIndices[e]&&delete this._changedArrayIndices[e]},0)}_triggerCallbacks(e,t){this.callbacks[e]&&this.callbacks[e].forEach(r=>{const s=t.item||t.oldValue;try{r("undefined"!=typeof window&&void 0!==window[e]?window[e]:this.data[e],s,t.action)}catch(t){console.error("Resonant: callback error for",e,t)}})}updateElement(t){const{root:r}=this._getRootAndPath(t);document.querySelectorAll(`[res="${r}"], [res^="${r}."]`).forEach(t=>{const r=t.getAttribute("res"),s=this._getByPath(r);if("INPUT"===t.tagName||"TEXTAREA"===t.tagName)this._handleInputElement(t,s,e=>{this._setByPath(r,e);const{root:t,path:s}=this._getRootAndPath(r);this._queueUpdate(t,"modified",this._getByPath(r),s?s.split(".").pop():null,null,null,s||null)});else if(Array.isArray(s)){if("true"===t.getAttribute("res-rendered"))return;t.querySelectorAll(`[res="${r}"][res-rendered="true"]`).forEach(e=>e.remove()),this._renderArray(r,t)}else if(e(s)){t.querySelectorAll("[res-prop]").forEach(e=>{const t=e.getAttribute("res-prop");t&&t in s&&this._renderObjectProperty(e,s[t],r,t)})}else t.innerHTML=s??""}),this.updateDisplayConditionalsFor(t),this.updateStylesFor(t)}_renderObjectProperty(t,r,s,n){const i=t.tagName;if("INPUT"!==i&&"TEXTAREA"!==i||Array.isArray(r)||e(r))if(Array.isArray(r)){let n=null;const i=this._getByPath(s);if(i&&e(i))try{n=i.key}catch(e){}else{const e=t.getAttribute("res-child");e&&e.includes("--")&&(n=e.split("--")[1])}this._renderNestedArray(t,r,n,s)}else if(e(r)){t.querySelectorAll("[res-prop]").forEach(e=>{const t=e.getAttribute("res-prop");t&&t in r&&this._renderObjectProperty(e,r[t],s,t)})}else t.innerHTML=r??"";else{const e=`${s}.${n}`;this._handleInputElement(t,r,t=>{this._setByPath(e,t)})}}_renderArray(t,r){const s=this._getByPath(t),n=r.hasAttribute("res")&&r.parentElement?r.parentElement:r;let i;const o=t+"_template";window[o]?i=window[o]:(i=r.cloneNode(!0),window[o]=i,r.style.display="none",r.setAttribute("res-template","true"));const a=new Map,l=Array.from(n.querySelectorAll(`[res="${t}"][res-rendered="true"]`));l.forEach(e=>{const t=e.getAttribute("res-key");t&&a.set(t,e)});const c=this._changedArrayIndices[t]||this._changedArrayIndices[this._getRootAndPath(t).root],u=new Set;s.forEach((r,o)=>{let l,d=null;try{d=r&&r.key}catch(e){}d||(d=String(o));let p=a.has(d)&&!(c&&c.has(o));if(p?(l=a.get(d),u.add(l),l.setAttribute("res-index",o)):(l=i.cloneNode(!0),l.removeAttribute("res-template"),l.style.display="",l.setAttribute("res-rendered","true"),l.setAttribute("res-key",d),l.setAttribute("res",t)),l.setAttribute("res-index",o),!p)if(e(r)){Object.keys(r).forEach(s=>{let n=null,i=l.querySelector(`[res-prop="${s}"]`);if(i||(i=l.querySelector('[res-prop=""]'),n=r),i){const a=this._resolveValue(r,s,n),l=i.tagName;if("INPUT"!==l&&"TEXTAREA"!==l||Array.isArray(a)||e(a))Array.isArray(a)||e(a)||(i.innerHTML=a??"");else{const e=a;this._handleInputElement(i,a,n=>{r[s]=n,this._queueUpdate(this._getRootAndPath(t).root,"modified",r,s,e,o,`${o}.${s}`)})}}})}else{const e=l.querySelector('[res-prop=""]');e?e.innerHTML=String(r):l.innerHTML=String(r)}if(e(r)){Object.keys(r).forEach(n=>{let i=l.querySelector(`[res-prop="${n}"]`);if(i){const a=this._resolveValue(r,n,null);if(Array.isArray(a)){let e=null;try{e=s[o]?.key}catch(e){}this._renderNestedArray(i,a,e,t)}else if(e(a)){i.querySelectorAll("[res-prop]").forEach(e=>{const r=e.getAttribute("res-prop");r&&r in a&&this._renderObjectProperty(e,a[r],t,`${o}.${r}`)})}}})}this._handleDisplayElements(l,r,t),this._bindClickEvents(l,r,s),n.appendChild(l)}),l.forEach(e=>{u.has(e)||e.remove()})}_renderNestedArray(t,r,s,n){t.__res_template||(t.__res_template=t.cloneNode(!0));const i=t.__res_template;for(t.innerHTML="";t.children&&t.children.length;)t.children[0].remove();r.forEach((o,a)=>{const l=i.cloneNode(!0);if(l.setAttribute("res-rendered","true"),l.setAttribute("res-index",a),null===o||e(o)){l.querySelectorAll("[res-prop]").forEach(e=>{const t=e.getAttribute("res-prop");if(t&&t in o){let r=null;try{r=o.key}catch(e){}e.setAttribute("res-child",(r?`${r}-`:"")+t+"--"+(s||"")),this._renderObjectProperty(e,o[t],n,t)}});const e=l.getAttribute("res-display");e&&this._evaluateDisplayCondition(l,o,e,n),this._handleDisplayElements(l,o,n),this._bindClickEvents(l,o,r)}else l.innerHTML=o;t.appendChild(l)})}updateDisplayConditionalsFor(e){document.querySelectorAll(`[res-display*="${e}"]`).forEach(t=>{const r=t.getAttribute("res-display");let s=null,n=t;for(;n;){const e=n.getAttribute&&n.getAttribute("res"),t=n.getAttribute&&n.getAttribute("res-index");if(e){const r=this._getByPath(e);if(Array.isArray(r)&&null!=t){s=r[Number(t)];break}s=r;break}n=n.parentElement}this._evaluateDisplayCondition(t,s??this.data[e],r,e)});document.querySelectorAll(`[res="${e}"] [res-display]`).forEach(t=>{const r=t.getAttribute("res-display");this._evaluateDisplayCondition(t,this.data[e],r,e)})}updateStylesFor(e){document.querySelectorAll(`[res-style*="${e}"]`).forEach(t=>{let r=t.getAttribute("res-style");try{const e=t.getAttribute("res-styles");e&&(e.split(/\s+/).filter(Boolean).forEach(e=>t.classList.remove(e)),t.removeAttribute("res-styles"));let s=t,n=null,i=null;for(;s;){const e=s.getAttribute&&s.getAttribute("res"),t=s.getAttribute&&s.getAttribute("res-index");e&&(n=e),null!=t&&(i=t),s=s.parentElement}let o=null;if(n){const e=this._getByPath(n);o=Array.isArray(e)&&null!==i?e[Number(i)]:e}let a=r;if(n){const{root:e}=this._getRootAndPath(n),t=new RegExp(`\\b${e}\\b`,"g");a=a.replace(t,"item")}const l=new Function("item","state",`return (${a});`)(o,this.data);"string"==typeof l&&l.trim()&&(l.split(/\s+/).forEach(e=>t.classList.add(e)),t.setAttribute("res-styles",l.trim()))}catch(t){console.error(`Error evaluating style for ${e}: ${r}`,t)}})}addCallback(e,t){this.callbacks[e]||(this.callbacks[e]=[]),this.callbacks[e].push(t)}},window.ObservableArray=n})();
|
|
2
2
|
//# sourceMappingURL=resonant.min.js.map
|
package/resonant.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resonant.min.js","names":["isObject","val","isNumericProp","prop","n","Number","isInteger","String","PROXY_FLAG","Symbol","OBJECT_KEY","WeakMap","ObservableArray","constructor","variableName","resonantInstance","args","base","Array","from","_createArrayProxy","_ensureKey","target","resonant","has","id","_nextKeyId","set","Object","prototype","hasOwnProperty","call","defineProperty","get","enumerable","configurable","_","_ensureKeysRecursive","value","isArray","forEach","v","keys","k","_wrapAny","rootName","path","slice","_createObject","i","length","item","isNestedArray","notifyAdded","index","action","_queueUpdate","undefined","notifyRemoved","notifyModified","oldValue","property","notifyUpdated","payloadItem","itemForCallback","Proxy","t","receiver","Reflect","idx","wrapped","old","splice","array","newArr","wrappedItems","map","it","w","push","apply","predicate","filtered","filter","arrMethods","startLen","result","pop","unshift","shift","start","deleteCount","items","s","dc","removed","res","sort","cmp","reverse","fn","actuallyFilter","iterator","bind","newLen","ok","deleteProperty","window","Resonant","this","data","callbacks","pendingUpdates","Map","arrayDataChangeDetection","computedProperties","computedDependencies","_currentComputed","_changedArrayIndices","_splitPath","split","Boolean","_getRootAndPath","parts","root","join","_getByPath","cur","p","_setByPath","_handleInputElement","element","onChangeCallback","type","toLowerCase","b","checked","hasAttribute","onchange","setAttribute","oninput","raw","num","isNaN","persist","found","localStorage","getItem","JSON","parse","setItem","stringify","e","console","warn","updatePersistantData","add","_defineProperty","updateElement","addAll","config","entries","computed","computedName","computeFunction","Set","clear","_captureAccess","token","_recomputeProperty","newValue","_resolveValue","instance","key","override","rootVarName","obj","basePath","self","wrap","o","handler","childPath","_evaluateDisplayCondition","condition","expr","show","rootPattern","RegExp","replace","match","tok","rx","Function","style","display","error","_handleDisplayElements","parentElement","querySelectorAll","displayEl","getAttribute","_bindClickEvents","arrayValue","onclickEl","functionName","removeKey","onclick","removeIdx","findIndex","updateDisplayConditionalsFor","updateStylesFor","m","setTimeout","updates","delete","seen","u","keyOf","values","_triggerCallbacks","changedTokens","deps","callbackData","callback","document","resAttr","boundValue","tagName","root2","el","remove","_renderArray","subEl","_renderObjectProperty","innerHTML","propValue","parentVarName","tag","parentKey","parentObj","childAttr","includes","_renderNestedArray","nestedEl","nestedKey","variablePath","container","template","tplKey","cloneNode","existingElements","elm","elementToUse","elementKey","changedSet","removeAttribute","overrideInstanceValue","querySelector","prev","anyPlace","appendChild","parentVarPath","__res_template","children","cloned","itemKey","displayCondition","conditionalElement","node","r","bound","styleElement","styleCondition","cls","classList","parent","boundPath","ctxItem","styleClass","trim","addCallback","method"],"sources":["0"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"resonant.min.js","names":["isObject","val","isNumericProp","prop","n","Number","isInteger","String","PROXY_FLAG","Symbol","OBJECT_KEY","WeakMap","ObservableArray","constructor","variableName","resonantInstance","args","base","Array","from","_createArrayProxy","_ensureKey","target","resonant","has","id","_nextKeyId","set","Object","prototype","hasOwnProperty","call","defineProperty","get","enumerable","configurable","_","_ensureKeysRecursive","value","isArray","forEach","v","keys","k","_wrapAny","rootName","path","slice","_createObject","i","length","item","isNestedArray","notifyAdded","index","action","_queueUpdate","undefined","notifyRemoved","notifyModified","oldValue","property","notifyUpdated","payloadItem","itemForCallback","Proxy","t","receiver","Reflect","idx","wrapped","old","splice","array","newArr","wrappedItems","map","it","w","push","apply","predicate","filtered","filter","arrMethods","startLen","result","pop","unshift","shift","start","deleteCount","items","s","dc","removed","res","sort","cmp","reverse","fn","actuallyFilter","iterator","bind","newLen","ok","deleteProperty","window","Resonant","this","data","callbacks","pendingUpdates","Map","arrayDataChangeDetection","computedProperties","computedDependencies","_currentComputed","_changedArrayIndices","_splitPath","split","Boolean","_getRootAndPath","parts","root","join","_getByPath","cur","p","_setByPath","_handleInputElement","element","onChangeCallback","type","toLowerCase","b","checked","hasAttribute","onchange","setAttribute","oninput","raw","num","isNaN","persist","found","localStorage","getItem","JSON","parse","setItem","stringify","e","console","warn","updatePersistantData","add","name","Promise","then","resolvedValue","catch","err","error","_defineProperty","updateElement","json","addAll","config","entries","computed","computedName","computeFunction","Set","clear","_captureAccess","token","_recomputeProperty","newValue","_resolveValue","instance","key","override","rootVarName","obj","basePath","self","wrap","o","handler","childPath","_evaluateDisplayCondition","condition","expr","show","rootPattern","RegExp","replace","match","tok","rx","Function","style","display","_handleDisplayElements","parentElement","querySelectorAll","displayEl","getAttribute","_bindClickEvents","arrayValue","onclickEl","functionName","removeKey","onclick","removeIdx","findIndex","updateDisplayConditionalsFor","updateStylesFor","m","setTimeout","updates","delete","seen","u","keyOf","values","_triggerCallbacks","changedTokens","deps","callbackData","callback","document","resAttr","boundValue","tagName","root2","el","remove","_renderArray","subEl","_renderObjectProperty","innerHTML","propValue","parentVarName","tag","parentKey","parentObj","childAttr","includes","_renderNestedArray","nestedEl","nestedKey","variablePath","container","template","tplKey","cloneNode","existingElements","existingElementsList","changedSet","usedElements","elementToUse","elementKey","shouldReuse","removeAttribute","overrideInstanceValue","querySelector","prev","anyPlace","appendChild","parentVarPath","__res_template","children","cloned","itemKey","displayCondition","conditionalElement","node","r","bound","styleElement","styleCondition","cls","classList","parent","boundPath","ctxItem","styleClass","trim","addCallback","method"],"sources":["0"],"mappings":"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","ignoreList":[]}
|
package/test/mockDom.js
CHANGED
|
@@ -46,7 +46,8 @@ class MockElement {
|
|
|
46
46
|
hasAttribute(name) { return Object.prototype.hasOwnProperty.call(this.attributes, name); }
|
|
47
47
|
removeAttribute(name) { delete this.attributes[name]; }
|
|
48
48
|
appendChild(child) {
|
|
49
|
-
|
|
49
|
+
// Remove child from its current parent (even if it's this element)
|
|
50
|
+
if (child.parentElement) {
|
|
50
51
|
const idx = child.parentElement.children.indexOf(child);
|
|
51
52
|
if (idx >= 0) {
|
|
52
53
|
child.parentElement.children.splice(idx, 1);
|
|
@@ -367,4 +367,144 @@ test('array item property update should not affect other array items', async ()
|
|
|
367
367
|
|
|
368
368
|
// Verify values are correct
|
|
369
369
|
assert.strictEqual(secondItemPrice.innerHTML, '25');
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
test('manual DOM changes should be preserved when updating unrelated array items', async () => {
|
|
373
|
+
// Create DOM structure with array of objects
|
|
374
|
+
const root = new MockElement('ul');
|
|
375
|
+
|
|
376
|
+
const li = new MockElement('li');
|
|
377
|
+
li.setAttribute('res', 'people');
|
|
378
|
+
|
|
379
|
+
const nameSpan = new MockElement('span');
|
|
380
|
+
nameSpan.setAttribute('res-prop', 'name');
|
|
381
|
+
li.appendChild(nameSpan);
|
|
382
|
+
|
|
383
|
+
const ageSpan = new MockElement('span');
|
|
384
|
+
ageSpan.setAttribute('res-prop', 'age');
|
|
385
|
+
li.appendChild(ageSpan);
|
|
386
|
+
|
|
387
|
+
root.appendChild(li);
|
|
388
|
+
|
|
389
|
+
const { context, resonant } = createResonantDom(root);
|
|
390
|
+
|
|
391
|
+
// Initialize array with multiple people
|
|
392
|
+
resonant.add('people', [
|
|
393
|
+
{ name: 'Alice', age: 30 },
|
|
394
|
+
{ name: 'Bob', age: 25 },
|
|
395
|
+
{ name: 'Charlie', age: 35 }
|
|
396
|
+
]);
|
|
397
|
+
|
|
398
|
+
// Get rendered elements
|
|
399
|
+
const renderedItems = root.querySelectorAll('[res-rendered="true"]');
|
|
400
|
+
assert.strictEqual(renderedItems.length, 3, 'Should have 3 rendered items');
|
|
401
|
+
|
|
402
|
+
// Verify initial values
|
|
403
|
+
const firstItemNameSpan = renderedItems[0].querySelector('[res-prop="name"]');
|
|
404
|
+
const secondItemNameSpan = renderedItems[1].querySelector('[res-prop="name"]');
|
|
405
|
+
const thirdItemNameSpan = renderedItems[2].querySelector('[res-prop="name"]');
|
|
406
|
+
|
|
407
|
+
assert.strictEqual(firstItemNameSpan.innerHTML, 'Alice');
|
|
408
|
+
assert.strictEqual(secondItemNameSpan.innerHTML, 'Bob');
|
|
409
|
+
assert.strictEqual(thirdItemNameSpan.innerHTML, 'Charlie');
|
|
410
|
+
|
|
411
|
+
// Manually modify the first item's name directly in the DOM
|
|
412
|
+
firstItemNameSpan.innerHTML = 'Manually Changed Alice';
|
|
413
|
+
|
|
414
|
+
// Update the second item's name through the reactive system
|
|
415
|
+
context.people[1].name = 'Robert';
|
|
416
|
+
await new Promise(r => setTimeout(r, 5));
|
|
417
|
+
|
|
418
|
+
// Get updated rendered elements
|
|
419
|
+
const updatedItems = root.querySelectorAll('[res-rendered="true"]');
|
|
420
|
+
|
|
421
|
+
// Verify the manually changed first item was NOT overwritten
|
|
422
|
+
const updatedFirstItemNameSpan = updatedItems[0].querySelector('[res-prop="name"]');
|
|
423
|
+
assert.strictEqual(updatedFirstItemNameSpan.innerHTML, 'Manually Changed Alice',
|
|
424
|
+
'First item manual change should be preserved');
|
|
425
|
+
|
|
426
|
+
// Verify the second item was updated correctly
|
|
427
|
+
const updatedSecondItemNameSpan = updatedItems[1].querySelector('[res-prop="name"]');
|
|
428
|
+
assert.strictEqual(updatedSecondItemNameSpan.innerHTML, 'Robert',
|
|
429
|
+
'Second item should be updated to Robert');
|
|
430
|
+
|
|
431
|
+
// Verify the third item remains unchanged
|
|
432
|
+
const updatedThirdItemNameSpan = updatedItems[2].querySelector('[res-prop="name"]');
|
|
433
|
+
assert.strictEqual(updatedThirdItemNameSpan.innerHTML, 'Charlie',
|
|
434
|
+
'Third item should remain unchanged');
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
test('manual DOM changes in one array should be preserved when updating a different array', async () => {
|
|
438
|
+
// Create DOM structure with two separate arrays
|
|
439
|
+
const root = new MockElement('div');
|
|
440
|
+
|
|
441
|
+
// First array container
|
|
442
|
+
const firstArrayContainer = new MockElement('ul');
|
|
443
|
+
const firstArrayTemplate = new MockElement('li');
|
|
444
|
+
firstArrayTemplate.setAttribute('res', 'teamA');
|
|
445
|
+
const firstArrayNameSpan = new MockElement('span');
|
|
446
|
+
firstArrayNameSpan.setAttribute('res-prop', 'name');
|
|
447
|
+
firstArrayTemplate.appendChild(firstArrayNameSpan);
|
|
448
|
+
firstArrayContainer.appendChild(firstArrayTemplate);
|
|
449
|
+
root.appendChild(firstArrayContainer);
|
|
450
|
+
|
|
451
|
+
// Second array container
|
|
452
|
+
const secondArrayContainer = new MockElement('ul');
|
|
453
|
+
const secondArrayTemplate = new MockElement('li');
|
|
454
|
+
secondArrayTemplate.setAttribute('res', 'teamB');
|
|
455
|
+
const secondArrayNameSpan = new MockElement('span');
|
|
456
|
+
secondArrayNameSpan.setAttribute('res-prop', 'name');
|
|
457
|
+
secondArrayTemplate.appendChild(secondArrayNameSpan);
|
|
458
|
+
secondArrayContainer.appendChild(secondArrayTemplate);
|
|
459
|
+
root.appendChild(secondArrayContainer);
|
|
460
|
+
|
|
461
|
+
const { context, resonant } = createResonantDom(root);
|
|
462
|
+
|
|
463
|
+
// Initialize both arrays
|
|
464
|
+
resonant.add('teamA', [
|
|
465
|
+
{ name: 'Alice' },
|
|
466
|
+
{ name: 'Bob' }
|
|
467
|
+
]);
|
|
468
|
+
resonant.add('teamB', [
|
|
469
|
+
{ name: 'Charlie' },
|
|
470
|
+
{ name: 'Diana' }
|
|
471
|
+
]);
|
|
472
|
+
|
|
473
|
+
// Get rendered elements for both arrays
|
|
474
|
+
const teamAItems = firstArrayContainer.querySelectorAll('[res="teamA"][res-rendered="true"]');
|
|
475
|
+
const teamBItems = secondArrayContainer.querySelectorAll('[res="teamB"][res-rendered="true"]');
|
|
476
|
+
|
|
477
|
+
assert.strictEqual(teamAItems.length, 2, 'Should have 2 teamA items');
|
|
478
|
+
assert.strictEqual(teamBItems.length, 2, 'Should have 2 teamB items');
|
|
479
|
+
|
|
480
|
+
// Verify initial values
|
|
481
|
+
assert.strictEqual(teamAItems[0].querySelector('[res-prop="name"]').innerHTML, 'Alice');
|
|
482
|
+
assert.strictEqual(teamAItems[1].querySelector('[res-prop="name"]').innerHTML, 'Bob');
|
|
483
|
+
assert.strictEqual(teamBItems[0].querySelector('[res-prop="name"]').innerHTML, 'Charlie');
|
|
484
|
+
assert.strictEqual(teamBItems[1].querySelector('[res-prop="name"]').innerHTML, 'Diana');
|
|
485
|
+
|
|
486
|
+
// Manually modify the second array's first item
|
|
487
|
+
const teamBFirstItemNameSpan = teamBItems[0].querySelector('[res-prop="name"]');
|
|
488
|
+
teamBFirstItemNameSpan.innerHTML = 'Manually Changed Charlie';
|
|
489
|
+
|
|
490
|
+
// Update the FIRST array (teamA) through the reactive system
|
|
491
|
+
context.teamA[0].name = 'Alicia';
|
|
492
|
+
await new Promise(r => setTimeout(r, 5));
|
|
493
|
+
|
|
494
|
+
// Get updated rendered elements
|
|
495
|
+
const updatedTeamAItems = firstArrayContainer.querySelectorAll('[res="teamA"][res-rendered="true"]');
|
|
496
|
+
const updatedTeamBItems = secondArrayContainer.querySelectorAll('[res="teamB"][res-rendered="true"]');
|
|
497
|
+
|
|
498
|
+
// Verify the first array was updated correctly
|
|
499
|
+
assert.strictEqual(updatedTeamAItems[0].querySelector('[res-prop="name"]').innerHTML, 'Alicia',
|
|
500
|
+
'TeamA first item should be updated to Alicia');
|
|
501
|
+
assert.strictEqual(updatedTeamAItems[1].querySelector('[res-prop="name"]').innerHTML, 'Bob',
|
|
502
|
+
'TeamA second item should remain Bob');
|
|
503
|
+
|
|
504
|
+
// Verify the second array's manual change was preserved (CRITICAL TEST)
|
|
505
|
+
const updatedTeamBFirstItemNameSpan = updatedTeamBItems[0].querySelector('[res-prop="name"]');
|
|
506
|
+
assert.strictEqual(updatedTeamBFirstItemNameSpan.innerHTML, 'Manually Changed Charlie',
|
|
507
|
+
'TeamB manual change should be preserved when teamA is updated');
|
|
508
|
+
assert.strictEqual(updatedTeamBItems[1].querySelector('[res-prop="name"]').innerHTML, 'Diana',
|
|
509
|
+
'TeamB second item should remain Diana');
|
|
370
510
|
});
|