@snowtop/ent 0.1.0-alpha13 → 0.1.0-alpha130

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 +5 -3
  93. package/schema/base_schema.js +6 -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
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): 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): 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): 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): 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): 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): 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;
@@ -183,6 +183,7 @@ export declare class AllowIfSubPolicyAllowsRule implements PrivacyPolicyRule {
183
183
  }
184
184
  export declare function applyPrivacyPolicy(v: Viewer, policy: PrivacyPolicy, ent: Ent | undefined): Promise<boolean>;
185
185
  export declare function applyPrivacyPolicyX(v: Viewer, policy: PrivacyPolicy, ent: Ent | undefined, throwErr?: () => Error): Promise<boolean>;
186
+ export declare function applyPrivacyPolicyImpl(v: Viewer, policy: PrivacyPolicy, ent: Ent | undefined, throwErr?: () => Error): Promise<Error | null>;
186
187
  export declare const AlwaysAllowPrivacyPolicy: PrivacyPolicy;
187
188
  export declare const AlwaysDenyPrivacyPolicy: PrivacyPolicy;
188
189
  export declare const AllowIfViewerPrivacyPolicy: PrivacyPolicy;
package/core/privacy.js CHANGED
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AllowIfViewerHasIdentityPrivacyPolicy = exports.AllowIfViewerPrivacyPolicy = exports.AlwaysDenyPrivacyPolicy = exports.AlwaysAllowPrivacyPolicy = exports.applyPrivacyPolicyX = exports.applyPrivacyPolicy = exports.AllowIfSubPolicyAllowsRule = exports.DelayedResultRule = exports.AllowIfConditionAppliesRule = exports.DenyIfViewerOutboundEdgeDoesNotExistRule = exports.DenyIfViewerInboundEdgeDoesNotExistRule = exports.DenyIfEdgeDoesNotExistRule = exports.DenyIfViewerOutboundEdgeExistsRule = exports.DenyIfViewerInboundEdgeExistsRule = exports.DenyIfEdgeExistsRule = exports.AllowIfViewerOutboundEdgeExistsRule = exports.AllowIfViewerInboundEdgeExistsRule = exports.AllowIfEdgeExistsRule = exports.DenyIfEntIsNotVisibleRule = exports.DenyIfEntIsVisibleRule = exports.DenyIfEntIsVisiblePolicy = exports.AllowIfEntIsVisiblePolicy = exports.AllowIfEntIsNotVisibleRule = exports.AllowIfEntIsVisibleRule = exports.DenyIfEntPropertyIsRule = exports.AllowIfEntPropertyIsRule = exports.AllowIfViewerIsEntPropertyRule = exports.AllowIfViewerIsRule = exports.DenyIfFuncRule = exports.AllowIfFuncRule = exports.DenyIfViewerEqualsRule = exports.AllowIfViewerEqualsRule = exports.AllowIfViewerRule = exports.AllowIfHasIdentity = exports.DenyIfLoggedInRule = exports.DenyIfLoggedOutRule = exports.AlwaysDenyRule = exports.AlwaysAllowRule = exports.EntPrivacyError = void 0;
3
+ exports.AllowIfViewerHasIdentityPrivacyPolicy = exports.AllowIfViewerPrivacyPolicy = exports.AlwaysDenyPrivacyPolicy = exports.AlwaysAllowPrivacyPolicy = exports.applyPrivacyPolicyImpl = exports.applyPrivacyPolicyX = exports.applyPrivacyPolicy = exports.AllowIfSubPolicyAllowsRule = exports.DelayedResultRule = exports.AllowIfConditionAppliesRule = exports.DenyIfViewerOutboundEdgeDoesNotExistRule = exports.DenyIfViewerInboundEdgeDoesNotExistRule = exports.DenyIfEdgeDoesNotExistRule = exports.DenyIfViewerOutboundEdgeExistsRule = exports.DenyIfViewerInboundEdgeExistsRule = exports.DenyIfEdgeExistsRule = exports.AllowIfViewerOutboundEdgeExistsRule = exports.AllowIfViewerInboundEdgeExistsRule = exports.AllowIfEdgeExistsRule = exports.DenyIfEntIsNotVisibleRule = exports.DenyIfEntIsVisibleRule = exports.DenyIfEntIsVisiblePolicy = exports.AllowIfEntIsVisiblePolicy = exports.AllowIfEntIsNotVisibleRule = exports.AllowIfEntIsVisibleRule = exports.DenyIfEntPropertyIsRule = exports.AllowIfEntPropertyIsRule = exports.AllowIfViewerIsEntPropertyRule = exports.AllowIfViewerIsRule = exports.DenyIfFuncRule = exports.AllowIfFuncRule = exports.DenyIfViewerEqualsRule = exports.AllowIfViewerEqualsRule = exports.AllowIfViewerRule = exports.AllowIfHasIdentity = exports.DenyIfLoggedInRule = exports.DenyIfLoggedOutRule = exports.AlwaysDenyRule = exports.AlwaysAllowRule = exports.EntPrivacyError = void 0;
4
4
  const base_1 = require("./base");
5
5
  const ent_1 = require("./ent");
6
- const logger_1 = require("./logger");
7
6
  // copied from ./base
8
7
  var privacyResult;
9
8
  (function (privacyResult) {
@@ -437,45 +436,42 @@ class AllowIfSubPolicyAllowsRule {
437
436
  }
438
437
  exports.AllowIfSubPolicyAllowsRule = AllowIfSubPolicyAllowsRule;
439
438
  async function applyPrivacyPolicy(v, policy, ent) {
440
- try {
441
- return await applyPrivacyPolicyX(v, policy, ent);
442
- }
443
- catch (e) {
444
- // TODO privacy errors should not throw
445
- // but other expected errors should throw...
446
- // we shouldn't just hide them
447
- (0, logger_1.log)("debug", e);
448
- return false;
449
- }
439
+ const err = await applyPrivacyPolicyImpl(v, policy, ent);
440
+ return err === null;
450
441
  }
451
442
  exports.applyPrivacyPolicy = applyPrivacyPolicy;
452
- // this will throw an exception if fails or return error | null?
453
443
  async function applyPrivacyPolicyX(v, policy, ent, throwErr) {
454
- // right now we apply all at same time. todo: be smart about this in the future
455
- const results = await Promise.all(policy.rules.map((rule) => rule.apply(v, ent)));
456
- for (let i = 0; i < results.length; i++) {
457
- const res = results[i];
458
- const rule = policy.rules[i];
444
+ const err = await applyPrivacyPolicyImpl(v, policy, ent, throwErr);
445
+ if (err !== null) {
446
+ throw err;
447
+ }
448
+ return true;
449
+ }
450
+ exports.applyPrivacyPolicyX = applyPrivacyPolicyX;
451
+ // this will throw an exception if fails or return error | null?
452
+ async function applyPrivacyPolicyImpl(v, policy, ent, throwErr) {
453
+ for (const rule of policy.rules) {
454
+ const res = await rule.apply(v, ent);
459
455
  if (res.result == privacyResult.Allow) {
460
- return true;
456
+ return null;
461
457
  }
462
458
  else if (res.result == privacyResult.Deny) {
463
459
  // specific error throw that
464
460
  if (res.error) {
465
- throw res.error;
461
+ return res.error;
466
462
  }
467
463
  if (res.getError) {
468
- throw res.getError(policy, rule, ent);
464
+ return res.getError(policy, rule, ent);
469
465
  }
470
466
  if (throwErr) {
471
- throw throwErr();
467
+ return throwErr();
472
468
  }
473
- throw new EntPrivacyError(policy, rule, ent);
469
+ return new EntPrivacyError(policy, rule, ent);
474
470
  }
475
471
  }
476
- throw new EntInvalidPrivacyPolicyError(policy, ent);
472
+ return new EntInvalidPrivacyPolicyError(policy, ent);
477
473
  }
478
- exports.applyPrivacyPolicyX = applyPrivacyPolicyX;
474
+ exports.applyPrivacyPolicyImpl = applyPrivacyPolicyImpl;
479
475
  exports.AlwaysAllowPrivacyPolicy = {
480
476
  rules: [exports.AlwaysAllowRule],
481
477
  };
@@ -3,17 +3,18 @@ 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 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
+ 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
+ getTableName(): Promise<string>;
17
18
  private getSingleID;
18
19
  queryRawCount(): Promise<number>;
19
20
  queryAllRawCount(): Promise<Map<ID, number>>;
@@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AssocEdgeQueryBase = void 0;
4
4
  const ent_1 = require("../ent");
5
5
  const query_1 = require("./query");
6
+ // would be nice to someday have an API for assoc asc
6
7
  class AssocEdgeQueryBase extends query_1.BaseEdgeQuery {
7
8
  constructor(viewer, src, countLoaderFactory, dataLoaderFactory,
8
9
  // if function, it's a polymorphic edge and need to provide
9
10
  // a function that goes from edgeType to LoadEntOptions
10
11
  options) {
11
- super(viewer, "time");
12
+ super(viewer, "time", "id2");
12
13
  this.viewer = viewer;
13
14
  this.src = src;
14
15
  this.countLoaderFactory = countLoaderFactory;
@@ -21,6 +22,13 @@ class AssocEdgeQueryBase extends query_1.BaseEdgeQuery {
21
22
  }
22
23
  return false;
23
24
  }
25
+ async getTableName() {
26
+ const edgeData = await (0, ent_1.loadEdgeData)(this.countLoaderFactory.getEdgeType());
27
+ if (!edgeData) {
28
+ throw new Error(`couldn't load edgeData`);
29
+ }
30
+ return edgeData.edgeTable;
31
+ }
24
32
  async getSingleID() {
25
33
  const infos = await this.genIDInfosToFetch();
26
34
  if (infos.length !== 1) {
@@ -0,0 +1,27 @@
1
+ import { Data, EdgeQueryableDataOptions, Ent, ID, LoadEntOptions, Viewer } from "../base";
2
+ import { Clause } from "../clause";
3
+ import { BaseEdgeQuery, IDInfo } from "./query";
4
+ interface CustomClauseQueryOptions<TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
5
+ loadEntOptions: LoadEntOptions<TDest, TViewer>;
6
+ clause: Clause;
7
+ name: string;
8
+ sortColumn?: string;
9
+ sortColumnUnique?: boolean;
10
+ orderByDirection?: "asc" | "desc";
11
+ disableTransformations?: boolean;
12
+ }
13
+ export declare class CustomClauseQuery<TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> extends BaseEdgeQuery<any, TDest, Data> {
14
+ viewer: TViewer;
15
+ private options;
16
+ private clause;
17
+ constructor(viewer: TViewer, options: CustomClauseQueryOptions<TDest, TViewer>);
18
+ sourceEnt(_id: ID): Promise<null>;
19
+ getTableName(): string;
20
+ queryRawCount(): Promise<number>;
21
+ queryAllRawCount(): Promise<Map<ID, number>>;
22
+ protected loadRawIDs(_addID: (src: ID) => void): Promise<void>;
23
+ protected loadRawData(_infos: IDInfo[], options: EdgeQueryableDataOptions): Promise<void>;
24
+ dataToID(edge: Data): ID;
25
+ protected loadEntsFromEdges(id: ID, rows: Data[]): Promise<TDest[]>;
26
+ }
27
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomClauseQuery = void 0;
4
+ const clause_1 = require("../clause");
5
+ const ent_1 = require("../ent");
6
+ const query_loader_1 = require("../loaders/query_loader");
7
+ const query_1 = require("./query");
8
+ function getClause(opts) {
9
+ let cls = opts.clause;
10
+ if (opts.disableTransformations) {
11
+ return cls;
12
+ }
13
+ let optClause = opts.loadEntOptions.loaderFactory?.options?.clause;
14
+ if (typeof optClause === "function") {
15
+ optClause = optClause();
16
+ }
17
+ if (!optClause) {
18
+ return cls;
19
+ }
20
+ return (0, clause_1.AndOptional)(cls, optClause);
21
+ }
22
+ class CustomClauseQuery extends query_1.BaseEdgeQuery {
23
+ constructor(viewer, options) {
24
+ let sortCol = options.sortColumn || "id";
25
+ let unique = options.sortColumnUnique
26
+ ? sortCol
27
+ : options.loadEntOptions.loaderFactory.options?.key || "id";
28
+ // pass direction to base class since it uses it
29
+ // this API needs to be cleaned up...
30
+ if (options.orderByDirection) {
31
+ sortCol = `${sortCol} ${options.orderByDirection}`;
32
+ }
33
+ super(viewer, sortCol, unique);
34
+ this.viewer = viewer;
35
+ this.options = options;
36
+ this.clause = getClause(options);
37
+ }
38
+ async sourceEnt(_id) {
39
+ return null;
40
+ }
41
+ getTableName() {
42
+ return this.options.loadEntOptions.tableName;
43
+ }
44
+ async queryRawCount() {
45
+ const row = await (0, ent_1.loadRow)({
46
+ tableName: this.options.loadEntOptions.tableName,
47
+ // sqlite needs as count otherwise it returns count(1)
48
+ fields: ["count(1) as count"],
49
+ clause: this.clause,
50
+ context: this.viewer.context,
51
+ });
52
+ return parseInt(row?.count, 10) || 0;
53
+ }
54
+ async queryAllRawCount() {
55
+ throw new Error(`queryAllRawCount doesn't make sense in CustomClauseQuery`);
56
+ }
57
+ // nothing to do here
58
+ async loadRawIDs(_addID) { }
59
+ async loadRawData(_infos, options) {
60
+ if (!options.orderby) {
61
+ const direction = this.options.orderByDirection ?? "desc";
62
+ options.orderby = `${this.options.sortColumn} ${direction}`;
63
+ }
64
+ if (!options.limit) {
65
+ options.limit = ent_1.DefaultLimit;
66
+ }
67
+ const rows = await (0, ent_1.loadRows)({
68
+ tableName: this.options.loadEntOptions.tableName,
69
+ fields: this.options.loadEntOptions.fields,
70
+ clause: (0, clause_1.AndOptional)(this.clause, options.clause),
71
+ orderby: (0, query_loader_1.getOrderBy)(this.getSortCol(), options?.orderby),
72
+ limit: options?.limit || ent_1.DefaultLimit,
73
+ context: this.viewer.context,
74
+ });
75
+ this.edges.set(1, rows);
76
+ }
77
+ dataToID(edge) {
78
+ return edge.id;
79
+ }
80
+ async loadEntsFromEdges(id, rows) {
81
+ return (0, ent_1.applyPrivacyPolicyForRows)(this.viewer, rows, this.options.loadEntOptions);
82
+ }
83
+ }
84
+ exports.CustomClauseQuery = CustomClauseQuery;
@@ -1,19 +1,34 @@
1
1
  import { Data, Ent, ID, EdgeQueryableDataOptions, LoadEntOptions, Viewer, LoaderFactory, ConfigurableLoaderFactory } from "../base";
2
+ import { Clause } from "../clause";
2
3
  import { BaseEdgeQuery, IDInfo, EdgeQuery } from "./query";
3
- export interface CustomEdgeQueryOptions<TSource extends Ent, TDest extends Ent> {
4
+ export interface CustomEdgeQueryOptionsDeprecated<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
4
5
  src: TSource | ID;
5
6
  countLoaderFactory: LoaderFactory<ID, number>;
6
7
  dataLoaderFactory: ConfigurableLoaderFactory<ID, Data[]>;
7
- options: LoadEntOptions<TDest>;
8
+ options: LoadEntOptions<TDest, TViewer>;
8
9
  sortColumn?: string;
9
10
  }
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;
11
+ export interface CustomEdgeQueryOptions<TSource extends Ent<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
12
+ src: TSource | ID;
13
+ loadEntOptions: LoadEntOptions<TDest, TViewer>;
14
+ groupCol?: string;
15
+ clause?: Clause;
16
+ name: string;
17
+ sortColumn?: string;
18
+ sortColumnUnique?: boolean;
19
+ disableTransformations?: boolean;
20
+ }
21
+ 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> {
22
+ viewer: TViewer;
12
23
  private options;
13
24
  private id;
14
- constructor(viewer: Viewer, options: CustomEdgeQueryOptions<TSource, TDest>);
25
+ private opts;
26
+ constructor(viewer: TViewer, options: CustomEdgeQueryOptionsDeprecated<TSource, TDest, TViewer> | CustomEdgeQueryOptions<TSource, TDest, TViewer>);
27
+ getTableName(): string;
15
28
  abstract sourceEnt(id: ID): Promise<Ent | null>;
16
29
  private idVisible;
30
+ private getCountLoader;
31
+ private getQueryLoader;
17
32
  queryRawCount(): Promise<number>;
18
33
  queryAllRawCount(): Promise<Map<ID, number>>;
19
34
  protected loadRawIDs(addID: (src: ID | TSource) => void): Promise<void>;
@@ -1,20 +1,86 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CustomEdgeQueryBase = void 0;
4
+ const clause_1 = require("../clause");
4
5
  const ent_1 = require("../ent");
6
+ const loaders_1 = require("../loaders");
5
7
  const query_1 = require("./query");
8
+ function getClause(opts) {
9
+ let cls = opts.clause;
10
+ if (opts.disableTransformations) {
11
+ return cls;
12
+ }
13
+ let optClause = opts.loadEntOptions.loaderFactory?.options?.clause;
14
+ if (typeof optClause === "function") {
15
+ optClause = optClause();
16
+ }
17
+ if (!optClause) {
18
+ return cls;
19
+ }
20
+ return (0, clause_1.AndOptional)(cls, optClause);
21
+ }
22
+ function getRawCountLoader(viewer, opts) {
23
+ if (!viewer.context?.cache) {
24
+ return new loaders_1.RawCountLoader({
25
+ tableName: opts.loadEntOptions.tableName,
26
+ groupCol: opts.groupCol,
27
+ clause: getClause(opts),
28
+ });
29
+ }
30
+ const name = `custom_query_count_loader:${opts.name}`;
31
+ return viewer.context.cache.getLoader(name, () => new loaders_1.RawCountLoader({
32
+ tableName: opts.loadEntOptions.tableName,
33
+ groupCol: opts.groupCol,
34
+ clause: getClause(opts),
35
+ }));
36
+ }
37
+ function getQueryLoader(viewer, opts, options) {
38
+ const loader = opts.loadEntOptions.loaderFactory;
39
+ const name = `custom_query_loader:${opts.name}`;
40
+ return loaders_1.QueryLoaderFactory.createConfigurableLoader(name, {
41
+ tableName: opts.loadEntOptions.tableName,
42
+ fields: opts.loadEntOptions.fields,
43
+ groupCol: opts.groupCol,
44
+ clause: getClause(opts),
45
+ toPrime: [loader],
46
+ }, options, viewer.context);
47
+ }
48
+ function isDeprecatedOptions(options) {
49
+ return (options
50
+ .countLoaderFactory !== undefined);
51
+ }
6
52
  class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
7
53
  constructor(viewer, options) {
8
- super(viewer, options.sortColumn || "created_at");
54
+ let opts;
55
+ let defaultSort = "id";
56
+ let uniqueColIsSort = false;
57
+ if (isDeprecatedOptions(options)) {
58
+ opts = options.options;
59
+ }
60
+ else {
61
+ opts = options.loadEntOptions;
62
+ if (options.sortColumnUnique) {
63
+ uniqueColIsSort = true;
64
+ }
65
+ }
66
+ let uniqueCol = opts.loaderFactory.options?.key || "id";
67
+ if (uniqueColIsSort) {
68
+ uniqueCol = options.sortColumn || defaultSort;
69
+ }
70
+ options.sortColumn = options.sortColumn || defaultSort;
71
+ super(viewer, options.sortColumn, uniqueCol);
9
72
  this.viewer = viewer;
10
73
  this.options = options;
11
- options.sortColumn = options.sortColumn || "created_at";
12
74
  if (typeof options.src === "object") {
13
75
  this.id = options.src.id;
14
76
  }
15
77
  else {
16
78
  this.id = options.src;
17
79
  }
80
+ this.opts = opts;
81
+ }
82
+ getTableName() {
83
+ return this.opts.tableName;
18
84
  }
19
85
  async idVisible() {
20
86
  const ids = await this.genIDInfosToFetch();
@@ -23,14 +89,24 @@ class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
23
89
  }
24
90
  return !ids[0].invalidated;
25
91
  }
92
+ getCountLoader() {
93
+ if (isDeprecatedOptions(this.options)) {
94
+ return this.options.countLoaderFactory.createLoader(this.viewer.context);
95
+ }
96
+ return getRawCountLoader(this.viewer, this.options);
97
+ }
98
+ getQueryLoader(options) {
99
+ if (isDeprecatedOptions(this.options)) {
100
+ return this.options.dataLoaderFactory.createConfigurableLoader(options, this.viewer.context);
101
+ }
102
+ return getQueryLoader(this.viewer, this.options, options);
103
+ }
26
104
  async queryRawCount() {
27
105
  const idVisible = await this.idVisible();
28
106
  if (!idVisible) {
29
107
  return 0;
30
108
  }
31
- return await this.options.countLoaderFactory
32
- .createLoader(this.viewer.context)
33
- .load(this.id);
109
+ return this.getCountLoader().load(this.id);
34
110
  }
35
111
  async queryAllRawCount() {
36
112
  let count = 0;
@@ -44,16 +120,16 @@ class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
44
120
  addID(this.options.src);
45
121
  }
46
122
  async loadRawData(infos, options) {
47
- const loader = this.options.dataLoaderFactory.createConfigurableLoader(options, this.viewer.context);
123
+ if (infos.length !== 1) {
124
+ throw new Error(`expected 1 info passed to loadRawData. ${infos.length} passed`);
125
+ }
48
126
  if (!options.orderby) {
49
- options.orderby = `${this.options.sortColumn} DESC`;
127
+ options.orderby = `${this.getSortCol()} DESC`;
50
128
  }
51
129
  if (!options.limit) {
52
130
  options.limit = ent_1.DefaultLimit;
53
131
  }
54
- if (infos.length !== 1) {
55
- throw new Error(`expected 1 info passed to loadRawData. ${infos.length} passed`);
56
- }
132
+ const loader = this.getQueryLoader(options);
57
133
  const info = infos[0];
58
134
  if (info.invalidated) {
59
135
  this.edges.set(this.id, []);
@@ -66,8 +142,7 @@ class CustomEdgeQueryBase extends query_1.BaseEdgeQuery {
66
142
  return edge.id;
67
143
  }
68
144
  async loadEntsFromEdges(id, rows) {
69
- const ents = await (0, ent_1.applyPrivacyPolicyForRows)(this.viewer, rows, this.options.options);
70
- return Array.from(ents.values());
145
+ return (0, ent_1.applyPrivacyPolicyForRows)(this.viewer, rows, this.opts);
71
146
  }
72
147
  }
73
148
  exports.CustomEdgeQueryBase = CustomEdgeQueryBase;
@@ -1,3 +1,4 @@
1
1
  export { EdgeQuery, BaseEdgeQuery, EdgeQueryFilter, PaginationInfo, } from "./query";
2
2
  export { AssocEdgeQueryBase, EdgeQuerySource } from "./assoc_query";
3
3
  export { CustomEdgeQueryBase } from "./custom_query";
4
+ export { CustomClauseQuery } from "./custom_clause_query";
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CustomEdgeQueryBase = exports.AssocEdgeQueryBase = exports.BaseEdgeQuery = void 0;
3
+ exports.CustomClauseQuery = exports.CustomEdgeQueryBase = exports.AssocEdgeQueryBase = exports.BaseEdgeQuery = void 0;
4
4
  var query_1 = require("./query");
5
5
  Object.defineProperty(exports, "BaseEdgeQuery", { enumerable: true, get: function () { return query_1.BaseEdgeQuery; } });
6
6
  var assoc_query_1 = require("./assoc_query");
7
7
  Object.defineProperty(exports, "AssocEdgeQueryBase", { enumerable: true, get: function () { return assoc_query_1.AssocEdgeQueryBase; } });
8
8
  var custom_query_1 = require("./custom_query");
9
9
  Object.defineProperty(exports, "CustomEdgeQueryBase", { enumerable: true, get: function () { return custom_query_1.CustomEdgeQueryBase; } });
10
+ var custom_clause_query_1 = require("./custom_clause_query");
11
+ Object.defineProperty(exports, "CustomClauseQuery", { enumerable: true, get: function () { return custom_clause_query_1.CustomClauseQuery; } });
@@ -20,7 +20,7 @@ export interface EdgeQuery<TSource extends Ent, TDest extends Ent, TEdge extends
20
20
  }
21
21
  export interface EdgeQueryFilter<T extends Data> {
22
22
  filter?(id: ID, edges: T[]): T[];
23
- query?(options: EdgeQueryableDataOptions): EdgeQueryableDataOptions;
23
+ query?(options: EdgeQueryableDataOptions): EdgeQueryableDataOptions | Promise<EdgeQueryableDataOptions>;
24
24
  paginationInfo?(id: ID): PaginationInfo | undefined;
25
25
  }
26
26
  export interface PaginationInfo {
@@ -31,7 +31,6 @@ export interface PaginationInfo {
31
31
  }
32
32
  export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends Ent, TEdge extends Data> implements EdgeQuery<TSource, TDest, TEdge> {
33
33
  viewer: Viewer;
34
- private sortCol;
35
34
  private filters;
36
35
  private queryDispatched;
37
36
  protected edges: Map<ID, TEdge[]>;
@@ -40,8 +39,12 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
40
39
  protected genIDInfosToFetch: () => Promise<IDInfo[]>;
41
40
  private idMap;
42
41
  private idsToFetch;
43
- constructor(viewer: Viewer, sortCol: string);
44
- getPrivacyPolicy(): PrivacyPolicy<Ent>;
42
+ private sortCol;
43
+ private cursorCol;
44
+ private defaultDirection?;
45
+ constructor(viewer: Viewer, sortCol: string, cursorCol: string);
46
+ protected getSortCol(): string;
47
+ getPrivacyPolicy(): PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
45
48
  abstract sourceEnt(id: ID): Promise<Ent | null>;
46
49
  first(n: number, after?: string): this;
47
50
  last(n: number, before?: string): this;
@@ -64,6 +67,7 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
64
67
  protected abstract loadRawIDs(addID: (src: ID | TSource) => void): Promise<void>;
65
68
  protected abstract loadRawData(infos: IDInfo[], options: EdgeQueryableDataOptions): Promise<void>;
66
69
  private addID;
70
+ abstract getTableName(): string | Promise<string>;
67
71
  protected genIDInfosToFetchImpl(): Promise<IDInfo[]>;
68
72
  private loadEdges;
69
73
  getCursor(row: TEdge): string;