@snowtop/ent 0.1.0-alpha16 → 0.1.0-alpha160-test1

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 (176) hide show
  1. package/action/action.d.ts +25 -14
  2. package/action/action.js +22 -7
  3. package/action/executor.d.ts +16 -3
  4. package/action/executor.js +89 -28
  5. package/action/experimental_action.d.ts +25 -16
  6. package/action/experimental_action.js +34 -14
  7. package/action/index.d.ts +4 -1
  8. package/action/index.js +7 -1
  9. package/action/operations.d.ts +126 -0
  10. package/action/operations.js +686 -0
  11. package/action/orchestrator.d.ts +43 -12
  12. package/action/orchestrator.js +461 -101
  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 +56 -23
  19. package/core/base.js +7 -1
  20. package/core/clause.d.ts +103 -39
  21. package/core/clause.js +430 -66
  22. package/core/config.d.ts +13 -3
  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 +6 -3
  27. package/core/context.js +22 -3
  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 +21 -9
  32. package/core/ent.d.ts +99 -95
  33. package/core/ent.js +550 -602
  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 +5 -2
  37. package/core/loaders/assoc_count_loader.js +19 -3
  38. package/core/loaders/assoc_edge_loader.d.ts +2 -3
  39. package/core/loaders/assoc_edge_loader.js +23 -17
  40. package/core/loaders/index.d.ts +1 -2
  41. package/core/loaders/index.js +1 -5
  42. package/core/loaders/loader.d.ts +3 -3
  43. package/core/loaders/loader.js +4 -21
  44. package/core/loaders/object_loader.d.ts +30 -9
  45. package/core/loaders/object_loader.js +226 -79
  46. package/core/loaders/query_loader.d.ts +7 -13
  47. package/core/loaders/query_loader.js +60 -24
  48. package/core/loaders/raw_count_loader.d.ts +1 -0
  49. package/core/loaders/raw_count_loader.js +8 -3
  50. package/core/logger.d.ts +1 -1
  51. package/core/logger.js +1 -0
  52. package/core/privacy.d.ts +26 -16
  53. package/core/privacy.js +68 -51
  54. package/core/query/assoc_query.d.ts +3 -2
  55. package/core/query/assoc_query.js +10 -2
  56. package/core/query/custom_clause_query.d.ts +29 -0
  57. package/core/query/custom_clause_query.js +105 -0
  58. package/core/query/custom_query.d.ts +19 -2
  59. package/core/query/custom_query.js +111 -13
  60. package/core/query/index.d.ts +1 -0
  61. package/core/query/index.js +3 -1
  62. package/core/query/query.d.ts +18 -4
  63. package/core/query/query.js +135 -58
  64. package/core/query/shared_assoc_test.d.ts +2 -1
  65. package/core/query/shared_assoc_test.js +186 -55
  66. package/core/query/shared_test.d.ts +9 -2
  67. package/core/query/shared_test.js +529 -236
  68. package/core/query_impl.d.ts +8 -0
  69. package/core/query_impl.js +28 -0
  70. package/core/viewer.d.ts +2 -0
  71. package/core/viewer.js +3 -1
  72. package/graphql/graphql.d.ts +108 -22
  73. package/graphql/graphql.js +183 -137
  74. package/graphql/graphql_field_helpers.d.ts +9 -3
  75. package/graphql/graphql_field_helpers.js +22 -2
  76. package/graphql/index.d.ts +2 -2
  77. package/graphql/index.js +5 -5
  78. package/graphql/query/connection_type.d.ts +9 -9
  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 +7 -2
  86. package/imports/index.js +20 -5
  87. package/index.d.ts +23 -5
  88. package/index.js +35 -10
  89. package/package.json +19 -19
  90. package/parse_schema/parse.d.ts +33 -9
  91. package/parse_schema/parse.js +182 -33
  92. package/schema/base_schema.d.ts +13 -3
  93. package/schema/base_schema.js +13 -0
  94. package/schema/field.d.ts +78 -21
  95. package/schema/field.js +232 -72
  96. package/schema/index.d.ts +2 -2
  97. package/schema/index.js +7 -2
  98. package/schema/json_field.d.ts +16 -4
  99. package/schema/json_field.js +32 -2
  100. package/schema/schema.d.ts +109 -20
  101. package/schema/schema.js +42 -53
  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 +12 -8
  106. package/scripts/custom_graphql.js +171 -64
  107. package/scripts/migrate_v0.1.js +36 -0
  108. package/scripts/move_types.js +120 -0
  109. package/scripts/read_schema.js +22 -7
  110. package/testutils/action/complex_schemas.d.ts +69 -0
  111. package/testutils/action/complex_schemas.js +405 -0
  112. package/testutils/builder.d.ts +37 -41
  113. package/testutils/builder.js +66 -46
  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} +32 -8
  117. package/testutils/db/{test_db.js → temp_db.js} +251 -48
  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 -9
  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 +56 -26
  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 +31 -19
  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 +48 -0
  142. package/testutils/fake_data/test_helpers.d.ts +14 -6
  143. package/testutils/fake_data/test_helpers.js +31 -15
  144. package/testutils/fake_data/user_query.d.ts +16 -6
  145. package/testutils/fake_data/user_query.js +72 -23
  146. package/testutils/fake_log.js +1 -1
  147. package/testutils/parse_sql.d.ts +6 -0
  148. package/testutils/parse_sql.js +16 -2
  149. package/testutils/test_edge_global_schema.d.ts +15 -0
  150. package/testutils/test_edge_global_schema.js +62 -0
  151. package/testutils/write.d.ts +2 -2
  152. package/testutils/write.js +33 -7
  153. package/tsc/ast.d.ts +15 -3
  154. package/tsc/ast.js +114 -23
  155. package/tsc/compilerOptions.js +5 -1
  156. package/tsc/move_generated.d.ts +1 -0
  157. package/tsc/move_generated.js +164 -0
  158. package/tsc/transform.d.ts +22 -0
  159. package/tsc/transform.js +182 -0
  160. package/tsc/transform_action.d.ts +22 -0
  161. package/tsc/transform_action.js +183 -0
  162. package/tsc/transform_ent.d.ts +17 -0
  163. package/tsc/transform_ent.js +60 -0
  164. package/tsc/transform_schema.d.ts +27 -0
  165. package/{scripts → tsc}/transform_schema.js +146 -117
  166. package/core/loaders/index_loader.d.ts +0 -14
  167. package/core/loaders/index_loader.js +0 -27
  168. package/graphql/enums.d.ts +0 -3
  169. package/graphql/enums.js +0 -25
  170. package/scripts/move_generated.js +0 -141
  171. package/scripts/transform_actions.js +0 -266
  172. package/scripts/transform_code.d.ts +0 -1
  173. package/scripts/transform_code.js +0 -111
  174. package/scripts/transform_schema.d.ts +0 -1
  175. /package/scripts/{move_generated.d.ts → migrate_v0.1.d.ts} +0 -0
  176. /package/scripts/{transform_actions.d.ts → move_types.d.ts} +0 -0
package/core/config.js CHANGED
@@ -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];
@@ -28,6 +32,7 @@ const js_yaml_1 = require("js-yaml");
28
32
  const db_1 = __importDefault(require("./db"));
29
33
  const path = __importStar(require("path"));
30
34
  const logger_1 = require("./logger");
35
+ const ent_1 = require("./ent");
31
36
  // ent.config.ts eventually. for now ent.yml
32
37
  // or ent.yml?
33
38
  var graphqlMutationName;
@@ -56,6 +61,10 @@ function setConfig(cfg) {
56
61
  db: cfg.db,
57
62
  });
58
63
  }
64
+ (0, ent_1.___setLogQueryErrorWithError)(cfg.logQueryWithError);
65
+ if (cfg.defaultConnectionLimit) {
66
+ (0, ent_1.setDefaultLimit)(cfg.defaultConnectionLimit);
67
+ }
59
68
  }
60
69
  function isBuffer(b) {
61
70
  return b.write !== undefined;
@@ -0,0 +1,3 @@
1
+ export declare const PACKAGE = "@snowtop/ent";
2
+ export declare const GRAPHQL_PATH = "@snowtop/ent/graphql";
3
+ export declare const SCHEMA_PATH = "@snowtop/ent/schema";
package/core/const.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCHEMA_PATH = exports.GRAPHQL_PATH = exports.PACKAGE = void 0;
4
+ exports.PACKAGE = "@snowtop/ent";
5
+ exports.GRAPHQL_PATH = "@snowtop/ent/graphql";
6
+ exports.SCHEMA_PATH = "@snowtop/ent/schema";
package/core/context.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  /// <reference types="node" />
2
- import { Viewer, Data, Loader } from "./base";
2
+ import { Viewer, Data, Loader, LoaderWithLoadMany } from "./base";
3
3
  import { IncomingMessage, ServerResponse } from "http";
4
4
  import * as clause from "./clause";
5
5
  import { Context } from "./base";
6
+ import { OrderBy } from "./query_impl";
6
7
  export interface RequestContext<TViewer extends Viewer = Viewer> extends Context<TViewer> {
7
8
  authViewer(viewer: TViewer): Promise<void>;
8
9
  logout(): Promise<void>;
@@ -11,7 +12,9 @@ export interface RequestContext<TViewer extends Viewer = Viewer> extends Context
11
12
  }
12
13
  export declare class ContextCache {
13
14
  loaders: Map<string, Loader<any, any>>;
14
- getLoader<T, V>(name: string, create: () => Loader<T, V>): Loader<T, V>;
15
+ loaderWithLoadMany: Map<string, LoaderWithLoadMany<any, any>>;
16
+ getLoader<K, V>(name: string, create: () => Loader<K, V>): Loader<K, V>;
17
+ getLoaderWithLoadMany<K, V>(name: string, create: () => LoaderWithLoadMany<K, V>): LoaderWithLoadMany<K, V>;
15
18
  private itemMap;
16
19
  private listMap;
17
20
  private getkey;
@@ -25,6 +28,6 @@ interface queryOptions {
25
28
  fields: string[];
26
29
  tableName: string;
27
30
  clause: clause.Clause;
28
- orderby?: string;
31
+ orderby?: OrderBy;
29
32
  }
30
33
  export {};
package/core/context.js CHANGED
@@ -2,9 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ContextCache = void 0;
4
4
  const logger_1 = require("./logger");
5
+ const query_impl_1 = require("./query_impl");
5
6
  class ContextCache {
6
7
  constructor() {
7
8
  this.loaders = new Map();
9
+ // we should eventually combine the two but better for typing to be separate for now
10
+ this.loaderWithLoadMany = new Map();
8
11
  // we have a per-table map to make it easier to purge and have less things to compare with
9
12
  this.itemMap = new Map();
10
13
  this.listMap = new Map();
@@ -19,6 +22,16 @@ class ContextCache {
19
22
  this.loaders.set(name, l);
20
23
  return l;
21
24
  }
25
+ getLoaderWithLoadMany(name, create) {
26
+ let l = this.loaderWithLoadMany.get(name);
27
+ if (l) {
28
+ return l;
29
+ }
30
+ (0, logger_1.log)("debug", `new context-aware loader created for ${name}`);
31
+ l = create();
32
+ this.loaderWithLoadMany.set(name, l);
33
+ return l;
34
+ }
22
35
  // tableName is ignored bcos already indexed on that
23
36
  // maybe we just want to store sql queries???
24
37
  getkey(options) {
@@ -27,7 +40,7 @@ class ContextCache {
27
40
  options.clause.instanceKey(),
28
41
  ];
29
42
  if (options.orderby) {
30
- parts.push(options.orderby);
43
+ parts.push((0, query_impl_1.getOrderByPhrase)(options.orderby));
31
44
  }
32
45
  return parts.join(",");
33
46
  }
@@ -39,7 +52,7 @@ class ContextCache {
39
52
  const key = this.getkey(options);
40
53
  let rows = m.get(key);
41
54
  if (rows) {
42
- (0, logger_1.log)("query", {
55
+ (0, logger_1.log)("cache", {
43
56
  "cache-hit": key,
44
57
  "tableName": options.tableName,
45
58
  });
@@ -54,7 +67,7 @@ class ContextCache {
54
67
  const key = this.getkey(options);
55
68
  let row = m.get(key);
56
69
  if (row) {
57
- (0, logger_1.log)("query", {
70
+ (0, logger_1.log)("cache", {
58
71
  "cache-hit": key,
59
72
  "tableName": options.tableName,
60
73
  });
@@ -79,7 +92,13 @@ class ContextCache {
79
92
  // but may have some benefits by explicitily doing so?
80
93
  loader.clearAll();
81
94
  }
95
+ for (const [_key, loader] of this.loaderWithLoadMany) {
96
+ // may not need this since we're clearing the loaders themselves...
97
+ // but may have some benefits by explicitily doing so?
98
+ loader.clearAll();
99
+ }
82
100
  this.loaders.clear();
101
+ this.loaderWithLoadMany.clear();
83
102
  this.itemMap.clear();
84
103
  this.listMap.clear();
85
104
  }
package/core/convert.d.ts CHANGED
@@ -10,5 +10,5 @@ export declare function convertBoolList(val: any): boolean[];
10
10
  export declare function convertNullableBoolList(val: any): boolean[] | null;
11
11
  export declare function convertJSON(val: any): any;
12
12
  export declare function convertNullableJSON(val: any): any | null;
13
- export declare function convertJSONList(val: any): boolean[];
13
+ export declare function convertJSONList(val: any): any[];
14
14
  export declare function convertNullableJSONList(val: any): any[] | null;
package/core/date.js CHANGED
@@ -10,11 +10,7 @@ function parseDate(val, throwErr) {
10
10
  else if (typeof val === "string") {
11
11
  dt = luxon_1.DateTime.fromISO(val);
12
12
  if (!dt.isValid) {
13
- let ms = Date.parse(val);
14
- if (ms === NaN) {
15
- throw throwErr(`invalid input for type Time ${val}`);
16
- }
17
- dt = luxon_1.DateTime.fromMillis(ms);
13
+ dt = luxon_1.DateTime.fromMillis(Date.parse(val));
18
14
  }
19
15
  }
20
16
  else if (val instanceof Date) {
package/core/db.d.ts CHANGED
@@ -5,10 +5,9 @@ export interface Database extends PoolConfig {
5
5
  password?: string;
6
6
  host?: string;
7
7
  port?: number;
8
- ssl?: boolean;
9
8
  sslmode?: string;
10
9
  }
11
- export declare type env = "production" | "test" | "development";
10
+ export type env = "production" | "test" | "development";
12
11
  export declare type DBDict = Partial<Record<env, Database>>;
13
12
  export declare enum Dialect {
14
13
  Postgres = "postgres",
@@ -19,6 +18,12 @@ interface DatabaseInfo {
19
18
  config: PoolConfig;
20
19
  filePath?: string;
21
20
  }
21
+ interface clientConfigArgs {
22
+ connectionString?: string;
23
+ dbFile?: string;
24
+ db?: Database | DBDict;
25
+ cfg?: PoolConfig;
26
+ }
22
27
  export default class DB {
23
28
  db: DatabaseInfo;
24
29
  static instance: DB;
@@ -29,15 +34,12 @@ export default class DB {
29
34
  getConnection(): Connection;
30
35
  getPool(): Queryer;
31
36
  getNewClient(): Promise<Client>;
32
- getSQLiteClient(): Promise<Sqlite>;
37
+ getSQLiteClient(): Sqlite;
33
38
  endPool(): Promise<void>;
39
+ emitsExplicitTransactionStatements(): boolean;
34
40
  static getInstance(): DB;
35
41
  static getDialect(): Dialect;
36
- static initDB(args?: {
37
- connectionString?: string;
38
- dbFile?: string;
39
- db?: Database | DBDict;
40
- }): void;
42
+ static initDB(args?: clientConfigArgs): void;
41
43
  }
42
44
  export declare const defaultTimestampParser: any;
43
45
  export interface Queryer {
@@ -54,6 +56,7 @@ export interface Connection extends Queryer {
54
56
  self(): Queryer;
55
57
  newClient(): Promise<Client>;
56
58
  close(): Promise<void>;
59
+ runInTransaction?(cb: () => void | Promise<void>): any;
57
60
  }
58
61
  export interface QueryResultRow {
59
62
  [column: string]: any;
@@ -78,6 +81,7 @@ interface SqliteRunResult {
78
81
  }
79
82
  interface SqliteDatabase {
80
83
  memory: boolean;
84
+ exec(query: string): SqliteStatement;
81
85
  prepare(query: string): SqliteStatement;
82
86
  close(): void;
83
87
  transaction(fn: (...params: any[]) => any): SqliteTransaction;
package/core/db.js CHANGED
@@ -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];
@@ -35,13 +39,14 @@ var Dialect;
35
39
  Dialect["Postgres"] = "postgres";
36
40
  Dialect["SQLite"] = "sqlite";
37
41
  })(Dialect = exports.Dialect || (exports.Dialect = {}));
38
- function parseConnectionString(str) {
42
+ function parseConnectionString(str, args) {
39
43
  if (str.startsWith("sqlite:///")) {
40
44
  let filePath = str.substr(10);
41
45
  return {
42
46
  dialect: Dialect.SQLite,
43
47
  config: {
44
48
  connectionString: str,
49
+ ...args?.cfg,
45
50
  },
46
51
  filePath,
47
52
  };
@@ -49,6 +54,7 @@ function parseConnectionString(str) {
49
54
  return {
50
55
  dialect: Dialect.Postgres,
51
56
  config: {
57
+ ...args?.cfg,
52
58
  connectionString: str,
53
59
  },
54
60
  };
@@ -63,12 +69,12 @@ function getClientConfig(args) {
63
69
  // if there's a db connection string, use that first
64
70
  const str = process.env.DB_CONNECTION_STRING;
65
71
  if (str) {
66
- return parseConnectionString(str);
72
+ return parseConnectionString(str, args);
67
73
  }
68
74
  let file = "config/database.yml";
69
75
  if (args) {
70
76
  if (args.connectionString) {
71
- return parseConnectionString(args.connectionString);
77
+ return parseConnectionString(args.connectionString, args);
72
78
  }
73
79
  if (args.db) {
74
80
  let db;
@@ -133,7 +139,9 @@ class DB {
133
139
  }
134
140
  else {
135
141
  let sqlite = require("better-sqlite3");
136
- this.q = new Sqlite(sqlite(db.filePath || ""));
142
+ const dbb = sqlite(db.filePath || "");
143
+ dbb.pragma("journal_mode = WAL");
144
+ this.q = new Sqlite(dbb);
137
145
  }
138
146
  }
139
147
  getConnection() {
@@ -148,7 +156,7 @@ class DB {
148
156
  async getNewClient() {
149
157
  return this.q.newClient();
150
158
  }
151
- async getSQLiteClient() {
159
+ getSQLiteClient() {
152
160
  if (this.db.dialect == Dialect.Postgres) {
153
161
  throw new Error(`can't call getSQLiteClient when dialect is postgres`);
154
162
  }
@@ -158,6 +166,10 @@ class DB {
158
166
  async endPool() {
159
167
  return this.q.close();
160
168
  }
169
+ emitsExplicitTransactionStatements() {
170
+ const instance = DB.getInstance();
171
+ return instance.q.runInTransaction === undefined;
172
+ }
161
173
  // throws if invalid
162
174
  static getInstance() {
163
175
  if (DB.instance) {
@@ -192,8 +204,6 @@ exports.defaultTimestampParser = pg_1.default.types.getTypeParser(pg_1.default.t
192
204
  // it's parsed as UTC time as opposed to the local time
193
205
  pg_1.default.types.setTypeParser(pg_1.default.types.builtins.TIMESTAMP, function (val) {
194
206
  return luxon_1.DateTime.fromSQL(val + "Z").toJSDate();
195
- // let d = new Date(val + "Z");
196
- // return d;
197
207
  });
198
208
  class Sqlite {
199
209
  constructor(db) {
@@ -230,6 +240,8 @@ class Sqlite {
230
240
  r = this.db.prepare(query).get(this.convertValues(values));
231
241
  }
232
242
  else {
243
+ // TODO querySync() with no values seems to do the wrong thing...
244
+ // e.g. querySync('select count(*) as count from table') returns nonsense
233
245
  r = this.db.prepare(query).run();
234
246
  }
235
247
  return {
@@ -312,7 +324,7 @@ class Postgres {
312
324
  };
313
325
  }
314
326
  async close() {
315
- return this.pool.end();
327
+ return await this.pool.end();
316
328
  }
317
329
  }
318
330
  exports.Postgres = Postgres;
package/core/ent.d.ts CHANGED
@@ -1,113 +1,123 @@
1
1
  import { Queryer, SyncQueryer } from "./db";
2
- import { Viewer, Ent, ID, LoadRowsOptions, LoadRowOptions, Data, DataOptions, QueryableDataOptions, EditRowOptions, LoadEntOptions, LoadCustomEntOptions, EdgeQueryableDataOptions, Context, SelectBaseDataOptions, CreateRowOptions, QueryDataOptions } from "./base";
3
- import { Executor } from "../action/action";
2
+ import { Viewer, Ent, ID, LoadRowsOptions, LoadRowOptions, Data, DataOptions, QueryableDataOptions, EditRowOptions, LoadEntOptions, LoadCustomEntOptions, EdgeQueryableDataOptions, Context, CreateRowOptions, QueryDataOptions, SelectCustomDataOptions, LoaderWithLoadMany } from "./base";
4
3
  import * as clause from "./clause";
5
- import { Builder } from "../action";
6
4
  import DataLoader from "dataloader";
5
+ import { OrderBy } from "./query_impl";
6
+ declare class entCacheMap<TViewer extends Viewer, TEnt extends Ent<TViewer>> {
7
+ private viewer;
8
+ private options;
9
+ private m;
10
+ private logEnabled;
11
+ constructor(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>);
12
+ get(id: ID): any;
13
+ set(key: string, value: any): Map<any, any>;
14
+ delete(key: string): boolean;
15
+ clear(): void;
16
+ }
17
+ declare class ErrorWrapper {
18
+ error: Error;
19
+ constructor(error: Error);
20
+ }
21
+ export declare function rowIsError(row: any): row is Error;
22
+ declare class EntLoader<TViewer extends Viewer, TEnt extends Ent<TViewer>> implements LoaderWithLoadMany<ID, TEnt | ErrorWrapper | Error> {
23
+ private viewer;
24
+ private options;
25
+ private loader;
26
+ private map;
27
+ constructor(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>);
28
+ getMap(): entCacheMap<TViewer, TEnt>;
29
+ load(id: ID): Promise<TEnt | ErrorWrapper>;
30
+ loadMany(ids: ID[]): Promise<Array<TEnt | ErrorWrapper | Error>>;
31
+ prime(id: ID, ent: TEnt | ErrorWrapper): void;
32
+ clear(id: ID): void;
33
+ clearAll(): void;
34
+ }
35
+ export declare function getEntLoader<TViewer extends Viewer, TEnt extends Ent<TViewer>>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>): EntLoader<TViewer, TEnt>;
36
+ export declare function getEntKey<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id: ID, options: LoadEntOptions<TEnt, TViewer>): string;
7
37
  export declare function loadEnt<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id: ID, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
8
38
  export declare function loadEntViaKey<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, key: any, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
9
39
  export declare function loadEntX<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id: ID, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt>;
10
40
  export declare function loadEntXViaKey<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, key: any, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt>;
41
+ /**
42
+ * @deprecated use loadCustomEnts
43
+ */
11
44
  export declare function loadEntFromClause<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, clause: clause.Clause): Promise<TEnt | null>;
45
+ /**
46
+ * @deprecated use loadCustomEnts
47
+ */
12
48
  export declare function loadEntXFromClause<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, clause: clause.Clause): Promise<TEnt>;
13
49
  export declare function loadEnts<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, ...ids: ID[]): Promise<Map<ID, TEnt>>;
14
50
  export declare function loadEntsList<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, ...ids: ID[]): Promise<TEnt[]>;
51
+ /**
52
+ * @deperecated use loadCustomEnts
53
+ */
15
54
  export declare function loadEntsFromClause<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, clause: clause.Clause, options: LoadEntOptions<TEnt, TViewer>): Promise<Map<ID, TEnt>>;
16
- export declare function loadCustomEnts<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadCustomEntOptions<TEnt, TViewer>, query: CustomQuery): Promise<TEnt[]>;
17
- interface rawQueryOptions {
55
+ export declare function loadCustomEnts<TEnt extends Ent<TViewer>, TViewer extends Viewer, TQueryData extends Data = Data, TResultData extends Data = TQueryData, TKey = keyof TQueryData>(viewer: TViewer, options: LoadCustomEntOptions<TEnt, TViewer, TResultData>, query: CustomQuery<TQueryData, TKey>): Promise<TEnt[]>;
56
+ export interface parameterizedQueryOptions {
18
57
  query: string;
19
58
  values?: any[];
20
59
  logValues?: any[];
21
60
  }
22
- export declare type CustomQuery = string | rawQueryOptions | clause.Clause | QueryDataOptions;
23
- export declare function loadCustomData(options: SelectBaseDataOptions, query: CustomQuery, context: Context | undefined): Promise<Data[]>;
61
+ export type CustomQuery<T extends Data = Data, K = keyof T> = string | parameterizedQueryOptions | clause.Clause<T, K> | QueryDataOptions<T, K>;
62
+ /**
63
+ * Note that if there's default read transformations (e.g. soft delete) and a clause is passed in
64
+ * either as Clause or QueryDataOptions without {disableTransformations: true}, the default transformation
65
+ * (e.g. soft delete) is applied.
66
+ *
67
+ * Passing a full SQL string or Paramterized SQL string doesn't apply it and the given string is sent to the
68
+ * database as written.
69
+ *
70
+ * e.g.
71
+ * Foo.loadCustom(opts, 'SELECT * FROM foo') // doesn't change the query
72
+ * Foo.loadCustom(opts, { query: 'SELECT * FROM foo WHERE id = ?', values: [1]}) // doesn't change the query
73
+ * Foo.loadCustom(opts, query.Eq('time', Date.now())) // changes the query
74
+ * Foo.loadCustom(opts, {
75
+ * clause: query.LessEq('time', Date.now()),
76
+ * limit: 100,
77
+ * orderby: 'time',
78
+ * }) // changes the query
79
+ * Foo.loadCustom(opts, {
80
+ * clause: query.LessEq('time', Date.now()),
81
+ * limit: 100,
82
+ * orderby: 'time',
83
+ * disableTransformations: false
84
+ * }) // doesn't change the query
85
+ *
86
+ * For queries that pass in a clause, we batch them with an underlying dataloader so that multiple queries with the same clause
87
+ * or parallel queries with the same clause are batched together.
88
+ *
89
+ * If a raw or parameterized query is passed in, we don't attempt to batch them together and they're executed as is.
90
+ * If you end up with a scenario where you may need to coalesce or batch (non-clause) queries here, you should use some kind of memoization here.
91
+ */
92
+ export declare function loadCustomData<TQueryData extends Data = Data, TResultData extends Data = TQueryData, K = keyof TQueryData>(options: SelectCustomDataOptions<TResultData>, query: CustomQuery<TQueryData, K>, context: Context | undefined): Promise<TResultData[]>;
93
+ export declare function loadCustomCount<T extends Data = Data, K = keyof T>(options: SelectCustomDataOptions<T>, query: CustomQuery<T, K>, context: Context | undefined): Promise<number>;
24
94
  export declare function loadDerivedEnt<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, data: Data, loader: new (viewer: TViewer, data: Data) => TEnt): Promise<TEnt | null>;
25
95
  export declare function loadDerivedEntX<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, data: Data, loader: new (viewer: TViewer, data: Data) => TEnt): Promise<TEnt>;
96
+ export declare function logQuery(query: string, logValues: any[]): void;
26
97
  export declare function loadRowX(options: LoadRowOptions): Promise<Data>;
27
98
  export declare function loadRow(options: LoadRowOptions): Promise<Data | null>;
99
+ export declare function ___setLogQueryErrorWithError(val: boolean | undefined): void;
28
100
  export declare function performRawQuery(query: string, values: any[], logValues?: any[]): Promise<Data[]>;
29
101
  export declare function loadRows(options: LoadRowsOptions): Promise<Data[]>;
30
102
  export declare function buildQuery(options: QueryableDataOptions): string;
31
- interface GroupQueryOptions {
103
+ interface GroupQueryOptions<T extends Data, K = keyof T> {
32
104
  tableName: string;
33
- clause?: clause.Clause;
34
- groupColumn: string;
35
- fields: string[];
105
+ clause?: clause.Clause<T, K>;
106
+ groupColumn: K;
107
+ fields: K[];
36
108
  values: any[];
37
- orderby?: string;
109
+ orderby?: OrderBy;
38
110
  limit: number;
39
111
  }
40
- export declare function buildGroupQuery(options: GroupQueryOptions): [string, clause.Clause];
41
- export interface DataOperation<T extends Ent = Ent> {
42
- preFetch?(queryer: Queryer, context?: Context): Promise<void>;
43
- performWriteSync(queryer: SyncQueryer, context?: Context): void;
44
- performWrite(queryer: Queryer, context?: Context): Promise<void>;
45
- placeholderID?: ID;
46
- returnedRow?(): Data | null;
47
- createdEnt?(viewer: Viewer): T | null;
48
- resolve?(executor: Executor): void;
49
- postFetch?(queryer: Queryer, context?: Context): Promise<void>;
50
- }
51
- export interface EditNodeOptions<T extends Ent> extends EditRowOptions {
52
- fieldsToResolve: string[];
53
- loadEntOptions: LoadEntOptions<T>;
54
- placeholderID?: ID;
55
- }
56
- export declare class EditNodeOperation<T extends Ent> implements DataOperation {
57
- options: EditNodeOptions<T>;
58
- private existingEnt;
59
- row: Data | null;
60
- placeholderID?: ID | undefined;
61
- constructor(options: EditNodeOptions<T>, existingEnt?: Ent | null);
62
- resolve<T extends Ent>(executor: Executor): void;
63
- private hasData;
64
- performWrite(queryer: Queryer, context?: Context): Promise<void>;
65
- private reloadRow;
66
- performWriteSync(queryer: SyncQueryer, context?: Context): void;
67
- returnedRow(): Data | null;
68
- createdEnt(viewer: Viewer): T | null;
69
- }
70
- export declare class EdgeOperation implements DataOperation {
71
- edgeInput: AssocEdgeInput;
72
- private options;
73
- private edgeData;
74
- private constructor();
75
- preFetch(queryer: Queryer, context?: Context): Promise<void>;
76
- performWrite(queryer: Queryer, context?: Context): Promise<void>;
77
- performWriteSync(queryer: SyncQueryer, context?: Context): void;
78
- private getDeleteRowParams;
79
- private performDeleteWrite;
80
- private performDeleteWriteSync;
81
- private getInsertRowParams;
82
- private performInsertWrite;
83
- private performInsertWriteSync;
84
- private resolveImpl;
85
- resolve(executor: Executor): void;
86
- symmetricEdge(): EdgeOperation;
87
- inverseEdge(edgeData: AssocEdgeData): EdgeOperation;
88
- private static resolveIDs;
89
- private static isBuilder;
90
- private static resolveData;
91
- static inboundEdge<T extends Ent, T2 extends Ent>(builder: Builder<T>, edgeType: string, id1: Builder<T2> | ID, nodeType: string, options?: AssocEdgeInputOptions): EdgeOperation;
92
- static outboundEdge<T extends Ent, T2 extends Ent>(builder: Builder<T>, edgeType: string, id2: Builder<T2> | ID, nodeType: string, options?: AssocEdgeInputOptions): EdgeOperation;
93
- static removeInboundEdge<T extends Ent>(builder: Builder<T>, edgeType: string, id1: ID): EdgeOperation;
94
- static removeOutboundEdge<T extends Ent>(builder: Builder<T>, edgeType: string, id2: ID): EdgeOperation;
95
- }
112
+ export declare function buildGroupQuery<T extends Data = Data, K = keyof T>(options: GroupQueryOptions<T, K>): [string, clause.Clause<T, K>];
96
113
  export declare function buildInsertQuery(options: CreateRowOptions, suffix?: string): [string, string[], string[]];
97
114
  export declare function createRow(queryer: Queryer, options: CreateRowOptions, suffix: string): Promise<Data | null>;
98
115
  export declare function createRowSync(queryer: SyncQueryer, options: CreateRowOptions, suffix: string): Data | null;
99
- export declare function buildUpdateQuery(options: EditRowOptions, id: ID, suffix?: string): [string, any[], any[]];
100
- export declare function editRow(queryer: Queryer, options: EditRowOptions, id: ID, suffix?: string): Promise<Data | null>;
101
- export declare function editRowSync(queryer: SyncQueryer, options: EditRowOptions, id: ID, suffix?: string): Data | null;
116
+ export declare function buildUpdateQuery(options: EditRowOptions, suffix?: string): [string, any[], any[]];
117
+ export declare function editRow(queryer: Queryer, options: EditRowOptions, suffix?: string): Promise<Data | null>;
118
+ export declare function editRowSync(queryer: SyncQueryer, options: EditRowOptions, suffix?: string): Data | null;
102
119
  export declare function deleteRows(queryer: Queryer, options: DataOptions, cls: clause.Clause): Promise<void>;
103
120
  export declare function deleteRowsSync(queryer: SyncQueryer, options: DataOptions, cls: clause.Clause): void;
104
- export declare class DeleteNodeOperation implements DataOperation {
105
- private id;
106
- private options;
107
- constructor(id: ID, options: DataOptions);
108
- performWrite(queryer: Queryer, context?: Context): Promise<void>;
109
- performWriteSync(queryer: SyncQueryer, context?: Context): void;
110
- }
111
121
  export declare class AssocEdge {
112
122
  id1: ID;
113
123
  id1Type: string;
@@ -116,7 +126,9 @@ export declare class AssocEdge {
116
126
  id2Type: string;
117
127
  time: Date;
118
128
  data?: string | null;
129
+ private rawData;
119
130
  constructor(data: Data);
131
+ __getRawData(): Data;
120
132
  getCursor(): string;
121
133
  }
122
134
  interface cursorOptions {
@@ -126,17 +138,6 @@ interface cursorOptions {
126
138
  conv?: (any: any) => any;
127
139
  }
128
140
  export declare function getCursor(opts: cursorOptions): string;
129
- export interface AssocEdgeInputOptions {
130
- time?: Date;
131
- data?: string | Builder<Ent>;
132
- }
133
- export interface AssocEdgeInput extends AssocEdgeInputOptions {
134
- id1: ID;
135
- id1Type: string;
136
- edgeType: string;
137
- id2: ID;
138
- id2Type: string;
139
- }
140
141
  export declare class AssocEdgeData {
141
142
  edgeType: string;
142
143
  edgeName: string;
@@ -145,7 +146,7 @@ export declare class AssocEdgeData {
145
146
  edgeTable: string;
146
147
  constructor(data: Data);
147
148
  }
148
- export declare const assocEdgeLoader: DataLoader<any, any, any>;
149
+ export declare const assocEdgeLoader: DataLoader<ID, Data | null, ID>;
149
150
  export declare function loadEdgeData(edgeType: string): Promise<AssocEdgeData | null>;
150
151
  export declare function loadEdgeDatas(...edgeTypes: string[]): Promise<Map<string, AssocEdgeData>>;
151
152
  export interface AssocEdgeConstructor<T extends AssocEdge> {
@@ -160,9 +161,13 @@ interface loadEdgesOptions {
160
161
  interface loadCustomEdgesOptions<T extends AssocEdge> extends loadEdgesOptions {
161
162
  ctr: AssocEdgeConstructor<T>;
162
163
  }
163
- export declare const DefaultLimit = 1000;
164
- export declare function defaultEdgeQueryOptions(id1: ID, edgeType: string): EdgeQueryableDataOptions;
164
+ export declare function setDefaultLimit(limit: number): void;
165
+ export declare function getDefaultLimit(): number;
165
166
  export declare function loadEdges(options: loadEdgesOptions): Promise<AssocEdge[]>;
167
+ export declare function getEdgeClauseAndFields(cls: clause.Clause, options: Pick<loadEdgesOptions, "queryOptions">): {
168
+ cls: clause.Clause<Data, string | number>;
169
+ fields: string[];
170
+ };
166
171
  export declare function loadCustomEdges<T extends AssocEdge>(options: loadCustomEdgesOptions<T>): Promise<T[]>;
167
172
  export declare function loadUniqueEdge(options: loadEdgesOptions): Promise<AssocEdge | null>;
168
173
  export declare function loadUniqueNode<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id1: ID, edgeType: string, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
@@ -172,8 +177,7 @@ interface loadEdgeForIDOptions<T extends AssocEdge> extends loadCustomEdgesOptio
172
177
  }
173
178
  export declare function loadEdgeForID2<T extends AssocEdge>(options: loadEdgeForIDOptions<T>): Promise<T | undefined>;
174
179
  export declare function loadNodesByEdge<T extends Ent>(viewer: Viewer, id1: ID, edgeType: string, options: LoadEntOptions<T>): Promise<T[]>;
175
- export declare function applyPrivacyPolicyForRow<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, row: Data | null): Promise<T | null>;
176
- export declare function applyPrivacyPolicyForRowX<T extends Ent>(viewer: Viewer, options: LoadEntOptions<T>, row: Data): Promise<T>;
177
- export declare function applyPrivacyPolicyForRows<T extends Ent>(viewer: Viewer, rows: Data[], options: LoadEntOptions<T>): Promise<Map<ID, T>>;
180
+ export declare function applyPrivacyPolicyForRow<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>, row: Data): Promise<TEnt | null>;
181
+ export declare function applyPrivacyPolicyForRows<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, rows: Data[], options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt[]>;
178
182
  export declare function getEdgeTypeInGroup<T extends string>(viewer: Viewer, id1: ID, id2: ID, m: Map<T, string>): Promise<[T, AssocEdge] | undefined>;
179
183
  export {};