remult 0.12.7 → 0.13.1

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 (41) hide show
  1. package/graphql.js +2 -2
  2. package/index.d.ts +2 -1
  3. package/index.js +6 -5
  4. package/package.json +1 -1
  5. package/postgres/postgres-data-provider.js +3 -2
  6. package/postgres/postgresColumnSyntax.js +1 -1
  7. package/readme.md +7 -1
  8. package/remult-knex/index.js +6 -5
  9. package/remult-mongo.js +1 -1
  10. package/server/expressBridge.js +8 -8
  11. package/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +1 -1
  12. package/src/backend-tests/backend-database-test-setup.backend-spec.js +1 -1
  13. package/src/backend-tests/my-test.backend-spec.js +112 -0
  14. package/src/context.js +1 -1
  15. package/src/data-api.js +73 -52
  16. package/src/data-providers/array-entity-data-provider.js +8 -7
  17. package/src/data-providers/web-sql-data-provider.js +12 -6
  18. package/src/entity.d.ts +0 -1
  19. package/src/filter/filter-interfaces.d.ts +2 -2
  20. package/src/filter/filter-interfaces.js +5 -2
  21. package/src/id-entity.js +1 -5
  22. package/src/remult3/RepositoryImplementation.d.ts +53 -16
  23. package/src/remult3/RepositoryImplementation.js +224 -78
  24. package/src/remult3/remult3.d.ts +4 -4
  25. package/src/shared-tests/db-tests.db-tests.js +34 -127
  26. package/src/shared-tests/entityWithValidations.js +2 -2
  27. package/src/shared-tests/test-custom-id-column.spec.js +26 -4
  28. package/src/shared-tests/test-special-value.spec.js +2 -2
  29. package/src/shared-tests/test-update-with-null.spec.js +2 -2
  30. package/src/tests/c.js +2 -2
  31. package/src/tests/d.js +2 -2
  32. package/src/tests/dWithPrefilter.js +2 -2
  33. package/src/tests/entityForCustomFilter.js +1 -1
  34. package/src/tests/entityWithValidationsOnColumn.js +2 -2
  35. package/src/tests/h.js +6 -4
  36. package/src/tests/remult-3-entities.js +11 -11
  37. package/src/tests/tasks.js +3 -3
  38. package/src/validators.d.ts +5 -3
  39. package/src/validators.js +9 -7
  40. package/valueConverters.d.ts +11 -24
  41. 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 === valueConverters_1.IntegerValueConverter)
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, UuidField, FieldsMetadata, Entity, BuildEntity, EntityBase, ControllerBase, FieldRef, IdFieldRef, Fields, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, QueryResult, QueryOptions, Repository, FieldType, FindFirstOptions, ComparisonValueFilter, ValueFilter, IdFilter, ContainsStringValueFilter, getFields, EntityRef, getEntityRef, SortSegments, ValueListFieldType, DateOnlyField, JsonField, IntegerField, OmitEB, Paginator, CaptionTransformer } from './src/remult3';
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.IntegerField = exports.JsonField = exports.DateOnlyField = exports.ValueListFieldType = exports.getEntityRef = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.BuildEntity = exports.Entity = exports.UuidField = exports.Field = void 0;
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, "UuidField", { enumerable: true, get: function () { return remult3_1.UuidField; } });
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, "DateOnlyField", { enumerable: true, get: function () { return remult3_1.DateOnlyField; } });
19
- Object.defineProperty(exports, "JsonField", { enumerable: true, get: function () { return remult3_1.JsonField; } });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.12.7",
3
+ "version": "0.13.1",
4
4
  "description": "remult core lib",
5
5
  "homepage": "https://remult.dev/",
6
6
  "repository": {
@@ -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 == entity.idMetadata.field && entity.options.dbAutoIncrementId) {
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 == entity.idMetadata.field && entity.options.dbAutoIncrementId)
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.DateOnlyValueConverter)
15
+ if (x.valueConverter == valueConverters_1.ValueConverters.DateOnly)
16
16
  result += " date";
17
17
  else
18
18
  result += " timestamp";
package/readme.md CHANGED
@@ -3,12 +3,18 @@
3
3
  <img src="https://github.com/remult/remult/raw/master/docs/.vuepress/public/logo.png" width="140" height="140">
4
4
  </a>
5
5
  <h1>Remult</h1>
6
+ <a href="https://circleci.com/gh/remult/remult/tree/master">
7
+ <img alt="CircleCI" src="https://circleci.com/gh/remult/remult/tree/master.svg?style=svg">
8
+ </a>
6
9
  <a href="https://raw.githubusercontent.com/remult/remult/master/LICENSE">
7
10
  <img alt="GitHub license" src="https://img.shields.io/badge/license-MIT-blue.svg">
8
11
  </a>
9
- <a href="https://badge.fury.io/js/remult">
12
+ <a href="https://www.npmjs.com/package/remult">
10
13
  <img alt="npm version" src="https://badge.fury.io/js/remult.svg">
11
14
  </a>
15
+ <a href="https://www.npmjs.com/package/remult">
16
+ <img alt="npm downloads" src="https://img.shields.io/npm/dm/remult">
17
+ </a>
12
18
  </div>
13
19
 
14
20
  ## What is Remult?
@@ -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.options.dbAutoIncrementId) return [3 /*break*/, 12];
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 == entity.idMetadata.field && entity.options.dbAutoIncrementId) {
606
- if (x == entity.idMetadata.field && entity.options.dbAutoIncrementId)
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.DateOnlyValueConverter)
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 && !(f_1 == this.entity.idMetadata.field && this.entity.options.dbAutoIncrementId)) {
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
  }
@@ -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.Field(),
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.Field(),
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.Field(),
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.Field(),
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.Field(),
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.Field(),
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.Field(),
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.Field(),
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");
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var tslib_1 = require("tslib");
4
+ var __1 = require("../..");
4
5
  var context_1 = require("../context");
5
6
  var remult_knex_1 = require("../../remult-knex");
6
7
  var Knex = require("knex");
7
8
  var dotenv_1 = require("dotenv");
9
+ var backend_database_test_setup_backend_spec_1 = require("./backend-database-test-setup.backend-spec");
10
+ var entityWithValidations_1 = require("../shared-tests/entityWithValidations");
8
11
  dotenv_1.config();
9
12
  describe("test", function () {
10
13
  var remult;
@@ -21,3 +24,112 @@ describe("test", function () {
21
24
  });
22
25
  }); });
23
26
  });
27
+ backend_database_test_setup_backend_spec_1.testPostgresImplementation("sql filter", function (_a) {
28
+ var createEntity = _a.createEntity;
29
+ return tslib_1.__awaiter(void 0, void 0, void 0, function () {
30
+ var s, _b;
31
+ return tslib_1.__generator(this, function (_c) {
32
+ switch (_c.label) {
33
+ case 0: return [4 /*yield*/, entityWithValidations_1.entityWithValidations.create4RowsInDp(createEntity)];
34
+ case 1:
35
+ s = _c.sent();
36
+ _b = expect;
37
+ return [4 /*yield*/, s.find({
38
+ where: __1.SqlDatabase.customFilter(function (build) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
39
+ return tslib_1.__generator(this, function (_a) {
40
+ build.sql = s.metadata.fields.myId.options.dbName + ' in (1,3)';
41
+ return [2 /*return*/];
42
+ });
43
+ }); })
44
+ })];
45
+ case 2:
46
+ _b.apply(void 0, [(_c.sent()).length]).toBe(2);
47
+ return [2 /*return*/];
48
+ }
49
+ });
50
+ });
51
+ }, false);
52
+ backend_database_test_setup_backend_spec_1.testPostgresImplementation("sql filter2", function (_a) {
53
+ var createEntity = _a.createEntity;
54
+ return tslib_1.__awaiter(void 0, void 0, void 0, function () {
55
+ var s, _b;
56
+ return tslib_1.__generator(this, function (_c) {
57
+ switch (_c.label) {
58
+ case 0: return [4 /*yield*/, entityWithValidations_1.entityWithValidations.create4RowsInDp(createEntity)];
59
+ case 1:
60
+ s = _c.sent();
61
+ _b = expect;
62
+ return [4 /*yield*/, s.find({
63
+ where: {
64
+ $or: [
65
+ __1.SqlDatabase.customFilter(function (build) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
66
+ return tslib_1.__generator(this, function (_a) {
67
+ build.sql = s.metadata.fields.myId.options.dbName + ' in (1,3)';
68
+ return [2 /*return*/];
69
+ });
70
+ }); }),
71
+ {
72
+ myId: 2
73
+ }
74
+ ]
75
+ }
76
+ })];
77
+ case 2:
78
+ _b.apply(void 0, [(_c.sent()).length]).toBe(3);
79
+ return [2 /*return*/];
80
+ }
81
+ });
82
+ });
83
+ }, false);
84
+ backend_database_test_setup_backend_spec_1.testKnexPGSqlImpl("knex filter", function (_a) {
85
+ var createEntity = _a.createEntity;
86
+ return tslib_1.__awaiter(void 0, void 0, void 0, function () {
87
+ var s, _b;
88
+ return tslib_1.__generator(this, function (_c) {
89
+ switch (_c.label) {
90
+ case 0: return [4 /*yield*/, entityWithValidations_1.entityWithValidations.create4RowsInDp(createEntity)];
91
+ case 1:
92
+ s = _c.sent();
93
+ _b = expect;
94
+ return [4 /*yield*/, s.find({
95
+ where: remult_knex_1.KnexDataProvider.customFilter(function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
96
+ return tslib_1.__generator(this, function (_a) {
97
+ return [2 /*return*/, function (build) { return build.whereIn(s.metadata.fields.myId.options.dbName, [1, 3]); }];
98
+ });
99
+ }); })
100
+ })];
101
+ case 2:
102
+ _b.apply(void 0, [(_c.sent()).length]).toBe(2);
103
+ return [2 /*return*/];
104
+ }
105
+ });
106
+ });
107
+ }, false);
108
+ backend_database_test_setup_backend_spec_1.testKnexPGSqlImpl("knex filter2", function (_a) {
109
+ var createEntity = _a.createEntity;
110
+ return tslib_1.__awaiter(void 0, void 0, void 0, function () {
111
+ var s, _b;
112
+ return tslib_1.__generator(this, function (_c) {
113
+ switch (_c.label) {
114
+ case 0: return [4 /*yield*/, entityWithValidations_1.entityWithValidations.create4RowsInDp(createEntity)];
115
+ case 1:
116
+ s = _c.sent();
117
+ _b = expect;
118
+ return [4 /*yield*/, s.find({
119
+ where: {
120
+ $or: [remult_knex_1.KnexDataProvider.customFilter(function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
121
+ return tslib_1.__generator(this, function (_a) {
122
+ return [2 /*return*/, function (build) { return build.whereIn(s.metadata.fields.myId.options.dbName, [1, 3]); }];
123
+ });
124
+ }); }), {
125
+ myId: 4
126
+ }]
127
+ }
128
+ })];
129
+ case 2:
130
+ _b.apply(void 0, [(_c.sent()).length]).toBe(3);
131
+ return [2 /*return*/];
132
+ }
133
+ });
134
+ });
135
+ }, false);
package/src/context.js CHANGED
@@ -283,7 +283,7 @@ var Remult = /** @class */ (function () {
283
283
  }
284
284
  return r;
285
285
  };
286
- Remult.apiBaseUrl = 'api';
286
+ Remult.apiBaseUrl = '/api';
287
287
  return Remult;
288
288
  }());
289
289
  exports.Remult = Remult;
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 _c;
53
- return tslib_1.__generator(this, function (_d) {
54
- switch (_d.label) {
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
- _d.trys.push([0, 2, , 3]);
57
- _b = (_a = response).success;
58
- _c = {};
59
- return [4 /*yield*/, this.repository.count(this.buildWhere(request, filterBody))];
56
+ if (!this.repository.metadata.apiReadAllowed) {
57
+ response.forbidden();
58
+ return [2 /*return*/];
59
+ }
60
+ _f.label = 1;
60
61
  case 1:
61
- _b.apply(_a, [(_c.count = +(_d.sent()), _c)]);
62
- return [3 /*break*/, 3];
63
- case 2:
64
- err_1 = _d.sent();
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*/, 3];
67
- case 3: return [2 /*return*/];
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, _b, hasId_1, w, sort, dir, limit, err_2;
82
+ var findOptions, _a, hasId_1, w, sort, dir, limit, err_2;
76
83
  var _this = this;
77
- return tslib_1.__generator(this, function (_c) {
78
- switch (_c.label) {
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
- _c.label = 1;
91
+ _b.label = 1;
85
92
  case 1:
86
- _c.trys.push([1, 7, , 8]);
93
+ _b.trys.push([1, 6, , 7]);
87
94
  findOptions = { load: function () { return []; } };
88
- if (!((_a = this.repository.metadata.options) === null || _a === void 0 ? void 0 : _a.apiPrefilter)) return [3 /*break*/, 3];
89
- _b = findOptions;
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
- _b.where = _c.sent();
93
- _c.label = 3;
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 4:
100
- w = _c.sent();
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
- _c.label = 5;
126
- case 5:
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
- _c.sent();
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*/, 8];
163
- case 8: return [2 /*return*/];
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
- var where = [];
170
- where.push(this.repository.metadata.options.apiPrefilter);
171
- if (request) {
172
- where.push(filter_interfaces_1.buildFilterFromRequestParameters(this.repository.metadata, {
173
- get: function (key) {
174
- var result = request.get(key);
175
- if (key.startsWith(filter_interfaces_1.customUrlToken) && result)
176
- return JSON.parse(result);
177
- return result;
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 && !(f == this.entity.idMetadata.field && this.entity.options.dbAutoIncrementId)) {
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 (_a) {
224
- switch (_a.label) {
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 (!this.entity.options.dbAutoIncrementId) return [3 /*break*/, 2];
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 = _a.sent();
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
- _a.label = 2;
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
- _a.label = 3;
244
+ _b.label = 3;
244
245
  case 3:
245
246
  j = this.translateToJson(data);
246
247
  this.verifyThatRowHasAllNotNullColumns(j);