remult 0.18.1-exp.3 → 0.18.1-exp.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 (139) hide show
  1. package/esm/index.d.ts +4 -3
  2. package/esm/index.js +4 -2
  3. package/esm/live-query/ably.d.ts +4 -4
  4. package/esm/live-query/ably.js +2 -2
  5. package/esm/postgres/postgres-data-provider.d.ts +3 -1
  6. package/esm/postgres/postgres-data-provider.js +11 -1
  7. package/esm/postgres/schema-builder.js +32 -24
  8. package/esm/remult-express.d.ts +3 -22
  9. package/esm/remult-express.js +27 -22
  10. package/esm/remult-knex/index.d.ts +6 -30
  11. package/esm/remult-knex/index.js +60 -40
  12. package/esm/remult-mongo.d.ts +9 -2
  13. package/esm/remult-mongo.js +24 -8
  14. package/esm/server/expressBridge.d.ts +8 -3
  15. package/esm/server/expressBridge.js +15 -8
  16. package/esm/server/index.d.ts +1 -1
  17. package/esm/server/index.js +1 -1
  18. package/esm/src/column-interfaces.d.ts +44 -8
  19. package/esm/src/context.d.ts +29 -9
  20. package/esm/src/context.js +26 -8
  21. package/esm/src/data-api.js +8 -5
  22. package/esm/src/data-interfaces.d.ts +1 -1
  23. package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
  24. package/esm/src/data-providers/array-entity-data-provider.js +1 -1
  25. package/esm/src/data-providers/rest-data-provider.d.ts +2 -18
  26. package/esm/src/data-providers/rest-data-provider.js +5 -2
  27. package/esm/src/data-providers/sql-database.d.ts +6 -3
  28. package/esm/src/data-providers/sql-database.js +57 -16
  29. package/esm/src/data-providers/web-sql-data-provider.d.ts +3 -0
  30. package/esm/src/data-providers/web-sql-data-provider.js +16 -8
  31. package/esm/src/entity.d.ts +2 -2
  32. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  33. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
  34. package/esm/src/filter/filter-interfaces.d.ts +5 -5
  35. package/esm/src/filter/filter-interfaces.js +26 -26
  36. package/esm/src/live-query/LiveQueryClient.js +49 -11
  37. package/esm/src/live-query/{EventSourceLiveQueryProvider.d.ts → SseSubscriptionClient.d.ts} +2 -2
  38. package/esm/src/live-query/{EventSourceLiveQueryProvider.js → SseSubscriptionClient.js} +2 -2
  39. package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
  40. package/esm/src/live-query/{LiveQuerySubscriber.js → SubscriptionChannel.js} +31 -23
  41. package/esm/src/live-query/SubscriptionServer.d.ts +37 -0
  42. package/esm/src/live-query/{LiveQueryPublisher.js → SubscriptionServer.js} +50 -48
  43. package/esm/src/remult-proxy.js +24 -1
  44. package/esm/src/remult3/RepositoryImplementation.d.ts +8 -2
  45. package/esm/src/remult3/RepositoryImplementation.js +92 -23
  46. package/esm/src/remult3/remult3.d.ts +52 -10
  47. package/esm/src/remult3/remult3.js +1 -0
  48. package/esm/src/server-action.d.ts +1 -1
  49. package/esm/src/shared-tests/db-tests-setup.js +1 -2
  50. package/esm/src/shared-tests/db-tests.db-tests.js +23 -6
  51. package/esm/src/sql-command.d.ts +4 -2
  52. package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
  53. package/esm/src/tests/entityForCustomFilter.js +20 -21
  54. package/esm/src/tests/frontend-database-tests-setup.spec.js +1 -2
  55. package/esm/src/tests/testHelper.spec.d.ts +1 -1
  56. package/esm/src/tests/testHelper.spec.js +1 -2
  57. package/esm/src/valueConverters.js +10 -3
  58. package/index.d.ts +4 -3
  59. package/index.js +7 -3
  60. package/live-query/ably.d.ts +4 -4
  61. package/live-query/ably.js +11 -11
  62. package/package.json +2 -9
  63. package/postgres/postgres-data-provider.d.ts +3 -1
  64. package/postgres/postgres-data-provider.js +11 -1
  65. package/postgres/schema-builder.js +33 -27
  66. package/remult-express.d.ts +3 -22
  67. package/remult-express.js +36 -31
  68. package/remult-knex/index.d.ts +6 -30
  69. package/remult-knex/index.js +82 -45
  70. package/remult-mongo.d.ts +9 -2
  71. package/remult-mongo.js +39 -7
  72. package/server/expressBridge.d.ts +8 -3
  73. package/server/expressBridge.js +18 -14
  74. package/server/index.d.ts +1 -1
  75. package/src/column-interfaces.d.ts +44 -8
  76. package/src/context.d.ts +29 -9
  77. package/src/context.js +30 -8
  78. package/src/data-api.js +9 -6
  79. package/src/data-interfaces.d.ts +1 -1
  80. package/src/data-providers/array-entity-data-provider.d.ts +1 -1
  81. package/src/data-providers/array-entity-data-provider.js +1 -1
  82. package/src/data-providers/rest-data-provider.d.ts +2 -18
  83. package/src/data-providers/rest-data-provider.js +5 -2
  84. package/src/data-providers/sql-database.d.ts +6 -3
  85. package/src/data-providers/sql-database.js +75 -15
  86. package/src/data-providers/web-sql-data-provider.d.ts +3 -0
  87. package/src/data-providers/web-sql-data-provider.js +15 -7
  88. package/src/entity.d.ts +2 -2
  89. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  90. package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
  91. package/src/filter/filter-interfaces.d.ts +5 -5
  92. package/src/filter/filter-interfaces.js +26 -26
  93. package/src/live-query/LiveQueryClient.js +87 -27
  94. package/src/live-query/{EventSourceLiveQueryProvider.d.ts → SseSubscriptionClient.d.ts} +2 -2
  95. package/src/live-query/{EventSourceLiveQueryProvider.js → SseSubscriptionClient.js} +10 -10
  96. package/src/live-query/SubscriptionChannel.d.ts +41 -0
  97. package/src/live-query/{LiveQuerySubscriber.js → SubscriptionChannel.js} +41 -50
  98. package/src/live-query/SubscriptionServer.d.ts +37 -0
  99. package/src/live-query/SubscriptionServer.js +234 -0
  100. package/src/remult-proxy.js +109 -2
  101. package/src/remult3/RepositoryImplementation.d.ts +8 -2
  102. package/src/remult3/RepositoryImplementation.js +120 -28
  103. package/src/remult3/remult3.d.ts +52 -10
  104. package/src/remult3/remult3.js +1 -0
  105. package/src/server-action.d.ts +1 -1
  106. package/src/shared-tests/db-tests-setup.js +2 -3
  107. package/src/shared-tests/db-tests.db-tests.js +39 -5
  108. package/src/sql-command.d.ts +4 -2
  109. package/src/tests/entityForCustomFilter.d.ts +6 -6
  110. package/src/tests/entityForCustomFilter.js +30 -31
  111. package/src/tests/frontend-database-tests-setup.spec.js +4 -5
  112. package/src/tests/testHelper.spec.d.ts +1 -1
  113. package/src/tests/testHelper.spec.js +4 -5
  114. package/src/valueConverters.js +10 -3
  115. package/esm/live-query/index.d.ts +0 -2
  116. package/esm/live-query/index.js +0 -2
  117. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -5
  118. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -113
  119. package/esm/src/backend-tests/my-test.backend-spec.d.ts +0 -1
  120. package/esm/src/backend-tests/my-test.backend-spec.js +0 -59
  121. package/esm/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
  122. package/esm/src/backend-tests/test-http-server.backend-spec.js +0 -171
  123. package/esm/src/live-query/LiveQueryPublisher.d.ts +0 -35
  124. package/esm/src/live-query/LiveQuerySubscriber.d.ts +0 -69
  125. package/esm/src/transactionLiveQueryPublisher.d.ts +0 -15
  126. package/esm/src/transactionLiveQueryPublisher.js +0 -45
  127. package/live-query/index.d.ts +0 -2
  128. package/live-query/index.js +0 -7
  129. package/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +0 -5
  130. package/src/backend-tests/backend-database-test-setup.backend-spec.js +0 -231
  131. package/src/backend-tests/my-test.backend-spec.d.ts +0 -1
  132. package/src/backend-tests/my-test.backend-spec.js +0 -160
  133. package/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
  134. package/src/backend-tests/test-http-server.backend-spec.js +0 -342
  135. package/src/live-query/LiveQueryPublisher.d.ts +0 -35
  136. package/src/live-query/LiveQueryPublisher.js +0 -230
  137. package/src/live-query/LiveQuerySubscriber.d.ts +0 -69
  138. package/src/transactionLiveQueryPublisher.d.ts +0 -15
  139. package/src/transactionLiveQueryPublisher.js +0 -76
package/esm/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/esm/index.js CHANGED
@@ -8,7 +8,7 @@ export { InMemoryDataProvider } from './src/data-providers/in-memory-database';
8
8
  export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider'; //V
9
9
  export { WebSqlDataProvider } from './src/data-providers/web-sql-data-provider'; //V
10
10
  export { SqlDatabase, } from './src/data-providers/sql-database'; //V
11
- export { CustomSqlFilterBuilder } from './src/filter/filter-consumer-bridge-to-sql-request';
11
+ export { CustomSqlFilterBuilder, dbNamesOf } from './src/filter/filter-consumer-bridge-to-sql-request';
12
12
  export { JsonDataProvider } from './src/data-providers/json-data-provider'; //V
13
13
  //export * from './src/data-api'; //reconsider if to make internal
14
14
  export { Controller, BackendMethod, ProgressListener } from './src/server-action';
@@ -17,8 +17,10 @@ export { IdEntity } from './src/id-entity';
17
17
  export { Sort } from './src/sort';
18
18
  export { OneToMany, CompoundIdField } from './src/column';
19
19
  export { Filter } from './src/filter/filter-interfaces';
20
- export { FilterConsumerBridgeToSqlRequest } from './src/filter/filter-consumer-bridge-to-sql-request';
21
20
  export { UrlBuilder } from './urlBuilder';
22
21
  export { Validators } from './src/validators';
23
22
  export { ValueConverters } from './src/valueConverters';
24
23
  export { remult } from './src/remult-proxy';
24
+ //export { getId } from './src/remult3/getId';
25
+ export { InMemoryLiveQueryStorage } from "./src/live-query/SubscriptionServer";
26
+ export { SubscriptionChannel } from './src/live-query/SubscriptionChannel';
@@ -1,12 +1,12 @@
1
1
  import type * as Ably from 'ably';
2
- import type { SubscriptionServer } from '../src/live-query/LiveQueryPublisher';
3
- import type { SubscriptionClient, SubscriptionClientConnection } from '../src/live-query/LiveQuerySubscriber';
4
- export declare class AblyLiveQueryProvider implements SubscriptionClient {
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
7
  openConnection(onReconnect: VoidFunction): Promise<SubscriptionClientConnection>;
8
8
  }
9
- export declare class AblyServerEventDispatcher implements SubscriptionServer {
9
+ export declare class AblySubscriptionServer implements SubscriptionServer {
10
10
  private ably;
11
11
  constructor(ably: Ably.Types.RealtimePromise);
12
12
  publishMessage<T>(channel: string, message: T): void;
@@ -1,4 +1,4 @@
1
- export class AblyLiveQueryProvider {
1
+ export class AblySubscriptionClient {
2
2
  constructor(ably) {
3
3
  this.ably = ably;
4
4
  }
@@ -15,7 +15,7 @@ export class AblyLiveQueryProvider {
15
15
  };
16
16
  }
17
17
  }
18
- export class AblyServerEventDispatcher {
18
+ export class AblySubscriptionServer {
19
19
  constructor(ably) {
20
20
  this.ably = ably;
21
21
  }
@@ -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;
@@ -6,6 +6,14 @@ export class PostgresDataProvider {
6
6
  constructor(pool) {
7
7
  this.pool = pool;
8
8
  }
9
+ static getDb(remult) {
10
+ const sql = SqlDatabase.getDb(remult);
11
+ const me = sql._getSourceSql();
12
+ if (!me.pool) {
13
+ throw "the data provider is not a PostgresDataProvider";
14
+ }
15
+ return me.pool;
16
+ }
9
17
  async entityIsUsedForTheFirstTime(entity) {
10
18
  }
11
19
  getLimitSqlSyntax(limit, offset) {
@@ -22,7 +30,9 @@ export class PostgresDataProvider {
22
30
  createCommand: () => new PostgresBridgeToSQLCommand(client),
23
31
  entityIsUsedForTheFirstTime: this.entityIsUsedForTheFirstTime,
24
32
  transaction: () => { throw "nested transactions not allowed"; },
25
- getLimitSqlSyntax: this.getLimitSqlSyntax
33
+ getLimitSqlSyntax: this.getLimitSqlSyntax,
34
+ //@ts-ignore
35
+ pool: client
26
36
  });
27
37
  await client.query('COMMIT');
28
38
  }
@@ -1,5 +1,5 @@
1
1
  import { allEntities } from '../src/context';
2
- import { getDbNameProvider } from '../src/filter/filter-consumer-bridge-to-sql-request';
2
+ import { dbNamesOf, isDbReadonly } from '../src/filter/filter-consumer-bridge-to-sql-request';
3
3
  import { isAutoIncrement } from '../src/remult3';
4
4
  import { ValueConverters } from '../src/valueConverters';
5
5
  export function postgresColumnSyntax(x, dbName) {
@@ -43,61 +43,66 @@ export class PostgresSchemaBuilder {
43
43
  }
44
44
  }
45
45
  async verifyStructureOfAllEntities(remult) {
46
- console.log("start verify structure"); //keep me
46
+ if (PostgresSchemaBuilder.logToConsole)
47
+ console.time("Postgres Auto create tables and columns");
47
48
  for (const entityClass of allEntities) {
48
49
  let entity = remult.repo(entityClass).metadata;
49
- let e = await getDbNameProvider(entity);
50
+ let e = await dbNamesOf(entity);
50
51
  try {
51
52
  if (!entity.options.sqlExpression) {
52
- if ((await e.entityName).toLowerCase().indexOf('from ') < 0) {
53
+ if ((await e.$entityName).toLowerCase().indexOf('from ') < 0) {
53
54
  await this.createIfNotExist(entity);
54
55
  await this.verifyAllColumns(entity);
55
56
  }
56
57
  }
57
58
  }
58
59
  catch (err) {
59
- /*keep me */ console.log("failed verify structure of " + e.entityName + " ", err);
60
+ console.error("failed verify structure of " + e.$entityName + " ", err);
60
61
  }
61
62
  }
63
+ if (PostgresSchemaBuilder.logToConsole)
64
+ console.timeEnd("Postgres Auto create tables and columns");
62
65
  }
63
66
  async createIfNotExist(entity) {
64
67
  var c = this.pool.createCommand();
65
- let e = await getDbNameProvider(entity);
66
- await c.execute("select 1 from information_Schema.tables where table_name=" + c.addParameterAndReturnSqlToken((e.entityName).toLowerCase()) + this.additionalWhere).then(async (r) => {
68
+ let e = await dbNamesOf(entity);
69
+ await c.execute("select 1 from information_Schema.tables where table_name=" + c.addParameterAndReturnSqlToken((e.$entityName).toLowerCase()) + this.additionalWhere).then(async (r) => {
67
70
  if (r.rows.length == 0) {
68
71
  let result = '';
69
72
  for (const x of entity.fields) {
70
- if (!e.isDbReadonly(x) || isAutoIncrement(x)) {
73
+ if (!isDbReadonly(x, e) || isAutoIncrement(x)) {
71
74
  if (result.length != 0)
72
75
  result += ',';
73
76
  result += '\r\n ';
74
77
  if (isAutoIncrement(x))
75
- result += e.nameOf(x) + ' serial';
78
+ result += e.$dbNameOf(x) + ' serial';
76
79
  else {
77
- result += postgresColumnSyntax(x, e.nameOf(x));
80
+ result += postgresColumnSyntax(x, e.$dbNameOf(x));
78
81
  if (x == entity.idMetadata.field)
79
82
  result += ' primary key';
80
83
  }
81
84
  }
82
85
  }
83
- let sql = 'create table ' + e.entityName + ' (' + result + '\r\n)';
84
- //console.log(sql);
86
+ let sql = 'create table ' + e.$entityName + ' (' + result + '\r\n)';
87
+ if (PostgresSchemaBuilder.logToConsole)
88
+ console.info(sql);
85
89
  await this.pool.execute(sql);
86
90
  }
87
91
  });
88
92
  }
89
93
  async addColumnIfNotExist(entity, c) {
90
- let e = await getDbNameProvider(entity);
91
- if (e.isDbReadonly(c(entity)))
94
+ let e = await dbNamesOf(entity);
95
+ if (isDbReadonly(c(entity), e))
92
96
  return;
93
97
  try {
94
98
  let cmd = this.pool.createCommand();
95
- const colName = e.nameOf(c(entity));
99
+ const colName = e.$dbNameOf(c(entity));
96
100
  if ((await cmd.execute(`select 1
97
101
  FROM information_schema.columns
98
- WHERE table_name=${cmd.addParameterAndReturnSqlToken((e.entityName).toLocaleLowerCase())} and column_name=${cmd.addParameterAndReturnSqlToken((colName).toLocaleLowerCase())}` + this.additionalWhere)).rows.length == 0) {
99
- let sql = `alter table ${e.entityName} add column ${postgresColumnSyntax(c(entity), colName)}`;
100
- //console.log(sql);
102
+ WHERE table_name=${cmd.addParameterAndReturnSqlToken((e.$entityName).toLocaleLowerCase())} and column_name=${cmd.addParameterAndReturnSqlToken((colName).toLocaleLowerCase())}` + this.additionalWhere)).rows.length == 0) {
103
+ let sql = `alter table ${e.$entityName} add column ${postgresColumnSyntax(c(entity), colName)}`;
104
+ if (PostgresSchemaBuilder.logToConsole)
105
+ console.info(sql);
101
106
  await this.pool.execute(sql);
102
107
  }
103
108
  }
@@ -108,15 +113,16 @@ export class PostgresSchemaBuilder {
108
113
  async verifyAllColumns(entity) {
109
114
  try {
110
115
  let cmd = this.pool.createCommand();
111
- let e = await getDbNameProvider(entity);
116
+ let e = await dbNamesOf(entity);
112
117
  let cols = (await cmd.execute(`select column_name
113
118
  FROM information_schema.columns
114
- WHERE table_name=${cmd.addParameterAndReturnSqlToken((e.entityName).toLocaleLowerCase())} ` + this.additionalWhere)).rows.map(x => x.column_name);
119
+ WHERE table_name=${cmd.addParameterAndReturnSqlToken((e.$entityName).toLocaleLowerCase())} ` + this.additionalWhere)).rows.map(x => x.column_name);
115
120
  for (const col of entity.fields) {
116
- if (!e.isDbReadonly(col))
117
- if (!cols.includes(e.nameOf(col).toLocaleLowerCase())) {
118
- let sql = `alter table ${e.entityName} add column ${postgresColumnSyntax(col, e.nameOf(col))}`;
119
- //console.log(sql);
121
+ if (!isDbReadonly(col, e))
122
+ if (!cols.includes(e.$dbNameOf(col).toLocaleLowerCase())) {
123
+ let sql = `alter table ${e.$entityName} add column ${postgresColumnSyntax(col, e.$dbNameOf(col))}`;
124
+ if (PostgresSchemaBuilder.logToConsole)
125
+ console.info(sql);
120
126
  await this.pool.execute(sql);
121
127
  }
122
128
  }
@@ -126,3 +132,5 @@ export class PostgresSchemaBuilder {
126
132
  }
127
133
  }
128
134
  }
135
+ //@internal
136
+ PostgresSchemaBuilder.logToConsole = true;
@@ -1,33 +1,14 @@
1
1
  import * as express from 'express';
2
2
  import { RemultServer, RemultServerOptions } from './server/expressBridge';
3
3
  import { Remult } from './src/context';
4
- import { ServerEventChannelSubscribeDTO } from './src/live-query/LiveQuerySubscriber';
5
- import { SubscriptionServer } from './src/live-query/LiveQueryPublisher';
6
- import { MessagePublisher } from './live-query';
4
+ import { SubscriptionServer } from './src/live-query/SubscriptionServer';
7
5
  export declare function remultExpress(options?: RemultServerOptions<express.Request> & {
8
6
  bodyParser?: boolean;
9
7
  bodySizeLimit?: string;
10
- subscriptionServer?: (router: express.Router, server: RemultServer) => MessagePublisher;
11
8
  }): express.RequestHandler & RemultServer;
12
- export declare class ServerEventsController implements SubscriptionServer {
9
+ export declare class SseSubscriptionServer implements SubscriptionServer {
13
10
  private canUserConnectToChannel?;
14
- subscribeToChannel({ channel, clientId }: ServerEventChannelSubscribeDTO, res: import('express').Response, remult: Remult, remove?: boolean): void;
15
- connections: clientConnection[];
16
11
  constructor(canUserConnectToChannel?: (channel: string, remult: Remult) => boolean);
17
12
  publishMessage<T>(channel: string, message: any): void;
18
- debugMessageFileSaver: (id: any, channel: any, message: any) => void;
19
- openHttpServerStream(req: import('express').Request, res: import('express').Response): clientConnection;
20
- debug(): void;
21
- debugFileSaver: (x: any) => void;
13
+ registerRoutes(router: express.Router, apiPath: string, server: RemultServer): void;
22
14
  }
23
- declare class clientConnection {
24
- response: import('express').Response;
25
- channels: Record<string, boolean>;
26
- close(): void;
27
- closed: boolean;
28
- write(eventData: string, eventType?: string): void;
29
- connectionId: any;
30
- constructor(response: import('express').Response);
31
- sendLiveMessage(): void;
32
- }
33
- export {};
@@ -1,6 +1,6 @@
1
1
  import * as express from 'express';
2
2
  import { createRemultServer } from './server/index';
3
- import { liveQueryKeepAliveRoute, streamUrl } from './src/live-query/LiveQuerySubscriber';
3
+ import { liveQueryKeepAliveRoute, streamUrl } from './src/live-query/SubscriptionChannel';
4
4
  import { v4 as uuid } from 'uuid';
5
5
  import { remult } from './src/remult-proxy';
6
6
  import { getEntityKey } from './src/remult3';
@@ -16,15 +16,17 @@ export function remultExpress(options) {
16
16
  app.use(express.json({ limit: options.bodySizeLimit }));
17
17
  app.use(express.urlencoded({ extended: true, limit: options.bodySizeLimit }));
18
18
  }
19
+ if (!options.subscriptionServer) {
20
+ options.subscriptionServer = new SseSubscriptionServer();
21
+ }
19
22
  const server = createRemultServer(options);
20
23
  server.registerRouter(app);
21
- if (!options.subscriptionServer) {
22
- options.subscriptionServer = (router, server) => {
23
- return buildHttpServerEventDispatcher(router, options.rootPath, server);
24
- };
24
+ const canRegisterRoute = options.subscriptionServer;
25
+ if (canRegisterRoute.registerRoutes) {
26
+ canRegisterRoute.registerRoutes(app, options.rootPath, server);
25
27
  }
26
28
  app.post(options.rootPath + liveQueryKeepAliveRoute, (r, res, n) => server.withRemult(r, res, n), async (req, res) => {
27
- res.send(await remult.liveQueryStorage.keepAliveAndReturnUnknownIds(req.body));
29
+ res.send(await remult.liveQueryStorage.keepAliveAndReturnUnknownQueryIds(req.body));
28
30
  });
29
31
  server.runWithRequest = async (req, entityKey, what) => {
30
32
  for (const e of options.entities) {
@@ -41,7 +43,6 @@ export function remultExpress(options) {
41
43
  }
42
44
  throw new Error("Couldn't find entity " + entityKey);
43
45
  };
44
- server.subscriptionServer = options.subscriptionServer(app, server);
45
46
  return Object.assign(app, {
46
47
  getRemult: (req) => server.getRemult(req),
47
48
  openApiDoc: (options) => server.openApiDoc(options),
@@ -49,16 +50,20 @@ export function remultExpress(options) {
49
50
  withRemult: (...args) => server.withRemult(...args)
50
51
  });
51
52
  }
52
- export class ServerEventsController {
53
+ export class SseSubscriptionServer {
53
54
  constructor(canUserConnectToChannel) {
54
55
  this.canUserConnectToChannel = canUserConnectToChannel;
56
+ //@internal
55
57
  this.connections = [];
58
+ //@internal
56
59
  this.debugMessageFileSaver = (id, channel, message) => { };
60
+ //@internal
57
61
  this.debugFileSaver = () => { };
58
62
  if (!this.canUserConnectToChannel) {
59
63
  this.canUserConnectToChannel = () => true;
60
64
  }
61
65
  }
66
+ //@internal
62
67
  subscribeToChannel({ channel, clientId }, res, remult, remove = false) {
63
68
  for (const c of this.connections) {
64
69
  if (c.connectionId === clientId) {
@@ -89,6 +94,7 @@ export class ServerEventsController {
89
94
  }
90
95
  }
91
96
  }
97
+ //@internal
92
98
  openHttpServerStream(req, res) {
93
99
  res.writeHead(200, {
94
100
  'Content-Type': 'text/event-stream',
@@ -106,12 +112,25 @@ export class ServerEventsController {
106
112
  });
107
113
  return cc;
108
114
  }
115
+ //@internal
109
116
  debug() {
110
117
  this.debugFileSaver(this.connections.map(x => ({
111
118
  id: x.connectionId,
112
119
  channels: x.channels
113
120
  })));
114
121
  }
122
+ registerRoutes(router, apiPath, server) {
123
+ const streamPath = apiPath + '/' + streamUrl;
124
+ router.get(streamPath, (r, res, next) => server.withRemult(r, res, next), (req, res) => {
125
+ remult.subscriptionServer.openHttpServerStream(req, res);
126
+ });
127
+ router.post(streamPath + '/subscribe', (r, res, next) => server.withRemult(r, res, next), (req, res) => {
128
+ remult.subscriptionServer.subscribeToChannel(req.body, res, remult);
129
+ });
130
+ router.post(streamPath + '/unsubscribe', (r, res, next) => server.withRemult(r, res, next), (req, res) => {
131
+ remult.subscriptionServer.subscribeToChannel(req.body, res, remult, true);
132
+ });
133
+ }
115
134
  }
116
135
  class clientConnection {
117
136
  constructor(response) {
@@ -143,17 +162,3 @@ class clientConnection {
143
162
  }, 45000);
144
163
  }
145
164
  }
146
- function buildHttpServerEventDispatcher(router, apiPath, server) {
147
- const streamPath = apiPath + '/' + streamUrl;
148
- let httpServerEvents = new ServerEventsController();
149
- router.get(streamPath, (r, res, next) => server.withRemult(r, res, next), (req, res) => {
150
- remult.subscriptionServer.openHttpServerStream(req, res);
151
- });
152
- router.post(streamPath + '/subscribe', (r, res, next) => server.withRemult(r, res, next), (req, res) => {
153
- remult.subscriptionServer.subscribeToChannel(req.body, res, remult);
154
- });
155
- router.post(streamPath + '/unsubscribe', (r, res, next) => server.withRemult(r, res, next), (req, res) => {
156
- remult.subscriptionServer.subscribeToChannel(req.body, res, remult, true);
157
- });
158
- return httpServerEvents;
159
- }
@@ -1,43 +1,19 @@
1
- import { Knex } from 'knex';
2
- import { Filter, FilterConsumer } from "../src/filter/filter-interfaces";
3
- import { dbNameProvider } from "../src/filter/filter-consumer-bridge-to-sql-request";
1
+ import type { Knex } from 'knex';
4
2
  import { Remult } from "../src/context";
5
- import { EntityFilter, EntityMetadata } from "../src/remult3";
3
+ import { EntityFilter, EntityMetadata, RepositoryOverloads } from "../src/remult3";
6
4
  import { DataProvider, EntityDataProvider } from '../src/data-interfaces';
7
5
  import { FieldMetadata } from '../src/column-interfaces';
8
6
  export declare class KnexDataProvider implements DataProvider {
9
7
  knex: Knex;
10
8
  constructor(knex: Knex);
9
+ static getDb(remult?: Remult): Knex<any, any[]>;
11
10
  getEntityDataProvider(entity: EntityMetadata<any>): EntityDataProvider;
12
11
  transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
13
- static customFilter(build: CustomKnexFilterBuilderFunction): EntityFilter<any>;
14
- supportsCustomFilter?: boolean;
12
+ static rawFilter(build: CustomKnexFilterBuilderFunction): EntityFilter<any>;
13
+ static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<(knex: any) => void>;
14
+ supportsrawFilter?: boolean;
15
15
  }
16
16
  export declare type CustomKnexFilterBuilderFunction = () => Promise<(builder: Knex.QueryBuilder) => void>;
17
- export declare class FilterConsumerBridgeToKnexRequest implements FilterConsumer {
18
- private nameProvider;
19
- _addWhere: boolean;
20
- promises: Promise<void>[];
21
- result: ((builder: Knex.QueryBuilder) => void)[];
22
- resolveWhere(): Promise<((builder: Knex.QueryBuilder<any, any>) => void)[]>;
23
- constructor(nameProvider: dbNameProvider);
24
- custom(key: string, customItem: any): void;
25
- or(orElements: Filter[]): void;
26
- isNull(col: FieldMetadata): void;
27
- isNotNull(col: FieldMetadata): void;
28
- isIn(col: FieldMetadata, val: any[]): void;
29
- isEqualTo(col: FieldMetadata, val: any): void;
30
- isDifferentFrom(col: FieldMetadata, val: any): void;
31
- isGreaterOrEqualTo(col: FieldMetadata, val: any): void;
32
- isGreaterThan(col: FieldMetadata, val: any): void;
33
- isLessOrEqualTo(col: FieldMetadata, val: any): void;
34
- isLessThan(col: FieldMetadata, val: any): void;
35
- containsCaseInsensitive(col: FieldMetadata, val: any): void;
36
- private add;
37
- databaseCustom(databaseCustom: {
38
- buildKnex: CustomKnexFilterBuilderFunction;
39
- }): void;
40
- }
41
17
  export declare class KnexSchemaBuilder {
42
18
  private knex;
43
19
  verifyStructureOfAllEntities(remult: Remult): Promise<void>;