@snowtop/ent 0.1.0-alpha10 → 0.1.0-alpha14

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 (43) 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 +23 -16
  6. package/action/orchestrator.js +31 -14
  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/schema/schema.d.ts +15 -5
  25. package/schema/schema.js +16 -4
  26. package/scripts/move_generated.d.ts +1 -0
  27. package/scripts/move_generated.js +142 -0
  28. package/scripts/transform_code.js +1 -2
  29. package/scripts/transform_schema.js +1 -3
  30. package/testutils/builder.d.ts +19 -13
  31. package/testutils/builder.js +43 -20
  32. package/testutils/fake_data/fake_contact.d.ts +1 -1
  33. package/testutils/fake_data/fake_contact.js +2 -1
  34. package/testutils/fake_data/fake_event.d.ts +1 -1
  35. package/testutils/fake_data/fake_event.js +2 -1
  36. package/testutils/fake_data/fake_user.d.ts +2 -2
  37. package/testutils/fake_data/fake_user.js +2 -1
  38. package/testutils/fake_data/user_query.d.ts +2 -2
  39. package/testutils/fake_log.d.ts +3 -3
  40. package/tsc/ast.d.ts +1 -0
  41. package/tsc/ast.js +24 -1
  42. package/tsc/compilerOptions.d.ts +2 -1
  43. package/tsc/compilerOptions.js +6 -1
@@ -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;
@@ -1,19 +1,22 @@
1
1
  import { ID, Data, Ent, Viewer, EntConstructor, LoadEntOptions } from "../core/base";
2
2
  import { AssocEdgeInputOptions, DataOperation } from "../core/ent";
3
- import { SchemaInputType } from "../schema/schema";
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;
19
+ fieldInfo: FieldInfoMap;
17
20
  }
18
21
  interface edgeInputDataOpts {
19
22
  edgeType: string;
@@ -28,7 +31,7 @@ export declare enum edgeDirection {
28
31
  inboundEdge = 0,
29
32
  outboundEdge = 1
30
33
  }
31
- 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>> {
32
35
  private options;
33
36
  private edgeSet;
34
37
  private edges;
@@ -42,13 +45,14 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data> {
42
45
  private defaultFieldsByFieldName;
43
46
  private defaultFieldsByTSName;
44
47
  private actualOperation;
45
- private existingEnt?;
48
+ private existingEnt;
46
49
  private disableTransformations;
47
- constructor(options: OrchestratorOptions<TEnt, TData>);
50
+ private memoizedGetFields;
51
+ constructor(options: OrchestratorOptions<TEnt, TViewer, TInput, TExistingEnt>);
48
52
  private addEdge;
49
53
  setDisableTransformations(val: boolean): void;
50
- addInboundEdge<T2 extends Ent>(id1: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
51
- 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;
52
56
  removeInboundEdge(id1: ID, edgeType: string): void;
53
57
  removeOutboundEdge(id2: ID, edgeType: string): void;
54
58
  getInputEdges(edgeType: string, op: WriteOperation): EdgeInputData[];
@@ -60,12 +64,15 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data> {
60
64
  private getEntForPrivacyPolicyImpl;
61
65
  private getSQLStatementOperation;
62
66
  private getWriteOpForSQLStamentOp;
63
- getPossibleUnsafeEntForPrivacy(): Promise<TEnt | undefined>;
67
+ getPossibleUnsafeEntForPrivacy(): Promise<TEnt>;
68
+ getEditedData(): Promise<Data>;
64
69
  private getFieldsInfo;
65
70
  private validate;
66
71
  private triggers;
67
72
  private validators;
68
73
  private isBuilder;
74
+ private getInputKey;
75
+ private getStorageKey;
69
76
  private getFieldsWithDefaultValues;
70
77
  private hasData;
71
78
  private transformFieldValue;
@@ -78,16 +85,16 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data> {
78
85
  editedEnt(): Promise<TEnt | null>;
79
86
  editedEntX(): Promise<TEnt>;
80
87
  }
81
- export declare class EntChangeset<T extends Ent> implements Changeset<T> {
88
+ export declare class EntChangeset<T extends Ent> implements Changeset {
82
89
  viewer: Viewer;
83
90
  readonly placeholderID: ID;
84
91
  readonly ent: EntConstructor<T>;
85
92
  operations: DataOperation[];
86
- dependencies?: Map<ID, Builder<Ent>> | undefined;
87
- 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;
88
95
  private options?;
89
96
  private _executor;
90
- 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);
91
98
  executor(): Executor;
92
99
  }
93
100
  export {};
@@ -1,13 +1,16 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.EntChangeset = exports.Orchestrator = exports.edgeDirection = void 0;
4
7
  const ent_1 = require("../core/ent");
5
8
  const schema_1 = require("../schema/schema");
6
9
  const action_1 = require("../action");
7
- const camel_case_1 = require("camel-case");
8
10
  const privacy_1 = require("../core/privacy");
9
11
  const executor_1 = require("./executor");
10
12
  const logger_1 = require("../core/logger");
13
+ const memoizee_1 = __importDefault(require("memoizee"));
11
14
  var edgeDirection;
12
15
  (function (edgeDirection) {
13
16
  edgeDirection[edgeDirection["inboundEdge"] = 0] = "inboundEdge";
@@ -63,6 +66,7 @@ class Orchestrator {
63
66
  this.viewer = options.viewer;
64
67
  this.actualOperation = this.options.operation;
65
68
  this.existingEnt = this.options.builder.existingEnt;
69
+ this.memoizedGetFields = (0, memoizee_1.default)(this.getFieldsInfo.bind(this));
66
70
  }
67
71
  addEdge(edge, op) {
68
72
  this.edgeSet.add(edge.edgeType);
@@ -269,9 +273,18 @@ class Orchestrator {
269
273
  if (this.actualOperation !== action_1.WriteOperation.Insert) {
270
274
  return this.existingEnt;
271
275
  }
272
- const { editedData } = await this.getFieldsInfo();
276
+ const { editedData } = await this.memoizedGetFields();
273
277
  return this.getEntForPrivacyPolicyImpl(editedData);
274
278
  }
279
+ // this gets the fields that were explicitly set plus any default or transformed values
280
+ // mainly exists to get default fields e.g. default id to be used in triggers
281
+ // NOTE: this API may change in the future
282
+ // doesn't work to get ids for autoincrement keys
283
+ async getEditedData() {
284
+ const { editedData } = await this.memoizedGetFields();
285
+ return editedData;
286
+ }
287
+ // Note: this is memoized. call memoizedGetFields instead
275
288
  async getFieldsInfo() {
276
289
  const action = this.options.action;
277
290
  const builder = this.options.builder;
@@ -290,7 +303,7 @@ class Orchestrator {
290
303
  throw new Error(`existing ent required with operation ${this.actualOperation}`);
291
304
  }
292
305
  }
293
- const { schemaFields, editedData } = await this.getFieldsInfo();
306
+ const { schemaFields, editedData } = await this.memoizedGetFields();
294
307
  const action = this.options.action;
295
308
  const builder = this.options.builder;
296
309
  // this runs in following phases:
@@ -348,6 +361,12 @@ class Orchestrator {
348
361
  isBuilder(val) {
349
362
  return val.placeholderID !== undefined;
350
363
  }
364
+ getInputKey(k) {
365
+ return this.options.fieldInfo[k].inputKey;
366
+ }
367
+ getStorageKey(k) {
368
+ return this.options.fieldInfo[k].dbCol;
369
+ }
351
370
  async getFieldsWithDefaultValues(builder, schemaFields, editedFields, action) {
352
371
  let data = {};
353
372
  let defaultData = {};
@@ -357,7 +376,7 @@ class Orchestrator {
357
376
  // if action transformations. always do it
358
377
  // if disable transformations set, don't do schema transform and just do the right thing
359
378
  // else apply schema tranformation if it exists
360
- let transformed;
379
+ let transformed = null;
361
380
  if (action?.transformWrite) {
362
381
  transformed = await action.transformWrite({
363
382
  viewer: builder.viewer,
@@ -386,9 +405,8 @@ class Orchestrator {
386
405
  if (field.format) {
387
406
  val = field.format(transformed.data[k]);
388
407
  }
389
- let dbKey = (0, schema_1.getStorageKey)(field, k);
390
- data[dbKey] = val;
391
- this.defaultFieldsByTSName[(0, camel_case_1.camelCase)(k)] = val;
408
+ data[this.getStorageKey(k)] = val;
409
+ this.defaultFieldsByTSName[this.getInputKey(k)] = val;
392
410
  // hmm do we need this?
393
411
  // TODO how to do this for local tests?
394
412
  // this.defaultFieldsByFieldName[k] = val;
@@ -396,6 +414,7 @@ class Orchestrator {
396
414
  }
397
415
  this.actualOperation = this.getWriteOpForSQLStamentOp(transformed.op);
398
416
  if (transformed.existingEnt) {
417
+ // @ts-ignore
399
418
  this.existingEnt = transformed.existingEnt;
400
419
  }
401
420
  }
@@ -404,7 +423,7 @@ class Orchestrator {
404
423
  for (const [fieldName, field] of schemaFields) {
405
424
  let value = editedFields.get(fieldName);
406
425
  let defaultValue = undefined;
407
- let dbKey = (0, schema_1.getStorageKey)(field, fieldName);
426
+ let dbKey = this.getStorageKey(fieldName);
408
427
  if (value === undefined) {
409
428
  if (this.actualOperation === action_1.WriteOperation.Insert) {
410
429
  if (field.defaultToViewerOnCreate && field.defaultValueOnCreate) {
@@ -432,8 +451,7 @@ class Orchestrator {
432
451
  updateInput = true;
433
452
  defaultData[dbKey] = defaultValue;
434
453
  this.defaultFieldsByFieldName[fieldName] = defaultValue;
435
- // TODO related to #510. we need this logic to be consistent so do this all in TypeScript or get it from go somehow
436
- this.defaultFieldsByTSName[(0, camel_case_1.camelCase)(fieldName)] = defaultValue;
454
+ this.defaultFieldsByTSName[this.getInputKey(fieldName)] = defaultValue;
437
455
  }
438
456
  }
439
457
  // if there's data changing, add data
@@ -494,8 +512,7 @@ class Orchestrator {
494
512
  }
495
513
  }
496
514
  if (field.format) {
497
- // TODO this could be async e.g. password. handle this better
498
- value = await Promise.resolve(field.format(value));
515
+ value = await field.format(value);
499
516
  }
500
517
  }
501
518
  return value;
@@ -514,7 +531,7 @@ class Orchestrator {
514
531
  // null allowed
515
532
  value = this.defaultFieldsByFieldName[fieldName];
516
533
  }
517
- let dbKey = (0, schema_1.getStorageKey)(field, fieldName);
534
+ let dbKey = this.getStorageKey(fieldName);
518
535
  value = await this.transformFieldValue(fieldName, field, dbKey, value);
519
536
  if (value !== undefined) {
520
537
  data[dbKey] = value;
@@ -527,7 +544,7 @@ class Orchestrator {
527
544
  for (const fieldName in this.defaultFieldsByFieldName) {
528
545
  const defaultValue = this.defaultFieldsByFieldName[fieldName];
529
546
  let field = schemaFields.get(fieldName);
530
- let dbKey = (0, schema_1.getStorageKey)(field, fieldName);
547
+ let dbKey = this.getStorageKey(fieldName);
531
548
  // no value, let's just default
532
549
  if (data[dbKey] === undefined) {
533
550
  const value = await this.transformFieldValue(fieldName, field, dbKey, defaultValue);
@@ -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;