@flashist/appframework 0.0.348 → 0.0.350

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.
@@ -0,0 +1,406 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createStatePathProxy } from './StatePathProxy';
3
+ import { StatePath } from './StatePath';
4
+ /**
5
+ * Mock storage implementation for testing
6
+ */
7
+ class MockStateStorage {
8
+ constructor(initialState = {}) {
9
+ this.state = {};
10
+ this.operations = [];
11
+ this.state = initialState;
12
+ }
13
+ getNestedValue(path) {
14
+ if (!path)
15
+ return this.state;
16
+ const parts = path.split('.');
17
+ let current = this.state;
18
+ for (const part of parts) {
19
+ if (current === undefined || current === null)
20
+ return undefined;
21
+ current = current[part];
22
+ }
23
+ return current;
24
+ }
25
+ setNestedValue(path, value) {
26
+ if (!path) {
27
+ this.state = value;
28
+ return;
29
+ }
30
+ const parts = path.split('.');
31
+ let current = this.state;
32
+ for (let i = 0; i < parts.length - 1; i++) {
33
+ const part = parts[i];
34
+ if (current[part] === undefined) {
35
+ current[part] = {};
36
+ }
37
+ current = current[part];
38
+ }
39
+ current[parts[parts.length - 1]] = value;
40
+ }
41
+ getValueByPath(path) {
42
+ this.operations.push({ method: 'get', path });
43
+ return this.getNestedValue(path);
44
+ }
45
+ changeByPath(path, value) {
46
+ this.operations.push({ method: 'change', path, args: [value] });
47
+ const existing = this.getNestedValue(path);
48
+ if (typeof existing === 'object' && typeof value === 'object' && existing !== null && value !== null) {
49
+ this.setNestedValue(path, Object.assign(Object.assign({}, existing), value));
50
+ }
51
+ else {
52
+ this.setNestedValue(path, value);
53
+ }
54
+ }
55
+ substituteByPath(path, value) {
56
+ this.operations.push({ method: 'substitute', path, args: [value] });
57
+ this.setNestedValue(path, value);
58
+ }
59
+ deleteByPath(path) {
60
+ this.operations.push({ method: 'delete', path });
61
+ const value = this.getNestedValue(path);
62
+ const parts = path.split('.');
63
+ const key = parts.pop();
64
+ const parent = parts.length ? this.getNestedValue(parts.join('.')) : this.state;
65
+ if (parent && typeof parent === 'object') {
66
+ delete parent[key];
67
+ }
68
+ return value;
69
+ }
70
+ pushByPath(path, ...elements) {
71
+ this.operations.push({ method: 'push', path, args: elements });
72
+ const arr = this.getNestedValue(path);
73
+ if (Array.isArray(arr)) {
74
+ arr.push(...elements);
75
+ }
76
+ }
77
+ spliceByPath(path, start, deleteCount) {
78
+ this.operations.push({ method: 'splice', path, args: [start, deleteCount] });
79
+ const arr = this.getNestedValue(path);
80
+ if (Array.isArray(arr)) {
81
+ return deleteCount !== undefined
82
+ ? arr.splice(start, deleteCount)
83
+ : arr.splice(start);
84
+ }
85
+ return [];
86
+ }
87
+ reset() {
88
+ this.operations = [];
89
+ }
90
+ }
91
+ describe('StatePathProxy', () => {
92
+ let storage;
93
+ beforeEach(() => {
94
+ storage = new MockStateStorage({
95
+ user: {
96
+ profile: {
97
+ name: 'Alice',
98
+ age: 28
99
+ },
100
+ settings: {
101
+ theme: 'dark'
102
+ }
103
+ },
104
+ items: [
105
+ { id: 1, name: 'Sword', active: true },
106
+ { id: 2, name: 'Shield', active: false }
107
+ ],
108
+ levels: [
109
+ {
110
+ name: 'Forest',
111
+ enemies: [
112
+ { health: 50, type: 'wolf' },
113
+ { health: 100, type: 'bear' }
114
+ ]
115
+ }
116
+ ],
117
+ tags: ['adventure', 'rpg'],
118
+ count: 42
119
+ });
120
+ });
121
+ describe('Proxy Behavior', () => {
122
+ it('should create proxy at root level', () => {
123
+ const proxy = createStatePathProxy(storage);
124
+ expect(proxy.path).toBe('');
125
+ });
126
+ it('should intercept property access and build path', () => {
127
+ const proxy = createStatePathProxy(storage);
128
+ const userProxy = proxy.user;
129
+ expect(userProxy.path).toBe('user');
130
+ });
131
+ it('should build nested paths through chained property access', () => {
132
+ const proxy = createStatePathProxy(storage);
133
+ expect(proxy.user.profile.name.path).toBe('user.profile.name');
134
+ });
135
+ it('should expose StatePath methods through proxy', () => {
136
+ const proxy = createStatePathProxy(storage);
137
+ // Verify methods exist
138
+ expect(typeof proxy.get).toBe('function');
139
+ expect(typeof proxy.set).toBe('function');
140
+ expect(typeof proxy.replace).toBe('function');
141
+ expect(typeof proxy.remove).toBe('function');
142
+ expect(typeof proxy.push).toBe('function');
143
+ expect(typeof proxy.splice).toBe('function');
144
+ expect(typeof proxy.at).toBe('function');
145
+ expect(typeof proxy.prop).toBe('function');
146
+ });
147
+ it('should handle symbol properties correctly', () => {
148
+ const proxy = createStatePathProxy(storage);
149
+ // Symbols should be passed through to the underlying StatePath
150
+ // This primarily tests that we don't crash on symbol access
151
+ const symbol = Symbol('test');
152
+ expect(() => proxy[symbol]).not.toThrow();
153
+ });
154
+ });
155
+ describe('Terminal Operations Through Proxy', () => {
156
+ describe('get()', () => {
157
+ it('should get primitive value', () => {
158
+ const proxy = createStatePathProxy(storage);
159
+ expect(proxy.user.profile.name.get()).toBe('Alice');
160
+ });
161
+ it('should get object value', () => {
162
+ const proxy = createStatePathProxy(storage);
163
+ expect(proxy.user.profile.get()).toEqual({ name: 'Alice', age: 28 });
164
+ });
165
+ it('should get array', () => {
166
+ const proxy = createStatePathProxy(storage);
167
+ expect(proxy.tags.get()).toEqual(['adventure', 'rpg']);
168
+ });
169
+ it('should get number value', () => {
170
+ const proxy = createStatePathProxy(storage);
171
+ expect(proxy.count.get()).toBe(42);
172
+ });
173
+ });
174
+ describe('set()', () => {
175
+ it('should set primitive value through proxy', () => {
176
+ const proxy = createStatePathProxy(storage);
177
+ proxy.user.profile.name.set('Bob');
178
+ expect(storage.operations).toContainEqual({
179
+ method: 'change',
180
+ path: 'user.profile.name',
181
+ args: ['Bob']
182
+ });
183
+ });
184
+ it('should set object value through proxy', () => {
185
+ const proxy = createStatePathProxy(storage);
186
+ proxy.user.settings.set({ theme: 'light' });
187
+ expect(storage.operations).toContainEqual({
188
+ method: 'change',
189
+ path: 'user.settings',
190
+ args: [{ theme: 'light' }]
191
+ });
192
+ });
193
+ });
194
+ describe('replace()', () => {
195
+ it('should replace value through proxy', () => {
196
+ const proxy = createStatePathProxy(storage);
197
+ proxy.user.profile.replace({ name: 'Charlie', age: 35 });
198
+ expect(storage.operations).toContainEqual({
199
+ method: 'substitute',
200
+ path: 'user.profile',
201
+ args: [{ name: 'Charlie', age: 35 }]
202
+ });
203
+ });
204
+ });
205
+ describe('remove()', () => {
206
+ it('should remove value through proxy', () => {
207
+ const proxy = createStatePathProxy(storage);
208
+ const removed = proxy.user.profile.age.remove();
209
+ expect(storage.operations).toContainEqual({
210
+ method: 'delete',
211
+ path: 'user.profile.age'
212
+ });
213
+ expect(removed).toBe(28);
214
+ });
215
+ });
216
+ });
217
+ describe('Array Operations Through Proxy', () => {
218
+ describe('at()', () => {
219
+ it('should access array element via at()', () => {
220
+ const proxy = createStatePathProxy(storage);
221
+ const item = proxy.items.at(0);
222
+ expect(item.path).toBe('items.0');
223
+ });
224
+ it('should access array element property via at()', () => {
225
+ const proxy = createStatePathProxy(storage);
226
+ expect(proxy.items.at(0).name.path).toBe('items.0.name');
227
+ expect(proxy.items.at(0).name.get()).toBe('Sword');
228
+ });
229
+ it('should access nested array via at()', () => {
230
+ const proxy = createStatePathProxy(storage);
231
+ expect(proxy.levels.at(0).enemies.at(1).health.path).toBe('levels.0.enemies.1.health');
232
+ expect(proxy.levels.at(0).enemies.at(1).health.get()).toBe(100);
233
+ });
234
+ it('should set value on array element via at()', () => {
235
+ const proxy = createStatePathProxy(storage);
236
+ proxy.items.at(0).active.set(false);
237
+ expect(storage.operations).toContainEqual({
238
+ method: 'change',
239
+ path: 'items.0.active',
240
+ args: [false]
241
+ });
242
+ });
243
+ it('should replace array element via at()', () => {
244
+ const proxy = createStatePathProxy(storage);
245
+ proxy.items.at(1).replace({ id: 99, name: 'Axe', active: true });
246
+ expect(storage.operations).toContainEqual({
247
+ method: 'substitute',
248
+ path: 'items.1',
249
+ args: [{ id: 99, name: 'Axe', active: true }]
250
+ });
251
+ });
252
+ });
253
+ describe('push()', () => {
254
+ it('should push to array through proxy', () => {
255
+ const proxy = createStatePathProxy(storage);
256
+ proxy.items.push({ id: 3, name: 'Bow', active: true });
257
+ expect(storage.operations).toContainEqual({
258
+ method: 'push',
259
+ path: 'items',
260
+ args: [{ id: 3, name: 'Bow', active: true }]
261
+ });
262
+ });
263
+ it('should push to nested array through proxy', () => {
264
+ const proxy = createStatePathProxy(storage);
265
+ proxy.levels.at(0).enemies.push({ health: 75, type: 'snake' });
266
+ expect(storage.operations).toContainEqual({
267
+ method: 'push',
268
+ path: 'levels.0.enemies',
269
+ args: [{ health: 75, type: 'snake' }]
270
+ });
271
+ });
272
+ it('should push to string array', () => {
273
+ const proxy = createStatePathProxy(storage);
274
+ proxy.tags.push('multiplayer');
275
+ expect(storage.operations).toContainEqual({
276
+ method: 'push',
277
+ path: 'tags',
278
+ args: ['multiplayer']
279
+ });
280
+ });
281
+ });
282
+ describe('splice()', () => {
283
+ it('should splice array through proxy', () => {
284
+ const proxy = createStatePathProxy(storage);
285
+ const removed = proxy.items.splice(0, 1);
286
+ expect(storage.operations).toContainEqual({
287
+ method: 'splice',
288
+ path: 'items',
289
+ args: [0, 1]
290
+ });
291
+ expect(removed).toEqual([{ id: 1, name: 'Sword', active: true }]);
292
+ });
293
+ it('should splice nested array through proxy', () => {
294
+ const proxy = createStatePathProxy(storage);
295
+ const removed = proxy.levels.at(0).enemies.splice(1, 1);
296
+ expect(storage.operations).toContainEqual({
297
+ method: 'splice',
298
+ path: 'levels.0.enemies',
299
+ args: [1, 1]
300
+ });
301
+ expect(removed).toEqual([{ health: 100, type: 'bear' }]);
302
+ });
303
+ });
304
+ });
305
+ describe('Integration with StatePath', () => {
306
+ it('should work identically to StatePath for simple paths', () => {
307
+ const proxy = createStatePathProxy(storage);
308
+ const statePath = new StatePath(storage)
309
+ .prop('user')
310
+ .prop('profile')
311
+ .prop('name');
312
+ expect(proxy.user.profile.name.path).toBe(statePath.path);
313
+ expect(proxy.user.profile.name.get()).toBe(statePath.get());
314
+ });
315
+ it('should work identically to StatePath for array paths', () => {
316
+ const proxy = createStatePathProxy(storage);
317
+ const statePath = new StatePath(storage)
318
+ .prop('items')
319
+ .at(0)
320
+ .prop('name');
321
+ expect(proxy.items.at(0).name.path).toBe(statePath.path);
322
+ expect(proxy.items.at(0).name.get()).toBe(statePath.get());
323
+ });
324
+ it('should allow mixing proxy access with prop() method', () => {
325
+ const proxy = createStatePathProxy(storage);
326
+ // Can use both proxy syntax and prop() method
327
+ expect(proxy.user.prop('profile').name.path).toBe('user.profile.name');
328
+ expect(proxy.prop('user').profile.prop('name').path).toBe('user.profile.name');
329
+ });
330
+ });
331
+ describe('Edge Cases', () => {
332
+ it('should handle accessing properties that match StatePath method names', () => {
333
+ const methodStorage = new MockStateStorage({
334
+ get: 'getValue',
335
+ set: 123,
336
+ path: true
337
+ });
338
+ const proxy = createStatePathProxy(methodStorage);
339
+ // Methods should take precedence over properties
340
+ expect(typeof proxy.get).toBe('function');
341
+ expect(typeof proxy.set).toBe('function');
342
+ // 'path' is a getter on StatePath, should return the path string
343
+ expect(proxy.path).toBe('');
344
+ });
345
+ it('should handle undefined values gracefully', () => {
346
+ const proxy = createStatePathProxy(storage);
347
+ expect(proxy.user.profile.name.get()).toBe('Alice');
348
+ // Accessing non-existent path should return undefined when calling get()
349
+ const nonExistent = proxy.nonexistent.deep.nested;
350
+ expect(nonExistent.get()).toBeUndefined();
351
+ expect(nonExistent.path).toBe('nonexistent.deep.nested');
352
+ });
353
+ it('should handle multiple independent proxy chains', () => {
354
+ const proxy = createStatePathProxy(storage);
355
+ const chain1 = proxy.user.profile.name;
356
+ const chain2 = proxy.user.settings.theme;
357
+ const chain3 = proxy.items.at(0).name;
358
+ expect(chain1.path).toBe('user.profile.name');
359
+ expect(chain2.path).toBe('user.settings.theme');
360
+ expect(chain3.path).toBe('items.0.name');
361
+ // All chains should work independently
362
+ expect(chain1.get()).toBe('Alice');
363
+ expect(chain2.get()).toBe('dark');
364
+ expect(chain3.get()).toBe('Sword');
365
+ });
366
+ it('should handle repeated access without side effects', () => {
367
+ const proxy = createStatePathProxy(storage);
368
+ // Access same path multiple times
369
+ const path1 = proxy.user.profile.name.path;
370
+ const path2 = proxy.user.profile.name.path;
371
+ const path3 = proxy.user.profile.name.path;
372
+ expect(path1).toBe(path2);
373
+ expect(path2).toBe(path3);
374
+ });
375
+ });
376
+ describe('Complex Scenarios', () => {
377
+ it('should handle modifying deeply nested array elements', () => {
378
+ const proxy = createStatePathProxy(storage);
379
+ // Modify enemy health in nested structure
380
+ proxy.levels.at(0).enemies.at(0).health.set(25);
381
+ expect(storage.operations).toContainEqual({
382
+ method: 'change',
383
+ path: 'levels.0.enemies.0.health',
384
+ args: [25]
385
+ });
386
+ });
387
+ it('should handle multiple operations in sequence', () => {
388
+ const proxy = createStatePathProxy(storage);
389
+ // Perform multiple operations
390
+ proxy.user.profile.name.set('Updated');
391
+ proxy.items.push({ id: 10, name: 'New Item', active: true });
392
+ proxy.levels.at(0).enemies.splice(0, 1);
393
+ expect(storage.operations).toHaveLength(3);
394
+ expect(storage.operations[0].method).toBe('change');
395
+ expect(storage.operations[1].method).toBe('push');
396
+ expect(storage.operations[2].method).toBe('splice');
397
+ });
398
+ it('should work with prop() after at()', () => {
399
+ const proxy = createStatePathProxy(storage);
400
+ const enemyType = proxy.levels.at(0).enemies.at(1).prop('type');
401
+ expect(enemyType.path).toBe('levels.0.enemies.1.type');
402
+ expect(enemyType.get()).toBe('bear');
403
+ });
404
+ });
405
+ });
406
+ //# sourceMappingURL=StatePathProxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatePathProxy.test.js","sourceRoot":"","sources":["../../../src/state/data/StatePathProxy.test.ts"],"names":[],"mappings":"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"}