import { ScriptingGlobals } from '../client/util/ScriptingGlobals'; import { Copy, FieldChanged, Parent, ToJavascriptString, ToScriptString, ToString } from './FieldSymbols'; import { RefField } from './RefField'; export abstract class ObjectField { // prettier-ignore public [FieldChanged]?: (diff?: { op: '$addToSet' | '$remFromSet' | '$set'; // eslint-disable-next-line no-use-before-define items: FieldType[] | undefined; length: number | undefined; hint?: any }, serverOp?: any) => void; // eslint-disable-next-line no-use-before-define public [Parent]?: RefField | ObjectField; abstract [Copy](): ObjectField; abstract [ToJavascriptString](): string; abstract [ToScriptString](): string; abstract [ToString](): string; static MakeCopy(field: T) { return field?.[Copy](); } } export type FieldType = number | string | boolean | ObjectField | RefField; // bcz: hack for now .. must match the type definition in Doc.ts .. put here to avoid import cycles // eslint-disable-next-line import/no-mutable-exports export let ObjGetRefField: (id: string, force?: boolean) => Promise; // eslint-disable-next-line import/no-mutable-exports export let ObjGetRefFields: (ids: string[]) => Promise<{ [id: string]: RefField | undefined }>; export function SetObjGetRefField(func: (id: string, force?: boolean) => Promise) { ObjGetRefField = func; } export function SetObjGetRefFields(func: (ids: string[]) => Promise<{ [id: string]: RefField | undefined }>) { ObjGetRefFields = func; } ScriptingGlobals.add(ObjectField);