@snowtop/ent 0.1.0-alpha12 → 0.1.0-alpha121

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 (167) hide show
  1. package/action/action.d.ts +37 -31
  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 +33 -14
  10. package/action/orchestrator.js +251 -54
  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 +60 -37
  18. package/core/base.js +7 -1
  19. package/core/clause.d.ts +84 -40
  20. package/core/clause.js +358 -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 +82 -30
  32. package/core/ent.js +632 -193
  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 +11 -10
  45. package/core/loaders/object_loader.js +70 -60
  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 +15 -7
  71. package/graphql/graphql.js +23 -7
  72. package/graphql/index.d.ts +1 -1
  73. package/graphql/index.js +3 -4
  74. package/graphql/query/connection_type.d.ts +9 -9
  75. package/graphql/query/edge_connection.d.ts +9 -9
  76. package/graphql/query/page_info.d.ts +1 -1
  77. package/graphql/query/shared_assoc_test.js +1 -1
  78. package/graphql/query/shared_edge_connection.js +1 -19
  79. package/graphql/scalars/orderby_direction.d.ts +2 -0
  80. package/graphql/scalars/orderby_direction.js +15 -0
  81. package/imports/index.d.ts +6 -1
  82. package/imports/index.js +19 -4
  83. package/index.d.ts +13 -5
  84. package/index.js +21 -7
  85. package/package.json +17 -16
  86. package/parse_schema/parse.d.ts +31 -9
  87. package/parse_schema/parse.js +152 -12
  88. package/schema/base_schema.d.ts +5 -3
  89. package/schema/base_schema.js +6 -0
  90. package/schema/field.d.ts +78 -21
  91. package/schema/field.js +219 -72
  92. package/schema/index.d.ts +2 -2
  93. package/schema/index.js +5 -1
  94. package/schema/json_field.d.ts +16 -4
  95. package/schema/json_field.js +32 -2
  96. package/schema/schema.d.ts +89 -20
  97. package/schema/schema.js +13 -14
  98. package/schema/struct_field.d.ts +15 -3
  99. package/schema/struct_field.js +71 -22
  100. package/schema/union_field.d.ts +1 -1
  101. package/scripts/custom_compiler.js +10 -6
  102. package/scripts/custom_graphql.js +124 -31
  103. package/scripts/migrate_v0.1.js +36 -0
  104. package/scripts/move_types.js +117 -0
  105. package/scripts/read_schema.js +20 -5
  106. package/testutils/action/complex_schemas.d.ts +69 -0
  107. package/testutils/action/complex_schemas.js +398 -0
  108. package/testutils/builder.d.ts +43 -47
  109. package/testutils/builder.js +76 -49
  110. package/testutils/db/fixture.d.ts +10 -0
  111. package/testutils/db/fixture.js +26 -0
  112. package/testutils/db/{test_db.d.ts → temp_db.d.ts} +24 -8
  113. package/testutils/db/{test_db.js → temp_db.js} +182 -45
  114. package/testutils/db/value.d.ts +7 -0
  115. package/testutils/db/value.js +251 -0
  116. package/testutils/db_mock.d.ts +16 -4
  117. package/testutils/db_mock.js +51 -6
  118. package/testutils/db_time_zone.d.ts +4 -0
  119. package/testutils/db_time_zone.js +41 -0
  120. package/testutils/ent-graphql-tests/index.d.ts +7 -1
  121. package/testutils/ent-graphql-tests/index.js +52 -23
  122. package/testutils/fake_data/const.d.ts +2 -1
  123. package/testutils/fake_data/const.js +3 -0
  124. package/testutils/fake_data/fake_contact.d.ts +8 -4
  125. package/testutils/fake_data/fake_contact.js +15 -8
  126. package/testutils/fake_data/fake_event.d.ts +5 -2
  127. package/testutils/fake_data/fake_event.js +9 -7
  128. package/testutils/fake_data/fake_tag.d.ts +36 -0
  129. package/testutils/fake_data/fake_tag.js +89 -0
  130. package/testutils/fake_data/fake_user.d.ts +10 -7
  131. package/testutils/fake_data/fake_user.js +18 -16
  132. package/testutils/fake_data/index.js +5 -1
  133. package/testutils/fake_data/internal.d.ts +2 -0
  134. package/testutils/fake_data/internal.js +7 -1
  135. package/testutils/fake_data/tag_query.d.ts +13 -0
  136. package/testutils/fake_data/tag_query.js +43 -0
  137. package/testutils/fake_data/test_helpers.d.ts +11 -4
  138. package/testutils/fake_data/test_helpers.js +28 -12
  139. package/testutils/fake_data/user_query.d.ts +13 -6
  140. package/testutils/fake_data/user_query.js +54 -22
  141. package/testutils/fake_log.d.ts +3 -3
  142. package/testutils/parse_sql.d.ts +6 -0
  143. package/testutils/parse_sql.js +16 -2
  144. package/testutils/test_edge_global_schema.d.ts +15 -0
  145. package/testutils/test_edge_global_schema.js +62 -0
  146. package/testutils/write.d.ts +2 -2
  147. package/testutils/write.js +33 -7
  148. package/tsc/ast.d.ts +25 -2
  149. package/tsc/ast.js +141 -17
  150. package/tsc/compilerOptions.js +5 -1
  151. package/tsc/move_generated.d.ts +1 -0
  152. package/tsc/move_generated.js +164 -0
  153. package/tsc/transform.d.ts +22 -0
  154. package/tsc/transform.js +181 -0
  155. package/tsc/transform_action.d.ts +22 -0
  156. package/tsc/transform_action.js +183 -0
  157. package/tsc/transform_ent.d.ts +17 -0
  158. package/tsc/transform_ent.js +60 -0
  159. package/tsc/transform_schema.d.ts +27 -0
  160. package/{scripts → tsc}/transform_schema.js +146 -117
  161. package/graphql/enums.d.ts +0 -3
  162. package/graphql/enums.js +0 -25
  163. package/scripts/move_generated.js +0 -142
  164. package/scripts/transform_code.js +0 -113
  165. package/scripts/transform_schema.d.ts +0 -1
  166. /package/scripts/{move_generated.d.ts → migrate_v0.1.d.ts} +0 -0
  167. /package/scripts/{transform_code.d.ts → move_types.d.ts} +0 -0
@@ -0,0 +1,7 @@
1
+ import { Field, GlobalSchema } from "../schema/schema";
2
+ export declare function setGlobalSchema(val: GlobalSchema): void;
3
+ export declare function clearGlobalSchema(): void;
4
+ export declare function __hasGlobalSchema(): boolean;
5
+ export declare function __getGlobalSchema(): GlobalSchema | undefined;
6
+ export declare function __getGlobalSchemaFields(): Map<string, Field>;
7
+ export declare function __getGlobalSchemaField(type: string): Field | undefined;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.__getGlobalSchemaField = exports.__getGlobalSchemaFields = exports.__getGlobalSchema = exports.__hasGlobalSchema = exports.clearGlobalSchema = exports.setGlobalSchema = void 0;
4
+ const schema_1 = require("../schema/schema");
5
+ let globalSchema;
6
+ let globalSchemaFields = new Map();
7
+ function isGlobalSchemaField(f) {
8
+ switch (f.type.dbType) {
9
+ case schema_1.DBType.Enum:
10
+ case schema_1.DBType.StringEnum:
11
+ case schema_1.DBType.IntEnum:
12
+ case schema_1.DBType.JSON:
13
+ case schema_1.DBType.JSONB:
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+ function setGlobalSchema(val) {
19
+ globalSchema = val;
20
+ if (val.fields) {
21
+ for (const [k, v] of Object.entries(val.fields)) {
22
+ if (isGlobalSchemaField(v) && v.type.type) {
23
+ globalSchemaFields.set(v.type.type, v);
24
+ }
25
+ }
26
+ }
27
+ }
28
+ exports.setGlobalSchema = setGlobalSchema;
29
+ function clearGlobalSchema() {
30
+ globalSchema = undefined;
31
+ globalSchemaFields.clear();
32
+ }
33
+ exports.clearGlobalSchema = clearGlobalSchema;
34
+ // used by tests. no guarantee will always exist
35
+ function __hasGlobalSchema() {
36
+ return globalSchema !== undefined;
37
+ }
38
+ exports.__hasGlobalSchema = __hasGlobalSchema;
39
+ // used by tests. no guarantee will always exist
40
+ function __getGlobalSchema() {
41
+ return globalSchema;
42
+ }
43
+ exports.__getGlobalSchema = __getGlobalSchema;
44
+ function __getGlobalSchemaFields() {
45
+ return globalSchemaFields;
46
+ }
47
+ exports.__getGlobalSchemaFields = __getGlobalSchemaFields;
48
+ function __getGlobalSchemaField(type) {
49
+ return globalSchemaFields.get(type);
50
+ }
51
+ exports.__getGlobalSchemaField = __getGlobalSchemaField;
@@ -1,10 +1,10 @@
1
1
  import { ID, Context, Loader, LoaderFactory } from "../base";
2
2
  export declare class AssocEdgeCountLoader implements Loader<ID, number> {
3
3
  private edgeType;
4
- context?: Context | undefined;
4
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
5
5
  private loaderFn;
6
6
  private loader;
7
- constructor(edgeType: string, context?: Context | undefined);
7
+ constructor(edgeType: string, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined);
8
8
  private getLoader;
9
9
  load(id: ID): Promise<number>;
10
10
  clearAll(): void;
@@ -13,5 +13,6 @@ export declare class AssocEdgeCountLoaderFactory implements LoaderFactory<ID, nu
13
13
  private edgeType;
14
14
  name: string;
15
15
  constructor(edgeType: string);
16
+ getEdgeType(): string;
16
17
  createLoader(context?: Context): AssocEdgeCountLoader;
17
18
  }
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -41,10 +45,11 @@ class AssocEdgeCountLoader {
41
45
  if (!edgeData) {
42
46
  throw new Error(`error loading edge data for ${this.edgeType}`);
43
47
  }
48
+ const { cls } = (0, ent_1.getEdgeClauseAndFields)(clause.Eq("edge_type", this.edgeType), {});
44
49
  this.loader = (0, raw_count_loader_1.createCountDataLoader)({
45
50
  tableName: edgeData.edgeTable,
46
51
  groupCol: "id1",
47
- clause: clause.Eq("edge_type", this.edgeType),
52
+ clause: cls,
48
53
  });
49
54
  return this.loader;
50
55
  }
@@ -68,6 +73,9 @@ class AssocEdgeCountLoaderFactory {
68
73
  this.edgeType = edgeType;
69
74
  this.name = `assocEdgeLoader:count:${edgeType}`;
70
75
  }
76
+ getEdgeType() {
77
+ return this.edgeType;
78
+ }
71
79
  createLoader(context) {
72
80
  return (0, loader_1.getLoader)(this, () => new AssocEdgeCountLoader(this.edgeType, context), context);
73
81
  }
@@ -20,8 +20,8 @@ export declare class AssocDirectEdgeLoader<T extends AssocEdge> implements Loade
20
20
  private edgeType;
21
21
  private edgeCtr;
22
22
  private options?;
23
- context?: Context | undefined;
24
- constructor(edgeType: string, edgeCtr: AssocEdgeConstructor<T>, options?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined, context?: Context | undefined);
23
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
24
+ constructor(edgeType: string, edgeCtr: AssocEdgeConstructor<T>, options?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined);
25
25
  load(id: ID): Promise<T[]>;
26
26
  loadEdgeForID2(id: ID, id2: ID): Promise<T | undefined>;
27
27
  clearAll(): void;
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -59,22 +63,15 @@ function createLoader(options, edgeType, edgeCtr, edgeData) {
59
63
  // TODO defaultEdgeQueryOptions
60
64
  options.limit = options.limit || ent_1.DefaultLimit;
61
65
  const tableName = edgeData.edgeTable;
66
+ const { cls: cls1, fields } = (0, ent_1.getEdgeClauseAndFields)(clause.Eq("edge_type", edgeType), {});
62
67
  const [query, cls] = (0, ent_1.buildGroupQuery)({
63
68
  tableName: tableName,
64
- fields: [
65
- "id1",
66
- "id2",
67
- "edge_type",
68
- "id1_type",
69
- "id2_type",
70
- "data",
71
- "time",
72
- ],
69
+ fields,
73
70
  values: keys,
74
71
  orderby: options.orderby,
75
72
  limit: options.limit || ent_1.DefaultLimit,
76
73
  groupColumn: "id1",
77
- clause: clause.Eq("edge_type", edgeType),
74
+ clause: cls1,
78
75
  });
79
76
  const rows = await (0, ent_1.performRawQuery)(query, cls.values(), cls.logValues());
80
77
  for (const row of rows) {
@@ -3,4 +3,4 @@ export { RawCountLoader, RawCountLoaderFactory } from "./raw_count_loader";
3
3
  export { AssocEdgeCountLoader, AssocEdgeCountLoaderFactory, } from "./assoc_count_loader";
4
4
  export { AssocDirectEdgeLoader, AssocEdgeLoader, AssocEdgeLoaderFactory, } from "./assoc_edge_loader";
5
5
  export { IndexLoaderFactory } from "./index_loader";
6
- export { QueryLoader, QueryDirectLoader, QueryLoaderFactory, } from "./query_loader";
6
+ export { QueryLoaderFactory } from "./query_loader";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.QueryLoaderFactory = exports.QueryDirectLoader = exports.QueryLoader = exports.IndexLoaderFactory = exports.AssocEdgeLoaderFactory = exports.AssocEdgeLoader = exports.AssocDirectEdgeLoader = exports.AssocEdgeCountLoaderFactory = exports.AssocEdgeCountLoader = exports.RawCountLoaderFactory = exports.RawCountLoader = exports.ObjectLoaderFactory = exports.ObjectLoader = void 0;
3
+ exports.QueryLoaderFactory = exports.IndexLoaderFactory = exports.AssocEdgeLoaderFactory = exports.AssocEdgeLoader = exports.AssocDirectEdgeLoader = exports.AssocEdgeCountLoaderFactory = exports.AssocEdgeCountLoader = exports.RawCountLoaderFactory = exports.RawCountLoader = exports.ObjectLoaderFactory = exports.ObjectLoader = void 0;
4
4
  var object_loader_1 = require("./object_loader");
5
5
  Object.defineProperty(exports, "ObjectLoader", { enumerable: true, get: function () { return object_loader_1.ObjectLoader; } });
6
6
  Object.defineProperty(exports, "ObjectLoaderFactory", { enumerable: true, get: function () { return object_loader_1.ObjectLoaderFactory; } });
@@ -17,6 +17,4 @@ Object.defineProperty(exports, "AssocEdgeLoaderFactory", { enumerable: true, get
17
17
  var index_loader_1 = require("./index_loader");
18
18
  Object.defineProperty(exports, "IndexLoaderFactory", { enumerable: true, get: function () { return index_loader_1.IndexLoaderFactory; } });
19
19
  var query_loader_1 = require("./query_loader");
20
- Object.defineProperty(exports, "QueryLoader", { enumerable: true, get: function () { return query_loader_1.QueryLoader; } });
21
- Object.defineProperty(exports, "QueryDirectLoader", { enumerable: true, get: function () { return query_loader_1.QueryDirectLoader; } });
22
20
  Object.defineProperty(exports, "QueryLoaderFactory", { enumerable: true, get: function () { return query_loader_1.QueryLoaderFactory; } });
@@ -1,4 +1,4 @@
1
- import { ID, SelectBaseDataOptions, Context, Data, LoaderFactory, EdgeQueryableDataOptions } from "../base";
1
+ import { ID, SelectBaseDataOptions, Context, Data, LoaderFactory, EdgeQueryableDataOptions, Loader } from "../base";
2
2
  import * as clause from "../clause";
3
3
  import { ObjectLoaderFactory } from "./object_loader";
4
4
  export declare class IndexLoaderFactory implements LoaderFactory<ID, Data[]> {
@@ -7,8 +7,8 @@ export declare class IndexLoaderFactory implements LoaderFactory<ID, Data[]> {
7
7
  constructor(options: SelectBaseDataOptions, col: string, opts?: {
8
8
  extraClause?: clause.Clause;
9
9
  sortColumn?: string;
10
- toPrime?: ObjectLoaderFactory<ID>[];
10
+ toPrime?: ObjectLoaderFactory<Data>[];
11
11
  });
12
12
  createLoader(context?: Context): any;
13
- createConfigurableLoader(options: EdgeQueryableDataOptions, context?: Context): import("../base").Loader<unknown, Data[]> | import("./query_loader").QueryDirectLoader<unknown>;
13
+ createConfigurableLoader(options: EdgeQueryableDataOptions, context?: Context): Loader<ID, Data[]>;
14
14
  }
@@ -1,6 +1,6 @@
1
1
  import { Loader, LoaderFactory, Context, DataOptions } from "../base";
2
- export declare function getLoader<T, V>(factory: LoaderFactory<T, V>, create: () => Loader<T, V>, context?: Context): Loader<T, V>;
3
- export declare function getCustomLoader<T, V>(key: string, create: () => Loader<T, V>, context?: Context): Loader<T, V>;
2
+ export declare function getLoader<K, V>(factory: LoaderFactory<K, V>, create: () => Loader<K, V>, context?: Context): Loader<K, V>;
3
+ export declare function getCustomLoader<K, V>(key: string, create: () => Loader<K, V>, context?: Context): Loader<K, V>;
4
4
  export declare class cacheMap {
5
5
  private options;
6
6
  private m;
@@ -37,12 +37,12 @@ class cacheMap {
37
37
  // might be a lot?
38
38
  // TODO this is not the best log format
39
39
  // was designed for ObjectLoader time. Now we have different needs e.g. count, assoc etc
40
- (0, logger_1.log)("query", {
40
+ (0, logger_1.log)("cache", {
41
41
  "dataloader-cache-hit": key,
42
42
  "tableName": this.options.tableName,
43
43
  });
44
44
  // } else {
45
- // log("query", {
45
+ // log("cache", {
46
46
  // "dataloader-cache-miss": key,
47
47
  // "tableName": options.tableName,
48
48
  // });
@@ -50,21 +50,21 @@ class cacheMap {
50
50
  return ret;
51
51
  }
52
52
  set(key, value) {
53
- // log("query", {
53
+ // log("cache", {
54
54
  // "dataloader-cache-set": key,
55
55
  // "tableName": options.tableName,
56
56
  // });
57
57
  return this.m.set(key, value);
58
58
  }
59
59
  delete(key) {
60
- // log("query", {
60
+ // log("cache", {
61
61
  // "dataloader-cache-delete": key,
62
62
  // "tableName": options.tableName,
63
63
  // });
64
64
  return this.m.delete(key);
65
65
  }
66
66
  clear() {
67
- // log("query", {
67
+ // log("cache", {
68
68
  // "dataloader-cache-clear": true,
69
69
  // "tableName": options.tableName,
70
70
  // });
@@ -1,28 +1,29 @@
1
- import { Data, SelectDataOptions, Context, Loader, LoaderFactory } from "../base";
2
- export declare class ObjectLoader<T> implements Loader<T, Data | null> {
1
+ import { ID, Data, SelectDataOptions, Context, Loader, LoaderFactory } from "../base";
2
+ export declare class ObjectLoader<V = Data> implements Loader<ID, V | null> {
3
3
  private options;
4
- context?: Context | undefined;
4
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
5
5
  private toPrime?;
6
6
  private loader;
7
7
  private primedLoaders;
8
8
  private memoizedInitPrime;
9
- constructor(options: SelectDataOptions, context?: Context | undefined, toPrime?: ObjectLoaderFactory<T>[] | undefined);
9
+ constructor(options: SelectDataOptions, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined, toPrime?: ObjectLoaderFactory<V>[] | undefined);
10
10
  getOptions(): SelectDataOptions;
11
11
  private initPrime;
12
- load(key: T): Promise<Data | null>;
12
+ load(key: ID): Promise<V | null>;
13
13
  clearAll(): void;
14
- loadMany(keys: T[]): Promise<Data[]>;
15
- prime(data: Data): void;
14
+ loadMany(keys: ID[]): Promise<Array<V | null>>;
15
+ prime(data: V): void;
16
+ primeAll(data: V): void;
16
17
  }
17
18
  interface ObjectLoaderOptions extends SelectDataOptions {
18
19
  instanceKey?: string;
19
20
  }
20
- export declare class ObjectLoaderFactory<T> implements LoaderFactory<T, Data | null> {
21
+ export declare class ObjectLoaderFactory<V = Data> implements LoaderFactory<ID, V | null> {
21
22
  options: ObjectLoaderOptions;
22
23
  name: string;
23
24
  private toPrime;
24
25
  constructor(options: ObjectLoaderOptions);
25
- createLoader(context?: Context): ObjectLoader<T>;
26
- addToPrime(factory: ObjectLoaderFactory<T>): void;
26
+ createLoader(context?: Context): ObjectLoader<V>;
27
+ addToPrime(factory: ObjectLoaderFactory<V>): this;
27
28
  }
28
29
  export {};
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -29,6 +33,48 @@ const clause = __importStar(require("../clause"));
29
33
  const logger_1 = require("../logger");
30
34
  const loader_1 = require("./loader");
31
35
  const memoizee_1 = __importDefault(require("memoizee"));
36
+ async function loadRowsForLoader(options, ids, context) {
37
+ let col = options.key;
38
+ let cls = clause.In(col, ...ids);
39
+ if (options.clause) {
40
+ let optionClause;
41
+ if (typeof options.clause === "function") {
42
+ optionClause = options.clause();
43
+ }
44
+ else {
45
+ optionClause = options.clause;
46
+ }
47
+ if (optionClause) {
48
+ // @ts-expect-error id/string mismatch
49
+ cls = clause.And(cls, optionClause);
50
+ }
51
+ }
52
+ const rowOptions = {
53
+ ...options,
54
+ clause: cls,
55
+ context,
56
+ };
57
+ let m = new Map();
58
+ let result = [];
59
+ for (let i = 0; i < ids.length; i++) {
60
+ result.push(null);
61
+ // store the index....
62
+ m.set(ids[i], i);
63
+ }
64
+ const rows = (await (0, ent_1.loadRows)(rowOptions));
65
+ for (const row of rows) {
66
+ const id = row[col];
67
+ if (id === undefined) {
68
+ throw new Error(`need to query for column ${col} when using an object loader because the query may not be sorted and we need the id to maintain sort order`);
69
+ }
70
+ const idx = m.get(id);
71
+ if (idx === undefined) {
72
+ throw new Error(`malformed query. got ${id} back but didn't query for it`);
73
+ }
74
+ result[idx] = row;
75
+ }
76
+ return result;
77
+ }
32
78
  // optional clause...
33
79
  // so ObjectLoaderFactory and createDataLoader need to take a new optional field which is a clause that's always added here
34
80
  // and we need a disableTransform which skips loader completely and uses loadRow...
@@ -42,42 +88,8 @@ function createDataLoader(options) {
42
88
  if (!ids.length) {
43
89
  return [];
44
90
  }
45
- let col = options.key;
46
- let cls = clause.In(col, ...ids);
47
- if (options.clause) {
48
- let optionClause;
49
- if (typeof options.clause === "function") {
50
- optionClause = options.clause();
51
- }
52
- else {
53
- optionClause = options.clause;
54
- }
55
- if (optionClause) {
56
- cls = clause.And(optionClause, cls);
57
- }
58
- }
59
- const rowOptions = {
60
- ...options,
61
- clause: cls,
62
- };
63
- let m = new Map();
64
- let result = [];
65
- for (let i = 0; i < ids.length; i++) {
66
- result.push(null);
67
- // store the index....
68
- m.set(ids[i], i);
69
- }
70
91
  // context not needed because we're creating a loader which has its own cache which is being used here
71
- const rows = await (0, ent_1.loadRows)(rowOptions);
72
- for (const row of rows) {
73
- const id = row[col];
74
- const idx = m.get(id);
75
- if (idx === undefined) {
76
- throw new Error(`malformed query. got ${id} back but didn't query for it`);
77
- }
78
- result[idx] = row;
79
- }
80
- return result;
92
+ return loadRowsForLoader(options, ids);
81
93
  }, loaderOptions);
82
94
  }
83
95
  class ObjectLoader {
@@ -136,7 +148,7 @@ class ObjectLoader {
136
148
  optionClause = this.options.clause;
137
149
  }
138
150
  if (optionClause) {
139
- cls = clause.And(optionClause, cls);
151
+ cls = clause.And(cls, optionClause);
140
152
  }
141
153
  }
142
154
  const rowOptions = {
@@ -144,34 +156,17 @@ class ObjectLoader {
144
156
  clause: cls,
145
157
  context: this.context,
146
158
  };
147
- return await (0, ent_1.loadRow)(rowOptions);
159
+ return (0, ent_1.loadRow)(rowOptions);
148
160
  }
149
161
  clearAll() {
150
162
  this.loader && this.loader.clearAll();
151
163
  }
152
164
  async loadMany(keys) {
153
165
  if (this.loader) {
154
- return await this.loader.loadMany(keys);
155
- }
156
- let cls = clause.In(this.options.key, ...keys);
157
- if (this.options.clause) {
158
- let optionClause;
159
- if (typeof this.options.clause === "function") {
160
- optionClause = this.options.clause();
161
- }
162
- else {
163
- optionClause = this.options.clause;
164
- }
165
- if (optionClause) {
166
- cls = clause.And(optionClause, cls);
167
- }
166
+ // @ts-expect-error TODO?
167
+ return this.loader.loadMany(keys);
168
168
  }
169
- const rowOptions = {
170
- ...this.options,
171
- clause: cls,
172
- context: this.context,
173
- };
174
- return await (0, ent_1.loadRows)(rowOptions);
169
+ return loadRowsForLoader(this.options, keys, this.context);
175
170
  }
176
171
  prime(data) {
177
172
  // we have this data from somewhere else, prime it in the c
@@ -181,14 +176,28 @@ class ObjectLoader {
181
176
  this.loader.prime(key, data);
182
177
  }
183
178
  }
179
+ // prime this loader and any other loaders it's aware of
180
+ primeAll(data) {
181
+ this.prime(data);
182
+ if (this.primedLoaders) {
183
+ for (const [key, loader] of this.primedLoaders) {
184
+ const value = data[key];
185
+ if (value !== undefined) {
186
+ loader.prime(data);
187
+ }
188
+ }
189
+ }
190
+ }
184
191
  }
185
192
  exports.ObjectLoader = ObjectLoader;
193
+ // NOTE: if not querying for all columns
194
+ // have to query for the id field as one of the fields
195
+ // because it's used to maintain sort order of the queried ids
186
196
  class ObjectLoaderFactory {
187
197
  constructor(options) {
188
198
  this.options = options;
189
199
  this.toPrime = [];
190
- // we don't wanna do it here because we want it to be delayed
191
- let instanceKey = "";
200
+ let instanceKey = options.instanceKey || "";
192
201
  if (typeof this.options.clause === "function") {
193
202
  if (!options.instanceKey) {
194
203
  throw new Error(`need to pass an instanceKey to ObjectLoader if clause is a function`);
@@ -208,6 +217,7 @@ class ObjectLoaderFactory {
208
217
  // because there's usually self references here
209
218
  addToPrime(factory) {
210
219
  this.toPrime.push(factory);
220
+ return this;
211
221
  }
212
222
  }
213
223
  exports.ObjectLoaderFactory = ObjectLoaderFactory;
@@ -1,21 +1,14 @@
1
1
  import { Context, ID, EdgeQueryableDataOptions, Loader, LoaderFactory, Data } from "../base";
2
2
  import * as clause from "../clause";
3
3
  import { ObjectLoaderFactory } from "./object_loader";
4
- export declare class QueryDirectLoader<K extends any> implements Loader<K, Data[]> {
4
+ export declare function getOrderBy(sortCol: string, orderby?: string): string;
5
+ declare class QueryDirectLoader<K extends any> implements Loader<K, Data[]> {
5
6
  private options;
6
7
  private queryOptions?;
7
- constructor(options: QueryOptions, queryOptions?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined);
8
- load(id: K): Promise<Data[]>;
9
- clearAll(): void;
10
- }
11
- export declare class QueryLoader<K extends any> implements Loader<K, Data[]> {
12
- private options;
13
- context?: Context | undefined;
14
- private queryOptions?;
15
- private loader;
16
- private primedLoaders;
8
+ context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined;
17
9
  private memoizedInitPrime;
18
- constructor(options: QueryOptions, context?: Context | undefined, queryOptions?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined);
10
+ private primedLoaders;
11
+ constructor(options: QueryOptions, queryOptions?: Partial<Pick<import("../base").QueryableDataOptions, "limit" | "orderby" | "clause">> | undefined, context?: Context<import("../base").Viewer<import("../base").Ent<any> | null, ID | null>> | undefined);
19
12
  private initPrime;
20
13
  load(id: K): Promise<Data[]>;
21
14
  clearAll(): void;
@@ -26,7 +19,7 @@ interface QueryOptions {
26
19
  groupCol?: string;
27
20
  clause?: clause.Clause;
28
21
  sortColumn?: string;
29
- toPrime?: ObjectLoaderFactory<ID>[];
22
+ toPrime?: ObjectLoaderFactory<Data>[];
30
23
  }
31
24
  export declare class QueryLoaderFactory<K extends any> implements LoaderFactory<K, Data[]> {
32
25
  private options;
@@ -34,5 +27,6 @@ export declare class QueryLoaderFactory<K extends any> implements LoaderFactory<
34
27
  constructor(options: QueryOptions);
35
28
  createLoader(context?: Context): any;
36
29
  createConfigurableLoader(options: EdgeQueryableDataOptions, context?: Context): Loader<unknown, Data[]> | QueryDirectLoader<unknown>;
30
+ static createConfigurableLoader(name: string, queryOptions: QueryOptions, options: EdgeQueryableDataOptions, context?: Context): Loader<unknown, Data[]> | QueryDirectLoader<unknown>;
37
31
  }
38
32
  export {};
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -22,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
27
  };
24
28
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.QueryLoaderFactory = exports.QueryLoader = exports.QueryDirectLoader = void 0;
29
+ exports.QueryLoaderFactory = exports.getOrderBy = void 0;
26
30
  const dataloader_1 = __importDefault(require("dataloader"));
27
31
  const ent_1 = require("../ent");
28
32
  const clause = __importStar(require("../clause"));
@@ -30,13 +34,17 @@ const logger_1 = require("../logger");
30
34
  const loader_1 = require("./loader");
31
35
  const memoizee_1 = __importDefault(require("memoizee"));
32
36
  function getOrderBy(sortCol, orderby) {
37
+ if (orderby) {
38
+ return orderby;
39
+ }
33
40
  let sortColLower = sortCol.toLowerCase();
34
41
  let orderbyDirection = " DESC";
35
42
  if (sortColLower.endsWith("asc") || sortCol.endsWith("desc")) {
36
43
  orderbyDirection = "";
37
44
  }
38
- return orderby || `${sortCol}${orderbyDirection}`;
45
+ return `${sortCol}${orderbyDirection}`;
39
46
  }
47
+ exports.getOrderBy = getOrderBy;
40
48
  async function simpleCase(options, id, queryOptions) {
41
49
  let cls;
42
50
  if (options.groupCol) {
@@ -120,16 +128,47 @@ function createLoader(options, queryOptions) {
120
128
  }, loaderOptions);
121
129
  }
122
130
  class QueryDirectLoader {
123
- constructor(options, queryOptions) {
131
+ constructor(options, queryOptions, context) {
124
132
  this.options = options;
125
133
  this.queryOptions = queryOptions;
134
+ this.context = context;
135
+ this.memoizedInitPrime = (0, memoizee_1.default)(this.initPrime.bind(this));
136
+ }
137
+ initPrime() {
138
+ if (!this.context || !this.options?.toPrime) {
139
+ return;
140
+ }
141
+ let primedLoaders = new Map();
142
+ this.options.toPrime.forEach((prime) => {
143
+ const l2 = prime.createLoader(this.context);
144
+ if (l2.prime === undefined) {
145
+ return;
146
+ }
147
+ primedLoaders.set(prime.options.key, l2);
148
+ });
149
+ this.primedLoaders = primedLoaders;
126
150
  }
127
151
  async load(id) {
128
- return simpleCase(this.options, id, this.queryOptions);
152
+ const rows = await simpleCase(this.options, id, this.queryOptions);
153
+ if (this.context) {
154
+ this.memoizedInitPrime();
155
+ if (this.primedLoaders) {
156
+ for (const row of rows) {
157
+ for (const [key, loader] of this.primedLoaders) {
158
+ const value = row[key];
159
+ if (value !== undefined) {
160
+ loader.prime(row);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+ return rows;
129
167
  }
130
168
  clearAll() { }
131
169
  }
132
- exports.QueryDirectLoader = QueryDirectLoader;
170
+ // note, you should never call this directly
171
+ // there's scenarios where QueryDirectLoader is needed instead of this...
133
172
  class QueryLoader {
134
173
  constructor(options, context, queryOptions) {
135
174
  this.options = options;
@@ -176,7 +215,6 @@ class QueryLoader {
176
215
  this.loader && this.loader.clearAll();
177
216
  }
178
217
  }
179
- exports.QueryLoader = QueryLoader;
180
218
  class QueryLoaderFactory {
181
219
  constructor(options) {
182
220
  this.options = options;
@@ -194,11 +232,14 @@ class QueryLoaderFactory {
194
232
  return (0, loader_1.getLoader)(this, () => new QueryLoader(this.options, context), context);
195
233
  }
196
234
  createConfigurableLoader(options, context) {
197
- if (options?.clause || !context) {
198
- return new QueryDirectLoader(this.options, options);
235
+ return QueryLoaderFactory.createConfigurableLoader(this.name, this.options, options, context);
236
+ }
237
+ static createConfigurableLoader(name, queryOptions, options, context) {
238
+ if (options.clause || !context) {
239
+ return new QueryDirectLoader(queryOptions, options, context);
199
240
  }
200
- const key = `${this.name}:limit:${options.limit}:orderby:${options.orderby}`;
201
- return (0, loader_1.getCustomLoader)(key, () => new QueryLoader(this.options, context, options), context);
241
+ const key = `${name}:limit:${options.limit}:orderby:${options.orderby}`;
242
+ return (0, loader_1.getCustomLoader)(key, () => new QueryLoader(queryOptions, context, options), context);
202
243
  }
203
244
  }
204
245
  exports.QueryLoaderFactory = QueryLoaderFactory;