remult 3.4.0-next.2 → 3.4.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/esm/index.js +7 -6
  2. package/esm/internals.js +1 -0
  3. package/esm/remult-d1.js +1 -0
  4. package/esm/remult-knex/index.js +112 -2
  5. package/esm/remult-mongo.js +17 -8
  6. package/esm/remult-sqlite-core.js +1 -0
  7. package/esm/src/data-api.js +13 -2
  8. package/esm/src/data-interfaces.js +4 -4
  9. package/esm/src/data-providers/array-entity-data-provider.js +14 -2
  10. package/esm/src/data-providers/in-memory-database.js +12 -1
  11. package/esm/src/data-providers/indexed-db-data-provider.js +844 -0
  12. package/esm/src/data-providers/json-data-provider.js +2 -2
  13. package/esm/src/data-providers/rest-data-provider.js +11 -12
  14. package/esm/src/data-providers/sql-database.js +110 -43
  15. package/esm/src/live-query/LiveQueryClient.js +53 -25
  16. package/esm/src/live-query/SseSubscriptionClient.js +49 -20
  17. package/esm/src/live-query/SubscriptionChannel.js +34 -10
  18. package/esm/src/remult3/RepositoryImplementation.js +135 -60
  19. package/esm/src/remult3/remult3.js +2 -2
  20. package/index.d.ts +31 -17
  21. package/index.js +5 -2
  22. package/internals.d.ts +1 -0
  23. package/internals.js +3 -1
  24. package/package.json +1 -1
  25. package/remult-d1.d.ts +1 -0
  26. package/remult-d1.js +1 -0
  27. package/remult-knex/index.js +329 -44
  28. package/remult-mongo.js +80 -36
  29. package/remult-sqlite-core.d.ts +1 -0
  30. package/remult-sqlite-core.js +1 -0
  31. package/src/data-api.js +38 -21
  32. package/src/data-interfaces.d.ts +9 -3
  33. package/src/data-interfaces.js +4 -4
  34. package/src/data-providers/array-entity-data-provider.d.ts +2 -2
  35. package/src/data-providers/array-entity-data-provider.js +92 -14
  36. package/src/data-providers/in-memory-database.d.ts +5 -2
  37. package/src/data-providers/in-memory-database.js +22 -1
  38. package/src/data-providers/indexed-db-data-provider.d.ts +61 -0
  39. package/src/data-providers/indexed-db-data-provider.js +1459 -0
  40. package/src/data-providers/json-data-provider.js +2 -2
  41. package/src/data-providers/rest-data-provider.d.ts +2 -3
  42. package/src/data-providers/rest-data-provider.js +18 -17
  43. package/src/data-providers/sql-database.js +254 -105
  44. package/src/entity.d.ts +12 -0
  45. package/src/live-query/LiveQueryClient.js +87 -37
  46. package/src/live-query/SseSubscriptionClient.js +75 -44
  47. package/src/live-query/SubscriptionChannel.d.ts +12 -0
  48. package/src/live-query/SubscriptionChannel.js +36 -11
  49. package/src/remult3/RepositoryImplementation.d.ts +7 -4
  50. package/src/remult3/RepositoryImplementation.js +521 -326
  51. package/src/remult3/remult3.d.ts +7 -5
  52. package/src/remult3/remult3.js +2 -2
  53. package/src/sql-command.d.ts +2 -0
  54. package/src/standard-schema/index.d.ts +1 -1
@@ -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,48 @@ 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());
341
- }
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) {
326
+ const useBulk = this._dataProvider.isProxy || this.metadata.options.bulkInsert;
327
+ if (!useBulk) {
328
+ const r = [];
329
+ for (const item of entity)
350
330
  r.push(await this.insert(item, options));
351
- }
352
331
  if (options?.select === 'none')
353
332
  return undefined;
354
333
  return r;
355
334
  }
335
+ const slots = [];
336
+ const raw = [];
337
+ for (const item of entity) {
338
+ this.__cleanupPartialObject(item);
339
+ let ref = getEntityRef(item, false);
340
+ if (ref) {
341
+ if (!ref.isNew())
342
+ throw 'Item is not new';
343
+ }
344
+ else {
345
+ ref = this.getEntityRef(this.create(item));
346
+ }
347
+ const dto = await ref.buildDtoForInsert();
348
+ if (dto === null) {
349
+ slots.push({ ref, skip: true });
350
+ }
351
+ else {
352
+ slots.push({ ref, skip: false });
353
+ raw.push(dto);
354
+ }
355
+ }
356
+ if (raw.length) {
357
+ const inserted = await this._edp.insert(raw, options);
358
+ let i = 0;
359
+ for (const slot of slots) {
360
+ if (!slot.skip)
361
+ slot.row = inserted[i++];
362
+ }
363
+ }
364
+ const result = await promiseAll(slots, (slot) => slot.ref.processInsertResponseDto(slot.row));
365
+ if (options?.select === 'none')
366
+ return undefined;
367
+ return result;
356
368
  }
357
369
  else {
358
370
  let ref = getEntityRef(entity, false);
@@ -690,7 +702,16 @@ export class RepositoryImplementation {
690
702
  return undefined;
691
703
  })
692
704
  .filter((x) => x !== undefined));
693
- let result = await promiseAll(rawRows, async (r) => await this._mapRawDataToResult(r, loadFields, excludeRelationMembers));
705
+ const select = loadOptions?.select;
706
+ let fieldsExcludedBySelect = undefined;
707
+ if (select) {
708
+ const selected = new Set(Object.keys(select).filter((x) => select[x]));
709
+ fieldsExcludedBySelect = new Set(this.fields
710
+ .toArray()
711
+ .map((f) => f.key)
712
+ .filter((key) => !selected.has(key)));
713
+ }
714
+ let result = await promiseAll(rawRows, async (r) => await this._mapRawDataToResult(r, loadFields, excludeRelationMembers, fieldsExcludedBySelect));
694
715
  const fields = this.metadata.fields.toArray();
695
716
  this._populateRelationsForFields(fields, loadOptions, result, loader);
696
717
  return result;
@@ -819,9 +840,10 @@ export class RepositoryImplementation {
819
840
  findOptions.limit = 1;
820
841
  return { findOptions, returnNull, returnUndefined };
821
842
  }
822
- async _mapRawDataToResult(r, loadFields, excludeRelationMembers) {
843
+ async _mapRawDataToResult(r, loadFields, excludeRelationMembers, fieldsExcludedBySelect) {
823
844
  let x = new this._entity(this._remult);
824
845
  let helper = new rowHelperImplementation(this._info, x, this, this._edp, this._remult, false, excludeRelationMembers);
846
+ helper._fieldsExcludedBySelect = fieldsExcludedBySelect;
825
847
  Object.defineProperty(x, entityMember, {
826
848
  //I've used define property to hide this member from console.lo g
827
849
  get: () => helper,
@@ -886,14 +908,19 @@ export class RepositoryImplementation {
886
908
  return this._edp.deleteMany(where === 'all' ? 'all' : await this._translateWhereToFilter(where));
887
909
  }
888
910
  else {
889
- let deleted = 0;
890
911
  if (where === 'all')
891
912
  where = undefined;
913
+ const prepared = [];
892
914
  for await (const item of this.query({ where, aggregate: undefined })) {
893
- await getEntityRef(item).delete();
894
- deleted++;
915
+ const ref = getEntityRef(item);
916
+ prepared.push({ ref, ...(await ref.__prepareDelete()) });
895
917
  }
896
- return deleted;
918
+ const ids = prepared.filter((x) => x.doDelete).map((x) => x.ref.id);
919
+ if (ids.length)
920
+ await this._edp.delete(ids);
921
+ for (const x of prepared)
922
+ await x.ref.__finishDelete(x.event);
923
+ return prepared.length;
897
924
  }
898
925
  }
899
926
  _cache = new Map();
@@ -1092,6 +1119,9 @@ class rowHelperBase {
1092
1119
  this._error = val;
1093
1120
  this._subscribers?.reportChanged();
1094
1121
  }
1122
+ /** Fields left out by a partial `select` - they were never loaded, so they
1123
+ * must not be serialized by {@link toApiJson}. */
1124
+ _fieldsExcludedBySelect;
1095
1125
  constructor(fieldsMetadata, instance, remult, isNewRow, excludeRelationMembers) {
1096
1126
  this.fieldsMetadata = fieldsMetadata;
1097
1127
  this.instance = instance;
@@ -1346,6 +1376,11 @@ class rowHelperBase {
1346
1376
  toApiJson(includeRelatedEntities = false, notJustApi = false) {
1347
1377
  let result = {};
1348
1378
  for (const col of this.fieldsMetadata) {
1379
+ // A field excluded by `select` was never loaded. Running it through
1380
+ // valueConverter.toJson would emit a value ('' for dates and most custom
1381
+ // converters) that the caller can't tell apart from a real empty value.
1382
+ if (this._fieldsExcludedBySelect?.has(col.key))
1383
+ continue;
1349
1384
  if (notJustApi || !this.remult || col.includedInApi(this.instance)) {
1350
1385
  let val;
1351
1386
  let lu = this.lookups.get(col.key);
@@ -1562,7 +1597,7 @@ export class rowHelperImplementation extends rowHelperBase {
1562
1597
  }))[0];
1563
1598
  }
1564
1599
  else
1565
- updatedRow = await this.edp.insert(d, options);
1600
+ updatedRow = (await this.edp.insert([d], options))[0];
1566
1601
  }
1567
1602
  else {
1568
1603
  let changesOnly = {};
@@ -1617,13 +1652,43 @@ export class rowHelperImplementation extends rowHelperBase {
1617
1652
  }
1618
1653
  }
1619
1654
  async processInsertResponseDto(updatedRow) {
1620
- await this.loadDataFrom(updatedRow);
1621
- this.saveOriginalData();
1622
- this._isNew = false;
1623
- return this.instance;
1655
+ try {
1656
+ if (updatedRow)
1657
+ await this.loadDataFrom(updatedRow);
1658
+ const e = this.buildLifeCycleEvent();
1659
+ e.id = this.getId();
1660
+ if (!this.repo._dataProvider.isProxy) {
1661
+ if (this.info.entityInfo.saved)
1662
+ await this.info.entityInfo.saved(this.instance, e);
1663
+ if (this.repo.listeners)
1664
+ for (const listener of this.repo.listeners) {
1665
+ await listener.saved?.(this.instance, true);
1666
+ }
1667
+ }
1668
+ this.repo._remult.liveQueryPublisher.itemChanged(this.repo.metadata.key, [{ id: this.getId(), oldId: this.getOriginalId(), deleted: false }]);
1669
+ this.saveOriginalData();
1670
+ this._isNew = false;
1671
+ return this.instance;
1672
+ }
1673
+ catch (err) {
1674
+ throw await this.catchSaveErrors(err);
1675
+ }
1624
1676
  }
1625
1677
  async buildDtoForInsert() {
1626
1678
  await this.__validateEntity();
1679
+ let skip = false;
1680
+ const e = this.buildLifeCycleEvent(() => {
1681
+ skip = true;
1682
+ });
1683
+ if (!this.repo._dataProvider.isProxy) {
1684
+ for (const col of this.fields) {
1685
+ if (col.metadata.options.saving)
1686
+ await col.metadata.options.saving(this.instance, col, e);
1687
+ }
1688
+ if (this.info.entityInfo.saving) {
1689
+ await this.info.entityInfo.saving(this.instance, e);
1690
+ }
1691
+ }
1627
1692
  this.__assertValidity();
1628
1693
  let d = this.copyDataToObject(this.isNew());
1629
1694
  for (const field of this.metadata.fields) {
@@ -1633,6 +1698,8 @@ export class rowHelperImplementation extends rowHelperBase {
1633
1698
  f.value = f.originalValue;
1634
1699
  }
1635
1700
  }
1701
+ if (skip)
1702
+ return null;
1636
1703
  return d;
1637
1704
  }
1638
1705
  buildLifeCycleEvent(preventDefault = () => { }) {
@@ -1652,36 +1719,44 @@ export class rowHelperImplementation extends rowHelperBase {
1652
1719
  return await this.repo._translateWhereToFilter(this.repo.metadata.idMetadata.getIdFilter(this.id));
1653
1720
  }
1654
1721
  async delete() {
1722
+ try {
1723
+ const { doDelete, event } = await this.__prepareDelete();
1724
+ if (doDelete)
1725
+ await this.edp.delete([this.id]);
1726
+ await this.__finishDelete(event);
1727
+ }
1728
+ catch (err) {
1729
+ throw await this.catchSaveErrors(err);
1730
+ }
1731
+ }
1732
+ //@internal
1733
+ async __prepareDelete() {
1655
1734
  this.__clearErrorsAndReportChanged();
1656
1735
  let doDelete = true;
1657
- let e = this.buildLifeCycleEvent(() => (doDelete = false));
1736
+ const event = this.buildLifeCycleEvent(() => (doDelete = false));
1658
1737
  if (!this.repo._dataProvider.isProxy) {
1659
1738
  if (this.info.entityInfo.deleting)
1660
- await this.info.entityInfo.deleting(this.instance, e);
1739
+ await this.info.entityInfo.deleting(this.instance, event);
1661
1740
  }
1662
1741
  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);
1742
+ if (doDelete && this.id === undefined)
1743
+ throw new Error('Invalid operation, id is undefined');
1744
+ return { doDelete, event };
1745
+ }
1746
+ //@internal
1747
+ async __finishDelete(e) {
1748
+ if (!this.repo._dataProvider.isProxy) {
1749
+ if (this.info.entityInfo.deleted)
1750
+ await this.info.entityInfo.deleted(this.instance, e);
1684
1751
  }
1752
+ if (this.repo.listeners)
1753
+ for (const listener of this.repo.listeners) {
1754
+ await listener.deleted?.(this.instance);
1755
+ }
1756
+ this.repo._remult.liveQueryPublisher.itemChanged(this.repo.metadata.key, [
1757
+ { id: this.getId(), oldId: this.getOriginalId(), deleted: true },
1758
+ ]);
1759
+ this._wasDeleted = true;
1685
1760
  }
1686
1761
  async loadDataFrom(data, loadItems) {
1687
1762
  for (const col of this.info.fields) {
@@ -16,8 +16,8 @@ const wnn = [
16
16
  ];
17
17
  export const flags = {
18
18
  error500RetryCount: 4,
19
- /** Client treats SSE as dead if no event for this long */
20
- sseStaleMs: 20_000,
19
+ /** Client treats SSE as dead if no event for this long. Server pings every 15s; two missed pings plus slack, so a stalled event loop does not trigger a reconnect storm */
20
+ sseStaleMs: 40_000,
21
21
  /** HTTP keep-alive while SSE is healthy (touches lastUsed) */
22
22
  liveQueryKeepAliveMs: 30_000,
23
23
  /** Version poll while SSE is stale */
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, DroppableDataProvider, 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/internals.d.ts CHANGED
@@ -15,5 +15,6 @@ export declare const actionInfo: {
15
15
  export { isOfType } from './src/isOfType.js';
16
16
  export type { ClassType } from './classType.js';
17
17
  export { flags } from './src/remult3/remult3.js';
18
+ export { SseSubscriptionClient } from './src/live-query/SseSubscriptionClient.js';
18
19
  export { DataProviderPromiseWrapper } from './src/data-interfaces.js';
19
20
  export { pagedQueryResult } from './src/remult3/pagedQueryResult.js';
package/internals.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pagedQueryResult = exports.DataProviderPromiseWrapper = exports.flags = exports.isOfType = exports.actionInfo = exports.__updateEntityBasedOnWhere = exports.getEntitySettings = exports.fieldOptionsEnricher = exports.getControllerRef = exports.controllerRefImpl = exports.decorateColumnSettings = exports.getRelationFieldInfo = exports.getRelationInfo = exports.sqlRelationsFilter = exports.sqlRelations = void 0;
3
+ exports.pagedQueryResult = exports.DataProviderPromiseWrapper = exports.SseSubscriptionClient = exports.flags = exports.isOfType = exports.actionInfo = exports.__updateEntityBasedOnWhere = exports.getEntitySettings = exports.fieldOptionsEnricher = exports.getControllerRef = exports.controllerRefImpl = exports.decorateColumnSettings = exports.getRelationFieldInfo = exports.getRelationInfo = exports.sqlRelationsFilter = exports.sqlRelations = void 0;
4
4
  var remult_static_js_1 = require("./src/remult-static.js");
5
5
  var sql_relations_js_1 = require("./src/data-providers/sql-relations.js");
6
6
  Object.defineProperty(exports, "sqlRelations", { enumerable: true, get: function () { return sql_relations_js_1.sqlRelations; } });
@@ -22,6 +22,8 @@ var isOfType_js_1 = require("./src/isOfType.js");
22
22
  Object.defineProperty(exports, "isOfType", { enumerable: true, get: function () { return isOfType_js_1.isOfType; } });
23
23
  var remult3_js_1 = require("./src/remult3/remult3.js");
24
24
  Object.defineProperty(exports, "flags", { enumerable: true, get: function () { return remult3_js_1.flags; } });
25
+ var SseSubscriptionClient_js_1 = require("./src/live-query/SseSubscriptionClient.js");
26
+ Object.defineProperty(exports, "SseSubscriptionClient", { enumerable: true, get: function () { return SseSubscriptionClient_js_1.SseSubscriptionClient; } });
25
27
  var data_interfaces_js_1 = require("./src/data-interfaces.js");
26
28
  Object.defineProperty(exports, "DataProviderPromiseWrapper", { enumerable: true, get: function () { return data_interfaces_js_1.DataProviderPromiseWrapper; } });
27
29
  var pagedQueryResult_js_1 = require("./src/remult3/pagedQueryResult.js");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "3.4.0-next.2",
3
+ "version": "3.4.0-next.5",
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) {