aboutsummaryrefslogtreecommitdiff
path: root/src/new_fields
diff options
context:
space:
mode:
Diffstat (limited to 'src/new_fields')
-rw-r--r--src/new_fields/Doc.ts11
-rw-r--r--src/new_fields/Schema.ts13
-rw-r--r--src/new_fields/Types.ts12
3 files changed, 18 insertions, 18 deletions
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index 60abccce6..5ae095e68 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -33,8 +33,8 @@ export class ObjectField {
export type Field = number | string | boolean | ObjectField | RefField;
export type Opt<T> = T | undefined;
-export type FieldWaiting<T extends Field = Field> = Promise<T | undefined>;
-export type FieldResult<T extends Field = Field> = Opt<T> | FieldWaiting<T>;
+export type FieldWaiting<T extends RefField = RefField> = T extends undefined ? never : Promise<T | undefined>;
+export type FieldResult<T extends Field = Field> = Opt<T> | FieldWaiting<Extract<T, RefField>>;
export const Self = Symbol("Self");
@@ -58,7 +58,8 @@ export class Doc extends RefField {
@serializable(alias("fields", map(autoObject())))
@observable
- private __fields: { [key: string]: Field | FieldWaiting | undefined } = {};
+ //{ [key: string]: Field | FieldWaiting | undefined }
+ private __fields: any = {};
private [Update] = (diff: any) => {
DocServer.UpdateField(this[Id], diff);
@@ -86,7 +87,7 @@ export namespace Doc {
return Cast(Get(doc, key, ignoreProto), ctor) as T | null | undefined;
}
export async function SetOnPrototype(doc: Doc, key: string, value: Field) {
- const proto = await Cast(doc.prototype, Doc);
+ const proto = await Cast(doc.proto, Doc);
if (proto) {
proto[key] = value;
}
@@ -97,7 +98,7 @@ export namespace Doc {
}
const delegate = new Doc();
//TODO Does this need to be doc[Self]?
- delegate.prototype = doc;
+ delegate.proto = doc;
return delegate;
}
export const Prototype = Symbol("Prototype");
diff --git a/src/new_fields/Schema.ts b/src/new_fields/Schema.ts
index 59c6db0bd..5081521c7 100644
--- a/src/new_fields/Schema.ts
+++ b/src/new_fields/Schema.ts
@@ -1,7 +1,5 @@
import { Interface, ToInterface, Cast, ToConstructor, HasTail, Head, Tail, ListSpec, ToType } from "./Types";
-import { Doc, Field, ObjectField } from "./Doc";
-import { URLField } from "./URLField";
-import { List } from "./List";
+import { Doc, Field } from "./Doc";
type AllToInterface<T extends Interface[]> = {
1: ToInterface<Head<T>> & AllToInterface<Tail<T>>,
@@ -15,7 +13,7 @@ export type Document = makeInterface<[typeof emptySchema]>;
export type makeInterface<T extends Interface[]> = Partial<AllToInterface<T>> & Doc;
// export function makeInterface<T extends Interface[], U extends Doc>(schemas: T): (doc: U) => All<T, U>;
// export function makeInterface<T extends Interface, U extends Doc>(schema: T): (doc: U) => makeInterface<T, U>;
-export function makeInterface<T extends Interface[]>(...schemas: T): (doc: Doc) => makeInterface<T> {
+export function makeInterface<T extends Interface[]>(...schemas: T): (doc?: Doc) => makeInterface<T> {
let schema: Interface = {};
for (const s of schemas) {
for (const key in s) {
@@ -35,7 +33,8 @@ export function makeInterface<T extends Interface[]>(...schemas: T): (doc: Doc)
return true;
}
});
- return function (doc: Doc) {
+ return function (doc?: Doc) {
+ doc = doc || new Doc;
if (!(doc instanceof Doc)) {
throw new Error("Currently wrapping a schema in another schema isn't supported");
}
@@ -73,8 +72,8 @@ export function makeStrictInterface<T extends Interface>(schema: T): (doc: Doc)
};
}
-export function createSchema<T extends Interface>(schema: T): T & { prototype: ToConstructor<Doc> } {
- schema.prototype = Doc;
+export function createSchema<T extends Interface>(schema: T): T & { proto: ToConstructor<Doc> } {
+ schema.proto = Doc;
return schema as any;
}
diff --git a/src/new_fields/Types.ts b/src/new_fields/Types.ts
index fbf002c84..246b0624e 100644
--- a/src/new_fields/Types.ts
+++ b/src/new_fields/Types.ts
@@ -1,4 +1,4 @@
-import { Field, Opt, FieldWaiting, FieldResult } from "./Doc";
+import { Field, Opt, FieldWaiting, FieldResult, RefField } from "./Doc";
import { List } from "./List";
export type ToType<T extends ToConstructor<Field> | ListSpec<Field>> =
@@ -18,7 +18,7 @@ export type ToConstructor<T extends Field> =
new (...args: any[]) => T;
export type ToInterface<T extends Interface> = {
- [P in keyof T]: ToType<T[P]>;
+ [P in keyof T]: FieldResult<ToType<T[P]>>;
};
// type ListSpec<T extends Field[]> = { List: ToContructor<Head<T>> | ListSpec<Tail<T>> };
@@ -37,11 +37,11 @@ export interface Interface {
// [key: string]: ToConstructor<Field> | ListSpec<Field[]>;
}
-export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: Field | FieldWaiting | undefined, ctor: T): FieldResult<ToType<T>>;
-export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal: ToType<T>): ToType<T>;
-export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal?: ToType<T>): FieldResult<ToType<T>> | undefined {
+export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: FieldResult, ctor: T): FieldResult<ToType<T>>;
+export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: FieldResult, ctor: T, defaultVal: ToType<T>): ToType<T>;
+export function Cast<T extends ToConstructor<Field> | ListSpec<Field>>(field: FieldResult, ctor: T, defaultVal?: ToType<T>): FieldResult<ToType<T>> | undefined {
if (field instanceof Promise) {
- return defaultVal === undefined ? field.then(f => Cast(f, ctor) as any) : defaultVal;
+ return defaultVal === undefined ? field.then(f => Cast(f, ctor) as any) as any : defaultVal;
}
if (field !== undefined && !(field instanceof Promise)) {
if (typeof ctor === "string") {