1 | import {
|
2 | ObservableObjectAdministration,
|
3 | deepEnhancer,
|
4 | die,
|
5 | Annotation,
|
6 | MakeResult
|
7 | } from "../internal"
|
8 |
|
9 | export function createObservableAnnotation(name: string, options?: object): Annotation {
|
10 | return {
|
11 | annotationType_: name,
|
12 | options_: options,
|
13 | make_,
|
14 | extend_
|
15 | }
|
16 | }
|
17 |
|
18 | function 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 |
|
26 | function 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 |
|
41 | function 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 | }
|