remult 0.27.10 → 0.27.12

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 (43) hide show
  1. package/esm/index.js +0 -1
  2. package/esm/live-query/data-provider-live-query-storage.js +0 -2
  3. package/esm/postgres/schema-builder.js +0 -41
  4. package/esm/remult-duckdb.js +7 -12
  5. package/esm/remult-knex/index.js +0 -7
  6. package/esm/remult-mongo.js +33 -0
  7. package/esm/remult-sqlite-core.js +33 -5
  8. package/esm/server/get-remult-admin-html.js +1 -1
  9. package/esm/server/remult-api-server.js +4 -5
  10. package/esm/src/data-api.js +1 -1
  11. package/esm/src/data-providers/array-entity-data-provider.js +26 -11
  12. package/esm/src/data-providers/in-memory-database.js +1 -1
  13. package/esm/src/filter/filter-interfaces.js +1 -0
  14. package/esm/src/remult3/RepositoryImplementation.js +7 -3
  15. package/esm/src/remult3/remult3.js +7 -3
  16. package/index.d.ts +0 -1
  17. package/index.js +1 -3
  18. package/live-query/data-provider-live-query-storage.js +0 -2
  19. package/package.json +1 -1
  20. package/postgres/schema-builder.d.ts +0 -4
  21. package/postgres/schema-builder.js +15 -118
  22. package/remult-duckdb.d.ts +1 -1
  23. package/remult-duckdb.js +7 -12
  24. package/remult-knex/index.d.ts +0 -2
  25. package/remult-knex/index.js +0 -18
  26. package/remult-mongo.d.ts +2 -1
  27. package/remult-mongo.js +128 -37
  28. package/remult-sqlite-core.d.ts +2 -1
  29. package/remult-sqlite-core.js +116 -29
  30. package/server/get-remult-admin-html.js +1 -1
  31. package/server/remult-api-server.d.ts +1 -1
  32. package/server/remult-api-server.js +8 -8
  33. package/src/data-api.js +1 -1
  34. package/src/data-providers/array-entity-data-provider.js +82 -37
  35. package/src/data-providers/in-memory-database.js +1 -1
  36. package/src/entity.d.ts +4 -4
  37. package/src/filter/filter-interfaces.js +1 -0
  38. package/src/remult3/RepositoryImplementation.js +7 -3
  39. package/src/remult3/remult3.d.ts +17 -2
  40. package/src/remult3/remult3.js +7 -3
  41. package/esm/src/data-providers/web-sql-data-provider.js +0 -140
  42. package/src/data-providers/web-sql-data-provider.d.ts +0 -20
  43. package/src/data-providers/web-sql-data-provider.js +0 -228
@@ -35,8 +35,6 @@ export function createRemultServerCore(options, serverCoreOptions) {
35
35
  RemultAsyncLocalStorage.enable();
36
36
  {
37
37
  let allControllers = [];
38
- if (!safeOptions.entities)
39
- safeOptions.entities = [...remultStatic.allEntities];
40
38
  if (safeOptions.entities)
41
39
  allControllers.push(...safeOptions.entities);
42
40
  if (safeOptions.controllers)
@@ -77,7 +75,8 @@ export class RemultServerImplementation {
77
75
  started = true;
78
76
  console.time('Schema ensured');
79
77
  };
80
- entitiesMetaData.push(...options.entities.map((e) => remult.repo(e).metadata));
78
+ if (options.entities)
79
+ entitiesMetaData.push(...options.entities.map((e) => remult.repo(e).metadata));
81
80
  if (dp.ensureSchema) {
82
81
  startConsoleLog();
83
82
  await dp.ensureSchema(entitiesMetaData);
@@ -233,7 +232,7 @@ export class RemultServerImplementation {
233
232
  res.success(await remult.liveQueryStorage.keepAliveAndReturnUnknownQueryIds(await this.coreOptions.getRequestBody(origReq)));
234
233
  }));
235
234
  }
236
- this.options.entities.forEach((e) => {
235
+ this.options.entities?.forEach((e) => {
237
236
  let key = getEntityKey(e);
238
237
  if (key != undefined)
239
238
  this.add(key, (c) => {
@@ -806,7 +805,7 @@ class ResponseBridgeToDataApiResponse {
806
805
  httpStatusCode = 400;
807
806
  }
808
807
  else {
809
- httpStatusCode = 500;
808
+ httpStatusCode = 400;
810
809
  }
811
810
  }
812
811
  let responseSent = false;
@@ -317,7 +317,7 @@ export class DataApi {
317
317
  response.error({
318
318
  message: `id "${id}" is not unique for entity ` +
319
319
  this.repository.metadata.key,
320
- }, this.repository.metadata, 500);
320
+ }, this.repository.metadata, 400);
321
321
  else
322
322
  await what(r[0]);
323
323
  });
@@ -293,6 +293,16 @@ export class ArrayEntityDataProvider {
293
293
  }
294
294
  }
295
295
  }
296
+ if (this.entity.idMetadata.fields.find((x) => newR[names.$dbNameOf(x)] != r[names.$dbNameOf(x)]) &&
297
+ this.rows().find((x) => {
298
+ for (const f of this.entity.idMetadata.fields) {
299
+ if (x[names.$dbNameOf(f)] != newR[names.$dbNameOf(f)])
300
+ return false;
301
+ }
302
+ return true;
303
+ })) {
304
+ throw Error('id already exists');
305
+ }
296
306
  this.verifyThatRowHasAllNotNullColumns(newR, names);
297
307
  this.rows()[i] = newR;
298
308
  return Promise.resolve(this.translateFromJson(this.rows()[i], names));
@@ -315,19 +325,24 @@ export class ArrayEntityDataProvider {
315
325
  const names = await this.init();
316
326
  let j = this.translateToJson(data, names);
317
327
  let idf = this.entity.idMetadata.field;
318
- if (!(idf instanceof CompoundIdField)) {
319
- if (idf.valueConverter.fieldTypeInDb === 'autoincrement') {
320
- j[idf.key] = 1;
321
- for (const row of this.rows()) {
322
- if (row[idf.key] >= j[idf.key])
323
- j[idf.key] = row[idf.key] + 1;
328
+ if (!(idf instanceof CompoundIdField) &&
329
+ idf.valueConverter.fieldTypeInDb === 'autoincrement') {
330
+ j[idf.key] = 1;
331
+ for (const row of this.rows()) {
332
+ if (row[idf.key] >= j[idf.key])
333
+ j[idf.key] = row[idf.key] + 1;
334
+ }
335
+ }
336
+ else {
337
+ if (this.rows().find((x) => {
338
+ for (const f of this.entity.idMetadata.fields) {
339
+ if (x[names.$dbNameOf(f)] != j[names.$dbNameOf(f)])
340
+ return false;
324
341
  }
342
+ return true;
343
+ })) {
344
+ throw Error('id already exists');
325
345
  }
326
- if (j[idf.key])
327
- this.rows().forEach((i) => {
328
- if (j[idf.key] == i[idf.key])
329
- throw Error('id already exists');
330
- });
331
346
  }
332
347
  this.verifyThatRowHasAllNotNullColumns(j, names);
333
348
  this.rows().push(j);
@@ -12,7 +12,7 @@ export class InMemoryDataProvider {
12
12
  }
13
13
  rows = {};
14
14
  getEntityDataProvider(entity) {
15
- let name = entity.key;
15
+ let name = entity.dbName;
16
16
  if (!this.rows[name])
17
17
  this.rows[name] = [];
18
18
  return new ArrayEntityDataProvider(entity, () => this.rows[name]);
@@ -211,6 +211,7 @@ export class Filter {
211
211
  found = true;
212
212
  break;
213
213
  case '$ne':
214
+ case '$not':
214
215
  case '!=':
215
216
  case '$nin':
216
217
  found = true;
@@ -1979,9 +1979,13 @@ class EntityFullInfo {
1979
1979
  this.fields = r;
1980
1980
  this.caption = buildCaption(entityInfo.caption, this.key, remult, this);
1981
1981
  if (entityInfo.id) {
1982
- let r = typeof entityInfo.id === 'function'
1983
- ? entityInfo.id(this.fields)
1984
- : Object.keys(entityInfo.id).map((x) => this.fields.find(x));
1982
+ let r = typeof entityInfo.id === 'string'
1983
+ ? this.fields.find(entityInfo.id)
1984
+ : Array.isArray(entityInfo.id)
1985
+ ? entityInfo.id.map((x) => this.fields.find(x))
1986
+ : typeof entityInfo.id === 'function'
1987
+ ? entityInfo.id(this.fields)
1988
+ : Object.keys(entityInfo.id).map((x) => this.fields.find(x));
1985
1989
  if (Array.isArray(r)) {
1986
1990
  if (r.length > 1)
1987
1991
  this.idMetadata.field = new CompoundIdField(...r);
@@ -7,12 +7,18 @@ export const GroupByOperators = [
7
7
  'max',
8
8
  'distinctCount',
9
9
  ];
10
+ const wn = [{ n: 1 }, { n: { $gt: 1 } }];
11
+ const wnu = [{ nu: 1 }, { nu: { $gt: 1 } }];
12
+ const wnn = [
13
+ { nn: 1 },
14
+ { nn: { $gt: 1 } },
15
+ { nn: null },
16
+ ];
10
17
  export const flags = {
11
18
  error500RetryCount: 4,
12
19
  };
13
20
  //p1 - add parameter all to deleteMany, and updateMany
14
21
  //p1 filter.apply ApiPreFilter
15
- //p1 - add not as an overload to not equal
16
22
  /*p1 - add id and use uuid by default, but allow changes with Fields.id.defaultIdProvider NO but defaultProvider yes???
17
23
  //p1 - replace uuid with crypto.randomUUID and allow custom fallback NO
18
24
  //p1 - Add example for luid
@@ -20,7 +26,6 @@ export const flags = {
20
26
  //p1 - explain the benefits of changing the default provider for testing in docs.
21
27
  */
22
28
  //p1 - consider upsert (where,set)
23
- //p1 TODO - consider id to also support keyof (id:['company','index']) - had problem with | (keyof Partial<entityType>)[] & `entity`
24
29
  //p2 - add some kind of options handler that will help with translation etc... like in hagai - something that runs at the stage where options are being built
25
30
  /*y1 - https://github.com/remult/remult/discussions/438
26
31
  - https://github.com/remult/remult/blob/query-argumets/projects/tests/dbs/test-sql-database.spec.ts#L100-L128
@@ -34,7 +39,6 @@ export const flags = {
34
39
  //p1 - tutorial about controller - and mutable controller
35
40
  //p1 - docs abount subscription channel
36
41
  //p1 - Consider enforcing serial operations on JSON database to prevent data loss
37
- //p1 - fix sqlite to support alter table when adding a column with ensure schema = on
38
42
  //p1 - add LifecycleEvent to documentation
39
43
  //p1 - fix chaining of saving and saved in multiple entity options args
40
44
  //p1 - review starter and examples and separate remult * auth from the routes
package/index.d.ts CHANGED
@@ -17,7 +17,6 @@ export { FieldMetadata, FieldOptions, FieldValidator, ValueConverter, ValueListI
17
17
  ValueOrExpression, } from './src/column-interfaces.js';
18
18
  export { RestDataProvider } from './src/data-providers/rest-data-provider.js';
19
19
  export { InMemoryDataProvider } from './src/data-providers/in-memory-database.js';
20
- export { WebSqlDataProvider } from './src/data-providers/web-sql-data-provider.js';
21
20
  export { SqlDatabase } from './src/data-providers/sql-database.js';
22
21
  export { CustomSqlFilterBuilder, dbNamesOf, dbNamesOfOptions, CustomSqlFilterBuilderFunction, EntityDbNames, } from './src/filter/filter-consumer-bridge-to-sql-request.js';
23
22
  export { JsonDataProvider, JsonEntityStorage, } from './src/data-providers/json-data-provider.js';
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SubscriptionChannel = exports.InMemoryLiveQueryStorage = exports.remult = exports.ValueConverters = exports.createValueValidator = exports.createValueValidatorWithArgs = exports.createValidatorWithArgs = exports.createValidator = exports.valueValidator = exports.Validators = exports.UrlBuilder = exports.Filter = exports.CompoundIdField = exports.Sort = exports.EventSource = exports.isBackend = exports.withRemult = exports.Remult = exports.Allow = exports.ForbiddenError = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonEntityOpfsStorage = exports.JsonDataProvider = exports.dbNamesOf = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.WebSqlDataProvider = exports.InMemoryDataProvider = exports.RestDataProvider = exports.describeEntity = exports.describeBackendMethods = exports.describeClass = exports.IdEntity = exports.Relations = exports.Fields = exports.Field = exports.getEntityRef = exports.Entity = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.ArrayEntityDataProvider = void 0;
3
+ exports.SubscriptionChannel = exports.InMemoryLiveQueryStorage = exports.remult = exports.ValueConverters = exports.createValueValidator = exports.createValueValidatorWithArgs = exports.createValidatorWithArgs = exports.createValidator = exports.valueValidator = exports.Validators = exports.UrlBuilder = exports.Filter = exports.CompoundIdField = exports.Sort = exports.EventSource = exports.isBackend = exports.withRemult = exports.Remult = exports.Allow = exports.ForbiddenError = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonEntityOpfsStorage = exports.JsonDataProvider = exports.dbNamesOf = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.InMemoryDataProvider = exports.RestDataProvider = exports.describeEntity = exports.describeBackendMethods = exports.describeClass = exports.IdEntity = exports.Relations = exports.Fields = exports.Field = exports.getEntityRef = exports.Entity = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.ArrayEntityDataProvider = void 0;
4
4
  exports.repo = repo;
5
5
  var array_entity_data_provider_js_1 = require("./src/data-providers/array-entity-data-provider.js");
6
6
  Object.defineProperty(exports, "ArrayEntityDataProvider", { enumerable: true, get: function () { return array_entity_data_provider_js_1.ArrayEntityDataProvider; } });
@@ -31,8 +31,6 @@ var rest_data_provider_js_1 = require("./src/data-providers/rest-data-provider.j
31
31
  Object.defineProperty(exports, "RestDataProvider", { enumerable: true, get: function () { return rest_data_provider_js_1.RestDataProvider; } });
32
32
  var in_memory_database_js_1 = require("./src/data-providers/in-memory-database.js"); //V
33
33
  Object.defineProperty(exports, "InMemoryDataProvider", { enumerable: true, get: function () { return in_memory_database_js_1.InMemoryDataProvider; } });
34
- var web_sql_data_provider_js_1 = require("./src/data-providers/web-sql-data-provider.js"); //V
35
- Object.defineProperty(exports, "WebSqlDataProvider", { enumerable: true, get: function () { return web_sql_data_provider_js_1.WebSqlDataProvider; } });
36
34
  var sql_database_js_1 = require("./src/data-providers/sql-database.js"); //V
37
35
  Object.defineProperty(exports, "SqlDatabase", { enumerable: true, get: function () { return sql_database_js_1.SqlDatabase; } });
38
36
  var filter_consumer_bridge_to_sql_request_js_1 = require("./src/filter/filter-consumer-bridge-to-sql-request.js");
@@ -6,7 +6,6 @@ var context_js_1 = require("../src/context.js");
6
6
  var RepositoryImplementation_js_1 = require("../src/remult3/RepositoryImplementation.js");
7
7
  var Fields_js_1 = require("../src/remult3/Fields.js");
8
8
  var entity_js_1 = require("../src/remult3/entity.js");
9
- var remult_static_js_1 = require("../src/remult-static.js");
10
9
  var initDataProviderOrJson_js_1 = require("../server/initDataProviderOrJson.js");
11
10
  var DataProviderLiveQueryStorage = /** @class */ (function () {
12
11
  function DataProviderLiveQueryStorage(dataProvider) {
@@ -262,4 +261,3 @@ var LiveQueryStorageEntity = /** @class */ (function (_super) {
262
261
  return LiveQueryStorageEntity;
263
262
  }(RepositoryImplementation_js_1.EntityBase));
264
263
  exports.LiveQueryStorageEntity = LiveQueryStorageEntity;
265
- remult_static_js_1.remultStatic.allEntities.splice(remult_static_js_1.remultStatic.allEntities.indexOf(LiveQueryStorageEntity), 1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.27.10",
3
+ "version": "0.27.12",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "homepage": "https://remult.dev",
6
6
  "repository": {
@@ -1,19 +1,15 @@
1
1
  import type { FieldMetadata } from '../src/column-interfaces.js';
2
- import type { Remult } from '../src/context.js';
3
2
  import type { SqlDatabase } from '../src/data-providers/sql-database.js';
4
3
  import type { EntityMetadata } from '../src/remult3/remult3.js';
5
4
  export declare function postgresColumnSyntax(x: FieldMetadata, dbName: string): string;
6
- export declare function verifyStructureOfAllEntities(db: SqlDatabase, remult: Remult): Promise<void>;
7
5
  export declare class PostgresSchemaBuilder {
8
6
  private pool;
9
7
  private removeQuotes;
10
8
  private whereTableAndSchema;
11
9
  private schemaAndName;
12
10
  private schemaOnly;
13
- verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
14
11
  ensureSchema(entities: EntityMetadata[]): Promise<void>;
15
12
  createIfNotExist(entity: EntityMetadata): Promise<void>;
16
- addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: (e: T) => FieldMetadata): Promise<void>;
17
13
  verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;
18
14
  specifiedSchema: string;
19
15
  constructor(pool: SqlDatabase, schema?: string);
@@ -2,11 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PostgresSchemaBuilder = void 0;
4
4
  exports.postgresColumnSyntax = postgresColumnSyntax;
5
- exports.verifyStructureOfAllEntities = verifyStructureOfAllEntities;
6
5
  var tslib_1 = require("tslib");
7
6
  var filter_consumer_bridge_to_sql_request_js_1 = require("../src/filter/filter-consumer-bridge-to-sql-request.js");
8
- var remult_proxy_js_1 = require("../src/remult-proxy.js");
9
- var remult_static_js_1 = require("../src/remult-static.js");
10
7
  var RepositoryImplementation_js_1 = require("../src/remult3/RepositoryImplementation.js");
11
8
  var valueConverters_js_1 = require("../src/valueConverters.js");
12
9
  function postgresColumnSyntax(x, dbName) {
@@ -41,16 +38,6 @@ function postgresColumnSyntax(x, dbName) {
41
38
  result += ' varchar' + (x.allowNull ? '' : " default '' not null");
42
39
  return result;
43
40
  }
44
- function verifyStructureOfAllEntities(db, remult) {
45
- return tslib_1.__awaiter(this, void 0, void 0, function () {
46
- return tslib_1.__generator(this, function (_a) {
47
- switch (_a.label) {
48
- case 0: return [4 /*yield*/, new PostgresSchemaBuilder(db).verifyStructureOfAllEntities(remult)];
49
- case 1: return [2 /*return*/, _a.sent()];
50
- }
51
- });
52
- });
53
- }
54
41
  var PostgresSchemaBuilder = /** @class */ (function () {
55
42
  function PostgresSchemaBuilder(pool, schema) {
56
43
  this.pool = pool;
@@ -106,61 +93,10 @@ var PostgresSchemaBuilder = /** @class */ (function () {
106
93
  // Should default to `public`
107
94
  return 'public';
108
95
  };
109
- PostgresSchemaBuilder.prototype.verifyStructureOfAllEntities = function (remult) {
110
- return tslib_1.__awaiter(this, void 0, void 0, function () {
111
- var completed, entities, _a, _b, entityClass, entity, e, e_1_1;
112
- var e_1, _c;
113
- return tslib_1.__generator(this, function (_d) {
114
- switch (_d.label) {
115
- case 0:
116
- if (!remult) {
117
- remult = remult_proxy_js_1.remult;
118
- }
119
- completed = new Set();
120
- entities = [];
121
- _d.label = 1;
122
- case 1:
123
- _d.trys.push([1, 6, 7, 8]);
124
- _a = tslib_1.__values(tslib_1.__spreadArray([], tslib_1.__read(remult_static_js_1.remultStatic.allEntities), false).reverse()), _b = _a.next();
125
- _d.label = 2;
126
- case 2:
127
- if (!!_b.done) return [3 /*break*/, 5];
128
- entityClass = _b.value;
129
- entity = remult.repo(entityClass).metadata;
130
- return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity, this.pool.wrapIdentifier)];
131
- case 3:
132
- e = _d.sent();
133
- if (completed.has(e.$entityName))
134
- return [3 /*break*/, 4];
135
- completed.add(e.$entityName);
136
- entities.push(entity);
137
- _d.label = 4;
138
- case 4:
139
- _b = _a.next();
140
- return [3 /*break*/, 2];
141
- case 5: return [3 /*break*/, 8];
142
- case 6:
143
- e_1_1 = _d.sent();
144
- e_1 = { error: e_1_1 };
145
- return [3 /*break*/, 8];
146
- case 7:
147
- try {
148
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
149
- }
150
- finally { if (e_1) throw e_1.error; }
151
- return [7 /*endfinally*/];
152
- case 8: return [4 /*yield*/, this.ensureSchema(entities)];
153
- case 9:
154
- _d.sent();
155
- return [2 /*return*/];
156
- }
157
- });
158
- });
159
- };
160
96
  PostgresSchemaBuilder.prototype.ensureSchema = function (entities) {
161
97
  return tslib_1.__awaiter(this, void 0, void 0, function () {
162
- var entities_1, entities_1_1, entity, e, err_1, e_2_1;
163
- var e_2, _a;
98
+ var entities_1, entities_1_1, entity, e, err_1, e_1_1;
99
+ var e_1, _a;
164
100
  return tslib_1.__generator(this, function (_b) {
165
101
  switch (_b.label) {
166
102
  case 0:
@@ -194,14 +130,14 @@ var PostgresSchemaBuilder = /** @class */ (function () {
194
130
  return [3 /*break*/, 1];
195
131
  case 9: return [3 /*break*/, 12];
196
132
  case 10:
197
- e_2_1 = _b.sent();
198
- e_2 = { error: e_2_1 };
133
+ e_1_1 = _b.sent();
134
+ e_1 = { error: e_1_1 };
199
135
  return [3 /*break*/, 12];
200
136
  case 11:
201
137
  try {
202
138
  if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
203
139
  }
204
- finally { if (e_2) throw e_2.error; }
140
+ finally { if (e_1) throw e_1.error; }
205
141
  return [7 /*endfinally*/];
206
142
  case 12: return [2 /*return*/];
207
143
  }
@@ -267,7 +203,7 @@ var PostgresSchemaBuilder = /** @class */ (function () {
267
203
  PostgresSchemaBuilder.prototype.createTableScript = function (entity) {
268
204
  return tslib_1.__awaiter(this, void 0, void 0, function () {
269
205
  var result, e, _a, _b, x, sql;
270
- var e_3, _c;
206
+ var e_2, _c;
271
207
  return tslib_1.__generator(this, function (_d) {
272
208
  switch (_d.label) {
273
209
  case 0:
@@ -290,12 +226,12 @@ var PostgresSchemaBuilder = /** @class */ (function () {
290
226
  }
291
227
  }
292
228
  }
293
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
229
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
294
230
  finally {
295
231
  try {
296
232
  if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
297
233
  }
298
- finally { if (e_3) throw e_3.error; }
234
+ finally { if (e_2) throw e_2.error; }
299
235
  }
300
236
  result += ",\r\n primary key (".concat(entity.idMetadata.fields
301
237
  .map(function (f) { return e.$dbNameOf(f); })
@@ -306,49 +242,10 @@ var PostgresSchemaBuilder = /** @class */ (function () {
306
242
  });
307
243
  });
308
244
  };
309
- PostgresSchemaBuilder.prototype.addColumnIfNotExist = function (entity, c) {
310
- return tslib_1.__awaiter(this, void 0, void 0, function () {
311
- var e, cmd, colName, sql, err_2;
312
- return tslib_1.__generator(this, function (_a) {
313
- switch (_a.label) {
314
- case 0: return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity, this.pool.wrapIdentifier)];
315
- case 1:
316
- e = _a.sent();
317
- if ((0, filter_consumer_bridge_to_sql_request_js_1.shouldNotCreateField)(c(entity), e))
318
- return [2 /*return*/];
319
- _a.label = 2;
320
- case 2:
321
- _a.trys.push([2, 7, , 8]);
322
- cmd = this.pool.createCommand();
323
- colName = e.$dbNameOf(c(entity));
324
- return [4 /*yield*/, cmd.execute("SELECT 1 FROM information_schema.columns WHERE " +
325
- "".concat(this.whereTableAndSchema(cmd, e), " ") +
326
- "AND column_name=".concat(cmd.param(colName.toLocaleLowerCase())))];
327
- case 3:
328
- if (!((_a.sent()).rows.length == 0)) return [3 /*break*/, 6];
329
- return [4 /*yield*/, this.getAddColumnScript(entity, c(entity))];
330
- case 4:
331
- sql = _a.sent();
332
- if (PostgresSchemaBuilder.logToConsole)
333
- console.info(sql);
334
- return [4 /*yield*/, this.pool.execute(sql)];
335
- case 5:
336
- _a.sent();
337
- _a.label = 6;
338
- case 6: return [3 /*break*/, 8];
339
- case 7:
340
- err_2 = _a.sent();
341
- console.error(err_2);
342
- return [3 /*break*/, 8];
343
- case 8: return [2 /*return*/];
344
- }
345
- });
346
- });
347
- };
348
245
  PostgresSchemaBuilder.prototype.verifyAllColumns = function (entity) {
349
246
  return tslib_1.__awaiter(this, void 0, void 0, function () {
350
- var cmd, e, cols, _a, _b, col, colName, sql, e_4_1, err_3;
351
- var e_4, _c;
247
+ var cmd, e, cols, _a, _b, col, colName, sql, e_3_1, err_2;
248
+ var e_3, _c;
352
249
  return tslib_1.__generator(this, function (_d) {
353
250
  switch (_d.label) {
354
251
  case 0:
@@ -387,19 +284,19 @@ var PostgresSchemaBuilder = /** @class */ (function () {
387
284
  return [3 /*break*/, 4];
388
285
  case 7: return [3 /*break*/, 10];
389
286
  case 8:
390
- e_4_1 = _d.sent();
391
- e_4 = { error: e_4_1 };
287
+ e_3_1 = _d.sent();
288
+ e_3 = { error: e_3_1 };
392
289
  return [3 /*break*/, 10];
393
290
  case 9:
394
291
  try {
395
292
  if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
396
293
  }
397
- finally { if (e_4) throw e_4.error; }
294
+ finally { if (e_3) throw e_3.error; }
398
295
  return [7 /*endfinally*/];
399
296
  case 10: return [3 /*break*/, 12];
400
297
  case 11:
401
- err_3 = _d.sent();
402
- console.error(err_3);
298
+ err_2 = _d.sent();
299
+ console.error(err_2);
403
300
  return [3 /*break*/, 12];
404
301
  case 12: return [2 /*return*/];
405
302
  }
@@ -4,6 +4,6 @@ import { type FieldMetadata, type EntityMetadata } from './index.js';
4
4
  export declare class DuckDBDataProvider extends SqliteCoreDataProvider {
5
5
  constructor(db: Database);
6
6
  wrapIdentifier(name: string): string;
7
- getCreateTableSql(entity: EntityMetadata<any>): Promise<string>;
7
+ getCreateTableSql(entity: EntityMetadata<any>): Promise<string[]>;
8
8
  addColumnSqlSyntax(x: FieldMetadata, dbName: string, isAlterColumn: boolean): string;
9
9
  }
package/remult-duckdb.js CHANGED
@@ -62,7 +62,7 @@ var DuckDBDataProvider = /** @class */ (function (_super) {
62
62
  .join(','), ")");
63
63
  sql +=
64
64
  'create table if not exists ' + e.$entityName + ' (' + result + '\r\n)';
65
- return [2 /*return*/, sql];
65
+ return [2 /*return*/, [sql]];
66
66
  }
67
67
  });
68
68
  });
@@ -70,8 +70,8 @@ var DuckDBDataProvider = /** @class */ (function (_super) {
70
70
  DuckDBDataProvider.prototype.addColumnSqlSyntax = function (x, dbName, isAlterColumn) {
71
71
  var result = dbName;
72
72
  var allowNull = x.allowNull;
73
- if (allowNull && isAlterColumn) {
74
- allowNull = false;
73
+ if (!allowNull && isAlterColumn) {
74
+ allowNull = true;
75
75
  console.log('DuckDB does not support altering columns to allow null on existing tables');
76
76
  }
77
77
  if (x.valueType == Number) {
@@ -81,7 +81,7 @@ var DuckDBDataProvider = /** @class */ (function (_super) {
81
81
  result +=
82
82
  ' ' +
83
83
  x.valueConverter.fieldTypeInDb +
84
- (x.allowNull || isAlterColumn ? '' : ' default 0 not null');
84
+ (allowNull ? '' : ' default 0 not null');
85
85
  }
86
86
  else if (x.valueType == Date) {
87
87
  if (!x.valueConverter.fieldTypeInDb)
@@ -93,20 +93,15 @@ var DuckDBDataProvider = /** @class */ (function (_super) {
93
93
  result += ' ' + x.valueConverter.fieldTypeInDb;
94
94
  }
95
95
  else if (x.valueType == Boolean)
96
- result +=
97
- ' boolean' +
98
- (x.allowNull || isAlterColumn ? '' : ' default false not null');
96
+ result += ' boolean' + (allowNull ? '' : ' default false not null');
99
97
  else if (x.valueConverter.fieldTypeInDb) {
100
98
  result += ' ' + x.valueConverter.fieldTypeInDb;
101
- if (!(x.allowNull || isAlterColumn) &&
102
- x.valueConverter.fieldTypeInDb == 'integer') {
99
+ if (!allowNull && x.valueConverter.fieldTypeInDb == 'integer') {
103
100
  result += ' default 0 not null';
104
101
  }
105
102
  }
106
103
  else
107
- result +=
108
- ' varchar' +
109
- (x.allowNull || isAlterColumn ? '' : " default '' not null");
104
+ result += ' varchar' + (allowNull ? '' : " default '' not null");
110
105
  return result;
111
106
  };
112
107
  return DuckDBDataProvider;
@@ -1,5 +1,4 @@
1
1
  import type { Knex } from 'knex';
2
- import type { Remult } from '../src/context.js';
3
2
  import { type EntityDbNamesBase } from '../src/filter/filter-consumer-bridge-to-sql-request.js';
4
3
  import type { FieldMetadata } from '../src/column-interfaces.js';
5
4
  import type { DataProvider, EntityDataProvider } from '../src/data-interfaces.js';
@@ -26,7 +25,6 @@ export declare class KnexDataProvider implements DataProvider, HasWrapIdentifier
26
25
  export type CustomKnexFilterBuilderFunction = () => Promise<(builder: Knex.QueryBuilder) => void>;
27
26
  export declare class KnexSchemaBuilder {
28
27
  private knex;
29
- verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
30
28
  ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
31
29
  createIfNotExist(entity: EntityMetadata): Promise<void>;
32
30
  createTableKnexCommand(entity: EntityMetadata, e: EntityDbNamesBase): Knex.SchemaBuilder;
@@ -12,7 +12,6 @@ var RepositoryImplementation_js_1 = require("../src/remult3/RepositoryImplementa
12
12
  var sort_js_1 = require("../src/sort.js");
13
13
  var valueConverters_js_1 = require("../src/valueConverters.js");
14
14
  var repository_internals_js_1 = require("../src/remult3/repository-internals.js");
15
- var remult_static_js_1 = require("../src/remult-static.js");
16
15
  var sql_database_js_1 = require("../src/data-providers/sql-database.js");
17
16
  var KnexDataProvider = /** @class */ (function () {
18
17
  function KnexDataProvider(knex) {
@@ -784,23 +783,6 @@ var KnexSchemaBuilder = /** @class */ (function () {
784
783
  this.knex = knex;
785
784
  this.additionalWhere = '';
786
785
  }
787
- KnexSchemaBuilder.prototype.verifyStructureOfAllEntities = function (remult) {
788
- return tslib_1.__awaiter(this, void 0, void 0, function () {
789
- var entities;
790
- return tslib_1.__generator(this, function (_a) {
791
- switch (_a.label) {
792
- case 0:
793
- if (!remult)
794
- remult = remult_proxy_js_1.remult;
795
- entities = remult_static_js_1.remultStatic.allEntities.map(function (x) { return remult.repo(x).metadata; });
796
- return [4 /*yield*/, this.ensureSchema(entities)];
797
- case 1:
798
- _a.sent();
799
- return [2 /*return*/];
800
- }
801
- });
802
- });
803
- };
804
786
  KnexSchemaBuilder.prototype.ensureSchema = function (entities) {
805
787
  return tslib_1.__awaiter(this, void 0, void 0, function () {
806
788
  var entities_1, entities_1_1, entity, e, err_2, e_8_1;
package/remult-mongo.d.ts CHANGED
@@ -14,7 +14,8 @@ export declare class MongoDataProvider implements DataProvider {
14
14
  db: Db;
15
15
  session: ClientSession | undefined;
16
16
  };
17
- getEntityDataProvider(entity: EntityMetadata<any>): EntityDataProvider;
17
+ ensureSchema(entities: EntityMetadata[]): Promise<void>;
18
+ getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
18
19
  transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
19
20
  static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<{
20
21
  $and: any[];