@nestia/e2e 0.4.3 → 0.5.0-dev.20240617

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/README.md CHANGED
@@ -18,7 +18,7 @@ Nestia is a set of helper libraries for NestJS, supporting below features:
18
18
  - `@nestia/migrate`: migration from Swagger to NestJS
19
19
  - `nestia`: just CLI (command line interface) tool
20
20
 
21
- > **Note**
21
+ > [!NOTE]
22
22
  >
23
23
  > - **Only one line** required, with pure TypeScript type
24
24
  > - Enhance performance **30x** up
@@ -0,0 +1,42 @@
1
+ import { IConnection } from "@nestia/fetcher";
2
+ import { WorkerServer } from "tgrid";
3
+ import { IBenchmarkMaster } from "./structures/IBenchmarkMaster";
4
+ import { IBenchmarkServant } from "./structures/IBenchmarkServant";
5
+ export declare namespace DynamicBenchmarker {
6
+ interface IMasterProps {
7
+ count: number;
8
+ threads: number;
9
+ simultaneous: number;
10
+ servant: string;
11
+ filter?: (name: string) => boolean;
12
+ progress?: (complete: number) => void;
13
+ stdio?: undefined | "overlapped" | "pipe" | "ignore" | "inherit";
14
+ }
15
+ interface IServantProps<Parameters extends any[]> {
16
+ connection: IConnection;
17
+ location: string;
18
+ prefix: string;
19
+ parameters: (name: string, connection: IConnection) => Parameters;
20
+ }
21
+ interface IReport {
22
+ time: number;
23
+ statistics: IReport.IStatistics;
24
+ endpoints: Array<IReport.IEndpoint & IReport.IStatistics>;
25
+ }
26
+ namespace IReport {
27
+ interface IEndpoint {
28
+ method: string;
29
+ path: string;
30
+ }
31
+ interface IStatistics {
32
+ count: number;
33
+ success: number;
34
+ mean: number | null;
35
+ stdev: number | null;
36
+ minimum: number | null;
37
+ maximum: number | null;
38
+ }
39
+ }
40
+ const master: (props: IMasterProps) => Promise<IReport>;
41
+ const servant: <Parameters extends any[]>(props: IServantProps<Parameters>) => Promise<WorkerServer<null, IBenchmarkServant, IBenchmarkMaster>>;
42
+ }
@@ -0,0 +1,404 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ var __values = (this && this.__values) || function(o) {
73
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
74
+ if (m) return m.call(o);
75
+ if (o && typeof o.length === "number") return {
76
+ next: function () {
77
+ if (o && i >= o.length) o = void 0;
78
+ return { value: o && o[i++], done: !o };
79
+ }
80
+ };
81
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
82
+ };
83
+ var __read = (this && this.__read) || function (o, n) {
84
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
85
+ if (!m) return o;
86
+ var i = m.call(o), r, ar = [], e;
87
+ try {
88
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
89
+ }
90
+ catch (error) { e = { error: error }; }
91
+ finally {
92
+ try {
93
+ if (r && !r.done && (m = i["return"])) m.call(i);
94
+ }
95
+ finally { if (e) throw e.error; }
96
+ }
97
+ return ar;
98
+ };
99
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
100
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
101
+ if (ar || !(i in from)) {
102
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
103
+ ar[i] = from[i];
104
+ }
105
+ }
106
+ return to.concat(ar || Array.prototype.slice.call(from));
107
+ };
108
+ var __importDefault = (this && this.__importDefault) || function (mod) {
109
+ return (mod && mod.__esModule) ? mod : { "default": mod };
110
+ };
111
+ Object.defineProperty(exports, "__esModule", { value: true });
112
+ exports.DynamicBenchmarker = void 0;
113
+ var fs_1 = __importDefault(require("fs"));
114
+ var tgrid_1 = require("tgrid");
115
+ var tstl_1 = require("tstl");
116
+ var DynamicBenchmarker;
117
+ (function (DynamicBenchmarker) {
118
+ var _this = this;
119
+ DynamicBenchmarker.master = function (props) { return __awaiter(_this, void 0, void 0, function () {
120
+ var completes, servants, started_at, events, time, endpoints, events_1, events_1_1, e;
121
+ var e_1, _a;
122
+ var _this = this;
123
+ var _b;
124
+ return __generator(this, function (_c) {
125
+ switch (_c.label) {
126
+ case 0:
127
+ completes = new Array(props.threads).fill(0);
128
+ return [4 /*yield*/, Promise.all(new Array(props.threads).fill(null).map(function (i) { return __awaiter(_this, void 0, void 0, function () {
129
+ var connector;
130
+ var _a;
131
+ return __generator(this, function (_b) {
132
+ switch (_b.label) {
133
+ case 0:
134
+ connector = new tgrid_1.WorkerConnector(null, {
135
+ filter: (_a = props.filter) !== null && _a !== void 0 ? _a : (function () { return true; }),
136
+ progress: function (current) {
137
+ completes[i] = current;
138
+ if (props.progress)
139
+ props.progress(completes.reduce(function (a, b) { return a + b; }, 0));
140
+ },
141
+ }, "process");
142
+ return [4 /*yield*/, connector.connect(props.servant, { stdio: props.stdio })];
143
+ case 1:
144
+ _b.sent();
145
+ return [2 /*return*/, connector];
146
+ }
147
+ });
148
+ }); }))];
149
+ case 1:
150
+ servants = _c.sent();
151
+ started_at = new Date();
152
+ return [4 /*yield*/, Promise.all(servants.map(function (connector) {
153
+ return connector.getDriver().execute({
154
+ count: Math.ceil(props.count / props.threads),
155
+ simultaneous: Math.ceil(props.simultaneous / props.threads),
156
+ });
157
+ }))];
158
+ case 2:
159
+ events = (_c.sent()).flat();
160
+ time = Date.now() - started_at.getTime();
161
+ return [4 /*yield*/, Promise.all(servants.map(function (connector) { return connector.close(); }))];
162
+ case 3:
163
+ _c.sent();
164
+ if (props.progress)
165
+ props.progress(props.count);
166
+ endpoints = new tstl_1.HashMap(function (key) { return (0, tstl_1.hash)(key.method, key.path); }, function (x, y) { return x.method === y.method && x.path === y.path; });
167
+ try {
168
+ for (events_1 = __values(events), events_1_1 = events_1.next(); !events_1_1.done; events_1_1 = events_1.next()) {
169
+ e = events_1_1.value;
170
+ endpoints
171
+ .take({
172
+ method: e.metadata.method,
173
+ path: (_b = e.metadata.template) !== null && _b !== void 0 ? _b : e.metadata.path,
174
+ }, function () { return []; })
175
+ .push(e);
176
+ }
177
+ }
178
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
179
+ finally {
180
+ try {
181
+ if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);
182
+ }
183
+ finally { if (e_1) throw e_1.error; }
184
+ }
185
+ return [2 /*return*/, {
186
+ time: time,
187
+ statistics: statistics(events),
188
+ endpoints: __spreadArray([], __read(endpoints), false).map(function (it) { return (__assign(__assign({}, statistics(it.second)), it.first)); }),
189
+ }];
190
+ }
191
+ });
192
+ }); };
193
+ DynamicBenchmarker.servant = function (props) { return __awaiter(_this, void 0, void 0, function () {
194
+ var server;
195
+ return __generator(this, function (_a) {
196
+ switch (_a.label) {
197
+ case 0:
198
+ server = new tgrid_1.WorkerServer();
199
+ return [4 /*yield*/, server.open({
200
+ execute: execute({
201
+ driver: server.getDriver(),
202
+ props: props,
203
+ }),
204
+ })];
205
+ case 1:
206
+ _a.sent();
207
+ return [2 /*return*/, server];
208
+ }
209
+ });
210
+ }); };
211
+ var execute = function (ctx) {
212
+ return function (mass) { return __awaiter(_this, void 0, void 0, function () {
213
+ var functions, events;
214
+ var _this = this;
215
+ return __generator(this, function (_a) {
216
+ switch (_a.label) {
217
+ case 0:
218
+ functions = [];
219
+ return [4 /*yield*/, iterate({
220
+ collection: functions,
221
+ driver: ctx.driver,
222
+ props: ctx.props,
223
+ })(ctx.props.location)];
224
+ case 1:
225
+ _a.sent();
226
+ events = [];
227
+ ctx.props.connection.logger = function (e) { return __awaiter(_this, void 0, void 0, function () {
228
+ var _a, _b;
229
+ return __generator(this, function (_c) {
230
+ events.push({
231
+ metadata: e.route,
232
+ status: e.status,
233
+ started_at: e.started_at.toISOString(),
234
+ repond_at: (_b = (_a = e.respond_at) === null || _a === void 0 ? void 0 : _a.toISOString()) !== null && _b !== void 0 ? _b : null,
235
+ completed_at: e.completed_at.toISOString(),
236
+ });
237
+ return [2 /*return*/];
238
+ });
239
+ }); };
240
+ return [4 /*yield*/, Promise.all(new Array(mass.simultaneous).fill(null).map(function () { return __awaiter(_this, void 0, void 0, function () {
241
+ var prev, func, current, _a;
242
+ return __generator(this, function (_b) {
243
+ switch (_b.label) {
244
+ case 0:
245
+ if (!(events.length < mass.count)) return [3 /*break*/, 5];
246
+ prev = events.length;
247
+ func = functions[Math.floor(Math.random() * functions.length)];
248
+ _b.label = 1;
249
+ case 1:
250
+ _b.trys.push([1, 3, , 4]);
251
+ return [4 /*yield*/, func.value.apply(func, __spreadArray([], __read(ctx.props.parameters(func.key, ctx.props.connection)), false))];
252
+ case 2:
253
+ _b.sent();
254
+ current = events.length;
255
+ if (current !== prev)
256
+ ctx.driver.progress(current).catch(function () { });
257
+ return [3 /*break*/, 4];
258
+ case 3:
259
+ _a = _b.sent();
260
+ return [3 /*break*/, 4];
261
+ case 4: return [3 /*break*/, 0];
262
+ case 5: return [2 /*return*/];
263
+ }
264
+ });
265
+ }); }))];
266
+ case 2:
267
+ _a.sent();
268
+ return [4 /*yield*/, ctx.driver.progress(events.length)];
269
+ case 3:
270
+ _a.sent();
271
+ return [2 /*return*/, events];
272
+ }
273
+ });
274
+ }); };
275
+ };
276
+ var statistics = function (events) {
277
+ var successes = events.filter(function (event) { return event.status === 200 || event.status === 201; });
278
+ return __assign({ count: events.length, success: successes.length }, average(events));
279
+ };
280
+ var average = function (events) {
281
+ var e_2, _a;
282
+ if (events.length === 0)
283
+ return {
284
+ mean: null,
285
+ stdev: null,
286
+ minimum: null,
287
+ maximum: null,
288
+ };
289
+ var mean = 0;
290
+ var stdev = 0;
291
+ var minimum = Number.MAX_SAFE_INTEGER;
292
+ var maximum = Number.MIN_SAFE_INTEGER;
293
+ try {
294
+ for (var events_2 = __values(events), events_2_1 = events_2.next(); !events_2_1.done; events_2_1 = events_2.next()) {
295
+ var event_1 = events_2_1.value;
296
+ var elapsed = new Date(event_1.completed_at).getTime() -
297
+ new Date(event_1.started_at).getTime();
298
+ mean += elapsed;
299
+ stdev += elapsed * elapsed;
300
+ minimum = Math.min(minimum, elapsed);
301
+ maximum = Math.max(maximum, elapsed);
302
+ }
303
+ }
304
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
305
+ finally {
306
+ try {
307
+ if (events_2_1 && !events_2_1.done && (_a = events_2.return)) _a.call(events_2);
308
+ }
309
+ finally { if (e_2) throw e_2.error; }
310
+ }
311
+ mean /= events.length;
312
+ stdev = Math.sqrt(stdev / events.length - mean * mean);
313
+ return { mean: mean, stdev: stdev, minimum: minimum, maximum: maximum };
314
+ };
315
+ })(DynamicBenchmarker || (exports.DynamicBenchmarker = DynamicBenchmarker = {}));
316
+ var iterate = function (ctx) {
317
+ return function (path) { return __awaiter(void 0, void 0, void 0, function () {
318
+ var directory, directory_1, directory_1_1, file, location_1, stat, modulo, _a, _b, _c, key, value, e_3_1, e_4_1;
319
+ var e_4, _d, e_3, _e;
320
+ return __generator(this, function (_f) {
321
+ switch (_f.label) {
322
+ case 0: return [4 /*yield*/, fs_1.default.promises.readdir(path)];
323
+ case 1:
324
+ directory = _f.sent();
325
+ _f.label = 2;
326
+ case 2:
327
+ _f.trys.push([2, 20, 21, 22]);
328
+ directory_1 = __values(directory), directory_1_1 = directory_1.next();
329
+ _f.label = 3;
330
+ case 3:
331
+ if (!!directory_1_1.done) return [3 /*break*/, 19];
332
+ file = directory_1_1.value;
333
+ location_1 = "".concat(path, "/").concat(file);
334
+ return [4 /*yield*/, fs_1.default.promises.stat(location_1)];
335
+ case 4:
336
+ stat = _f.sent();
337
+ if (!(stat.isDirectory() === true)) return [3 /*break*/, 6];
338
+ return [4 /*yield*/, iterate(ctx)(location_1)];
339
+ case 5:
340
+ _f.sent();
341
+ return [3 /*break*/, 18];
342
+ case 6:
343
+ if (!(file.endsWith(".js") === true)) return [3 /*break*/, 18];
344
+ return [4 /*yield*/, Promise.resolve("".concat(location_1)).then(function (s) { return __importStar(require(s)); })];
345
+ case 7:
346
+ modulo = _f.sent();
347
+ _f.label = 8;
348
+ case 8:
349
+ _f.trys.push([8, 16, 17, 18]);
350
+ _a = (e_3 = void 0, __values(Object.entries(modulo))), _b = _a.next();
351
+ _f.label = 9;
352
+ case 9:
353
+ if (!!_b.done) return [3 /*break*/, 15];
354
+ _c = __read(_b.value, 2), key = _c[0], value = _c[1];
355
+ if (!(typeof value !== "function")) return [3 /*break*/, 10];
356
+ return [3 /*break*/, 14];
357
+ case 10:
358
+ if (!(key.startsWith(ctx.props.prefix) === false)) return [3 /*break*/, 11];
359
+ return [3 /*break*/, 14];
360
+ case 11: return [4 /*yield*/, ctx.driver.filter(key)];
361
+ case 12:
362
+ if ((_f.sent()) === false)
363
+ return [3 /*break*/, 14];
364
+ _f.label = 13;
365
+ case 13:
366
+ ctx.collection.push({
367
+ key: key,
368
+ value: value,
369
+ });
370
+ _f.label = 14;
371
+ case 14:
372
+ _b = _a.next();
373
+ return [3 /*break*/, 9];
374
+ case 15: return [3 /*break*/, 18];
375
+ case 16:
376
+ e_3_1 = _f.sent();
377
+ e_3 = { error: e_3_1 };
378
+ return [3 /*break*/, 18];
379
+ case 17:
380
+ try {
381
+ if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
382
+ }
383
+ finally { if (e_3) throw e_3.error; }
384
+ return [7 /*endfinally*/];
385
+ case 18:
386
+ directory_1_1 = directory_1.next();
387
+ return [3 /*break*/, 3];
388
+ case 19: return [3 /*break*/, 22];
389
+ case 20:
390
+ e_4_1 = _f.sent();
391
+ e_4 = { error: e_4_1 };
392
+ return [3 /*break*/, 22];
393
+ case 21:
394
+ try {
395
+ if (directory_1_1 && !directory_1_1.done && (_d = directory_1.return)) _d.call(directory_1);
396
+ }
397
+ finally { if (e_4) throw e_4.error; }
398
+ return [7 /*endfinally*/];
399
+ case 22: return [2 /*return*/];
400
+ }
401
+ });
402
+ }); };
403
+ };
404
+ //# sourceMappingURL=DynamicBenchmarker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamicBenchmarker.js","sourceRoot":"","sources":["../src/DynamicBenchmarker.ts"],"names":[],"mappings":"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"}
@@ -81,7 +81,7 @@ export declare namespace TestValidator {
81
81
  * @param title Title of error message when sorting is invalid
82
82
  * @example https://github.com/samchon/nestia-template/blob/master/src/test/features/api/bbs/test_api_bbs_article_index_sort.ts
83
83
  */
84
- const sort: (title: string) => <T extends object, Fields extends string, Sortable extends (`-${Fields}` | `+${Fields}`)[] = (`-${Fields}` | `+${Fields}`)[]>(getter: (sortable: Sortable) => Promise<T[]>) => (...fields: Fields[]) => (comp: (x: T, y: T) => number, filter?: ((elem: T) => boolean) | undefined) => (direction: "+" | "-", trace?: boolean) => Promise<void>;
84
+ const sort: (title: string) => <T extends object, Fields extends string, Sortable extends (`-${Fields}` | `+${Fields}`)[] = (`-${Fields}` | `+${Fields}`)[]>(getter: (sortable: Sortable) => Promise<T[]>) => (...fields: Fields[]) => (comp: (x: T, y: T) => number, filter?: (elem: T) => boolean) => (direction: "+" | "-", trace?: boolean) => Promise<void>;
85
85
  type Sortable<Literal extends string> = Array<`-${Literal}` | `+${Literal}`>;
86
86
  }
87
87
  interface IEntity<Type extends string | number | bigint> {
package/lib/module.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./ArrayUtil";
2
+ export * from "./DynamicBenchmarker";
2
3
  export * from "./DynamicExecutor";
3
4
  export * from "./GaffComparator";
4
5
  export * from "./RandomGenerator";
package/lib/module.js CHANGED
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./ArrayUtil"), exports);
18
+ __exportStar(require("./DynamicBenchmarker"), exports);
18
19
  __exportStar(require("./DynamicExecutor"), exports);
19
20
  __exportStar(require("./GaffComparator"), exports);
20
21
  __exportStar(require("./RandomGenerator"), exports);
package/lib/module.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,oDAAkC;AAClC,mDAAiC;AACjC,oDAAkC;AAClC,8CAA4B;AAC5B,kDAAgC"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,uDAAqC;AACrC,oDAAkC;AAClC,mDAAiC;AACjC,oDAAkC;AAClC,8CAA4B;AAC5B,kDAAgC"}
@@ -0,0 +1,8 @@
1
+ import { IFetchRoute } from "@nestia/fetcher";
2
+ export interface IBenchmarkEvent {
3
+ metadata: IFetchRoute<any>;
4
+ status: number | null;
5
+ started_at: string;
6
+ repond_at: string | null;
7
+ completed_at: string;
8
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBenchmarkEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBenchmarkEvent.js","sourceRoot":"","sources":["../../src/structures/IBenchmarkEvent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface IBenchmarkMaster {
2
+ }
3
+ export interface IBenchmarkMaster {
4
+ filter: (name: string) => boolean;
5
+ progress: (current: number) => void;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBenchmarkMaster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBenchmarkMaster.js","sourceRoot":"","sources":["../../src/structures/IBenchmarkMaster.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { IBenchmarkEvent } from "./IBenchmarkEvent";
2
+ export interface IBenchmarkServant {
3
+ execute(props: {
4
+ count: number;
5
+ simultaneous: number;
6
+ }): Promise<IBenchmarkEvent[]>;
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBenchmarkServant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBenchmarkServant.js","sourceRoot":"","sources":["../../src/structures/IBenchmarkServant.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestia/e2e",
3
- "version": "0.4.3",
3
+ "version": "0.5.0-dev.20240617",
4
4
  "description": "E2E test utilify functions",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -38,11 +38,13 @@
38
38
  "ts-node": "^10.9.1",
39
39
  "ts-patch": "^3.1.0",
40
40
  "typescript": "^5.4.2",
41
- "typia": "^5.5.7"
41
+ "typia": "^6.1.0"
42
42
  },
43
43
  "dependencies": {
44
+ "@nestia/fetcher": "^3.2.2",
44
45
  "chalk": "^4.1.2",
45
46
  "cli": "^1.0.1",
47
+ "tgrid": "^1.0.1",
46
48
  "tstl": "^3.0.0"
47
49
  },
48
50
  "files": [