mobx
Version:
Simple, scalable state management.
51 lines (43 loc) • 1.58 kB
text/typescript
import {
die,
Annotation,
hasProp,
createDecoratorAnnotation,
ObservableObjectAdministration,
MakeResult
} from "../internal"
import type { ClassMethodDecorator } from "./decorator_fills"
const OVERRIDE = "override"
export const override: Annotation & PropertyDecorator & ClassMethodDecorator =
createDecoratorAnnotation({
annotationType_: OVERRIDE,
make_,
extend_,
decorate_20223_
})
export function isOverride(annotation: Annotation): boolean {
return annotation.annotationType_ === OVERRIDE
}
function make_(this: Annotation, adm: ObservableObjectAdministration, key): MakeResult {
// Must not be plain object
if (__DEV__ && adm.isPlainObject_) {
die(
`Cannot apply '${this.annotationType_}' to '${adm.name_}.${key.toString()}':` +
`\n'${this.annotationType_}' cannot be used on plain objects.`
)
}
// Must override something
if (__DEV__ && !hasProp(adm.appliedAnnotations_!, key)) {
die(
`'${adm.name_}.${key.toString()}' is annotated with '${this.annotationType_}', ` +
`but no such annotated member was found on prototype.`
)
}
return MakeResult.Cancel
}
function extend_(this: Annotation, adm, key, descriptor, proxyTrap): boolean {
die(`'${this.annotationType_}' can only be used with 'makeObservable'`)
}
function decorate_20223_(this: Annotation, desc, context: DecoratorContext) {
console.warn(`'${this.annotationType_}' cannot be used with decorators - this is a no-op`)
}