@snowtop/ent 0.1.0-alpha15 → 0.1.0-alpha151

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 (171) hide show
  1. package/action/action.d.ts +27 -16
  2. package/action/action.js +22 -7
  3. package/action/executor.d.ts +16 -3
  4. package/action/executor.js +90 -23
  5. package/action/experimental_action.d.ts +25 -16
  6. package/action/experimental_action.js +35 -9
  7. package/action/index.d.ts +3 -1
  8. package/action/index.js +7 -1
  9. package/action/operations.d.ts +125 -0
  10. package/action/operations.js +684 -0
  11. package/action/orchestrator.d.ts +38 -12
  12. package/action/orchestrator.js +427 -102
  13. package/action/relative_value.d.ts +47 -0
  14. package/action/relative_value.js +125 -0
  15. package/action/transaction.d.ts +10 -0
  16. package/action/transaction.js +23 -0
  17. package/auth/auth.d.ts +1 -1
  18. package/core/base.d.ts +52 -21
  19. package/core/base.js +7 -1
  20. package/core/clause.d.ts +95 -40
  21. package/core/clause.js +395 -64
  22. package/core/config.d.ts +15 -1
  23. package/core/config.js +10 -1
  24. package/core/const.d.ts +3 -0
  25. package/core/const.js +6 -0
  26. package/core/context.d.ts +4 -2
  27. package/core/context.js +20 -2
  28. package/core/convert.d.ts +1 -1
  29. package/core/date.js +1 -5
  30. package/core/db.d.ts +12 -8
  31. package/core/db.js +18 -8
  32. package/core/ent.d.ts +68 -94
  33. package/core/ent.js +538 -587
  34. package/core/global_schema.d.ts +7 -0
  35. package/core/global_schema.js +51 -0
  36. package/core/loaders/assoc_count_loader.d.ts +1 -0
  37. package/core/loaders/assoc_count_loader.js +10 -2
  38. package/core/loaders/assoc_edge_loader.d.ts +1 -1
  39. package/core/loaders/assoc_edge_loader.js +10 -13
  40. package/core/loaders/index.d.ts +1 -1
  41. package/core/loaders/index.js +1 -3
  42. package/core/loaders/index_loader.d.ts +3 -3
  43. package/core/loaders/loader.d.ts +2 -2
  44. package/core/loaders/loader.js +5 -5
  45. package/core/loaders/object_loader.d.ts +30 -9
  46. package/core/loaders/object_loader.js +225 -78
  47. package/core/loaders/query_loader.d.ts +6 -12
  48. package/core/loaders/query_loader.js +54 -13
  49. package/core/loaders/raw_count_loader.d.ts +1 -0
  50. package/core/loaders/raw_count_loader.js +7 -2
  51. package/core/logger.d.ts +1 -1
  52. package/core/logger.js +1 -0
  53. package/core/privacy.d.ts +7 -6
  54. package/core/privacy.js +21 -25
  55. package/core/query/assoc_query.d.ts +3 -2
  56. package/core/query/assoc_query.js +9 -1
  57. package/core/query/custom_clause_query.d.ts +27 -0
  58. package/core/query/custom_clause_query.js +88 -0
  59. package/core/query/custom_query.d.ts +17 -2
  60. package/core/query/custom_query.js +88 -13
  61. package/core/query/index.d.ts +1 -0
  62. package/core/query/index.js +3 -1
  63. package/core/query/query.d.ts +15 -3
  64. package/core/query/query.js +128 -53
  65. package/core/query/shared_assoc_test.d.ts +2 -1
  66. package/core/query/shared_assoc_test.js +44 -54
  67. package/core/query/shared_test.d.ts +8 -1
  68. package/core/query/shared_test.js +532 -236
  69. package/core/viewer.d.ts +2 -0
  70. package/core/viewer.js +3 -1
  71. package/graphql/graphql.d.ts +52 -19
  72. package/graphql/graphql.js +174 -136
  73. package/graphql/graphql_field_helpers.d.ts +7 -1
  74. package/graphql/graphql_field_helpers.js +21 -1
  75. package/graphql/index.d.ts +2 -2
  76. package/graphql/index.js +3 -5
  77. package/graphql/query/connection_type.d.ts +9 -9
  78. package/graphql/query/shared_assoc_test.js +1 -1
  79. package/graphql/query/shared_edge_connection.js +1 -19
  80. package/graphql/scalars/orderby_direction.d.ts +2 -0
  81. package/graphql/scalars/orderby_direction.js +15 -0
  82. package/imports/dataz/example1/_auth.js +128 -47
  83. package/imports/dataz/example1/_viewer.js +87 -39
  84. package/imports/index.d.ts +7 -2
  85. package/imports/index.js +20 -5
  86. package/index.d.ts +18 -5
  87. package/index.js +30 -10
  88. package/package.json +18 -17
  89. package/parse_schema/parse.d.ts +31 -9
  90. package/parse_schema/parse.js +179 -32
  91. package/schema/base_schema.d.ts +13 -3
  92. package/schema/base_schema.js +13 -0
  93. package/schema/field.d.ts +78 -21
  94. package/schema/field.js +231 -71
  95. package/schema/index.d.ts +2 -2
  96. package/schema/index.js +7 -2
  97. package/schema/json_field.d.ts +16 -4
  98. package/schema/json_field.js +32 -2
  99. package/schema/schema.d.ts +109 -20
  100. package/schema/schema.js +42 -53
  101. package/schema/struct_field.d.ts +15 -3
  102. package/schema/struct_field.js +117 -22
  103. package/schema/union_field.d.ts +1 -1
  104. package/scripts/custom_compiler.js +12 -8
  105. package/scripts/custom_graphql.js +145 -34
  106. package/scripts/migrate_v0.1.js +36 -0
  107. package/scripts/move_types.js +120 -0
  108. package/scripts/read_schema.js +22 -7
  109. package/testutils/action/complex_schemas.d.ts +69 -0
  110. package/testutils/action/complex_schemas.js +405 -0
  111. package/testutils/builder.d.ts +39 -43
  112. package/testutils/builder.js +75 -49
  113. package/testutils/db/fixture.d.ts +10 -0
  114. package/testutils/db/fixture.js +26 -0
  115. package/testutils/db/{test_db.d.ts → temp_db.d.ts} +32 -8
  116. package/testutils/db/{test_db.js → temp_db.js} +244 -48
  117. package/testutils/db/value.d.ts +7 -0
  118. package/testutils/db/value.js +251 -0
  119. package/testutils/db_mock.d.ts +16 -4
  120. package/testutils/db_mock.js +52 -9
  121. package/testutils/db_time_zone.d.ts +4 -0
  122. package/testutils/db_time_zone.js +41 -0
  123. package/testutils/ent-graphql-tests/index.d.ts +7 -1
  124. package/testutils/ent-graphql-tests/index.js +56 -26
  125. package/testutils/fake_comms.js +1 -1
  126. package/testutils/fake_data/const.d.ts +2 -1
  127. package/testutils/fake_data/const.js +3 -0
  128. package/testutils/fake_data/fake_contact.d.ts +7 -3
  129. package/testutils/fake_data/fake_contact.js +13 -7
  130. package/testutils/fake_data/fake_event.d.ts +4 -1
  131. package/testutils/fake_data/fake_event.js +7 -6
  132. package/testutils/fake_data/fake_tag.d.ts +36 -0
  133. package/testutils/fake_data/fake_tag.js +89 -0
  134. package/testutils/fake_data/fake_user.d.ts +8 -5
  135. package/testutils/fake_data/fake_user.js +16 -15
  136. package/testutils/fake_data/index.js +5 -1
  137. package/testutils/fake_data/internal.d.ts +2 -0
  138. package/testutils/fake_data/internal.js +7 -1
  139. package/testutils/fake_data/tag_query.d.ts +13 -0
  140. package/testutils/fake_data/tag_query.js +43 -0
  141. package/testutils/fake_data/test_helpers.d.ts +11 -4
  142. package/testutils/fake_data/test_helpers.js +29 -13
  143. package/testutils/fake_data/user_query.d.ts +11 -4
  144. package/testutils/fake_data/user_query.js +54 -22
  145. package/testutils/fake_log.js +1 -1
  146. package/testutils/parse_sql.d.ts +6 -0
  147. package/testutils/parse_sql.js +16 -2
  148. package/testutils/test_edge_global_schema.d.ts +15 -0
  149. package/testutils/test_edge_global_schema.js +62 -0
  150. package/testutils/write.d.ts +2 -2
  151. package/testutils/write.js +33 -7
  152. package/tsc/ast.d.ts +25 -2
  153. package/tsc/ast.js +141 -17
  154. package/tsc/compilerOptions.js +5 -1
  155. package/tsc/move_generated.d.ts +1 -0
  156. package/tsc/move_generated.js +164 -0
  157. package/tsc/transform.d.ts +22 -0
  158. package/tsc/transform.js +182 -0
  159. package/tsc/transform_action.d.ts +22 -0
  160. package/tsc/transform_action.js +183 -0
  161. package/tsc/transform_ent.d.ts +17 -0
  162. package/tsc/transform_ent.js +60 -0
  163. package/tsc/transform_schema.d.ts +27 -0
  164. package/{scripts → tsc}/transform_schema.js +146 -117
  165. package/graphql/enums.d.ts +0 -3
  166. package/graphql/enums.js +0 -25
  167. package/scripts/move_generated.js +0 -142
  168. package/scripts/transform_code.js +0 -113
  169. package/scripts/transform_schema.d.ts +0 -1
  170. /package/scripts/{move_generated.d.ts → migrate_v0.1.d.ts} +0 -0
  171. /package/scripts/{transform_code.d.ts → move_types.d.ts} +0 -0
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,8 +3,8 @@ 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<TViewer>, TDest extends Ent<TViewer> = Ent<any>, TViewer extends Viewer = Viewer> = TSource | TSource[] | ID | ID[] | EdgeQuery<TDest, Ent, AssocEdge>;
7
- declare type loaderOptionsFunc<TViewer extends Viewer> = (type: string) => LoadEntOptions<Ent, TViewer>;
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
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
9
  viewer: TViewer;
10
10
  src: EdgeQuerySource<TSource, TDest, TViewer>;
@@ -14,6 +14,7 @@ export declare abstract class AssocEdgeQueryBase<TSource extends Ent<TViewer>, T
14
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
+ export 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
+ nullsPlacement?: "first" | "last";
12
+ disableTransformations?: boolean;
13
+ }
14
+ export declare class CustomClauseQuery<TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> extends BaseEdgeQuery<any, TDest, Data> {
15
+ viewer: TViewer;
16
+ private options;
17
+ private clause;
18
+ constructor(viewer: TViewer, options: CustomClauseQueryOptions<TDest, TViewer>);
19
+ sourceEnt(_id: ID): Promise<null>;
20
+ getTableName(): string;
21
+ queryRawCount(): Promise<number>;
22
+ queryAllRawCount(): Promise<Map<ID, number>>;
23
+ protected loadRawIDs(_addID: (src: ID) => void): Promise<void>;
24
+ protected loadRawData(_infos: IDInfo[], options: EdgeQueryableDataOptions): Promise<void>;
25
+ dataToID(edge: Data): ID;
26
+ protected loadEntsFromEdges(id: ID, rows: Data[]): Promise<TDest[]>;
27
+ }
@@ -0,0 +1,88 @@
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, {
34
+ sortCol,
35
+ cursorCol: unique,
36
+ nullsPlacement: options.nullsPlacement,
37
+ });
38
+ this.viewer = viewer;
39
+ this.options = options;
40
+ this.clause = getClause(options);
41
+ }
42
+ async sourceEnt(_id) {
43
+ return null;
44
+ }
45
+ getTableName() {
46
+ return this.options.loadEntOptions.tableName;
47
+ }
48
+ async queryRawCount() {
49
+ const row = await (0, ent_1.loadRow)({
50
+ tableName: this.options.loadEntOptions.tableName,
51
+ // sqlite needs as count otherwise it returns count(1)
52
+ fields: ["count(1) as count"],
53
+ clause: this.clause,
54
+ context: this.viewer.context,
55
+ });
56
+ return parseInt(row?.count, 10) || 0;
57
+ }
58
+ async queryAllRawCount() {
59
+ throw new Error(`queryAllRawCount doesn't make sense in CustomClauseQuery`);
60
+ }
61
+ // nothing to do here
62
+ async loadRawIDs(_addID) { }
63
+ async loadRawData(_infos, options) {
64
+ if (!options.orderby) {
65
+ const direction = this.options.orderByDirection ?? "desc";
66
+ options.orderby = `${this.options.sortColumn} ${direction}`;
67
+ }
68
+ if (!options.limit) {
69
+ options.limit = (0, ent_1.getDefaultLimit)();
70
+ }
71
+ const rows = await (0, ent_1.loadRows)({
72
+ tableName: this.options.loadEntOptions.tableName,
73
+ fields: this.options.loadEntOptions.fields,
74
+ clause: (0, clause_1.AndOptional)(this.clause, options.clause),
75
+ orderby: (0, query_loader_1.getOrderBy)(this.getSortCol(), options?.orderby),
76
+ limit: options?.limit || (0, ent_1.getDefaultLimit)(),
77
+ context: this.viewer.context,
78
+ });
79
+ this.edges.set(1, rows);
80
+ }
81
+ dataToID(edge) {
82
+ return edge.id;
83
+ }
84
+ async loadEntsFromEdges(id, rows) {
85
+ return (0, ent_1.applyPrivacyPolicyForRows)(this.viewer, rows, this.options.loadEntOptions);
86
+ }
87
+ }
88
+ 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<TViewer>, TDest extends Ent<TViewer>, TViewer extends Viewer = Viewer> {
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
8
  options: LoadEntOptions<TDest, TViewer>;
8
9
  sortColumn?: string;
9
10
  }
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
+ }
10
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> {
11
22
  viewer: TViewer;
12
23
  private options;
13
24
  private id;
14
- constructor(viewer: TViewer, options: CustomEdgeQueryOptions<TSource, TDest, TViewer>);
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
- options.limit = ent_1.DefaultLimit;
53
- }
54
- if (infos.length !== 1) {
55
- throw new Error(`expected 1 info passed to loadRawData. ${infos.length} passed`);
130
+ options.limit = (0, ent_1.getDefaultLimit)();
56
131
  }
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 {
@@ -29,9 +29,13 @@ export interface PaginationInfo {
29
29
  startCursor: string;
30
30
  endCursor: string;
31
31
  }
32
+ interface EdgeQueryOptions {
33
+ cursorCol: string;
34
+ sortCol: string;
35
+ nullsPlacement?: "first" | "last";
36
+ }
32
37
  export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends Ent, TEdge extends Data> implements EdgeQuery<TSource, TDest, TEdge> {
33
38
  viewer: Viewer;
34
- private sortCol;
35
39
  private filters;
36
40
  private queryDispatched;
37
41
  protected edges: Map<ID, TEdge[]>;
@@ -40,7 +44,13 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
40
44
  protected genIDInfosToFetch: () => Promise<IDInfo[]>;
41
45
  private idMap;
42
46
  private idsToFetch;
43
- constructor(viewer: Viewer, sortCol: string);
47
+ private sortCol;
48
+ private cursorCol;
49
+ private defaultDirection?;
50
+ private edgeQueryOptions;
51
+ constructor(viewer: Viewer, sortCol: string, cursorCol: string);
52
+ constructor(viewer: Viewer, options: EdgeQueryOptions);
53
+ protected getSortCol(): string;
44
54
  getPrivacyPolicy(): PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
45
55
  abstract sourceEnt(id: ID): Promise<Ent | null>;
46
56
  first(n: number, after?: string): this;
@@ -64,6 +74,7 @@ export declare abstract class BaseEdgeQuery<TSource extends Ent, TDest extends E
64
74
  protected abstract loadRawIDs(addID: (src: ID | TSource) => void): Promise<void>;
65
75
  protected abstract loadRawData(infos: IDInfo[], options: EdgeQueryableDataOptions): Promise<void>;
66
76
  private addID;
77
+ abstract getTableName(): string | Promise<string>;
67
78
  protected genIDInfosToFetchImpl(): Promise<IDInfo[]>;
68
79
  private loadEdges;
69
80
  getCursor(row: TEdge): string;
@@ -72,3 +83,4 @@ export interface IDInfo {
72
83
  id: ID;
73
84
  invalidated?: boolean;
74
85
  }
86
+ export {};