remult 0.17.3 → 0.18.0

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 (163) hide show
  1. package/SseSubscriptionServer.d.ts +23 -0
  2. package/SseSubscriptionServer.js +143 -0
  3. package/ably.d.ts +13 -0
  4. package/ably.js +59 -0
  5. package/esm/SseSubscriptionServer.d.ts +23 -0
  6. package/esm/SseSubscriptionServer.js +102 -0
  7. package/esm/ably.d.ts +13 -0
  8. package/esm/ably.js +28 -0
  9. package/esm/index.d.ts +7 -4
  10. package/esm/index.js +4 -2
  11. package/esm/live-query/data-provider-live-query-storage.d.ts +23 -0
  12. package/esm/live-query/data-provider-live-query-storage.js +78 -0
  13. package/esm/myLog.d.ts +1 -0
  14. package/esm/myLog.js +5 -0
  15. package/esm/postgres/postgres-data-provider.d.ts +4 -2
  16. package/esm/postgres/postgres-data-provider.js +18 -6
  17. package/esm/postgres/schema-builder.d.ts +2 -1
  18. package/esm/postgres/schema-builder.js +49 -29
  19. package/esm/remult-knex/index.d.ts +10 -32
  20. package/esm/remult-knex/index.js +75 -51
  21. package/esm/remult-mongo.d.ts +9 -2
  22. package/esm/remult-mongo.js +24 -8
  23. package/esm/remult-next.d.ts +11 -0
  24. package/esm/remult-next.js +27 -0
  25. package/esm/server/core.d.ts +2 -0
  26. package/esm/server/core.js +2 -0
  27. package/esm/server/expressBridge.d.ts +19 -7
  28. package/esm/server/expressBridge.js +135 -31
  29. package/esm/server/index.d.ts +2 -1
  30. package/esm/server/index.js +2 -1
  31. package/esm/server/initDataProvider.d.ts +2 -0
  32. package/esm/server/initDataProvider.js +14 -0
  33. package/esm/src/buildRestDataProvider.d.ts +31 -0
  34. package/esm/src/buildRestDataProvider.js +110 -0
  35. package/esm/src/column-interfaces.d.ts +44 -8
  36. package/esm/src/column.d.ts +3 -3
  37. package/esm/src/context.d.ts +39 -36
  38. package/esm/src/context.js +87 -117
  39. package/esm/src/data-api.d.ts +9 -3
  40. package/esm/src/data-api.js +130 -63
  41. package/esm/src/data-interfaces.d.ts +5 -1
  42. package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
  43. package/esm/src/data-providers/array-entity-data-provider.js +2 -17
  44. package/esm/src/data-providers/rest-data-provider.d.ts +4 -3
  45. package/esm/src/data-providers/rest-data-provider.js +64 -23
  46. package/esm/src/data-providers/sql-database.d.ts +7 -3
  47. package/esm/src/data-providers/sql-database.js +60 -17
  48. package/esm/src/data-providers/web-sql-data-provider.d.ts +3 -0
  49. package/esm/src/data-providers/web-sql-data-provider.js +23 -9
  50. package/esm/src/entity.d.ts +2 -2
  51. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  52. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
  53. package/esm/src/filter/filter-interfaces.d.ts +5 -5
  54. package/esm/src/filter/filter-interfaces.js +31 -26
  55. package/esm/src/live-query/LiveQueryClient.d.ts +1 -0
  56. package/esm/src/live-query/LiveQueryClient.js +184 -0
  57. package/esm/src/live-query/SseSubscriptionClient.d.ts +5 -0
  58. package/esm/src/live-query/SseSubscriptionClient.js +86 -0
  59. package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
  60. package/esm/src/live-query/SubscriptionChannel.js +121 -0
  61. package/esm/src/live-query/SubscriptionServer.d.ts +38 -0
  62. package/esm/src/live-query/SubscriptionServer.js +108 -0
  63. package/esm/src/remult-proxy.d.ts +1 -1
  64. package/esm/src/remult-proxy.js +52 -7
  65. package/esm/src/remult3/RepositoryImplementation.d.ts +14 -5
  66. package/esm/src/remult3/RepositoryImplementation.js +124 -44
  67. package/esm/src/remult3/getId.d.ts +2 -0
  68. package/esm/src/remult3/getId.js +7 -0
  69. package/esm/src/remult3/remult3.d.ts +67 -10
  70. package/esm/src/remult3/remult3.js +1 -0
  71. package/esm/src/server-action.d.ts +5 -1
  72. package/esm/src/server-action.js +11 -12
  73. package/esm/src/shared-tests/db-tests-setup.d.ts +12 -5
  74. package/esm/src/shared-tests/db-tests-setup.js +14 -6
  75. package/esm/src/shared-tests/db-tests.db-tests.js +71 -10
  76. package/esm/src/sort.d.ts +1 -0
  77. package/esm/src/sort.js +18 -0
  78. package/esm/src/sql-command.d.ts +5 -2
  79. package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
  80. package/esm/src/tests/entityForCustomFilter.js +20 -21
  81. package/esm/src/tests/frontend-database-tests-setup.spec.js +3 -4
  82. package/esm/src/tests/testHelper.spec.d.ts +3 -1
  83. package/esm/src/tests/testHelper.spec.js +63 -60
  84. package/esm/src/valueConverters.js +15 -7
  85. package/index.d.ts +7 -4
  86. package/index.js +7 -3
  87. package/live-query/data-provider-live-query-storage.d.ts +23 -0
  88. package/live-query/data-provider-live-query-storage.js +236 -0
  89. package/myLog.d.ts +1 -0
  90. package/myLog.js +20 -0
  91. package/package.json +18 -1
  92. package/postgres/postgres-data-provider.d.ts +4 -2
  93. package/postgres/postgres-data-provider.js +54 -39
  94. package/postgres/schema-builder.d.ts +2 -1
  95. package/postgres/schema-builder.js +118 -70
  96. package/remult-express.js +1 -1
  97. package/remult-knex/index.d.ts +10 -32
  98. package/remult-knex/index.js +134 -87
  99. package/remult-mongo.d.ts +9 -2
  100. package/remult-mongo.js +39 -7
  101. package/remult-next.d.ts +11 -0
  102. package/remult-next.js +73 -0
  103. package/server/JsonEntityFileStorage.js +2 -2
  104. package/server/core.d.ts +2 -0
  105. package/server/core.js +5 -1
  106. package/server/expressBridge.d.ts +19 -7
  107. package/server/expressBridge.js +283 -69
  108. package/server/index.d.ts +2 -1
  109. package/server/index.js +3 -1
  110. package/server/initDataProvider.d.ts +2 -0
  111. package/server/initDataProvider.js +26 -0
  112. package/src/buildRestDataProvider.d.ts +31 -0
  113. package/src/buildRestDataProvider.js +162 -0
  114. package/src/column-interfaces.d.ts +44 -8
  115. package/src/column.d.ts +3 -3
  116. package/src/context.d.ts +39 -36
  117. package/src/context.js +171 -166
  118. package/src/data-api.d.ts +9 -3
  119. package/src/data-api.js +233 -88
  120. package/src/data-interfaces.d.ts +5 -1
  121. package/src/data-providers/array-entity-data-provider.d.ts +1 -1
  122. package/src/data-providers/array-entity-data-provider.js +2 -17
  123. package/src/data-providers/rest-data-provider.d.ts +4 -3
  124. package/src/data-providers/rest-data-provider.js +105 -39
  125. package/src/data-providers/sql-database.d.ts +7 -3
  126. package/src/data-providers/sql-database.js +89 -16
  127. package/src/data-providers/web-sql-data-provider.d.ts +3 -0
  128. package/src/data-providers/web-sql-data-provider.js +56 -11
  129. package/src/entity.d.ts +2 -2
  130. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  131. package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
  132. package/src/filter/filter-interfaces.d.ts +5 -5
  133. package/src/filter/filter-interfaces.js +31 -26
  134. package/src/live-query/LiveQueryClient.d.ts +1 -0
  135. package/src/live-query/LiveQueryClient.js +283 -0
  136. package/src/live-query/SseSubscriptionClient.d.ts +5 -0
  137. package/src/live-query/SseSubscriptionClient.js +150 -0
  138. package/src/live-query/SubscriptionChannel.d.ts +41 -0
  139. package/src/live-query/SubscriptionChannel.js +209 -0
  140. package/src/live-query/SubscriptionServer.d.ts +38 -0
  141. package/src/live-query/SubscriptionServer.js +258 -0
  142. package/src/remult-proxy.d.ts +1 -1
  143. package/src/remult-proxy.js +153 -8
  144. package/src/remult3/RepositoryImplementation.d.ts +14 -5
  145. package/src/remult3/RepositoryImplementation.js +200 -85
  146. package/src/remult3/getId.d.ts +2 -0
  147. package/src/remult3/getId.js +11 -0
  148. package/src/remult3/remult3.d.ts +67 -10
  149. package/src/remult3/remult3.js +1 -0
  150. package/src/server-action.d.ts +5 -1
  151. package/src/server-action.js +11 -11
  152. package/src/shared-tests/db-tests-setup.d.ts +12 -5
  153. package/src/shared-tests/db-tests-setup.js +17 -8
  154. package/src/shared-tests/db-tests.db-tests.js +140 -8
  155. package/src/sort.d.ts +1 -0
  156. package/src/sort.js +18 -0
  157. package/src/sql-command.d.ts +5 -2
  158. package/src/tests/entityForCustomFilter.d.ts +6 -6
  159. package/src/tests/entityForCustomFilter.js +30 -31
  160. package/src/tests/frontend-database-tests-setup.spec.js +5 -6
  161. package/src/tests/testHelper.spec.d.ts +3 -1
  162. package/src/tests/testHelper.spec.js +104 -100
  163. package/src/valueConverters.js +15 -7
@@ -13,6 +13,15 @@ var WebSqlDataProvider = /** @class */ (function () {
13
13
  //@ts-ignore
14
14
  this.db = window.openDatabase(databaseName, '1.0', databaseName, databaseSize);
15
15
  }
16
+ // return instance of websql.Database class - see @types/websql
17
+ WebSqlDataProvider.getDb = function (remult) {
18
+ var sql = sql_database_1.SqlDatabase.getDb(remult);
19
+ var me = sql._getSourceSql();
20
+ if (!me.db) {
21
+ throw "the data provider is not a WebSqlDataProvider";
22
+ }
23
+ return me.db;
24
+ };
16
25
  WebSqlDataProvider.prototype.getLimitSqlSyntax = function (limit, offset) {
17
26
  return ' limit ' + limit + ' offset ' + offset;
18
27
  };
@@ -28,17 +37,53 @@ var WebSqlDataProvider = /** @class */ (function () {
28
37
  });
29
38
  });
30
39
  };
40
+ WebSqlDataProvider.prototype.ensureSchema = function (entities) {
41
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
42
+ var entities_1, entities_1_1, entity, e_1_1;
43
+ var e_1, _a;
44
+ return tslib_1.__generator(this, function (_b) {
45
+ switch (_b.label) {
46
+ case 0:
47
+ _b.trys.push([0, 5, 6, 7]);
48
+ entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next();
49
+ _b.label = 1;
50
+ case 1:
51
+ if (!!entities_1_1.done) return [3 /*break*/, 4];
52
+ entity = entities_1_1.value;
53
+ return [4 /*yield*/, this.createTable(entity)];
54
+ case 2:
55
+ _b.sent();
56
+ _b.label = 3;
57
+ case 3:
58
+ entities_1_1 = entities_1.next();
59
+ return [3 /*break*/, 1];
60
+ case 4: return [3 /*break*/, 7];
61
+ case 5:
62
+ e_1_1 = _b.sent();
63
+ e_1 = { error: e_1_1 };
64
+ return [3 /*break*/, 7];
65
+ case 6:
66
+ try {
67
+ if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
68
+ }
69
+ finally { if (e_1) throw e_1.error; }
70
+ return [7 /*endfinally*/];
71
+ case 7: return [2 /*return*/];
72
+ }
73
+ });
74
+ });
75
+ };
31
76
  WebSqlDataProvider.prototype.dropTable = function (entity) {
32
77
  return tslib_1.__awaiter(this, void 0, void 0, function () {
33
78
  var e, sql;
34
79
  return tslib_1.__generator(this, function (_a) {
35
80
  switch (_a.label) {
36
- case 0: return [4 /*yield*/, filter_consumer_bridge_to_sql_request_1.getDbNameProvider(entity)];
81
+ case 0: return [4 /*yield*/, filter_consumer_bridge_to_sql_request_1.dbNamesOf(entity)];
37
82
  case 1:
38
83
  e = _a.sent();
39
- sql = 'drop table if exists ' + e.entityName;
84
+ sql = 'drop table if exists ' + e.$entityName;
40
85
  if (sql_database_1.SqlDatabase.LogToConsole)
41
- console.log(sql);
86
+ console.info(sql);
42
87
  return [4 /*yield*/, this.createCommand().execute(sql)];
43
88
  case 2:
44
89
  _a.sent();
@@ -50,28 +95,28 @@ var WebSqlDataProvider = /** @class */ (function () {
50
95
  WebSqlDataProvider.prototype.createTable = function (entity) {
51
96
  return tslib_1.__awaiter(this, void 0, void 0, function () {
52
97
  var result, e, _a, _b, x, sql;
53
- var e_1, _c;
98
+ var e_2, _c;
54
99
  return tslib_1.__generator(this, function (_d) {
55
100
  switch (_d.label) {
56
101
  case 0:
57
102
  result = '';
58
- return [4 /*yield*/, filter_consumer_bridge_to_sql_request_1.getDbNameProvider(entity)];
103
+ return [4 /*yield*/, filter_consumer_bridge_to_sql_request_1.dbNamesOf(entity)];
59
104
  case 1:
60
105
  e = _d.sent();
61
106
  try {
62
107
  for (_a = tslib_1.__values(entity.fields), _b = _a.next(); !_b.done; _b = _a.next()) {
63
108
  x = _b.value;
64
- if (!e.isDbReadonly(x) || remult3_1.isAutoIncrement(x)) {
109
+ if (!filter_consumer_bridge_to_sql_request_1.isDbReadonly(x, e) || remult3_1.isAutoIncrement(x)) {
65
110
  if (result.length != 0)
66
111
  result += ',';
67
112
  result += '\r\n ';
68
113
  if (remult3_1.isAutoIncrement(x)) {
69
114
  if (x.key != entity.idMetadata.field.key)
70
115
  throw "in web sql, autoincrement is only allowed for primary key";
71
- result += e.nameOf(x) + ' integer primary key autoincrement';
116
+ result += e.$dbNameOf(x) + ' integer primary key autoincrement';
72
117
  }
73
118
  else {
74
- result += this.addColumnSqlSyntax(x, e.nameOf(x));
119
+ result += this.addColumnSqlSyntax(x, e.$dbNameOf(x));
75
120
  if (x.key == entity.idMetadata.field.key) {
76
121
  result += ' primary key';
77
122
  }
@@ -79,14 +124,14 @@ var WebSqlDataProvider = /** @class */ (function () {
79
124
  }
80
125
  }
81
126
  }
82
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
127
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
83
128
  finally {
84
129
  try {
85
130
  if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
86
131
  }
87
- finally { if (e_1) throw e_1.error; }
132
+ finally { if (e_2) throw e_2.error; }
88
133
  }
89
- sql = 'create table if not exists ' + e.entityName + ' (' + result + '\r\n)';
134
+ sql = 'create table if not exists ' + e.$entityName + ' (' + result + '\r\n)';
90
135
  if (sql_database_1.SqlDatabase.LogToConsole)
91
136
  console.log(sql);
92
137
  return [4 /*yield*/, this.createCommand().execute(sql)];
package/src/entity.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Allowed, AllowedForInstance } from "./context";
2
2
  import { FieldMetadata as FieldMetadata } from './column-interfaces';
3
- import { EntityOrderBy, FieldsMetadata, EntityFilter, EntityRef } from "./remult3";
3
+ import { EntityOrderBy, FieldsMetadata, EntityFilter, EntityRef, EntityMetadata } from "./remult3";
4
4
  export interface EntityOptions<entityType = any> {
5
5
  /**A human readable name for the entity */
6
6
  caption?: string;
@@ -67,7 +67,7 @@ export interface EntityOptions<entityType = any> {
67
67
  */
68
68
  dbName?: string;
69
69
  /** For entities that are based on SQL expressions instead of a physical table or view*/
70
- sqlExpression?: string | ((entity: FieldsMetadata<entityType>) => string | Promise<string>);
70
+ sqlExpression?: string | ((entity: EntityMetadata<entityType>) => string | Promise<string>);
71
71
  /** An arrow function that identifies the `id` column to use for this entity
72
72
  * @example
73
73
  * //Single column id
@@ -1,7 +1,8 @@
1
- import { SqlCommand } from "../sql-command";
1
+ import { SqlCommandWithParameters } from "../sql-command";
2
2
  import { Filter, FilterConsumer } from './filter-interfaces';
3
3
  import { FieldMetadata } from "../column-interfaces";
4
- import { EntityMetadata } from "../remult3/remult3";
4
+ import { EntityFilter, OmitEB } from "../remult3/remult3";
5
+ import { EntityMetadataOverloads, RepositoryOverloads } from "../remult3";
5
6
  export declare class FilterConsumerBridgeToSqlRequest implements FilterConsumer {
6
7
  private r;
7
8
  private nameProvider;
@@ -9,7 +10,7 @@ export declare class FilterConsumerBridgeToSqlRequest implements FilterConsumer
9
10
  _addWhere: boolean;
10
11
  promises: Promise<void>[];
11
12
  resolveWhere(): Promise<string>;
12
- constructor(r: SqlCommand, nameProvider: dbNameProvider);
13
+ constructor(r: SqlCommandWithParameters, nameProvider: EntityDbNamesBase);
13
14
  custom(key: string, customItem: any): void;
14
15
  or(orElements: Filter[]): void;
15
16
  isNull(col: FieldMetadata): void;
@@ -32,19 +33,18 @@ export interface CustomSqlFilterObject {
32
33
  }
33
34
  export declare class CustomSqlFilterBuilder {
34
35
  private r;
35
- constructor(r: SqlCommand);
36
+ constructor(r: SqlCommandWithParameters);
36
37
  sql: string;
37
38
  addParameterAndReturnSqlToken<valueType>(val: valueType, field?: FieldMetadata<valueType>): string;
39
+ filterToRaw<entityType>(repo: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<string>;
38
40
  }
39
- export declare function getDbNameProvider(meta: EntityMetadata): Promise<dbNameProvider>;
40
- export declare class dbNameProviderImpl {
41
- map: Map<string, string>;
42
- nameOf(field: FieldMetadata<any>): string;
43
- entityName: string;
44
- isDbReadonly(x: FieldMetadata): boolean;
45
- }
46
- export interface dbNameProvider {
47
- nameOf(field: FieldMetadata<any>): string;
48
- entityName: string;
49
- isDbReadonly(x: FieldMetadata): boolean;
50
- }
41
+ export declare function isDbReadonly<entityType>(field: FieldMetadata, dbNames: EntityDbNames<entityType>): boolean;
42
+ export declare type EntityDbNamesBase = {
43
+ $entityName: string;
44
+ $dbNameOf(field: FieldMetadata<any> | string): string;
45
+ toString(): string;
46
+ };
47
+ export declare type EntityDbNames<entityType> = {
48
+ [Properties in keyof Required<OmitEB<entityType>>]: string;
49
+ } & EntityDbNamesBase;
50
+ export declare function dbNamesOf<entityType>(repo: EntityMetadataOverloads<entityType>): Promise<EntityDbNames<entityType>>;
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dbNameProviderImpl = exports.getDbNameProvider = exports.CustomSqlFilterBuilder = exports.FilterConsumerBridgeToSqlRequest = void 0;
3
+ exports.dbNamesOf = exports.isDbReadonly = exports.CustomSqlFilterBuilder = exports.FilterConsumerBridgeToSqlRequest = void 0;
4
4
  var tslib_1 = require("tslib");
5
+ var remult3_1 = require("../remult3");
6
+ var sql_database_1 = require("../data-providers/sql-database");
5
7
  var FilterConsumerBridgeToSqlRequest = /** @class */ (function () {
6
8
  function FilterConsumerBridgeToSqlRequest(r, nameProvider) {
7
9
  this.r = r;
@@ -113,13 +115,13 @@ var FilterConsumerBridgeToSqlRequest = /** @class */ (function () {
113
115
  FilterConsumerBridgeToSqlRequest.prototype.isNull = function (col) {
114
116
  var _this = this;
115
117
  this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
116
- return [2 /*return*/, this.addToWhere(this.nameProvider.nameOf(col) + ' is null')];
118
+ return [2 /*return*/, this.addToWhere(this.nameProvider.$dbNameOf(col) + ' is null')];
117
119
  }); }); })());
118
120
  };
119
121
  FilterConsumerBridgeToSqlRequest.prototype.isNotNull = function (col) {
120
122
  var _this = this;
121
123
  this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
122
- return [2 /*return*/, this.addToWhere(this.nameProvider.nameOf(col) + ' is not null')];
124
+ return [2 /*return*/, this.addToWhere(this.nameProvider.$dbNameOf(col) + ' is not null')];
123
125
  }); }); })());
124
126
  };
125
127
  FilterConsumerBridgeToSqlRequest.prototype.isIn = function (col, val) {
@@ -128,7 +130,7 @@ var FilterConsumerBridgeToSqlRequest = /** @class */ (function () {
128
130
  var _this = this;
129
131
  return tslib_1.__generator(this, function (_a) {
130
132
  if (val && val.length > 0)
131
- this.addToWhere(this.nameProvider.nameOf(col) + " in (" + val.map(function (x) { return _this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(x)); }).join(",") + ")");
133
+ this.addToWhere(this.nameProvider.$dbNameOf(col) + " in (" + val.map(function (x) { return _this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(x)); }).join(",") + ")");
132
134
  else
133
135
  this.addToWhere('1 = 0 /*isIn with no values*/');
134
136
  return [2 /*return*/];
@@ -157,7 +159,7 @@ var FilterConsumerBridgeToSqlRequest = /** @class */ (function () {
157
159
  var _this = this;
158
160
  this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
159
161
  return tslib_1.__generator(this, function (_a) {
160
- this.addToWhere('lower (' + this.nameProvider.nameOf(col) + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')");
162
+ this.addToWhere('lower (' + this.nameProvider.$dbNameOf(col) + ") like lower ('%" + val.replace(/'/g, '\'\'') + "%')");
161
163
  return [2 /*return*/];
162
164
  });
163
165
  }); })());
@@ -167,7 +169,7 @@ var FilterConsumerBridgeToSqlRequest = /** @class */ (function () {
167
169
  this.promises.push((function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
168
170
  var x;
169
171
  return tslib_1.__generator(this, function (_a) {
170
- x = this.nameProvider.nameOf(col) + ' ' + operator + ' ' + this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(val));
172
+ x = this.nameProvider.$dbNameOf(col) + ' ' + operator + ' ' + this.r.addParameterAndReturnSqlToken(col.valueConverter.toDb(val));
171
173
  this.addToWhere(x);
172
174
  return [2 /*return*/];
173
175
  });
@@ -216,66 +218,73 @@ var CustomSqlFilterBuilder = /** @class */ (function () {
216
218
  val = field.valueConverter.toDb(val);
217
219
  return this.r.addParameterAndReturnSqlToken(val);
218
220
  };
221
+ CustomSqlFilterBuilder.prototype.filterToRaw = function (repo, condition) {
222
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
223
+ return tslib_1.__generator(this, function (_a) {
224
+ return [2 /*return*/, sql_database_1.SqlDatabase.filterToRaw(repo, condition, this)];
225
+ });
226
+ });
227
+ };
219
228
  return CustomSqlFilterBuilder;
220
229
  }());
221
230
  exports.CustomSqlFilterBuilder = CustomSqlFilterBuilder;
222
- function getDbNameProvider(meta) {
231
+ function isDbReadonly(field, dbNames) {
232
+ return (field.dbReadOnly || field.isServerExpression || dbNames.$dbNameOf(field) != field.options.dbName);
233
+ }
234
+ exports.isDbReadonly = isDbReadonly;
235
+ function dbNamesOf(repo) {
223
236
  return tslib_1.__awaiter(this, void 0, void 0, function () {
224
- var result, _a, _b, f, _c, _d, _e, e_3_1, _f;
225
- var e_3, _g;
226
- return tslib_1.__generator(this, function (_h) {
227
- switch (_h.label) {
237
+ var meta, result, _a, _b, field, _c, _d, e_3_1;
238
+ var _e, e_3, _f;
239
+ return tslib_1.__generator(this, function (_g) {
240
+ switch (_g.label) {
228
241
  case 0:
229
- result = new dbNameProviderImpl();
230
- _h.label = 1;
242
+ meta = remult3_1.getEntityMetadata(repo);
243
+ _e = {};
244
+ return [4 /*yield*/, meta.getDbName()];
231
245
  case 1:
232
- _h.trys.push([1, 6, 7, 8]);
233
- _a = tslib_1.__values(meta.fields), _b = _a.next();
234
- _h.label = 2;
246
+ result = (_e.$entityName = _g.sent(),
247
+ _e.toString = function () { return result.$entityName; },
248
+ _e.$dbNameOf = function (field) {
249
+ var key;
250
+ if (typeof field === "string")
251
+ key = field;
252
+ else
253
+ key = field.key;
254
+ return result[key];
255
+ },
256
+ _e);
257
+ _g.label = 2;
235
258
  case 2:
236
- if (!!_b.done) return [3 /*break*/, 5];
237
- f = _b.value;
238
- _d = (_c = result.map).set;
239
- _e = [f.key];
240
- return [4 /*yield*/, f.getDbName()];
259
+ _g.trys.push([2, 7, 8, 9]);
260
+ _a = tslib_1.__values(meta.fields), _b = _a.next();
261
+ _g.label = 3;
241
262
  case 3:
242
- _d.apply(_c, _e.concat([_h.sent()]));
243
- _h.label = 4;
263
+ if (!!_b.done) return [3 /*break*/, 6];
264
+ field = _b.value;
265
+ _c = result;
266
+ _d = field.key;
267
+ return [4 /*yield*/, field.getDbName()];
244
268
  case 4:
269
+ _c[_d] = _g.sent();
270
+ _g.label = 5;
271
+ case 5:
245
272
  _b = _a.next();
246
- return [3 /*break*/, 2];
247
- case 5: return [3 /*break*/, 8];
248
- case 6:
249
- e_3_1 = _h.sent();
250
- e_3 = { error: e_3_1 };
251
- return [3 /*break*/, 8];
273
+ return [3 /*break*/, 3];
274
+ case 6: return [3 /*break*/, 9];
252
275
  case 7:
276
+ e_3_1 = _g.sent();
277
+ e_3 = { error: e_3_1 };
278
+ return [3 /*break*/, 9];
279
+ case 8:
253
280
  try {
254
- if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
281
+ if (_b && !_b.done && (_f = _a.return)) _f.call(_a);
255
282
  }
256
283
  finally { if (e_3) throw e_3.error; }
257
284
  return [7 /*endfinally*/];
258
- case 8:
259
- _f = result;
260
- return [4 /*yield*/, meta.getDbName()];
261
- case 9:
262
- _f.entityName = _h.sent();
263
- return [2 /*return*/, result];
285
+ case 9: return [2 /*return*/, result];
264
286
  }
265
287
  });
266
288
  });
267
289
  }
268
- exports.getDbNameProvider = getDbNameProvider;
269
- var dbNameProviderImpl = /** @class */ (function () {
270
- function dbNameProviderImpl() {
271
- this.map = new Map();
272
- }
273
- dbNameProviderImpl.prototype.nameOf = function (field) {
274
- return this.map.get(field.key);
275
- };
276
- dbNameProviderImpl.prototype.isDbReadonly = function (x) {
277
- return (x.dbReadOnly || x.isServerExpression || this.nameOf(x) != x.options.dbName);
278
- };
279
- return dbNameProviderImpl;
280
- }());
281
- exports.dbNameProviderImpl = dbNameProviderImpl;
290
+ exports.dbNamesOf = dbNamesOf;
@@ -6,8 +6,8 @@ export declare class Filter {
6
6
  constructor(apply?: (add: FilterConsumer) => void);
7
7
  __applyToConsumer(add: FilterConsumer): void;
8
8
  static resolve<entityType>(filter: EntityFilter<entityType> | (() => EntityFilter<entityType> | Promise<EntityFilter<entityType>>)): Promise<EntityFilter<entityType>>;
9
- static createCustom<entityType>(customFilterTranslator: (r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): (() => EntityFilter<entityType>) & customFilterInfo<entityType>;
10
- static createCustom<entityType, argsType>(customFilterTranslator: (r: Remult, args: argsType) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): ((y: argsType) => EntityFilter<entityType>) & customFilterInfo<entityType>;
9
+ static createCustom<entityType>(rawFilterTranslator: (unused: never, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): (() => EntityFilter<entityType>) & rawFilterInfo<entityType>;
10
+ static createCustom<entityType, argsType>(rawFilterTranslator: (args: argsType, r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): ((y: argsType) => EntityFilter<entityType>) & rawFilterInfo<entityType>;
11
11
  static fromEntityFilter<T>(entity: EntityMetadata<T>, whereItem: EntityFilter<T>): Filter;
12
12
  toJson(): any;
13
13
  static entityFilterToJson<T>(entityDefs: EntityMetadata<T>, where: EntityFilter<T>): any;
@@ -77,9 +77,9 @@ export declare function entityFilterToJson<T>(entityDefs: EntityMetadata<T>, whe
77
77
  export declare function buildFilterFromRequestParameters(entity: EntityMetadata, filterInfo: {
78
78
  get: (key: string) => any;
79
79
  }): EntityFilter<any>;
80
- export interface customFilterInfo<entityType> {
81
- customFilterInfo: {
80
+ export interface rawFilterInfo<entityType> {
81
+ rawFilterInfo: {
82
82
  key: string;
83
- customFilterTranslator: (r: Remult, args: any) => (EntityFilter<entityType> | Promise<EntityFilter<entityType>>);
83
+ rawFilterTranslator: (args: any, r: Remult) => (EntityFilter<entityType> | Promise<EntityFilter<entityType>>);
84
84
  };
85
85
  }
@@ -26,20 +26,20 @@ var Filter = /** @class */ (function () {
26
26
  });
27
27
  });
28
28
  };
29
- Filter.createCustom = function (customFilterTranslator, key) {
29
+ Filter.createCustom = function (rawFilterTranslator, key) {
30
30
  if (key === void 0) { key = ''; }
31
- var customFilterInfo = { key: key, customFilterTranslator: customFilterTranslator };
31
+ var rawFilterInfo = { key: key, rawFilterTranslator: rawFilterTranslator };
32
32
  return Object.assign(function (x) {
33
33
  var _a;
34
34
  var z = {};
35
35
  if (x == undefined)
36
36
  x = {};
37
- if (!customFilterInfo.key)
37
+ if (!rawFilterInfo.key)
38
38
  throw "Usage of custom filter before a key was assigned to it";
39
39
  return _a = {},
40
- _a[exports.customUrlToken + customFilterInfo.key] = x,
40
+ _a[exports.customUrlToken + rawFilterInfo.key] = x,
41
41
  _a;
42
- }, { customFilterInfo: customFilterInfo });
42
+ }, { rawFilterInfo: rawFilterInfo });
43
43
  };
44
44
  Filter.fromEntityFilter = function (entity, whereItem) {
45
45
  var result = [];
@@ -93,6 +93,7 @@ var Filter = /** @class */ (function () {
93
93
  break;
94
94
  case "$ne":
95
95
  case "!=":
96
+ case "$nin":
96
97
  found = true;
97
98
  if (Array.isArray(element)) {
98
99
  result.push(fh.isNotIn(element));
@@ -100,6 +101,10 @@ var Filter = /** @class */ (function () {
100
101
  else
101
102
  result.push(fh.isDifferentFrom(element));
102
103
  break;
104
+ case "$in":
105
+ found = true;
106
+ result.push(fh.isIn(element));
107
+ break;
103
108
  case "$contains":
104
109
  found = true;
105
110
  result.push(fh.contains(element));
@@ -157,12 +162,12 @@ var Filter = /** @class */ (function () {
157
162
  if (!(_i < _a.length)) return [3 /*break*/, 5];
158
163
  key = _a[_i];
159
164
  element = entity.entityType[key];
160
- if (!(element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator)) return [3 /*break*/, 4];
161
- if (!(element.customFilterInfo.key == filterKey)) return [3 /*break*/, 4];
165
+ if (!(element && element.rawFilterInfo && element.rawFilterInfo.rawFilterTranslator)) return [3 /*break*/, 4];
166
+ if (!(element.rawFilterInfo.key == filterKey)) return [3 /*break*/, 4];
162
167
  _d = (_c = r).push;
163
168
  _f = (_e = Filter).fromEntityFilter;
164
169
  _g = [entity];
165
- return [4 /*yield*/, element.customFilterInfo.customFilterTranslator(remult, custom)];
170
+ return [4 /*yield*/, element.rawFilterInfo.rawFilterTranslator(custom, remult)];
166
171
  case 2: return [4 /*yield*/, _f.apply(_e, _g.concat([_h.sent()]))];
167
172
  case 3:
168
173
  _d.apply(_c, [_h.sent()]);
@@ -358,34 +363,34 @@ var FilterSerializer = /** @class */ (function () {
358
363
  }));
359
364
  };
360
365
  FilterSerializer.prototype.isNull = function (col) {
361
- this.add(col.key + "_null", true);
366
+ this.add(col.key + ".null", true);
362
367
  };
363
368
  FilterSerializer.prototype.isNotNull = function (col) {
364
- this.add(col.key + "_null", false);
369
+ this.add(col.key + ".null", false);
365
370
  };
366
371
  FilterSerializer.prototype.isIn = function (col, val) {
367
- this.add(col.key + "_in", val.map(function (x) { return col.valueConverter.toJson(x); }));
372
+ this.add(col.key + ".in", val.map(function (x) { return col.valueConverter.toJson(x); }));
368
373
  };
369
374
  FilterSerializer.prototype.isEqualTo = function (col, val) {
370
375
  this.add(col.key, col.valueConverter.toJson(val));
371
376
  };
372
377
  FilterSerializer.prototype.isDifferentFrom = function (col, val) {
373
- this.add(col.key + '_ne', col.valueConverter.toJson(val));
378
+ this.add(col.key + '.ne', col.valueConverter.toJson(val));
374
379
  };
375
380
  FilterSerializer.prototype.isGreaterOrEqualTo = function (col, val) {
376
- this.add(col.key + '_gte', col.valueConverter.toJson(val));
381
+ this.add(col.key + '.gte', col.valueConverter.toJson(val));
377
382
  };
378
383
  FilterSerializer.prototype.isGreaterThan = function (col, val) {
379
- this.add(col.key + '_gt', col.valueConverter.toJson(val));
384
+ this.add(col.key + '.gt', col.valueConverter.toJson(val));
380
385
  };
381
386
  FilterSerializer.prototype.isLessOrEqualTo = function (col, val) {
382
- this.add(col.key + '_lte', col.valueConverter.toJson(val));
387
+ this.add(col.key + '.lte', col.valueConverter.toJson(val));
383
388
  };
384
389
  FilterSerializer.prototype.isLessThan = function (col, val) {
385
- this.add(col.key + '_lt', col.valueConverter.toJson(val));
390
+ this.add(col.key + '.lt', col.valueConverter.toJson(val));
386
391
  };
387
392
  FilterSerializer.prototype.containsCaseInsensitive = function (col, val) {
388
- this.add(col.key + "_contains", val);
393
+ this.add(col.key + ".contains", val);
389
394
  };
390
395
  return FilterSerializer;
391
396
  }());
@@ -455,13 +460,13 @@ function buildFilterFromRequestParameters(entity, filterInfo) {
455
460
  }
456
461
  var c = new filterHelper(col);
457
462
  addFilter('', function (val) { return val; });
458
- addFilter('_gt', function (val) { return ({ "$gt": val }); });
459
- addFilter('_gte', function (val) { return ({ "$gte": val }); });
460
- addFilter('_lt', function (val) { return ({ "$lt": val }); });
461
- addFilter('_lte', function (val) { return ({ "$lte": val }); });
462
- addFilter('_ne', function (val) { return ({ "$ne": val }); });
463
- addFilter('_in', function (val) { return val; }, true);
464
- var nullFilter = filterInfo.get(col.key + "_null");
463
+ addFilter('.gt', function (val) { return ({ "$gt": val }); });
464
+ addFilter('.gte', function (val) { return ({ "$gte": val }); });
465
+ addFilter('.lt', function (val) { return ({ "$lt": val }); });
466
+ addFilter('.lte', function (val) { return ({ "$lte": val }); });
467
+ addFilter('.ne', function (val) { return ({ "$ne": val }); });
468
+ addFilter('.in', function (val) { return val; }, true);
469
+ var nullFilter = filterInfo.get(col.key + ".null");
465
470
  if (nullFilter) {
466
471
  nullFilter = nullFilter.toString().trim().toLowerCase();
467
472
  switch (nullFilter) {
@@ -475,7 +480,7 @@ function buildFilterFromRequestParameters(entity, filterInfo) {
475
480
  break;
476
481
  }
477
482
  }
478
- addFilter('_contains', function (val) { return ({ $contains: val }); }, false, true);
483
+ addFilter('.contains', function (val) { return ({ $contains: val }); }, false, true);
479
484
  });
480
485
  var val = filterInfo.get('OR');
481
486
  if (val) {
@@ -490,7 +495,7 @@ function buildFilterFromRequestParameters(entity, filterInfo) {
490
495
  }
491
496
  for (var key in entity.entityType) {
492
497
  var element = entity.entityType[key];
493
- if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
498
+ if (element && element.rawFilterInfo && element.rawFilterInfo.rawFilterTranslator) {
494
499
  var custom = filterInfo.get(exports.customUrlToken + key);
495
500
  if (custom !== undefined) {
496
501
  where.push((_a = {}, _a[exports.customUrlToken + key] = custom, _a));
@@ -0,0 +1 @@
1
+ export {};