@chevre/domain 21.35.0-alpha.17 → 21.35.0-alpha.19
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/example/src/chevre/checkReserveTransactionSizes.ts +46 -0
- package/lib/chevre/repo/orderInTransaction.d.ts +4 -0
- package/lib/chevre/repo/orderInTransaction.js +20 -0
- package/lib/chevre/repo/transaction.d.ts +1 -1
- package/lib/chevre/repo/transaction.js +1 -1
- package/lib/chevre/service/transaction/placeOrderInProgress/confirm.d.ts +2 -0
- package/lib/chevre/service/transaction/placeOrderInProgress/confirm.js +13 -2
- package/lib/chevre/service/transaction/placeOrderInProgress/validation.d.ts +3 -2
- package/lib/chevre/service/transaction/placeOrderInProgress/validation.js +16 -4
- package/lib/chevre/service/transaction.d.ts +12 -1
- package/lib/chevre/service/transaction.js +36 -12
- package/package.json +1 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// tslint:disable:no-console
|
|
2
|
+
import * as moment from 'moment';
|
|
3
|
+
import * as mongoose from 'mongoose';
|
|
4
|
+
|
|
5
|
+
import { chevre } from '../../../lib/index';
|
|
6
|
+
|
|
7
|
+
// tslint:disable-next-line:max-func-body-length
|
|
8
|
+
async function main() {
|
|
9
|
+
await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });
|
|
10
|
+
|
|
11
|
+
const assetTransactionRepo = await chevre.repository.AssetTransaction.createInstance(mongoose.connection);
|
|
12
|
+
const cursor = assetTransactionRepo.getCursor(
|
|
13
|
+
{
|
|
14
|
+
// typeOf: { $eq: chevre.factory.assetTransactionType.Pay },
|
|
15
|
+
status: { $eq: chevre.factory.transactionStatusType.Confirmed },
|
|
16
|
+
startDate: {
|
|
17
|
+
// $lte: moment()
|
|
18
|
+
// // tslint:disable-next-line:no-magic-numbers
|
|
19
|
+
// .add(-28, 'days'),
|
|
20
|
+
$gte: moment()
|
|
21
|
+
// tslint:disable-next-line:no-magic-numbers
|
|
22
|
+
.add(-180, 'days')
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
console.log('transactions found');
|
|
29
|
+
|
|
30
|
+
let i = 0;
|
|
31
|
+
// tslint:disable-next-line:max-func-body-length
|
|
32
|
+
await cursor.eachAsync(async (doc) => {
|
|
33
|
+
i += 1;
|
|
34
|
+
const reserveTransaction = <chevre.factory.assetTransaction.reserve.ITransaction>doc.toObject();
|
|
35
|
+
console.log(
|
|
36
|
+
'size:', JSON.stringify(reserveTransaction).length,
|
|
37
|
+
reserveTransaction.typeOf, reserveTransaction.project.id, reserveTransaction.transactionNumber,
|
|
38
|
+
reserveTransaction.startDate, i);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
console.log(i, 'transactions checked');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
main()
|
|
45
|
+
.then()
|
|
46
|
+
.catch(console.error);
|
|
@@ -3,6 +3,7 @@ import * as factory from '../factory';
|
|
|
3
3
|
type IOrderInTransaction = Pick<factory.order.IOrder, 'orderNumber' | 'project'> & {
|
|
4
4
|
typeOf: factory.transactionType.PlaceOrder;
|
|
5
5
|
acceptedOffers: factory.order.IAcceptedOffer<factory.order.IItemOffered>[];
|
|
6
|
+
customer?: factory.order.ICustomer;
|
|
6
7
|
};
|
|
7
8
|
export type IPlacingOrder = Pick<factory.order.IOrder, 'broker' | 'confirmationNumber' | 'customer' | 'identifier' | 'isGift' | 'name' | 'orderDate' | 'orderNumber' | 'orderStatus' | 'orderedItem' | 'paymentMethods' | 'price' | 'priceCurrency' | 'seller' | 'typeOf' | 'url'>;
|
|
8
9
|
/**
|
|
@@ -37,6 +38,9 @@ export declare class MongoRepository {
|
|
|
37
38
|
};
|
|
38
39
|
};
|
|
39
40
|
}): Promise<import("mongodb").UpdateResult | undefined>;
|
|
41
|
+
setCustomer(params: Pick<IOrderInTransaction, 'orderNumber' | 'project'> & {
|
|
42
|
+
customer: factory.order.ICustomer;
|
|
43
|
+
}): Promise<import("mongodb").UpdateResult>;
|
|
40
44
|
deleteByOrderNumber(params: {
|
|
41
45
|
orderNumber: string;
|
|
42
46
|
}): Promise<import("mongodb").DeleteResult>;
|
|
@@ -143,6 +143,26 @@ class MongoRepository {
|
|
|
143
143
|
}
|
|
144
144
|
});
|
|
145
145
|
}
|
|
146
|
+
setCustomer(params) {
|
|
147
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
148
|
+
const { customer, orderNumber, project } = params;
|
|
149
|
+
const filter = {
|
|
150
|
+
typeOf: { $eq: factory.transactionType.PlaceOrder },
|
|
151
|
+
orderNumber: { $eq: orderNumber }
|
|
152
|
+
};
|
|
153
|
+
const setOnInsert = {
|
|
154
|
+
typeOf: factory.transactionType.PlaceOrder,
|
|
155
|
+
orderNumber,
|
|
156
|
+
project
|
|
157
|
+
};
|
|
158
|
+
const setKeys = { customer };
|
|
159
|
+
return this.orderModel.updateOne(filter, {
|
|
160
|
+
$setOnInsert: setOnInsert,
|
|
161
|
+
$set: setKeys
|
|
162
|
+
}, { upsert: true })
|
|
163
|
+
.exec();
|
|
164
|
+
});
|
|
165
|
+
}
|
|
146
166
|
deleteByOrderNumber(params) {
|
|
147
167
|
return __awaiter(this, void 0, void 0, function* () {
|
|
148
168
|
return this.orderModel.deleteOne({
|
|
@@ -104,7 +104,7 @@ export declare class MongoRepository {
|
|
|
104
104
|
updateAgent<T extends factory.transactionType>(params: {
|
|
105
105
|
typeOf: T;
|
|
106
106
|
id: string;
|
|
107
|
-
agent: Pick<factory.transaction.IAgent, 'id'
|
|
107
|
+
agent: Pick<factory.transaction.IAgent, 'id'>;
|
|
108
108
|
object?: {
|
|
109
109
|
customer?: factory.order.ICustomer;
|
|
110
110
|
};
|
|
@@ -408,7 +408,7 @@ class MongoRepository {
|
|
|
408
408
|
typeOf: { $eq: params.typeOf },
|
|
409
409
|
status: { $eq: factory.transactionStatusType.InProgress }
|
|
410
410
|
}, {
|
|
411
|
-
$set: Object.assign(
|
|
411
|
+
$set: Object.assign({ 'agent.id': params.agent.id }, (typeof ((_b = (_a = params.object) === null || _a === void 0 ? void 0 : _a.customer) === null || _b === void 0 ? void 0 : _b.typeOf) === 'string') ? { 'object.customer': params.object.customer } : undefined)
|
|
412
412
|
}, {
|
|
413
413
|
projection: { _id: 1 }
|
|
414
414
|
})
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MongoRepository as ActionRepo } from '../../../repo/action';
|
|
2
|
+
import type { MongoRepository as AssetTransactionRepo } from '../../../repo/assetTransaction';
|
|
2
3
|
import type { AuthorizationRepo } from '../../../repo/code';
|
|
3
4
|
import type { ConfirmationNumberRepo } from '../../../repo/confirmationNumber';
|
|
4
5
|
import type { MongoRepository as EmailMessageRepo } from '../../../repo/emailMessage';
|
|
@@ -11,6 +12,7 @@ import * as factory from '../../../factory';
|
|
|
11
12
|
import { placeOrder as PlaceOrderFactory } from '../../../factory/transaction';
|
|
12
13
|
interface IConfirmOperationRepos {
|
|
13
14
|
action: ActionRepo;
|
|
15
|
+
assetTransaction: AssetTransactionRepo;
|
|
14
16
|
authorization: AuthorizationRepo;
|
|
15
17
|
emailMessage?: EmailMessageRepo;
|
|
16
18
|
message: MessageRepo;
|
|
@@ -83,11 +83,22 @@ function confirm(params) {
|
|
|
83
83
|
// orderInTransactionから検索する(2024-03-04~)
|
|
84
84
|
acceptedOffers = (yield repos.orderInTransaction.findAcceptedOffersByOrderNumber({ orderNumber: { $eq: orderNumber } }))
|
|
85
85
|
.filter(({ serialNumber }) => typeof serialNumber === 'string' && serialNumbers.includes(serialNumber));
|
|
86
|
+
// authorizePaymentActionsからpayTransactionsを参照(2024-06-20~)
|
|
87
|
+
let payTransactions = [];
|
|
88
|
+
const payTransactionNumbers = authorizePaymentActions.map(({ instrument }) => instrument.transactionNumber);
|
|
89
|
+
if (payTransactionNumbers.length > 0) {
|
|
90
|
+
payTransactions = yield repos.assetTransaction.search({
|
|
91
|
+
typeOf: factory.assetTransactionType.Pay,
|
|
92
|
+
transactionNumber: { $in: payTransactionNumbers }
|
|
93
|
+
}, ['object']);
|
|
94
|
+
debug('confirming placeOrder...', transaction.id, 'payTransactions found.', JSON.stringify(payTransactions));
|
|
95
|
+
}
|
|
86
96
|
const { paymentMethods, result, eventId, reservationIds } = createResult(Object.assign(Object.assign(Object.assign({}, params), { orderNumber, transaction: transaction, authorizePaymentActions,
|
|
87
97
|
authorizeEventServiceOfferActions,
|
|
88
98
|
authorizeMoneyTansferActions,
|
|
89
99
|
authorizeProductOfferActions,
|
|
90
|
-
acceptedOffers
|
|
100
|
+
acceptedOffers,
|
|
101
|
+
payTransactions }), (typeof code === 'string') ? { code } : undefined));
|
|
91
102
|
const customer = (0, result_1.createCustomer)({ transaction });
|
|
92
103
|
const seller = (0, result_1.createSeller)({ transaction });
|
|
93
104
|
// デフォルトEメールメッセージを検索
|
|
@@ -278,7 +289,7 @@ function createResult(params) {
|
|
|
278
289
|
}
|
|
279
290
|
});
|
|
280
291
|
// 取引の確定条件が全て整っているかどうか確認
|
|
281
|
-
(0, validation_1.validateTransaction)(transaction, params.authorizePaymentActions, params.authorizeEventServiceOfferActions, params.authorizeMoneyTansferActions, params.authorizeProductOfferActions, eventReservationAcceptedOffers);
|
|
292
|
+
(0, validation_1.validateTransaction)(transaction, params.authorizePaymentActions, params.authorizeEventServiceOfferActions, params.authorizeMoneyTansferActions, params.authorizeProductOfferActions, eventReservationAcceptedOffers, params.payTransactions);
|
|
282
293
|
const { paymentMethods, price } = (0, result_1.createPaymentMethods)({ authorizePaymentActions: params.authorizePaymentActions });
|
|
283
294
|
const orderedItem = (0, orderedItem_1.acceptedOffers2orderedItem)({
|
|
284
295
|
eventReservationAcceptedOffers,
|
|
@@ -3,11 +3,12 @@ import { placeOrder as PlaceOrderFactory } from '../../../factory/transaction';
|
|
|
3
3
|
export type IAuthorizeEventServiceOffer = factory.action.authorize.offer.eventService.IAction<factory.service.webAPI.Identifier>;
|
|
4
4
|
export type IAuthorizeProductOffer = factory.action.authorize.offer.product.IAction;
|
|
5
5
|
export type IAuthorizeMoneyTransferOffer = factory.action.authorize.offer.moneyTransfer.IAction;
|
|
6
|
-
export type IAuthorizePaymentAction = Pick<factory.action.authorize.paymentMethod.any.IAction, 'id' | 'object' | 'result' | 'endDate'>;
|
|
6
|
+
export type IAuthorizePaymentAction = Pick<factory.action.authorize.paymentMethod.any.IAction, 'id' | 'object' | 'result' | 'endDate' | 'instrument'>;
|
|
7
|
+
export type IPayTransaction = Pick<factory.assetTransaction.pay.ITransaction, 'object'>;
|
|
7
8
|
/**
|
|
8
9
|
* 取引が確定可能な状態かどうかをチェックする
|
|
9
10
|
*/
|
|
10
|
-
export declare function validateTransaction(transaction: Pick<factory.transaction.placeOrder.ITransaction, 'id' | 'object'>, authorizePaymentActions: IAuthorizePaymentAction[], authorizeEventServiceOfferActions: Pick<IAuthorizeEventServiceOffer, 'id' | 'result'>[], authorizeMoneyTansferActions: Pick<IAuthorizeMoneyTransferOffer, 'id' | 'result'>[], authorizeProductOfferActions: Pick<IAuthorizeProductOffer, 'id' | 'result'>[], eventReservationAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[]): void;
|
|
11
|
+
export declare function validateTransaction(transaction: Pick<factory.transaction.placeOrder.ITransaction, 'id' | 'object'>, authorizePaymentActions: IAuthorizePaymentAction[], authorizeEventServiceOfferActions: Pick<IAuthorizeEventServiceOffer, 'id' | 'result'>[], authorizeMoneyTansferActions: Pick<IAuthorizeMoneyTransferOffer, 'id' | 'result'>[], authorizeProductOfferActions: Pick<IAuthorizeProductOffer, 'id' | 'result'>[], eventReservationAcceptedOffers: factory.order.IAcceptedOffer<factory.order.IReservation>[], payTransactions: IPayTransaction[]): void;
|
|
11
12
|
export type IOrderURLGenerator = (order: factory.order.IOrder) => string;
|
|
12
13
|
/**
|
|
13
14
|
* 注文オファー数検証
|
|
@@ -13,7 +13,7 @@ const debug = createDebug('chevre-domain:service:transaction');
|
|
|
13
13
|
/**
|
|
14
14
|
* 取引が確定可能な状態かどうかをチェックする
|
|
15
15
|
*/
|
|
16
|
-
function validateTransaction(transaction, authorizePaymentActions, authorizeEventServiceOfferActions, authorizeMoneyTansferActions, authorizeProductOfferActions, eventReservationAcceptedOffers) {
|
|
16
|
+
function validateTransaction(transaction, authorizePaymentActions, authorizeEventServiceOfferActions, authorizeMoneyTansferActions, authorizeProductOfferActions, eventReservationAcceptedOffers, payTransactions) {
|
|
17
17
|
validateProfile(transaction);
|
|
18
18
|
validatePrice(authorizePaymentActions, authorizeEventServiceOfferActions, authorizeProductOfferActions, authorizeMoneyTansferActions);
|
|
19
19
|
// 利用可能な通貨単位に対して取引検証
|
|
@@ -33,10 +33,22 @@ function validateTransaction(transaction, authorizePaymentActions, authorizeEven
|
|
|
33
33
|
// 決済方法区分は必ず存在するはず(2023-08-15~)
|
|
34
34
|
&& ((_a = resultAsInvoice.paymentMethodAsObject) === null || _a === void 0 ? void 0 : _a.typeOf) === paymentMethodType;
|
|
35
35
|
});
|
|
36
|
+
// 決済承認アクションobject.movieTicketsではなく、payTransaction.object参照で再実装(2024-06-20~)
|
|
36
37
|
const authorizedMovieTickets = [];
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
if (settings_1.USE_EXPERIMENTAL_FEATURE) {
|
|
39
|
+
const payTransactionNumbers = authorizeMovieTicketActions.map(({ instrument }) => instrument.transactionNumber);
|
|
40
|
+
payTransactions.filter(({ object }) => payTransactionNumbers.includes(object.paymentMethodId))
|
|
41
|
+
.forEach(({ object }) => {
|
|
42
|
+
if (Array.isArray(object.paymentMethod.movieTickets)) {
|
|
43
|
+
authorizedMovieTickets.push(...object.paymentMethod.movieTickets);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
authorizeMovieTicketActions.forEach((a) => {
|
|
49
|
+
authorizedMovieTickets.push(...(Array.isArray(a.object.movieTickets)) ? a.object.movieTickets : []);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
40
52
|
debug(authorizedMovieTickets.length, 'movie tickets authorized', 'transaction:', transaction.id);
|
|
41
53
|
// validateMovieTicket(paymentMethodType, { id: transaction.id }, authorizePaymentActions, eventReservationAcceptedOffers);
|
|
42
54
|
(0, validateMovieTicket_1.validateMovieTicket)(paymentMethodType, { id: transaction.id }, authorizedMovieTickets, eventReservationAcceptedOffers);
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import * as factory from '../factory';
|
|
2
|
+
import type { MongoRepository as OrderInTransactionRepo } from '../repo/orderInTransaction';
|
|
3
|
+
import type { RedisRepository as OrderNumberRepo } from '../repo/orderNumber';
|
|
4
|
+
import type { MongoRepository as ProjectRepo } from '../repo/project';
|
|
2
5
|
import type { MongoRepository as TaskRepo } from '../repo/task';
|
|
3
6
|
import type { MongoRepository as TransactionRepo } from '../repo/transaction';
|
|
4
7
|
import { deleteTransaction } from './transaction/deleteTransaction';
|
|
@@ -19,11 +22,19 @@ export { deleteTransaction };
|
|
|
19
22
|
*/
|
|
20
23
|
export declare function updateAgent(params: {
|
|
21
24
|
typeOf: factory.transactionType;
|
|
25
|
+
/**
|
|
26
|
+
* 取引ID
|
|
27
|
+
*/
|
|
22
28
|
id: string;
|
|
23
29
|
agent: factory.transaction.placeOrder.ICustomer & {
|
|
24
30
|
telephoneRegion?: string;
|
|
25
31
|
};
|
|
26
|
-
}):
|
|
32
|
+
}): (repos: {
|
|
33
|
+
orderInTransaction: OrderInTransactionRepo;
|
|
34
|
+
orderNumber: OrderNumberRepo;
|
|
35
|
+
project: ProjectRepo;
|
|
36
|
+
transaction: TransactionRepo;
|
|
37
|
+
}) => Promise<void>;
|
|
27
38
|
export type IExportTasksOperation<T> = (repos: {
|
|
28
39
|
task: TaskRepo;
|
|
29
40
|
transaction: TransactionRepo;
|
|
@@ -26,11 +26,7 @@ exports.moneyTransfer = MoneyTransferTransactionService;
|
|
|
26
26
|
exports.placeOrder = PlaceOrderTransactionService;
|
|
27
27
|
exports.placeOrderInProgress = PlaceOrderInProgressTransactionService;
|
|
28
28
|
exports.returnOrder = ReturnOrderTransactionService;
|
|
29
|
-
|
|
30
|
-
* 取引人プロフィール更新
|
|
31
|
-
*/
|
|
32
|
-
function updateAgent(params) {
|
|
33
|
-
// tslint:disable-next-line:cyclomatic-complexity
|
|
29
|
+
function fixCustomer(params) {
|
|
34
30
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
35
31
|
var _a;
|
|
36
32
|
let formattedTelephone;
|
|
@@ -48,15 +44,10 @@ function updateAgent(params) {
|
|
|
48
44
|
const transaction = yield repos.transaction.findInProgressById({
|
|
49
45
|
typeOf: params.typeOf,
|
|
50
46
|
id: params.id
|
|
51
|
-
}, ['agent', 'object', 'typeOf']);
|
|
47
|
+
}, ['agent', 'object', 'typeOf', 'project']);
|
|
52
48
|
if (transaction.agent.id !== params.agent.id) {
|
|
53
49
|
throw new factory.errors.Forbidden('Transaction not yours');
|
|
54
50
|
}
|
|
55
|
-
// 新プロフィール作成
|
|
56
|
-
const newAgent = {
|
|
57
|
-
typeOf: transaction.agent.typeOf,
|
|
58
|
-
id: transaction.agent.id
|
|
59
|
-
};
|
|
60
51
|
// 注文取引の場合、object.customerにも適用
|
|
61
52
|
let customer;
|
|
62
53
|
if (transaction.typeOf === factory.transactionType.PlaceOrder) {
|
|
@@ -68,8 +59,41 @@ function updateAgent(params) {
|
|
|
68
59
|
: undefined), (Array.isArray(params.agent.additionalProperty)) ? { additionalProperty: params.agent.additionalProperty } : {}), (typeof params.agent.age === 'string') ? { age: params.agent.age } : {}), (typeof params.agent.address === 'string') ? { address: params.agent.address } : {}), (typeof params.agent.email === 'string') ? { email: params.agent.email } : {}), (typeof params.agent.familyName === 'string') ? { familyName: params.agent.familyName } : {}), (typeof params.agent.gender === 'string') ? { gender: params.agent.gender } : {}), (typeof params.agent.givenName === 'string') ? { givenName: params.agent.givenName } : {}), (typeof params.agent.name === 'string') ? { name: params.agent.name } : {}), (typeof formattedTelephone === 'string') ? { telephone: formattedTelephone } : {}), (typeof params.agent.url === 'string') ? { url: params.agent.url } : {});
|
|
69
60
|
}
|
|
70
61
|
}
|
|
62
|
+
return { customer, transaction };
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 取引人プロフィール更新
|
|
67
|
+
*/
|
|
68
|
+
function updateAgent(params) {
|
|
69
|
+
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const { customer, transaction } = yield fixCustomer(params)(repos);
|
|
71
|
+
const newAgent = {
|
|
72
|
+
// typeOf: transaction.agent.typeOf,
|
|
73
|
+
id: transaction.agent.id
|
|
74
|
+
};
|
|
71
75
|
yield repos.transaction.updateAgent(Object.assign({ typeOf: params.typeOf, id: params.id, agent: newAgent }, (customer !== undefined) ? { object: { customer } } : undefined));
|
|
72
|
-
|
|
76
|
+
// also save in orderInTransaction(2024-06-20~)
|
|
77
|
+
if (customer !== undefined) {
|
|
78
|
+
const orderNumber = yield PlaceOrderInProgressTransactionService.publishOrderNumberIfNotExist({
|
|
79
|
+
project: { id: transaction.project.id },
|
|
80
|
+
id: params.id,
|
|
81
|
+
object: { orderDate: new Date() }
|
|
82
|
+
})(repos);
|
|
83
|
+
const customerName = (typeof customer.name === 'string' && customer.name !== '')
|
|
84
|
+
? customer.name
|
|
85
|
+
: (typeof customer.givenName === 'string' && typeof customer.familyName === 'string'
|
|
86
|
+
&& customer.givenName !== '' && customer.familyName !== '')
|
|
87
|
+
? `${customer.givenName} ${customer.familyName}`
|
|
88
|
+
: undefined;
|
|
89
|
+
const customerInOrder = Object.assign(Object.assign(Object.assign({}, customer), { identifier: (Array.isArray(customer.identifier)) ? customer.identifier : [] }), (typeof customerName === 'string') ? { name: customerName } : undefined);
|
|
90
|
+
yield repos.orderInTransaction.setCustomer({
|
|
91
|
+
orderNumber,
|
|
92
|
+
project: transaction.project,
|
|
93
|
+
customer: customerInOrder
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// return newAgent;
|
|
73
97
|
});
|
|
74
98
|
}
|
|
75
99
|
exports.updateAgent = updateAgent;
|
package/package.json
CHANGED