Skip to content

Commit f91d2e1

Browse files
authored
fix: Fix Typescript 5.6.x support by introducing esnext iterator helpers (#3927) (#3935)
* Update typescript version * Chore(map + set): Add support for esnext Iterator helpers * add changeset * Update lock file
1 parent 70762a0 commit f91d2e1

File tree

8 files changed

+96
-28
lines changed

8 files changed

+96
-28
lines changed

.changeset/neat-ants-relate.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"mobx": patch
3+
---
4+
5+
Update typescript version to 5.6.2 and added support for esnext iterator helpers

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
],
77
"resolutions": {
88
"jest": "^29.5.0",
9-
"typescript": "^5.5.2",
9+
"typescript": "^5.6.2",
1010
"recast": "^0.23.1"
1111
},
1212
"repository": {
@@ -69,7 +69,7 @@
6969
"tape": "^5.0.1",
7070
"ts-jest": "^29.0.5",
7171
"tsdx": "^0.14.1",
72-
"typescript": "^5.5.2"
72+
"typescript": "^5.6.2"
7373
},
7474
"husky": {
7575
"hooks": {

packages/mobx/__tests__/v5/base/map.js

+28
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,34 @@ test("maps.values, keys and maps.entries are iterables", () => {
915915
expect(Array.from(x.keys())).toEqual(["x", "y"])
916916
})
917917

918+
// Test support for [iterator-helpers](https://github.com/tc39/proposal-iterator-helpers)
919+
test("esnext iterator helpers support", () => {
920+
const map = mobx.observable(
921+
new Map([
922+
["x", [1, 2]],
923+
["y", [3, 4]]
924+
])
925+
)
926+
927+
expect(Array.from(map.keys().map(value => value))).toEqual(["x", "y"])
928+
expect(Array.from(map.values().map(value => value))).toEqual([
929+
[1, 2],
930+
[3, 4]
931+
])
932+
expect(Array.from(map.entries().map(([, value]) => value))).toEqual([
933+
[1, 2],
934+
[3, 4]
935+
])
936+
937+
expect(Array.from(map.entries().take(1))).toEqual([["x", [1, 2]]])
938+
expect(Array.from(map.entries().drop(1))).toEqual([["y", [3, 4]]])
939+
expect(Array.from(map.entries().filter(([key]) => key === "y"))).toEqual([["y", [3, 4]]])
940+
expect(Array.from(map.entries().find(([key]) => key === "y"))).toEqual(["y", [3, 4]])
941+
expect(map.entries().toArray()).toEqual(Array.from(map))
942+
943+
expect(map.entries().toString()).toEqual("[object MapIterator]")
944+
})
945+
918946
test("toStringTag", () => {
919947
const x = mobx.observable.map({ x: 1, y: 2 })
920948
expect(x[Symbol.toStringTag]).toBe("Map")

packages/mobx/__tests__/v5/base/set.js

+28
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,34 @@ test("set should support iterall / iterable ", () => {
201201
expect(leech(a.values())).toEqual([1, 2])
202202
})
203203

204+
// Test support for [iterator-helpers](https://github.com/tc39/proposal-iterator-helpers)
205+
test("esnext iterator helpers support", () => {
206+
const set = mobx.observable(
207+
new Set([
208+
[1, 2],
209+
[3, 4]
210+
])
211+
)
212+
213+
expect(Array.from(set.values().map(value => value))).toEqual([
214+
[1, 2],
215+
[3, 4]
216+
])
217+
218+
expect(Array.from(set.entries().map(([, value]) => value))).toEqual([
219+
[1, 2],
220+
[3, 4]
221+
])
222+
223+
expect(Array.from(set.values().take(1))).toEqual([[1, 2]])
224+
expect(Array.from(set.values().drop(1))).toEqual([[3, 4]])
225+
expect(Array.from(set.values().filter(value => value[0] === 3))).toEqual([[3, 4]])
226+
expect(Array.from(set.values().find(value => value[0] === 3))).toEqual([3, 4])
227+
expect(Array.from(set.values().flatMap(value => value))).toEqual([1, 2, 3, 4])
228+
229+
expect(set.entries().toString()).toEqual("[object SetIterator]")
230+
})
231+
204232
test("support for ES6 Set", () => {
205233
const x = new Set()
206234
x.add(1)

packages/mobx/src/types/observablemap.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
checkIfStateModificationsAreAllowed,
1010
createAtom,
1111
createInstanceofPredicate,
12+
makeIterable,
1213
deepEnhancer,
1314
getNextId,
1415
getPlainObjectKeys,
@@ -19,7 +20,6 @@ import {
1920
isPlainES6Map,
2021
isPlainObject,
2122
isSpyEnabled,
22-
makeIterable,
2323
notifyListeners,
2424
referenceEnhancer,
2525
registerInterceptor,
@@ -296,15 +296,15 @@ export class ObservableMap<K = any, V = any>
296296
return value
297297
}
298298

299-
keys(): IterableIterator<K> {
299+
keys(): MapIterator<K> {
300300
this.keysAtom_.reportObserved()
301301
return this.data_.keys()
302302
}
303303

304-
values(): IterableIterator<V> {
304+
values(): MapIterator<V> {
305305
const self = this
306306
const keys = this.keys()
307-
return makeIterable({
307+
return makeIterableForMap({
308308
next() {
309309
const { done, value } = keys.next()
310310
return {
@@ -315,10 +315,10 @@ export class ObservableMap<K = any, V = any>
315315
})
316316
}
317317

318-
entries(): IterableIterator<IMapEntry<K, V>> {
318+
entries(): MapIterator<IMapEntry<K, V>> {
319319
const self = this
320320
const keys = this.keys()
321-
return makeIterable({
321+
return makeIterableForMap({
322322
next() {
323323
const { done, value } = keys.next()
324324
return {
@@ -490,6 +490,11 @@ export var isObservableMap = createInstanceofPredicate("ObservableMap", Observab
490490
thing: any
491491
) => thing is ObservableMap<any, any>
492492

493+
function makeIterableForMap<T>(iterator: Iterator<T>): MapIterator<T> {
494+
iterator[Symbol.toStringTag] = "MapIterator"
495+
return makeIterable<T, BuiltinIteratorReturn>(iterator)
496+
}
497+
493498
function convertToMap(dataStructure: any): Map<any, any> {
494499
if (isES6Map(dataStructure) || isObservableMap(dataStructure)) {
495500
return dataStructure

packages/mobx/src/types/observableset.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ import {
1313
notifyListeners,
1414
spyReportEnd,
1515
createInstanceofPredicate,
16+
makeIterable,
1617
hasInterceptors,
1718
interceptChange,
1819
IInterceptable,
1920
IInterceptor,
2021
registerInterceptor,
2122
checkIfStateModificationsAreAllowed,
2223
untracked,
23-
makeIterable,
2424
transaction,
2525
isES6Set,
2626
IAtom,
@@ -214,33 +214,33 @@ export class ObservableSet<T = any> implements Set<T>, IInterceptable<ISetWillCh
214214
let nextIndex = 0
215215
const keys = Array.from(this.keys())
216216
const values = Array.from(this.values())
217-
return makeIterable<[T, T]>({
217+
return makeIterableForSet<[T, T]>({
218218
next() {
219219
const index = nextIndex
220220
nextIndex += 1
221221
return index < values.length
222222
? { value: [keys[index], values[index]], done: false }
223-
: { done: true }
223+
: { value: undefined, done: true }
224224
}
225-
} as any)
225+
})
226226
}
227227

228-
keys(): IterableIterator<T> {
228+
keys(): SetIterator<T> {
229229
return this.values()
230230
}
231231

232-
values(): IterableIterator<T> {
232+
values(): SetIterator<T> {
233233
this.atom_.reportObserved()
234234
const self = this
235235
let nextIndex = 0
236236
const observableValues = Array.from(this.data_.values())
237-
return makeIterable<T>({
237+
return makeIterableForSet({
238238
next() {
239239
return nextIndex < observableValues.length
240240
? { value: self.dehanceValue_(observableValues[nextIndex++]), done: false }
241-
: { done: true }
241+
: { value: undefined, done: true }
242242
}
243-
} as any)
243+
})
244244
}
245245

246246
intersection<U>(otherSet: ReadonlySetLike<U> | Set<U>): Set<T & U> {
@@ -343,3 +343,8 @@ export class ObservableSet<T = any> implements Set<T>, IInterceptable<ISetWillCh
343343
export var isObservableSet = createInstanceofPredicate("ObservableSet", ObservableSet) as (
344344
thing: any
345345
) => thing is ObservableSet<any>
346+
347+
function makeIterableForSet<T>(iterator: Iterator<T>): SetIterator<T> {
348+
iterator[Symbol.toStringTag] = "SetIterator"
349+
return makeIterable<T, BuiltinIteratorReturn>(iterator)
350+
}

packages/mobx/src/utils/iterable.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
export function makeIterable<T>(iterator: Iterator<T>): IterableIterator<T> {
2-
iterator[Symbol.iterator] = getSelf
3-
return iterator as any
4-
}
5-
6-
function getSelf() {
7-
return this
1+
export function makeIterable<T, TReturn = unknown>(
2+
iterator: Iterator<T>
3+
): IteratorObject<T, TReturn> {
4+
return Object.assign(Object.create(Iterator.prototype), iterator)
85
}

yarn.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -13579,10 +13579,10 @@ typedarray@^0.0.6:
1357913579
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
1358013580
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
1358113581

13582-
typescript@^3.7.3, typescript@^5.5.2:
13583-
version "5.5.2"
13584-
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507"
13585-
integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==
13582+
typescript@^3.7.3, typescript@^5.6.2:
13583+
version "5.6.2"
13584+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0"
13585+
integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==
1358613586

1358713587
uglify-js@^3.1.4:
1358813588
version "3.17.4"

0 commit comments

Comments
 (0)