@chevre/domain 20.2.0-alpha.47 → 20.2.0-alpha.49
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/lib/chevre/repo/event.d.ts +4 -3
- package/lib/chevre/repo/event.js +21 -23
- package/lib/chevre/repo/task.d.ts +0 -1
- package/lib/chevre/repo/task.js +5 -6
- package/lib/chevre/service/assetTransaction/reserve.js +1 -1
- package/lib/chevre/service/assetTransaction.d.ts +1 -1
- package/lib/chevre/service/offer.d.ts +2 -2
- package/lib/chevre/service/offer.js +52 -43
- package/lib/chevre/service/order/returnOrder.js +5 -3
- package/lib/chevre/service/product.js +5 -3
- package/lib/chevre/service/reserve/potentialActions/onReservationCanceled.js +1 -1
- package/lib/chevre/service/reserve/potentialActions/onReservationCheckedIn.js +1 -1
- package/lib/chevre/service/reserve/potentialActions/onReservationConfirmed.js +1 -1
- package/lib/chevre/service/reserve/potentialActions/onReservationUsed.js +1 -1
- package/lib/chevre/service/task/returnPayTransaction.js +5 -3
- package/lib/chevre/service/transaction/moneyTransfer.js +3 -1
- package/lib/chevre/service/transaction/placeOrder.js +5 -3
- package/lib/chevre/service/transaction/returnOrder.js +5 -3
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BulkWriteOpResultObject } from 'mongodb';
|
|
1
2
|
import { Connection } from 'mongoose';
|
|
2
3
|
import * as factory from '../factory';
|
|
3
4
|
import * as EventFactory from '../factory/event';
|
|
@@ -74,12 +75,12 @@ export declare class MongoRepository {
|
|
|
74
75
|
/**
|
|
75
76
|
* 特定の追加特性をキーにして、なければ作成する(複数対応)
|
|
76
77
|
*/
|
|
77
|
-
|
|
78
|
+
createManyIfNotExist<T extends factory.eventType>(params: {
|
|
78
79
|
attributes: factory.event.IAttributes<T>;
|
|
79
80
|
filter: {
|
|
80
81
|
name: string;
|
|
81
82
|
};
|
|
82
|
-
}[]): Promise<void>;
|
|
83
|
+
}[]): Promise<BulkWriteOpResultObject | void>;
|
|
83
84
|
/**
|
|
84
85
|
* イベント部分更新
|
|
85
86
|
*/
|
|
@@ -138,7 +139,7 @@ export declare class MongoRepository {
|
|
|
138
139
|
updateAggregationById<T extends factory.eventType>(params: {
|
|
139
140
|
id: string;
|
|
140
141
|
}, update: IUpdateAggregateReservationParams | IUpdateAggregateUseActionsParams): Promise<factory.event.IEvent<T>>;
|
|
141
|
-
bulkWrite(bulkWriteOps: any[]): Promise<
|
|
142
|
+
bulkWrite(bulkWriteOps: any[]): Promise<BulkWriteOpResultObject>;
|
|
142
143
|
getCursor(conditions: any, projection: any): import("mongoose").QueryCursor<any>;
|
|
143
144
|
deleteUnnecessaryProjectAttributesById(params: {
|
|
144
145
|
id: string;
|
package/lib/chevre/repo/event.js
CHANGED
|
@@ -460,38 +460,36 @@ class MongoRepository {
|
|
|
460
460
|
/**
|
|
461
461
|
* 特定の追加特性をキーにして、なければ作成する(複数対応)
|
|
462
462
|
*/
|
|
463
|
-
|
|
463
|
+
createManyIfNotExist(params) {
|
|
464
464
|
return __awaiter(this, void 0, void 0, function* () {
|
|
465
465
|
const bulkWriteOps = [];
|
|
466
466
|
if (Array.isArray(params)) {
|
|
467
467
|
params.forEach((creatingEventParams) => {
|
|
468
468
|
var _a;
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
throw new factory.errors.NotFound('additionalProperty.value');
|
|
473
|
-
}
|
|
474
|
-
bulkWriteOps.push({
|
|
475
|
-
updateOne: {
|
|
476
|
-
filter: {
|
|
477
|
-
typeOf: creatingEventParams.attributes.typeOf,
|
|
478
|
-
// 追加特性をキーに更新
|
|
479
|
-
additionalProperty: {
|
|
480
|
-
$exists: true,
|
|
481
|
-
$all: [{ name: creatingEventParams.filter.name, value: additionalPropertyValue }]
|
|
482
|
-
}
|
|
483
|
-
},
|
|
484
|
-
update: {
|
|
485
|
-
$setOnInsert: Object.assign({ _id: uniqid() }, creatingEventParams.attributes)
|
|
486
|
-
},
|
|
487
|
-
upsert: true
|
|
488
|
-
}
|
|
489
|
-
});
|
|
469
|
+
const additionalPropertyValue = (_a = creatingEventParams.attributes.additionalProperty) === null || _a === void 0 ? void 0 : _a.find((property) => property.name === creatingEventParams.filter.name);
|
|
470
|
+
if (typeof additionalPropertyValue !== 'string') {
|
|
471
|
+
throw new factory.errors.NotFound('additionalProperty.value');
|
|
490
472
|
}
|
|
473
|
+
bulkWriteOps.push({
|
|
474
|
+
updateOne: {
|
|
475
|
+
filter: {
|
|
476
|
+
typeOf: creatingEventParams.attributes.typeOf,
|
|
477
|
+
// 追加特性をキーに更新
|
|
478
|
+
additionalProperty: {
|
|
479
|
+
$exists: true,
|
|
480
|
+
$all: [{ name: creatingEventParams.filter.name, value: additionalPropertyValue }]
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
update: {
|
|
484
|
+
$setOnInsert: Object.assign({ _id: uniqid() }, creatingEventParams.attributes)
|
|
485
|
+
},
|
|
486
|
+
upsert: true
|
|
487
|
+
}
|
|
488
|
+
});
|
|
491
489
|
});
|
|
492
490
|
}
|
|
493
491
|
if (bulkWriteOps.length > 0) {
|
|
494
|
-
|
|
492
|
+
return this.eventModel.bulkWrite(bulkWriteOps, { ordered: false });
|
|
495
493
|
}
|
|
496
494
|
});
|
|
497
495
|
}
|
|
@@ -24,7 +24,6 @@ export declare class MongoRepository {
|
|
|
24
24
|
readonly taskModel: typeof Model;
|
|
25
25
|
constructor(connection: Connection);
|
|
26
26
|
static CREATE_MONGO_CONDITIONS(params: factory.task.ISearchConditions): any[];
|
|
27
|
-
save(taskAttributes: factory.task.IAttributes<factory.taskName>): Promise<factory.task.ITask<factory.taskName>>;
|
|
28
27
|
saveMany(taskAttributes: factory.task.IAttributes<factory.taskName>[]): Promise<any[]>;
|
|
29
28
|
executeOneByName<T extends factory.taskName>(params: {
|
|
30
29
|
name: T;
|
package/lib/chevre/repo/task.js
CHANGED
|
@@ -136,12 +136,11 @@ class MongoRepository {
|
|
|
136
136
|
}
|
|
137
137
|
return andConditions;
|
|
138
138
|
}
|
|
139
|
-
save(taskAttributes) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
139
|
+
// public async save(taskAttributes: factory.task.IAttributes<factory.taskName>): Promise<void> {
|
|
140
|
+
// // return this.taskModel.create(taskAttributes)
|
|
141
|
+
// // .then((doc) => <factory.task.ITask<factory.taskName>>doc.toObject());
|
|
142
|
+
// await this.taskModel.create(taskAttributes);
|
|
143
|
+
// }
|
|
145
144
|
saveMany(taskAttributes) {
|
|
146
145
|
return __awaiter(this, void 0, void 0, function* () {
|
|
147
146
|
if (taskAttributes.length > 0) {
|
|
@@ -581,7 +581,7 @@ function onReservationsCreated(params) {
|
|
|
581
581
|
// 集計タスク
|
|
582
582
|
yield OfferService.createAggregateScreeningEventIfNotExist({
|
|
583
583
|
project: params.event.project,
|
|
584
|
-
reservationFor: { id: params.event.id },
|
|
584
|
+
reservationFor: [{ id: params.event.id }],
|
|
585
585
|
force: false
|
|
586
586
|
})({ task: repos.task });
|
|
587
587
|
});
|
|
@@ -33,4 +33,4 @@ export declare function exportTasks<T extends factory.assetTransactionType>(para
|
|
|
33
33
|
project: ProjectRepo;
|
|
34
34
|
task: TaskRepo;
|
|
35
35
|
assetTransaction: AssetTransactionRepo;
|
|
36
|
-
}) => Promise<(import("@chevre/factory/lib/task").ITask | import("@chevre/factory/lib/task
|
|
36
|
+
}) => Promise<(import("@chevre/factory/lib/task/confirmReserveTransaction").ITask | import("@chevre/factory/lib/task").ITask | import("@chevre/factory/lib/task/deleteAssetTransaction").ITask | import("@chevre/factory/lib/task/deleteAuthorization").ITask | import("@chevre/factory/lib/task/deleteOrder").ITask | import("@chevre/factory/lib/task/deleteTransaction").ITask | import("@chevre/factory/lib/task/sendEmailMessage").ITask | import("@chevre/factory/lib/task/triggerWebhook").ITask | import("@chevre/factory/lib/task/confirmMoneyTransfer").ITask | import("@chevre/factory/lib/task/confirmRegisterService").ITask | import("@chevre/factory/lib/task/confirmPayTransaction").ITask | import("@chevre/factory/lib/task/confirmRegisterServiceTransaction").ITask | import("@chevre/factory/lib/task/deleteMember").ITask | import("@chevre/factory/lib/task/givePointAward").ITask | import("@chevre/factory/lib/task/orderProgramMembership").ITask | import("@chevre/factory/lib/task/placeOrder").ITask | import("@chevre/factory/lib/task/returnOrder").ITask | import("@chevre/factory/lib/task/returnMoneyTransfer").ITask | import("@chevre/factory/lib/task/returnPayTransaction").ITask | import("@chevre/factory/lib/task/returnPointAward").ITask | import("@chevre/factory/lib/task/returnReserveTransaction").ITask | import("@chevre/factory/lib/task/sendOrder").ITask | import("@chevre/factory/lib/task/voidMoneyTransferTransaction").ITask | import("@chevre/factory/lib/task/voidPayTransaction").ITask | import("@chevre/factory/lib/task/voidRegisterServiceTransaction").ITask | import("@chevre/factory/lib/task/voidReserveTransaction").ITask)[] | undefined>;
|
|
@@ -64,7 +64,7 @@ export declare function searchEventSeatOffersWithPaging(params: {
|
|
|
64
64
|
* イベント変更時処理
|
|
65
65
|
*/
|
|
66
66
|
export declare function onEventChanged(params: {
|
|
67
|
-
event: factory.event.IEvent<factory.eventType
|
|
67
|
+
event: factory.event.IEvent<factory.eventType> | factory.event.IEvent<factory.eventType>[];
|
|
68
68
|
isNew: boolean;
|
|
69
69
|
}): (repos: {
|
|
70
70
|
event: EventRepo;
|
|
@@ -77,7 +77,7 @@ export declare function createAggregateScreeningEventIfNotExist(params: {
|
|
|
77
77
|
};
|
|
78
78
|
reservationFor: {
|
|
79
79
|
id: string;
|
|
80
|
-
};
|
|
80
|
+
}[];
|
|
81
81
|
force: boolean;
|
|
82
82
|
}): (repos: {
|
|
83
83
|
task: TaskRepo;
|
|
@@ -212,63 +212,72 @@ exports.searchEventSeatOffersWithPaging = searchEventSeatOffersWithPaging;
|
|
|
212
212
|
*/
|
|
213
213
|
function onEventChanged(params) {
|
|
214
214
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
215
|
+
const changedEvents = (Array.isArray(params.event)) ? params.event : [params.event];
|
|
216
|
+
if (changedEvents.length > 0) {
|
|
217
|
+
// ScreeningEventであれば集計タスク
|
|
218
|
+
if (changedEvents[0].typeOf === factory.eventType.ScreeningEvent) {
|
|
219
|
+
yield createAggregateScreeningEventIfNotExist({
|
|
220
|
+
project: { id: changedEvents[0].project.id },
|
|
221
|
+
reservationFor: changedEvents.map((changedEvent) => {
|
|
222
|
+
return { id: changedEvent.id };
|
|
223
|
+
}),
|
|
224
|
+
// 新規作成の場合は強制的に集計
|
|
225
|
+
force: params.isNew
|
|
226
|
+
})(repos);
|
|
227
|
+
}
|
|
224
228
|
}
|
|
225
229
|
});
|
|
226
230
|
}
|
|
227
231
|
exports.onEventChanged = onEventChanged;
|
|
228
232
|
function createAggregateScreeningEventIfNotExist(params) {
|
|
229
233
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
234
|
+
let aggregateTasks = [];
|
|
235
|
+
const runsAt = new Date();
|
|
236
|
+
const remainingNumberOfTries = 2;
|
|
237
|
+
const project = {
|
|
238
|
+
id: params.project.id, typeOf: factory.organizationType.Project
|
|
239
|
+
};
|
|
230
240
|
if (params.force) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
status: factory.taskStatus.Ready,
|
|
235
|
-
runsAt: new Date(),
|
|
236
|
-
remainingNumberOfTries: 3,
|
|
237
|
-
numberOfTried: 0,
|
|
238
|
-
executionResults: [],
|
|
239
|
-
data: {
|
|
240
|
-
typeOf: factory.eventType.ScreeningEvent,
|
|
241
|
-
id: params.reservationFor.id
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
yield repos.task.save(aggregateTask);
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
// 冗長な作成を避ける
|
|
248
|
-
const readyAggregateScreeningEventTaskDoc = yield repos.task.taskModel.findOne({
|
|
249
|
-
'project.id': { $eq: params.project.id },
|
|
250
|
-
name: { $eq: factory.taskName.AggregateScreeningEvent },
|
|
251
|
-
status: { $eq: factory.taskStatus.Ready },
|
|
252
|
-
'data.id': { $exists: true, $eq: params.reservationFor.id }
|
|
253
|
-
}, { _id: 1 })
|
|
254
|
-
.exec();
|
|
255
|
-
if (readyAggregateScreeningEventTaskDoc === null) {
|
|
256
|
-
const aggregateTask = {
|
|
257
|
-
project: { id: params.project.id, typeOf: factory.organizationType.Project },
|
|
241
|
+
aggregateTasks = params.reservationFor.map((reservationFor) => {
|
|
242
|
+
return {
|
|
243
|
+
project,
|
|
258
244
|
name: factory.taskName.AggregateScreeningEvent,
|
|
259
245
|
status: factory.taskStatus.Ready,
|
|
260
|
-
runsAt
|
|
261
|
-
remainingNumberOfTries
|
|
246
|
+
runsAt,
|
|
247
|
+
remainingNumberOfTries,
|
|
262
248
|
numberOfTried: 0,
|
|
263
249
|
executionResults: [],
|
|
264
|
-
data: {
|
|
265
|
-
typeOf: factory.eventType.ScreeningEvent,
|
|
266
|
-
id: params.reservationFor.id
|
|
267
|
-
}
|
|
250
|
+
data: { typeOf: factory.eventType.ScreeningEvent, id: reservationFor.id }
|
|
268
251
|
};
|
|
269
|
-
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
for (const reservationFor of params.reservationFor) {
|
|
256
|
+
// 冗長な作成を避ける
|
|
257
|
+
const readyAggregateScreeningEventTaskDoc = yield repos.task.taskModel.findOne({
|
|
258
|
+
'project.id': { $eq: project.id },
|
|
259
|
+
name: { $eq: factory.taskName.AggregateScreeningEvent },
|
|
260
|
+
status: { $eq: factory.taskStatus.Ready },
|
|
261
|
+
'data.id': { $exists: true, $eq: reservationFor.id }
|
|
262
|
+
}, { _id: 1 })
|
|
263
|
+
.exec();
|
|
264
|
+
if (readyAggregateScreeningEventTaskDoc === null) {
|
|
265
|
+
aggregateTasks.push({
|
|
266
|
+
project,
|
|
267
|
+
name: factory.taskName.AggregateScreeningEvent,
|
|
268
|
+
status: factory.taskStatus.Ready,
|
|
269
|
+
runsAt,
|
|
270
|
+
remainingNumberOfTries,
|
|
271
|
+
numberOfTried: 0,
|
|
272
|
+
executionResults: [],
|
|
273
|
+
data: { typeOf: factory.eventType.ScreeningEvent, id: reservationFor.id }
|
|
274
|
+
});
|
|
275
|
+
}
|
|
270
276
|
}
|
|
271
277
|
}
|
|
278
|
+
if (aggregateTasks.length > 0) {
|
|
279
|
+
yield repos.task.saveMany(aggregateTasks);
|
|
280
|
+
}
|
|
272
281
|
});
|
|
273
282
|
}
|
|
274
283
|
exports.createAggregateScreeningEventIfNotExist = createAggregateScreeningEventIfNotExist;
|
|
@@ -202,8 +202,10 @@ function onReturn(returnActionAttributes) {
|
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
// タスク保管
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
205
|
+
// saveManyに変更(2023-02-01~)
|
|
206
|
+
yield repos.task.saveMany(taskAttributes);
|
|
207
|
+
// await Promise.all(taskAttributes.map(async (taskAttribute) => {
|
|
208
|
+
// return repos.task.save(taskAttribute);
|
|
209
|
+
// }));
|
|
208
210
|
});
|
|
209
211
|
}
|
|
@@ -77,8 +77,10 @@ function onRegistered(actionAttributes, __) {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
// タスク保管
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
// saveManyに変更(2023-02-01~)
|
|
81
|
+
yield repos.task.saveMany(taskAttributes);
|
|
82
|
+
// await Promise.all(taskAttributes.map(async (taskAttribute) => {
|
|
83
|
+
// return repos.task.save(taskAttribute);
|
|
84
|
+
// }));
|
|
83
85
|
});
|
|
84
86
|
}
|
|
@@ -96,7 +96,7 @@ function onReservationCanceled(canceledReservations, useInformReservation) {
|
|
|
96
96
|
// 冗長な作成を避ける
|
|
97
97
|
yield (0, offer_1.createAggregateScreeningEventIfNotExist)({
|
|
98
98
|
project,
|
|
99
|
-
reservationFor: { id: canceledReservations[0].reservationFor.id },
|
|
99
|
+
reservationFor: [{ id: canceledReservations[0].reservationFor.id }],
|
|
100
100
|
force: false
|
|
101
101
|
})({ task: repos.task });
|
|
102
102
|
}
|
|
@@ -116,7 +116,7 @@ function onReservationCheckedIn(params) {
|
|
|
116
116
|
yield Promise.all(reservationForIds.map((reservationForId) => __awaiter(this, void 0, void 0, function* () {
|
|
117
117
|
yield (0, offer_1.createAggregateScreeningEventIfNotExist)({
|
|
118
118
|
project: { id: params.project.id },
|
|
119
|
-
reservationFor: { id: reservationForId },
|
|
119
|
+
reservationFor: [{ id: reservationForId }],
|
|
120
120
|
force: false
|
|
121
121
|
})({ task: repos.task });
|
|
122
122
|
})));
|
|
@@ -98,7 +98,7 @@ function onReservationConfirmed(confirmedReservations) {
|
|
|
98
98
|
if (Array.isArray(confirmedReservations) && confirmedReservations.length > 0) {
|
|
99
99
|
yield (0, offer_1.createAggregateScreeningEventIfNotExist)({
|
|
100
100
|
project: confirmedReservations[0].project,
|
|
101
|
-
reservationFor: { id: confirmedReservations[0].reservationFor.id },
|
|
101
|
+
reservationFor: [{ id: confirmedReservations[0].reservationFor.id }],
|
|
102
102
|
force: false
|
|
103
103
|
})({ task: repos.task });
|
|
104
104
|
const now = new Date();
|
|
@@ -130,7 +130,7 @@ function onReservationUsed(action, attendedReservation) {
|
|
|
130
130
|
// 冗長な作成を避ける
|
|
131
131
|
yield (0, offer_1.createAggregateScreeningEventIfNotExist)({
|
|
132
132
|
project: attendedReservation.project,
|
|
133
|
-
reservationFor: { id: attendedReservation.reservationFor.id },
|
|
133
|
+
reservationFor: [{ id: attendedReservation.reservationFor.id }],
|
|
134
134
|
force: false
|
|
135
135
|
})({ task: repos.task });
|
|
136
136
|
});
|
|
@@ -217,8 +217,10 @@ function onRefund(refundActionAttributes) {
|
|
|
217
217
|
});
|
|
218
218
|
}
|
|
219
219
|
// タスク保管
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
220
|
+
// saveManyに変更(2023-02-01~)
|
|
221
|
+
yield repos.task.saveMany(taskAttributes);
|
|
222
|
+
// await Promise.all(taskAttributes.map(async (taskAttribute) => {
|
|
223
|
+
// return repos.task.save(taskAttribute);
|
|
224
|
+
// }));
|
|
223
225
|
});
|
|
224
226
|
}
|
|
@@ -582,7 +582,9 @@ function exportTasksById(params) {
|
|
|
582
582
|
transaction,
|
|
583
583
|
runsAt: taskRunsAt
|
|
584
584
|
});
|
|
585
|
-
|
|
585
|
+
// saveManyに変更(2023-02-01~)
|
|
586
|
+
yield repos.task.saveMany(taskAttributes);
|
|
587
|
+
// await Promise.all(taskAttributes.map(async (a) => repos.task.save(a)));
|
|
586
588
|
});
|
|
587
589
|
}
|
|
588
590
|
exports.exportTasksById = exportTasksById;
|
|
@@ -36,9 +36,11 @@ function exportTasksById(params) {
|
|
|
36
36
|
transaction,
|
|
37
37
|
runsAt: taskRunsAt
|
|
38
38
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
// saveManyに変更(2023-02-01~)
|
|
40
|
+
yield repos.task.saveMany(taskAttributes);
|
|
41
|
+
// await Promise.all(taskAttributes.map(async (taskAttribute) => {
|
|
42
|
+
// await repos.task.save(taskAttribute);
|
|
43
|
+
// }));
|
|
42
44
|
});
|
|
43
45
|
}
|
|
44
46
|
exports.exportTasksById = exportTasksById;
|
|
@@ -386,9 +386,11 @@ function exportTasksById(params) {
|
|
|
386
386
|
transaction,
|
|
387
387
|
runsAt: taskRunsAt
|
|
388
388
|
});
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
389
|
+
// saveManyに変更(2023-02-01~)
|
|
390
|
+
yield repos.task.saveMany(taskAttributes);
|
|
391
|
+
// await Promise.all(taskAttributes.map(async (taskAttribute) => {
|
|
392
|
+
// await repos.task.save(taskAttribute);
|
|
393
|
+
// }));
|
|
392
394
|
});
|
|
393
395
|
}
|
|
394
396
|
exports.exportTasksById = exportTasksById;
|
package/package.json
CHANGED