remult 0.12.9 → 0.13.3
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/graphql.js +2 -2
- package/index.d.ts +2 -1
- package/index.js +6 -5
- package/package.json +1 -1
- package/postgres/postgres-data-provider.js +3 -2
- package/postgres/postgresColumnSyntax.js +1 -1
- package/remult-knex/index.js +6 -5
- package/remult-mongo.js +1 -1
- package/server/expressBridge.js +9 -9
- package/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +1 -1
- package/src/backend-tests/backend-database-test-setup.backend-spec.js +1 -1
- package/src/context.js +1 -1
- package/src/data-api.js +73 -52
- package/src/data-providers/array-entity-data-provider.js +8 -7
- package/src/data-providers/web-sql-data-provider.js +12 -6
- package/src/entity.d.ts +0 -1
- package/src/filter/filter-interfaces.d.ts +2 -2
- package/src/filter/filter-interfaces.js +5 -2
- package/src/id-entity.js +1 -5
- package/src/remult3/RepositoryImplementation.d.ts +53 -16
- package/src/remult3/RepositoryImplementation.js +209 -73
- package/src/remult3/remult3.d.ts +3 -3
- package/src/shared-tests/db-tests.db-tests.js +43 -24
- package/src/shared-tests/entityWithValidations.js +2 -2
- package/src/shared-tests/test-custom-id-column.spec.js +4 -4
- package/src/shared-tests/test-special-value.spec.js +2 -2
- package/src/shared-tests/test-update-with-null.spec.js +2 -2
- package/src/tests/c.js +2 -2
- package/src/tests/d.js +2 -2
- package/src/tests/dWithPrefilter.js +2 -2
- package/src/tests/entityForCustomFilter.js +1 -1
- package/src/tests/entityWithValidationsOnColumn.js +2 -2
- package/src/tests/h.js +6 -4
- package/src/tests/remult-3-entities.js +11 -11
- package/src/tests/tasks.js +3 -3
- package/src/validators.d.ts +5 -3
- package/src/validators.js +9 -7
- package/valueConverters.d.ts +11 -24
- package/valueConverters.js +148 -210
package/graphql.js
CHANGED
|
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.remultGraphql = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var _1 = require(".");
|
|
6
|
-
var valueConverters_1 = require("./valueConverters");
|
|
7
6
|
var context_1 = require("./src/context");
|
|
8
7
|
var remult3_1 = require("./src/remult3");
|
|
9
8
|
var data_api_1 = require("./src/data-api");
|
|
10
9
|
function remultGraphql(api) {
|
|
11
10
|
var e_1, _a;
|
|
12
11
|
var _this = this;
|
|
12
|
+
var _b;
|
|
13
13
|
var r = new _1.Remult();
|
|
14
14
|
var types = '';
|
|
15
15
|
var query = '';
|
|
@@ -31,7 +31,7 @@ function remultGraphql(api) {
|
|
|
31
31
|
type = "Boolean";
|
|
32
32
|
case Number:
|
|
33
33
|
{
|
|
34
|
-
if (f.valueConverter ===
|
|
34
|
+
if (((_b = f.valueConverter) === null || _b === void 0 ? void 0 : _b.fieldTypeInDb) == 'integer')
|
|
35
35
|
type = "Int";
|
|
36
36
|
else
|
|
37
37
|
type = "Float";
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Field,
|
|
1
|
+
export { Field, Fields, StringFieldOptions, FieldsMetadata, Entity, BuildEntity, EntityBase, ControllerBase, FieldRef, IdFieldRef, FieldsRef, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, QueryResult, QueryOptions, Repository, FieldType, FindFirstOptions, ComparisonValueFilter, ValueFilter, IdFilter, ContainsStringValueFilter, getFields, EntityRef, getEntityRef, SortSegments, ValueListFieldType, getValueList, ValueListFieldOptions, ValueListInfo, OmitEB, Paginator, CaptionTransformer } from './src/remult3';
|
|
2
2
|
export { EntityOptions } from './src/entity';
|
|
3
3
|
export { DataProvider, EntityDataProvider, EntityDataProviderFindOptions, ErrorInfo, RestDataProviderHttpProvider } from './src/data-interfaces';
|
|
4
4
|
export { SqlCommand, SqlImplementation, SqlResult } from './src/sql-command';
|
|
@@ -19,3 +19,4 @@ export { Filter } from './src/filter/filter-interfaces';
|
|
|
19
19
|
export { FilterConsumerBridgeToSqlRequest } from './src/filter/filter-consumer-bridge-to-sql-request';
|
|
20
20
|
export { UrlBuilder } from './urlBuilder';
|
|
21
21
|
export { Validators } from './src/validators';
|
|
22
|
+
export { ValueConverters } from './valueConverters';
|
package/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Validators = exports.UrlBuilder = exports.FilterConsumerBridgeToSqlRequest = exports.Filter = exports.CompoundIdField = exports.OneToMany = exports.Sort = exports.IdEntity = exports.EventSource = exports.isBackend = exports.Remult = exports.Allow = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonDataProvider = exports.SqlDatabase = exports.WebSqlDataProvider = exports.ArrayEntityDataProvider = exports.InMemoryDataProvider = exports.RestDataProvider = exports.CaptionTransformer = exports.
|
|
3
|
+
exports.ValueConverters = exports.Validators = exports.UrlBuilder = exports.FilterConsumerBridgeToSqlRequest = exports.Filter = exports.CompoundIdField = exports.OneToMany = exports.Sort = exports.IdEntity = exports.EventSource = exports.isBackend = exports.Remult = exports.Allow = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonDataProvider = exports.SqlDatabase = exports.WebSqlDataProvider = exports.ArrayEntityDataProvider = exports.InMemoryDataProvider = exports.RestDataProvider = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getEntityRef = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.BuildEntity = exports.Entity = exports.Fields = exports.Field = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Public API Surface of remult
|
|
6
6
|
*/
|
|
7
7
|
var remult3_1 = require("./src/remult3");
|
|
8
8
|
Object.defineProperty(exports, "Field", { enumerable: true, get: function () { return remult3_1.Field; } });
|
|
9
|
-
Object.defineProperty(exports, "
|
|
9
|
+
Object.defineProperty(exports, "Fields", { enumerable: true, get: function () { return remult3_1.Fields; } });
|
|
10
10
|
Object.defineProperty(exports, "Entity", { enumerable: true, get: function () { return remult3_1.Entity; } });
|
|
11
11
|
Object.defineProperty(exports, "BuildEntity", { enumerable: true, get: function () { return remult3_1.BuildEntity; } });
|
|
12
12
|
Object.defineProperty(exports, "EntityBase", { enumerable: true, get: function () { return remult3_1.EntityBase; } });
|
|
@@ -15,9 +15,8 @@ Object.defineProperty(exports, "FieldType", { enumerable: true, get: function ()
|
|
|
15
15
|
Object.defineProperty(exports, "getFields", { enumerable: true, get: function () { return remult3_1.getFields; } });
|
|
16
16
|
Object.defineProperty(exports, "getEntityRef", { enumerable: true, get: function () { return remult3_1.getEntityRef; } });
|
|
17
17
|
Object.defineProperty(exports, "ValueListFieldType", { enumerable: true, get: function () { return remult3_1.ValueListFieldType; } });
|
|
18
|
-
Object.defineProperty(exports, "
|
|
19
|
-
Object.defineProperty(exports, "
|
|
20
|
-
Object.defineProperty(exports, "IntegerField", { enumerable: true, get: function () { return remult3_1.IntegerField; } });
|
|
18
|
+
Object.defineProperty(exports, "getValueList", { enumerable: true, get: function () { return remult3_1.getValueList; } });
|
|
19
|
+
Object.defineProperty(exports, "ValueListInfo", { enumerable: true, get: function () { return remult3_1.ValueListInfo; } });
|
|
21
20
|
Object.defineProperty(exports, "CaptionTransformer", { enumerable: true, get: function () { return remult3_1.CaptionTransformer; } });
|
|
22
21
|
var rest_data_provider_1 = require("./src/data-providers/rest-data-provider"); //V
|
|
23
22
|
Object.defineProperty(exports, "RestDataProvider", { enumerable: true, get: function () { return rest_data_provider_1.RestDataProvider; } });
|
|
@@ -56,3 +55,5 @@ var urlBuilder_1 = require("./urlBuilder");
|
|
|
56
55
|
Object.defineProperty(exports, "UrlBuilder", { enumerable: true, get: function () { return urlBuilder_1.UrlBuilder; } });
|
|
57
56
|
var validators_1 = require("./src/validators");
|
|
58
57
|
Object.defineProperty(exports, "Validators", { enumerable: true, get: function () { return validators_1.Validators; } });
|
|
58
|
+
var valueConverters_1 = require("./valueConverters");
|
|
59
|
+
Object.defineProperty(exports, "ValueConverters", { enumerable: true, get: function () { return valueConverters_1.ValueConverters; } });
|
package/package.json
CHANGED
|
@@ -7,6 +7,7 @@ var pg_1 = require("pg");
|
|
|
7
7
|
var context_1 = require("../src/context");
|
|
8
8
|
var postgresColumnSyntax_1 = require("./postgresColumnSyntax");
|
|
9
9
|
var filter_consumer_bridge_to_sql_request_1 = require("../src/filter/filter-consumer-bridge-to-sql-request");
|
|
10
|
+
var remult3_1 = require("../src/remult3");
|
|
10
11
|
var PostgresDataProvider = /** @class */ (function () {
|
|
11
12
|
function PostgresDataProvider(pool) {
|
|
12
13
|
this.pool = pool;
|
|
@@ -191,11 +192,11 @@ var PostgresSchemaBuilder = /** @class */ (function () {
|
|
|
191
192
|
try {
|
|
192
193
|
for (_a = tslib_1.__values(entity.fields), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
193
194
|
x = _b.value;
|
|
194
|
-
if (!e.isDbReadonly(x) || x
|
|
195
|
+
if (!e.isDbReadonly(x) || remult3_1.isAutoIncrement(x)) {
|
|
195
196
|
if (result.length != 0)
|
|
196
197
|
result += ',';
|
|
197
198
|
result += '\r\n ';
|
|
198
|
-
if (x
|
|
199
|
+
if (remult3_1.isAutoIncrement(x))
|
|
199
200
|
result += e.nameOf(x) + ' serial';
|
|
200
201
|
else {
|
|
201
202
|
result += postgresColumnSyntax_1.postgresColumnSyntax(x, e.nameOf(x));
|
|
@@ -12,7 +12,7 @@ function postgresColumnSyntax(x, dbName) {
|
|
|
12
12
|
}
|
|
13
13
|
else if (x.valueType == Date) {
|
|
14
14
|
if (!x.valueConverter.fieldTypeInDb)
|
|
15
|
-
if (x.valueConverter == valueConverters_1.
|
|
15
|
+
if (x.valueConverter == valueConverters_1.ValueConverters.DateOnly)
|
|
16
16
|
result += " date";
|
|
17
17
|
else
|
|
18
18
|
result += " timestamp";
|
package/remult-knex/index.js
CHANGED
|
@@ -7,6 +7,7 @@ var knex_1 = require("knex");
|
|
|
7
7
|
var filter_interfaces_1 = require("../src/filter/filter-interfaces");
|
|
8
8
|
var filter_consumer_bridge_to_sql_request_1 = require("../src/filter/filter-consumer-bridge-to-sql-request");
|
|
9
9
|
var context_1 = require("../src/context");
|
|
10
|
+
var remult3_1 = require("../src/remult3");
|
|
10
11
|
var valueConverters_1 = require("../valueConverters");
|
|
11
12
|
var KnexDataProvider = /** @class */ (function () {
|
|
12
13
|
function KnexDataProvider(knex) {
|
|
@@ -299,7 +300,7 @@ var KnexEntityDataProvider = /** @class */ (function () {
|
|
|
299
300
|
return [7 /*endfinally*/];
|
|
300
301
|
case 10:
|
|
301
302
|
insert = this.knex(e.entityName).insert(insertObject);
|
|
302
|
-
if (!this.entity.
|
|
303
|
+
if (!remult3_1.isAutoIncrement(this.entity.idMetadata.field)) return [3 /*break*/, 12];
|
|
303
304
|
return [4 /*yield*/, insert.returning(this.entity.idMetadata.field.key)];
|
|
304
305
|
case 11:
|
|
305
306
|
result = _d.sent();
|
|
@@ -602,8 +603,8 @@ var KnexSchemaBuilder = /** @class */ (function () {
|
|
|
602
603
|
try {
|
|
603
604
|
for (var _b = tslib_1.__values(entity.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
604
605
|
var x = _c.value;
|
|
605
|
-
if (!cols_1.get(x).readonly || x
|
|
606
|
-
if (x
|
|
606
|
+
if (!cols_1.get(x).readonly || remult3_1.isAutoIncrement(x)) {
|
|
607
|
+
if (remult3_1.isAutoIncrement(x))
|
|
607
608
|
b.increments(cols_1.get(x).name);
|
|
608
609
|
else {
|
|
609
610
|
buildColumn(x, cols_1.get(x).name, b);
|
|
@@ -739,7 +740,7 @@ function buildColumn(x, dbName, b) {
|
|
|
739
740
|
}
|
|
740
741
|
else if (x.valueType == Date) {
|
|
741
742
|
if (!x.valueConverter.fieldTypeInDb)
|
|
742
|
-
if (x.valueConverter == valueConverters_1.
|
|
743
|
+
if (x.valueConverter == valueConverters_1.ValueConverters.DateOnly)
|
|
743
744
|
b.date(dbName);
|
|
744
745
|
else
|
|
745
746
|
b.dateTime(dbName);
|
|
@@ -764,7 +765,7 @@ function buildColumn(x, dbName, b) {
|
|
|
764
765
|
b.specificType(dbName, x.valueConverter.fieldTypeInDb);
|
|
765
766
|
}
|
|
766
767
|
else {
|
|
767
|
-
var c = b.string(dbName);
|
|
768
|
+
var c = b.string(dbName, x.options.maxLength);
|
|
768
769
|
if (!x.allowNull)
|
|
769
770
|
c.defaultTo('').notNullable();
|
|
770
771
|
}
|
package/remult-mongo.js
CHANGED
|
@@ -195,7 +195,7 @@ var MongoEntityDataProvider = /** @class */ (function () {
|
|
|
195
195
|
try {
|
|
196
196
|
for (_d = tslib_1.__values(this.entity.fields), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
197
197
|
f_1 = _e.value;
|
|
198
|
-
if (!f_1.dbReadOnly && !f_1.isServerExpression
|
|
198
|
+
if (!f_1.dbReadOnly && !f_1.isServerExpression) {
|
|
199
199
|
if (keys.includes(f_1.key)) {
|
|
200
200
|
newR[f_1.key] = f_1.valueConverter.toJson(data[f_1.key]);
|
|
201
201
|
}
|
package/server/expressBridge.js
CHANGED
|
@@ -60,7 +60,7 @@ function remultExpress(options) {
|
|
|
60
60
|
var bridge = new ExpressBridge(app, new inProcessQueueHandler(options.queueStorage), options.initRequest, dataProvider);
|
|
61
61
|
if (options.logApiEndPoints !== undefined)
|
|
62
62
|
bridge.logApiEndPoints = options.logApiEndPoints;
|
|
63
|
-
var apiArea = bridge.addArea(
|
|
63
|
+
var apiArea = bridge.addArea(__1.Remult.apiBaseUrl);
|
|
64
64
|
if (!options.disableAutoApi) {
|
|
65
65
|
register_actions_on_server_1.registerActionsOnServer(apiArea);
|
|
66
66
|
register_entities_on_server_1.registerEntitiesOnServer(apiArea);
|
|
@@ -806,35 +806,35 @@ var JobsInQueueEntity = /** @class */ (function (_super) {
|
|
|
806
806
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
807
807
|
}
|
|
808
808
|
tslib_1.__decorate([
|
|
809
|
-
remult3_1.
|
|
809
|
+
remult3_1.Fields.String(),
|
|
810
810
|
tslib_1.__metadata("design:type", String)
|
|
811
811
|
], JobsInQueueEntity.prototype, "userId", void 0);
|
|
812
812
|
tslib_1.__decorate([
|
|
813
|
-
remult3_1.
|
|
813
|
+
remult3_1.Fields.String(),
|
|
814
814
|
tslib_1.__metadata("design:type", String)
|
|
815
815
|
], JobsInQueueEntity.prototype, "url", void 0);
|
|
816
816
|
tslib_1.__decorate([
|
|
817
|
-
remult3_1.
|
|
817
|
+
remult3_1.Fields.Date(),
|
|
818
818
|
tslib_1.__metadata("design:type", Date)
|
|
819
819
|
], JobsInQueueEntity.prototype, "submitTime", void 0);
|
|
820
820
|
tslib_1.__decorate([
|
|
821
|
-
remult3_1.
|
|
821
|
+
remult3_1.Fields.Date(),
|
|
822
822
|
tslib_1.__metadata("design:type", Date)
|
|
823
823
|
], JobsInQueueEntity.prototype, "doneTime", void 0);
|
|
824
824
|
tslib_1.__decorate([
|
|
825
|
-
remult3_1.
|
|
825
|
+
remult3_1.Fields.String(),
|
|
826
826
|
tslib_1.__metadata("design:type", String)
|
|
827
827
|
], JobsInQueueEntity.prototype, "result", void 0);
|
|
828
828
|
tslib_1.__decorate([
|
|
829
|
-
remult3_1.
|
|
829
|
+
remult3_1.Fields.Boolean(),
|
|
830
830
|
tslib_1.__metadata("design:type", Boolean)
|
|
831
831
|
], JobsInQueueEntity.prototype, "done", void 0);
|
|
832
832
|
tslib_1.__decorate([
|
|
833
|
-
remult3_1.
|
|
833
|
+
remult3_1.Fields.Boolean(),
|
|
834
834
|
tslib_1.__metadata("design:type", Boolean)
|
|
835
835
|
], JobsInQueueEntity.prototype, "error", void 0);
|
|
836
836
|
tslib_1.__decorate([
|
|
837
|
-
remult3_1.
|
|
837
|
+
remult3_1.Fields.Number(),
|
|
838
838
|
tslib_1.__metadata("design:type", Number)
|
|
839
839
|
], JobsInQueueEntity.prototype, "progress", void 0);
|
|
840
840
|
JobsInQueueEntity = tslib_1.__decorate([
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dbTestWhatSignature } from "../shared-tests/db-tests-setup";
|
|
2
2
|
export declare const testKnexPGSqlImpl: (key: string, what: dbTestWhatSignature, focus?: boolean) => void;
|
|
3
3
|
export declare function testPostgresImplementation(key: string, what: dbTestWhatSignature, focus?: boolean): void;
|
|
4
|
-
import '../shared-tests';
|
|
5
4
|
export declare function testMongo(key: string, what: dbTestWhatSignature, focus?: boolean): void;
|
|
5
|
+
import '../shared-tests';
|
|
@@ -143,7 +143,6 @@ function testPostgresImplementation(key, what, focus) {
|
|
|
143
143
|
}
|
|
144
144
|
exports.testPostgresImplementation = testPostgresImplementation;
|
|
145
145
|
db_tests_setup_1.addDatabaseToTest(testPostgresImplementation);
|
|
146
|
-
require("../shared-tests");
|
|
147
146
|
var remult_3_entities_1 = require("../tests/remult-3-entities");
|
|
148
147
|
var remult_mongo_1 = require("../../remult-mongo");
|
|
149
148
|
db_tests_setup_1.testAll("transactions", function (_a) {
|
|
@@ -218,3 +217,4 @@ function testMongo(key, what, focus) {
|
|
|
218
217
|
}
|
|
219
218
|
exports.testMongo = testMongo;
|
|
220
219
|
db_tests_setup_1.addDatabaseToTest(testMongo);
|
|
220
|
+
require("../shared-tests");
|
package/src/context.js
CHANGED
package/src/data-api.js
CHANGED
|
@@ -48,56 +48,59 @@ var DataApi = /** @class */ (function () {
|
|
|
48
48
|
};
|
|
49
49
|
DataApi.prototype.count = function (response, request, filterBody) {
|
|
50
50
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
51
|
-
var _a, _b, err_1;
|
|
52
|
-
var
|
|
53
|
-
return tslib_1.__generator(this, function (
|
|
54
|
-
switch (
|
|
51
|
+
var _a, _b, _c, _d, err_1;
|
|
52
|
+
var _e;
|
|
53
|
+
return tslib_1.__generator(this, function (_f) {
|
|
54
|
+
switch (_f.label) {
|
|
55
55
|
case 0:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
if (!this.repository.metadata.apiReadAllowed) {
|
|
57
|
+
response.forbidden();
|
|
58
|
+
return [2 /*return*/];
|
|
59
|
+
}
|
|
60
|
+
_f.label = 1;
|
|
60
61
|
case 1:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
_f.trys.push([1, 4, , 5]);
|
|
63
|
+
_b = (_a = response).success;
|
|
64
|
+
_e = {};
|
|
65
|
+
_d = (_c = this.repository).count;
|
|
66
|
+
return [4 /*yield*/, this.buildWhere(request, filterBody)];
|
|
67
|
+
case 2: return [4 /*yield*/, _d.apply(_c, [_f.sent()])];
|
|
68
|
+
case 3:
|
|
69
|
+
_b.apply(_a, [(_e.count = +(_f.sent()), _e)]);
|
|
70
|
+
return [3 /*break*/, 5];
|
|
71
|
+
case 4:
|
|
72
|
+
err_1 = _f.sent();
|
|
65
73
|
response.error(err_1);
|
|
66
|
-
return [3 /*break*/,
|
|
67
|
-
case
|
|
74
|
+
return [3 /*break*/, 5];
|
|
75
|
+
case 5: return [2 /*return*/];
|
|
68
76
|
}
|
|
69
77
|
});
|
|
70
78
|
});
|
|
71
79
|
};
|
|
72
80
|
DataApi.prototype.getArray = function (response, request, filterBody) {
|
|
73
|
-
var _a;
|
|
74
81
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
75
|
-
var findOptions,
|
|
82
|
+
var findOptions, _a, hasId_1, w, sort, dir, limit, err_2;
|
|
76
83
|
var _this = this;
|
|
77
|
-
return tslib_1.__generator(this, function (
|
|
78
|
-
switch (
|
|
84
|
+
return tslib_1.__generator(this, function (_b) {
|
|
85
|
+
switch (_b.label) {
|
|
79
86
|
case 0:
|
|
80
87
|
if (!this.repository.metadata.apiReadAllowed) {
|
|
81
88
|
response.forbidden();
|
|
82
89
|
return [2 /*return*/];
|
|
83
90
|
}
|
|
84
|
-
|
|
91
|
+
_b.label = 1;
|
|
85
92
|
case 1:
|
|
86
|
-
|
|
93
|
+
_b.trys.push([1, 6, , 7]);
|
|
87
94
|
findOptions = { load: function () { return []; } };
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return [4 /*yield*/, filter_interfaces_2.Filter.resolve(this.repository.metadata.options.apiPrefilter)];
|
|
95
|
+
_a = findOptions;
|
|
96
|
+
return [4 /*yield*/, this.buildWhere(request, filterBody)];
|
|
91
97
|
case 2:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
case 3:
|
|
95
|
-
findOptions.where = this.buildWhere(request, filterBody);
|
|
96
|
-
if (!this.remult.isAllowed(this.repository.metadata.options.apiRequireId)) return [3 /*break*/, 5];
|
|
98
|
+
_a.where = _b.sent();
|
|
99
|
+
if (!this.remult.isAllowed(this.repository.metadata.options.apiRequireId)) return [3 /*break*/, 4];
|
|
97
100
|
hasId_1 = false;
|
|
98
101
|
return [4 /*yield*/, filter_interfaces_2.Filter.fromEntityFilter(this.repository.metadata, findOptions.where)];
|
|
99
|
-
case
|
|
100
|
-
w =
|
|
102
|
+
case 3:
|
|
103
|
+
w = _b.sent();
|
|
101
104
|
if (w) {
|
|
102
105
|
w.__applyToConsumer({
|
|
103
106
|
containsCaseInsensitive: function () { },
|
|
@@ -122,8 +125,8 @@ var DataApi = /** @class */ (function () {
|
|
|
122
125
|
response.forbidden();
|
|
123
126
|
return [2 /*return*/];
|
|
124
127
|
}
|
|
125
|
-
|
|
126
|
-
case
|
|
128
|
+
_b.label = 4;
|
|
129
|
+
case 4:
|
|
127
130
|
if (request) {
|
|
128
131
|
sort = request.get("_sort");
|
|
129
132
|
if (sort != undefined) {
|
|
@@ -153,34 +156,52 @@ var DataApi = /** @class */ (function () {
|
|
|
153
156
|
}
|
|
154
157
|
});
|
|
155
158
|
}); })];
|
|
159
|
+
case 5:
|
|
160
|
+
_b.sent();
|
|
161
|
+
return [3 /*break*/, 7];
|
|
156
162
|
case 6:
|
|
157
|
-
|
|
158
|
-
return [3 /*break*/, 8];
|
|
159
|
-
case 7:
|
|
160
|
-
err_2 = _c.sent();
|
|
163
|
+
err_2 = _b.sent();
|
|
161
164
|
response.error(err_2);
|
|
162
|
-
return [3 /*break*/,
|
|
163
|
-
case
|
|
165
|
+
return [3 /*break*/, 7];
|
|
166
|
+
case 7: return [2 /*return*/];
|
|
164
167
|
}
|
|
165
168
|
});
|
|
166
169
|
});
|
|
167
170
|
};
|
|
168
171
|
DataApi.prototype.buildWhere = function (request, filterBody) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
172
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
173
|
+
var where, _a, _b;
|
|
174
|
+
return tslib_1.__generator(this, function (_c) {
|
|
175
|
+
switch (_c.label) {
|
|
176
|
+
case 0:
|
|
177
|
+
where = [];
|
|
178
|
+
if (!this.repository.metadata.options.apiPrefilter) return [3 /*break*/, 3];
|
|
179
|
+
if (!(typeof this.repository.metadata.options.apiPrefilter === "function")) return [3 /*break*/, 2];
|
|
180
|
+
_b = (_a = where).push;
|
|
181
|
+
return [4 /*yield*/, this.repository.metadata.options.apiPrefilter()];
|
|
182
|
+
case 1:
|
|
183
|
+
_b.apply(_a, [_c.sent()]);
|
|
184
|
+
return [3 /*break*/, 3];
|
|
185
|
+
case 2:
|
|
186
|
+
where.push(this.repository.metadata.options.apiPrefilter);
|
|
187
|
+
_c.label = 3;
|
|
188
|
+
case 3:
|
|
189
|
+
if (request) {
|
|
190
|
+
where.push(filter_interfaces_1.buildFilterFromRequestParameters(this.repository.metadata, {
|
|
191
|
+
get: function (key) {
|
|
192
|
+
var result = request.get(key);
|
|
193
|
+
if (key.startsWith(filter_interfaces_1.customUrlToken) && result)
|
|
194
|
+
return JSON.parse(result);
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
if (filterBody)
|
|
200
|
+
where.push(filter_interfaces_2.Filter.entityFilterFromJson(this.repository.metadata, filterBody));
|
|
201
|
+
return [2 /*return*/, { $and: where }];
|
|
178
202
|
}
|
|
179
|
-
})
|
|
180
|
-
}
|
|
181
|
-
if (filterBody)
|
|
182
|
-
where.push(filter_interfaces_2.Filter.entityFilterFromJson(this.repository.metadata, filterBody));
|
|
183
|
-
return { $and: where };
|
|
203
|
+
});
|
|
204
|
+
});
|
|
184
205
|
};
|
|
185
206
|
DataApi.prototype.doOnId = function (response, id, what) {
|
|
186
207
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
@@ -186,7 +186,7 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
186
186
|
try {
|
|
187
187
|
for (var _b = (e_5 = void 0, tslib_1.__values(this.entity.fields)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
188
188
|
var f = _c.value;
|
|
189
|
-
if (!f.dbReadOnly && !f.isServerExpression
|
|
189
|
+
if (!f.dbReadOnly && !f.isServerExpression) {
|
|
190
190
|
if (keys.includes(f.key)) {
|
|
191
191
|
newR[f.key] = f.valueConverter.toJson(data[f.key]);
|
|
192
192
|
}
|
|
@@ -218,29 +218,30 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
218
218
|
throw new Error("couldn't find id to delete: " + id);
|
|
219
219
|
};
|
|
220
220
|
ArrayEntityDataProvider.prototype.insert = function (data) {
|
|
221
|
+
var _a;
|
|
221
222
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
222
223
|
var idf, lastRow, j;
|
|
223
|
-
return tslib_1.__generator(this, function (
|
|
224
|
-
switch (
|
|
224
|
+
return tslib_1.__generator(this, function (_b) {
|
|
225
|
+
switch (_b.label) {
|
|
225
226
|
case 0:
|
|
226
227
|
idf = this.entity.idMetadata.field;
|
|
227
228
|
if (!!(idf instanceof column_1.CompoundIdField)) return [3 /*break*/, 3];
|
|
228
|
-
if (!
|
|
229
|
+
if (!(((_a = idf.options.valueConverter) === null || _a === void 0 ? void 0 : _a.fieldTypeInDb) === 'autoincrement')) return [3 /*break*/, 2];
|
|
229
230
|
return [4 /*yield*/, this.find({ orderBy: new sort_1.Sort({ field: idf, isDescending: true }) })];
|
|
230
231
|
case 1:
|
|
231
|
-
lastRow =
|
|
232
|
+
lastRow = _b.sent();
|
|
232
233
|
if (lastRow.length > 0)
|
|
233
234
|
data[idf.key] = lastRow[0][idf.key] + 1;
|
|
234
235
|
else
|
|
235
236
|
data[idf.key] = 1;
|
|
236
|
-
|
|
237
|
+
_b.label = 2;
|
|
237
238
|
case 2:
|
|
238
239
|
if (data[idf.key])
|
|
239
240
|
this.rows.forEach(function (i) {
|
|
240
241
|
if (data[idf.key] == i[idf.key])
|
|
241
242
|
throw Error("id already exists");
|
|
242
243
|
});
|
|
243
|
-
|
|
244
|
+
_b.label = 3;
|
|
244
245
|
case 3:
|
|
245
246
|
j = this.translateToJson(data);
|
|
246
247
|
this.verifyThatRowHasAllNotNullColumns(j);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WebSqlDataProvider = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
+
var remult3_1 = require("../remult3");
|
|
5
6
|
var sql_database_1 = require("./sql-database");
|
|
6
7
|
var filter_consumer_bridge_to_sql_request_1 = require("../filter/filter-consumer-bridge-to-sql-request");
|
|
7
8
|
//SqlDatabase.LogToConsole = true;
|
|
@@ -59,15 +60,20 @@ var WebSqlDataProvider = /** @class */ (function () {
|
|
|
59
60
|
try {
|
|
60
61
|
for (_a = tslib_1.__values(entity.fields), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
61
62
|
x = _b.value;
|
|
62
|
-
if (!e.isDbReadonly(x)) {
|
|
63
|
+
if (!e.isDbReadonly(x) || remult3_1.isAutoIncrement(x)) {
|
|
63
64
|
if (result.length != 0)
|
|
64
65
|
result += ',';
|
|
65
66
|
result += '\r\n ';
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
if (remult3_1.isAutoIncrement(x)) {
|
|
68
|
+
if (x.key != entity.idMetadata.field.key)
|
|
69
|
+
throw "in web sql, autoincrement is only allowed for primary key";
|
|
70
|
+
result += e.nameOf(x) + ' integer primary key autoincrement';
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
result += this.addColumnSqlSyntax(x, e.nameOf(x));
|
|
74
|
+
if (x.key == entity.idMetadata.field.key) {
|
|
75
|
+
result += ' primary key';
|
|
76
|
+
}
|
|
71
77
|
}
|
|
72
78
|
}
|
|
73
79
|
}
|
package/src/entity.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { FieldMetadata as FieldMetadata } from './column-interfaces';
|
|
|
3
3
|
import { EntityOrderBy, FieldsMetadata, EntityFilter, EntityRef } from "./remult3";
|
|
4
4
|
export interface EntityOptions<entityType = any> {
|
|
5
5
|
id?: (entity: FieldsMetadata<entityType>) => FieldMetadata;
|
|
6
|
-
dbAutoIncrementId?: boolean;
|
|
7
6
|
/**
|
|
8
7
|
* The name of the table in the database that holds the data for this entity.
|
|
9
8
|
* If no name is set, the `key` will be used instead.
|
|
@@ -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
|
|
10
|
-
static createCustom<entityType, argsType>(customFilterTranslator: (r: Remult, args: argsType) => 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>;
|
|
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;
|
|
@@ -26,13 +26,16 @@ var Filter = /** @class */ (function () {
|
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
28
|
};
|
|
29
|
-
Filter.createCustom = function (customFilterTranslator) {
|
|
30
|
-
|
|
29
|
+
Filter.createCustom = function (customFilterTranslator, key) {
|
|
30
|
+
if (key === void 0) { key = ''; }
|
|
31
|
+
var customFilterInfo = { key: key, customFilterTranslator: customFilterTranslator };
|
|
31
32
|
return Object.assign(function (x) {
|
|
32
33
|
var _a;
|
|
33
34
|
var z = {};
|
|
34
35
|
if (x == undefined)
|
|
35
36
|
x = {};
|
|
37
|
+
if (!customFilterInfo.key)
|
|
38
|
+
throw "Usage of custom filter before a key was assigned to it";
|
|
36
39
|
return _a = {},
|
|
37
40
|
_a[exports.customUrlToken + customFilterInfo.key] = x,
|
|
38
41
|
_a;
|
package/src/id-entity.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IdEntity = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
-
var uuid_1 = require("uuid");
|
|
6
5
|
var remult3_1 = require("./remult3");
|
|
7
6
|
var IdEntity = /** @class */ (function (_super) {
|
|
8
7
|
tslib_1.__extends(IdEntity, _super);
|
|
@@ -10,10 +9,7 @@ var IdEntity = /** @class */ (function (_super) {
|
|
|
10
9
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
11
10
|
}
|
|
12
11
|
tslib_1.__decorate([
|
|
13
|
-
remult3_1.
|
|
14
|
-
allowApiUpdate: false,
|
|
15
|
-
defaultValue: function () { return uuid_1.v4(); }
|
|
16
|
-
}),
|
|
12
|
+
remult3_1.Fields.Uuid(),
|
|
17
13
|
tslib_1.__metadata("design:type", String)
|
|
18
14
|
], IdEntity.prototype, "id", void 0);
|
|
19
15
|
return IdEntity;
|