remult 3.3.18 → 3.3.19-next.1
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.
- package/esm/index.js +7 -6
- package/esm/remult-d1.js +1 -0
- package/esm/remult-knex/index.js +112 -2
- package/esm/remult-mongo.js +17 -8
- package/esm/remult-sqlite-core.js +1 -0
- package/esm/src/data-interfaces.js +4 -4
- package/esm/src/data-providers/array-entity-data-provider.js +14 -2
- package/esm/src/data-providers/indexed-db-data-provider.js +644 -0
- package/esm/src/data-providers/json-data-provider.js +2 -2
- package/esm/src/data-providers/rest-data-provider.js +11 -12
- package/esm/src/data-providers/sql-database.js +110 -43
- package/esm/src/remult3/RepositoryImplementation.js +90 -60
- package/index.d.ts +31 -17
- package/index.js +5 -2
- package/package.json +1 -1
- package/remult-d1.d.ts +1 -0
- package/remult-d1.js +1 -0
- package/remult-knex/index.d.ts +2 -2
- package/remult-knex/index.js +329 -44
- package/remult-mongo.js +80 -36
- package/remult-sqlite-core.d.ts +1 -0
- package/remult-sqlite-core.js +1 -0
- package/src/column-interfaces.d.ts +4 -0
- package/src/data-interfaces.d.ts +2 -3
- package/src/data-interfaces.js +4 -4
- package/src/data-providers/array-entity-data-provider.d.ts +2 -2
- package/src/data-providers/array-entity-data-provider.js +92 -14
- package/src/data-providers/indexed-db-data-provider.d.ts +37 -0
- package/src/data-providers/indexed-db-data-provider.js +1048 -0
- package/src/data-providers/json-data-provider.js +2 -2
- package/src/data-providers/rest-data-provider.d.ts +2 -3
- package/src/data-providers/rest-data-provider.js +18 -17
- package/src/data-providers/sql-database.js +254 -105
- package/src/remult3/RepositoryImplementation.d.ts +1 -1
- package/src/remult3/RepositoryImplementation.js +384 -270
- package/src/remult3/remult3.d.ts +2 -2
- package/src/sql-command.d.ts +2 -0
- package/src/standard-schema/index.d.ts +1 -1
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
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} (${
|
|
538
|
+
let statement = `insert into ${e.$entityName} (${colSql}) values ${vals}`;
|
|
479
539
|
let { colKeys, select } = await this.buildSelect(e, r, undefined, undefined);
|
|
480
|
-
|
|
481
|
-
|
|
540
|
+
const source = this.sql._getSourceSql();
|
|
541
|
+
const wantRows = options?.select !== 'none';
|
|
542
|
+
if (!source.doesNotSupportReturningSyntax && wantRows)
|
|
482
543
|
statement += ' returning ' + select;
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
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
|
-
|
|
504
|
-
|
|
505
|
-
|
|
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
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
if (ref)
|
|
333
|
-
|
|
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
|
-
|
|
343
|
-
|
|
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
|
-
|
|
353
|
-
|
|
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
|
-
|
|
894
|
-
|
|
883
|
+
const ref = getEntityRef(item);
|
|
884
|
+
prepared.push({ ref, ...(await ref.__prepareDelete()) });
|
|
895
885
|
}
|
|
896
|
-
|
|
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
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
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
|
-
|
|
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,
|
|
1694
|
+
await this.info.entityInfo.deleting(this.instance, event);
|
|
1661
1695
|
}
|
|
1662
1696
|
this.__assertValidity();
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
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,
|
|
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,
|
|
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 {
|
|
24
|
-
export {
|
|
25
|
-
export {
|
|
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,
|
|
31
|
-
export {
|
|
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 {
|
|
35
|
-
export {
|
|
36
|
-
export {
|
|
37
|
-
export {
|
|
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
|
|
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,
|
|
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 {
|
|
45
|
-
export {
|
|
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.
|
|
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
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
package/remult-knex/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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>;
|