informa 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +171 -184
  2. package/dist/EnumerableWeakSet.d.ts +10 -0
  3. package/dist/EnumerableWeakSet.d.ts.map +1 -0
  4. package/dist/EnumerableWeakSet.js +44 -0
  5. package/dist/EnumerableWeakSet.js.map +1 -0
  6. package/dist/high.d.ts +2 -3
  7. package/dist/high.d.ts.map +1 -1
  8. package/dist/high.js +1 -2
  9. package/dist/high.js.map +1 -1
  10. package/dist/internals.d.ts +3 -0
  11. package/dist/internals.d.ts.map +1 -1
  12. package/dist/internals.js +5 -2
  13. package/dist/internals.js.map +1 -1
  14. package/dist/low.d.ts +16 -0
  15. package/dist/low.d.ts.map +1 -1
  16. package/dist/low.js +150 -0
  17. package/dist/low.js.map +1 -1
  18. package/dist/quirks/array.d.ts +4 -3
  19. package/dist/quirks/array.d.ts.map +1 -1
  20. package/dist/quirks/array.js +163 -75
  21. package/dist/quirks/array.js.map +1 -1
  22. package/dist/quirks/basestatified.d.ts +24 -2
  23. package/dist/quirks/basestatified.d.ts.map +1 -1
  24. package/dist/quirks/basestatified.js +244 -83
  25. package/dist/quirks/basestatified.js.map +1 -1
  26. package/dist/quirks/basestatified.test.d.ts +9 -0
  27. package/dist/quirks/basestatified.test.d.ts.map +1 -0
  28. package/dist/quirks/basestatified.test.js +291 -0
  29. package/dist/quirks/basestatified.test.js.map +1 -0
  30. package/dist/quirks/map.d.ts.map +1 -1
  31. package/dist/quirks/map.js +1 -0
  32. package/dist/quirks/map.js.map +1 -1
  33. package/dist/quirks/set.d.ts.map +1 -1
  34. package/dist/quirks/set.js +1 -0
  35. package/dist/quirks/set.js.map +1 -1
  36. package/dist/test.js +2 -6
  37. package/dist/test.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/EnumerableWeakSet.ts +46 -0
  40. package/src/high.ts +2 -3
  41. package/src/internals.ts +5 -1
  42. package/src/low.ts +120 -1
  43. package/src/quirks/array.ts +168 -92
  44. package/src/quirks/basestatified.test.ts +375 -0
  45. package/src/quirks/basestatified.ts +294 -117
  46. package/src/quirks/map.ts +3 -1
  47. package/src/quirks/set.ts +3 -1
  48. package/src/test.ts +13 -15
@@ -1,16 +1,19 @@
1
- import { exitProxySymbol, getMetadataOf, setMetadataOf, statifySealKey, type Statify } from "../internals.js";
2
- import { StateMetadata, type ExitProxyValue, type StatifiableProp } from "../low.js";
3
- import { makeStatified } from "./basestatified.js";
1
+ import { exitProxySymbol, getGlobalStateMode, getMetadataOf, isStatifiedArrayKey, setMetadataOf, statifySealKey, type Statify } from "../internals.js";
2
+ import { StateMetadata, type ExitProxyValue, type StatifiableProp, type StatifiableObj } from "../low.js";
4
3
 
5
- const StatifiableOrgArray = makeStatified(Array);
4
+ const isMutatingSym = Symbol();
6
5
 
7
6
  export class StatifiedArray<T extends StatifiableProp>
8
- extends StatifiableOrgArray<T> implements Array<T>, Statify<T[]>
7
+ extends Array<T> implements Statify<T[]>
9
8
  {
9
+ [isMutatingSym]?: boolean;
10
10
  [statifySealKey]: true = true;
11
- declare [exitProxySymbol]: ExitProxyValue;
12
-
13
- #metadata: StateMetadata;
11
+ get [exitProxySymbol](): ExitProxyValue {
12
+ if (getGlobalStateMode() === "extract-proxy-path") {
13
+ return { path: [], stateRoot: this as Statify<StatifiableObj> };
14
+ }
15
+ throw new Error("exitProxySymbol is not available in normal mode");
16
+ }
14
17
 
15
18
  constructor(arrayLength: number);
16
19
  constructor(...items: T[]);
@@ -23,56 +26,97 @@ export class StatifiedArray<T extends StatifiableProp>
23
26
  super(arrayLengthOrFirstItem, ...rest);
24
27
  }
25
28
 
26
- this.#metadata = getMetadataOf(this);
29
+ const proxy = new Proxy(this, {
30
+ set(target, prop, newVal, recv) {
31
+ const had = Reflect.has(target, prop);
32
+ const result = Reflect.set(target, prop, newVal, recv);
33
+ if (!target[isMutatingSym] && result && typeof prop !== "symbol" && Number.isInteger(Number(prop))) {
34
+ const metadata = getMetadataOf(recv as Statify<T[]>);
35
+ if (had) {
36
+ metadata.emit("replaceElement", newVal, Number(prop));
37
+ } else {
38
+ metadata.emit("spliceInElement", newVal, Number(prop));
39
+ metadata.emit("lengthChanged");
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+ });
45
+
46
+ setMetadataOf(proxy as Statify<T[]>, new StateMetadata());
47
+ return proxy;
27
48
  }
28
49
 
29
50
  push(...items: T[]): number {
30
- const result = super.push(...items);
51
+ this[isMutatingSym] = true;
52
+ try {
53
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
54
+ const result = super.push(...items);
31
55
 
32
- for (let i = result - items.length; i < result; i += 1) {
33
- this.#metadata.emit("spliceInElement", this[i]!, i);
34
- }
56
+ for (let i = result - items.length; i < result; i += 1) {
57
+ metadata.emit("spliceInElement", this[i]!, i);
58
+ }
35
59
 
36
- if (items.length > 0) {
37
- this.#metadata.emit("lengthChanged");
38
- }
60
+ if (items.length > 0) {
61
+ metadata.emit("lengthChanged");
62
+ }
39
63
 
40
- return result;
64
+ return result;
65
+ } finally {
66
+ this[isMutatingSym] = false;
67
+ }
41
68
  }
42
69
  unshift(...items: T[]): number {
43
- const result = super.unshift(...items);
70
+ this[isMutatingSym] = true;
71
+ try {
72
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
73
+ const result = super.unshift(...items);
44
74
 
45
- for (let i = 0; i < items.length; i += 1) {
46
- this.#metadata.emit("spliceInElement", this[i]!, i);
47
- }
75
+ for (let i = 0; i < items.length; i += 1) {
76
+ metadata.emit("spliceInElement", this[i]!, i);
77
+ }
48
78
 
49
- if (items.length > 0) {
50
- this.#metadata.emit("lengthChanged");
51
- }
79
+ if (items.length > 0) {
80
+ metadata.emit("lengthChanged");
81
+ }
52
82
 
53
- return result;
83
+ return result;
84
+ } finally {
85
+ this[isMutatingSym] = false;
86
+ }
54
87
  }
55
88
 
56
89
  pop(): T | undefined {
57
- if (this.length > 0) {
58
- const result = super.pop();
59
-
60
- this.#metadata.emit("spliceOutElement", result, super.length);
61
- this.#metadata.emit("lengthChanged");
62
- return result;
90
+ this[isMutatingSym] = true;
91
+ try {
92
+ if (this.length > 0) {
93
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
94
+ const result = super.pop();
95
+
96
+ metadata.emit("spliceOutElement", result, super.length);
97
+ metadata.emit("lengthChanged");
98
+ return result;
99
+ }
100
+ return undefined;
101
+ } finally {
102
+ this[isMutatingSym] = false;
63
103
  }
64
-
65
- return undefined;
66
104
  }
67
105
  shift(): T | undefined {
68
- if (this.length > 0) {
69
- const result = super.shift();
70
-
71
- this.#metadata.emit("spliceOutElement", result, 0);
72
- this.#metadata.emit("lengthChanged");
73
- return result;
106
+ this[isMutatingSym] = true;
107
+ try {
108
+ if (this.length > 0) {
109
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
110
+ const result = super.shift();
111
+
112
+ metadata.emit("spliceOutElement", result, 0);
113
+ metadata.emit("lengthChanged");
114
+ return result;
115
+ }
116
+ return undefined;
117
+ } finally {
118
+ this[isMutatingSym] = false;
74
119
  }
75
- return undefined;
76
120
  }
77
121
 
78
122
  #normalizeSplice(start: number, deleteCount?: number, ...items: T[]): [number, number, T[]] {
@@ -99,29 +143,35 @@ export class StatifiedArray<T extends StatifiableProp>
99
143
  return [start, deleteCount, items];
100
144
  }
101
145
  splice(start: number, deleteCount?: number, ...items: T[]): T[] {
102
- const [startNormed, deleteCountNormed, itemsNormed] = arguments.length === 1
103
- ? this.#normalizeSplice(start)
104
- : this.#normalizeSplice(start, deleteCount, ...items);
146
+ this[isMutatingSym] = true;
147
+ try {
148
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
149
+ const [startNormed, deleteCountNormed, itemsNormed] = arguments.length === 1
150
+ ? this.#normalizeSplice(start)
151
+ : this.#normalizeSplice(start, deleteCount, ...items);
105
152
 
106
- const result = super.splice(startNormed, deleteCountNormed, ...itemsNormed);
153
+ const result = super.splice(startNormed, deleteCountNormed, ...itemsNormed);
107
154
 
108
- for (let i = startNormed + deleteCountNormed; i > startNormed + itemsNormed.length; i -= 1) {
109
- this.#metadata.emit("spliceOutElement", result[i - startNormed], i);
110
- }
155
+ for (let i = startNormed + deleteCountNormed; i > startNormed + itemsNormed.length; i -= 1) {
156
+ metadata.emit("spliceOutElement", result[i - startNormed], i);
157
+ }
111
158
 
112
- for (let i = startNormed; i < startNormed + Math.min(itemsNormed.length, deleteCountNormed); i += 1) {
113
- this.#metadata.emit("replaceElement", this[i], i);
114
- }
159
+ for (let i = startNormed; i < startNormed + Math.min(itemsNormed.length, deleteCountNormed); i += 1) {
160
+ metadata.emit("replaceElement", this[i], i);
161
+ }
115
162
 
116
- for (let i = startNormed + deleteCountNormed; i < startNormed + itemsNormed.length; i += 1) {
117
- this.#metadata.emit("spliceInElement", this[i], i);
118
- }
163
+ for (let i = startNormed + deleteCountNormed; i < startNormed + itemsNormed.length; i += 1) {
164
+ metadata.emit("spliceInElement", this[i], i);
165
+ }
119
166
 
120
- if (itemsNormed.length !== deleteCountNormed) {
121
- this.#metadata.emit("lengthChanged");
122
- }
167
+ if (itemsNormed.length !== deleteCountNormed) {
168
+ metadata.emit("lengthChanged");
169
+ }
123
170
 
124
- return result;
171
+ return result;
172
+ } finally {
173
+ this[isMutatingSym] = false;
174
+ }
125
175
  }
126
176
 
127
177
  #normalizeStartEnd(start?: number, end?: number): [number, number] {
@@ -156,56 +206,82 @@ export class StatifiedArray<T extends StatifiableProp>
156
206
  return [start, end];
157
207
  }
158
208
  fill(value: T, start?: number, end?: number): this {
159
- const [startNormed, endNormed] = arguments.length === 1
160
- ? this.#normalizeStartEnd()
161
- : arguments.length === 2
162
- ? this.#normalizeStartEnd(start)
163
- : this.#normalizeStartEnd(start, end);
164
-
165
- const result = super.fill(value, startNormed, endNormed);
209
+ this[isMutatingSym] = true;
210
+ try {
211
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
212
+ const [startNormed, endNormed] = arguments.length === 1
213
+ ? this.#normalizeStartEnd()
214
+ : arguments.length === 2
215
+ ? this.#normalizeStartEnd(start)
216
+ : this.#normalizeStartEnd(start, end);
217
+
218
+ const result = super.fill(value, startNormed, endNormed);
219
+
220
+ for (let i = startNormed; i < endNormed; i += 1) {
221
+ metadata.emit("replaceElement", this[i], i);
222
+ }
166
223
 
167
- for (let i = startNormed; i < endNormed; i += 1) {
168
- this.#metadata.emit("replaceElement", this[i], i);
224
+ return result;
225
+ } finally {
226
+ this[isMutatingSym] = false;
169
227
  }
170
-
171
- return result;
172
228
  }
173
229
  copyWithin(target: number, start: number, end?: number): this {
174
- const [startNormed, endNormed] = arguments.length === 2
175
- ? this.#normalizeStartEnd(start)
176
- : this.#normalizeStartEnd(start, end);
230
+ this[isMutatingSym] = true;
231
+ try {
232
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
233
+ const [startNormed, endNormed] = arguments.length === 2
234
+ ? this.#normalizeStartEnd(start)
235
+ : this.#normalizeStartEnd(start, end);
177
236
 
178
- const result = super.copyWithin(target, startNormed, endNormed);
237
+ const result = super.copyWithin(target, startNormed, endNormed);
179
238
 
180
- for (let i = target; i < target + endNormed - startNormed; i += 1) {
181
- this.#metadata.emit("replaceElement", this[i], i);
182
- }
239
+ for (let i = target; i < target + endNormed - startNormed; i += 1) {
240
+ metadata.emit("replaceElement", this[i], i);
241
+ }
183
242
 
184
- return result;
243
+ return result;
244
+ } finally {
245
+ this[isMutatingSym] = false;
246
+ }
185
247
  }
186
248
 
187
249
  reverse(): T[] {
188
- const result = super.reverse();
189
-
190
- const parity = this.length % 2;
191
- const half = (this.length / 2) | 0;
192
- for (let i = 0; i < this.length - parity; i += 1) {
193
- if (i > half) {
194
- this.#metadata.emit("replaceElement", this[i], i + parity);
195
- } else {
196
- this.#metadata.emit("replaceElement", this[i], i);
250
+ this[isMutatingSym] = true;
251
+ try {
252
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
253
+ const result = super.reverse();
254
+
255
+ const parity = this.length % 2;
256
+ const half = (this.length / 2) | 0;
257
+ for (let i = 0; i < this.length - parity; i += 1) {
258
+ if (i > half) {
259
+ metadata.emit("replaceElement", this[i], i + parity);
260
+ } else {
261
+ metadata.emit("replaceElement", this[i], i);
262
+ }
197
263
  }
198
- }
199
264
 
200
- return result;
265
+ return result;
266
+ } finally {
267
+ this[isMutatingSym] = false;
268
+ }
201
269
  }
202
270
  sort(compareFn?: ((a: T, b: T) => number) | undefined): this {
203
- const result = super.sort(compareFn);
271
+ this[isMutatingSym] = true;
272
+ try {
273
+ const metadata = getMetadataOf(this as unknown as Statify<T[]>);
274
+ const result = super.sort(compareFn);
204
275
 
205
- for (let i = 0; i < this.length; i += 1) {
206
- this.#metadata.emit("replaceElement", this[i], i);
207
- }
276
+ for (let i = 0; i < this.length; i += 1) {
277
+ metadata.emit("replaceElement", this[i], i);
278
+ }
208
279
 
209
- return result;
280
+ return result;
281
+ } finally {
282
+ this[isMutatingSym] = false;
283
+ }
210
284
  }
211
285
  }
286
+
287
+ (StatifiedArray.prototype as any)[isStatifiedArrayKey] = true;