@flashist/appframework 0.0.349 → 0.0.351

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/package.json CHANGED
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "name": "@flashist/appframework",
3
- "version": "0.0.349",
3
+ "version": "0.0.351",
4
4
  "scripts": {
5
5
  "build": "gulp",
6
+ "test": "vitest run",
7
+ "test:watch": "vitest",
6
8
  "publish:patch": "npm version patch && npm run build && cd ./dist && npm publish",
7
9
  "publish:minor": "npm version minor && npm run build && cd ./dist && npm publish",
8
10
  "publish:major": "npm version major && npm run build && cd ./dist && npm publish"
@@ -22,6 +24,7 @@
22
24
  "@flashist/fbuildscripts": "^0.0.67",
23
25
  "gsap": "^3.12.7",
24
26
  "pixi.js": "^8.8.1",
25
- "typescript": "^5.8.2"
27
+ "typescript": "^5.8.2",
28
+ "vitest": "^4.0.18"
26
29
  }
27
30
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,470 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { StatePath } from './StatePath';
3
+ /**
4
+ * Mock storage that tracks all operations for verification
5
+ */
6
+ class MockStateStorage {
7
+ constructor(initialState = {}) {
8
+ this.state = {};
9
+ this.operations = [];
10
+ this.state = initialState;
11
+ }
12
+ getNestedValue(path) {
13
+ if (!path)
14
+ return this.state;
15
+ const parts = path.split('.');
16
+ let current = this.state;
17
+ for (const part of parts) {
18
+ if (current === undefined || current === null)
19
+ return undefined;
20
+ current = current[part];
21
+ }
22
+ return current;
23
+ }
24
+ setNestedValue(path, value) {
25
+ if (!path) {
26
+ this.state = value;
27
+ return;
28
+ }
29
+ const parts = path.split('.');
30
+ let current = this.state;
31
+ for (let i = 0; i < parts.length - 1; i++) {
32
+ const part = parts[i];
33
+ if (current[part] === undefined) {
34
+ current[part] = {};
35
+ }
36
+ current = current[part];
37
+ }
38
+ current[parts[parts.length - 1]] = value;
39
+ }
40
+ getValueByPath(path) {
41
+ this.operations.push({ method: 'get', path });
42
+ return this.getNestedValue(path);
43
+ }
44
+ changeByPath(path, value) {
45
+ this.operations.push({ method: 'change', path, args: [value] });
46
+ const existing = this.getNestedValue(path);
47
+ if (typeof existing === 'object' && typeof value === 'object' && existing !== null && value !== null) {
48
+ this.setNestedValue(path, Object.assign(Object.assign({}, existing), value));
49
+ }
50
+ else {
51
+ this.setNestedValue(path, value);
52
+ }
53
+ }
54
+ substituteByPath(path, value) {
55
+ this.operations.push({ method: 'substitute', path, args: [value] });
56
+ this.setNestedValue(path, value);
57
+ }
58
+ deleteByPath(path) {
59
+ this.operations.push({ method: 'delete', path });
60
+ const value = this.getNestedValue(path);
61
+ const parts = path.split('.');
62
+ const key = parts.pop();
63
+ const parent = parts.length ? this.getNestedValue(parts.join('.')) : this.state;
64
+ if (parent && typeof parent === 'object') {
65
+ delete parent[key];
66
+ }
67
+ return value;
68
+ }
69
+ pushByPath(path, ...elements) {
70
+ this.operations.push({ method: 'push', path, args: elements });
71
+ const arr = this.getNestedValue(path);
72
+ if (Array.isArray(arr)) {
73
+ arr.push(...elements);
74
+ }
75
+ }
76
+ spliceByPath(path, start, deleteCount) {
77
+ this.operations.push({ method: 'splice', path, args: [start, deleteCount] });
78
+ const arr = this.getNestedValue(path);
79
+ if (Array.isArray(arr)) {
80
+ return deleteCount !== undefined
81
+ ? arr.splice(start, deleteCount)
82
+ : arr.splice(start);
83
+ }
84
+ return [];
85
+ }
86
+ reset() {
87
+ this.operations = [];
88
+ }
89
+ }
90
+ describe('StatePath', () => {
91
+ let storage;
92
+ beforeEach(() => {
93
+ storage = new MockStateStorage({
94
+ user: {
95
+ profile: {
96
+ name: 'John',
97
+ age: 30
98
+ }
99
+ },
100
+ items: [
101
+ { id: 1, name: 'Item 1' },
102
+ { id: 2, name: 'Item 2' },
103
+ { id: 3, name: 'Item 3' }
104
+ ],
105
+ levels: [
106
+ {
107
+ name: 'Level 1',
108
+ enemies: [
109
+ { health: 100, type: 'goblin' },
110
+ { health: 200, type: 'orc' }
111
+ ]
112
+ }
113
+ ],
114
+ tags: ['tag1', 'tag2', 'tag3'],
115
+ matrix: [[1, 2], [3, 4], [5, 6]]
116
+ });
117
+ });
118
+ describe('Path Building', () => {
119
+ it('should build empty path at root', () => {
120
+ const path = new StatePath(storage);
121
+ expect(path.path).toBe('');
122
+ });
123
+ it('should build path with single property', () => {
124
+ const path = new StatePath(storage)
125
+ .prop('user');
126
+ expect(path.path).toBe('user');
127
+ });
128
+ it('should build path with nested properties', () => {
129
+ const path = new StatePath(storage)
130
+ .prop('user')
131
+ .prop('profile')
132
+ .prop('name');
133
+ expect(path.path).toBe('user.profile.name');
134
+ });
135
+ it('should build path with array index using at()', () => {
136
+ const path = new StatePath(storage)
137
+ .prop('items')
138
+ .at(0);
139
+ expect(path.path).toBe('items.0');
140
+ });
141
+ it('should build path with chained at() calls', () => {
142
+ const path = new StatePath(storage)
143
+ .prop('matrix')
144
+ .at(1)
145
+ .at(0);
146
+ expect(path.path).toBe('matrix.1.0');
147
+ });
148
+ it('should build path with mixed property and array access', () => {
149
+ const path = new StatePath(storage)
150
+ .prop('levels')
151
+ .at(0)
152
+ .prop('enemies')
153
+ .at(1)
154
+ .prop('health');
155
+ expect(path.path).toBe('levels.0.enemies.1.health');
156
+ });
157
+ it('should build path with property after at()', () => {
158
+ const path = new StatePath(storage)
159
+ .prop('items')
160
+ .at(0)
161
+ .prop('name');
162
+ expect(path.path).toBe('items.0.name');
163
+ });
164
+ });
165
+ describe('Terminal Operations', () => {
166
+ describe('get()', () => {
167
+ it('should get value at simple path', () => {
168
+ const path = new StatePath(storage)
169
+ .prop('user')
170
+ .prop('profile')
171
+ .prop('name');
172
+ expect(path.get()).toBe('John');
173
+ });
174
+ it('should get value at array index', () => {
175
+ const path = new StatePath(storage)
176
+ .prop('items')
177
+ .at(0)
178
+ .prop('name');
179
+ expect(path.get()).toBe('Item 1');
180
+ });
181
+ it('should get nested array element', () => {
182
+ const path = new StatePath(storage)
183
+ .prop('levels')
184
+ .at(0)
185
+ .prop('enemies')
186
+ .at(1)
187
+ .prop('health');
188
+ expect(path.get()).toBe(200);
189
+ });
190
+ it('should get entire array', () => {
191
+ const path = new StatePath(storage)
192
+ .prop('tags');
193
+ expect(path.get()).toEqual(['tag1', 'tag2', 'tag3']);
194
+ });
195
+ it('should get matrix element', () => {
196
+ const path = new StatePath(storage)
197
+ .prop('matrix')
198
+ .at(2)
199
+ .at(1);
200
+ expect(path.get()).toBe(6);
201
+ });
202
+ it('should return undefined for non-existent path', () => {
203
+ const path = new StatePath(storage, ['nonexistent', 'path']);
204
+ expect(path.get()).toBeUndefined();
205
+ });
206
+ });
207
+ describe('set()', () => {
208
+ it('should set value at simple path', () => {
209
+ const path = new StatePath(storage)
210
+ .prop('user')
211
+ .prop('profile')
212
+ .prop('name');
213
+ path.set('Jane');
214
+ expect(storage.operations).toContainEqual({
215
+ method: 'change',
216
+ path: 'user.profile.name',
217
+ args: ['Jane']
218
+ });
219
+ expect(storage.state.user.profile.name).toBe('Jane');
220
+ });
221
+ it('should set value at array index', () => {
222
+ const path = new StatePath(storage)
223
+ .prop('items')
224
+ .at(1)
225
+ .prop('name');
226
+ path.set('Updated Item');
227
+ expect(storage.operations).toContainEqual({
228
+ method: 'change',
229
+ path: 'items.1.name',
230
+ args: ['Updated Item']
231
+ });
232
+ expect(storage.state.items[1].name).toBe('Updated Item');
233
+ });
234
+ it('should set nested array element property', () => {
235
+ const path = new StatePath(storage)
236
+ .prop('levels')
237
+ .at(0)
238
+ .prop('enemies')
239
+ .at(0)
240
+ .prop('health');
241
+ path.set(50);
242
+ expect(storage.operations).toContainEqual({
243
+ method: 'change',
244
+ path: 'levels.0.enemies.0.health',
245
+ args: [50]
246
+ });
247
+ expect(storage.state.levels[0].enemies[0].health).toBe(50);
248
+ });
249
+ });
250
+ describe('replace()', () => {
251
+ it('should replace value at path', () => {
252
+ const path = new StatePath(storage)
253
+ .prop('user')
254
+ .prop('profile');
255
+ path.replace({ name: 'New', age: 25 });
256
+ expect(storage.operations).toContainEqual({
257
+ method: 'substitute',
258
+ path: 'user.profile',
259
+ args: [{ name: 'New', age: 25 }]
260
+ });
261
+ });
262
+ it('should replace entire array element', () => {
263
+ const path = new StatePath(storage)
264
+ .prop('items')
265
+ .at(0);
266
+ path.replace({ id: 99, name: 'Replaced' });
267
+ expect(storage.operations).toContainEqual({
268
+ method: 'substitute',
269
+ path: 'items.0',
270
+ args: [{ id: 99, name: 'Replaced' }]
271
+ });
272
+ });
273
+ });
274
+ describe('remove()', () => {
275
+ it('should remove value at path', () => {
276
+ const path = new StatePath(storage)
277
+ .prop('user')
278
+ .prop('profile')
279
+ .prop('age');
280
+ const removed = path.remove();
281
+ expect(storage.operations).toContainEqual({
282
+ method: 'delete',
283
+ path: 'user.profile.age'
284
+ });
285
+ expect(removed).toBe(30);
286
+ expect(storage.state.user.profile.age).toBeUndefined();
287
+ });
288
+ it('should remove array element', () => {
289
+ const path = new StatePath(storage)
290
+ .prop('items')
291
+ .at(1);
292
+ const removed = path.remove();
293
+ expect(storage.operations).toContainEqual({
294
+ method: 'delete',
295
+ path: 'items.1'
296
+ });
297
+ expect(removed).toEqual({ id: 2, name: 'Item 2' });
298
+ });
299
+ });
300
+ });
301
+ describe('Array Operations', () => {
302
+ describe('push()', () => {
303
+ it('should push single element to array', () => {
304
+ const path = new StatePath(storage)
305
+ .prop('items');
306
+ path.push({ id: 4, name: 'Item 4' });
307
+ expect(storage.operations).toContainEqual({
308
+ method: 'push',
309
+ path: 'items',
310
+ args: [{ id: 4, name: 'Item 4' }]
311
+ });
312
+ expect(storage.state.items).toHaveLength(4);
313
+ expect(storage.state.items[3]).toEqual({ id: 4, name: 'Item 4' });
314
+ });
315
+ it('should push multiple elements to array', () => {
316
+ const path = new StatePath(storage)
317
+ .prop('tags');
318
+ path.push('tag4', 'tag5');
319
+ expect(storage.operations).toContainEqual({
320
+ method: 'push',
321
+ path: 'tags',
322
+ args: ['tag4', 'tag5']
323
+ });
324
+ expect(storage.state.tags).toHaveLength(5);
325
+ });
326
+ it('should push to nested array via at()', () => {
327
+ const path = new StatePath(storage)
328
+ .prop('levels')
329
+ .at(0)
330
+ .prop('enemies');
331
+ path.push({ health: 150, type: 'troll' });
332
+ expect(storage.operations).toContainEqual({
333
+ method: 'push',
334
+ path: 'levels.0.enemies',
335
+ args: [{ health: 150, type: 'troll' }]
336
+ });
337
+ expect(storage.state.levels[0].enemies).toHaveLength(3);
338
+ });
339
+ it('should push to array of arrays', () => {
340
+ const path = new StatePath(storage)
341
+ .prop('matrix');
342
+ path.push([7, 8]);
343
+ expect(storage.operations).toContainEqual({
344
+ method: 'push',
345
+ path: 'matrix',
346
+ args: [[7, 8]]
347
+ });
348
+ expect(storage.state.matrix).toHaveLength(4);
349
+ });
350
+ });
351
+ describe('splice()', () => {
352
+ it('should splice elements from array', () => {
353
+ const path = new StatePath(storage)
354
+ .prop('items');
355
+ const removed = path.splice(1, 1);
356
+ expect(storage.operations).toContainEqual({
357
+ method: 'splice',
358
+ path: 'items',
359
+ args: [1, 1]
360
+ });
361
+ expect(removed).toEqual([{ id: 2, name: 'Item 2' }]);
362
+ expect(storage.state.items).toHaveLength(2);
363
+ });
364
+ it('should splice multiple elements', () => {
365
+ const path = new StatePath(storage)
366
+ .prop('tags');
367
+ const removed = path.splice(0, 2);
368
+ expect(removed).toEqual(['tag1', 'tag2']);
369
+ expect(storage.state.tags).toEqual(['tag3']);
370
+ });
371
+ it('should splice from nested array', () => {
372
+ const path = new StatePath(storage)
373
+ .prop('levels')
374
+ .at(0)
375
+ .prop('enemies');
376
+ const removed = path.splice(0, 1);
377
+ expect(storage.operations).toContainEqual({
378
+ method: 'splice',
379
+ path: 'levels.0.enemies',
380
+ args: [0, 1]
381
+ });
382
+ expect(removed).toEqual([{ health: 100, type: 'goblin' }]);
383
+ expect(storage.state.levels[0].enemies).toHaveLength(1);
384
+ });
385
+ it('should splice without deleteCount', () => {
386
+ const path = new StatePath(storage)
387
+ .prop('items');
388
+ const removed = path.splice(1);
389
+ expect(removed).toEqual([
390
+ { id: 2, name: 'Item 2' },
391
+ { id: 3, name: 'Item 3' }
392
+ ]);
393
+ expect(storage.state.items).toHaveLength(1);
394
+ });
395
+ });
396
+ });
397
+ describe('Edge Cases', () => {
398
+ it('should handle empty path (root access)', () => {
399
+ const path = new StatePath(storage);
400
+ const state = path.get();
401
+ expect(state).toBe(storage.state);
402
+ expect(storage.operations).toContainEqual({
403
+ method: 'get',
404
+ path: ''
405
+ });
406
+ });
407
+ it('should handle deep nesting (3+ levels)', () => {
408
+ const path = new StatePath(storage)
409
+ .prop('levels')
410
+ .at(0)
411
+ .prop('enemies')
412
+ .at(1)
413
+ .prop('type');
414
+ expect(path.path).toBe('levels.0.enemies.1.type');
415
+ expect(path.get()).toBe('orc');
416
+ });
417
+ it('should handle array at root level when state is array', () => {
418
+ const arrayStorage = new MockStateStorage(['a', 'b', 'c']);
419
+ const path = new StatePath(arrayStorage);
420
+ expect(path.get()).toEqual(['a', 'b', 'c']);
421
+ });
422
+ it('should handle array of arrays access', () => {
423
+ const path = new StatePath(storage)
424
+ .prop('matrix')
425
+ .at(0);
426
+ expect(path.get()).toEqual([1, 2]);
427
+ const deepPath = new StatePath(storage)
428
+ .prop('matrix')
429
+ .at(1)
430
+ .at(1);
431
+ expect(deepPath.get()).toBe(4);
432
+ });
433
+ it('should handle zero index correctly', () => {
434
+ const path = new StatePath(storage)
435
+ .prop('items')
436
+ .at(0);
437
+ expect(path.path).toBe('items.0');
438
+ expect(path.get()).toEqual({ id: 1, name: 'Item 1' });
439
+ });
440
+ it('should handle negative-like edge cases', () => {
441
+ // While TypeScript would prevent negative indices, test path building
442
+ const path = new StatePath(storage)
443
+ .prop('items')
444
+ .at(-1);
445
+ expect(path.path).toBe('items.-1');
446
+ });
447
+ });
448
+ describe('Immutability', () => {
449
+ it('should not mutate existing path when chaining', () => {
450
+ const basePath = new StatePath(storage)
451
+ .prop('user');
452
+ const profilePath = basePath.prop('profile');
453
+ const namePath = profilePath.prop('name');
454
+ expect(basePath.path).toBe('user');
455
+ expect(profilePath.path).toBe('user.profile');
456
+ expect(namePath.path).toBe('user.profile.name');
457
+ });
458
+ it('should create independent paths from same base', () => {
459
+ const basePath = new StatePath(storage)
460
+ .prop('user')
461
+ .prop('profile');
462
+ const namePath = basePath.prop('name');
463
+ const agePath = basePath.prop('age');
464
+ expect(namePath.path).toBe('user.profile.name');
465
+ expect(agePath.path).toBe('user.profile.age');
466
+ expect(basePath.path).toBe('user.profile');
467
+ });
468
+ });
469
+ });
470
+ //# sourceMappingURL=StatePath.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatePath.test.js","sourceRoot":"","sources":["../../../src/state/data/StatePath.test.ts"],"names":[],"mappings":"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"}
@@ -14,8 +14,19 @@ export function createStatePathProxy(storage, pathParts = []) {
14
14
  const statePath = new StatePath(storage, pathParts);
15
15
  return new Proxy(statePath, {
16
16
  get(target, prop) {
17
- // Return StatePath methods and properties directly
18
- if (prop in target || typeof prop === "symbol") {
17
+ // Handle symbol properties
18
+ if (typeof prop === "symbol") {
19
+ return target[prop];
20
+ }
21
+ // Wrap at() and prop() methods to return proxies
22
+ if (prop === "at") {
23
+ return (index) => createStatePathProxy(storage, [...pathParts, String(index)]);
24
+ }
25
+ if (prop === "prop") {
26
+ return (key) => createStatePathProxy(storage, [...pathParts, String(key)]);
27
+ }
28
+ // Return other StatePath methods and properties directly
29
+ if (prop in target) {
19
30
  return target[prop];
20
31
  }
21
32
  // Property access - create new proxy for nested path
@@ -1 +1 @@
1
- {"version":3,"file":"StatePathProxy.js","sourceRoot":"","sources":["../../../src/state/data/StatePathProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAqB3D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAChC,OAA0B,EAC1B,YAAsB,EAAE;IAExB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAgB,OAAO,EAAE,SAAS,CAAC,CAAC;IAEnE,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE;QACxB,GAAG,CAAC,MAAgC,EAAE,IAAqB;YACvD,mDAAmD;YACnD,IAAI,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7C,OAAQ,MAAc,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,qDAAqD;YACrD,OAAO,oBAAoB,CACvB,OAAO,EACP,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAC/B,CAAC;QACN,CAAC;KACJ,CAAkC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"StatePathProxy.js","sourceRoot":"","sources":["../../../src/state/data/StatePathProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAqB3D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAChC,OAA0B,EAC1B,YAAsB,EAAE;IAExB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAgB,OAAO,EAAE,SAAS,CAAC,CAAC;IAEnE,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE;QACxB,GAAG,CAAC,MAAgC,EAAE,IAAqB;YACvD,2BAA2B;YAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAQ,MAAc,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,iDAAiD;YACjD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAa,EAAE,EAAE,CAAC,oBAAoB,CAC1C,OAAO,EACP,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAChC,CAAC;YACN,CAAC;YAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAoB,EAAE,EAAE,CAAC,oBAAoB,CACjD,OAAO,EACP,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAC9B,CAAC;YACN,CAAC;YAED,yDAAyD;YACzD,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;gBACjB,OAAQ,MAAc,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,qDAAqD;YACrD,OAAO,oBAAoB,CACvB,OAAO,EACP,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAC/B,CAAC;QACN,CAAC;KACJ,CAAkC,CAAC;AACxC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -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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"}