remult 0.27.11 → 0.27.13

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 (45) 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-admin.js +2 -0
  10. package/esm/server/remult-api-server.js +4 -5
  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/data-providers/sql-database.js +2 -25
  14. package/esm/src/filter/filter-interfaces.js +1 -0
  15. package/esm/src/remult3/RepositoryImplementation.js +15 -4
  16. package/esm/src/remult3/remult3.js +0 -3
  17. package/index.d.ts +0 -1
  18. package/index.js +1 -3
  19. package/live-query/data-provider-live-query-storage.js +0 -2
  20. package/package.json +1 -1
  21. package/postgres/schema-builder.d.ts +0 -4
  22. package/postgres/schema-builder.js +15 -118
  23. package/remult-duckdb.d.ts +1 -1
  24. package/remult-duckdb.js +7 -12
  25. package/remult-knex/index.d.ts +0 -2
  26. package/remult-knex/index.js +0 -18
  27. package/remult-mongo.d.ts +2 -1
  28. package/remult-mongo.js +128 -37
  29. package/remult-sqlite-core.d.ts +2 -1
  30. package/remult-sqlite-core.js +116 -29
  31. package/server/get-remult-admin-html.js +1 -1
  32. package/server/remult-admin.d.ts +4 -0
  33. package/server/remult-admin.js +12 -10
  34. package/server/remult-api-server.js +14 -14
  35. package/src/data-providers/array-entity-data-provider.js +82 -37
  36. package/src/data-providers/in-memory-database.js +1 -1
  37. package/src/data-providers/sql-database.js +10 -69
  38. package/src/entity.d.ts +4 -4
  39. package/src/filter/filter-interfaces.js +1 -0
  40. package/src/remult3/RepositoryImplementation.js +15 -4
  41. package/src/remult3/remult3.d.ts +17 -2
  42. package/src/remult3/remult3.js +0 -3
  43. package/esm/src/data-providers/web-sql-data-provider.js +0 -140
  44. package/src/data-providers/web-sql-data-provider.d.ts +0 -20
  45. package/src/data-providers/web-sql-data-provider.js +0 -228
@@ -70,6 +70,7 @@ export function buildEntityInfo(options) {
70
70
  valFieldKey,
71
71
  caption: x.caption,
72
72
  relationToOne: relation,
73
+ inputType: x.inputType,
73
74
  type: x.valueConverter.fieldTypeInDb == 'json'
74
75
  ? 'json'
75
76
  : x.valueType === Number
@@ -88,6 +89,7 @@ export function buildEntityInfo(options) {
88
89
  ids,
89
90
  fields,
90
91
  relations,
92
+ defaultOrderBy: metadata.options.defaultOrderBy ?? { id: 'asc' },
91
93
  });
92
94
  }
93
95
  }
@@ -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) => {
@@ -328,12 +327,12 @@ export class RemultServerImplementation {
328
327
  },
329
328
  });
330
329
  }
330
+ await what(remult, myReq, myRes, genReq, origRes, req);
331
331
  }
332
332
  finally {
333
333
  remultStatic.asyncContext.setInInitRequest(false);
334
334
  }
335
335
  }
336
- await what(remult, myReq, myRes, genReq, origRes, req);
337
336
  });
338
337
  }
339
338
  catch (err) {
@@ -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]);
@@ -502,29 +502,6 @@ class myDummySQLCommand {
502
502
  return val.toString();
503
503
  }
504
504
  }
505
- async function bulkInsert(array, db) {
506
- if (array.length == 0)
507
- return;
508
- const chunkSize = 250;
509
- for (let i = 0; i < array.length; i += chunkSize) {
510
- const items = array.slice(i, i + chunkSize);
511
- // do whatever
512
- const c = db.createCommand();
513
- let sql = 'insert into ' +
514
- (await items[0]._.metadata.dbName) +
515
- ' (' +
516
- (await Promise.all(items[0]._.metadata.fields.toArray().map((f) => f.dbName))).join(',') +
517
- ') values ';
518
- sql += items
519
- .map((row) => '(' +
520
- row.$.toArray()
521
- .map((f) => c.param(f.metadata.valueConverter.toDb(f.value)))
522
- .join(', ') +
523
- ')')
524
- .join(',');
525
- await c.execute(sql);
526
- }
527
- }
528
505
  export function getRowAfterUpdate(meta, dataProvider, data, id, operation) {
529
506
  const idFilter = id !== undefined ? meta.idMetadata.getIdFilter(id) : {};
530
507
  return dataProvider
@@ -614,9 +591,9 @@ export async function groupByImpl(options, e, r, orderByNullFirst, limitSyntax)
614
591
  orderBy += ' desc';
615
592
  if (orderByNullFirst) {
616
593
  if (x.isDescending)
617
- select += ' nulls last';
594
+ orderBy += ' nulls last';
618
595
  else
619
- select += ' nulls first';
596
+ orderBy += ' nulls first';
620
597
  }
621
598
  }
622
599
  if (orderBy)
@@ -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;
@@ -713,7 +713,9 @@ export class RepositoryImplementation {
713
713
  //I've used define property to hide this member from console.lo g
714
714
  get: () => row,
715
715
  });
716
+ row.id = row.getId();
716
717
  row.saveOriginalData();
718
+ row.originalId = row.id;
717
719
  return result;
718
720
  }
719
721
  }
@@ -1412,6 +1414,8 @@ export class rowHelperImplementation extends rowHelperBase {
1412
1414
  updatedRow = (await this.edp.find({ where: await this.getIdFilter() }))[0];
1413
1415
  }
1414
1416
  else {
1417
+ if (this.id === undefined)
1418
+ throw new Error('Invalid operation, id is undefined');
1415
1419
  updatedRow = await this.edp.update(this.id, changesOnly);
1416
1420
  }
1417
1421
  }
@@ -1488,8 +1492,11 @@ export class rowHelperImplementation extends rowHelperBase {
1488
1492
  }
1489
1493
  this.__assertValidity();
1490
1494
  try {
1491
- if (doDelete)
1495
+ if (doDelete) {
1496
+ if (this.id === undefined)
1497
+ throw new Error('Invalid operation, id is undefined');
1492
1498
  await this.edp.delete(this.id);
1499
+ }
1493
1500
  if (!this.repo._dataProvider.isProxy) {
1494
1501
  if (this.info.entityInfo.deleted)
1495
1502
  await this.info.entityInfo.deleted(this.instance, e);
@@ -1979,9 +1986,13 @@ class EntityFullInfo {
1979
1986
  this.fields = r;
1980
1987
  this.caption = buildCaption(entityInfo.caption, this.key, remult, this);
1981
1988
  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));
1989
+ let r = typeof entityInfo.id === 'string'
1990
+ ? this.fields.find(entityInfo.id)
1991
+ : Array.isArray(entityInfo.id)
1992
+ ? entityInfo.id.map((x) => this.fields.find(x))
1993
+ : typeof entityInfo.id === 'function'
1994
+ ? entityInfo.id(this.fields)
1995
+ : Object.keys(entityInfo.id).map((x) => this.fields.find(x));
1985
1996
  if (Array.isArray(r)) {
1986
1997
  if (r.length > 1)
1987
1998
  this.idMetadata.field = new CompoundIdField(...r);
@@ -19,7 +19,6 @@ export const flags = {
19
19
  };
20
20
  //p1 - add parameter all to deleteMany, and updateMany
21
21
  //p1 filter.apply ApiPreFilter
22
- //p1 - add not as an overload to not equal
23
22
  /*p1 - add id and use uuid by default, but allow changes with Fields.id.defaultIdProvider NO but defaultProvider yes???
24
23
  //p1 - replace uuid with crypto.randomUUID and allow custom fallback NO
25
24
  //p1 - Add example for luid
@@ -27,7 +26,6 @@ export const flags = {
27
26
  //p1 - explain the benefits of changing the default provider for testing in docs.
28
27
  */
29
28
  //p1 - consider upsert (where,set)
30
- //p1 TODO - consider id to also support keyof (id:['company','index']) - had problem with | (keyof Partial<entityType>)[] & `entity`
31
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
32
30
  /*y1 - https://github.com/remult/remult/discussions/438
33
31
  - https://github.com/remult/remult/blob/query-argumets/projects/tests/dbs/test-sql-database.spec.ts#L100-L128
@@ -41,7 +39,6 @@ export const flags = {
41
39
  //p1 - tutorial about controller - and mutable controller
42
40
  //p1 - docs abount subscription channel
43
41
  //p1 - Consider enforcing serial operations on JSON database to prevent data loss
44
- //p1 - fix sqlite to support alter table when adding a column with ensure schema = on
45
42
  //p1 - add LifecycleEvent to documentation
46
43
  //p1 - fix chaining of saving and saved in multiple entity options args
47
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.11",
3
+ "version": "0.27.13",
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;