@snowtop/ent 0.1.0-alpha12 → 0.1.0-alpha15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/action/action.d.ts +27 -25
  2. package/action/executor.d.ts +3 -3
  3. package/action/experimental_action.d.ts +21 -20
  4. package/action/experimental_action.js +1 -1
  5. package/action/orchestrator.d.ts +16 -14
  6. package/action/orchestrator.js +2 -1
  7. package/action/privacy.d.ts +2 -2
  8. package/core/base.d.ts +20 -20
  9. package/core/context.d.ts +2 -2
  10. package/core/ent.d.ts +13 -13
  11. package/core/loaders/assoc_count_loader.d.ts +2 -2
  12. package/core/loaders/assoc_edge_loader.d.ts +2 -2
  13. package/core/loaders/object_loader.d.ts +3 -3
  14. package/core/loaders/query_loader.d.ts +2 -2
  15. package/core/loaders/raw_count_loader.d.ts +2 -2
  16. package/core/privacy.d.ts +24 -24
  17. package/core/query/assoc_query.d.ts +6 -6
  18. package/core/query/custom_query.d.ts +5 -5
  19. package/core/query/query.d.ts +1 -1
  20. package/core/viewer.d.ts +3 -3
  21. package/graphql/query/edge_connection.d.ts +9 -9
  22. package/graphql/query/page_info.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/parse_schema/parse.d.ts +2 -0
  25. package/parse_schema/parse.js +4 -0
  26. package/schema/base_schema.js +3 -0
  27. package/schema/schema.d.ts +5 -4
  28. package/schema/schema.js +2 -1
  29. package/testutils/builder.d.ts +16 -13
  30. package/testutils/builder.js +9 -2
  31. package/testutils/fake_data/fake_contact.d.ts +1 -1
  32. package/testutils/fake_data/fake_contact.js +2 -1
  33. package/testutils/fake_data/fake_event.d.ts +1 -1
  34. package/testutils/fake_data/fake_event.js +2 -1
  35. package/testutils/fake_data/fake_user.d.ts +2 -2
  36. package/testutils/fake_data/fake_user.js +2 -1
  37. package/testutils/fake_data/user_query.d.ts +2 -2
  38. package/testutils/fake_log.d.ts +3 -3
@@ -7,14 +7,16 @@ export declare enum WriteOperation {
7
7
  Edit = "edit",
8
8
  Delete = "delete"
9
9
  }
10
- export interface Builder<T extends Ent> {
11
- existingEnt?: T;
12
- ent: EntConstructor<T>;
10
+ declare type MaybeNull<T extends Ent> = T | null;
11
+ declare type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
12
+ export interface Builder<TEnt extends Ent<TViewer>, TViewer extends Viewer = Viewer, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
13
+ existingEnt: TExistingEnt;
14
+ ent: EntConstructor<TEnt, TViewer>;
13
15
  placeholderID: ID;
14
- readonly viewer: Viewer;
15
- build(): Promise<Changeset<T>>;
16
+ readonly viewer: TViewer;
17
+ build(): Promise<Changeset>;
16
18
  operation: WriteOperation;
17
- editedEnt?(): Promise<T | null>;
19
+ editedEnt?(): Promise<TEnt | null>;
18
20
  nodeType: string;
19
21
  }
20
22
  export interface Executor extends Iterable<DataOperation>, Iterator<DataOperation> {
@@ -25,39 +27,39 @@ export interface Executor extends Iterable<DataOperation>, Iterator<DataOperatio
25
27
  postFetch?(queryer: Queryer, context?: Context): Promise<void>;
26
28
  executeObservers?(): Promise<void>;
27
29
  }
28
- export interface Changeset<T extends Ent> {
30
+ export interface Changeset {
29
31
  executor(): Executor;
30
32
  viewer: Viewer;
31
33
  placeholderID: ID;
32
- changesets?: Changeset<Ent>[];
34
+ changesets?: Changeset[];
33
35
  dependencies?: Map<ID, Builder<Ent>>;
34
36
  }
35
- export declare type TriggerReturn = void | Promise<Changeset<Ent> | void | (Changeset<Ent> | void)[]> | Promise<Changeset<Ent>>[];
36
- export interface Trigger<TBuilder extends Builder<Ent>, TData extends Data> {
37
- changeset(builder: TBuilder, input: TData): TriggerReturn;
37
+ export declare type TriggerReturn = void | Promise<Changeset | void | (Changeset | void)[]> | Promise<Changeset>[];
38
+ export interface Trigger<TEnt extends Ent<TViewer>, TBuilder extends Builder<TEnt, TViewer, TExistingEnt>, TViewer extends Viewer = Viewer, TInput extends Data = Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
39
+ changeset(builder: TBuilder, input: TInput): TriggerReturn;
38
40
  }
39
- export interface Observer<TBuilder extends Builder<Ent>, TData extends Data> {
40
- observe(builder: TBuilder, input: TData): void | Promise<void>;
41
+ export interface Observer<TEnt extends Ent<TViewer>, TBuilder extends Builder<TEnt, TViewer, TExistingEnt>, TViewer extends Viewer = Viewer, TInput extends Data = Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
42
+ observe(builder: TBuilder, input: TInput): void | Promise<void>;
41
43
  }
42
- export interface Validator<TBuilder extends Builder<Ent>, TData extends Data> {
43
- validate(builder: TBuilder, input: TData): Promise<void> | void;
44
+ export interface Validator<TEnt extends Ent<TViewer>, TBuilder extends Builder<TEnt, TViewer, TExistingEnt>, TViewer extends Viewer = Viewer, TInput extends Data = Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
45
+ validate(builder: TBuilder, input: TInput): Promise<void> | void;
44
46
  }
45
- export interface Action<TEnt extends Ent, TBuilder extends Builder<TEnt>, TData extends Data> {
47
+ export interface Action<TEnt extends Ent<TViewer>, TBuilder extends Builder<TEnt, TViewer, TExistingEnt>, TViewer extends Viewer = Viewer, TInput extends Data = Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
46
48
  readonly viewer: Viewer;
47
- changeset(): Promise<Changeset<TEnt>>;
49
+ changeset(): Promise<Changeset>;
48
50
  builder: TBuilder;
49
51
  getPrivacyPolicy(): PrivacyPolicy<TEnt>;
50
- triggers?: Trigger<TBuilder, TData>[];
51
- observers?: Observer<TBuilder, TData>[];
52
- validators?: Validator<TBuilder, TData>[];
53
- getInput(): TData;
54
- transformWrite?: <T2 extends Ent>(stmt: UpdateOperation<T2>) => Promise<TransformedUpdateOperation<T2>> | TransformedUpdateOperation<T2> | undefined;
52
+ triggers?: Trigger<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[];
53
+ observers?: Observer<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[];
54
+ validators?: Validator<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[];
55
+ getInput(): TInput;
56
+ transformWrite?: (stmt: UpdateOperation<TEnt>) => Promise<TransformedUpdateOperation<TEnt>> | TransformedUpdateOperation<TEnt> | null;
55
57
  valid(): Promise<boolean>;
56
58
  validX(): Promise<void>;
57
- viewerForEntLoad?(data: Data): Viewer | Promise<Viewer>;
59
+ viewerForEntLoad?(data: Data): TViewer | Promise<TViewer>;
58
60
  }
59
- export declare function saveBuilder<T extends Ent>(builder: Builder<T>): Promise<void>;
60
- export declare function saveBuilderX<T extends Ent>(builder: Builder<T>): Promise<void>;
61
+ export declare function saveBuilder<TEnt extends Ent<TViewer>, TViewer extends Viewer>(builder: Builder<TEnt, TViewer>): Promise<void>;
62
+ export declare function saveBuilderX<TEnt extends Ent<TViewer>, TViewer extends Viewer>(builder: Builder<TEnt, TViewer>): Promise<void>;
61
63
  interface Orchestrator {
62
64
  addOutboundEdge<T2 extends Ent>(id2: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
63
65
  removeOutboundEdge(id2: ID, edgeType: string): void;
@@ -10,7 +10,7 @@ export declare class ListBasedExecutor<T extends Ent> implements Executor {
10
10
  private operations;
11
11
  private options?;
12
12
  private idx;
13
- constructor(viewer: Viewer, placeholderID: ID, operations: DataOperation<T>[], options?: OrchestratorOptions<T, Data> | undefined);
13
+ constructor(viewer: Viewer, placeholderID: ID, operations: DataOperation<T>[], options?: OrchestratorOptions<T, Viewer<Ent<any> | null, ID | null>, Data, T | null> | undefined);
14
14
  private lastOp;
15
15
  private createdEnt;
16
16
  resolveValue(val: ID): Ent | null;
@@ -29,7 +29,7 @@ export declare class ComplexExecutor<T extends Ent> implements Executor {
29
29
  private lastOp;
30
30
  private allOperations;
31
31
  private executors;
32
- constructor(viewer: Viewer, placeholderID: ID, operations: DataOperation[], dependencies: Map<ID, Builder<T>>, changesets: Changeset<T>[], options?: OrchestratorOptions<T, Data>);
32
+ constructor(viewer: Viewer, placeholderID: ID, operations: DataOperation[], dependencies: Map<ID, Builder<T>>, changesets: Changeset[], options?: OrchestratorOptions<T, Viewer, Data>);
33
33
  [Symbol.iterator](): this;
34
34
  private handleCreatedEnt;
35
35
  next(): IteratorResult<DataOperation<Ent>>;
@@ -39,4 +39,4 @@ export declare class ComplexExecutor<T extends Ent> implements Executor {
39
39
  preFetch?(queryer: Queryer, context: Context): Promise<void>;
40
40
  postFetch?(queryer: Queryer, context: Context): Promise<void>;
41
41
  }
42
- export declare function executeOperations(executor: Executor, context?: Context, trackOps?: true): Promise<DataOperation<Ent>[]>;
42
+ export declare function executeOperations(executor: Executor, context?: Context, trackOps?: true): Promise<DataOperation<Ent<Viewer<Ent<any> | null, ID | null>>>[]>;
@@ -5,36 +5,37 @@ export interface ActionOptions<T extends Ent, TData extends Data> {
5
5
  input?: TData;
6
6
  operation?: WriteOperation;
7
7
  }
8
- interface EntBuilder<T extends Ent> extends Builder<T> {
8
+ interface EntBuilder<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data> extends Builder<TEnt, TViewer> {
9
9
  valid(): Promise<boolean>;
10
10
  validX(): Promise<void>;
11
11
  save(): Promise<void>;
12
12
  saveX(): Promise<void>;
13
- editedEnt(): Promise<T | null>;
14
- editedEntX(): Promise<T>;
13
+ editedEnt(): Promise<TEnt | null>;
14
+ editedEntX(): Promise<TEnt>;
15
+ getInput(): TInput;
15
16
  }
16
- export declare class BaseAction<TEnt extends Ent, TData extends Data> implements Action<TEnt, EntBuilder<TEnt>, TData> {
17
- viewer: Viewer;
18
- builderCtr: BuilderConstructor<TEnt, TData>;
19
- builder: EntBuilder<TEnt>;
17
+ export declare class BaseAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data> implements Action<TEnt, EntBuilder<TEnt, TViewer, TInput>, TViewer, TInput> {
18
+ viewer: TViewer;
19
+ builderCtr: BuilderConstructor<TEnt, TViewer, TInput>;
20
+ builder: EntBuilder<TEnt, TViewer, TInput>;
20
21
  private input;
21
- triggers: Trigger<EntBuilder<TEnt>, TData>[];
22
- observers: Observer<EntBuilder<TEnt>, TData>[];
23
- validators: Validator<EntBuilder<TEnt>, TData>[];
24
- getPrivacyPolicy(): import("../core/base").PrivacyPolicy<Ent>;
25
- constructor(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TData>, options?: ActionOptions<TEnt, TData> | null);
26
- static createBuilder<TEnt extends Ent, TData extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TData>, options?: ActionOptions<TEnt, TData> | null): Builder<TEnt>;
27
- static bulkAction<TEnt extends Ent, TData extends Data>(ent: TEnt, builderCtr: BuilderConstructor<TEnt, TData>, ...actions: Action<Ent, Builder<Ent>, Data>[]): BaseAction<TEnt, TData>;
28
- changeset(): Promise<Changeset<TEnt>>;
22
+ triggers: Trigger<TEnt, EntBuilder<TEnt, TViewer, TInput>, TViewer, TInput>[];
23
+ observers: Observer<TEnt, EntBuilder<TEnt, TViewer, TInput>, TViewer, TInput>[];
24
+ validators: Validator<TEnt, EntBuilder<TEnt, TViewer, TInput>, TViewer, TInput>[];
25
+ getPrivacyPolicy(): import("../core/base").PrivacyPolicy<Ent<Viewer<Ent<any> | null, import("../core/base").ID | null>>, Viewer<Ent<any> | null, import("../core/base").ID | null>>;
26
+ constructor(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput>, options?: ActionOptions<TEnt, TInput> | null);
27
+ static createBuilder<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput>, options?: ActionOptions<TEnt, TInput> | null): Builder<TEnt>;
28
+ static bulkAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(ent: TEnt, builderCtr: BuilderConstructor<TEnt, TViewer, TInput>, ...actions: Action<Ent, Builder<Ent, any>>[]): BaseAction<TEnt, TViewer, TInput>;
29
+ changeset(): Promise<Changeset>;
29
30
  valid(): Promise<boolean>;
30
31
  validX(): Promise<void>;
31
32
  save(): Promise<TEnt | null>;
32
33
  saveX(): Promise<TEnt>;
33
- getInput(): TData;
34
+ getInput(): TInput;
34
35
  }
35
- interface BuilderConstructor<TEnt extends Ent, TData extends Data> {
36
- new (viewer: Viewer, operation: WriteOperation, action: Action<TEnt, EntBuilder<TEnt>, TData>, existingEnt?: TEnt | undefined): EntBuilder<TEnt>;
36
+ interface BuilderConstructor<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data> {
37
+ new (viewer: TViewer, operation: WriteOperation, action: Action<TEnt, EntBuilder<TEnt, TViewer, TInput>, TViewer, TInput>, existingEnt: TEnt | null): EntBuilder<TEnt, TViewer, TInput>;
37
38
  }
38
- export declare function updateRawObject<TEnt extends Ent, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TInput>, existingEnt: TEnt, input: TInput): Promise<TEnt>;
39
- export declare function getSimpleEditAction<TEnt extends Ent, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TInput>, existingEnt: TEnt, input: TInput): Action<TEnt, Builder<TEnt>, TInput>;
39
+ export declare function updateRawObject<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput>, existingEnt: TEnt, input: TInput): Promise<TEnt>;
40
+ export declare function getSimpleEditAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput>, existingEnt: TEnt, input: TInput): Action<TEnt, Builder<TEnt, TViewer>, TViewer, TInput>;
40
41
  export {};
@@ -20,7 +20,7 @@ class BaseAction {
20
20
  }
21
21
  }
22
22
  this.input = options?.input || {};
23
- this.builder = new builderCtr(viewer, operation, this, options?.existingEnt || undefined);
23
+ this.builder = new builderCtr(viewer, operation, this, options?.existingEnt || null);
24
24
  }
25
25
  getPrivacyPolicy() {
26
26
  return privacy_1.AlwaysAllowPrivacyPolicy;
@@ -3,17 +3,19 @@ import { AssocEdgeInputOptions, DataOperation } from "../core/ent";
3
3
  import { SchemaInputType, FieldInfoMap } from "../schema/schema";
4
4
  import { Changeset, Executor } from "../action/action";
5
5
  import { WriteOperation, Builder, Action } from "../action";
6
- export interface OrchestratorOptions<TEnt extends Ent, TData extends Data> {
6
+ declare type MaybeNull<T extends Ent> = T | null;
7
+ declare type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
8
+ export interface OrchestratorOptions<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
7
9
  viewer: Viewer;
8
10
  operation: WriteOperation;
9
11
  tableName: string;
10
- loaderOptions: LoadEntOptions<TEnt>;
12
+ loaderOptions: LoadEntOptions<TEnt, TViewer>;
11
13
  key: string;
12
- builder: Builder<TEnt>;
13
- action?: Action<TEnt, Builder<TEnt>, TData>;
14
+ builder: Builder<TEnt, TViewer, TExistingEnt>;
15
+ action?: Action<TEnt, Builder<TEnt, TViewer>, TViewer, TInput>;
14
16
  schema: SchemaInputType;
15
17
  editedFields(): Map<string, any> | Promise<Map<string, any>>;
16
- updateInput?: (data: TData) => void;
18
+ updateInput?: (data: TInput) => void;
17
19
  fieldInfo: FieldInfoMap;
18
20
  }
19
21
  interface edgeInputDataOpts {
@@ -29,7 +31,7 @@ export declare enum edgeDirection {
29
31
  inboundEdge = 0,
30
32
  outboundEdge = 1
31
33
  }
32
- export declare class Orchestrator<TEnt extends Ent, TData extends Data> {
34
+ export declare class Orchestrator<TEnt extends Ent<TViewer>, TInput extends Data, TViewer extends Viewer, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
33
35
  private options;
34
36
  private edgeSet;
35
37
  private edges;
@@ -43,14 +45,14 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data> {
43
45
  private defaultFieldsByFieldName;
44
46
  private defaultFieldsByTSName;
45
47
  private actualOperation;
46
- private existingEnt?;
48
+ private existingEnt;
47
49
  private disableTransformations;
48
50
  private memoizedGetFields;
49
- constructor(options: OrchestratorOptions<TEnt, TData>);
51
+ constructor(options: OrchestratorOptions<TEnt, TViewer, TInput, TExistingEnt>);
50
52
  private addEdge;
51
53
  setDisableTransformations(val: boolean): void;
52
- addInboundEdge<T2 extends Ent>(id1: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
53
- addOutboundEdge<T2 extends Ent>(id2: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
54
+ addInboundEdge<T2 extends Ent>(id1: ID | Builder<T2, any>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
55
+ addOutboundEdge<T2 extends Ent>(id2: ID | Builder<T2, any>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
54
56
  removeInboundEdge(id1: ID, edgeType: string): void;
55
57
  removeOutboundEdge(id2: ID, edgeType: string): void;
56
58
  getInputEdges(edgeType: string, op: WriteOperation): EdgeInputData[];
@@ -83,16 +85,16 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data> {
83
85
  editedEnt(): Promise<TEnt | null>;
84
86
  editedEntX(): Promise<TEnt>;
85
87
  }
86
- export declare class EntChangeset<T extends Ent> implements Changeset<T> {
88
+ export declare class EntChangeset<T extends Ent> implements Changeset {
87
89
  viewer: Viewer;
88
90
  readonly placeholderID: ID;
89
91
  readonly ent: EntConstructor<T>;
90
92
  operations: DataOperation[];
91
- dependencies?: Map<ID, Builder<Ent>> | undefined;
92
- changesets?: Changeset<Ent>[] | undefined;
93
+ dependencies?: Map<ID, Builder<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>, Ent<Viewer<Ent<any> | null, ID | null>> | null>> | undefined;
94
+ changesets?: Changeset[] | undefined;
93
95
  private options?;
94
96
  private _executor;
95
- constructor(viewer: Viewer, placeholderID: ID, ent: EntConstructor<T>, operations: DataOperation[], dependencies?: Map<ID, Builder<Ent>> | undefined, changesets?: Changeset<Ent>[] | undefined, options?: OrchestratorOptions<T, Data> | undefined);
97
+ constructor(viewer: Viewer, placeholderID: ID, ent: EntConstructor<T>, operations: DataOperation[], dependencies?: Map<ID, Builder<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>, Ent<Viewer<Ent<any> | null, ID | null>> | null>> | undefined, changesets?: Changeset[] | undefined, options?: OrchestratorOptions<T, Viewer<Ent<any> | null, ID | null>, Data, MaybeNull<T>> | undefined);
96
98
  executor(): Executor;
97
99
  }
98
100
  export {};
@@ -376,7 +376,7 @@ class Orchestrator {
376
376
  // if action transformations. always do it
377
377
  // if disable transformations set, don't do schema transform and just do the right thing
378
378
  // else apply schema tranformation if it exists
379
- let transformed;
379
+ let transformed = null;
380
380
  if (action?.transformWrite) {
381
381
  transformed = await action.transformWrite({
382
382
  viewer: builder.viewer,
@@ -414,6 +414,7 @@ class Orchestrator {
414
414
  }
415
415
  this.actualOperation = this.getWriteOpForSQLStamentOp(transformed.op);
416
416
  if (transformed.existingEnt) {
417
+ // @ts-ignore
417
418
  this.existingEnt = transformed.existingEnt;
418
419
  }
419
420
  }
@@ -2,11 +2,11 @@ import { Builder } from "./action";
2
2
  import { Viewer, ID, Ent, PrivacyResult, PrivacyPolicyRule } from "../core/base";
3
3
  export declare class DenyIfBuilder implements PrivacyPolicyRule {
4
4
  private id?;
5
- constructor(id?: ID | Builder<Ent> | undefined);
5
+ constructor(id?: ID | Builder<Ent<Viewer<Ent<any> | null, ID | null>>, any, Ent<Viewer<Ent<any> | null, ID | null>> | null> | undefined);
6
6
  apply(_v: Viewer, _ent: Ent): Promise<PrivacyResult>;
7
7
  }
8
8
  export declare class AllowIfBuilder implements PrivacyPolicyRule {
9
9
  private id?;
10
- constructor(id?: ID | Builder<Ent> | undefined);
10
+ constructor(id?: ID | Builder<Ent<Viewer<Ent<any> | null, ID | null>>, any, Ent<Viewer<Ent<any> | null, ID | null>> | null> | undefined);
11
11
  apply(_v: Viewer, _ent: Ent): Promise<PrivacyResult>;
12
12
  }
package/core/base.d.ts CHANGED
@@ -30,27 +30,27 @@ interface queryOptions {
30
30
  clause: clause.Clause;
31
31
  orderby?: string;
32
32
  }
33
- export interface Context {
34
- getViewer(): Viewer;
33
+ export interface Context<TViewer extends Viewer = Viewer> {
34
+ getViewer(): TViewer;
35
35
  cache?: cache;
36
36
  }
37
- export interface Viewer {
38
- viewerID: ID | null;
39
- viewer: () => Promise<Ent | null>;
37
+ export interface Viewer<TEnt extends any = Ent<any> | null, TID extends any = ID | null> {
38
+ viewerID: TID;
39
+ viewer: () => Promise<TEnt>;
40
40
  instanceKey: () => string;
41
- context?: Context;
41
+ context?: Context<any>;
42
42
  }
43
- export interface Ent {
43
+ export interface Ent<TViewer extends Viewer = Viewer> {
44
44
  id: ID;
45
- viewer: Viewer;
46
- getPrivacyPolicy(): PrivacyPolicy<this>;
45
+ viewer: TViewer;
46
+ getPrivacyPolicy(): PrivacyPolicy<this, TViewer>;
47
47
  nodeType: string;
48
48
  }
49
49
  export declare type Data = {
50
50
  [key: string]: any;
51
51
  };
52
- export interface EntConstructor<T extends Ent> {
53
- new (viewer: Viewer, data: Data): T;
52
+ export interface EntConstructor<TEnt extends Ent, TViewer extends Viewer = Viewer> {
53
+ new (viewer: TViewer, data: Data): TEnt;
54
54
  }
55
55
  export declare type ID = string | number;
56
56
  export interface DataOptions {
@@ -84,15 +84,15 @@ export interface CreateRowOptions extends DataOptions {
84
84
  export interface EditRowOptions extends CreateRowOptions {
85
85
  key: string;
86
86
  }
87
- interface LoadableEntOptions<T extends Ent> {
87
+ interface LoadableEntOptions<TEnt extends Ent, TViewer extends Viewer = Viewer> {
88
88
  loaderFactory: LoaderFactory<any, Data | null>;
89
- ent: EntConstructor<T>;
89
+ ent: EntConstructor<TEnt, TViewer>;
90
90
  }
91
- export interface LoadEntOptions<T extends Ent> extends LoadableEntOptions<T>, SelectBaseDataOptions {
91
+ export interface LoadEntOptions<TEnt extends Ent, TViewer extends Viewer = Viewer> extends LoadableEntOptions<TEnt, TViewer>, SelectBaseDataOptions {
92
92
  fieldPrivacy?: Map<string, PrivacyPolicy>;
93
93
  }
94
- export interface LoadCustomEntOptions<T extends Ent> extends SelectBaseDataOptions {
95
- ent: EntConstructor<T>;
94
+ export interface LoadCustomEntOptions<TEnt extends Ent, TViewer extends Viewer = Viewer> extends SelectBaseDataOptions {
95
+ ent: EntConstructor<TEnt, TViewer>;
96
96
  fieldPrivacy?: Map<string, PrivacyPolicy>;
97
97
  }
98
98
  export interface LoaderInfo {
@@ -121,10 +121,10 @@ export declare function Allow(): PrivacyResult;
121
121
  export declare function Skip(): PrivacyResult;
122
122
  export declare function Deny(): PrivacyResult;
123
123
  export declare function DenyWithReason(e: PrivacyError | string): PrivacyResult;
124
- export interface PrivacyPolicyRule<TEnt extends Ent = Ent> {
125
- apply(v: Viewer, ent?: TEnt): Promise<PrivacyResult>;
124
+ export interface PrivacyPolicyRule<TEnt extends Ent = Ent, TViewer = Viewer> {
125
+ apply(v: TViewer, ent?: TEnt): Promise<PrivacyResult>;
126
126
  }
127
- export interface PrivacyPolicy<TEnt extends Ent = Ent> {
128
- rules: PrivacyPolicyRule<TEnt>[];
127
+ export interface PrivacyPolicy<TEnt extends Ent = Ent, TViewer = Viewer> {
128
+ rules: PrivacyPolicyRule<TEnt, TViewer>[];
129
129
  }
130
130
  export {};
package/core/context.d.ts CHANGED
@@ -3,8 +3,8 @@ import { Viewer, Data, Loader } from "./base";
3
3
  import { IncomingMessage, ServerResponse } from "http";
4
4
  import * as clause from "./clause";
5
5
  import { Context } from "./base";
6
- export interface RequestContext extends Context {
7
- authViewer(viewer: Viewer): Promise<void>;
6
+ export interface RequestContext<TViewer extends Viewer = Viewer> extends Context<TViewer> {
7
+ authViewer(viewer: TViewer): Promise<void>;
8
8
  logout(): Promise<void>;
9
9
  request: IncomingMessage;
10
10
  response: ServerResponse;
package/core/ent.d.ts CHANGED
@@ -4,16 +4,16 @@ import { Executor } from "../action/action";
4
4
  import * as clause from "./clause";
5
5
  import { Builder } from "../action";
6
6
  import DataLoader from "dataloader";
7
- export declare function loadEnt<T extends Ent>(viewer: Viewer, id: ID, options: LoadEntOptions<T>): Promise<T | null>;
8
- export declare function loadEntViaKey<T extends Ent>(viewer: Viewer, key: any, options: LoadEntOptions<T>): Promise<T | null>;
9
- export declare function loadEntX<T extends Ent>(viewer: Viewer, id: ID, options: LoadEntOptions<T>): Promise<T>;
10
- export declare function loadEntXViaKey<T extends Ent>(viewer: Viewer, key: any, options: LoadEntOptions<T>): Promise<T>;
11
- export declare function loadEntFromClause<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, clause: clause.Clause): Promise<T | null>;
12
- export declare function loadEntXFromClause<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, clause: clause.Clause): Promise<T>;
13
- export declare function loadEnts<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, ...ids: ID[]): Promise<Map<ID, T>>;
14
- export declare function loadEntsList<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, ...ids: ID[]): Promise<T[]>;
15
- export declare function loadEntsFromClause<T extends Ent>(viewer: Viewer, clause: clause.Clause, options: LoadEntOptions<T>): Promise<Map<ID, T>>;
16
- export declare function loadCustomEnts<T extends Ent>(viewer: Viewer, options: LoadCustomEntOptions<T>, query: CustomQuery): Promise<T[]>;
7
+ export declare function loadEnt<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id: ID, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
8
+ export declare function loadEntViaKey<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, key: any, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
9
+ export declare function loadEntX<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id: ID, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt>;
10
+ export declare function loadEntXViaKey<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, key: any, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt>;
11
+ export declare function loadEntFromClause<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, clause: clause.Clause): Promise<TEnt | null>;
12
+ export declare function loadEntXFromClause<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, clause: clause.Clause): Promise<TEnt>;
13
+ export declare function loadEnts<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, ...ids: ID[]): Promise<Map<ID, TEnt>>;
14
+ export declare function loadEntsList<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, ...ids: ID[]): Promise<TEnt[]>;
15
+ export declare function loadEntsFromClause<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, clause: clause.Clause, options: LoadEntOptions<TEnt, TViewer>): Promise<Map<ID, TEnt>>;
16
+ export declare function loadCustomEnts<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadCustomEntOptions<TEnt, TViewer>, query: CustomQuery): Promise<TEnt[]>;
17
17
  interface rawQueryOptions {
18
18
  query: string;
19
19
  values?: any[];
@@ -21,8 +21,8 @@ interface rawQueryOptions {
21
21
  }
22
22
  export declare type CustomQuery = string | rawQueryOptions | clause.Clause | QueryDataOptions;
23
23
  export declare function loadCustomData(options: SelectBaseDataOptions, query: CustomQuery, context: Context | undefined): Promise<Data[]>;
24
- export declare function loadDerivedEnt<T extends Ent>(viewer: Viewer, data: Data, loader: new (viewer: Viewer, data: Data) => T): Promise<T | null>;
25
- export declare function loadDerivedEntX<T extends Ent>(viewer: Viewer, data: Data, loader: new (viewer: Viewer, data: Data) => T): Promise<T>;
24
+ export declare function loadDerivedEnt<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, data: Data, loader: new (viewer: TViewer, data: Data) => TEnt): Promise<TEnt | null>;
25
+ export declare function loadDerivedEntX<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, data: Data, loader: new (viewer: TViewer, data: Data) => TEnt): Promise<TEnt>;
26
26
  export declare function loadRowX(options: LoadRowOptions): Promise<Data>;
27
27
  export declare function loadRow(options: LoadRowOptions): Promise<Data | null>;
28
28
  export declare function performRawQuery(query: string, values: any[], logValues?: any[]): Promise<Data[]>;
@@ -165,7 +165,7 @@ export declare function defaultEdgeQueryOptions(id1: ID, edgeType: string): Edge
165
165
  export declare function loadEdges(options: loadEdgesOptions): Promise<AssocEdge[]>;
166
166
  export declare function loadCustomEdges<T extends AssocEdge>(options: loadCustomEdgesOptions<T>): Promise<T[]>;
167
167
  export declare function loadUniqueEdge(options: loadEdgesOptions): Promise<AssocEdge | null>;
168
- export declare function loadUniqueNode<T extends Ent>(viewer: Viewer, id1: ID, edgeType: string, options: LoadEntOptions<T>): Promise<T | null>;
168
+ export declare function loadUniqueNode<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id1: ID, edgeType: string, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
169
169
  export declare function loadRawEdgeCountX(options: loadEdgesOptions): Promise<number>;
170
170
  interface loadEdgeForIDOptions<T extends AssocEdge> extends loadCustomEdgesOptions<T> {
171
171
  id2: ID;
@@ -1,10 +1,10 @@
1
1
  import { ID, Context, Loader, LoaderFactory } from "../base";
2
2
  export declare class AssocEdgeCountLoader implements Loader<ID, number> {
3
3
  private edgeType;
4
- context?: Context | undefined;
4
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
5
5
  private loaderFn;
6
6
  private loader;
7
- constructor(edgeType: string, context?: Context | undefined);
7
+ constructor(edgeType: string, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined);
8
8
  private getLoader;
9
9
  load(id: ID): Promise<number>;
10
10
  clearAll(): void;
@@ -20,8 +20,8 @@ export declare class AssocDirectEdgeLoader<T extends AssocEdge> implements Loade
20
20
  private edgeType;
21
21
  private edgeCtr;
22
22
  private options?;
23
- context?: Context | undefined;
24
- constructor(edgeType: string, edgeCtr: AssocEdgeConstructor<T>, options?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined, context?: Context | undefined);
23
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
24
+ constructor(edgeType: string, edgeCtr: AssocEdgeConstructor<T>, options?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined);
25
25
  load(id: ID): Promise<T[]>;
26
26
  loadEdgeForID2(id: ID, id2: ID): Promise<T | undefined>;
27
27
  clearAll(): void;
@@ -1,12 +1,12 @@
1
- import { Data, SelectDataOptions, Context, Loader, LoaderFactory } from "../base";
1
+ import { ID, Data, SelectDataOptions, Context, Loader, LoaderFactory } from "../base";
2
2
  export declare class ObjectLoader<T> implements Loader<T, Data | null> {
3
3
  private options;
4
- context?: Context | undefined;
4
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
5
5
  private toPrime?;
6
6
  private loader;
7
7
  private primedLoaders;
8
8
  private memoizedInitPrime;
9
- constructor(options: SelectDataOptions, context?: Context | undefined, toPrime?: ObjectLoaderFactory<T>[] | undefined);
9
+ constructor(options: SelectDataOptions, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined, toPrime?: ObjectLoaderFactory<T>[] | undefined);
10
10
  getOptions(): SelectDataOptions;
11
11
  private initPrime;
12
12
  load(key: T): Promise<Data | null>;
@@ -10,12 +10,12 @@ export declare class QueryDirectLoader<K extends any> implements Loader<K, Data[
10
10
  }
11
11
  export declare class QueryLoader<K extends any> implements Loader<K, Data[]> {
12
12
  private options;
13
- context?: Context | undefined;
13
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
14
14
  private queryOptions?;
15
15
  private loader;
16
16
  private primedLoaders;
17
17
  private memoizedInitPrime;
18
- constructor(options: QueryOptions, context?: Context | undefined, queryOptions?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined);
18
+ constructor(options: QueryOptions, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined, queryOptions?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined);
19
19
  private initPrime;
20
20
  load(id: K): Promise<Data[]>;
21
21
  clearAll(): void;
@@ -9,9 +9,9 @@ interface QueryCountOptions {
9
9
  export declare function createCountDataLoader<K extends any>(options: QueryCountOptions): DataLoader<K, number, K>;
10
10
  export declare class RawCountLoader<K extends any> implements Loader<K, number> {
11
11
  private options;
12
- context?: Context | undefined;
12
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
13
13
  private loader;
14
- constructor(options: QueryCountOptions, context?: Context | undefined);
14
+ constructor(options: QueryCountOptions, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined);
15
15
  load(id: K): Promise<number>;
16
16
  clearAll(): void;
17
17
  }
package/core/privacy.d.ts CHANGED
@@ -6,22 +6,22 @@ export declare class EntPrivacyError extends Error implements PrivacyError {
6
6
  constructor(privacyPolicy: PrivacyPolicy, rule: PrivacyPolicyRule, ent?: Ent);
7
7
  }
8
8
  export declare const AlwaysAllowRule: {
9
- apply(_v: Viewer, _ent?: Ent | undefined): Promise<PrivacyResult>;
9
+ apply(_v: Viewer, _ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
10
10
  };
11
11
  export declare const AlwaysDenyRule: {
12
- apply(_v: Viewer, _ent?: Ent | undefined): Promise<PrivacyResult>;
12
+ apply(_v: Viewer, _ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
13
13
  };
14
14
  export declare const DenyIfLoggedOutRule: {
15
- apply(v: Viewer, _ent?: Ent | undefined): Promise<PrivacyResult>;
15
+ apply(v: Viewer, _ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
16
16
  };
17
17
  export declare const DenyIfLoggedInRule: {
18
- apply(v: Viewer, _ent?: Ent | undefined): Promise<PrivacyResult>;
18
+ apply(v: Viewer, _ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
19
19
  };
20
20
  export declare const AllowIfHasIdentity: {
21
- apply(v: Viewer, _ent?: Ent | undefined): Promise<PrivacyResult>;
21
+ apply(v: Viewer, _ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
22
22
  };
23
23
  export declare const AllowIfViewerRule: {
24
- apply(v: Viewer, ent?: Ent | undefined): Promise<PrivacyResult>;
24
+ apply(v: Viewer, ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
25
25
  };
26
26
  export declare class AllowIfViewerEqualsRule {
27
27
  private id;
@@ -71,45 +71,45 @@ export declare class DenyIfEntPropertyIsRule<T extends Ent> implements PrivacyPo
71
71
  constructor(property: keyof T, val: any);
72
72
  apply(v: Viewer, ent?: T): Promise<PrivacyResult>;
73
73
  }
74
- export declare class AllowIfEntIsVisibleRule<T extends Ent> implements PrivacyPolicyRule {
74
+ export declare class AllowIfEntIsVisibleRule<TEnt extends Ent<TViewer>, TViewer extends Viewer> implements PrivacyPolicyRule {
75
75
  private id;
76
76
  private options;
77
- constructor(id: ID, options: LoadEntOptions<T>);
78
- apply(v: Viewer, _ent?: Ent): Promise<PrivacyResult>;
77
+ constructor(id: ID, options: LoadEntOptions<TEnt, TViewer>);
78
+ apply(v: TViewer, _ent?: Ent): Promise<PrivacyResult>;
79
79
  }
80
- export declare class AllowIfEntIsNotVisibleRule<T extends Ent> implements PrivacyPolicyRule {
80
+ export declare class AllowIfEntIsNotVisibleRule<TEnt extends Ent<TViewer>, TViewer extends Viewer> implements PrivacyPolicyRule {
81
81
  private id;
82
82
  private options;
83
- constructor(id: ID, options: LoadEntOptions<T>);
84
- apply(v: Viewer, _ent?: Ent): Promise<PrivacyResult>;
83
+ constructor(id: ID, options: LoadEntOptions<TEnt, TViewer>);
84
+ apply(v: TViewer, _ent?: Ent): Promise<PrivacyResult>;
85
85
  }
86
- export declare class AllowIfEntIsVisiblePolicy<T extends Ent> implements PrivacyPolicy {
86
+ export declare class AllowIfEntIsVisiblePolicy<TEnt extends Ent<TViewer>, TViewer extends Viewer> implements PrivacyPolicy<TEnt, TViewer> {
87
87
  private id;
88
88
  private options;
89
- constructor(id: ID, options: LoadEntOptions<T>);
89
+ constructor(id: ID, options: LoadEntOptions<TEnt, TViewer>);
90
90
  rules: {
91
- apply(_v: Viewer, _ent?: Ent | undefined): Promise<PrivacyResult>;
91
+ apply(_v: Viewer<Ent<any> | null, ID | null>, _ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
92
92
  }[];
93
93
  }
94
- export declare class DenyIfEntIsVisiblePolicy<T extends Ent> implements PrivacyPolicy {
94
+ export declare class DenyIfEntIsVisiblePolicy<TEnt extends Ent<TViewer>, TViewer extends Viewer> implements PrivacyPolicy<TEnt, TViewer> {
95
95
  private id;
96
96
  private options;
97
- constructor(id: ID, options: LoadEntOptions<T>);
97
+ constructor(id: ID, options: LoadEntOptions<TEnt, TViewer>);
98
98
  rules: {
99
- apply(_v: Viewer, _ent?: Ent | undefined): Promise<PrivacyResult>;
99
+ apply(_v: Viewer<Ent<any> | null, ID | null>, _ent?: Ent<Viewer<Ent<any> | null, ID | null>> | undefined): Promise<PrivacyResult>;
100
100
  }[];
101
101
  }
102
- export declare class DenyIfEntIsVisibleRule<T extends Ent> implements PrivacyPolicyRule {
102
+ export declare class DenyIfEntIsVisibleRule<TEnt extends Ent<TViewer>, TViewer extends Viewer> implements PrivacyPolicyRule<TEnt, TViewer> {
103
103
  private id;
104
104
  private options;
105
- constructor(id: ID, options: LoadEntOptions<T>);
106
- apply(v: Viewer, _ent?: Ent): Promise<PrivacyResult>;
105
+ constructor(id: ID, options: LoadEntOptions<TEnt, TViewer>);
106
+ apply(v: TViewer, _ent?: Ent): Promise<PrivacyResult>;
107
107
  }
108
- export declare class DenyIfEntIsNotVisibleRule<T extends Ent> implements PrivacyPolicyRule {
108
+ export declare class DenyIfEntIsNotVisibleRule<TEnt extends Ent<TViewer>, TViewer extends Viewer> implements PrivacyPolicyRule {
109
109
  private id;
110
110
  private options;
111
- constructor(id: ID, options: LoadEntOptions<T>);
112
- apply(v: Viewer, _ent?: Ent): Promise<PrivacyResult>;
111
+ constructor(id: ID, options: LoadEntOptions<TEnt, TViewer>);
112
+ apply(v: TViewer, _ent?: Ent): Promise<PrivacyResult>;
113
113
  }
114
114
  export declare class AllowIfEdgeExistsRule implements PrivacyPolicyRule {
115
115
  private id1;
@@ -3,15 +3,15 @@ import { AssocEdge } from "../ent";
3
3
  import { AssocEdgeCountLoaderFactory } from "../loaders/assoc_count_loader";
4
4
  import { AssocEdgeLoaderFactory } from "../loaders/assoc_edge_loader";
5
5
  import { EdgeQuery, BaseEdgeQuery, IDInfo } from "./query";
6
- export declare type EdgeQuerySource<TSource extends Ent, TDest extends Ent = Ent> = TSource | TSource[] | ID | ID[] | EdgeQuery<TDest, Ent, AssocEdge>;
7
- declare type loaderOptionsFunc = (type: string) => LoadEntOptions<Ent>;
8
- export declare abstract class AssocEdgeQueryBase<TSource extends Ent, TDest extends Ent, TEdge extends AssocEdge> extends BaseEdgeQuery<TSource, TDest, TEdge> implements EdgeQuery<TSource, TDest, TEdge> {
9
- viewer: Viewer;
10
- src: EdgeQuerySource<TSource, TDest>;
6
+ export declare type EdgeQuerySource<TSource extends Ent<TViewer>, TDest extends Ent<TViewer> = Ent<any>, TViewer extends Viewer = Viewer> = TSource | TSource[] | ID | ID[] | EdgeQuery<TDest, Ent, AssocEdge>;
7
+ declare type loaderOptionsFunc<TViewer extends Viewer> = (type: string) => LoadEntOptions<Ent, TViewer>;
8
+ export declare abstract class AssocEdgeQueryBase<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TEdge extends AssocEdge, TViewer extends Viewer = Viewer> extends BaseEdgeQuery<TSource, TDest, TEdge> implements EdgeQuery<TSource, TDest, TEdge> {
9
+ viewer: TViewer;
10
+ src: EdgeQuerySource<TSource, TDest, TViewer>;
11
11
  private countLoaderFactory;
12
12
  private dataLoaderFactory;
13
13
  private options;
14
- constructor(viewer: Viewer, src: EdgeQuerySource<TSource, TDest>, countLoaderFactory: AssocEdgeCountLoaderFactory, dataLoaderFactory: AssocEdgeLoaderFactory<TEdge>, options: LoadEntOptions<TDest> | loaderOptionsFunc);
14
+ constructor(viewer: TViewer, src: EdgeQuerySource<TSource, TDest, TViewer>, countLoaderFactory: AssocEdgeCountLoaderFactory, dataLoaderFactory: AssocEdgeLoaderFactory<TEdge>, options: LoadEntOptions<TDest, TViewer> | loaderOptionsFunc<TViewer>);
15
15
  private isEdgeQuery;
16
16
  abstract sourceEnt(id: ID): Promise<Ent | null>;
17
17
  private getSingleID;
@@ -1,17 +1,17 @@
1
1
  import { Data, Ent, ID, EdgeQueryableDataOptions, LoadEntOptions, Viewer, LoaderFactory, ConfigurableLoaderFactory } from "../base";
2
2
  import { BaseEdgeQuery, IDInfo, EdgeQuery } from "./query";
3
- export interface CustomEdgeQueryOptions<TSource extends Ent, TDest extends Ent> {
3
+ export interface CustomEdgeQueryOptions<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
4
4
  src: TSource | ID;
5
5
  countLoaderFactory: LoaderFactory<ID, number>;
6
6
  dataLoaderFactory: ConfigurableLoaderFactory<ID, Data[]>;
7
- options: LoadEntOptions<TDest>;
7
+ options: LoadEntOptions<TDest, TViewer>;
8
8
  sortColumn?: string;
9
9
  }
10
- export declare abstract class CustomEdgeQueryBase<TSource extends Ent, TDest extends Ent> extends BaseEdgeQuery<TSource, TDest, Data> implements EdgeQuery<TSource, TDest, Data> {
11
- viewer: Viewer;
10
+ export declare abstract class CustomEdgeQueryBase<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> extends BaseEdgeQuery<TSource, TDest, Data> implements EdgeQuery<TSource, TDest, Data> {
11
+ viewer: TViewer;
12
12
  private options;
13
13
  private id;
14
- constructor(viewer: Viewer, options: CustomEdgeQueryOptions<TSource, TDest>);
14
+ constructor(viewer: TViewer, options: CustomEdgeQueryOptions<TSource, TDest, TViewer>);
15
15
  abstract sourceEnt(id: ID): Promise<Ent | null>;
16
16
  private idVisible;
17
17
  queryRawCount(): Promise<number>;
@@ -41,7 +41,7 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
41
41
  private idMap;
42
42
  private idsToFetch;
43
43
  constructor(viewer: Viewer, sortCol: string);
44
- getPrivacyPolicy(): PrivacyPolicy<Ent>;
44
+ getPrivacyPolicy(): PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
45
45
  abstract sourceEnt(id: ID): Promise<Ent | null>;
46
46
  first(n: number, after?: string): this;
47
47
  last(n: number, before?: string): this;
package/core/viewer.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ID, Ent, Viewer, Context } from "./base";
2
2
  export declare class LoggedOutViewer implements Viewer {
3
- context?: Context | undefined;
4
- constructor(context?: Context | undefined);
3
+ context?: Context<Viewer<Ent<any> | null, ID | null>> | undefined;
4
+ constructor(context?: Context<Viewer<Ent<any> | null, ID | null>> | undefined);
5
5
  viewerID: null;
6
6
  viewer(): Promise<null>;
7
7
  instanceKey(): string;
@@ -18,6 +18,6 @@ export declare class IDViewer implements Viewer {
18
18
  constructor(viewerID: ID, opts?: Partial<IDViewerOptions>);
19
19
  constructor(opts: IDViewerOptions);
20
20
  setContext(ctx: Context): this;
21
- viewer(): Promise<Ent | null>;
21
+ viewer(): Promise<Ent<Viewer<Ent<any> | null, ID | null>> | null>;
22
22
  instanceKey(): string;
23
23
  }
@@ -1,30 +1,30 @@
1
1
  import { EdgeQuery, PaginationInfo } from "../../core/query/query";
2
- import { Data, Ent, Viewer } from "../../core/base";
2
+ import { Data, Ent, ID, Viewer } from "../../core/base";
3
3
  export interface GraphQLEdge<T extends Data> {
4
4
  edge: T;
5
5
  node: Ent;
6
6
  cursor: string;
7
7
  }
8
- interface edgeQueryCtr<T extends Ent, TEdge extends Data> {
9
- (v: Viewer, src: T): EdgeQuery<T, Ent, TEdge>;
8
+ interface edgeQueryCtr<T extends Ent, TEdge extends Data, TViewer extends Viewer> {
9
+ (v: TViewer, src: T): EdgeQuery<T, Ent, TEdge>;
10
10
  }
11
- interface edgeQueryCtr2<T extends Ent, TEdge extends Data> {
12
- (v: Viewer): EdgeQuery<T, Ent, TEdge>;
11
+ interface edgeQueryCtr2<T extends Ent, TEdge extends Data, TViewer extends Viewer> {
12
+ (v: TViewer): EdgeQuery<T, Ent, TEdge>;
13
13
  }
14
- export declare class GraphQLEdgeConnection<TSource extends Ent, TEdge extends Data> {
14
+ export declare class GraphQLEdgeConnection<TSource extends Ent, TEdge extends Data, TViewer extends Viewer = Viewer> {
15
15
  query: EdgeQuery<TSource, Ent, TEdge>;
16
16
  private results;
17
17
  private viewer;
18
18
  private source?;
19
19
  private args?;
20
- constructor(viewer: Viewer, source: TSource, getQuery: edgeQueryCtr<TSource, TEdge>, args?: Data);
21
- constructor(viewer: Viewer, getQuery: edgeQueryCtr2<TSource, TEdge>, args?: Data);
20
+ constructor(viewer: TViewer, source: TSource, getQuery: edgeQueryCtr<TSource, TEdge, TViewer>, args?: Data);
21
+ constructor(viewer: TViewer, getQuery: edgeQueryCtr2<TSource, TEdge, TViewer>, args?: Data);
22
22
  first(limit: number, cursor?: string): void;
23
23
  last(limit: number, cursor?: string): void;
24
24
  modifyQuery(fn: (query: EdgeQuery<TSource, Ent, TEdge>) => EdgeQuery<TSource, Ent, TEdge>): void;
25
25
  queryTotalCount(): Promise<number>;
26
26
  queryEdges(): Promise<GraphQLEdge<TEdge>[]>;
27
- queryNodes(): Promise<Ent[]>;
27
+ queryNodes(): Promise<Ent<Viewer<Ent<any> | null, ID | null>>[]>;
28
28
  private defaultPageInfo;
29
29
  queryPageInfo(): Promise<PaginationInfo>;
30
30
  private queryData;
@@ -1,4 +1,4 @@
1
1
  import { GraphQLObjectType } from "graphql";
2
2
  import { RequestContext } from "../../core/context";
3
3
  import { PaginationInfo } from "../../core/query/query";
4
- export declare const GraphQLPageInfo: GraphQLObjectType<PaginationInfo, RequestContext>;
4
+ export declare const GraphQLPageInfo: GraphQLObjectType<PaginationInfo, RequestContext<import("../..").Viewer<import("../..").Ent<any> | null, import("../..").ID | null>>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snowtop/ent",
3
- "version": "0.1.0-alpha12",
3
+ "version": "0.1.0-alpha15",
4
4
  "description": "snowtop ent framework",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -24,6 +24,7 @@ declare type ProcessedSchema = Omit<Schema, "edges" | "actions" | "edgeGroups" |
24
24
  assocEdgeGroups: ProcessedAssocEdgeGroup[];
25
25
  fields: ProcessedField[];
26
26
  schemaPath?: string;
27
+ patternNames?: string[];
27
28
  };
28
29
  declare type ProcessedAssocEdgeGroup = Omit<AssocEdgeGroup, "edgeAction"> & {
29
30
  edgeAction?: OutputAction;
@@ -38,6 +39,7 @@ interface ProcessedPattern {
38
39
  name: string;
39
40
  assocEdges: ProcessedAssocEdge[];
40
41
  fields: ProcessedField[];
42
+ disableMixin?: boolean;
41
43
  }
42
44
  declare type ProcessedType = Omit<Type, "subFields" | "listElemType" | "unionFields"> & {
43
45
  subFields?: ProcessedField[];
@@ -130,6 +130,7 @@ function processPattern(patterns, pattern, processedSchema) {
130
130
  name: pattern.name,
131
131
  assocEdges: edges,
132
132
  fields: fields,
133
+ disableMixin: pattern.disableMixin,
133
134
  };
134
135
  }
135
136
  else {
@@ -202,9 +203,11 @@ function parseSchema(potentialSchemas) {
202
203
  };
203
204
  // let's put patterns first just so we have id, created_at, updated_at first
204
205
  // ¯\_(ツ)_/¯
206
+ let patternNames = [];
205
207
  if (schema.patterns) {
206
208
  for (const pattern of schema.patterns) {
207
209
  const ret = processPattern(patterns, pattern, processedSchema);
210
+ patternNames.push(pattern.name);
208
211
  if (ret.transformsSelect) {
209
212
  if (processedSchema.transformsSelect) {
210
213
  throw new Error(`can only have one pattern which transforms default querying behavior`);
@@ -221,6 +224,7 @@ function parseSchema(potentialSchemas) {
221
224
  }
222
225
  const fields = processFields(schema.fields);
223
226
  processedSchema.fields.push(...fields);
227
+ processedSchema.patternNames = patternNames;
224
228
  if (schema.edges) {
225
229
  const edges = processEdges(schema.edges);
226
230
  processedSchema.assocEdges.push(...edges);
@@ -66,6 +66,7 @@ let nodeFieldsWithTZ = {
66
66
  exports.Node = {
67
67
  name: "node",
68
68
  fields: nodeFields,
69
+ disableMixin: true,
69
70
  };
70
71
  // Ent schema. has Node Pattern by default.
71
72
  // exists just to have less typing and easier for clients to implement
@@ -95,6 +96,7 @@ class EntSchemaWithTZ {
95
96
  // default schema added
96
97
  name: "nodeWithTZ",
97
98
  fields: nodeFieldsWithTZ,
99
+ disableMixin: true,
98
100
  },
99
101
  ];
100
102
  this.fields = cfg.fields;
@@ -131,6 +133,7 @@ class BaseEntSchemaWithTZ {
131
133
  // default schema added
132
134
  name: "nodeWithTZ",
133
135
  fields: nodeFieldsWithTZ,
136
+ disableMixin: true,
134
137
  },
135
138
  ];
136
139
  }
@@ -69,9 +69,10 @@ export declare type Edge = AssocEdge;
69
69
  export interface Pattern {
70
70
  name: string;
71
71
  fields: FieldMap | Field[];
72
+ disableMixin?: boolean;
72
73
  edges?: Edge[];
73
74
  transformRead?: () => Clause;
74
- transformWrite?: <T extends Ent>(stmt: UpdateOperation<T>) => TransformedUpdateOperation<T> | undefined;
75
+ transformWrite?: <T extends Ent>(stmt: UpdateOperation<T>) => TransformedUpdateOperation<T> | null;
75
76
  transformsDelete?: boolean;
76
77
  transformsInsert?: boolean;
77
78
  transformsUpdate?: boolean;
@@ -83,14 +84,14 @@ export declare enum SQLStatementOperation {
83
84
  }
84
85
  export interface UpdateOperation<T extends Ent> {
85
86
  op: SQLStatementOperation;
86
- existingEnt?: T;
87
+ existingEnt: T | null;
87
88
  viewer: Viewer;
88
89
  data?: Map<string, any>;
89
90
  }
90
91
  export interface TransformedUpdateOperation<T extends Ent> {
91
92
  op: SQLStatementOperation;
92
93
  data?: Data;
93
- existingEnt?: T;
94
+ existingEnt?: T | null;
94
95
  }
95
96
  export declare enum DBType {
96
97
  UUID = "UUID",
@@ -203,7 +204,7 @@ interface objectLoaderOptions {
203
204
  instanceKey?: string;
204
205
  }
205
206
  export declare function getObjectLoaderProperties(value: SchemaInputType, tableName: string): objectLoaderOptions | undefined;
206
- export declare function getTransformedUpdateOp<T extends Ent>(value: SchemaInputType, stmt: UpdateOperation<T>): TransformedUpdateOperation<T> | undefined;
207
+ export declare function getTransformedUpdateOp<T extends Ent>(value: SchemaInputType, stmt: UpdateOperation<T>): TransformedUpdateOperation<T> | null;
207
208
  export declare enum ActionOperation {
208
209
  Create = 1,
209
210
  Edit = 2,
package/schema/schema.js CHANGED
@@ -178,13 +178,14 @@ exports.getObjectLoaderProperties = getObjectLoaderProperties;
178
178
  function getTransformedUpdateOp(value, stmt) {
179
179
  const schema = getSchema(value);
180
180
  if (!schema.patterns) {
181
- return;
181
+ return null;
182
182
  }
183
183
  for (const p of schema.patterns) {
184
184
  if (p.transformWrite) {
185
185
  return p.transformWrite(stmt);
186
186
  }
187
187
  }
188
+ return null;
188
189
  }
189
190
  exports.getTransformedUpdateOp = getTransformedUpdateOp;
190
191
  // this maps to ActionOperation in ent/action.go
@@ -68,19 +68,22 @@ export declare function getBuilderSchemaTZFromFields<T extends Ent>(fields: Fiel
68
68
  export declare function getSchemaName(value: BuilderSchema<Ent>): string;
69
69
  export declare function getTableName(value: BuilderSchema<Ent>): string;
70
70
  export declare function getFieldInfo(value: BuilderSchema<Ent>): FieldInfoMap;
71
- export declare class SimpleBuilder<T extends Ent> implements Builder<T> {
71
+ declare type MaybeNull<T extends Ent> = T | null;
72
+ declare type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
73
+ export declare class SimpleBuilder<T extends Ent, TExistingEnt extends TMaybleNullableEnt<T> = MaybeNull<T>> implements Builder<T> {
72
74
  viewer: Viewer;
73
75
  private schema;
74
76
  operation: WriteOperation;
75
- existingEnt: T | undefined;
77
+ existingEnt: TExistingEnt;
76
78
  ent: EntConstructor<T>;
77
79
  placeholderID: ID;
78
- orchestrator: Orchestrator<T, Data>;
80
+ orchestrator: Orchestrator<T, Data, Viewer>;
79
81
  fields: Map<string, any>;
80
82
  nodeType: string;
81
- constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation?: WriteOperation, existingEnt?: T | undefined, action?: Action<T, SimpleBuilder<T>, Data> | undefined);
83
+ constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation, existingEnt: TExistingEnt, action?: Action<T, SimpleBuilder<T>, Viewer, Data> | undefined);
84
+ getInput(): Data;
82
85
  updateInput(input: Data): void;
83
- build(): Promise<Changeset<T>>;
86
+ build(): Promise<Changeset>;
84
87
  editedEnt(): Promise<T | null>;
85
88
  editedEntX(): Promise<T>;
86
89
  save(): Promise<void>;
@@ -91,18 +94,18 @@ export declare class SimpleBuilder<T extends Ent> implements Builder<T> {
91
94
  interface viewerEntLoadFunc {
92
95
  (data: Data): Viewer | Promise<Viewer>;
93
96
  }
94
- export declare class SimpleAction<T extends Ent> implements Action<T, SimpleBuilder<T>, Data> {
97
+ export declare class SimpleAction<T extends Ent, TExistingEnt extends TMaybleNullableEnt<T> = MaybeNull<T>> implements Action<T, SimpleBuilder<T, TExistingEnt>, Viewer, Data, TExistingEnt> {
95
98
  viewer: Viewer;
96
99
  private fields;
97
- builder: SimpleBuilder<T>;
98
- validators: Validator<SimpleBuilder<T>, Data>[];
99
- triggers: Trigger<SimpleBuilder<T>, Data>[];
100
- observers: Observer<SimpleBuilder<T>, Data>[];
100
+ builder: SimpleBuilder<T, TExistingEnt>;
101
+ validators: Validator<T, SimpleBuilder<T>>[];
102
+ triggers: Trigger<T, SimpleBuilder<T>>[];
103
+ observers: Observer<T, SimpleBuilder<T>>[];
101
104
  viewerForEntLoad: viewerEntLoadFunc | undefined;
102
- constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation?: WriteOperation, existingEnt?: T | undefined);
103
- getPrivacyPolicy(): PrivacyPolicy<Ent>;
105
+ constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation | undefined, existingEnt: TExistingEnt);
106
+ getPrivacyPolicy(): PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
104
107
  getInput(): Data;
105
- changeset(): Promise<Changeset<T>>;
108
+ changeset(): Promise<Changeset>;
106
109
  valid(): Promise<boolean>;
107
110
  validX(): Promise<void>;
108
111
  save(): Promise<T | null>;
@@ -145,7 +145,7 @@ function getFieldInfo(value) {
145
145
  exports.getFieldInfo = getFieldInfo;
146
146
  // reuses orchestrator and standard things
147
147
  class SimpleBuilder {
148
- constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt = undefined, action) {
148
+ constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt, action) {
149
149
  this.viewer = viewer;
150
150
  this.schema = schema;
151
151
  this.operation = operation;
@@ -207,6 +207,13 @@ class SimpleBuilder {
207
207
  updateInput: this.updateInput.bind(this),
208
208
  });
209
209
  }
210
+ getInput() {
211
+ let ret = {};
212
+ for (const [k, v] of this.fields) {
213
+ ret[k] = v;
214
+ }
215
+ return ret;
216
+ }
210
217
  updateInput(input) {
211
218
  const knownFields = (0, schema_1.getFields)(this.schema);
212
219
  for (const k in input) {
@@ -247,7 +254,7 @@ class SimpleBuilder {
247
254
  }
248
255
  exports.SimpleBuilder = SimpleBuilder;
249
256
  class SimpleAction {
250
- constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt = undefined) {
257
+ constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt) {
251
258
  this.viewer = viewer;
252
259
  this.fields = fields;
253
260
  this.validators = [];
@@ -28,6 +28,6 @@ export interface ContactCreateInput {
28
28
  emailAddress: string;
29
29
  userID: ID;
30
30
  }
31
- export declare function getContactBuilder(viewer: Viewer, input: ContactCreateInput): SimpleBuilder<FakeContact>;
31
+ export declare function getContactBuilder(viewer: Viewer, input: ContactCreateInput): SimpleBuilder<FakeContact, null>;
32
32
  export declare function createContact(viewer: Viewer, input: ContactCreateInput): Promise<void>;
33
33
  export declare const contactLoader: ObjectLoaderFactory<unknown>;
@@ -9,6 +9,7 @@ const const_1 = require("./const");
9
9
  const test_db_1 = require("../db/test_db");
10
10
  const loaders_1 = require("../../core/loaders");
11
11
  const convert_1 = require("../../core/convert");
12
+ const action_1 = require("../../action");
12
13
  class FakeContact {
13
14
  constructor(viewer, data) {
14
15
  this.viewer = viewer;
@@ -77,7 +78,7 @@ function getContactBuilder(viewer, input) {
77
78
  //To lock in the value of Date now incase of advanceTo/advanceBy
78
79
  m.set("createdAt", new Date());
79
80
  m.set("updatedAt", new Date());
80
- return new builder_1.SimpleBuilder(viewer, exports.FakeContactSchema, m);
81
+ return new builder_1.SimpleBuilder(viewer, exports.FakeContactSchema, m, action_1.WriteOperation.Insert, null);
81
82
  }
82
83
  exports.getContactBuilder = getContactBuilder;
83
84
  async function createContact(viewer, input) {
@@ -31,5 +31,5 @@ export interface EventCreateInput {
31
31
  description?: string | null;
32
32
  userID: ID;
33
33
  }
34
- export declare function getEventBuilder(viewer: Viewer, input: EventCreateInput): SimpleBuilder<FakeEvent>;
34
+ export declare function getEventBuilder(viewer: Viewer, input: EventCreateInput): SimpleBuilder<FakeEvent, null>;
35
35
  export declare function createEvent(viewer: Viewer, input: EventCreateInput): Promise<void>;
@@ -9,6 +9,7 @@ const const_1 = require("./const");
9
9
  const test_db_1 = require("../db/test_db");
10
10
  const loaders_1 = require("../../core/loaders");
11
11
  const convert_1 = require("../../core/convert");
12
+ const action_1 = require("../../action");
12
13
  class FakeEvent {
13
14
  constructor(viewer, data) {
14
15
  this.viewer = viewer;
@@ -86,7 +87,7 @@ function getEventBuilder(viewer, input) {
86
87
  for (const key in input) {
87
88
  m.set(key, input[key]);
88
89
  }
89
- return new builder_1.SimpleBuilder(viewer, exports.FakeEventSchema, m);
90
+ return new builder_1.SimpleBuilder(viewer, exports.FakeEventSchema, m, action_1.WriteOperation.Insert, null);
90
91
  }
91
92
  exports.getEventBuilder = getEventBuilder;
92
93
  async function createEvent(viewer, input) {
@@ -40,8 +40,8 @@ export interface UserCreateInput {
40
40
  password: string | null;
41
41
  }
42
42
  export declare type UserEditInput = Partial<UserCreateInput>;
43
- export declare function getUserBuilder(viewer: Viewer, input: UserCreateInput): import("../builder").SimpleBuilder<FakeUser>;
44
- export declare function getUserAction(viewer: Viewer, input: UserCreateInput): SimpleAction<FakeUser>;
43
+ export declare function getUserBuilder(viewer: Viewer, input: UserCreateInput): import("../builder").SimpleBuilder<FakeUser, null>;
44
+ export declare function getUserAction(viewer: Viewer, input: UserCreateInput): SimpleAction<FakeUser, null>;
45
45
  export declare function createUser(viewer: Viewer, input: UserCreateInput): Promise<FakeUser>;
46
46
  export declare const userLoader: ObjectLoaderFactory<unknown>;
47
47
  export declare const userEmailLoader: ObjectLoaderFactory<unknown>;
@@ -11,6 +11,7 @@ const viewer_1 = require("../../core/viewer");
11
11
  const test_db_1 = require("../db/test_db");
12
12
  const loaders_1 = require("../../core/loaders");
13
13
  const convert_1 = require("../../core/convert");
14
+ const action_1 = require("../../action");
14
15
  class ViewerWithAccessToken extends viewer_1.IDViewer {
15
16
  constructor(viewerID, opts) {
16
17
  super(viewerID, opts);
@@ -110,7 +111,7 @@ function getUserAction(viewer, input) {
110
111
  for (const key in input) {
111
112
  m.set(key, input[key]);
112
113
  }
113
- const action = new builder_1.SimpleAction(viewer, exports.FakeUserSchema, m);
114
+ const action = new builder_1.SimpleAction(viewer, exports.FakeUserSchema, m, action_1.WriteOperation.Insert, null);
114
115
  action.viewerForEntLoad = (data) => {
115
116
  // load the created ent using a VC of the newly created user.
116
117
  return new viewer_1.IDViewer(data.id);
@@ -53,7 +53,7 @@ export declare class UserToFriendRequestsQuery extends AssocEdgeQueryBase<FakeUs
53
53
  }
54
54
  export declare class UserToIncomingFriendRequestsQuery extends AssocEdgeQueryBase<FakeUser, FakeUser, AssocEdge> {
55
55
  constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>);
56
- getPrivacyPolicy(): import("../../core/base").PrivacyPolicy<Ent>;
56
+ getPrivacyPolicy(): import("../../core/base").PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
57
57
  sourceEnt(id: ID): Promise<FakeUser | null>;
58
58
  static query(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>): UserToIncomingFriendRequestsQuery;
59
59
  queryContacts(): UserToContactsQuery;
@@ -90,7 +90,7 @@ export declare class UserToEventsInNextWeekQuery extends CustomEdgeQueryBase<Fak
90
90
  constructor(viewer: Viewer, src: ID | FakeUser);
91
91
  static query(viewer: Viewer, src: FakeUser | ID): UserToEventsInNextWeekQuery;
92
92
  sourceEnt(id: ID): Promise<FakeUser | null>;
93
- getPrivacyPolicy(): import("../../core/base").PrivacyPolicy<Ent>;
93
+ getPrivacyPolicy(): import("../../core/base").PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
94
94
  }
95
95
  export declare class UserToFollowingQuery extends AssocEdgeQueryBase<FakeUser, Ent, AssocEdge> {
96
96
  constructor(viewer: Viewer, src: EdgeQuerySource<FakeUser, FakeUser>);
@@ -1,4 +1,4 @@
1
- import { Ent } from "../core/base";
1
+ import { Ent, Viewer } from "../core/base";
2
2
  import { Builder } from "./../action";
3
3
  export declare class FakeLogger {
4
4
  private static logs;
@@ -8,6 +8,6 @@ export declare class FakeLogger {
8
8
  static contains(line: string): boolean;
9
9
  static clear(): void;
10
10
  }
11
- export declare class EntCreationObserver<T extends Ent> {
12
- observe(builder: Builder<T>): Promise<void>;
11
+ export declare class EntCreationObserver<TEnt extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
12
+ observe(builder: Builder<TEnt, TViewer>): Promise<void>;
13
13
  }