remult 3.3.0-next.1 → 3.3.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/graphql.js +1 -1
- package/esm/remult-knex/index.js +10 -3
- package/esm/remult-mongo.js +7 -3
- package/esm/server/get-remult-admin-html.js +125 -111
- package/esm/server/remult-admin.js +2 -0
- package/esm/server/remult-api-server.js +1 -1
- package/esm/src/data-api.js +30 -19
- package/esm/src/data-providers/rest-data-provider.js +48 -37
- package/esm/src/data-providers/sql-database.js +14 -3
- package/esm/src/live-query/SubscriptionChannel.js +52 -4
- package/esm/src/remult-proxy.js +4 -4
- package/esm/src/remult3/RepositoryImplementation.js +53 -25
- package/esm/src/server-action.js +2 -2
- package/esm/src/valueConverters.js +9 -5
- package/graphql.js +1 -1
- package/index.d.ts +1 -1
- package/package.json +1 -1
- package/remult-knex/index.js +18 -9
- package/remult-mongo.js +6 -2
- package/server/get-remult-admin-html.js +1 -1
- package/server/remult-admin.d.ts +2 -0
- package/server/remult-admin.js +2 -1
- package/server/remult-api-server.js +1 -0
- package/src/data-api.d.ts +4 -4
- package/src/data-api.js +50 -30
- package/src/data-interfaces.d.ts +6 -6
- package/src/data-providers/rest-data-provider.d.ts +4 -4
- package/src/data-providers/rest-data-provider.js +48 -37
- package/src/data-providers/sql-database.js +14 -3
- package/src/live-query/SubscriptionChannel.d.ts +52 -4
- package/src/live-query/SubscriptionChannel.js +52 -4
- package/src/remult-proxy.js +4 -4
- package/src/remult3/RepositoryImplementation.d.ts +11 -10
- package/src/remult3/RepositoryImplementation.js +237 -177
- package/src/remult3/remult3.d.ts +25 -23
- package/src/server-action.js +2 -2
- package/src/valueConverters.d.ts +3 -1
- package/src/valueConverters.js +9 -6
package/src/remult3/remult3.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export interface UpsertOptions<entityType> {
|
|
|
13
13
|
export interface EntityRefBase<entityType> extends Subscribable {
|
|
14
14
|
hasErrors(): boolean;
|
|
15
15
|
undoChanges(): void;
|
|
16
|
-
save(): Promise<entityType>;
|
|
16
|
+
save(options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
17
17
|
reload(): Promise<entityType>;
|
|
18
18
|
delete(): Promise<void>;
|
|
19
19
|
isNew(): boolean;
|
|
@@ -395,9 +395,14 @@ export type GroupByResult<entityType, groupByFields extends (keyof entityType)[]
|
|
|
395
395
|
};
|
|
396
396
|
/** used to perform CRUD operations on an `entityType` */
|
|
397
397
|
export interface Repository<entityType> {
|
|
398
|
-
/** returns
|
|
398
|
+
/** returns an array based on the provided options */
|
|
399
399
|
find(options?: FindOptions<entityType>): Promise<entityType[]>;
|
|
400
|
-
/**
|
|
400
|
+
/** Using the same options as the {@link find} method, but subscribing to entity changes.
|
|
401
|
+
*
|
|
402
|
+
* _Note that today it subscribes to entity changes, but not included entities [Feature Request](https://github.com/remult/remult/issues/712)!_
|
|
403
|
+
*
|
|
404
|
+
* @see {@link LiveQuery}
|
|
405
|
+
*/
|
|
401
406
|
liveQuery(options?: FindOptions<entityType>): LiveQuery<entityType>;
|
|
402
407
|
/** returns the first item that matchers the `where` condition
|
|
403
408
|
* @example
|
|
@@ -547,27 +552,27 @@ export interface Repository<entityType> {
|
|
|
547
552
|
* @example
|
|
548
553
|
* await taskRepo.save({...task, completed:true })
|
|
549
554
|
*/
|
|
550
|
-
save(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
|
|
551
|
-
save(item: Partial<MembersOnly<entityType
|
|
555
|
+
save(item: Partial<MembersOnly<entityType>>[], options?: InsertOrUpdateOptions): Promise<entityType[]>;
|
|
556
|
+
save(item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
552
557
|
/**Insert an item or item[] to the data source
|
|
553
558
|
* @example
|
|
554
559
|
* await taskRepo.insert({title:"task a"})
|
|
555
560
|
* @example
|
|
556
561
|
* await taskRepo.insert([{title:"task a"}, {title:"task b", completed:true }])
|
|
557
562
|
*/
|
|
558
|
-
insert(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
|
|
559
|
-
insert(item: Partial<MembersOnly<entityType
|
|
563
|
+
insert(item: Partial<MembersOnly<entityType>>[], options?: InsertOrUpdateOptions): Promise<entityType[]>;
|
|
564
|
+
insert(item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
560
565
|
/** Updates an item, based on its `id`
|
|
561
566
|
* @example
|
|
562
567
|
* taskRepo.update(task.id,{...task,completed:true})
|
|
563
568
|
*/
|
|
564
|
-
update(id: idType<entityType>, item: Partial<MembersOnly<entityType
|
|
565
|
-
update(id: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType
|
|
569
|
+
update(id: idType<entityType>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
570
|
+
update(id: Partial<MembersOnly<entityType>>, item: Partial<MembersOnly<entityType>>, options?: InsertOrUpdateOptions): Promise<entityType>;
|
|
566
571
|
/**
|
|
567
572
|
* Updates all items that match the `where` condition.
|
|
568
573
|
*/
|
|
569
574
|
updateMany(options: {
|
|
570
|
-
where: EntityFilter<entityType
|
|
575
|
+
where: EntityFilter<entityType> | 'all';
|
|
571
576
|
set: Partial<MembersOnly<entityType>>;
|
|
572
577
|
}): Promise<number>;
|
|
573
578
|
/**
|
|
@@ -607,7 +612,7 @@ export interface Repository<entityType> {
|
|
|
607
612
|
* Deletes all items that match the `where` condition.
|
|
608
613
|
*/
|
|
609
614
|
deleteMany(options: {
|
|
610
|
-
where: EntityFilter<entityType
|
|
615
|
+
where: EntityFilter<entityType> | 'all';
|
|
611
616
|
}): Promise<number>;
|
|
612
617
|
/** Creates an instance of an item. It'll not be saved to the data source unless `save` or `insert` will be called.
|
|
613
618
|
*
|
|
@@ -674,7 +679,7 @@ export interface LiveQuery<entityType> {
|
|
|
674
679
|
*
|
|
675
680
|
* @example
|
|
676
681
|
* // Subscribing to changes in a live query
|
|
677
|
-
* const unsubscribe =
|
|
682
|
+
* const unsubscribe = repo(Task)
|
|
678
683
|
* .liveQuery({
|
|
679
684
|
* limit: 20,
|
|
680
685
|
* orderBy: { createdAt: 'asc' }
|
|
@@ -734,20 +739,14 @@ export interface LiveQueryChangeInfo<entityType> {
|
|
|
734
739
|
applyChanges(prevState: entityType[] | undefined): entityType[];
|
|
735
740
|
}
|
|
736
741
|
export interface FindOptions<entityType> extends FindOptionsBase<entityType> {
|
|
737
|
-
/**
|
|
742
|
+
/** Number of rows returned. _(Defaults to 100 in the browser)_
|
|
738
743
|
* @example
|
|
739
|
-
* await repo(Products).find({
|
|
740
|
-
* limit: 10,
|
|
741
|
-
* page: 2
|
|
742
|
-
* })
|
|
744
|
+
* await repo(Products).find({ limit: 10 })
|
|
743
745
|
*/
|
|
744
746
|
limit?: number;
|
|
745
|
-
/** Determines the page number
|
|
747
|
+
/** Determines the page number to retrieve. Works in tandem with the `limit` option.
|
|
746
748
|
* @example
|
|
747
|
-
* await repo(Products).find({
|
|
748
|
-
* limit: 10,
|
|
749
|
-
* page: 2
|
|
750
|
-
* })
|
|
749
|
+
* await repo(Products).find({ page: 2 })
|
|
751
750
|
*/
|
|
752
751
|
page?: number;
|
|
753
752
|
}
|
|
@@ -1058,7 +1057,7 @@ export interface FindOptionsBase<entityType> extends LoadOptions<entityType> {
|
|
|
1058
1057
|
select?: EntitySelectFields<entityType>;
|
|
1059
1058
|
/** filters the data
|
|
1060
1059
|
* @example
|
|
1061
|
-
* await taskRepo.find({where: { completed:false }})
|
|
1060
|
+
* await taskRepo.find({ where: { completed:false } })
|
|
1062
1061
|
* @see For more usage examples see [EntityFilter](https://remult.dev/docs/entityFilter.html)
|
|
1063
1062
|
*/
|
|
1064
1063
|
where?: EntityFilter<entityType>;
|
|
@@ -1198,6 +1197,9 @@ export declare type EntityIdFields<entityType> = {
|
|
|
1198
1197
|
export declare type EntitySelectFields<entityType> = {
|
|
1199
1198
|
[Properties in keyof Partial<MembersOnly<entityType>>]?: boolean;
|
|
1200
1199
|
};
|
|
1200
|
+
export declare type InsertOrUpdateOptions = {
|
|
1201
|
+
select: 'none';
|
|
1202
|
+
};
|
|
1201
1203
|
export interface ClassFieldDecoratorContextStub<entityType, valueType> {
|
|
1202
1204
|
readonly access: {
|
|
1203
1205
|
set(object: entityType, value: valueType | null): void;
|
package/src/server-action.js
CHANGED
|
@@ -295,7 +295,7 @@ function BackendMethod(options) {
|
|
|
295
295
|
reg(controllerOptions.key +
|
|
296
296
|
'/' +
|
|
297
297
|
((options === null || options === void 0 ? void 0 : options.apiPrefix) ? options.apiPrefix + '/' : '') +
|
|
298
|
-
key, options ? (_b = options.queue) !== null && _b !== void 0 ? _b : false : false, options.allowed, function (d, req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
298
|
+
key, options ? ((_b = options.queue) !== null && _b !== void 0 ? _b : false) : false, options.allowed, function (d, req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
299
299
|
var allowed, remult_1, r_1, err_3;
|
|
300
300
|
var _this = this;
|
|
301
301
|
return tslib_1.__generator(this, function (_a) {
|
|
@@ -475,7 +475,7 @@ function BackendMethod(options) {
|
|
|
475
475
|
http])];
|
|
476
476
|
case 4:
|
|
477
477
|
r = _k.sent();
|
|
478
|
-
return [4 /*yield*/, defs.
|
|
478
|
+
return [4 /*yield*/, defs._updateResultsFromServerAction(r.rowInfo)];
|
|
479
479
|
case 5:
|
|
480
480
|
_k.sent();
|
|
481
481
|
return [2 /*return*/, r.result];
|
package/src/valueConverters.d.ts
CHANGED
|
@@ -2,7 +2,9 @@ import type { ValueConverter } from './column-interfaces.js';
|
|
|
2
2
|
export declare class ValueConverters {
|
|
3
3
|
static readonly Date: ValueConverter<Date>;
|
|
4
4
|
static readonly DateOnly: ValueConverter<Date>;
|
|
5
|
-
static readonly DateOnlyString: ValueConverter<Date
|
|
5
|
+
static readonly DateOnlyString: ValueConverter<Date> & {
|
|
6
|
+
zeroDate: Date;
|
|
7
|
+
};
|
|
6
8
|
static readonly Boolean: ValueConverter<Boolean>;
|
|
7
9
|
static readonly Number: ValueConverter<number>;
|
|
8
10
|
static readonly String: ValueConverter<String>;
|
package/src/valueConverters.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ValueConverters = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var inputTypes_js_1 = require("../inputTypes.js");
|
|
6
|
+
var zeroDate = new Date('0000-01-01');
|
|
6
7
|
var ValueConverters = /** @class */ (function () {
|
|
7
8
|
function ValueConverters() {
|
|
8
9
|
}
|
|
@@ -71,6 +72,8 @@ var ValueConverters = /** @class */ (function () {
|
|
|
71
72
|
fromJson: function (value) {
|
|
72
73
|
if (!value || value == '' || value == '0000-00-00')
|
|
73
74
|
return null;
|
|
75
|
+
if (value == '0000-01-01')
|
|
76
|
+
return zeroDate;
|
|
74
77
|
var d = new Date(Date.parse(value));
|
|
75
78
|
d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
|
|
76
79
|
return d;
|
|
@@ -92,6 +95,8 @@ var ValueConverters = /** @class */ (function () {
|
|
|
92
95
|
},
|
|
93
96
|
};
|
|
94
97
|
ValueConverters.DateOnlyString = tslib_1.__assign(tslib_1.__assign({}, ValueConverters.DateOnly), { toDb: function (d) {
|
|
98
|
+
if (d === zeroDate)
|
|
99
|
+
return '00000000';
|
|
95
100
|
var val = ValueConverters.DateOnly.toJson(d);
|
|
96
101
|
if (!val)
|
|
97
102
|
return undefined;
|
|
@@ -101,12 +106,10 @@ var ValueConverters = /** @class */ (function () {
|
|
|
101
106
|
return null;
|
|
102
107
|
if (!val)
|
|
103
108
|
return undefined;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
val.substring(6, 8));
|
|
109
|
-
} });
|
|
109
|
+
if (val === '00000000')
|
|
110
|
+
return zeroDate;
|
|
111
|
+
return new Date(Number(val.substring(0, 4)), Number(val.substring(4, 6)) - 1, Number(val.substring(6, 8)));
|
|
112
|
+
}, zeroDate: zeroDate });
|
|
110
113
|
ValueConverters.Boolean = {
|
|
111
114
|
toDb: function (val) { return val; },
|
|
112
115
|
inputType: inputTypes_js_1.InputTypes.checkbox,
|