UNPKG

1.36 kBPlain TextView Raw
1import {
2 ObservableObjectAdministration,
3 deepEnhancer,
4 die,
5 Annotation,
6 MakeResult
7} from "../internal"
8
9export function createObservableAnnotation(name: string, options?: object): Annotation {
10 return {
11 annotationType_: name,
12 options_: options,
13 make_,
14 extend_
15 }
16}
17
18function make_(
19 adm: ObservableObjectAdministration,
20 key: PropertyKey,
21 descriptor: PropertyDescriptor
22): MakeResult {
23 return this.extend_(adm, key, descriptor, false) === null ? MakeResult.Cancel : MakeResult.Break
24}
25
26function extend_(
27 adm: ObservableObjectAdministration,
28 key: PropertyKey,
29 descriptor: PropertyDescriptor,
30 proxyTrap: boolean
31): boolean | null {
32 assertObservableDescriptor(adm, this, key, descriptor)
33 return adm.defineObservableProperty_(
34 key,
35 descriptor.value,
36 this.options_?.enhancer ?? deepEnhancer,
37 proxyTrap
38 )
39}
40
41function assertObservableDescriptor(
42 adm: ObservableObjectAdministration,
43 { annotationType_ }: Annotation,
44 key: PropertyKey,
45 descriptor: PropertyDescriptor
46) {
47 if (__DEV__ && !("value" in descriptor)) {
48 die(
49 `Cannot apply '${annotationType_}' to '${adm.name_}.${key.toString()}':` +
50 `\n'${annotationType_}' cannot be used on getter/setter properties`
51 )
52 }
53}