remult 0.14.2 → 0.14.5

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 (70) hide show
  1. package/assign.js +1 -5
  2. package/classType.js +1 -2
  3. package/graphql.js +84 -146
  4. package/index.d.ts +13 -0
  5. package/index.js +25 -55
  6. package/inputTypes.js +9 -16
  7. package/package.json +6 -1
  8. package/postgres/index.js +1 -4
  9. package/postgres/postgres-data-provider.js +165 -364
  10. package/postgres/postgresColumnSyntax.js +4 -8
  11. package/remult-express.js +6 -10
  12. package/remult-knex/index.js +300 -720
  13. package/remult-middleware.js +24 -30
  14. package/remult-mongo.js +172 -406
  15. package/server/JsonEntityFileStorage.js +10 -15
  16. package/server/expressBridge.js +383 -569
  17. package/server/index.js +4 -11
  18. package/server/register-actions-on-server.js +12 -38
  19. package/server/register-entities-on-server.js +9 -13
  20. package/src/__EntityValueProvider.js +1 -2
  21. package/src/__RowsOfDataForTesting.js +1 -2
  22. package/src/backend-tests/backend-database-test-setup.backend-spec.js +72 -190
  23. package/src/backend-tests/my-test.backend-spec.js +45 -114
  24. package/src/column-interfaces.js +2 -6
  25. package/src/column.js +71 -113
  26. package/src/context.js +174 -330
  27. package/src/data-api.js +162 -326
  28. package/src/data-interfaces.js +7 -11
  29. package/src/data-providers/array-entity-data-provider.js +171 -286
  30. package/src/data-providers/in-memory-database.js +12 -27
  31. package/src/data-providers/json-data-provider.js +41 -77
  32. package/src/data-providers/rest-data-provider.js +102 -189
  33. package/src/data-providers/sql-database.js +223 -403
  34. package/src/data-providers/web-sql-data-provider.js +78 -139
  35. package/src/entity.js +1 -2
  36. package/src/filter/filter-consumer-bridge-to-sql-request.js +106 -248
  37. package/src/filter/filter-consumer-bridge-to-url-builder.js +1 -2
  38. package/src/filter/filter-interfaces.js +277 -440
  39. package/src/id-entity.js +8 -17
  40. package/src/remult3/RepositoryImplementation.js +1191 -2367
  41. package/src/remult3/index.js +2 -5
  42. package/src/remult3/remult3.js +1 -2
  43. package/src/server-action.js +294 -528
  44. package/src/shared-tests/db-tests-setup.js +49 -153
  45. package/src/shared-tests/db-tests.db-tests.js +660 -1566
  46. package/src/shared-tests/deleteAll.js +3 -20
  47. package/src/shared-tests/entityWithValidations.js +52 -79
  48. package/src/shared-tests/index.js +4 -6
  49. package/src/shared-tests/test-custom-id-column.spec.js +37 -85
  50. package/src/shared-tests/test-special-value.spec.js +64 -104
  51. package/src/shared-tests/test-update-with-null.spec.js +28 -49
  52. package/src/sort.js +38 -95
  53. package/src/sql-command.js +1 -2
  54. package/src/tests/Done.js +7 -13
  55. package/src/tests/TestDataApiResponse.js +15 -22
  56. package/src/tests/c.js +21 -27
  57. package/src/tests/createData.js +20 -48
  58. package/src/tests/d.js +19 -27
  59. package/src/tests/dWithPrefilter.js +31 -44
  60. package/src/tests/entityForCustomFilter.js +42 -66
  61. package/src/tests/entityWithValidationsOnColumn.js +21 -29
  62. package/src/tests/frontend-database-tests-setup.spec.js +35 -98
  63. package/src/tests/h.js +35 -44
  64. package/src/tests/remult-3-entities.js +71 -80
  65. package/src/tests/tasks.js +23 -29
  66. package/src/tests/testHelper.spec.js +170 -322
  67. package/src/tests/testModel/models.js +25 -33
  68. package/src/validators.js +32 -59
  69. package/urlBuilder.js +8 -14
  70. package/valueConverters.js +161 -160
@@ -1,29 +1,21 @@
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
+ 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,101 +1,38 @@
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*/];
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);
69
19
  }
70
- });
71
- }); }, focus);
20
+ }
21
+ let remult = new Remult();
22
+ remult.setDataProvider(sql);
23
+ await what({ db: sql, remult, createEntity: async (x) => remult.repo(x) });
24
+ }, focus);
72
25
  }
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);
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);
98
36
  }
99
- exports.testRest = testRest;
100
- db_tests_setup_1.addDatabaseToTest(testRest);
101
- require("../shared-tests/");
37
+ addDatabaseToTest(testRest);
38
+ import '../shared-tests/';
package/src/tests/h.js CHANGED
@@ -1,44 +1,35 @@
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
+ 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,81 +1,72 @@
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() {
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;
9
35
  }
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;
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 };
@@ -1,30 +1,24 @@
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;
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;
12
7
  }
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;
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 };