@snowtop/ent 0.1.0-alpha13 → 0.1.0-alpha131

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 (173) hide show
  1. package/action/action.d.ts +33 -29
  2. package/action/action.js +22 -7
  3. package/action/executor.d.ts +3 -3
  4. package/action/executor.js +8 -3
  5. package/action/experimental_action.d.ts +32 -22
  6. package/action/experimental_action.js +35 -9
  7. package/action/index.d.ts +2 -0
  8. package/action/index.js +7 -1
  9. package/action/orchestrator.d.ts +32 -15
  10. package/action/orchestrator.js +249 -53
  11. package/action/privacy.d.ts +2 -2
  12. package/action/relative_value.d.ts +47 -0
  13. package/action/relative_value.js +125 -0
  14. package/action/transaction.d.ts +10 -0
  15. package/action/transaction.js +23 -0
  16. package/auth/auth.d.ts +1 -1
  17. package/core/base.d.ts +61 -37
  18. package/core/base.js +7 -1
  19. package/core/clause.d.ts +85 -40
  20. package/core/clause.js +375 -64
  21. package/core/config.d.ts +12 -1
  22. package/core/config.js +7 -1
  23. package/core/const.d.ts +3 -0
  24. package/core/const.js +6 -0
  25. package/core/context.d.ts +6 -4
  26. package/core/context.js +20 -2
  27. package/core/convert.d.ts +1 -1
  28. package/core/date.js +1 -5
  29. package/core/db.d.ts +11 -8
  30. package/core/db.js +20 -8
  31. package/core/ent.d.ts +86 -30
  32. package/core/ent.js +626 -197
  33. package/core/global_schema.d.ts +7 -0
  34. package/core/global_schema.js +51 -0
  35. package/core/loaders/assoc_count_loader.d.ts +3 -2
  36. package/core/loaders/assoc_count_loader.js +10 -2
  37. package/core/loaders/assoc_edge_loader.d.ts +2 -2
  38. package/core/loaders/assoc_edge_loader.js +8 -11
  39. package/core/loaders/index.d.ts +1 -1
  40. package/core/loaders/index.js +1 -3
  41. package/core/loaders/index_loader.d.ts +3 -3
  42. package/core/loaders/loader.d.ts +2 -2
  43. package/core/loaders/loader.js +5 -5
  44. package/core/loaders/object_loader.d.ts +32 -11
  45. package/core/loaders/object_loader.js +225 -78
  46. package/core/loaders/query_loader.d.ts +7 -13
  47. package/core/loaders/query_loader.js +52 -11
  48. package/core/loaders/raw_count_loader.d.ts +2 -2
  49. package/core/loaders/raw_count_loader.js +5 -1
  50. package/core/logger.d.ts +1 -1
  51. package/core/logger.js +1 -0
  52. package/core/privacy.d.ts +25 -24
  53. package/core/privacy.js +21 -25
  54. package/core/query/assoc_query.d.ts +7 -6
  55. package/core/query/assoc_query.js +9 -1
  56. package/core/query/custom_clause_query.d.ts +27 -0
  57. package/core/query/custom_clause_query.js +84 -0
  58. package/core/query/custom_query.d.ts +20 -5
  59. package/core/query/custom_query.js +87 -12
  60. package/core/query/index.d.ts +1 -0
  61. package/core/query/index.js +3 -1
  62. package/core/query/query.d.ts +8 -4
  63. package/core/query/query.js +101 -53
  64. package/core/query/shared_assoc_test.d.ts +2 -1
  65. package/core/query/shared_assoc_test.js +35 -45
  66. package/core/query/shared_test.d.ts +8 -1
  67. package/core/query/shared_test.js +470 -236
  68. package/core/viewer.d.ts +3 -3
  69. package/core/viewer.js +1 -1
  70. package/graphql/graphql.d.ts +51 -19
  71. package/graphql/graphql.js +160 -136
  72. package/graphql/graphql_field_helpers.d.ts +7 -1
  73. package/graphql/graphql_field_helpers.js +21 -1
  74. package/graphql/index.d.ts +2 -2
  75. package/graphql/index.js +3 -5
  76. package/graphql/query/connection_type.d.ts +9 -9
  77. package/graphql/query/edge_connection.d.ts +9 -9
  78. package/graphql/query/page_info.d.ts +1 -1
  79. package/graphql/query/shared_assoc_test.js +1 -1
  80. package/graphql/query/shared_edge_connection.js +1 -19
  81. package/graphql/scalars/orderby_direction.d.ts +2 -0
  82. package/graphql/scalars/orderby_direction.js +15 -0
  83. package/imports/dataz/example1/_auth.js +128 -47
  84. package/imports/dataz/example1/_viewer.js +87 -39
  85. package/imports/index.d.ts +6 -1
  86. package/imports/index.js +19 -4
  87. package/index.d.ts +13 -5
  88. package/index.js +21 -7
  89. package/package.json +17 -17
  90. package/parse_schema/parse.d.ts +31 -9
  91. package/parse_schema/parse.js +155 -13
  92. package/schema/base_schema.d.ts +7 -3
  93. package/schema/base_schema.js +10 -0
  94. package/schema/field.d.ts +78 -21
  95. package/schema/field.js +231 -71
  96. package/schema/index.d.ts +2 -2
  97. package/schema/index.js +5 -1
  98. package/schema/json_field.d.ts +16 -4
  99. package/schema/json_field.js +32 -2
  100. package/schema/schema.d.ts +89 -19
  101. package/schema/schema.js +11 -13
  102. package/schema/struct_field.d.ts +15 -3
  103. package/schema/struct_field.js +117 -22
  104. package/schema/union_field.d.ts +1 -1
  105. package/scripts/custom_compiler.js +10 -6
  106. package/scripts/custom_graphql.js +128 -31
  107. package/scripts/migrate_v0.1.js +36 -0
  108. package/scripts/move_types.js +120 -0
  109. package/scripts/read_schema.js +20 -5
  110. package/testutils/action/complex_schemas.d.ts +69 -0
  111. package/testutils/action/complex_schemas.js +398 -0
  112. package/testutils/builder.d.ts +41 -47
  113. package/testutils/builder.js +76 -49
  114. package/testutils/db/fixture.d.ts +10 -0
  115. package/testutils/db/fixture.js +26 -0
  116. package/testutils/db/{test_db.d.ts → temp_db.d.ts} +24 -8
  117. package/testutils/db/{test_db.js → temp_db.js} +182 -45
  118. package/testutils/db/value.d.ts +7 -0
  119. package/testutils/db/value.js +251 -0
  120. package/testutils/db_mock.d.ts +16 -4
  121. package/testutils/db_mock.js +52 -7
  122. package/testutils/db_time_zone.d.ts +4 -0
  123. package/testutils/db_time_zone.js +41 -0
  124. package/testutils/ent-graphql-tests/index.d.ts +7 -1
  125. package/testutils/ent-graphql-tests/index.js +52 -23
  126. package/testutils/fake_comms.js +1 -1
  127. package/testutils/fake_data/const.d.ts +2 -1
  128. package/testutils/fake_data/const.js +3 -0
  129. package/testutils/fake_data/fake_contact.d.ts +7 -3
  130. package/testutils/fake_data/fake_contact.js +13 -7
  131. package/testutils/fake_data/fake_event.d.ts +4 -1
  132. package/testutils/fake_data/fake_event.js +7 -6
  133. package/testutils/fake_data/fake_tag.d.ts +36 -0
  134. package/testutils/fake_data/fake_tag.js +89 -0
  135. package/testutils/fake_data/fake_user.d.ts +8 -5
  136. package/testutils/fake_data/fake_user.js +16 -15
  137. package/testutils/fake_data/index.js +5 -1
  138. package/testutils/fake_data/internal.d.ts +2 -0
  139. package/testutils/fake_data/internal.js +7 -1
  140. package/testutils/fake_data/tag_query.d.ts +13 -0
  141. package/testutils/fake_data/tag_query.js +43 -0
  142. package/testutils/fake_data/test_helpers.d.ts +11 -4
  143. package/testutils/fake_data/test_helpers.js +28 -12
  144. package/testutils/fake_data/user_query.d.ts +13 -6
  145. package/testutils/fake_data/user_query.js +54 -22
  146. package/testutils/fake_log.d.ts +3 -3
  147. package/testutils/fake_log.js +1 -1
  148. package/testutils/parse_sql.d.ts +6 -0
  149. package/testutils/parse_sql.js +16 -2
  150. package/testutils/test_edge_global_schema.d.ts +15 -0
  151. package/testutils/test_edge_global_schema.js +62 -0
  152. package/testutils/write.d.ts +2 -2
  153. package/testutils/write.js +33 -7
  154. package/tsc/ast.d.ts +25 -2
  155. package/tsc/ast.js +141 -17
  156. package/tsc/compilerOptions.js +5 -1
  157. package/tsc/move_generated.d.ts +1 -0
  158. package/tsc/move_generated.js +164 -0
  159. package/tsc/transform.d.ts +22 -0
  160. package/tsc/transform.js +181 -0
  161. package/tsc/transform_action.d.ts +22 -0
  162. package/tsc/transform_action.js +183 -0
  163. package/tsc/transform_ent.d.ts +17 -0
  164. package/tsc/transform_ent.js +60 -0
  165. package/tsc/transform_schema.d.ts +27 -0
  166. package/{scripts → tsc}/transform_schema.js +146 -117
  167. package/graphql/enums.d.ts +0 -3
  168. package/graphql/enums.js +0 -25
  169. package/scripts/move_generated.js +0 -142
  170. package/scripts/transform_code.js +0 -113
  171. package/scripts/transform_schema.d.ts +0 -1
  172. /package/scripts/{move_generated.d.ts → migrate_v0.1.d.ts} +0 -0
  173. /package/scripts/{transform_code.d.ts → move_types.d.ts} +0 -0
@@ -1,23 +1,27 @@
1
- import { Ent, EntConstructor, Viewer, ID, Data, PrivacyPolicy, Context } from "../core/base";
1
+ import { Ent, EntConstructor, Viewer, ID, Data, PrivacyPolicy, Context, WriteOperation } from "../core/base";
2
2
  import { DataOperation, AssocEdgeInputOptions } from "../core/ent";
3
3
  import { Queryer } from "../core/db";
4
4
  import { TransformedUpdateOperation, UpdateOperation } from "../schema";
5
- export declare enum WriteOperation {
6
- Insert = "insert",
7
- Edit = "edit",
8
- Delete = "delete"
5
+ import { FieldInfoMap } from "../schema/schema";
6
+ export { WriteOperation };
7
+ type MaybeNull<T extends Ent> = T | null;
8
+ type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
9
+ interface BuilderOrchestrator {
10
+ __getOptions(): {
11
+ fieldInfo: FieldInfoMap;
12
+ };
9
13
  }
10
- declare type MaybeNull<T extends Ent> = T | null;
11
- declare type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
12
- export interface Builder<T extends Ent, TExistingEnt extends TMaybleNullableEnt<T> = MaybeNull<T>> {
14
+ export interface Builder<TEnt extends Ent<TViewer>, TViewer extends Viewer = Viewer, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
13
15
  existingEnt: TExistingEnt;
14
- ent: EntConstructor<T>;
16
+ ent: EntConstructor<TEnt, TViewer>;
15
17
  placeholderID: ID;
16
- readonly viewer: Viewer;
17
- build(): Promise<Changeset<T>>;
18
+ readonly viewer: TViewer;
19
+ build(): Promise<Changeset>;
18
20
  operation: WriteOperation;
19
- editedEnt?(): Promise<T | null>;
21
+ editedEnt?(): Promise<TEnt | null>;
20
22
  nodeType: string;
23
+ getInput(): Data;
24
+ orchestrator: BuilderOrchestrator;
21
25
  }
22
26
  export interface Executor extends Iterable<DataOperation>, Iterator<DataOperation> {
23
27
  placeholderID: ID;
@@ -27,43 +31,43 @@ export interface Executor extends Iterable<DataOperation>, Iterator<DataOperatio
27
31
  postFetch?(queryer: Queryer, context?: Context): Promise<void>;
28
32
  executeObservers?(): Promise<void>;
29
33
  }
30
- export interface Changeset<T extends Ent> {
34
+ export interface Changeset {
31
35
  executor(): Executor;
32
36
  viewer: Viewer;
33
37
  placeholderID: ID;
34
- changesets?: Changeset<Ent>[];
38
+ changesets?: Changeset[];
35
39
  dependencies?: Map<ID, Builder<Ent>>;
36
40
  }
37
- export declare type TriggerReturn = void | Promise<Changeset<Ent> | void | (Changeset<Ent> | void)[]> | Promise<Changeset<Ent>>[];
38
- export interface Trigger<TEnt extends Ent, TBuilder extends Builder<TEnt, TExistingEnt>, TInput extends Data = Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
41
+ export type TriggerReturn = void | Promise<Changeset | void | (Changeset | void)[]> | Promise<Changeset>[];
42
+ 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
43
  changeset(builder: TBuilder, input: TInput): TriggerReturn;
40
44
  }
41
- export interface Observer<TEnt extends Ent, TBuilder extends Builder<TEnt, TExistingEnt>, TInput extends Data = Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
45
+ 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
46
  observe(builder: TBuilder, input: TInput): void | Promise<void>;
43
47
  }
44
- export interface Validator<TEnt extends Ent, TBuilder extends Builder<TEnt, TExistingEnt>, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
45
- validate(builder: TBuilder, input: TInput): Promise<void> | void;
48
+ 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>> {
49
+ validate(builder: TBuilder, input: TInput): Promise<void | undefined | Error> | void | Error | undefined;
46
50
  }
47
- export interface Action<TEnt extends Ent, TBuilder extends Builder<TEnt, TExistingEnt>, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
51
+ 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>> {
48
52
  readonly viewer: Viewer;
49
- changeset(): Promise<Changeset<TEnt>>;
53
+ changeset(): Promise<Changeset>;
50
54
  builder: TBuilder;
51
55
  getPrivacyPolicy(): PrivacyPolicy<TEnt>;
52
- triggers?: Trigger<TEnt, TBuilder, TInput, TExistingEnt>[];
53
- observers?: Observer<TEnt, TBuilder, TInput, TExistingEnt>[];
54
- validators?: Validator<TEnt, TBuilder, TInput, TExistingEnt>[];
56
+ getTriggers?(): (Trigger<TEnt, TBuilder, TViewer, TInput, TExistingEnt> | Trigger<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[])[];
57
+ getObservers?(): Observer<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[];
58
+ getValidators?(): Validator<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[];
55
59
  getInput(): TInput;
56
- transformWrite?: (stmt: UpdateOperation<TEnt>) => Promise<TransformedUpdateOperation<TEnt>> | TransformedUpdateOperation<TEnt> | null;
60
+ transformWrite?: (stmt: UpdateOperation<TEnt, TViewer>) => Promise<TransformedUpdateOperation<TEnt, TViewer>> | TransformedUpdateOperation<TEnt, TViewer> | null;
57
61
  valid(): Promise<boolean>;
58
62
  validX(): Promise<void>;
59
- viewerForEntLoad?(data: Data): Viewer | Promise<Viewer>;
63
+ viewerForEntLoad?(data: Data, context?: Context<TViewer>): TViewer | Promise<TViewer>;
60
64
  }
61
- export declare function saveBuilder<T extends Ent>(builder: Builder<T>): Promise<void>;
62
- export declare function saveBuilderX<T extends Ent>(builder: Builder<T>): Promise<void>;
65
+ export declare function saveBuilder<TEnt extends Ent<TViewer>, TViewer extends Viewer>(builder: Builder<TEnt, TViewer>): Promise<void>;
66
+ export declare function saveBuilderX<TEnt extends Ent<TViewer>, TViewer extends Viewer>(builder: Builder<TEnt, TViewer>): Promise<void>;
63
67
  interface Orchestrator {
64
68
  addOutboundEdge<T2 extends Ent>(id2: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
65
69
  removeOutboundEdge(id2: ID, edgeType: string): void;
66
70
  viewer: Viewer;
67
71
  }
68
72
  export declare function setEdgeTypeInGroup<T extends string>(orchestrator: Orchestrator, inputEnumValue: string, id1: ID, id2: ID, nodeType: string, m: Map<T, string>): Promise<void>;
69
- export {};
73
+ export declare function clearEdgeTypeInGroup<T extends string>(orchestrator: Orchestrator, id1: ID, id2: ID, m: Map<T, string>): Promise<void>;
package/action/action.js CHANGED
@@ -1,14 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setEdgeTypeInGroup = exports.saveBuilderX = exports.saveBuilder = exports.WriteOperation = void 0;
3
+ exports.clearEdgeTypeInGroup = exports.setEdgeTypeInGroup = exports.saveBuilderX = exports.saveBuilder = exports.WriteOperation = void 0;
4
+ const base_1 = require("../core/base");
5
+ Object.defineProperty(exports, "WriteOperation", { enumerable: true, get: function () { return base_1.WriteOperation; } });
4
6
  const ent_1 = require("../core/ent");
5
7
  const logger_1 = require("../core/logger");
6
- var WriteOperation;
7
- (function (WriteOperation) {
8
- WriteOperation["Insert"] = "insert";
9
- WriteOperation["Edit"] = "edit";
10
- WriteOperation["Delete"] = "delete";
11
- })(WriteOperation = exports.WriteOperation || (exports.WriteOperation = {}));
12
8
  async function saveBuilder(builder) {
13
9
  await saveBuilderImpl(builder, false);
14
10
  }
@@ -88,3 +84,22 @@ async function setEdgeTypeInGroup(orchestrator, inputEnumValue, id1, id2, nodeTy
88
84
  await Promise.all(promises);
89
85
  }
90
86
  exports.setEdgeTypeInGroup = setEdgeTypeInGroup;
87
+ async function clearEdgeTypeInGroup(orchestrator, id1, id2, m) {
88
+ let promises = [];
89
+ for (const [_, edgeType] of m) {
90
+ promises.push((async () => {
91
+ let edge = await (0, ent_1.loadEdgeForID2)({
92
+ id1,
93
+ id2,
94
+ edgeType,
95
+ ctr: ent_1.AssocEdge,
96
+ context: orchestrator.viewer.context,
97
+ });
98
+ if (edge) {
99
+ orchestrator.removeOutboundEdge(id2, edgeType);
100
+ }
101
+ })());
102
+ }
103
+ await Promise.all(promises);
104
+ }
105
+ exports.clearEdgeTypeInGroup = clearEdgeTypeInGroup;
@@ -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, T | null> | undefined);
13
+ constructor(viewer: Viewer, placeholderID: ID, operations: DataOperation<T>[], options?: OrchestratorOptions<T, Data, Viewer<Ent<any> | null, ID | null>, 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, Data, Viewer>);
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,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.executeOperations = exports.ComplexExecutor = exports.ListBasedExecutor = void 0;
7
7
  const graph_data_structure_1 = __importDefault(require("graph-data-structure"));
8
+ const ent_1 = require("../core/ent");
8
9
  const db_1 = __importDefault(require("../core/db"));
9
10
  const logger_1 = require("../core/logger");
10
11
  // private to ent
@@ -47,11 +48,11 @@ class ListBasedExecutor {
47
48
  }
48
49
  async executeObservers() {
49
50
  const action = this.options?.action;
50
- if (!this.options || !action || !action.observers) {
51
+ if (!this.options || !action || !action.getObservers) {
51
52
  return;
52
53
  }
53
54
  const builder = this.options.builder;
54
- await Promise.all(action.observers.map(async (observer) => {
55
+ await Promise.all(action.getObservers().map(async (observer) => {
55
56
  await observer.observe(builder, action.getInput());
56
57
  }));
57
58
  }
@@ -98,7 +99,7 @@ class ComplexExecutor {
98
99
  changesetMap.set(c.placeholderID.toString(), c);
99
100
  graph.addNode(c.placeholderID.toString());
100
101
  if (c.dependencies) {
101
- for (let [key, builder] of c.dependencies) {
102
+ for (let [_, builder] of c.dependencies) {
102
103
  // dependency should go first...
103
104
  graph.addEdge(builder.placeholderID.toString(), c.placeholderID.toString(), 1);
104
105
  }
@@ -258,6 +259,7 @@ async function executeOperations(executor, context, trackOps) {
258
259
  });
259
260
  }
260
261
  else {
262
+ (0, ent_1.logQuery)("BEGIN", []);
261
263
  await client.query("BEGIN");
262
264
  for (const operation of executor) {
263
265
  if (trackOps) {
@@ -269,6 +271,7 @@ async function executeOperations(executor, context, trackOps) {
269
271
  }
270
272
  await operation.performWrite(client, context);
271
273
  }
274
+ (0, ent_1.logQuery)("COMMIT", []);
272
275
  await client.query("COMMIT");
273
276
  }
274
277
  if (executor.postFetch) {
@@ -280,6 +283,8 @@ async function executeOperations(executor, context, trackOps) {
280
283
  }
281
284
  catch (e) {
282
285
  if (!isSyncClient(client)) {
286
+ // TODO these changes break tests
287
+ (0, ent_1.logQuery)("ROLLBACK", []);
283
288
  await client.query("ROLLBACK");
284
289
  }
285
290
  (0, logger_1.log)("error", e);
@@ -1,40 +1,50 @@
1
+ import { Orchestrator } from "./orchestrator";
1
2
  import { Viewer, Ent, Data } from "../core/base";
2
3
  import { Action, WriteOperation, Builder, Trigger, Observer, Changeset, Validator } from "./action";
3
- export interface ActionOptions<T extends Ent, TData extends Data> {
4
- existingEnt?: T | null;
4
+ export interface ActionOptions<TEnt extends Ent<TViewer>, TViewer extends Viewer, TData extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
5
+ existingEnt: TExistingEnt;
5
6
  input?: TData;
6
7
  operation?: WriteOperation;
7
8
  }
8
- interface EntBuilder<T extends Ent> extends Builder<T> {
9
+ type MaybeNull<T extends Ent> = T | null;
10
+ type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
11
+ export interface EntBuilder<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> extends Builder<TEnt, TViewer, TExistingEnt> {
9
12
  valid(): Promise<boolean>;
10
13
  validX(): Promise<void>;
11
14
  save(): Promise<void>;
12
15
  saveX(): Promise<void>;
13
- editedEnt(): Promise<T | null>;
14
- editedEntX(): Promise<T>;
16
+ editedEnt(): Promise<TEnt | null>;
17
+ editedEntX(): Promise<TEnt>;
18
+ getInput(): TInput;
19
+ orchestrator: Orchestrator<TEnt, TInput, TViewer, TExistingEnt>;
15
20
  }
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>;
21
+ export declare class BaseAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> implements Action<TEnt, EntBuilder<TEnt, TViewer, TInput, TExistingEnt>, TViewer, TInput, TExistingEnt> {
22
+ viewer: TViewer;
23
+ builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>;
24
+ builder: EntBuilder<TEnt, TViewer, TInput, TExistingEnt>;
20
25
  private input;
21
- triggers: Trigger<TEnt, EntBuilder<TEnt>, TData>[];
22
- observers: Observer<TEnt, EntBuilder<TEnt>, TData>[];
23
- validators: Validator<TEnt, 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>>;
26
+ getPrivacyPolicy(): import("../core/base").PrivacyPolicy<Ent<Viewer<Ent<any> | null, import("../core/base").ID | null>>, Viewer<Ent<any> | null, import("../core/base").ID | null>>;
27
+ getTriggers(): Trigger<TEnt, EntBuilder<TEnt, TViewer, TInput, TExistingEnt>, TViewer, TInput, TExistingEnt>[];
28
+ getObservers(): Observer<TEnt, EntBuilder<TEnt, TViewer, TInput, TExistingEnt>, TViewer, TInput, TExistingEnt>[];
29
+ getValidators(): Validator<TEnt, EntBuilder<TEnt, TViewer, TInput, TExistingEnt>, TViewer, TInput, TExistingEnt>[];
30
+ constructor(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>, options: ActionOptions<TEnt, TViewer, TInput, TExistingEnt>);
31
+ static createBuilder<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>>(viewer: Viewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>, options: ActionOptions<TEnt, TViewer, TInput, TExistingEnt>): Builder<TEnt>;
32
+ /**
33
+ * @deprecated use Transaction
34
+ */
35
+ static bulkAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(ent: TEnt, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, ...actions: Action<Ent, Builder<Ent, any>>[]): BaseAction<TEnt, TViewer, TInput, TEnt>;
36
+ changeset(): Promise<Changeset>;
29
37
  valid(): Promise<boolean>;
30
38
  validX(): Promise<void>;
31
39
  save(): Promise<TEnt | null>;
32
40
  saveX(): Promise<TEnt>;
33
- getInput(): TData;
41
+ getInput(): TInput;
34
42
  }
35
- interface BuilderConstructor<TEnt extends Ent, TData extends Data> {
36
- new (viewer: Viewer, operation: WriteOperation, action: Action<TEnt, EntBuilder<TEnt>, TData>, existingEnt: TEnt | null): EntBuilder<TEnt>;
43
+ export interface BuilderConstructor<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
44
+ new (viewer: TViewer, operation: WriteOperation, action: Action<TEnt, any, TViewer, TInput, TExistingEnt>, existingEnt: TExistingEnt): EntBuilder<TEnt, TViewer, TInput, TExistingEnt>;
37
45
  }
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>;
46
+ export declare function updateRawObject<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput): Promise<TEnt>;
47
+ export declare function getSimpleEditAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput): BaseAction<TEnt, TViewer, TInput, TEnt>;
48
+ export declare function getSimpleDeleteAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>, existingEnt: TEnt, input: TInput): BaseAction<TEnt, TViewer, TInput, TEnt>;
49
+ export declare function getSimpleInsertAction<TEnt extends Ent<TViewer>, TViewer extends Viewer, TInput extends Data>(viewer: TViewer, builderCtr: BuilderConstructor<TEnt, TViewer, TInput, null>, input: TInput): BaseAction<TEnt, TViewer, TInput, null>;
40
50
  export {};
@@ -1,15 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSimpleEditAction = exports.updateRawObject = exports.BaseAction = void 0;
3
+ exports.getSimpleInsertAction = exports.getSimpleDeleteAction = exports.getSimpleEditAction = exports.updateRawObject = exports.BaseAction = void 0;
4
4
  const privacy_1 = require("../core/privacy");
5
5
  const action_1 = require("./action");
6
6
  class BaseAction {
7
+ getPrivacyPolicy() {
8
+ return privacy_1.AlwaysAllowPrivacyPolicy;
9
+ }
10
+ getTriggers() {
11
+ return [];
12
+ }
13
+ getObservers() {
14
+ return [];
15
+ }
16
+ getValidators() {
17
+ return [];
18
+ }
7
19
  constructor(viewer, builderCtr, options) {
8
20
  this.viewer = viewer;
9
21
  this.builderCtr = builderCtr;
10
- this.triggers = [];
11
- this.observers = [];
12
- this.validators = [];
13
22
  let operation = options?.operation;
14
23
  if (!operation) {
15
24
  if (options?.existingEnt) {
@@ -20,10 +29,7 @@ class BaseAction {
20
29
  }
21
30
  }
22
31
  this.input = options?.input || {};
23
- this.builder = new builderCtr(viewer, operation, this, options?.existingEnt || null);
24
- }
25
- getPrivacyPolicy() {
26
- return privacy_1.AlwaysAllowPrivacyPolicy;
32
+ this.builder = new builderCtr(viewer, operation, this, options.existingEnt);
27
33
  }
28
34
  static createBuilder(viewer, builderCtr, options) {
29
35
  let action = new BaseAction(viewer, builderCtr, options);
@@ -31,11 +37,14 @@ class BaseAction {
31
37
  }
32
38
  // perform a bulk action in a transaction rooted on ent T
33
39
  // it ends up creating triggers and having all the given actions performed in a transaction
40
+ /**
41
+ * @deprecated use Transaction
42
+ */
34
43
  static bulkAction(ent, builderCtr, ...actions) {
35
44
  let action = new BaseAction(ent.viewer, builderCtr, {
36
45
  existingEnt: ent,
37
46
  });
38
- action.triggers = [
47
+ action.getTriggers = () => [
39
48
  {
40
49
  changeset: () => {
41
50
  return actions.map((action) => action.changeset());
@@ -79,6 +88,7 @@ async function updateRawObject(viewer, builderCtr, existingEnt, input) {
79
88
  return action.saveX();
80
89
  }
81
90
  exports.updateRawObject = updateRawObject;
91
+ // TODO need to fix types for all these
82
92
  // creates an action which has no privacy, triggers, observers etc
83
93
  // does do field validation
84
94
  // useful to batch a bunch of writes together with BaseAction.bulkAction
@@ -91,3 +101,19 @@ function getSimpleEditAction(viewer, builderCtr, existingEnt, input) {
91
101
  });
92
102
  }
93
103
  exports.getSimpleEditAction = getSimpleEditAction;
104
+ function getSimpleDeleteAction(viewer, builderCtr, existingEnt, input) {
105
+ return new BaseAction(viewer, builderCtr, {
106
+ existingEnt: existingEnt,
107
+ operation: action_1.WriteOperation.Delete,
108
+ input,
109
+ });
110
+ }
111
+ exports.getSimpleDeleteAction = getSimpleDeleteAction;
112
+ function getSimpleInsertAction(viewer, builderCtr, input) {
113
+ return new BaseAction(viewer, builderCtr, {
114
+ operation: action_1.WriteOperation.Insert,
115
+ input,
116
+ existingEnt: null,
117
+ });
118
+ }
119
+ exports.getSimpleInsertAction = getSimpleInsertAction;
package/action/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { WriteOperation, Builder, Changeset, Trigger, Observer, Validator, Action, saveBuilder, saveBuilderX, setEdgeTypeInGroup, TriggerReturn, } from "./action";
2
2
  export { OrchestratorOptions, Orchestrator, EntChangeset, EdgeInputData, } from "./orchestrator";
3
3
  export { DenyIfBuilder, AllowIfBuilder } from "./privacy";
4
+ export { RelativeFieldValue, RelativeNumberValue, NumberOps, convertRelativeInput, maybeConvertRelativeInputPlusExpressions, } from "./relative_value";
5
+ export { Transaction } from "./transaction";
package/action/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AllowIfBuilder = exports.DenyIfBuilder = exports.EntChangeset = exports.Orchestrator = exports.setEdgeTypeInGroup = exports.saveBuilderX = exports.saveBuilder = exports.WriteOperation = void 0;
3
+ exports.Transaction = exports.maybeConvertRelativeInputPlusExpressions = exports.convertRelativeInput = exports.NumberOps = exports.AllowIfBuilder = exports.DenyIfBuilder = exports.EntChangeset = exports.Orchestrator = exports.setEdgeTypeInGroup = exports.saveBuilderX = exports.saveBuilder = exports.WriteOperation = void 0;
4
4
  var action_1 = require("./action");
5
5
  Object.defineProperty(exports, "WriteOperation", { enumerable: true, get: function () { return action_1.WriteOperation; } });
6
6
  Object.defineProperty(exports, "saveBuilder", { enumerable: true, get: function () { return action_1.saveBuilder; } });
@@ -12,3 +12,9 @@ Object.defineProperty(exports, "EntChangeset", { enumerable: true, get: function
12
12
  var privacy_1 = require("./privacy");
13
13
  Object.defineProperty(exports, "DenyIfBuilder", { enumerable: true, get: function () { return privacy_1.DenyIfBuilder; } });
14
14
  Object.defineProperty(exports, "AllowIfBuilder", { enumerable: true, get: function () { return privacy_1.AllowIfBuilder; } });
15
+ var relative_value_1 = require("./relative_value");
16
+ Object.defineProperty(exports, "NumberOps", { enumerable: true, get: function () { return relative_value_1.NumberOps; } });
17
+ Object.defineProperty(exports, "convertRelativeInput", { enumerable: true, get: function () { return relative_value_1.convertRelativeInput; } });
18
+ Object.defineProperty(exports, "maybeConvertRelativeInputPlusExpressions", { enumerable: true, get: function () { return relative_value_1.maybeConvertRelativeInputPlusExpressions; } });
19
+ var transaction_1 = require("./transaction");
20
+ Object.defineProperty(exports, "Transaction", { enumerable: true, get: function () { return transaction_1.Transaction; } });
@@ -3,19 +3,21 @@ 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
- 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, TData extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
6
+ import * as clause from "../core/clause";
7
+ type MaybeNull<T extends Ent> = T | null;
8
+ type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
9
+ export interface OrchestratorOptions<TEnt extends Ent<TViewer>, TInput extends Data, TViewer extends Viewer, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
9
10
  viewer: Viewer;
10
11
  operation: WriteOperation;
11
12
  tableName: string;
12
- loaderOptions: LoadEntOptions<TEnt>;
13
+ loaderOptions: LoadEntOptions<TEnt, TViewer>;
13
14
  key: string;
14
- builder: Builder<TEnt, TExistingEnt>;
15
- action?: Action<TEnt, Builder<TEnt>, TData>;
15
+ builder: Builder<TEnt, TViewer, TExistingEnt>;
16
+ action?: Action<TEnt, Builder<TEnt, TViewer>, TViewer, TInput>;
16
17
  schema: SchemaInputType;
17
18
  editedFields(): Map<string, any> | Promise<Map<string, any>>;
18
- updateInput?: (data: TData) => void;
19
+ updateInput?: (data: TInput) => void;
20
+ expressions?: Map<string, clause.Clause>;
19
21
  fieldInfo: FieldInfoMap;
20
22
  }
21
23
  interface edgeInputDataOpts {
@@ -31,7 +33,7 @@ export declare enum edgeDirection {
31
33
  inboundEdge = 0,
32
34
  outboundEdge = 1
33
35
  }
34
- export declare class Orchestrator<TEnt extends Ent, TData extends Data, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
36
+ export declare class Orchestrator<TEnt extends Ent<TViewer>, TInput extends Data, TViewer extends Viewer, TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>> {
35
37
  private options;
36
38
  private edgeSet;
37
39
  private edges;
@@ -48,11 +50,12 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data, TExistin
48
50
  private existingEnt;
49
51
  private disableTransformations;
50
52
  private memoizedGetFields;
51
- constructor(options: OrchestratorOptions<TEnt, TData, TExistingEnt>);
53
+ constructor(options: OrchestratorOptions<TEnt, TInput, TViewer, TExistingEnt>);
54
+ __getOptions(): OrchestratorOptions<any, any, any, any>;
52
55
  private addEdge;
53
56
  setDisableTransformations(val: boolean): void;
54
- addInboundEdge<T2 extends Ent>(id1: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
55
- addOutboundEdge<T2 extends Ent>(id2: ID | Builder<T2>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
57
+ addInboundEdge<T2 extends Ent>(id1: ID | Builder<T2, any>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
58
+ addOutboundEdge<T2 extends Ent>(id2: ID | Builder<T2, any>, edgeType: string, nodeType: string, options?: AssocEdgeInputOptions): void;
56
59
  removeInboundEdge(id1: ID, edgeType: string): void;
57
60
  removeOutboundEdge(id2: ID, edgeType: string): void;
58
61
  getInputEdges(edgeType: string, op: WriteOperation): EdgeInputData[];
@@ -66,6 +69,11 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data, TExistin
66
69
  private getWriteOpForSQLStamentOp;
67
70
  getPossibleUnsafeEntForPrivacy(): Promise<TEnt>;
68
71
  getEditedData(): Promise<Data>;
72
+ /**
73
+ * @returns validated and formatted fields that would be written to the db
74
+ * throws an error if called before valid() or validX() has been called
75
+ */
76
+ getValidatedFields(): Data;
69
77
  private getFieldsInfo;
70
78
  private validate;
71
79
  private triggers;
@@ -79,22 +87,31 @@ export declare class Orchestrator<TEnt extends Ent, TData extends Data, TExistin
79
87
  private formatAndValidateFields;
80
88
  valid(): Promise<boolean>;
81
89
  validX(): Promise<void>;
90
+ /**
91
+ * @experimental API that's not guaranteed to remain in the future which returns
92
+ * a list of errors encountered
93
+ * 0 errors indicates valid
94
+ * NOTE that this currently doesn't catch errors returned by validators().
95
+ * If those throws, this still throws and doesn't return them
96
+ */
97
+ validWithErrors(): Promise<Error[]>;
82
98
  build(): Promise<EntChangeset<TEnt>>;
83
99
  private viewerForEntLoad;
84
100
  returnedRow(): Promise<Data | null>;
85
101
  editedEnt(): Promise<TEnt | null>;
86
102
  editedEntX(): Promise<TEnt>;
87
103
  }
88
- export declare class EntChangeset<T extends Ent> implements Changeset<T> {
104
+ export declare class EntChangeset<T extends Ent> implements Changeset {
89
105
  viewer: Viewer;
90
106
  readonly placeholderID: ID;
91
107
  readonly ent: EntConstructor<T>;
92
108
  operations: DataOperation[];
93
- dependencies?: Map<ID, Builder<Ent, Ent | null>> | undefined;
94
- changesets?: Changeset<Ent>[] | undefined;
109
+ 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;
110
+ changesets?: Changeset[] | undefined;
95
111
  private options?;
96
112
  private _executor;
97
- constructor(viewer: Viewer, placeholderID: ID, ent: EntConstructor<T>, operations: DataOperation[], dependencies?: Map<ID, Builder<Ent, Ent | null>> | undefined, changesets?: Changeset<Ent>[] | undefined, options?: OrchestratorOptions<T, Data, MaybeNull<T>> | undefined);
113
+ 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, Data, Viewer<Ent<any> | null, ID | null>, MaybeNull<T>> | undefined);
114
+ static changesetFrom(builder: Builder<any, any, any>, ops: DataOperation[]): EntChangeset<any>;
98
115
  executor(): Executor;
99
116
  }
100
117
  export {};