cnpmcore 4.25.1 → 4.27.0
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.
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import { AbstractController } from './AbstractController.ts';
|
|
2
2
|
export declare class DownloadController extends AbstractController {
|
|
3
3
|
private packageVersionDownloadRepository;
|
|
4
|
+
showPackageDownloadPoint(fullname: string, range: string): Promise<{
|
|
5
|
+
downloads: number;
|
|
6
|
+
start: string;
|
|
7
|
+
end: string;
|
|
8
|
+
package: string;
|
|
9
|
+
}>;
|
|
10
|
+
showTotalDownloadPoint(range: string): Promise<{
|
|
11
|
+
downloads: number;
|
|
12
|
+
start: string;
|
|
13
|
+
end: string;
|
|
14
|
+
}>;
|
|
4
15
|
showPackageDownloads(fullname: string, range: string): Promise<{
|
|
5
16
|
downloads: {
|
|
6
17
|
day: string;
|
|
7
18
|
downloads: number;
|
|
8
19
|
}[];
|
|
20
|
+
start: string;
|
|
21
|
+
end: string;
|
|
22
|
+
package: string;
|
|
9
23
|
versions: Record<string, {
|
|
10
24
|
day: string;
|
|
11
25
|
downloads: number;
|
|
@@ -16,6 +30,10 @@ export declare class DownloadController extends AbstractController {
|
|
|
16
30
|
day: string;
|
|
17
31
|
downloads: number;
|
|
18
32
|
}[];
|
|
33
|
+
start: string;
|
|
34
|
+
end: string;
|
|
19
35
|
}>;
|
|
36
|
+
private getDayRange;
|
|
37
|
+
private sumDownloads;
|
|
20
38
|
private checkAndGetRange;
|
|
21
39
|
}
|
|
@@ -11,25 +11,50 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { HTTPController, HTTPMethod, HTTPMethodEnum, HTTPParam, Inject } from 'egg';
|
|
14
|
-
import {
|
|
14
|
+
import { UnprocessableEntityError } from 'egg/errors';
|
|
15
15
|
import dayjs from "../../common/dayjs.js";
|
|
16
|
-
import { FULLNAME_REG_STRING
|
|
16
|
+
import { FULLNAME_REG_STRING } from "../../common/PackageUtil.js";
|
|
17
17
|
import { AbstractController } from "./AbstractController.js";
|
|
18
18
|
const DATE_FORMAT = 'YYYY-MM-DD';
|
|
19
19
|
let DownloadController = class DownloadController extends AbstractController {
|
|
20
|
+
// npm compatible: /downloads/point/{period}/{package}
|
|
21
|
+
// @see https://github.com/npm/registry/blob/master/docs/download-counts.md
|
|
22
|
+
async showPackageDownloadPoint(fullname, range) {
|
|
23
|
+
const [startDate, endDate] = this.checkAndGetRange(range);
|
|
24
|
+
const pkg = await this.getPackageEntityByFullname(fullname);
|
|
25
|
+
const entities = await this.packageVersionDownloadRepository.query(pkg.packageId, startDate.toDate(), endDate.toDate());
|
|
26
|
+
const total = this.sumDownloads(entities, startDate, endDate);
|
|
27
|
+
return {
|
|
28
|
+
downloads: total,
|
|
29
|
+
start: startDate.format(DATE_FORMAT),
|
|
30
|
+
end: endDate.format(DATE_FORMAT),
|
|
31
|
+
package: fullname,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// /downloads/total/point/{period} (all packages, total count)
|
|
35
|
+
async showTotalDownloadPoint(range) {
|
|
36
|
+
const [startDate, endDate] = this.checkAndGetRange(range);
|
|
37
|
+
const entities = await this.packageVersionDownloadRepository.query('total', startDate.toDate(), endDate.toDate());
|
|
38
|
+
const total = this.sumDownloads(entities, startDate, endDate);
|
|
39
|
+
return {
|
|
40
|
+
downloads: total,
|
|
41
|
+
start: startDate.format(DATE_FORMAT),
|
|
42
|
+
end: endDate.format(DATE_FORMAT),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
20
45
|
async showPackageDownloads(fullname, range) {
|
|
21
46
|
const [startDate, endDate] = this.checkAndGetRange(range);
|
|
22
|
-
const
|
|
23
|
-
const pkg = await this.packageRepository.findPackage(scope, name);
|
|
24
|
-
if (!pkg)
|
|
25
|
-
throw new NotFoundError(`${fullname} not found`);
|
|
47
|
+
const pkg = await this.getPackageEntityByFullname(fullname);
|
|
26
48
|
const entities = await this.packageVersionDownloadRepository.query(pkg.packageId, startDate.toDate(), endDate.toDate());
|
|
27
49
|
const days = {};
|
|
28
50
|
const versions = {};
|
|
29
51
|
for (const entity of entities) {
|
|
30
|
-
const yearMonth =
|
|
31
|
-
const
|
|
32
|
-
|
|
52
|
+
const yearMonth = entity.yearMonth;
|
|
53
|
+
const yearStr = String(yearMonth).slice(0, 4);
|
|
54
|
+
const monthStr = String(yearMonth).slice(4, 6);
|
|
55
|
+
const prefix = `${yearStr}-${monthStr}`;
|
|
56
|
+
const [fromDay, toDay] = this.getDayRange(yearMonth, startDate, endDate);
|
|
57
|
+
for (let i = fromDay; i <= toDay; i++) {
|
|
33
58
|
const day = String(i).padStart(2, '0');
|
|
34
59
|
const field = `d${day}`;
|
|
35
60
|
const counter = entity[field];
|
|
@@ -52,6 +77,9 @@ let DownloadController = class DownloadController extends AbstractController {
|
|
|
52
77
|
}
|
|
53
78
|
return {
|
|
54
79
|
downloads,
|
|
80
|
+
start: startDate.format(DATE_FORMAT),
|
|
81
|
+
end: endDate.format(DATE_FORMAT),
|
|
82
|
+
package: fullname,
|
|
55
83
|
versions,
|
|
56
84
|
};
|
|
57
85
|
}
|
|
@@ -60,9 +88,12 @@ let DownloadController = class DownloadController extends AbstractController {
|
|
|
60
88
|
const entities = await this.packageVersionDownloadRepository.query(scope, startDate.toDate(), endDate.toDate());
|
|
61
89
|
const days = {};
|
|
62
90
|
for (const entity of entities) {
|
|
63
|
-
const yearMonth =
|
|
64
|
-
const
|
|
65
|
-
|
|
91
|
+
const yearMonth = entity.yearMonth;
|
|
92
|
+
const yearStr = String(yearMonth).slice(0, 4);
|
|
93
|
+
const monthStr = String(yearMonth).slice(4, 6);
|
|
94
|
+
const prefix = `${yearStr}-${monthStr}`;
|
|
95
|
+
const [fromDay, toDay] = this.getDayRange(yearMonth, startDate, endDate);
|
|
96
|
+
for (let i = fromDay; i <= toDay; i++) {
|
|
66
97
|
const day = String(i).padStart(2, '0');
|
|
67
98
|
const field = `d${day}`;
|
|
68
99
|
const counter = entity[field];
|
|
@@ -78,19 +109,79 @@ let DownloadController = class DownloadController extends AbstractController {
|
|
|
78
109
|
}
|
|
79
110
|
return {
|
|
80
111
|
downloads,
|
|
112
|
+
start: startDate.format(DATE_FORMAT),
|
|
113
|
+
end: endDate.format(DATE_FORMAT),
|
|
81
114
|
};
|
|
82
115
|
}
|
|
116
|
+
// Get the valid day range [startDay, endDay] for a given entity's yearMonth
|
|
117
|
+
// considering the requested date range boundaries
|
|
118
|
+
getDayRange(yearMonth, startDate, endDate) {
|
|
119
|
+
const year = Math.floor(yearMonth / 100);
|
|
120
|
+
const month = yearMonth % 100;
|
|
121
|
+
const startYM = startDate.year() * 100 + startDate.month() + 1;
|
|
122
|
+
const endYM = endDate.year() * 100 + endDate.month() + 1;
|
|
123
|
+
const entityYM = year * 100 + month;
|
|
124
|
+
// Days in this month
|
|
125
|
+
const daysInMonth = dayjs(`${year}-${String(month).padStart(2, '0')}-01`).daysInMonth();
|
|
126
|
+
let fromDay = 1;
|
|
127
|
+
let toDay = daysInMonth;
|
|
128
|
+
if (entityYM === startYM) {
|
|
129
|
+
fromDay = startDate.date();
|
|
130
|
+
}
|
|
131
|
+
if (entityYM === endYM) {
|
|
132
|
+
toDay = endDate.date();
|
|
133
|
+
}
|
|
134
|
+
return [fromDay, toDay];
|
|
135
|
+
}
|
|
136
|
+
sumDownloads(entities, startDate, endDate) {
|
|
137
|
+
let total = 0;
|
|
138
|
+
for (const entity of entities) {
|
|
139
|
+
const [fromDay, toDay] = this.getDayRange(entity.yearMonth, startDate, endDate);
|
|
140
|
+
for (let i = fromDay; i <= toDay; i++) {
|
|
141
|
+
const field = `d${String(i).padStart(2, '0')}`;
|
|
142
|
+
const counter = entity[field];
|
|
143
|
+
if (counter)
|
|
144
|
+
total += counter;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return total;
|
|
148
|
+
}
|
|
83
149
|
checkAndGetRange(range) {
|
|
150
|
+
// Support npm-compatible period aliases
|
|
151
|
+
// @see https://github.com/npm/registry/blob/master/docs/download-counts.md
|
|
152
|
+
const today = dayjs();
|
|
153
|
+
switch (range) {
|
|
154
|
+
case 'last-day':
|
|
155
|
+
return [today.subtract(1, 'day'), today.subtract(1, 'day')];
|
|
156
|
+
case 'last-week':
|
|
157
|
+
return [today.subtract(7, 'day'), today.subtract(1, 'day')];
|
|
158
|
+
case 'last-month':
|
|
159
|
+
return [today.subtract(30, 'day'), today.subtract(1, 'day')];
|
|
160
|
+
case 'last-year':
|
|
161
|
+
return [today.subtract(365, 'day'), today.subtract(1, 'day')];
|
|
162
|
+
default:
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
// Support single date: YYYY-MM-DD
|
|
166
|
+
const singleDateMatch = /^(\d{4}-\d{2}-\d{2})$/.exec(range);
|
|
167
|
+
if (singleDateMatch) {
|
|
168
|
+
const date = dayjs(singleDateMatch[1], DATE_FORMAT, true);
|
|
169
|
+
if (!date.isValid()) {
|
|
170
|
+
throw new UnprocessableEntityError(`range(${range}) format invalid, must be "last-day", "last-week", "last-month", "last-year", "${DATE_FORMAT}" or "${DATE_FORMAT}:${DATE_FORMAT}" style`);
|
|
171
|
+
}
|
|
172
|
+
return [date, date];
|
|
173
|
+
}
|
|
174
|
+
// Support date range: YYYY-MM-DD:YYYY-MM-DD
|
|
84
175
|
const matchs = /^(\d{4}-\d{2}-\d{2}):(\d{4}-\d{2}-\d{2})$/.exec(range);
|
|
85
176
|
if (!matchs) {
|
|
86
|
-
throw new UnprocessableEntityError(`range(${range}) format invalid, must be "${DATE_FORMAT}:${DATE_FORMAT}" style`);
|
|
177
|
+
throw new UnprocessableEntityError(`range(${range}) format invalid, must be "last-day", "last-week", "last-month", "last-year", "${DATE_FORMAT}" or "${DATE_FORMAT}:${DATE_FORMAT}" style`);
|
|
87
178
|
}
|
|
88
179
|
const start = matchs[1];
|
|
89
180
|
const end = matchs[2];
|
|
90
181
|
let startDate = dayjs(start, DATE_FORMAT, true);
|
|
91
182
|
let endDate = dayjs(end, DATE_FORMAT, true);
|
|
92
183
|
if (!startDate.isValid() || !endDate.isValid()) {
|
|
93
|
-
throw new UnprocessableEntityError(`range(${range}) format invalid, must be "${DATE_FORMAT}:${DATE_FORMAT}" style`);
|
|
184
|
+
throw new UnprocessableEntityError(`range(${range}) format invalid, must be "last-day", "last-week", "last-month", "last-year", "${DATE_FORMAT}" or "${DATE_FORMAT}:${DATE_FORMAT}" style`);
|
|
94
185
|
}
|
|
95
186
|
if (endDate.isBefore(startDate)) {
|
|
96
187
|
const tmp = startDate;
|
|
@@ -109,6 +200,27 @@ __decorate([
|
|
|
109
200
|
Inject(),
|
|
110
201
|
__metadata("design:type", Function)
|
|
111
202
|
], DownloadController.prototype, "packageVersionDownloadRepository", void 0);
|
|
203
|
+
__decorate([
|
|
204
|
+
HTTPMethod({
|
|
205
|
+
path: `/downloads/point/:range/:fullname(${FULLNAME_REG_STRING})`,
|
|
206
|
+
method: HTTPMethodEnum.GET,
|
|
207
|
+
}),
|
|
208
|
+
__param(0, HTTPParam()),
|
|
209
|
+
__param(1, HTTPParam()),
|
|
210
|
+
__metadata("design:type", Function),
|
|
211
|
+
__metadata("design:paramtypes", [String, String]),
|
|
212
|
+
__metadata("design:returntype", Promise)
|
|
213
|
+
], DownloadController.prototype, "showPackageDownloadPoint", null);
|
|
214
|
+
__decorate([
|
|
215
|
+
HTTPMethod({
|
|
216
|
+
path: '/downloads/total/point/:range',
|
|
217
|
+
method: HTTPMethodEnum.GET,
|
|
218
|
+
}),
|
|
219
|
+
__param(0, HTTPParam()),
|
|
220
|
+
__metadata("design:type", Function),
|
|
221
|
+
__metadata("design:paramtypes", [String]),
|
|
222
|
+
__metadata("design:returntype", Promise)
|
|
223
|
+
], DownloadController.prototype, "showTotalDownloadPoint", null);
|
|
112
224
|
__decorate([
|
|
113
225
|
HTTPMethod({
|
|
114
226
|
path: `/downloads/range/:range/:fullname(${FULLNAME_REG_STRING})`,
|
|
@@ -135,4 +247,4 @@ DownloadController = __decorate([
|
|
|
135
247
|
HTTPController()
|
|
136
248
|
], DownloadController);
|
|
137
249
|
export { DownloadController };
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG93bmxvYWRDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9Eb3dubG9hZENvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEYsT0FBTyxFQUFFLGFBQWEsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVyRSxPQUFPLEtBQUssTUFBTSx1QkFBdUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDO0FBRzFCLElBQU0sa0JBQWtCLEdBQXhCLE1BQU0sa0JBQW1CLFNBQVEsa0JBQWtCO0lBUWxELEFBQU4sS0FBSyxDQUFDLG9CQUFvQixDQUFjLFFBQWdCLEVBQWUsS0FBYTtRQUNsRixNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxHQUFHO1lBQUUsTUFBTSxJQUFJLGFBQWEsQ0FBQyxHQUFHLFFBQVEsWUFBWSxDQUFDLENBQUM7UUFDM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENB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
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG93bmxvYWRDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9Eb3dubG9hZENvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRELE9BQU8sS0FBSyxNQUFNLHVCQUF1QixDQUFDO0FBQzFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTdELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQztBQUcxQixJQUFNLGtCQUFrQixHQUF4QixNQUFNLGtCQUFtQixTQUFRLGtCQUFrQjtJQUl4RCxzREFBc0Q7SUFDdEQsMkVBQTJFO0lBS3JFLEFBQU4sS0FBSyxDQUFDLHdCQUF3QixDQUFjLFFBQWdCLEVBQWUsS0FBYTtRQUN0RixNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQ2hFLEdBQUcsQ0FBQyxTQUFTLEVBQ2IsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUNsQixPQUFPLENBQUMsTUFBTSxFQUFFLENBQ2pCLENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsT0FBTztZQUNMLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNwQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDaEMsT0FBTyxFQUFFLFFBQVE7U0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFRCw4REFBOEQ7SUFLeEQsQUFBTixLQUFLLENBQUMsc0JBQXNCLENBQWMsS0FBYTtRQUNyRCxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNsSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsT0FBTztZQUNMLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNwQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7U0FDakMsQ0FBQztJQUNKLENBQUM7SUFNSyxBQUFOLEtBQUssQ0FBQyxvQkFBb0IsQ0FBYyxRQUFnQixFQUFlLEtBQWE7UUFDbEYsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsS0FBSyxDQUNoRSxHQUFHLENBQUMsU0FBUyxFQUNiLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFDbEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUNqQixDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBeUQsRUFBRSxDQUFDO1FBQzFFLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQW1CLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDekUsS0FBSyxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7Z0JBQy9DLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQVcsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE9BQU87b0JBQUUsU0FBUztnQkFDdkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQ3pDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDM0IsK0JBQStCO29CQUMvQixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM3RCxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBeUMsRUFBRSxDQUFDO1FBQzNELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU87WUFDTCxTQUFTO1lBQ1QsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3BDLEdBQUcsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNoQyxPQUFPLEVBQUUsUUFBUTtZQUNqQixRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFNSyxBQUFOLEtBQUssQ0FBQyxrQkFBa0IsQ0FBYyxLQUFhLEVBQWUsS0FBYTtRQUM3RSxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoSCxNQUFNLElBQUksR0FBMkIsRUFBRSxDQUFDO1FBQ3hDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQW1CLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDekUsS0FBSyxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7Z0JBQy9DLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQVcsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE9BQU87b0JBQUUsU0FBUztnQkFDdkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBeUMsRUFBRSxDQUFDO1FBQzNELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU87WUFDTCxTQUFTO1lBQ1QsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3BDLEdBQUcsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztTQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxrREFBa0Q7SUFDMUMsV0FBVyxDQUFDLFNBQWlCLEVBQUUsU0FBc0IsRUFBRSxPQUFvQjtRQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDcEMscUJBQXFCO1FBQ3JCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQztRQUN4QixJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN6QixPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2QixLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTyxZQUFZLENBQ2xCLFFBQTBDLEVBQzFDLFNBQXNCLEVBQ3RCLE9BQW9CO1FBRXBCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hGLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBa0MsQ0FBQztnQkFDL0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBVyxDQUFDO2dCQUN4QyxJQUFJLE9BQU87b0JBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQWE7UUFDcEMsd0NBQXdDO1FBQ3hDLDJFQUEyRTtRQUMzRSxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN0QixRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ2QsS0FBSyxVQUFVO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlELEtBQUssV0FBVztnQkFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5RCxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDL0QsS0FBSyxXQUFXO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hFO2dCQUNFLE1BQU07UUFDVixDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLE1BQU0sZUFBZSxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLHdCQUF3QixDQUNoQyxTQUFTLEtBQUssa0ZBQWtGLFdBQVcsU0FBUyxXQUFXLElBQUksV0FBVyxTQUFTLENBQ3hKLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsNENBQTRDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksd0JBQXdCLENBQ2hDLFNBQVMsS0FBSyxrRkFBa0YsV0FBVyxTQUFTLFdBQVcsSUFBSSxXQUFXLFNBQVMsQ0FDeEosQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksd0JBQXdCLENBQ2hDLFNBQVMsS0FBSyxrRkFBa0YsV0FBVyxTQUFTLFdBQVcsSUFBSSxXQUFXLFNBQVMsQ0FDeEosQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUM7WUFDdEIsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUNwQixPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUM7UUFDRCx5QkFBeUI7UUFDekIsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLHdCQUF3QixDQUNoQyxTQUFTLEtBQUssOENBQThDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FDM0YsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRixDQUFBO0FBOU5TO0lBRFAsTUFBTSxFQUFFOzs0RUFDa0U7QUFRckU7SUFKTCxVQUFVLENBQUM7UUFDVixJQUFJLEVBQUUscUNBQXFDLG1CQUFtQixHQUFHO1FBQ2pFLE1BQU0sRUFBRSxjQUFjLENBQUMsR0FBRztLQUMzQixDQUFDO0lBQzhCLFdBQUEsU0FBUyxFQUFFLENBQUE7SUFBb0IsV0FBQSxTQUFTLEVBQUUsQ0FBQTs7OztrRUFlekU7QUFPSztJQUpMLFVBQVUsQ0FBQztRQUNWLElBQUksRUFBRSwrQkFBK0I7UUFDckMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxHQUFHO0tBQzNCLENBQUM7SUFDNEIsV0FBQSxTQUFTLEVBQUUsQ0FBQTs7OztnRUFTeEM7QUFNSztJQUpMLFVBQVUsQ0FBQztRQUNWLElBQUksRUFBRSxxQ0FBcUMsbUJBQW1CLEdBQUc7UUFDakUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxHQUFHO0tBQzNCLENBQUM7SUFDMEIsV0FBQSxTQUFTLEVBQUUsQ0FBQTtJQUFvQixXQUFBLFNBQVMsRUFBRSxDQUFBOzs7OzhEQTJDckU7QUFNSztJQUpMLFVBQVUsQ0FBQztRQUNWLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxHQUFHO0tBQzNCLENBQUM7SUFDd0IsV0FBQSxTQUFTLEVBQUUsQ0FBQTtJQUFpQixXQUFBLFNBQVMsRUFBRSxDQUFBOzs7OzREQTZCaEU7QUE3SFUsa0JBQWtCO0lBRDlCLGNBQWMsRUFBRTtHQUNKLGtCQUFrQixDQWdPOUIifQ==
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
2
|
import Mock from '@elastic/elasticsearch-mock';
|
|
3
|
+
import RedisMock from 'ioredis-mock';
|
|
3
4
|
import { database } from "./database.js";
|
|
4
5
|
// @ts-expect-error has no construct signatures
|
|
5
6
|
export const mockES = new Mock();
|
|
@@ -17,6 +18,20 @@ export default function startConfig(appInfo) {
|
|
|
17
18
|
config.cnpmcore = {
|
|
18
19
|
checkChangesStreamInterval: 10,
|
|
19
20
|
};
|
|
21
|
+
// Use ioredis-mock for faster tests without a real Redis server
|
|
22
|
+
config.redis = {
|
|
23
|
+
Redis: RedisMock,
|
|
24
|
+
client: {
|
|
25
|
+
// ioredis-mock ignores these, but they satisfy the config schema
|
|
26
|
+
host: '127.0.0.1',
|
|
27
|
+
port: 6379,
|
|
28
|
+
password: '',
|
|
29
|
+
db: 0,
|
|
30
|
+
// Skip ready check — ioredis-mock emits 'ready' synchronously
|
|
31
|
+
// before @eggjs/redis registerBeforeStart listener is attached
|
|
32
|
+
weakDependent: true,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
20
35
|
config.elasticsearch = {
|
|
21
36
|
client: {
|
|
22
37
|
node: 'http://localhost:9200',
|
|
@@ -25,4 +40,4 @@ export default function startConfig(appInfo) {
|
|
|
25
40
|
};
|
|
26
41
|
return config;
|
|
27
42
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnVuaXR0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29uZmlnL2NvbmZpZy51bml0dGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sSUFBSSxNQUFNLDZCQUE2QixDQUFDO0FBRS9DLE9BQU8sU0FBUyxNQUFNLGNBQWMsQ0FBQztBQUVyQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLCtDQUErQztBQUMvQyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUVqQyxNQUFNLENBQUMsT0FBTyxVQUFVLFdBQVcsQ0FBQyxPQUFtQjtJQUNyRCxNQUFNLE1BQU0sR0FBRyxFQUFzQixDQUFDO0lBRXRDLDRFQUE0RTtJQUM1RSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDO0lBRXBELE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRWxELE1BQU0sQ0FBQyxHQUFHLEdBQUc7UUFDWCxRQUFRLEVBQUUsTUFBTTtLQUNqQixDQUFDO0lBRUYsTUFBTSxDQUFDLEdBQUcsR0FBRztRQUNYLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7S0FDakMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsMEJBQTBCLEVBQUUsRUFBRTtLQUMvQixDQUFDO0lBRUYsZ0VBQWdFO0lBQ2hFLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUU7WUFDTixpRUFBaUU7WUFDakUsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLElBQUk7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLEVBQUUsRUFBRSxDQUFDO1lBQ0wsOERBQThEO1lBQzlELCtEQUErRDtZQUMvRCxhQUFhLEVBQUUsSUFBSTtTQUNwQjtLQUNGLENBQUM7SUFFRixNQUFNLENBQUMsYUFBYSxHQUFHO1FBQ3JCLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSx1QkFBdUI7WUFDN0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUU7U0FDbkM7S0FDRixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cnpmcore",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.27.0",
|
|
4
4
|
"description": "Private NPM Registry for Enterprise",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"npm",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"@eggjs/tsconfig": "^3.1.2-beta.2",
|
|
132
132
|
"@elastic/elasticsearch-mock": "^2.1.0",
|
|
133
133
|
"@simplewebauthn/typescript-types": "^7.4.0",
|
|
134
|
+
"@types/ioredis-mock": "^8.2.6",
|
|
134
135
|
"@types/lodash-es": "^4.17.12",
|
|
135
136
|
"@types/mime-types": "^3.0.1",
|
|
136
137
|
"@types/mysql": "^2.15.27",
|
|
@@ -143,8 +144,9 @@
|
|
|
143
144
|
"@types/validate-npm-package-name": "^4.0.2",
|
|
144
145
|
"coffee": "^5.5.1",
|
|
145
146
|
"husky": "^9.1.7",
|
|
147
|
+
"ioredis-mock": "^8.13.1",
|
|
146
148
|
"lint-staged": "^16.2.7",
|
|
147
|
-
"oxfmt": "^0.
|
|
149
|
+
"oxfmt": "^0.36.0",
|
|
148
150
|
"oxlint": "^1.32.0",
|
|
149
151
|
"oxlint-tsgolint": "^0.15.0",
|
|
150
152
|
"typescript": "^5.9.3"
|