remult 3.3.18 → 3.3.19-next.2

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 (38) hide show
  1. package/esm/index.js +7 -6
  2. package/esm/remult-d1.js +1 -0
  3. package/esm/remult-knex/index.js +112 -2
  4. package/esm/remult-mongo.js +17 -8
  5. package/esm/remult-sqlite-core.js +1 -0
  6. package/esm/src/data-interfaces.js +4 -4
  7. package/esm/src/data-providers/array-entity-data-provider.js +14 -2
  8. package/esm/src/data-providers/indexed-db-data-provider.js +811 -0
  9. package/esm/src/data-providers/json-data-provider.js +2 -2
  10. package/esm/src/data-providers/rest-data-provider.js +11 -12
  11. package/esm/src/data-providers/sql-database.js +110 -43
  12. package/esm/src/remult3/RepositoryImplementation.js +90 -60
  13. package/index.d.ts +31 -17
  14. package/index.js +5 -2
  15. package/package.json +1 -1
  16. package/remult-d1.d.ts +1 -0
  17. package/remult-d1.js +1 -0
  18. package/remult-knex/index.d.ts +2 -2
  19. package/remult-knex/index.js +329 -44
  20. package/remult-mongo.js +80 -36
  21. package/remult-sqlite-core.d.ts +1 -0
  22. package/remult-sqlite-core.js +1 -0
  23. package/src/column-interfaces.d.ts +4 -0
  24. package/src/data-interfaces.d.ts +2 -3
  25. package/src/data-interfaces.js +4 -4
  26. package/src/data-providers/array-entity-data-provider.d.ts +2 -2
  27. package/src/data-providers/array-entity-data-provider.js +92 -14
  28. package/src/data-providers/indexed-db-data-provider.d.ts +39 -0
  29. package/src/data-providers/indexed-db-data-provider.js +1387 -0
  30. package/src/data-providers/json-data-provider.js +2 -2
  31. package/src/data-providers/rest-data-provider.d.ts +2 -3
  32. package/src/data-providers/rest-data-provider.js +18 -17
  33. package/src/data-providers/sql-database.js +254 -105
  34. package/src/remult3/RepositoryImplementation.d.ts +1 -1
  35. package/src/remult3/RepositoryImplementation.js +384 -270
  36. package/src/remult3/remult3.d.ts +2 -2
  37. package/src/sql-command.d.ts +2 -0
  38. package/src/standard-schema/index.d.ts +1 -1
@@ -49,8 +49,8 @@ class JsonEntityDataProvider {
49
49
  return x;
50
50
  }))));
51
51
  }
52
- delete(id) {
53
- return (this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.delete(id).then(async (x) => {
52
+ delete(ids) {
53
+ return (this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.delete(ids).then(async (x) => {
54
54
  await save();
55
55
  return x;
56
56
  }))));
@@ -303,21 +303,20 @@ export class RestEntityDataProvider {
303
303
  }
304
304
  return result;
305
305
  }
306
- async delete(id) {
307
- if (id == '')
308
- await this.deleteMany(Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)));
309
- else
310
- return this.http().delete(this.url() + '/' + encodeURIComponent(id));
306
+ async delete(ids) {
307
+ if (ids.length === 0)
308
+ return;
309
+ if (ids.length === 1 && ids[0] !== '')
310
+ return this.http().delete(this.url() + '/' + encodeURIComponent(ids[0]));
311
+ await this.deleteMany(Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(...ids)));
311
312
  }
312
313
  insert(data, options) {
313
314
  return this.http()
314
- .post(this.url() + (options?.select === 'none' ? '?_select=$none' : ''), this.translateToJson(data))
315
- .then((y) => this.translateFromJson(y));
316
- }
317
- insertMany(data, options) {
318
- return this.http()
319
- .post(this.url() + (options?.select === 'none' ? '?_select=$none' : ''), data.map((data) => this.translateToJson(data)))
320
- .then((y) => y.map((y) => this.translateFromJson(y)));
315
+ .post(this.url() + (options?.select === 'none' ? '?_select=$none' : ''), data.map((row) => this.translateToJson(row)))
316
+ .then((y) => {
317
+ const rows = Array.isArray(y) ? y : [y];
318
+ return rows.map((row) => row ? this.translateFromJson(row) : undefined);
319
+ });
321
320
  }
322
321
  }
323
322
  export function addFilterToUrlAndReturnTrueIfSuccessful(filter, url) {
@@ -117,6 +117,8 @@ export class SqlDatabase {
117
117
  doesNotSupportReturningSyntax: this.sql.doesNotSupportReturningSyntax,
118
118
  doesNotSupportReturningSyntaxOnlyForUpdate: this.sql.doesNotSupportReturningSyntaxOnlyForUpdate,
119
119
  orderByNullsFirst: this.sql.orderByNullsFirst,
120
+ afterMutation: this.sql.afterMutation,
121
+ maxParametersInOneSqlStatement: this.sql.maxParametersInOneSqlStatement,
120
122
  }));
121
123
  }
122
124
  finally {
@@ -193,6 +195,35 @@ export class SqlDatabase {
193
195
  createdEntities = [];
194
196
  end;
195
197
  }
198
+ const defaultMaxParametersInOneSqlStatement = 2000;
199
+ function splitByMaxParameters(items, parametersInItem, maxParameters) {
200
+ const batches = [];
201
+ let batch = [];
202
+ let params = 0;
203
+ for (const item of items) {
204
+ const n = parametersInItem(item);
205
+ if (batch.length > 0 && params + n > maxParameters) {
206
+ batches.push(batch);
207
+ batch = [];
208
+ params = 0;
209
+ }
210
+ batch.push(item);
211
+ params += n;
212
+ }
213
+ if (batch.length)
214
+ batches.push(batch);
215
+ return batches;
216
+ }
217
+ function countInsertBindParameters(entity, e, row) {
218
+ let n = 0;
219
+ for (const x of entity.fields) {
220
+ if (isDbReadonly(x, e))
221
+ continue;
222
+ if (x.valueConverter.toDb(row[x.key]) != undefined)
223
+ n++;
224
+ }
225
+ return n;
226
+ }
196
227
  const icons = new Map([
197
228
  // CRUD
198
229
  ['INSERT', '⚪'], // Used to insert new data into a database.
@@ -441,11 +472,13 @@ class ActualSQLEntityDataProvider {
441
472
  return this.buildResultRow(colKeys, sqlResult.rows[0], sqlResult);
442
473
  });
443
474
  }
444
- async delete(id) {
475
+ async delete(ids) {
476
+ if (ids.length === 0)
477
+ return;
445
478
  let e = await this.init();
446
479
  let r = this.sql.createCommand();
447
480
  let f = new FilterConsumerBridgeToSqlRequest(r, e);
448
- Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(f);
481
+ Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(...ids)).__applyToConsumer(f);
449
482
  let statement = 'delete from ' + e.$entityName;
450
483
  statement += await f.resolveWhere();
451
484
  return r.execute(statement).then(() => {
@@ -453,56 +486,90 @@ class ActualSQLEntityDataProvider {
453
486
  });
454
487
  }
455
488
  async insert(data, options) {
489
+ if (data.length === 0)
490
+ return [];
456
491
  let e = await this.init();
492
+ const maxParams = this.strategy.maxParametersInOneSqlStatement ??
493
+ defaultMaxParametersInOneSqlStatement;
494
+ const batches = splitByMaxParameters(data, (row) => countInsertBindParameters(this.entity, e, row), maxParams);
495
+ const result = [];
496
+ for (const batch of batches)
497
+ result.push(...(await this.insertBatch(batch, e, options)));
498
+ return result;
499
+ }
500
+ //@internal
501
+ async insertOne(data, options) {
502
+ return (await this.insert([data], options))[0];
503
+ }
504
+ async insertBatch(batch, e, options) {
457
505
  let r = this.sql.createCommand();
458
- let cols = '';
459
- let vals = '';
460
- let added = false;
506
+ const cols = [];
461
507
  for (const x of this.entity.fields) {
462
- if (isDbReadonly(x, e)) {
463
- }
464
- else {
465
- let v = x.valueConverter.toDb(data[x.key]);
466
- if (v != undefined) {
467
- if (!added)
468
- added = true;
469
- else {
470
- cols += ', ';
471
- vals += ', ';
472
- }
473
- cols += e.$dbNameOf(x);
508
+ if (isDbReadonly(x, e))
509
+ continue;
510
+ if (batch.some((row) => x.valueConverter.toDb(row[x.key]) != undefined))
511
+ cols.push(x);
512
+ }
513
+ let colSql = '';
514
+ let vals = '';
515
+ for (let i = 0; i < cols.length; i++) {
516
+ if (i)
517
+ colSql += ', ';
518
+ colSql += e.$dbNameOf(cols[i]);
519
+ }
520
+ for (let i = 0; i < batch.length; i++) {
521
+ if (i)
522
+ vals += ',';
523
+ vals += '(';
524
+ for (let j = 0; j < cols.length; j++) {
525
+ if (j)
526
+ vals += ', ';
527
+ const x = cols[j];
528
+ const v = x.valueConverter.toDb(batch[i][x.key]);
529
+ if (v != undefined)
474
530
  vals += toDbSql(r, x, v);
475
- }
531
+ else if (x.allowNull)
532
+ vals += 'null';
533
+ else
534
+ vals += 'DEFAULT';
476
535
  }
536
+ vals += ')';
477
537
  }
478
- let statement = `insert into ${e.$entityName} (${cols}) values (${vals})`;
538
+ let statement = `insert into ${e.$entityName} (${colSql}) values ${vals}`;
479
539
  let { colKeys, select } = await this.buildSelect(e, r, undefined, undefined);
480
- if (!this.sql._getSourceSql().doesNotSupportReturningSyntax &&
481
- !(options?.select === 'none'))
540
+ const source = this.sql._getSourceSql();
541
+ const wantRows = options?.select !== 'none';
542
+ if (!source.doesNotSupportReturningSyntax && wantRows)
482
543
  statement += ' returning ' + select;
483
- return await r.execute(statement).then((sql) => {
484
- this.sql._getSourceSql().afterMutation?.();
485
- if (this.sql._getSourceSql().doesNotSupportReturningSyntax) {
486
- if (isAutoIncrement(this.entity.idMetadata.field)) {
487
- const id = sql.rows[0];
488
- if (typeof id !== 'number')
489
- throw new Error('Auto increment, for a database that is does not support returning syntax, should return an array with the single last added id. Instead it returned: ' +
490
- JSON.stringify(id));
491
- if (options?.select === 'none')
492
- return undefined;
493
- return this.find({
494
- where: new Filter((x) => x.isEqualTo(this.entity.idMetadata.field, id)),
495
- }).then((r) => r[0]);
496
- }
497
- else {
498
- if (options?.select === 'none')
499
- return undefined;
500
- return getRowAfterUpdate(this.entity, this, data, undefined, 'insert');
501
- }
544
+ const sql = await r.execute(statement);
545
+ source.afterMutation?.();
546
+ if (!wantRows)
547
+ return batch.map(() => undefined);
548
+ if (source.doesNotSupportReturningSyntax) {
549
+ if (isAutoIncrement(this.entity.idMetadata.field)) {
550
+ const lastId = sql.rows[0];
551
+ if (typeof lastId !== 'number')
552
+ throw new Error('Auto increment, for a database that is does not support returning syntax, should return an array with the single last added id. Instead it returned: ' +
553
+ JSON.stringify(lastId));
554
+ const ids = [];
555
+ for (let id = lastId - batch.length + 1; id <= lastId; id++)
556
+ ids.push(id);
557
+ return this.loadRowsByIds(ids);
502
558
  }
503
- if (options?.select === 'none')
504
- return undefined;
505
- return this.buildResultRow(colKeys, sql.rows[0], sql);
559
+ return this.loadRowsByIds(batch.map((row) => this.entity.idMetadata.getId(row)));
560
+ }
561
+ return sql.rows.map((row) => this.buildResultRow(colKeys, row, sql));
562
+ }
563
+ async loadRowsByIds(ids) {
564
+ const found = await this.find({
565
+ where: Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(...ids)),
566
+ });
567
+ const byId = new Map(found.map((row) => [this.entity.idMetadata.getId(row) + '', row]));
568
+ return ids.map((id) => {
569
+ const row = byId.get(id + '');
570
+ if (!row)
571
+ throw new Error(`Failed to insert row - result contained ${found.length} rows`);
572
+ return row;
506
573
  });
507
574
  }
508
575
  }
@@ -282,7 +282,7 @@ export class RepositoryImplementation {
282
282
  return ref.delete();
283
283
  if (typeof item === 'string' || typeof item === 'number')
284
284
  if (this._dataProvider.isProxy)
285
- return this._edp.delete(item);
285
+ return this._edp.delete([item]);
286
286
  else {
287
287
  let ref2 = await this.findId(item);
288
288
  if (!ref2)
@@ -323,36 +323,26 @@ export class RepositoryImplementation {
323
323
  }
324
324
  async insert(entity, options) {
325
325
  if (Array.isArray(entity)) {
326
- if (this._dataProvider.isProxy) {
327
- let refs = [];
328
- let raw = [];
329
- for (const item of entity) {
330
- this.__cleanupPartialObject(item);
331
- let ref = getEntityRef(entity, false);
332
- if (ref) {
333
- if (!ref.isNew())
334
- throw 'Item is not new';
335
- }
336
- else {
337
- ref = (await this.getEntityRef(this.create(item)));
338
- }
339
- refs.push(ref);
340
- raw.push(await ref.buildDtoForInsert());
326
+ let refs = [];
327
+ let raw = [];
328
+ for (const item of entity) {
329
+ this.__cleanupPartialObject(item);
330
+ let ref = getEntityRef(item, false);
331
+ if (ref) {
332
+ if (!ref.isNew())
333
+ throw 'Item is not new';
341
334
  }
342
- const inserted = await this._edp.insertMany(raw, options);
343
- if (options?.select === 'none')
344
- return undefined;
345
- return promiseAll(inserted, (item, i) => refs[i].processInsertResponseDto(item));
346
- }
347
- else {
348
- let r = [];
349
- for (const item of entity) {
350
- r.push(await this.insert(item, options));
335
+ else {
336
+ ref = this.getEntityRef(this.create(item));
351
337
  }
352
- if (options?.select === 'none')
353
- return undefined;
354
- return r;
338
+ refs.push(ref);
339
+ raw.push(await ref.buildDtoForInsert());
355
340
  }
341
+ const inserted = await this._edp.insert(raw, options);
342
+ const result = await promiseAll(inserted, (row, i) => refs[i].processInsertResponseDto(row));
343
+ if (options?.select === 'none')
344
+ return undefined;
345
+ return result;
356
346
  }
357
347
  else {
358
348
  let ref = getEntityRef(entity, false);
@@ -886,14 +876,19 @@ export class RepositoryImplementation {
886
876
  return this._edp.deleteMany(where === 'all' ? 'all' : await this._translateWhereToFilter(where));
887
877
  }
888
878
  else {
889
- let deleted = 0;
890
879
  if (where === 'all')
891
880
  where = undefined;
881
+ const prepared = [];
892
882
  for await (const item of this.query({ where, aggregate: undefined })) {
893
- await getEntityRef(item).delete();
894
- deleted++;
883
+ const ref = getEntityRef(item);
884
+ prepared.push({ ref, ...(await ref.__prepareDelete()) });
895
885
  }
896
- return deleted;
886
+ const ids = prepared.filter((x) => x.doDelete).map((x) => x.ref.id);
887
+ if (ids.length)
888
+ await this._edp.delete(ids);
889
+ for (const x of prepared)
890
+ await x.ref.__finishDelete(x.event);
891
+ return prepared.length;
897
892
  }
898
893
  }
899
894
  _cache = new Map();
@@ -1562,7 +1557,7 @@ export class rowHelperImplementation extends rowHelperBase {
1562
1557
  }))[0];
1563
1558
  }
1564
1559
  else
1565
- updatedRow = await this.edp.insert(d, options);
1560
+ updatedRow = (await this.edp.insert([d], options))[0];
1566
1561
  }
1567
1562
  else {
1568
1563
  let changesOnly = {};
@@ -1617,13 +1612,40 @@ export class rowHelperImplementation extends rowHelperBase {
1617
1612
  }
1618
1613
  }
1619
1614
  async processInsertResponseDto(updatedRow) {
1620
- await this.loadDataFrom(updatedRow);
1621
- this.saveOriginalData();
1622
- this._isNew = false;
1623
- return this.instance;
1615
+ try {
1616
+ if (updatedRow)
1617
+ await this.loadDataFrom(updatedRow);
1618
+ const e = this.buildLifeCycleEvent();
1619
+ e.id = this.getId();
1620
+ if (!this.repo._dataProvider.isProxy) {
1621
+ if (this.info.entityInfo.saved)
1622
+ await this.info.entityInfo.saved(this.instance, e);
1623
+ if (this.repo.listeners)
1624
+ for (const listener of this.repo.listeners) {
1625
+ await listener.saved?.(this.instance, true);
1626
+ }
1627
+ }
1628
+ this.repo._remult.liveQueryPublisher.itemChanged(this.repo.metadata.key, [{ id: this.getId(), oldId: this.getOriginalId(), deleted: false }]);
1629
+ this.saveOriginalData();
1630
+ this._isNew = false;
1631
+ return this.instance;
1632
+ }
1633
+ catch (err) {
1634
+ throw await this.catchSaveErrors(err);
1635
+ }
1624
1636
  }
1625
1637
  async buildDtoForInsert() {
1626
1638
  await this.__validateEntity();
1639
+ const e = this.buildLifeCycleEvent();
1640
+ if (!this.repo._dataProvider.isProxy) {
1641
+ for (const col of this.fields) {
1642
+ if (col.metadata.options.saving)
1643
+ await col.metadata.options.saving(this.instance, col, e);
1644
+ }
1645
+ if (this.info.entityInfo.saving) {
1646
+ await this.info.entityInfo.saving(this.instance, e);
1647
+ }
1648
+ }
1627
1649
  this.__assertValidity();
1628
1650
  let d = this.copyDataToObject(this.isNew());
1629
1651
  for (const field of this.metadata.fields) {
@@ -1652,36 +1674,44 @@ export class rowHelperImplementation extends rowHelperBase {
1652
1674
  return await this.repo._translateWhereToFilter(this.repo.metadata.idMetadata.getIdFilter(this.id));
1653
1675
  }
1654
1676
  async delete() {
1677
+ try {
1678
+ const { doDelete, event } = await this.__prepareDelete();
1679
+ if (doDelete)
1680
+ await this.edp.delete([this.id]);
1681
+ await this.__finishDelete(event);
1682
+ }
1683
+ catch (err) {
1684
+ throw await this.catchSaveErrors(err);
1685
+ }
1686
+ }
1687
+ //@internal
1688
+ async __prepareDelete() {
1655
1689
  this.__clearErrorsAndReportChanged();
1656
1690
  let doDelete = true;
1657
- let e = this.buildLifeCycleEvent(() => (doDelete = false));
1691
+ const event = this.buildLifeCycleEvent(() => (doDelete = false));
1658
1692
  if (!this.repo._dataProvider.isProxy) {
1659
1693
  if (this.info.entityInfo.deleting)
1660
- await this.info.entityInfo.deleting(this.instance, e);
1694
+ await this.info.entityInfo.deleting(this.instance, event);
1661
1695
  }
1662
1696
  this.__assertValidity();
1663
- try {
1664
- if (doDelete) {
1665
- if (this.id === undefined)
1666
- throw new Error('Invalid operation, id is undefined');
1667
- await this.edp.delete(this.id);
1668
- }
1669
- if (!this.repo._dataProvider.isProxy) {
1670
- if (this.info.entityInfo.deleted)
1671
- await this.info.entityInfo.deleted(this.instance, e);
1672
- }
1673
- if (this.repo.listeners)
1674
- for (const listener of this.repo.listeners) {
1675
- await listener.deleted?.(this.instance);
1676
- }
1677
- this.repo._remult.liveQueryPublisher.itemChanged(this.repo.metadata.key, [
1678
- { id: this.getId(), oldId: this.getOriginalId(), deleted: true },
1679
- ]);
1680
- this._wasDeleted = true;
1681
- }
1682
- catch (err) {
1683
- throw await this.catchSaveErrors(err);
1697
+ if (doDelete && this.id === undefined)
1698
+ throw new Error('Invalid operation, id is undefined');
1699
+ return { doDelete, event };
1700
+ }
1701
+ //@internal
1702
+ async __finishDelete(e) {
1703
+ if (!this.repo._dataProvider.isProxy) {
1704
+ if (this.info.entityInfo.deleted)
1705
+ await this.info.entityInfo.deleted(this.instance, e);
1684
1706
  }
1707
+ if (this.repo.listeners)
1708
+ for (const listener of this.repo.listeners) {
1709
+ await listener.deleted?.(this.instance);
1710
+ }
1711
+ this.repo._remult.liveQueryPublisher.itemChanged(this.repo.metadata.key, [
1712
+ { id: this.getId(), oldId: this.getOriginalId(), deleted: true },
1713
+ ]);
1714
+ this._wasDeleted = true;
1685
1715
  }
1686
1716
  async loadDataFrom(data, loadItems) {
1687
1717
  for (const col of this.info.fields) {
package/index.d.ts CHANGED
@@ -2,10 +2,11 @@ import type { ClassType } from './classType.js';
2
2
  import type { DataProvider } from './src/data-interfaces.js';
3
3
  export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider.js';
4
4
  export type { ClassType } from './classType.js';
5
- export { ValidateFieldEvent, MembersOnly, NumericKeys, FieldsMetadata, FieldRef, IdFieldRef, FieldsRef, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, FindOptionsBase, QueryResult, QueryOptions, UpsertOptions, Repository, GroupByOptions, GroupByResult, FindFirstOptions, ComparisonValueFilter, ValueFilter, IdFilter, ContainsStringValueFilter, EntityRef, SortSegments, Paginator, LiveQuery, LiveQueryChangeInfo, Subscribable, RefSubscriber, RefSubscriberBase, RelationOptions, ObjectMembersOnly, MembersToInclude, RepositoryRelations, EntityIdFields, EntitySelectFields, InsertOrUpdateOptions, ClassFieldDecorator, ClassFieldDecoratorContextStub, //n1 consider removing in ts5
5
+ export type { ValidateFieldEvent, MembersOnly, NumericKeys, FieldsMetadata, FieldRef, IdFieldRef, FieldsRef, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, FindOptionsBase, QueryResult, QueryOptions, UpsertOptions, Repository, GroupByOptions, GroupByResult, FindFirstOptions, ComparisonValueFilter, ValueFilter, IdFilter, ContainsStringValueFilter, EntityRef, SortSegments, Paginator, LiveQuery, LiveQueryChangeInfo, Subscribable, RefSubscriber, RefSubscriberBase, RelationOptions, ObjectMembersOnly, MembersToInclude, RepositoryRelations, EntityIdFields, EntitySelectFields, InsertOrUpdateOptions, ClassFieldDecorator, ClassFieldDecoratorContextStub, //n1 consider removing in ts5
6
6
  LifecycleEvent, FieldsRefBase, FieldsRefForEntityBase, RepositoryRelationsForEntityBase, ControllerRefForControllerBase, ControllerRefBase, ControllerRef, EntityRefForEntityBase, IdMetadata, FindFirstOptionsBase, } from './src/remult3/remult3.js';
7
7
  export { standardSchema } from './src/standard-schema/index.js';
8
- export { EntityBase, ControllerBase, FieldType, getFields, ValueListFieldType, getValueList, ValueListFieldOptions, ValueListInfo, } from './src/remult3/RepositoryImplementation.js';
8
+ export { EntityBase, ControllerBase, FieldType, getFields, ValueListFieldType, getValueList, ValueListInfo, } from './src/remult3/RepositoryImplementation.js';
9
+ export type { ValueListFieldOptions } from './src/remult3/RepositoryImplementation.js';
9
10
  export { LabelTransformer } from './src/remult3/RepositoryImplementation.js';
10
11
  /**
11
12
  * @deprecated use `LabelTransformer` instead
@@ -16,33 +17,46 @@ export declare const CaptionTransformer: {
16
17
  };
17
18
  export { Entity } from './src/remult3/entity.js';
18
19
  export { getEntityRef } from './src/remult3/getEntityRef.js';
19
- export { Field, Fields, StringFieldOptions, Relations, } from './src/remult3/Fields.js';
20
+ export { Field, Fields, Relations } from './src/remult3/Fields.js';
21
+ export type { StringFieldOptions } from './src/remult3/Fields.js';
20
22
  export { IdEntity } from './src/remult3/IdEntity.js';
21
23
  export { describeClass, describeBackendMethods, describeEntity, } from './src/remult3/classDescribers.js';
22
- export { EntityOptions, PreprocessFilterEvent } from './src/entity.js';
23
- export { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions, EntityDataProviderFindOptions, ErrorInfo, EntityError, RestDataProviderHttpProvider, } from './src/data-interfaces.js';
24
- export { SqlCommand, SqlCommandWithParameters, SqlImplementation, SqlResult, } from './src/sql-command.js';
25
- export { FieldMetadata, FieldOptions, FieldValidator, ValueConverter, ValueListItem, // reconsider, maybe it should go to remult angular as the abstraction ?
24
+ export type { EntityOptions, PreprocessFilterEvent } from './src/entity.js';
25
+ export { EntityError } from './src/data-interfaces.js';
26
+ export type { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions, EntityDataProviderFindOptions, ErrorInfo, RestDataProviderHttpProvider, } from './src/data-interfaces.js';
27
+ export type { SqlCommand, SqlCommandWithParameters, SqlImplementation, SqlResult, } from './src/sql-command.js';
28
+ export type { FieldMetadata, FieldOptions, FieldValidator, ValueConverter, ValueListItem, // reconsider, maybe it should go to remult angular as the abstraction ?
26
29
  ValueOrExpression, } from './src/column-interfaces.js';
27
30
  export { RestDataProvider } from './src/data-providers/rest-data-provider.js';
28
31
  export { InMemoryDataProvider } from './src/data-providers/in-memory-database.js';
29
32
  export { SqlDatabase } from './src/data-providers/sql-database.js';
30
- export { CustomSqlFilterBuilder, dbNamesOf, dbNamesOfOptions, CustomSqlFilterBuilderFunction, EntityDbNames, } from './src/filter/filter-consumer-bridge-to-sql-request.js';
31
- export { JsonDataProvider, JsonEntityStorage, } from './src/data-providers/json-data-provider.js';
33
+ export { CustomSqlFilterBuilder, dbNamesOf, } from './src/filter/filter-consumer-bridge-to-sql-request.js';
34
+ export type { dbNamesOfOptions, CustomSqlFilterBuilderFunction, EntityDbNames, } from './src/filter/filter-consumer-bridge-to-sql-request.js';
35
+ export { JsonDataProvider } from './src/data-providers/json-data-provider.js';
36
+ export type { JsonEntityStorage } from './src/data-providers/json-data-provider.js';
32
37
  export { JsonEntityOpfsStorage } from './src/data-providers/json-entity-opfs-storage.js';
33
38
  export { JsonEntityIndexedDbStorage } from './src/data-providers/json-entity-indexed-db-data-provider.js';
34
- export { Controller, BackendMethodOptions, BackendMethod, ProgressListener, ForbiddenError, } from './src/server-action.js';
35
- export { Allowed, Allow, Remult, withRemult, RemultContext, ApiClient, isBackend, AllowedForInstance, EventDispatcher, EventSource, UserInfo, } from './src/context.js';
36
- export { ExternalHttpProvider } from './src/buildRestDataProvider.js';
37
- export { SortSegment, Sort } from './src/sort.js';
39
+ export { IndexedDbDataProvider, IndexedDbIndexBuilder, } from './src/data-providers/indexed-db-data-provider.js';
40
+ export type { IndexedDbDataProviderOptions, IndexedDbIndexDef, } from './src/data-providers/indexed-db-data-provider.js';
41
+ export { Controller, BackendMethod, ProgressListener, ForbiddenError, } from './src/server-action.js';
42
+ export type { BackendMethodOptions } from './src/server-action.js';
43
+ export { Allow, Remult, withRemult, isBackend, EventSource, } from './src/context.js';
44
+ export type { Allowed, RemultContext, ApiClient, AllowedForInstance, EventDispatcher, UserInfo, } from './src/context.js';
45
+ export type { ExternalHttpProvider } from './src/buildRestDataProvider.js';
46
+ export { Sort } from './src/sort.js';
47
+ export type { SortSegment } from './src/sort.js';
38
48
  export { CompoundIdField } from './src/CompoundIdField.js';
39
- export { Filter, FilterConsumer, FilterPreciseValues, } from './src/filter/filter-interfaces.js';
49
+ export { Filter } from './src/filter/filter-interfaces.js';
50
+ export type { FilterConsumer, FilterPreciseValues, } from './src/filter/filter-interfaces.js';
40
51
  export { UrlBuilder } from './urlBuilder.js';
41
- export { Validators, ValidationMessage, ValueValidationMessage, Validator, ValidatorWithArgs, valueValidator, createValidator, createValidatorWithArgs, createValueValidatorWithArgs, createValueValidator, } from './src/validators.js';
52
+ export { Validators, valueValidator, createValidator, createValidatorWithArgs, createValueValidatorWithArgs, createValueValidator, } from './src/validators.js';
53
+ export type { ValidationMessage, ValueValidationMessage, Validator, ValidatorWithArgs, } from './src/validators.js';
42
54
  export { ValueConverters } from './src/valueConverters.js';
43
55
  export { remult } from './src/remult-proxy.js';
44
- export { SubscriptionServer, LiveQueryStorage, StoredQuery, InMemoryLiveQueryStorage, } from './src/live-query/SubscriptionServer.js';
45
- export { SubscriptionListener, SubscriptionClientConnection, SubscriptionClient, SubscriptionChannel, LiveQueryChange, Unsubscribe, } from './src/live-query/SubscriptionChannel.js';
56
+ export { InMemoryLiveQueryStorage } from './src/live-query/SubscriptionServer.js';
57
+ export type { SubscriptionServer, LiveQueryStorage, StoredQuery, } from './src/live-query/SubscriptionServer.js';
58
+ export { SubscriptionChannel } from './src/live-query/SubscriptionChannel.js';
59
+ export type { SubscriptionListener, SubscriptionClientConnection, SubscriptionClient, LiveQueryChange, Unsubscribe, } from './src/live-query/SubscriptionChannel.js';
46
60
  /**
47
61
  * A convenient shortcut function to quickly obtain a repository for a specific entity type in Remult.
48
62
  *
package/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- 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.JsonEntityIndexedDbStorage = exports.JsonEntityOpfsStorage = exports.JsonDataProvider = exports.dbNamesOf = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.InMemoryDataProvider = exports.RestDataProvider = exports.EntityError = exports.describeEntity = exports.describeBackendMethods = exports.describeClass = exports.IdEntity = exports.Relations = exports.Fields = exports.Field = exports.getEntityRef = exports.Entity = exports.CaptionTransformer = exports.LabelTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.standardSchema = exports.ArrayEntityDataProvider = void 0;
4
- exports.SubscriptionChannel = exports.InMemoryLiveQueryStorage = void 0;
3
+ 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.IndexedDbIndexBuilder = exports.IndexedDbDataProvider = exports.JsonEntityIndexedDbStorage = exports.JsonEntityOpfsStorage = exports.JsonDataProvider = exports.dbNamesOf = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.InMemoryDataProvider = exports.RestDataProvider = exports.EntityError = exports.describeEntity = exports.describeBackendMethods = exports.describeClass = exports.IdEntity = exports.Relations = exports.Fields = exports.Field = exports.getEntityRef = exports.Entity = exports.CaptionTransformer = exports.LabelTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.standardSchema = exports.ArrayEntityDataProvider = void 0;
4
+ exports.SubscriptionChannel = exports.InMemoryLiveQueryStorage = exports.remult = exports.ValueConverters = void 0;
5
5
  exports.repo = repo;
6
6
  var array_entity_data_provider_js_1 = require("./src/data-providers/array-entity-data-provider.js");
7
7
  Object.defineProperty(exports, "ArrayEntityDataProvider", { enumerable: true, get: function () { return array_entity_data_provider_js_1.ArrayEntityDataProvider; } });
@@ -53,6 +53,9 @@ var json_entity_opfs_storage_js_1 = require("./src/data-providers/json-entity-op
53
53
  Object.defineProperty(exports, "JsonEntityOpfsStorage", { enumerable: true, get: function () { return json_entity_opfs_storage_js_1.JsonEntityOpfsStorage; } });
54
54
  var json_entity_indexed_db_data_provider_js_1 = require("./src/data-providers/json-entity-indexed-db-data-provider.js");
55
55
  Object.defineProperty(exports, "JsonEntityIndexedDbStorage", { enumerable: true, get: function () { return json_entity_indexed_db_data_provider_js_1.JsonEntityIndexedDbStorage; } });
56
+ var indexed_db_data_provider_js_1 = require("./src/data-providers/indexed-db-data-provider.js");
57
+ Object.defineProperty(exports, "IndexedDbDataProvider", { enumerable: true, get: function () { return indexed_db_data_provider_js_1.IndexedDbDataProvider; } });
58
+ Object.defineProperty(exports, "IndexedDbIndexBuilder", { enumerable: true, get: function () { return indexed_db_data_provider_js_1.IndexedDbIndexBuilder; } });
56
59
  //export * from './src/data-api'; //reconsider if to make internal
57
60
  var server_action_js_1 = require("./src/server-action.js");
58
61
  Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return server_action_js_1.Controller; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "3.3.18",
3
+ "version": "3.3.19-next.2",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "homepage": "https://remult.dev",
6
6
  "repository": {
package/remult-d1.d.ts CHANGED
@@ -3,6 +3,7 @@ import { SqliteCoreDataProvider } from './remult-sqlite-core.js';
3
3
  export declare function createD1DataProvider(d1: D1Database): SqlDatabase;
4
4
  export declare class D1DataProvider extends SqliteCoreDataProvider {
5
5
  private d1;
6
+ maxParametersInOneSqlStatement: number;
6
7
  /**
7
8
  * For production or local d1 using binding
8
9
  *
package/remult-d1.js CHANGED
@@ -23,6 +23,7 @@ var D1DataProvider = /** @class */ (function (_super) {
23
23
  });
24
24
  }); }) || this;
25
25
  _this.d1 = d1;
26
+ _this.maxParametersInOneSqlStatement = 100;
26
27
  return _this;
27
28
  }
28
29
  D1DataProvider.prototype.transaction = function (action) {
@@ -20,12 +20,12 @@ export declare class KnexDataProvider implements DataProvider, HasWrapIdentifier
20
20
  static rawFilter(build: CustomKnexFilterBuilderFunction): EntityFilter<any>;
21
21
  static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>, wrapIdentifier?: (name: string) => string): Promise<(knex: Knex.QueryBuilder) => void>;
22
22
  isProxy?: boolean;
23
- ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
23
+ ensureSchema(entities: EntityMetadata[]): Promise<void>;
24
24
  }
25
25
  export type CustomKnexFilterBuilderFunction = () => Promise<(builder: Knex.QueryBuilder) => void>;
26
26
  export declare class KnexSchemaBuilder {
27
27
  private knex;
28
- ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
28
+ ensureSchema(entities: EntityMetadata[]): Promise<void>;
29
29
  createIfNotExist(entity: EntityMetadata): Promise<void>;
30
30
  createTableKnexCommand(entity: EntityMetadata, e: EntityDbNamesBase): Knex.SchemaBuilder;
31
31
  addColumnIfNotExist(entity: EntityMetadata, c: (e: EntityMetadata) => FieldMetadata): Promise<void>;