-
Notifications
You must be signed in to change notification settings - Fork 0
/
patchObservableCollections.ts
74 lines (60 loc) · 1.68 KB
/
patchObservableCollections.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import Collection from "../../Collection"
import IdCollection from "../../IdCollection"
import { ObservableCollection, ObservableIdCollection } from './ObservableCollections'
type CollKeysType = keyof Collection<any>
type IdCollKeysType = keyof IdCollection<any>
// type ObservableFnType = <T>( arg: T ) => T
// type ActionFnType = <T>( arg: T ) => T
// type DecorateFnType = ( ...args: any[] ) => void
type MobX = any
const COLL_ACTIONS: CollKeysType[] = [
// @ts-ignore
'_init',
'set',
'clear',
'reset',
'push',
'pushUniq',
'pushUniqBy',
'remove',
'removeBy',
'swap',
]
const ID_COLL_ACTIONS: IdCollKeysType[] = [
'removeById',
'pushUniqById',
]
function _defineLengthGetter( proto: any ) {
Object.defineProperty( proto, 'length', {
get: function () {
return this._list.length
},
configurable: true,
} )
}
function patchObservableCollections( mobx: MobX ) {
const { decorate, action, observable, computed } = mobx
COLL_ACTIONS.forEach( k => {
// @ts-ignore
ObservableCollection.prototype[ k ] = action( ObservableCollection.prototype[ k ] )
// @ts-ignore
ObservableIdCollection.prototype[ k ] = action( ObservableIdCollection.prototype[ k ] )
} )
ID_COLL_ACTIONS.forEach( k => {
// @ts-ignore
ObservableIdCollection.prototype[ k ] = action( ObservableIdCollection.prototype[ k ] )
} )
_defineLengthGetter( ObservableCollection.prototype )
_defineLengthGetter( ObservableIdCollection.prototype )
decorate( ObservableCollection, {
_list: observable,
length: computed,
} )
decorate( ObservableIdCollection, {
_list: observable,
length: computed,
} )
}
export {
patchObservableCollections,
}