@chevre/domain 21.5.0-alpha.3 → 21.5.0-alpha.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.
- package/example/src/chevre/countDelayedTransactions.ts +1 -1
- package/example/src/chevre/migrateMovieAvailabilityStarts.ts +70 -0
- package/lib/chevre/repo/assetTransaction.js +13 -9
- package/lib/chevre/repo/creativeWork.js +9 -25
- package/lib/chevre/repo/mongoose/schemas/assetTransaction.js +6 -0
- package/lib/chevre/service/assetTransaction/cancelReservation.d.ts +11 -3
- package/lib/chevre/service/assetTransaction/cancelReservation.js +13 -6
- package/lib/chevre/service/event/createEvent.js +7 -2
- package/lib/chevre/service/task/returnReserveTransaction.js +2 -1
- package/package.json +3 -3
|
@@ -4,7 +4,7 @@ import * as mongoose from 'mongoose';
|
|
|
4
4
|
import { chevre } from '../../../lib/index';
|
|
5
5
|
|
|
6
6
|
export async function main() {
|
|
7
|
-
await mongoose.connect(<string>process.env.MONGOLAB_URI);
|
|
7
|
+
await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: true });
|
|
8
8
|
|
|
9
9
|
const assetTransactionRepo = new chevre.repository.AssetTransaction(mongoose.connection);
|
|
10
10
|
const transactionRepo = new chevre.repository.Transaction(mongoose.connection);
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
// const project = { id: String(process.env.PROJECT_ID) };
|
|
8
|
+
// const EXCLUDED_PROJECT_ID = process.env.EXCLUDED_PROJECT_ID;
|
|
9
|
+
|
|
10
|
+
// tslint:disable-next-line:max-func-body-length
|
|
11
|
+
async function main() {
|
|
12
|
+
await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });
|
|
13
|
+
|
|
14
|
+
const creativeWorkRepo = new chevre.repository.CreativeWork(mongoose.connection);
|
|
15
|
+
|
|
16
|
+
const cursor = creativeWorkRepo.getCursor(
|
|
17
|
+
{
|
|
18
|
+
'offers.availabilityEnds': { $exists: true }
|
|
19
|
+
},
|
|
20
|
+
{}
|
|
21
|
+
);
|
|
22
|
+
console.log('creativeWorks found');
|
|
23
|
+
|
|
24
|
+
let i = 0;
|
|
25
|
+
let updateCount = 0;
|
|
26
|
+
let datePublishedUndefinedCount = 0;
|
|
27
|
+
await cursor.eachAsync(async (doc) => {
|
|
28
|
+
i += 1;
|
|
29
|
+
const movie: chevre.factory.creativeWork.movie.ICreativeWork = doc.toObject();
|
|
30
|
+
|
|
31
|
+
const availabilityEnds = movie.offers.availabilityEnds;
|
|
32
|
+
let availabilityStarts = movie.offers.availabilityStarts;
|
|
33
|
+
const createdAt: Date = (<any>movie).createdAt;
|
|
34
|
+
if (!(createdAt instanceof Date)) {
|
|
35
|
+
throw new Error('createdAt not Date');
|
|
36
|
+
}
|
|
37
|
+
const alreadyMigrated = availabilityStarts instanceof Date;
|
|
38
|
+
|
|
39
|
+
if (alreadyMigrated) {
|
|
40
|
+
console.log('already exist...', movie.project.id, movie.id, movie.identifier, availabilityStarts, availabilityEnds, i);
|
|
41
|
+
} else {
|
|
42
|
+
if (movie.datePublished === undefined) {
|
|
43
|
+
console.error('movie.datePublished undefined', movie.project.id, movie.id, movie.identifier, i);
|
|
44
|
+
// throw new Error('movie.datePublished undefined');
|
|
45
|
+
datePublishedUndefinedCount += 1;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
availabilityStarts = (movie.datePublished !== undefined)
|
|
49
|
+
? moment(movie.datePublished)
|
|
50
|
+
.toDate()
|
|
51
|
+
: moment(createdAt)
|
|
52
|
+
.toDate();
|
|
53
|
+
console.log('updating movie...', movie.project.id, movie.id, movie.identifier, availabilityStarts, availabilityEnds, i);
|
|
54
|
+
await creativeWorkRepo.saveMovie(<any>{
|
|
55
|
+
id: String(movie.id),
|
|
56
|
+
'offers.availabilityStarts': availabilityStarts
|
|
57
|
+
});
|
|
58
|
+
updateCount += 1;
|
|
59
|
+
console.log('updated.', movie.project.id, movie.id, movie.identifier, availabilityStarts, availabilityEnds, i);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
console.log(i, 'creativeWorks checked');
|
|
64
|
+
console.log(updateCount, 'creativeWorks updated');
|
|
65
|
+
console.log(datePublishedUndefinedCount, 'datePublishedUndefinedCount');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
main()
|
|
69
|
+
.then()
|
|
70
|
+
.catch(console.error);
|
|
@@ -24,7 +24,7 @@ class MongoRepository {
|
|
|
24
24
|
}
|
|
25
25
|
// tslint:disable-next-line:cyclomatic-complexity max-func-body-length
|
|
26
26
|
static CREATE_MONGO_CONDITIONS(params) {
|
|
27
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21;
|
|
27
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24;
|
|
28
28
|
const andConditions = [
|
|
29
29
|
{
|
|
30
30
|
typeOf: params.typeOf
|
|
@@ -176,7 +176,11 @@ class MongoRepository {
|
|
|
176
176
|
case factory.assetTransactionType.CancelReservation:
|
|
177
177
|
break;
|
|
178
178
|
case factory.assetTransactionType.Reserve:
|
|
179
|
-
const
|
|
179
|
+
const objectProviderIdEq = (_y = (_x = (_w = params.object) === null || _w === void 0 ? void 0 : _w.provider) === null || _x === void 0 ? void 0 : _x.id) === null || _y === void 0 ? void 0 : _y.$eq;
|
|
180
|
+
if (typeof objectProviderIdEq === 'string') {
|
|
181
|
+
andConditions.push({ 'object.provider.id': { $exists: true, $eq: objectProviderIdEq } });
|
|
182
|
+
}
|
|
183
|
+
const objectReservationForIdEq = (_1 = (_0 = (_z = params.object) === null || _z === void 0 ? void 0 : _z.reservationFor) === null || _0 === void 0 ? void 0 : _0.id) === null || _1 === void 0 ? void 0 : _1.$eq;
|
|
180
184
|
if (typeof objectReservationForIdEq === 'string') {
|
|
181
185
|
andConditions.push({
|
|
182
186
|
'object.reservationFor.id': {
|
|
@@ -185,7 +189,7 @@ class MongoRepository {
|
|
|
185
189
|
}
|
|
186
190
|
});
|
|
187
191
|
}
|
|
188
|
-
const objectReservationNumberIn = (
|
|
192
|
+
const objectReservationNumberIn = (_3 = (_2 = params.object) === null || _2 === void 0 ? void 0 : _2.reservationNumber) === null || _3 === void 0 ? void 0 : _3.$in;
|
|
189
193
|
if (Array.isArray(objectReservationNumberIn)) {
|
|
190
194
|
andConditions.push({
|
|
191
195
|
'object.reservationNumber': {
|
|
@@ -194,7 +198,7 @@ class MongoRepository {
|
|
|
194
198
|
}
|
|
195
199
|
});
|
|
196
200
|
}
|
|
197
|
-
const objectReservationNumberEq = (
|
|
201
|
+
const objectReservationNumberEq = (_5 = (_4 = params.object) === null || _4 === void 0 ? void 0 : _4.reservationNumber) === null || _5 === void 0 ? void 0 : _5.$eq;
|
|
198
202
|
if (typeof objectReservationNumberEq === 'string') {
|
|
199
203
|
andConditions.push({
|
|
200
204
|
'object.reservationNumber': {
|
|
@@ -203,7 +207,7 @@ class MongoRepository {
|
|
|
203
207
|
}
|
|
204
208
|
});
|
|
205
209
|
}
|
|
206
|
-
const objectSubReservationIdIn = (
|
|
210
|
+
const objectSubReservationIdIn = (_8 = (_7 = (_6 = params.object) === null || _6 === void 0 ? void 0 : _6.reservations) === null || _7 === void 0 ? void 0 : _7.id) === null || _8 === void 0 ? void 0 : _8.$in;
|
|
207
211
|
if (Array.isArray(objectSubReservationIdIn)) {
|
|
208
212
|
andConditions.push({
|
|
209
213
|
'object.subReservation.id': {
|
|
@@ -238,7 +242,7 @@ class MongoRepository {
|
|
|
238
242
|
}
|
|
239
243
|
}
|
|
240
244
|
}
|
|
241
|
-
const objectUnderNameIdEq = (
|
|
245
|
+
const objectUnderNameIdEq = (_11 = (_10 = (_9 = params.object) === null || _9 === void 0 ? void 0 : _9.underName) === null || _10 === void 0 ? void 0 : _10.id) === null || _11 === void 0 ? void 0 : _11.$eq;
|
|
242
246
|
if (typeof objectUnderNameIdEq === 'string') {
|
|
243
247
|
andConditions.push({
|
|
244
248
|
'object.underName.id': {
|
|
@@ -247,7 +251,7 @@ class MongoRepository {
|
|
|
247
251
|
}
|
|
248
252
|
});
|
|
249
253
|
}
|
|
250
|
-
const objectSubReservationSeatNumberEq = (
|
|
254
|
+
const objectSubReservationSeatNumberEq = (_16 = (_15 = (_14 = (_13 = (_12 = params.object) === null || _12 === void 0 ? void 0 : _12.reservations) === null || _13 === void 0 ? void 0 : _13.reservedTicket) === null || _14 === void 0 ? void 0 : _14.ticketedSeat) === null || _15 === void 0 ? void 0 : _15.seatNumber) === null || _16 === void 0 ? void 0 : _16.$eq;
|
|
251
255
|
if (typeof objectSubReservationSeatNumberEq === 'string') {
|
|
252
256
|
andConditions.push({
|
|
253
257
|
'object.subReservation.reservedTicket.ticketedSeat.seatNumber': {
|
|
@@ -258,7 +262,7 @@ class MongoRepository {
|
|
|
258
262
|
}
|
|
259
263
|
break;
|
|
260
264
|
case factory.assetTransactionType.RegisterService:
|
|
261
|
-
const objectItemOfferedServiceOutputIdentifierEq = (
|
|
265
|
+
const objectItemOfferedServiceOutputIdentifierEq = (_20 = (_19 = (_18 = (_17 = params.object) === null || _17 === void 0 ? void 0 : _17.itemOffered) === null || _18 === void 0 ? void 0 : _18.serviceOutput) === null || _19 === void 0 ? void 0 : _19.identifier) === null || _20 === void 0 ? void 0 : _20.$eq;
|
|
262
266
|
if (typeof objectItemOfferedServiceOutputIdentifierEq === 'string') {
|
|
263
267
|
andConditions.push({
|
|
264
268
|
'object.itemOffered.serviceOutput.identifier': {
|
|
@@ -267,7 +271,7 @@ class MongoRepository {
|
|
|
267
271
|
}
|
|
268
272
|
});
|
|
269
273
|
}
|
|
270
|
-
const objectItemOfferedServiceOutputIdentifierIn = (
|
|
274
|
+
const objectItemOfferedServiceOutputIdentifierIn = (_24 = (_23 = (_22 = (_21 = params.object) === null || _21 === void 0 ? void 0 : _21.itemOffered) === null || _22 === void 0 ? void 0 : _22.serviceOutput) === null || _23 === void 0 ? void 0 : _23.identifier) === null || _24 === void 0 ? void 0 : _24.$in;
|
|
271
275
|
if (Array.isArray(objectItemOfferedServiceOutputIdentifierIn)) {
|
|
272
276
|
andConditions.push({
|
|
273
277
|
'object.itemOffered.serviceOutput.identifier': {
|
|
@@ -33,7 +33,7 @@ class MongoRepository {
|
|
|
33
33
|
}
|
|
34
34
|
// tslint:disable-next-line:max-func-body-length
|
|
35
35
|
static CREATE_MONGO_CONDITIONS(params) {
|
|
36
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
36
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
37
37
|
// MongoDB検索条件
|
|
38
38
|
const andConditions = [
|
|
39
39
|
{
|
|
@@ -140,31 +140,15 @@ class MongoRepository {
|
|
|
140
140
|
}
|
|
141
141
|
});
|
|
142
142
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
'offers.availabilityEnds': {
|
|
151
|
-
$exists: true,
|
|
152
|
-
$gte: params.offers.availableFrom
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
// tslint:disable-next-line:no-single-line-block-comment
|
|
157
|
-
/* istanbul ignore else */
|
|
158
|
-
if (params.offers.availableThrough instanceof Date) {
|
|
159
|
-
andConditions.push({
|
|
160
|
-
'offers.availabilityStarts': {
|
|
161
|
-
$exists: true,
|
|
162
|
-
$lte: params.offers.availableThrough
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
}
|
|
143
|
+
const offersAvailableFrom = (_k = params.offers) === null || _k === void 0 ? void 0 : _k.availableFrom;
|
|
144
|
+
if (offersAvailableFrom instanceof Date) {
|
|
145
|
+
andConditions.push({ 'offers.availabilityEnds': { $exists: true, $gte: offersAvailableFrom } });
|
|
146
|
+
}
|
|
147
|
+
const offersAvailableThrough = (_l = params.offers) === null || _l === void 0 ? void 0 : _l.availableThrough;
|
|
148
|
+
if (offersAvailableThrough instanceof Date) {
|
|
149
|
+
andConditions.push({ 'offers.availabilityStarts': { $exists: true, $lte: offersAvailableThrough } });
|
|
166
150
|
}
|
|
167
|
-
const additionalPropertyElemMatch = (
|
|
151
|
+
const additionalPropertyElemMatch = (_m = params.additionalProperty) === null || _m === void 0 ? void 0 : _m.$elemMatch;
|
|
168
152
|
if (additionalPropertyElemMatch !== undefined && additionalPropertyElemMatch !== null) {
|
|
169
153
|
andConditions.push({
|
|
170
154
|
additionalProperty: {
|
|
@@ -99,6 +99,12 @@ schema.index({ 'object.paymentMethodId': 1, startDate: -1 }, {
|
|
|
99
99
|
'object.paymentMethodId': { $exists: true }
|
|
100
100
|
}
|
|
101
101
|
});
|
|
102
|
+
schema.index({ 'object.provider.id': 1, startDate: -1 }, {
|
|
103
|
+
name: 'searchByObjectProviderId',
|
|
104
|
+
partialFilterExpression: {
|
|
105
|
+
'object.provider.id': { $exists: true }
|
|
106
|
+
}
|
|
107
|
+
});
|
|
102
108
|
schema.index({ 'object.subReservation.id': 1, startDate: -1 }, {
|
|
103
109
|
name: 'searchByObjectSubReservationsId',
|
|
104
110
|
partialFilterExpression: {
|
|
@@ -18,15 +18,23 @@ export type ITransactionOperation<T> = (repos: {
|
|
|
18
18
|
/**
|
|
19
19
|
* 取引開始
|
|
20
20
|
*/
|
|
21
|
-
export declare function start(params: factory.assetTransaction.cancelReservation.IStartParamsWithoutDetail
|
|
21
|
+
export declare function start(params: factory.assetTransaction.cancelReservation.IStartParamsWithoutDetail & {
|
|
22
|
+
seller: {
|
|
23
|
+
id?: string;
|
|
24
|
+
};
|
|
25
|
+
}): IStartOperation<factory.assetTransaction.cancelReservation.ITransaction>;
|
|
22
26
|
/**
|
|
23
27
|
* 取引確定
|
|
24
28
|
*/
|
|
25
29
|
export declare function confirm(params: factory.assetTransaction.cancelReservation.IConfirmParams): ITransactionOperation<void>;
|
|
26
30
|
/**
|
|
27
|
-
*
|
|
31
|
+
* 取引開始&確定
|
|
28
32
|
*/
|
|
29
|
-
export declare function startAndConfirm(params: factory.assetTransaction.cancelReservation.IStartParamsWithoutDetail & {
|
|
33
|
+
export declare function startAndConfirm(params: factory.assetTransaction.cancelReservation.IStartParamsWithoutDetail & {
|
|
34
|
+
seller: {
|
|
35
|
+
id?: string;
|
|
36
|
+
};
|
|
37
|
+
}): IStartOperation<factory.assetTransaction.cancelReservation.ITransaction>;
|
|
30
38
|
/**
|
|
31
39
|
* 取引タスク出力
|
|
32
40
|
*/
|
|
@@ -18,16 +18,17 @@ const factory = require("../../factory");
|
|
|
18
18
|
const factory_1 = require("./cancelReservation/factory");
|
|
19
19
|
function validateStartParams(params) {
|
|
20
20
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
var _a, _b;
|
|
21
|
+
var _a, _b, _c, _d;
|
|
22
22
|
let reserveTransaction;
|
|
23
23
|
let reservations;
|
|
24
|
+
const sellerId = (_a = params.seller) === null || _a === void 0 ? void 0 : _a.id;
|
|
24
25
|
// 予約番号で取引存在確認
|
|
25
|
-
if (typeof ((
|
|
26
|
+
if (typeof ((_b = params.object.reservation) === null || _b === void 0 ? void 0 : _b.reservationNumber) === 'string') {
|
|
26
27
|
const transactions = yield repos.assetTransaction.search({
|
|
27
28
|
limit: 1,
|
|
28
29
|
page: 1,
|
|
29
30
|
typeOf: factory.assetTransactionType.Reserve,
|
|
30
|
-
object: { reservationNumber: { $eq: params.object.reservation.reservationNumber } }
|
|
31
|
+
object: Object.assign({ reservationNumber: { $eq: params.object.reservation.reservationNumber } }, (typeof sellerId === 'string') ? { provider: { id: { $eq: sellerId } } } : undefined)
|
|
31
32
|
});
|
|
32
33
|
reserveTransaction = transactions.shift();
|
|
33
34
|
// ここでReservationConfirmedでない予約をスルーしても、
|
|
@@ -48,15 +49,21 @@ function validateStartParams(params) {
|
|
|
48
49
|
// 取引指定が確認できなければ、予約指定を確認
|
|
49
50
|
if (reserveTransaction === undefined) {
|
|
50
51
|
// 予約存在確認
|
|
51
|
-
if (typeof ((
|
|
52
|
+
if (typeof ((_c = params.object.reservation) === null || _c === void 0 ? void 0 : _c.id) === 'string') {
|
|
52
53
|
const reservation = yield repos.reservation.findById({
|
|
53
54
|
id: params.object.reservation.id
|
|
54
55
|
});
|
|
55
|
-
|
|
56
|
+
// 販売者検証(2023-08-01~)
|
|
57
|
+
if (typeof sellerId === 'string') {
|
|
58
|
+
if (((_d = reservation.provider) === null || _d === void 0 ? void 0 : _d.id) !== sellerId) {
|
|
59
|
+
throw new factory.errors.NotFound(factory.reservationType.EventReservation);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
56
62
|
// 予約ステータス確認
|
|
57
63
|
if (reservation.reservationStatus !== factory.reservationStatusType.ReservationConfirmed) {
|
|
58
64
|
throw new factory.errors.Argument('object.reservation.id', `Reservation ${reservation.id} not confirmed`);
|
|
59
65
|
}
|
|
66
|
+
reservations = [reservation];
|
|
60
67
|
}
|
|
61
68
|
}
|
|
62
69
|
if (reserveTransaction === undefined && reservations === undefined) {
|
|
@@ -125,7 +132,7 @@ function confirm(params) {
|
|
|
125
132
|
}
|
|
126
133
|
exports.confirm = confirm;
|
|
127
134
|
/**
|
|
128
|
-
*
|
|
135
|
+
* 取引開始&確定
|
|
129
136
|
*/
|
|
130
137
|
function startAndConfirm(params) {
|
|
131
138
|
return (repos) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -37,7 +37,7 @@ function createEvent(params) {
|
|
|
37
37
|
const firstCreatingEventParams = creatingEventParams[0];
|
|
38
38
|
const movieTheaters = yield repos.place.searchMovieTheaters({
|
|
39
39
|
project: { id: { $eq: actionAttributes.project.id } }
|
|
40
|
-
}, ['_id', 'branchCode', 'kanaName', 'name'], []);
|
|
40
|
+
}, ['_id', 'branchCode', 'kanaName', 'name', 'parentOrganization'], []);
|
|
41
41
|
creatingEventParams = movieTheaters.map((movieTheater) => {
|
|
42
42
|
const location = {
|
|
43
43
|
branchCode: movieTheater.branchCode,
|
|
@@ -46,8 +46,13 @@ function createEvent(params) {
|
|
|
46
46
|
name: movieTheater.name,
|
|
47
47
|
typeOf: factory.placeType.MovieTheater
|
|
48
48
|
};
|
|
49
|
+
const organizer = {
|
|
50
|
+
id: movieTheater.parentOrganization.id
|
|
51
|
+
};
|
|
49
52
|
return {
|
|
50
|
-
attributes: Object.assign(Object.assign({}, firstCreatingEventParams.attributes), { location
|
|
53
|
+
attributes: Object.assign(Object.assign({}, firstCreatingEventParams.attributes), { location,
|
|
54
|
+
// organizerがfirstCreatingEventParamsにそろってしまうbug対応(2023-08-03~)
|
|
55
|
+
organizer })
|
|
51
56
|
};
|
|
52
57
|
});
|
|
53
58
|
}
|
package/package.json
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
}
|
|
10
10
|
],
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@chevre/factory": "4.
|
|
13
|
-
"@cinerino/sdk": "3.162.
|
|
12
|
+
"@chevre/factory": "4.321.1",
|
|
13
|
+
"@cinerino/sdk": "3.162.1",
|
|
14
14
|
"@motionpicture/coa-service": "9.2.0",
|
|
15
15
|
"@motionpicture/gmo-service": "5.2.0",
|
|
16
16
|
"@sendgrid/mail": "6.4.0",
|
|
@@ -117,5 +117,5 @@
|
|
|
117
117
|
"postversion": "git push origin --tags",
|
|
118
118
|
"prepublishOnly": "npm run clean && npm run build && npm test && npm run doc"
|
|
119
119
|
},
|
|
120
|
-
"version": "21.5.0-alpha.
|
|
120
|
+
"version": "21.5.0-alpha.5"
|
|
121
121
|
}
|