remult 0.18.1-exp.2 → 0.18.1-exp.21

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 (154) hide show
  1. package/README.md +28 -5
  2. package/esm/index.d.ts +4 -3
  3. package/esm/index.js +4 -2
  4. package/esm/live-query/ably.d.ts +6 -6
  5. package/esm/live-query/ably.js +5 -5
  6. package/esm/postgres/postgres-data-provider.d.ts +3 -1
  7. package/esm/postgres/postgres-data-provider.js +11 -1
  8. package/esm/postgres/schema-builder.d.ts +1 -1
  9. package/esm/postgres/schema-builder.js +43 -27
  10. package/esm/remult-express.d.ts +4 -22
  11. package/esm/remult-express.js +30 -28
  12. package/esm/remult-fastify.js +1 -1
  13. package/esm/remult-fresh.js +2 -2
  14. package/esm/remult-knex/index.d.ts +7 -31
  15. package/esm/remult-knex/index.js +71 -42
  16. package/esm/remult-mongo.d.ts +9 -2
  17. package/esm/remult-mongo.js +24 -8
  18. package/esm/remult-next.d.ts +11 -0
  19. package/esm/remult-next.js +27 -0
  20. package/esm/server/expressBridge.d.ts +20 -52
  21. package/esm/server/expressBridge.js +55 -29
  22. package/esm/server/index.d.ts +3 -1
  23. package/esm/server/index.js +6 -1
  24. package/esm/src/column-interfaces.d.ts +44 -8
  25. package/esm/src/context.d.ts +31 -19
  26. package/esm/src/context.js +35 -42
  27. package/esm/src/data-api.js +17 -4
  28. package/esm/src/data-interfaces.d.ts +1 -1
  29. package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
  30. package/esm/src/data-providers/array-entity-data-provider.js +1 -1
  31. package/esm/src/data-providers/rest-data-provider.d.ts +4 -15
  32. package/esm/src/data-providers/rest-data-provider.js +38 -23
  33. package/esm/src/data-providers/sql-database.d.ts +6 -3
  34. package/esm/src/data-providers/sql-database.js +57 -16
  35. package/esm/src/data-providers/web-sql-data-provider.d.ts +2 -0
  36. package/esm/src/data-providers/web-sql-data-provider.js +17 -8
  37. package/esm/src/entity.d.ts +2 -2
  38. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  39. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
  40. package/esm/src/filter/filter-interfaces.d.ts +5 -5
  41. package/esm/src/filter/filter-interfaces.js +31 -26
  42. package/esm/src/live-query/LiveQueryClient.d.ts +1 -19
  43. package/esm/src/live-query/LiveQueryClient.js +81 -50
  44. package/esm/src/live-query/SseSubscriptionClient.d.ts +4 -0
  45. package/esm/src/live-query/{EventSourceLiveQueryProvider.js → SseSubscriptionClient.js} +7 -6
  46. package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
  47. package/esm/src/live-query/{LiveQuerySubscriber.js → SubscriptionChannel.js} +40 -22
  48. package/esm/src/live-query/SubscriptionServer.d.ts +38 -0
  49. package/esm/src/live-query/{LiveQueryPublisher.js → SubscriptionServer.js} +60 -73
  50. package/esm/src/remult-proxy.js +44 -1
  51. package/esm/src/remult3/RepositoryImplementation.d.ts +8 -2
  52. package/esm/src/remult3/RepositoryImplementation.js +94 -30
  53. package/esm/src/remult3/remult3.d.ts +59 -6
  54. package/esm/src/remult3/remult3.js +1 -0
  55. package/esm/src/server-action.d.ts +1 -1
  56. package/esm/src/shared-tests/db-tests-setup.d.ts +1 -1
  57. package/esm/src/shared-tests/db-tests-setup.js +4 -3
  58. package/esm/src/shared-tests/db-tests.db-tests.js +55 -9
  59. package/esm/src/sql-command.d.ts +4 -2
  60. package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
  61. package/esm/src/tests/entityForCustomFilter.js +20 -21
  62. package/esm/src/tests/frontend-database-tests-setup.spec.js +1 -2
  63. package/esm/src/tests/testHelper.spec.d.ts +2 -2
  64. package/esm/src/tests/testHelper.spec.js +1 -2
  65. package/esm/src/valueConverters.js +17 -7
  66. package/index.d.ts +4 -3
  67. package/index.js +7 -3
  68. package/live-query/ably.d.ts +6 -6
  69. package/live-query/ably.js +12 -12
  70. package/package.json +18 -9
  71. package/postgres/postgres-data-provider.d.ts +3 -1
  72. package/postgres/postgres-data-provider.js +13 -3
  73. package/postgres/schema-builder.d.ts +1 -1
  74. package/postgres/schema-builder.js +64 -50
  75. package/remult-express.d.ts +4 -22
  76. package/remult-express.js +39 -47
  77. package/remult-fastify.js +2 -2
  78. package/remult-fresh.js +1 -1
  79. package/remult-knex/index.d.ts +7 -31
  80. package/remult-knex/index.js +100 -53
  81. package/remult-mongo.d.ts +9 -2
  82. package/remult-mongo.js +39 -7
  83. package/remult-next.d.ts +11 -0
  84. package/remult-next.js +73 -0
  85. package/server/JsonEntityFileStorage.js +2 -2
  86. package/server/expressBridge.d.ts +20 -52
  87. package/server/expressBridge.js +68 -41
  88. package/server/index.d.ts +3 -1
  89. package/server/index.js +7 -2
  90. package/src/column-interfaces.d.ts +44 -8
  91. package/src/context.d.ts +31 -19
  92. package/src/context.js +39 -50
  93. package/src/data-api.js +18 -5
  94. package/src/data-interfaces.d.ts +1 -1
  95. package/src/data-providers/array-entity-data-provider.d.ts +1 -1
  96. package/src/data-providers/array-entity-data-provider.js +1 -1
  97. package/src/data-providers/rest-data-provider.d.ts +4 -15
  98. package/src/data-providers/rest-data-provider.js +48 -24
  99. package/src/data-providers/sql-database.d.ts +6 -3
  100. package/src/data-providers/sql-database.js +75 -15
  101. package/src/data-providers/web-sql-data-provider.d.ts +2 -0
  102. package/src/data-providers/web-sql-data-provider.js +16 -7
  103. package/src/entity.d.ts +2 -2
  104. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  105. package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
  106. package/src/filter/filter-interfaces.d.ts +5 -5
  107. package/src/filter/filter-interfaces.js +31 -26
  108. package/src/live-query/LiveQueryClient.d.ts +1 -19
  109. package/src/live-query/LiveQueryClient.js +117 -64
  110. package/src/live-query/SseSubscriptionClient.d.ts +4 -0
  111. package/src/live-query/{EventSourceLiveQueryProvider.js → SseSubscriptionClient.js} +13 -12
  112. package/src/live-query/SubscriptionChannel.d.ts +41 -0
  113. package/src/live-query/{LiveQuerySubscriber.js → SubscriptionChannel.js} +51 -47
  114. package/src/live-query/SubscriptionServer.d.ts +38 -0
  115. package/src/live-query/SubscriptionServer.js +237 -0
  116. package/src/remult-proxy.js +137 -2
  117. package/src/remult3/RepositoryImplementation.d.ts +8 -2
  118. package/src/remult3/RepositoryImplementation.js +121 -34
  119. package/src/remult3/remult3.d.ts +59 -6
  120. package/src/remult3/remult3.js +1 -0
  121. package/src/server-action.d.ts +1 -1
  122. package/src/shared-tests/db-tests-setup.d.ts +1 -1
  123. package/src/shared-tests/db-tests-setup.js +5 -4
  124. package/src/shared-tests/db-tests.db-tests.js +101 -8
  125. package/src/sql-command.d.ts +4 -2
  126. package/src/tests/entityForCustomFilter.d.ts +6 -6
  127. package/src/tests/entityForCustomFilter.js +30 -31
  128. package/src/tests/frontend-database-tests-setup.spec.js +4 -5
  129. package/src/tests/testHelper.spec.d.ts +2 -2
  130. package/src/tests/testHelper.spec.js +4 -5
  131. package/src/valueConverters.js +17 -7
  132. package/esm/live-query/index.d.ts +0 -3
  133. package/esm/live-query/index.js +0 -3
  134. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -5
  135. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -113
  136. package/esm/src/backend-tests/my-test.backend-spec.d.ts +0 -1
  137. package/esm/src/backend-tests/my-test.backend-spec.js +0 -59
  138. package/esm/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
  139. package/esm/src/backend-tests/test-http-server.backend-spec.js +0 -171
  140. package/esm/src/live-query/EventSourceLiveQueryProvider.d.ts +0 -4
  141. package/esm/src/live-query/LiveQueryPublisher.d.ts +0 -49
  142. package/esm/src/live-query/LiveQuerySubscriber.d.ts +0 -67
  143. package/live-query/index.d.ts +0 -3
  144. package/live-query/index.js +0 -10
  145. package/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -5
  146. package/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -231
  147. package/src/backend-tests/my-test.backend-spec.d.ts +0 -1
  148. package/src/backend-tests/my-test.backend-spec.js +0 -160
  149. package/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
  150. package/src/backend-tests/test-http-server.backend-spec.js +0 -342
  151. package/src/live-query/EventSourceLiveQueryProvider.d.ts +0 -4
  152. package/src/live-query/LiveQueryPublisher.d.ts +0 -49
  153. package/src/live-query/LiveQueryPublisher.js +0 -248
  154. package/src/live-query/LiveQuerySubscriber.d.ts +0 -67
@@ -13,11 +13,12 @@ import { Remult } from "../context";
13
13
  import { dWithPrefilter } from "../tests/dWithPrefilter";
14
14
  import { entityFilterToJson, Filter } from "../filter/filter-interfaces";
15
15
  import { d } from "../tests/d";
16
- import { entityForCustomFilter1 } from "../tests/entityForCustomFilter";
16
+ import { entityForrawFilter1 } from "../tests/entityForCustomFilter";
17
17
  import { entityWithValidationsOnColumn } from "../tests/entityWithValidationsOnColumn";
18
18
  import { Validators } from "../validators";
19
19
  import { Status } from "../tests/testModel/models";
20
20
  import { IdEntity } from "../id-entity";
21
+ import { describeClass } from "../remult3/DecoratorReplacer";
21
22
  testAll("what", async ({ remult, createEntity }) => {
22
23
  await (await createEntity(stam)).create({ id: 1, title: 'noam' }).save();
23
24
  expect(await remult.repo(stam).count()).toBe(1);
@@ -124,13 +125,37 @@ testAll("put with validations on entity fails", async ({ remult, createEntity })
124
125
  x = await s.find({ where: { myId: 1 } });
125
126
  expect(x[0].name).toBe('noam');
126
127
  });
127
- testAll("test date with null works", async ({ createEntity }) => {
128
+ testAll("test date only with null works", async ({ createEntity }) => {
128
129
  let repo = await createEntity(testDateWithNull);
129
130
  let r = repo.create({ id: 0 });
130
131
  await r.save();
131
132
  r = await repo.findFirst();
132
133
  expect(r.d).toBeNull();
133
134
  expect(await repo.count({ d: null })).toBe(1);
135
+ r.d = new Date(1976, 5, 16);
136
+ await r.save();
137
+ expect(r.d.getFullYear()).toBe(1976);
138
+ r = await repo.findFirst();
139
+ expect(r.d.getFullYear()).toBe(1976);
140
+ r.d = null;
141
+ await r.save();
142
+ expect(r.d).toBeNull();
143
+ }, false);
144
+ testAll("test date with null works", async ({ createEntity }) => {
145
+ let repo = await createEntity(testDateWithNull);
146
+ let r = repo.create({ id: 0 });
147
+ await r.save();
148
+ r = await repo.findFirst();
149
+ expect(r.fullDate).toBeNull("expected null after");
150
+ expect(await repo.count({ fullDate: null })).toBe(1);
151
+ r.fullDate = new Date(1976, 5, 16);
152
+ await r.save();
153
+ expect(r.fullDate.getFullYear()).toBe(1976);
154
+ r = await repo.findFirst();
155
+ expect(r.fullDate.getFullYear()).toBe(1976);
156
+ r.fullDate = null;
157
+ await r.save();
158
+ expect(r.fullDate).toBeNull();
134
159
  }, false);
135
160
  testAll("test original value of date", async ({ createEntity }) => {
136
161
  let r = await (await createEntity(testDateWithNull)).create({ id: 1, d: new Date(1976, 6, 16) }).save();
@@ -140,6 +165,7 @@ let testDateWithNull = class testDateWithNull extends EntityBase {
140
165
  constructor() {
141
166
  super(...arguments);
142
167
  this.id = 0;
168
+ this.fullDate = null;
143
169
  }
144
170
  };
145
171
  __decorate([
@@ -150,6 +176,10 @@ __decorate([
150
176
  Fields.dateOnly({ allowNull: true }),
151
177
  __metadata("design:type", Date)
152
178
  ], testDateWithNull.prototype, "d", void 0);
179
+ __decorate([
180
+ Fields.date({ allowNull: true }),
181
+ __metadata("design:type", Date)
182
+ ], testDateWithNull.prototype, "fullDate", void 0);
153
183
  testDateWithNull = __decorate([
154
184
  Entity('testDateWithNull', { allowApiCrud: true })
155
185
  ], testDateWithNull);
@@ -204,7 +234,7 @@ testAll("test paging with complex object", async ({ remult, createEntity }) => {
204
234
  i++;
205
235
  }
206
236
  expect(i).toBe(5);
207
- });
237
+ }, false);
208
238
  testAll("test paging with complex object_2", async ({ remult, createEntity }) => {
209
239
  let c1 = await (await createEntity(c)).create({ id: 1, name: 'c1' }).save();
210
240
  await (await createEntity(p)).create({ id: 1, name: 'p1', c: c1 }).save();
@@ -237,13 +267,13 @@ testAll("test filter doesn't collapse", async ({ createEntity }) => {
237
267
  expect((await repo.find({ where: f })).length).toBe(2);
238
268
  });
239
269
  testAll("test that it works with inheritance", async ({ createEntity }) => {
240
- let c = await createEntity(entityForCustomFilter1);
270
+ let c = await createEntity(entityForrawFilter1);
241
271
  for (let id = 0; id < 5; id++) {
242
272
  await c.create({ id }).save();
243
273
  }
244
- expect(await (c.count(entityForCustomFilter1.oneAndThree()))).toBe(2);
245
- expect((await (c.findFirst(entityForCustomFilter1.testNumericValue(2)))).id).toBe(2);
246
- expect((await (c.findFirst(entityForCustomFilter1.testObjectValue({ val: 2 })))).id).toBe(2);
274
+ expect(await (c.count(entityForrawFilter1.oneAndThree()))).toBe(2);
275
+ expect((await (c.findFirst(entityForrawFilter1.testNumericValue(2)))).id).toBe(2);
276
+ expect((await (c.findFirst(entityForrawFilter1.testObjectValue({ val: 2 })))).id).toBe(2);
247
277
  });
248
278
  testAll("put with validations on column fails", async ({ remult, createEntity }) => {
249
279
  var s = await createEntity(entityWithValidationsOnColumn);
@@ -412,7 +442,7 @@ testAllDbs("get array works with filter in body", async ({ createData, remult })
412
442
  return undefined;
413
443
  }
414
444
  }, {
415
- status_in: '[1, 2]'
445
+ "status.in": '[1, 2]'
416
446
  });
417
447
  d.test();
418
448
  }, false);
@@ -537,7 +567,7 @@ let testFilter = class testFilter {
537
567
  this.c = '';
538
568
  }
539
569
  };
540
- testFilter.search = Filter.createCustom((remult, str) => ({
570
+ testFilter.search = Filter.createCustom((str, remult) => ({
541
571
  $and: [{
542
572
  $or: [
543
573
  { a: 'a' },
@@ -721,3 +751,19 @@ testAll("test transaction rollback", async ({ db }) => {
721
751
  }
722
752
  expect(fail).toBe(true);
723
753
  });
754
+ testAll("test date", async ({ createEntity }) => {
755
+ const e = class {
756
+ constructor() {
757
+ this.a = 0;
758
+ this.d = new Date();
759
+ }
760
+ };
761
+ describeClass(e, Entity("tdate", { allowApiCrud: true }), {
762
+ a: Fields.number(),
763
+ d: Fields.date()
764
+ });
765
+ const r = await createEntity(e);
766
+ await r.insert({ a: 1, d: new Date(1976, 5, 16) });
767
+ let item = await r.findFirst();
768
+ expect(item.d.getFullYear()).toBe(1976);
769
+ }, false);
@@ -5,10 +5,12 @@ export interface SqlImplementation {
5
5
  transaction(action: (sql: SqlImplementation) => Promise<void>): Promise<void>;
6
6
  entityIsUsedForTheFirstTime(entity: EntityMetadata): Promise<void>;
7
7
  }
8
- export interface SqlCommand {
9
- addParameterAndReturnSqlToken(val: any): string;
8
+ export interface SqlCommand extends SqlCommandWithParameters {
10
9
  execute(sql: string): Promise<SqlResult>;
11
10
  }
11
+ export interface SqlCommandWithParameters {
12
+ addParameterAndReturnSqlToken(val: any): string;
13
+ }
12
14
  export interface SqlResult {
13
15
  rows: any[];
14
16
  getColumnKeyInResultForIndexInSelect(index: number): string;
@@ -1,16 +1,16 @@
1
1
  import { EntityBase, EntityFilter } from '../remult3';
2
- export declare class entityForCustomFilter extends EntityBase {
2
+ export declare class entityForrawFilter extends EntityBase {
3
3
  id: number;
4
4
  static filter: ((y: {
5
5
  oneAndThree?: boolean;
6
6
  dbOneOrThree?: boolean;
7
7
  two?: boolean;
8
- }) => EntityFilter<entityForCustomFilter>) & import("../filter/filter-interfaces").customFilterInfo<entityForCustomFilter>;
9
- static oneAndThree: (() => EntityFilter<entityForCustomFilter>) & import("../filter/filter-interfaces").customFilterInfo<entityForCustomFilter>;
10
- static testNumericValue: ((y: number) => EntityFilter<entityForCustomFilter>) & import("../filter/filter-interfaces").customFilterInfo<entityForCustomFilter>;
8
+ }) => EntityFilter<entityForrawFilter>) & import("../filter/filter-interfaces").rawFilterInfo<entityForrawFilter>;
9
+ static oneAndThree: (() => EntityFilter<entityForrawFilter>) & import("../filter/filter-interfaces").rawFilterInfo<entityForrawFilter>;
10
+ static testNumericValue: ((y: number) => EntityFilter<entityForrawFilter>) & import("../filter/filter-interfaces").rawFilterInfo<entityForrawFilter>;
11
11
  static testObjectValue: ((y: {
12
12
  val: number;
13
- }) => EntityFilter<entityForCustomFilter>) & import("../filter/filter-interfaces").customFilterInfo<entityForCustomFilter>;
13
+ }) => EntityFilter<entityForrawFilter>) & import("../filter/filter-interfaces").rawFilterInfo<entityForrawFilter>;
14
14
  }
15
- export declare class entityForCustomFilter1 extends entityForCustomFilter {
15
+ export declare class entityForrawFilter1 extends entityForrawFilter {
16
16
  }
@@ -1,44 +1,43 @@
1
- var entityForCustomFilter_1;
1
+ var entityForrawFilter_1;
2
2
  import { __decorate, __metadata } from "tslib";
3
3
  import { SqlDatabase } from '../data-providers/sql-database';
4
4
  import { Entity, EntityBase, Fields } from '../remult3';
5
5
  import { Filter } from '../filter/filter-interfaces';
6
6
  import { ArrayEntityDataProvider } from '../data-providers/array-entity-data-provider';
7
- import { getDbNameProvider } from '../filter/filter-consumer-bridge-to-sql-request';
8
- let entityForCustomFilter = entityForCustomFilter_1 = class entityForCustomFilter extends EntityBase {
7
+ import { dbNamesOf } from '../filter/filter-consumer-bridge-to-sql-request';
8
+ let entityForrawFilter = entityForrawFilter_1 = class entityForrawFilter extends EntityBase {
9
9
  };
10
- entityForCustomFilter.filter = Filter.createCustom(async (remult, c) => {
10
+ entityForrawFilter.filter = Filter.createCustom(async (c, remult) => {
11
11
  let r = [];
12
12
  if (c.oneAndThree)
13
13
  r.push({ id: [1, 3] });
14
14
  if (c.two)
15
15
  r.push({ id: 2 });
16
16
  if (c.dbOneOrThree) {
17
- let meta = remult.repo(entityForCustomFilter_1).metadata;
18
- const e = await getDbNameProvider(meta);
17
+ const e = await dbNamesOf(remult.repo(entityForrawFilter_1));
19
18
  r.push({
20
19
  $and: [
21
- SqlDatabase.customFilter(async (x) => x.sql = e.nameOf(meta.fields.id) + ' in (' + x.addParameterAndReturnSqlToken(1) + "," + x.addParameterAndReturnSqlToken(3) + ")"),
22
- ArrayEntityDataProvider.customFilter(x => x.id == 1 || x.id == 3)
20
+ SqlDatabase.rawFilter(async (x) => x.sql = e.id + ' in (' + x.addParameterAndReturnSqlToken(1) + "," + x.addParameterAndReturnSqlToken(3) + ")"),
21
+ ArrayEntityDataProvider.rawFilter(x => x.id == 1 || x.id == 3)
23
22
  ]
24
23
  });
25
24
  }
26
25
  return { $and: r };
27
26
  });
28
- entityForCustomFilter.oneAndThree = Filter.createCustom(() => ({ id: [1, 3] }));
29
- entityForCustomFilter.testNumericValue = Filter.createCustom((r, val) => ({ id: val }));
30
- entityForCustomFilter.testObjectValue = Filter.createCustom((r, val) => ({ id: val.val }));
27
+ entityForrawFilter.oneAndThree = Filter.createCustom(() => ({ id: [1, 3] }));
28
+ entityForrawFilter.testNumericValue = Filter.createCustom((val) => ({ id: val }));
29
+ entityForrawFilter.testObjectValue = Filter.createCustom((val) => ({ id: val.val }));
31
30
  __decorate([
32
31
  Fields.integer(),
33
32
  __metadata("design:type", Number)
34
- ], entityForCustomFilter.prototype, "id", void 0);
35
- entityForCustomFilter = entityForCustomFilter_1 = __decorate([
36
- Entity('entityForCustomFilter', { allowApiCrud: true })
37
- ], entityForCustomFilter);
38
- export { entityForCustomFilter };
39
- let entityForCustomFilter1 = class entityForCustomFilter1 extends entityForCustomFilter {
33
+ ], entityForrawFilter.prototype, "id", void 0);
34
+ entityForrawFilter = entityForrawFilter_1 = __decorate([
35
+ Entity('entityForrawFilter', { allowApiCrud: true })
36
+ ], entityForrawFilter);
37
+ export { entityForrawFilter };
38
+ let entityForrawFilter1 = class entityForrawFilter1 extends entityForrawFilter {
40
39
  };
41
- entityForCustomFilter1 = __decorate([
42
- Entity('entityForCustomFilter1', { allowApiCrud: true })
43
- ], entityForCustomFilter1);
44
- export { entityForCustomFilter1 };
40
+ entityForrawFilter1 = __decorate([
41
+ Entity('entityForrawFilter1', { allowApiCrud: true })
42
+ ], entityForrawFilter1);
43
+ export { entityForrawFilter1 };
@@ -1,5 +1,5 @@
1
1
  import { addDatabaseToTest, itWithFocus } from "../shared-tests/db-tests-setup";
2
- import { InMemoryDataProvider } from "../..";
2
+ import { InMemoryDataProvider, remult } from "../..";
3
3
  import { Remult } from "../context";
4
4
  import { SqlDatabase } from "../data-providers/sql-database";
5
5
  import { WebSqlDataProvider } from "../data-providers/web-sql-data-provider";
@@ -28,7 +28,6 @@ export function testRest(key, what, focus = false) {
28
28
  itWithFocus(key + " - Rest Provider", async () => {
29
29
  let r = new Remult();
30
30
  r.dataProvider = (new InMemoryDataProvider());
31
- let remult = new Remult();
32
31
  let db = new MockRestDataProvider(r);
33
32
  remult.dataProvider = (db);
34
33
  await what({ db, remult, createEntity: async (x) => remult.repo(x) });
@@ -31,6 +31,6 @@ export declare class MockRestDataProvider implements DataProvider {
31
31
  constructor(remult: Remult);
32
32
  getEntityDataProvider(metadata: EntityMetadata<any>): EntityDataProvider;
33
33
  transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
34
- supportsCustomFilter: boolean;
34
+ supportsrawFilter: boolean;
35
35
  }
36
- export declare function createMockHttpDataProvider(dataApi: DataApi<any>): import("c:/Repos/radweb/projects/core/src/data-interfaces").RestDataProviderHttpProvider;
36
+ export declare function createMockHttpDataProvider(dataApi: DataApi<any>): import("../data-interfaces").RestDataProviderHttpProvider;
@@ -104,7 +104,6 @@ export async function testSql(runAsync) {
104
104
  await runAsync({ db: sql, remult });
105
105
  }
106
106
  export async function testInMemoryDb(runAsync) {
107
- let remult = new Remult();
108
107
  let db = new InMemoryDataProvider();
109
108
  remult.dataProvider = (db);
110
109
  await runAsync({ db, remult });
@@ -155,7 +154,7 @@ function urlToReq(url) {
155
154
  export class MockRestDataProvider {
156
155
  constructor(remult) {
157
156
  this.remult = remult;
158
- this.supportsCustomFilter = true;
157
+ this.supportsrawFilter = true;
159
158
  }
160
159
  getEntityDataProvider(metadata) {
161
160
  let dataApi = new DataApi(this.remult.repo(metadata.entityType), this.remult);
@@ -3,6 +3,8 @@ export class ValueConverters {
3
3
  }
4
4
  ValueConverters.Date = {
5
5
  toJson: (val) => {
6
+ if (val === null)
7
+ return null;
6
8
  if (!val)
7
9
  return '';
8
10
  if (typeof (val) === "string")
@@ -11,11 +13,12 @@ ValueConverters.Date = {
11
13
  return val.toISOString();
12
14
  }
13
15
  else {
14
- console.error("ToJsonError", val);
15
- throw new Error("Expected date but got val");
16
+ throw new Error("Expected date but got " + val);
16
17
  }
17
18
  },
18
19
  fromJson: (val) => {
20
+ if (val === null)
21
+ return null;
19
22
  if (val == undefined)
20
23
  return undefined;
21
24
  if (val == '')
@@ -25,7 +28,15 @@ ValueConverters.Date = {
25
28
  return new Date(Date.parse(val));
26
29
  },
27
30
  toDb: x => x,
28
- fromDb: x => x,
31
+ fromDb: val => {
32
+ if (typeof val === "number")
33
+ val = new Date(val);
34
+ if (typeof (val) === "string")
35
+ val = new Date(val);
36
+ if (val && !(val instanceof Date))
37
+ throw "expected date but got " + val;
38
+ return val;
39
+ },
29
40
  fromInput: x => ValueConverters.Date.fromJson(x),
30
41
  toInput: x => ValueConverters.Date.toJson(x),
31
42
  displayValue: (val) => {
@@ -63,10 +74,7 @@ ValueConverters.DateOnly = {
63
74
  } //when using date storage, the database expects and returns a date local and every where else we reflect on date iso
64
75
  ,
65
76
  fromDb: (val) => {
66
- var d = val;
67
- if (!d)
68
- return null;
69
- return val;
77
+ return ValueConverters.Date.fromDb(val);
70
78
  },
71
79
  fieldTypeInDb: 'date',
72
80
  displayValue: (value) => {
@@ -100,6 +108,8 @@ ValueConverters.Boolean = {
100
108
  fromJson: value => {
101
109
  if (typeof value === "boolean")
102
110
  return value;
111
+ if (value === 1)
112
+ return true;
103
113
  if (value !== undefined && value !== null) {
104
114
  return value.toString().trim().toLowerCase() == 'true';
105
115
  }
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { Field, Fields, FieldsMetadata, Entity, 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';
1
+ export { Field, Fields, FieldsMetadata, Entity, 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, LiveQuery, LiveQueryChangeInfo } from './src/remult3';
2
2
  export { StringFieldOptions } from './src/remult3/RepositoryImplementation';
3
3
  export { describeClass } from './src/remult3/DecoratorReplacer';
4
4
  export { EntityOptions } from './src/entity';
@@ -11,7 +11,7 @@ export { InMemoryDataProvider } from './src/data-providers/in-memory-database';
11
11
  export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider';
12
12
  export { WebSqlDataProvider } from './src/data-providers/web-sql-data-provider';
13
13
  export { SqlDatabase, } from './src/data-providers/sql-database';
14
- export { CustomSqlFilterObject, CustomSqlFilterBuilder } from './src/filter/filter-consumer-bridge-to-sql-request';
14
+ export { CustomSqlFilterObject, CustomSqlFilterBuilder, dbNamesOf } from './src/filter/filter-consumer-bridge-to-sql-request';
15
15
  export { JsonDataProvider, JsonEntityStorage } from './src/data-providers/json-data-provider';
16
16
  export { Controller, BackendMethodOptions, BackendMethod, ProgressListener } from './src/server-action';
17
17
  export { Allowed, Allow, Remult, RemultContext, ApiClient, isBackend, AllowedForInstance, EventDispatcher, EventSource, Unobserve, UserInfo } from './src/context';
@@ -20,8 +20,9 @@ export { IdEntity } from './src/id-entity';
20
20
  export { SortSegment, Sort } from './src/sort';
21
21
  export { OneToMany, CompoundIdField } from './src/column';
22
22
  export { Filter } from './src/filter/filter-interfaces';
23
- export { FilterConsumerBridgeToSqlRequest } from './src/filter/filter-consumer-bridge-to-sql-request';
24
23
  export { UrlBuilder } from './urlBuilder';
25
24
  export { Validators } from './src/validators';
26
25
  export { ValueConverters } from './src/valueConverters';
27
26
  export { remult } from './src/remult-proxy';
27
+ export { SubscriptionServer, LiveQueryStorage, StoredQuery, InMemoryLiveQueryStorage } from "./src/live-query/SubscriptionServer";
28
+ export { SubscriptionListener, SubscriptionClientConnection, SubscriptionClient, SubscriptionChannel, LiveQueryChange, Unsubscribe } from './src/live-query/SubscriptionChannel';
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.remult = 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.CustomSqlFilterBuilder = exports.SqlDatabase = exports.WebSqlDataProvider = exports.ArrayEntityDataProvider = exports.InMemoryDataProvider = exports.RestDataProvider = exports.describeClass = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getEntityRef = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.Entity = exports.Fields = exports.Field = void 0;
3
+ exports.SubscriptionChannel = exports.InMemoryLiveQueryStorage = exports.remult = exports.ValueConverters = exports.Validators = exports.UrlBuilder = 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.dbNamesOf = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.WebSqlDataProvider = exports.ArrayEntityDataProvider = exports.InMemoryDataProvider = exports.RestDataProvider = exports.describeClass = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getEntityRef = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.Entity = exports.Fields = exports.Field = void 0;
4
4
  /*
5
5
  * Public API Surface of remult
6
6
  */
@@ -31,6 +31,7 @@ var sql_database_1 = require("./src/data-providers/sql-database"); //V
31
31
  Object.defineProperty(exports, "SqlDatabase", { enumerable: true, get: function () { return sql_database_1.SqlDatabase; } });
32
32
  var filter_consumer_bridge_to_sql_request_1 = require("./src/filter/filter-consumer-bridge-to-sql-request");
33
33
  Object.defineProperty(exports, "CustomSqlFilterBuilder", { enumerable: true, get: function () { return filter_consumer_bridge_to_sql_request_1.CustomSqlFilterBuilder; } });
34
+ Object.defineProperty(exports, "dbNamesOf", { enumerable: true, get: function () { return filter_consumer_bridge_to_sql_request_1.dbNamesOf; } });
34
35
  var json_data_provider_1 = require("./src/data-providers/json-data-provider"); //V
35
36
  Object.defineProperty(exports, "JsonDataProvider", { enumerable: true, get: function () { return json_data_provider_1.JsonDataProvider; } });
36
37
  //export * from './src/data-api'; //reconsider if to make internal
@@ -52,8 +53,6 @@ Object.defineProperty(exports, "OneToMany", { enumerable: true, get: function ()
52
53
  Object.defineProperty(exports, "CompoundIdField", { enumerable: true, get: function () { return column_1.CompoundIdField; } });
53
54
  var filter_interfaces_1 = require("./src/filter/filter-interfaces");
54
55
  Object.defineProperty(exports, "Filter", { enumerable: true, get: function () { return filter_interfaces_1.Filter; } });
55
- var filter_consumer_bridge_to_sql_request_2 = require("./src/filter/filter-consumer-bridge-to-sql-request");
56
- Object.defineProperty(exports, "FilterConsumerBridgeToSqlRequest", { enumerable: true, get: function () { return filter_consumer_bridge_to_sql_request_2.FilterConsumerBridgeToSqlRequest; } });
57
56
  var urlBuilder_1 = require("./urlBuilder");
58
57
  Object.defineProperty(exports, "UrlBuilder", { enumerable: true, get: function () { return urlBuilder_1.UrlBuilder; } });
59
58
  var validators_1 = require("./src/validators");
@@ -62,3 +61,8 @@ var valueConverters_1 = require("./src/valueConverters");
62
61
  Object.defineProperty(exports, "ValueConverters", { enumerable: true, get: function () { return valueConverters_1.ValueConverters; } });
63
62
  var remult_proxy_1 = require("./src/remult-proxy");
64
63
  Object.defineProperty(exports, "remult", { enumerable: true, get: function () { return remult_proxy_1.remult; } });
64
+ //export { getId } from './src/remult3/getId';
65
+ var SubscriptionServer_1 = require("./src/live-query/SubscriptionServer");
66
+ Object.defineProperty(exports, "InMemoryLiveQueryStorage", { enumerable: true, get: function () { return SubscriptionServer_1.InMemoryLiveQueryStorage; } });
67
+ var SubscriptionChannel_1 = require("./src/live-query/SubscriptionChannel");
68
+ Object.defineProperty(exports, "SubscriptionChannel", { enumerable: true, get: function () { return SubscriptionChannel_1.SubscriptionChannel; } });
@@ -1,13 +1,13 @@
1
1
  import type * as Ably from 'ably';
2
- import type { ServerEventDispatcher } from '../src/live-query/LiveQueryPublisher';
3
- import type { LiveQueryProvider, PubSubClient } from '../src/live-query/LiveQuerySubscriber';
4
- export declare class AblyLiveQueryProvider implements LiveQueryProvider {
2
+ import type { SubscriptionServer } from '../src/live-query/SubscriptionServer';
3
+ import type { SubscriptionClient, SubscriptionClientConnection } from '../src/live-query/SubscriptionChannel';
4
+ export declare class AblySubscriptionClient implements SubscriptionClient {
5
5
  private ably;
6
6
  constructor(ably: Ably.Types.RealtimePromise);
7
- openStreamAndReturnCloseFunction(onReconnect: VoidFunction): Promise<PubSubClient>;
7
+ openConnection(onReconnect: VoidFunction): Promise<SubscriptionClientConnection>;
8
8
  }
9
- export declare class AblyServerEventDispatcher implements ServerEventDispatcher {
9
+ export declare class AblySubscriptionServer implements SubscriptionServer {
10
10
  private ably;
11
11
  constructor(ably: Ably.Types.RealtimePromise);
12
- sendChannelMessage<T>(channel: string, message: T): void;
12
+ publishMessage<T>(channel: string, message: T): void;
13
13
  }
@@ -1,17 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AblyServerEventDispatcher = exports.AblyLiveQueryProvider = void 0;
3
+ exports.AblySubscriptionServer = exports.AblySubscriptionClient = void 0;
4
4
  var tslib_1 = require("tslib");
5
- var AblyLiveQueryProvider = /** @class */ (function () {
6
- function AblyLiveQueryProvider(ably) {
5
+ var AblySubscriptionClient = /** @class */ (function () {
6
+ function AblySubscriptionClient(ably) {
7
7
  this.ably = ably;
8
8
  }
9
- AblyLiveQueryProvider.prototype.openStreamAndReturnCloseFunction = function (onReconnect) {
9
+ AblySubscriptionClient.prototype.openConnection = function (onReconnect) {
10
10
  return tslib_1.__awaiter(this, void 0, void 0, function () {
11
11
  var _this = this;
12
12
  return tslib_1.__generator(this, function (_a) {
13
13
  return [2 /*return*/, {
14
- disconnect: function () {
14
+ close: function () {
15
15
  _this.ably.connection.close();
16
16
  },
17
17
  subscribe: function (channel, handler) {
@@ -23,16 +23,16 @@ var AblyLiveQueryProvider = /** @class */ (function () {
23
23
  });
24
24
  });
25
25
  };
26
- return AblyLiveQueryProvider;
26
+ return AblySubscriptionClient;
27
27
  }());
28
- exports.AblyLiveQueryProvider = AblyLiveQueryProvider;
29
- var AblyServerEventDispatcher = /** @class */ (function () {
30
- function AblyServerEventDispatcher(ably) {
28
+ exports.AblySubscriptionClient = AblySubscriptionClient;
29
+ var AblySubscriptionServer = /** @class */ (function () {
30
+ function AblySubscriptionServer(ably) {
31
31
  this.ably = ably;
32
32
  }
33
- AblyServerEventDispatcher.prototype.sendChannelMessage = function (channel, message) {
33
+ AblySubscriptionServer.prototype.publishMessage = function (channel, message) {
34
34
  this.ably.channels.get(channel).publish({ data: message });
35
35
  };
36
- return AblyServerEventDispatcher;
36
+ return AblySubscriptionServer;
37
37
  }());
38
- exports.AblyServerEventDispatcher = AblyServerEventDispatcher;
38
+ exports.AblySubscriptionServer = AblySubscriptionServer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.18.1-exp.2",
3
+ "version": "0.18.1-exp.21",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -17,6 +17,7 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "uuid": "^8.3.2",
20
+ "cuid": "^2.1.8",
20
21
  "reflect-metadata": "^0.1.13",
21
22
  "tslib": "^2.3.1"
22
23
  },
@@ -37,6 +38,14 @@
37
38
  },
38
39
  "import": "./esm/remult-express.js"
39
40
  },
41
+ "./remult-next": {
42
+ "require": "./remult-next.js",
43
+ "node": {
44
+ "require": "./remult-next.js",
45
+ "import": "./remult-next.js"
46
+ },
47
+ "import": "./esm/remult-next.js"
48
+ },
40
49
  "./server": {
41
50
  "require": "./server/index.js",
42
51
  "node": {
@@ -45,6 +54,14 @@
45
54
  },
46
55
  "import": "./esm/server/index.js"
47
56
  },
57
+ "./server/core": {
58
+ "require": "./server/core.js",
59
+ "node": {
60
+ "require": "./server/core.js",
61
+ "import": "./server/core.js"
62
+ },
63
+ "import": "./esm/server/core.js"
64
+ },
48
65
  "./remult-fastify": {
49
66
  "require": "./remult-fastify.js",
50
67
  "node": {
@@ -93,14 +110,6 @@
93
110
  },
94
111
  "import": "./esm/remult-mongo.js"
95
112
  },
96
- "./live-query": {
97
- "require": "./live-query/index.js",
98
- "node": {
99
- "require": "./live-query/index.js",
100
- "import": "./live-query/index.js"
101
- },
102
- "import": "./esm/live-query/index.js"
103
- },
104
113
  "./live-query/ably": {
105
114
  "require": "./live-query/ably.js",
106
115
  "node": {
@@ -1,4 +1,5 @@
1
- import { PoolConfig, QueryResult } from 'pg';
1
+ import { ClientBase, PoolConfig, QueryResult } from 'pg';
2
+ import { Remult } from '../src/context';
2
3
  import { EntityMetadata } from '../src/remult3';
3
4
  import { SqlCommand, SqlImplementation } from '../src/sql-command';
4
5
  import { SqlDatabase } from '../src/data-providers/sql-database';
@@ -10,6 +11,7 @@ export interface PostgresClient extends PostgresCommandSource {
10
11
  }
11
12
  export declare class PostgresDataProvider implements SqlImplementation {
12
13
  private pool;
14
+ static getDb(remult?: Remult): ClientBase;
13
15
  entityIsUsedForTheFirstTime(entity: EntityMetadata): Promise<void>;
14
16
  getLimitSqlSyntax(limit: number, offset: number): string;
15
17
  createCommand(): SqlCommand;
@@ -10,6 +10,14 @@ var PostgresDataProvider = /** @class */ (function () {
10
10
  function PostgresDataProvider(pool) {
11
11
  this.pool = pool;
12
12
  }
13
+ PostgresDataProvider.getDb = function (remult) {
14
+ var sql = sql_database_1.SqlDatabase.getDb(remult);
15
+ var me = sql._getSourceSql();
16
+ if (!me.pool) {
17
+ throw "the data provider is not a PostgresDataProvider";
18
+ }
19
+ return me.pool;
20
+ };
13
21
  PostgresDataProvider.prototype.entityIsUsedForTheFirstTime = function (entity) {
14
22
  return tslib_1.__awaiter(this, void 0, void 0, function () {
15
23
  return tslib_1.__generator(this, function (_a) {
@@ -41,7 +49,9 @@ var PostgresDataProvider = /** @class */ (function () {
41
49
  createCommand: function () { return new PostgresBridgeToSQLCommand(client); },
42
50
  entityIsUsedForTheFirstTime: this.entityIsUsedForTheFirstTime,
43
51
  transaction: function () { throw "nested transactions not allowed"; },
44
- getLimitSqlSyntax: this.getLimitSqlSyntax
52
+ getLimitSqlSyntax: this.getLimitSqlSyntax,
53
+ //@ts-ignore
54
+ pool: client
45
55
  })];
46
56
  case 4:
47
57
  _a.sent();
@@ -140,7 +150,7 @@ function preparePostgresQueueStorage(sql) {
140
150
  case 0:
141
151
  c = new context_1.Remult();
142
152
  c.dataProvider = (sql);
143
- return [4 /*yield*/, Promise.resolve().then(function () { return require('../server/expressBridge'); })];
153
+ return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server/expressBridge')); })];
144
154
  case 1:
145
155
  JobsInQueueEntity = (_a.sent()).JobsInQueueEntity;
146
156
  e = c.repo(JobsInQueueEntity);
@@ -150,7 +160,7 @@ function preparePostgresQueueStorage(sql) {
150
160
  return [4 /*yield*/, new schema_builder_1.PostgresSchemaBuilder(sql).verifyAllColumns(e.metadata)];
151
161
  case 3:
152
162
  _a.sent();
153
- return [4 /*yield*/, Promise.resolve().then(function () { return require('../server/expressBridge'); })];
163
+ return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server/expressBridge')); })];
154
164
  case 4: return [2 /*return*/, new (_a.sent()).EntityQueueStorage(c.repo(JobsInQueueEntity))];
155
165
  }
156
166
  });
@@ -6,7 +6,7 @@ export declare function postgresColumnSyntax(x: FieldMetadata, dbName: string):
6
6
  export declare function verifyStructureOfAllEntities(db: SqlDatabase, remult: Remult): Promise<void>;
7
7
  export declare class PostgresSchemaBuilder {
8
8
  private pool;
9
- verifyStructureOfAllEntities(remult: Remult): Promise<void>;
9
+ verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
10
10
  createIfNotExist(entity: EntityMetadata): Promise<void>;
11
11
  addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: ((e: T) => FieldMetadata)): Promise<void>;
12
12
  verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;