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.
- package/SseSubscriptionServer.d.ts +23 -0
- package/SseSubscriptionServer.js +143 -0
- package/ably.d.ts +13 -0
- package/ably.js +59 -0
- package/esm/SseSubscriptionServer.d.ts +23 -0
- package/esm/SseSubscriptionServer.js +102 -0
- package/esm/ably.d.ts +13 -0
- package/esm/ably.js +28 -0
- package/esm/index.d.ts +7 -4
- package/esm/index.js +4 -2
- package/esm/live-query/data-provider-live-query-storage.d.ts +23 -0
- package/esm/live-query/data-provider-live-query-storage.js +78 -0
- package/esm/myLog.d.ts +1 -0
- package/esm/myLog.js +5 -0
- package/esm/postgres/postgres-data-provider.d.ts +4 -2
- package/esm/postgres/postgres-data-provider.js +18 -6
- package/esm/postgres/schema-builder.d.ts +2 -1
- package/esm/postgres/schema-builder.js +49 -29
- package/esm/remult-knex/index.d.ts +10 -32
- package/esm/remult-knex/index.js +75 -51
- package/esm/remult-mongo.d.ts +9 -2
- package/esm/remult-mongo.js +24 -8
- package/esm/remult-next.d.ts +11 -0
- package/esm/remult-next.js +27 -0
- package/esm/server/core.d.ts +2 -0
- package/esm/server/core.js +2 -0
- package/esm/server/expressBridge.d.ts +19 -7
- package/esm/server/expressBridge.js +135 -31
- package/esm/server/index.d.ts +2 -1
- package/esm/server/index.js +2 -1
- package/esm/server/initDataProvider.d.ts +2 -0
- package/esm/server/initDataProvider.js +14 -0
- package/esm/src/buildRestDataProvider.d.ts +31 -0
- package/esm/src/buildRestDataProvider.js +110 -0
- package/esm/src/column-interfaces.d.ts +44 -8
- package/esm/src/column.d.ts +3 -3
- package/esm/src/context.d.ts +39 -36
- package/esm/src/context.js +87 -117
- package/esm/src/data-api.d.ts +9 -3
- package/esm/src/data-api.js +130 -63
- package/esm/src/data-interfaces.d.ts +5 -1
- package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
- package/esm/src/data-providers/array-entity-data-provider.js +2 -17
- package/esm/src/data-providers/rest-data-provider.d.ts +4 -3
- package/esm/src/data-providers/rest-data-provider.js +64 -23
- package/esm/src/data-providers/sql-database.d.ts +7 -3
- package/esm/src/data-providers/sql-database.js +60 -17
- package/esm/src/data-providers/web-sql-data-provider.d.ts +3 -0
- package/esm/src/data-providers/web-sql-data-provider.js +23 -9
- package/esm/src/entity.d.ts +2 -2
- package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
- package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
- package/esm/src/filter/filter-interfaces.d.ts +5 -5
- package/esm/src/filter/filter-interfaces.js +31 -26
- package/esm/src/live-query/LiveQueryClient.d.ts +1 -0
- package/esm/src/live-query/LiveQueryClient.js +184 -0
- package/esm/src/live-query/SseSubscriptionClient.d.ts +5 -0
- package/esm/src/live-query/SseSubscriptionClient.js +86 -0
- package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
- package/esm/src/live-query/SubscriptionChannel.js +121 -0
- package/esm/src/live-query/SubscriptionServer.d.ts +38 -0
- package/esm/src/live-query/SubscriptionServer.js +108 -0
- package/esm/src/remult-proxy.d.ts +1 -1
- package/esm/src/remult-proxy.js +52 -7
- package/esm/src/remult3/RepositoryImplementation.d.ts +14 -5
- package/esm/src/remult3/RepositoryImplementation.js +124 -44
- package/esm/src/remult3/getId.d.ts +2 -0
- package/esm/src/remult3/getId.js +7 -0
- package/esm/src/remult3/remult3.d.ts +67 -10
- package/esm/src/remult3/remult3.js +1 -0
- package/esm/src/server-action.d.ts +5 -1
- package/esm/src/server-action.js +11 -12
- package/esm/src/shared-tests/db-tests-setup.d.ts +12 -5
- package/esm/src/shared-tests/db-tests-setup.js +14 -6
- package/esm/src/shared-tests/db-tests.db-tests.js +71 -10
- package/esm/src/sort.d.ts +1 -0
- package/esm/src/sort.js +18 -0
- package/esm/src/sql-command.d.ts +5 -2
- package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
- package/esm/src/tests/entityForCustomFilter.js +20 -21
- package/esm/src/tests/frontend-database-tests-setup.spec.js +3 -4
- package/esm/src/tests/testHelper.spec.d.ts +3 -1
- package/esm/src/tests/testHelper.spec.js +63 -60
- package/esm/src/valueConverters.js +15 -7
- package/index.d.ts +7 -4
- package/index.js +7 -3
- package/live-query/data-provider-live-query-storage.d.ts +23 -0
- package/live-query/data-provider-live-query-storage.js +236 -0
- package/myLog.d.ts +1 -0
- package/myLog.js +20 -0
- package/package.json +18 -1
- package/postgres/postgres-data-provider.d.ts +4 -2
- package/postgres/postgres-data-provider.js +54 -39
- package/postgres/schema-builder.d.ts +2 -1
- package/postgres/schema-builder.js +118 -70
- package/remult-express.js +1 -1
- package/remult-knex/index.d.ts +10 -32
- package/remult-knex/index.js +134 -87
- package/remult-mongo.d.ts +9 -2
- package/remult-mongo.js +39 -7
- package/remult-next.d.ts +11 -0
- package/remult-next.js +73 -0
- package/server/JsonEntityFileStorage.js +2 -2
- package/server/core.d.ts +2 -0
- package/server/core.js +5 -1
- package/server/expressBridge.d.ts +19 -7
- package/server/expressBridge.js +283 -69
- package/server/index.d.ts +2 -1
- package/server/index.js +3 -1
- package/server/initDataProvider.d.ts +2 -0
- package/server/initDataProvider.js +26 -0
- package/src/buildRestDataProvider.d.ts +31 -0
- package/src/buildRestDataProvider.js +162 -0
- package/src/column-interfaces.d.ts +44 -8
- package/src/column.d.ts +3 -3
- package/src/context.d.ts +39 -36
- package/src/context.js +171 -166
- package/src/data-api.d.ts +9 -3
- package/src/data-api.js +233 -88
- package/src/data-interfaces.d.ts +5 -1
- package/src/data-providers/array-entity-data-provider.d.ts +1 -1
- package/src/data-providers/array-entity-data-provider.js +2 -17
- package/src/data-providers/rest-data-provider.d.ts +4 -3
- package/src/data-providers/rest-data-provider.js +105 -39
- package/src/data-providers/sql-database.d.ts +7 -3
- package/src/data-providers/sql-database.js +89 -16
- package/src/data-providers/web-sql-data-provider.d.ts +3 -0
- package/src/data-providers/web-sql-data-provider.js +56 -11
- package/src/entity.d.ts +2 -2
- package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
- package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
- package/src/filter/filter-interfaces.d.ts +5 -5
- package/src/filter/filter-interfaces.js +31 -26
- package/src/live-query/LiveQueryClient.d.ts +1 -0
- package/src/live-query/LiveQueryClient.js +283 -0
- package/src/live-query/SseSubscriptionClient.d.ts +5 -0
- package/src/live-query/SseSubscriptionClient.js +150 -0
- package/src/live-query/SubscriptionChannel.d.ts +41 -0
- package/src/live-query/SubscriptionChannel.js +209 -0
- package/src/live-query/SubscriptionServer.d.ts +38 -0
- package/src/live-query/SubscriptionServer.js +258 -0
- package/src/remult-proxy.d.ts +1 -1
- package/src/remult-proxy.js +153 -8
- package/src/remult3/RepositoryImplementation.d.ts +14 -5
- package/src/remult3/RepositoryImplementation.js +200 -85
- package/src/remult3/getId.d.ts +2 -0
- package/src/remult3/getId.js +11 -0
- package/src/remult3/remult3.d.ts +67 -10
- package/src/remult3/remult3.js +1 -0
- package/src/server-action.d.ts +5 -1
- package/src/server-action.js +11 -11
- package/src/shared-tests/db-tests-setup.d.ts +12 -5
- package/src/shared-tests/db-tests-setup.js +17 -8
- package/src/shared-tests/db-tests.db-tests.js +140 -8
- package/src/sort.d.ts +1 -0
- package/src/sort.js +18 -0
- package/src/sql-command.d.ts +5 -2
- package/src/tests/entityForCustomFilter.d.ts +6 -6
- package/src/tests/entityForCustomFilter.js +30 -31
- package/src/tests/frontend-database-tests-setup.spec.js +5 -6
- package/src/tests/testHelper.spec.d.ts +3 -1
- package/src/tests/testHelper.spec.js +104 -100
- 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.
|
|
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
|
|
84
|
+
sql = 'drop table if exists ' + e.$entityName;
|
|
40
85
|
if (sql_database_1.SqlDatabase.LogToConsole)
|
|
41
|
-
console.
|
|
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
|
|
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.
|
|
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 (!
|
|
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
|
|
116
|
+
result += e.$dbNameOf(x) + ' integer primary key autoincrement';
|
|
72
117
|
}
|
|
73
118
|
else {
|
|
74
|
-
result += this.addColumnSqlSyntax(x, e
|
|
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 (
|
|
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 (
|
|
132
|
+
finally { if (e_2) throw e_2.error; }
|
|
88
133
|
}
|
|
89
|
-
sql = 'create table if not exists ' + e
|
|
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:
|
|
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 {
|
|
1
|
+
import { SqlCommandWithParameters } from "../sql-command";
|
|
2
2
|
import { Filter, FilterConsumer } from './filter-interfaces';
|
|
3
3
|
import { FieldMetadata } from "../column-interfaces";
|
|
4
|
-
import {
|
|
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:
|
|
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:
|
|
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
|
|
40
|
-
export declare
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
225
|
-
var e_3,
|
|
226
|
-
return tslib_1.__generator(this, function (
|
|
227
|
-
switch (
|
|
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
|
-
|
|
230
|
-
|
|
242
|
+
meta = remult3_1.getEntityMetadata(repo);
|
|
243
|
+
_e = {};
|
|
244
|
+
return [4 /*yield*/, meta.getDbName()];
|
|
231
245
|
case 1:
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
243
|
-
|
|
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*/,
|
|
247
|
-
case
|
|
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 && (
|
|
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
|
|
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.
|
|
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>(
|
|
10
|
-
static createCustom<entityType, argsType>(
|
|
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
|
|
81
|
-
|
|
80
|
+
export interface rawFilterInfo<entityType> {
|
|
81
|
+
rawFilterInfo: {
|
|
82
82
|
key: string;
|
|
83
|
-
|
|
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 (
|
|
29
|
+
Filter.createCustom = function (rawFilterTranslator, key) {
|
|
30
30
|
if (key === void 0) { key = ''; }
|
|
31
|
-
var
|
|
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 (!
|
|
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 +
|
|
40
|
+
_a[exports.customUrlToken + rawFilterInfo.key] = x,
|
|
41
41
|
_a;
|
|
42
|
-
}, {
|
|
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.
|
|
161
|
-
if (!(element.
|
|
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.
|
|
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 + "
|
|
366
|
+
this.add(col.key + ".null", true);
|
|
362
367
|
};
|
|
363
368
|
FilterSerializer.prototype.isNotNull = function (col) {
|
|
364
|
-
this.add(col.key + "
|
|
369
|
+
this.add(col.key + ".null", false);
|
|
365
370
|
};
|
|
366
371
|
FilterSerializer.prototype.isIn = function (col, val) {
|
|
367
|
-
this.add(col.key + "
|
|
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 + '
|
|
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 + '
|
|
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 + '
|
|
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 + '
|
|
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 + '
|
|
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 + "
|
|
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('
|
|
459
|
-
addFilter('
|
|
460
|
-
addFilter('
|
|
461
|
-
addFilter('
|
|
462
|
-
addFilter('
|
|
463
|
-
addFilter('
|
|
464
|
-
var nullFilter = filterInfo.get(col.key + "
|
|
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('
|
|
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.
|
|
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 {};
|