@esportsplus/reactivity 0.31.1 → 0.31.2

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.
@@ -28,8 +28,9 @@ class ReactiveArray extends Array {
28
28
  if (prev === value) {
29
29
  return;
30
30
  }
31
+ let length = this.length;
31
32
  this[i] = value;
32
- if (i >= this.length) {
33
+ if (i >= length) {
33
34
  write(this._length, i + 1);
34
35
  }
35
36
  this.dispatch('set', { index: i, item: value });
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "author": "ICJR",
3
3
  "dependencies": {
4
- "@esportsplus/utilities": "^0.27.2"
4
+ "@esportsplus/utilities": "^0.27.3"
5
5
  },
6
6
  "devDependencies": {
7
- "@esportsplus/typescript": "^0.29.0",
8
- "@types/node": "^25.0.9",
9
- "vite": "^7.3.1",
10
- "vitest": "^4.0.18"
7
+ "@esportsplus/typescript": "^0.29.1",
8
+ "@types/node": "^25.6.0",
9
+ "vite": "^8.0.8",
10
+ "vitest": "^4.1.4"
11
11
  },
12
12
  "exports": {
13
13
  ".": {
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "type": "module",
38
38
  "types": "build/index.d.ts",
39
- "version": "0.31.1",
39
+ "version": "0.31.2",
40
40
  "scripts": {
41
41
  "build": "tsc",
42
42
  "build:test": "pnpm build && vite build --config test/vite.config.ts",
@@ -84,9 +84,11 @@ class ReactiveArray<T> extends Array<T> {
84
84
  return;
85
85
  }
86
86
 
87
+ let length = this.length;
88
+
87
89
  this[i] = value;
88
90
 
89
- if (i >= this.length) {
91
+ if (i >= length) {
90
92
  write(this._length, i + 1);
91
93
  }
92
94
 
package/tests/array.ts CHANGED
@@ -91,14 +91,12 @@ describe('ReactiveArray', () => {
91
91
  arr.$set(5, 99);
92
92
  await Promise.resolve();
93
93
 
94
- // Native .length is 6, but reactive _length check runs after
95
- // this[i] = value so i >= this.length is false — _length not updated
96
94
  expect(arr.length).toBe(6);
97
95
  expect(arr[5]).toBe(99);
98
- expect(lengths).toEqual([3]);
96
+ expect(lengths).toEqual([3, 6]);
99
97
  });
100
98
 
101
- it('$set creates sparse array without updating reactive $length', async () => {
99
+ it('$set creates sparse array and updates reactive $length', async () => {
102
100
  let arr = new ReactiveArray<number>(),
103
101
  lengths: number[] = [];
104
102
 
@@ -117,15 +115,41 @@ describe('ReactiveArray', () => {
117
115
  // Native length becomes 101 via Array behavior
118
116
  expect(arr.length).toBe(101);
119
117
 
120
- // Reactive $length NOT updated: this[100] = value sets native .length
121
- // to 101 before the check, so 100 >= 101 is false
122
- expect(lengths).toEqual([0]);
118
+ // Reactive $length updated correctly
119
+ expect(lengths).toEqual([0, 101]);
123
120
 
124
121
  // Intermediate indices are empty (sparse)
125
122
  expect(arr[0]).toBe(undefined);
126
123
  expect(arr[50]).toBe(undefined);
127
124
  expect(arr[99]).toBe(undefined);
128
125
  });
126
+
127
+ it('$set with negative index does not affect length', () => {
128
+ let arr = new ReactiveArray(1, 2, 3);
129
+
130
+ arr.$set(-1 as any, 42);
131
+
132
+ expect(arr.length).toBe(3);
133
+ expect(arr.$length).toBe(3);
134
+ expect((arr as any)[-1]).toBe(42);
135
+ });
136
+
137
+ it('$set at large index updates $length', async () => {
138
+ let arr = new ReactiveArray(1, 2, 3),
139
+ lengths: number[] = [];
140
+
141
+ effect(() => {
142
+ lengths.push(arr.$length);
143
+ });
144
+
145
+ expect(lengths).toEqual([3]);
146
+
147
+ arr.$set(10000, 99);
148
+ await Promise.resolve();
149
+
150
+ expect(arr.length).toBe(10001);
151
+ expect(lengths).toEqual([3, 10001]);
152
+ });
129
153
  });
130
154
 
131
155
 
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "extends": "../tsconfig.json",
3
3
  "compilerOptions": {
4
- "baseUrl": "..",
5
4
  "noEmit": true,
6
5
  "paths": {
7
6
  "~/*": [
8
- "src/*"
7
+ "../src/*"
9
8
  ]
10
9
  },
11
10
  "rootDir": ".."