remult 0.14.6 → 0.14.7

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 (74) hide show
  1. package/assign.js +5 -1
  2. package/classType.js +2 -1
  3. package/graphql.js +146 -84
  4. package/index.js +73 -25
  5. package/inputTypes.js +16 -9
  6. package/package.json +1 -2
  7. package/postgres/index.js +4 -1
  8. package/postgres/postgres-data-provider.d.ts +4 -1
  9. package/postgres/postgres-data-provider.js +364 -165
  10. package/postgres/postgresColumnSyntax.d.ts +1 -1
  11. package/postgres/postgresColumnSyntax.js +8 -4
  12. package/remult-express.js +10 -6
  13. package/remult-knex/index.d.ts +5 -2
  14. package/remult-knex/index.js +720 -300
  15. package/remult-middleware.js +29 -24
  16. package/remult-mongo.js +406 -172
  17. package/server/JsonEntityFileStorage.js +15 -10
  18. package/server/expressBridge.d.ts +4 -2
  19. package/server/expressBridge.js +570 -383
  20. package/server/index.js +11 -4
  21. package/server/register-actions-on-server.js +38 -12
  22. package/server/register-entities-on-server.js +13 -9
  23. package/src/__EntityValueProvider.js +2 -1
  24. package/src/__RowsOfDataForTesting.js +2 -1
  25. package/src/backend-tests/backend-database-test-setup.backend-spec.js +190 -72
  26. package/src/backend-tests/my-test.backend-spec.js +114 -45
  27. package/src/column-interfaces.js +6 -2
  28. package/src/column.js +113 -71
  29. package/src/context.js +330 -174
  30. package/src/data-api.js +326 -162
  31. package/src/data-interfaces.js +11 -7
  32. package/src/data-providers/array-entity-data-provider.js +286 -171
  33. package/src/data-providers/in-memory-database.js +27 -12
  34. package/src/data-providers/json-data-provider.js +77 -41
  35. package/src/data-providers/rest-data-provider.js +189 -102
  36. package/src/data-providers/sql-database.js +403 -223
  37. package/src/data-providers/web-sql-data-provider.js +139 -78
  38. package/src/entity.js +2 -1
  39. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +1 -1
  40. package/src/filter/filter-consumer-bridge-to-sql-request.js +248 -106
  41. package/src/filter/filter-consumer-bridge-to-url-builder.js +2 -1
  42. package/src/filter/filter-interfaces.js +440 -277
  43. package/src/id-entity.js +17 -8
  44. package/src/remult3/RepositoryImplementation.js +2367 -1191
  45. package/src/remult3/index.js +5 -2
  46. package/src/remult3/remult3.js +2 -1
  47. package/src/server-action.js +528 -294
  48. package/src/shared-tests/db-tests-setup.js +153 -49
  49. package/src/shared-tests/db-tests.db-tests.js +1566 -660
  50. package/src/shared-tests/deleteAll.js +20 -3
  51. package/src/shared-tests/entityWithValidations.js +79 -52
  52. package/src/shared-tests/index.js +6 -4
  53. package/src/shared-tests/test-custom-id-column.spec.js +85 -37
  54. package/src/shared-tests/test-special-value.spec.js +104 -64
  55. package/src/shared-tests/test-update-with-null.spec.js +49 -28
  56. package/src/sort.js +95 -38
  57. package/src/sql-command.js +2 -1
  58. package/src/tests/Done.js +13 -7
  59. package/src/tests/TestDataApiResponse.js +22 -15
  60. package/src/tests/c.js +27 -21
  61. package/src/tests/createData.js +48 -20
  62. package/src/tests/d.js +27 -19
  63. package/src/tests/dWithPrefilter.js +44 -31
  64. package/src/tests/entityForCustomFilter.js +66 -42
  65. package/src/tests/entityWithValidationsOnColumn.js +29 -21
  66. package/src/tests/frontend-database-tests-setup.spec.js +98 -35
  67. package/src/tests/h.js +44 -35
  68. package/src/tests/remult-3-entities.js +80 -71
  69. package/src/tests/tasks.js +29 -23
  70. package/src/tests/testHelper.spec.js +322 -170
  71. package/src/tests/testModel/models.js +33 -25
  72. package/src/validators.js +59 -32
  73. package/urlBuilder.js +14 -8
  74. package/valueConverters.js +160 -161
@@ -1,21 +1,29 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { Entity, EntityBase, Fields } from '../remult3';
3
- let entityWithValidationsOnColumn = class entityWithValidationsOnColumn extends EntityBase {
4
- };
5
- __decorate([
6
- Fields.integer(),
7
- __metadata("design:type", Number)
8
- ], entityWithValidationsOnColumn.prototype, "myId", void 0);
9
- __decorate([
10
- Fields.string({
11
- validate: (t, c) => {
12
- if (!t.name || t.name.length < 3)
13
- c.error = 'invalid on column';
14
- }
15
- }),
16
- __metadata("design:type", String)
17
- ], entityWithValidationsOnColumn.prototype, "name", void 0);
18
- entityWithValidationsOnColumn = __decorate([
19
- Entity('', { allowApiCrud: true })
20
- ], entityWithValidationsOnColumn);
21
- export { entityWithValidationsOnColumn };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.entityWithValidationsOnColumn = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var remult3_1 = require("../remult3");
6
+ var entityWithValidationsOnColumn = /** @class */ (function (_super) {
7
+ tslib_1.__extends(entityWithValidationsOnColumn, _super);
8
+ function entityWithValidationsOnColumn() {
9
+ return _super !== null && _super.apply(this, arguments) || this;
10
+ }
11
+ tslib_1.__decorate([
12
+ remult3_1.Fields.integer(),
13
+ tslib_1.__metadata("design:type", Number)
14
+ ], entityWithValidationsOnColumn.prototype, "myId", void 0);
15
+ tslib_1.__decorate([
16
+ remult3_1.Fields.string({
17
+ validate: function (t, c) {
18
+ if (!t.name || t.name.length < 3)
19
+ c.error = 'invalid on column';
20
+ }
21
+ }),
22
+ tslib_1.__metadata("design:type", String)
23
+ ], entityWithValidationsOnColumn.prototype, "name", void 0);
24
+ entityWithValidationsOnColumn = tslib_1.__decorate([
25
+ remult3_1.Entity('', { allowApiCrud: true })
26
+ ], entityWithValidationsOnColumn);
27
+ return entityWithValidationsOnColumn;
28
+ }(remult3_1.EntityBase));
29
+ exports.entityWithValidationsOnColumn = entityWithValidationsOnColumn;
@@ -1,38 +1,101 @@
1
- import { addDatabaseToTest, itWithFocus } from "../shared-tests/db-tests-setup";
2
- import { InMemoryDataProvider } from "../..";
3
- import { Remult } from "../context";
4
- import { SqlDatabase } from "../data-providers/sql-database";
5
- import { WebSqlDataProvider } from "../data-providers/web-sql-data-provider";
6
- import { MockRestDataProvider } from "./testHelper.spec";
7
- export function testWebSqlImpl(key, what, focus = false) {
8
- itWithFocus(key + " - WebSql", async () => {
9
- let webSql = new WebSqlDataProvider('test');
10
- const sql = new SqlDatabase(webSql);
11
- for (const r of await (await sql.execute("select name from sqlite_master where type='table'")).rows) {
12
- switch (r.name) {
13
- case "__WebKitDatabaseInfoTable__":
14
- break;
15
- case "sqlite_sequence":
16
- break;
17
- default:
18
- await sql.execute("drop table if exists " + r.name);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.testRest = exports.testWebSqlImpl = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var db_tests_setup_1 = require("../shared-tests/db-tests-setup");
6
+ var __1 = require("../..");
7
+ var context_1 = require("../context");
8
+ var sql_database_1 = require("../data-providers/sql-database");
9
+ var web_sql_data_provider_1 = require("../data-providers/web-sql-data-provider");
10
+ var testHelper_spec_1 = require("./testHelper.spec");
11
+ function testWebSqlImpl(key, what, focus) {
12
+ var _this = this;
13
+ if (focus === void 0) { focus = false; }
14
+ db_tests_setup_1.itWithFocus(key + " - WebSql", function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
15
+ var webSql, sql, _a, _b, r, _c, e_1_1, remult;
16
+ var e_1, _d;
17
+ var _this = this;
18
+ return tslib_1.__generator(this, function (_e) {
19
+ switch (_e.label) {
20
+ case 0:
21
+ webSql = new web_sql_data_provider_1.WebSqlDataProvider('test');
22
+ sql = new sql_database_1.SqlDatabase(webSql);
23
+ _e.label = 1;
24
+ case 1:
25
+ _e.trys.push([1, 11, 12, 13]);
26
+ return [4 /*yield*/, sql.execute("select name from sqlite_master where type='table'")];
27
+ case 2: return [4 /*yield*/, (_e.sent()).rows];
28
+ case 3:
29
+ _a = tslib_1.__values.apply(void 0, [_e.sent()]), _b = _a.next();
30
+ _e.label = 4;
31
+ case 4:
32
+ if (!!_b.done) return [3 /*break*/, 10];
33
+ r = _b.value;
34
+ _c = r.name;
35
+ switch (_c) {
36
+ case "__WebKitDatabaseInfoTable__": return [3 /*break*/, 5];
37
+ case "sqlite_sequence": return [3 /*break*/, 6];
38
+ }
39
+ return [3 /*break*/, 7];
40
+ case 5: return [3 /*break*/, 9];
41
+ case 6: return [3 /*break*/, 9];
42
+ case 7: return [4 /*yield*/, sql.execute("drop table if exists " + r.name)];
43
+ case 8:
44
+ _e.sent();
45
+ _e.label = 9;
46
+ case 9:
47
+ _b = _a.next();
48
+ return [3 /*break*/, 4];
49
+ case 10: return [3 /*break*/, 13];
50
+ case 11:
51
+ e_1_1 = _e.sent();
52
+ e_1 = { error: e_1_1 };
53
+ return [3 /*break*/, 13];
54
+ case 12:
55
+ try {
56
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
57
+ }
58
+ finally { if (e_1) throw e_1.error; }
59
+ return [7 /*endfinally*/];
60
+ case 13:
61
+ remult = new context_1.Remult();
62
+ remult.setDataProvider(sql);
63
+ return [4 /*yield*/, what({ db: sql, remult: remult, createEntity: function (x) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
64
+ return [2 /*return*/, remult.repo(x)];
65
+ }); }); } })];
66
+ case 14:
67
+ _e.sent();
68
+ return [2 /*return*/];
19
69
  }
20
- }
21
- let remult = new Remult();
22
- remult.setDataProvider(sql);
23
- await what({ db: sql, remult, createEntity: async (x) => remult.repo(x) });
24
- }, focus);
70
+ });
71
+ }); }, focus);
25
72
  }
26
- addDatabaseToTest(testWebSqlImpl);
27
- export function testRest(key, what, focus = false) {
28
- itWithFocus(key + " - Rest Provider", async () => {
29
- let r = new Remult();
30
- r.setDataProvider(new InMemoryDataProvider());
31
- let remult = new Remult();
32
- let db = new MockRestDataProvider(r);
33
- remult.setDataProvider(db);
34
- await what({ db, remult, createEntity: async (x) => remult.repo(x) });
35
- }, focus);
73
+ exports.testWebSqlImpl = testWebSqlImpl;
74
+ db_tests_setup_1.addDatabaseToTest(testWebSqlImpl);
75
+ function testRest(key, what, focus) {
76
+ var _this = this;
77
+ if (focus === void 0) { focus = false; }
78
+ db_tests_setup_1.itWithFocus(key + " - Rest Provider", function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
79
+ var r, remult, db;
80
+ var _this = this;
81
+ return tslib_1.__generator(this, function (_a) {
82
+ switch (_a.label) {
83
+ case 0:
84
+ r = new context_1.Remult();
85
+ r.setDataProvider(new __1.InMemoryDataProvider());
86
+ remult = new context_1.Remult();
87
+ db = new testHelper_spec_1.MockRestDataProvider(r);
88
+ remult.setDataProvider(db);
89
+ return [4 /*yield*/, what({ db: db, remult: remult, createEntity: function (x) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
90
+ return [2 /*return*/, remult.repo(x)];
91
+ }); }); } })];
92
+ case 1:
93
+ _a.sent();
94
+ return [2 /*return*/];
95
+ }
96
+ });
97
+ }); }, focus);
36
98
  }
37
- addDatabaseToTest(testRest);
38
- import '../shared-tests/';
99
+ exports.testRest = testRest;
100
+ db_tests_setup_1.addDatabaseToTest(testRest);
101
+ require("../shared-tests/");
package/src/tests/h.js CHANGED
@@ -1,35 +1,44 @@
1
- var h_1;
2
- import { __decorate, __metadata } from "tslib";
3
- import { Field, Entity, EntityBase, FieldType, Fields } from '../remult3';
4
- let h = h_1 = class h extends EntityBase {
5
- };
6
- __decorate([
7
- Fields.string(),
8
- __metadata("design:type", String)
9
- ], h.prototype, "id", void 0);
10
- __decorate([
11
- Field(() => h_1),
12
- __metadata("design:type", h)
13
- ], h.prototype, "refH", void 0);
14
- __decorate([
15
- Fields.string(),
16
- __metadata("design:type", String)
17
- ], h.prototype, "refHId", void 0);
18
- h = h_1 = __decorate([
19
- FieldType({
20
- valueConverter: {
21
- toJson: x => x != undefined ? x : '',
22
- fromJson: x => x ? x : null
23
- },
24
- }),
25
- Entity('h', {
26
- saving: self => {
27
- if (self.refH)
28
- self.refHId = self.refH.id;
29
- else
30
- self.refHId = '';
31
- },
32
- allowApiCrud: true
33
- })
34
- ], h);
35
- export { h };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.h = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var remult3_1 = require("../remult3");
6
+ var h = /** @class */ (function (_super) {
7
+ tslib_1.__extends(h, _super);
8
+ function h() {
9
+ return _super !== null && _super.apply(this, arguments) || this;
10
+ }
11
+ h_1 = h;
12
+ var h_1;
13
+ tslib_1.__decorate([
14
+ remult3_1.Fields.string(),
15
+ tslib_1.__metadata("design:type", String)
16
+ ], h.prototype, "id", void 0);
17
+ tslib_1.__decorate([
18
+ remult3_1.Field(function () { return h_1; }),
19
+ tslib_1.__metadata("design:type", h)
20
+ ], h.prototype, "refH", void 0);
21
+ tslib_1.__decorate([
22
+ remult3_1.Fields.string(),
23
+ tslib_1.__metadata("design:type", String)
24
+ ], h.prototype, "refHId", void 0);
25
+ h = h_1 = tslib_1.__decorate([
26
+ remult3_1.FieldType({
27
+ valueConverter: {
28
+ toJson: function (x) { return x != undefined ? x : ''; },
29
+ fromJson: function (x) { return x ? x : null; }
30
+ },
31
+ }),
32
+ remult3_1.Entity('h', {
33
+ saving: function (self) {
34
+ if (self.refH)
35
+ self.refHId = self.refH.id;
36
+ else
37
+ self.refHId = '';
38
+ },
39
+ allowApiCrud: true
40
+ })
41
+ ], h);
42
+ return h;
43
+ }(remult3_1.EntityBase));
44
+ exports.h = h;
@@ -1,72 +1,81 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { EntityBase, Field, Entity, Fields } from "../remult3";
3
- import { Status } from "./testModel/models";
4
- let Products = class Products {
5
- };
6
- __decorate([
7
- Fields.integer(),
8
- __metadata("design:type", Number)
9
- ], Products.prototype, "id", void 0);
10
- __decorate([
11
- Fields.string(),
12
- __metadata("design:type", String)
13
- ], Products.prototype, "name", void 0);
14
- __decorate([
15
- Fields.number(),
16
- __metadata("design:type", Number)
17
- ], Products.prototype, "price", void 0);
18
- __decorate([
19
- Fields.boolean(),
20
- __metadata("design:type", Boolean)
21
- ], Products.prototype, "archived", void 0);
22
- __decorate([
23
- Fields.date(),
24
- __metadata("design:type", Date)
25
- ], Products.prototype, "availableFrom", void 0);
26
- Products = __decorate([
27
- Entity('Products')
28
- ], Products);
29
- export { Products };
30
- let r;
31
- let Categories = class Categories extends EntityBase {
32
- constructor() {
33
- super(...arguments);
34
- this.id = 0;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Categories = exports.Products = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var remult3_1 = require("../remult3");
6
+ var models_1 = require("./testModel/models");
7
+ var Products = /** @class */ (function () {
8
+ function Products() {
35
9
  }
36
- };
37
- __decorate([
38
- Fields.number({
39
- dbName: 'CategoryID'
40
- }),
41
- __metadata("design:type", Number)
42
- ], Categories.prototype, "id", void 0);
43
- __decorate([
44
- Fields.string({ allowNull: true }),
45
- __metadata("design:type", String)
46
- ], Categories.prototype, "categoryName", void 0);
47
- __decorate([
48
- Fields.string(),
49
- __metadata("design:type", String)
50
- ], Categories.prototype, "description", void 0);
51
- __decorate([
52
- Fields.number({
53
- serverExpression: c => c.categoryName ? c.categoryName.length : undefined
54
- }),
55
- __metadata("design:type", Number)
56
- ], Categories.prototype, "categoryNameLength", void 0);
57
- __decorate([
58
- Fields.number({
59
- serverExpression: (c) => Promise.resolve(c.categoryName ? c.categoryName.length : undefined)
60
- }),
61
- __metadata("design:type", Number)
62
- ], Categories.prototype, "categoryNameLengthAsync", void 0);
63
- __decorate([
64
- Field(() => Status),
65
- __metadata("design:type", Status)
66
- ], Categories.prototype, "status", void 0);
67
- Categories = __decorate([
68
- Entity('Categories', {
69
- allowApiCrud: true
70
- })
71
- ], Categories);
72
- export { Categories };
10
+ tslib_1.__decorate([
11
+ remult3_1.Fields.integer(),
12
+ tslib_1.__metadata("design:type", Number)
13
+ ], Products.prototype, "id", void 0);
14
+ tslib_1.__decorate([
15
+ remult3_1.Fields.string(),
16
+ tslib_1.__metadata("design:type", String)
17
+ ], Products.prototype, "name", void 0);
18
+ tslib_1.__decorate([
19
+ remult3_1.Fields.number(),
20
+ tslib_1.__metadata("design:type", Number)
21
+ ], Products.prototype, "price", void 0);
22
+ tslib_1.__decorate([
23
+ remult3_1.Fields.boolean(),
24
+ tslib_1.__metadata("design:type", Boolean)
25
+ ], Products.prototype, "archived", void 0);
26
+ tslib_1.__decorate([
27
+ remult3_1.Fields.date(),
28
+ tslib_1.__metadata("design:type", Date)
29
+ ], Products.prototype, "availableFrom", void 0);
30
+ Products = tslib_1.__decorate([
31
+ remult3_1.Entity('Products')
32
+ ], Products);
33
+ return Products;
34
+ }());
35
+ exports.Products = Products;
36
+ var r;
37
+ var Categories = /** @class */ (function (_super) {
38
+ tslib_1.__extends(Categories, _super);
39
+ function Categories() {
40
+ var _this = _super !== null && _super.apply(this, arguments) || this;
41
+ _this.id = 0;
42
+ return _this;
43
+ }
44
+ tslib_1.__decorate([
45
+ remult3_1.Fields.number({
46
+ dbName: 'CategoryID'
47
+ }),
48
+ tslib_1.__metadata("design:type", Number)
49
+ ], Categories.prototype, "id", void 0);
50
+ tslib_1.__decorate([
51
+ remult3_1.Fields.string({ allowNull: true }),
52
+ tslib_1.__metadata("design:type", String)
53
+ ], Categories.prototype, "categoryName", void 0);
54
+ tslib_1.__decorate([
55
+ remult3_1.Fields.string(),
56
+ tslib_1.__metadata("design:type", String)
57
+ ], Categories.prototype, "description", void 0);
58
+ tslib_1.__decorate([
59
+ remult3_1.Fields.number({
60
+ serverExpression: function (c) { return c.categoryName ? c.categoryName.length : undefined; }
61
+ }),
62
+ tslib_1.__metadata("design:type", Number)
63
+ ], Categories.prototype, "categoryNameLength", void 0);
64
+ tslib_1.__decorate([
65
+ remult3_1.Fields.number({
66
+ serverExpression: function (c) { return Promise.resolve(c.categoryName ? c.categoryName.length : undefined); }
67
+ }),
68
+ tslib_1.__metadata("design:type", Number)
69
+ ], Categories.prototype, "categoryNameLengthAsync", void 0);
70
+ tslib_1.__decorate([
71
+ remult3_1.Field(function () { return models_1.Status; }),
72
+ tslib_1.__metadata("design:type", models_1.Status)
73
+ ], Categories.prototype, "status", void 0);
74
+ Categories = tslib_1.__decorate([
75
+ remult3_1.Entity('Categories', {
76
+ allowApiCrud: true
77
+ })
78
+ ], Categories);
79
+ return Categories;
80
+ }(remult3_1.EntityBase));
81
+ exports.Categories = Categories;
@@ -1,24 +1,30 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { Entity, EntityBase, Fields } from '../remult3';
3
- let tasks = class tasks extends EntityBase {
4
- constructor() {
5
- super(...arguments);
6
- this.completed = false;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tasks = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var remult3_1 = require("../remult3");
6
+ var tasks = /** @class */ (function (_super) {
7
+ tslib_1.__extends(tasks, _super);
8
+ function tasks() {
9
+ var _this = _super !== null && _super.apply(this, arguments) || this;
10
+ _this.completed = false;
11
+ return _this;
7
12
  }
8
- };
9
- __decorate([
10
- Fields.integer(),
11
- __metadata("design:type", Number)
12
- ], tasks.prototype, "id", void 0);
13
- __decorate([
14
- Fields.string(),
15
- __metadata("design:type", String)
16
- ], tasks.prototype, "name", void 0);
17
- __decorate([
18
- Fields.boolean(),
19
- __metadata("design:type", Boolean)
20
- ], tasks.prototype, "completed", void 0);
21
- tasks = __decorate([
22
- Entity('tasks', { allowApiCrud: true })
23
- ], tasks);
24
- export { tasks };
13
+ tslib_1.__decorate([
14
+ remult3_1.Fields.integer(),
15
+ tslib_1.__metadata("design:type", Number)
16
+ ], tasks.prototype, "id", void 0);
17
+ tslib_1.__decorate([
18
+ remult3_1.Fields.string(),
19
+ tslib_1.__metadata("design:type", String)
20
+ ], tasks.prototype, "name", void 0);
21
+ tslib_1.__decorate([
22
+ remult3_1.Fields.boolean(),
23
+ tslib_1.__metadata("design:type", Boolean)
24
+ ], tasks.prototype, "completed", void 0);
25
+ tasks = tslib_1.__decorate([
26
+ remult3_1.Entity('tasks', { allowApiCrud: true })
27
+ ], tasks);
28
+ return tasks;
29
+ }(remult3_1.EntityBase));
30
+ exports.tasks = tasks;