@creator.co/wapi 1.2.2 → 1.2.4
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/.eslintrc.cjs +29 -22
- package/.github/workflows/npmpublish.yml +2 -5
- package/.github/workflows/prs.yml +1 -1
- package/README.md +1 -3
- package/dist/index.d.ts +11 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/jest.config.d.ts +3 -0
- package/dist/jest.config.js +34 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/package.json +64 -0
- package/dist/src/API/Request.d.ts +140 -0
- package/dist/src/API/Request.js +182 -0
- package/dist/src/API/Request.js.map +1 -0
- package/dist/src/API/Response.d.ts +256 -0
- package/dist/src/API/Response.js +398 -0
- package/dist/src/API/Response.js.map +1 -0
- package/dist/src/API/Utils.d.ts +63 -0
- package/dist/src/API/Utils.js +104 -0
- package/dist/src/API/Utils.js.map +1 -0
- package/dist/src/BaseEvent/EventProcessor.d.ts +81 -0
- package/dist/src/BaseEvent/EventProcessor.js +182 -0
- package/dist/src/BaseEvent/EventProcessor.js.map +1 -0
- package/dist/src/BaseEvent/Process.d.ts +74 -0
- package/dist/src/BaseEvent/Process.js +142 -0
- package/dist/src/BaseEvent/Process.js.map +1 -0
- package/dist/src/BaseEvent/Transaction.d.ts +29 -0
- package/dist/src/BaseEvent/Transaction.js +244 -0
- package/dist/src/BaseEvent/Transaction.js.map +1 -0
- package/dist/src/Config/Configuration.d.ts +131 -0
- package/dist/src/Config/Configuration.js +153 -0
- package/dist/src/Config/Configuration.js.map +1 -0
- package/dist/src/Config/EnvironmentVar.d.ts +101 -0
- package/dist/src/Config/EnvironmentVar.js +213 -0
- package/dist/src/Config/EnvironmentVar.js.map +1 -0
- package/dist/src/Crypto/Crypto.d.ts +57 -0
- package/dist/src/Crypto/Crypto.js +126 -0
- package/dist/src/Crypto/Crypto.js.map +1 -0
- package/dist/src/Crypto/JWT.d.ts +64 -0
- package/dist/src/Crypto/JWT.js +74 -0
- package/dist/src/Crypto/JWT.js.map +1 -0
- package/dist/src/Globals.d.ts +161 -0
- package/dist/src/Globals.js +173 -0
- package/dist/src/Globals.js.map +1 -0
- package/dist/src/Logger/Logger.d.ts +180 -0
- package/dist/src/Logger/Logger.js +412 -0
- package/dist/src/Logger/Logger.js.map +1 -0
- package/dist/src/Mailer/Mailer.d.ts +107 -0
- package/dist/src/Mailer/Mailer.js +313 -0
- package/dist/src/Mailer/Mailer.js.map +1 -0
- package/dist/src/Publisher/Publisher.d.ts +47 -0
- package/dist/src/Publisher/Publisher.js +141 -0
- package/dist/src/Publisher/Publisher.js.map +1 -0
- package/dist/src/Server/RouteResolver.d.ts +41 -0
- package/dist/src/Server/RouteResolver.js +135 -0
- package/dist/src/Server/RouteResolver.js.map +1 -0
- package/dist/src/Server/Router.d.ts +104 -0
- package/dist/src/Server/Router.js +45 -0
- package/dist/src/Server/Router.js.map +1 -0
- package/dist/src/Server/lib/ContainerServer.d.ts +58 -0
- package/dist/src/Server/lib/ContainerServer.js +143 -0
- package/dist/src/Server/lib/ContainerServer.js.map +1 -0
- package/dist/src/Server/lib/Server.d.ts +60 -0
- package/dist/src/Server/lib/Server.js +137 -0
- package/dist/src/Server/lib/Server.js.map +1 -0
- package/dist/src/Server/lib/container/GenericHandler.d.ts +4 -0
- package/dist/src/Server/lib/container/GenericHandler.js +138 -0
- package/dist/src/Server/lib/container/GenericHandler.js.map +1 -0
- package/dist/src/Server/lib/container/GenericHandlerEvent.d.ts +67 -0
- package/dist/src/Server/lib/container/GenericHandlerEvent.js +189 -0
- package/dist/src/Server/lib/container/GenericHandlerEvent.js.map +1 -0
- package/dist/src/Server/lib/container/HealthHandler.d.ts +3 -0
- package/dist/src/Server/lib/container/HealthHandler.js +45 -0
- package/dist/src/Server/lib/container/HealthHandler.js.map +1 -0
- package/dist/src/Server/lib/container/Proxy.d.ts +95 -0
- package/dist/src/Server/lib/container/Proxy.js +201 -0
- package/dist/src/Server/lib/container/Proxy.js.map +1 -0
- package/dist/src/Server/lib/container/Utils.d.ts +18 -0
- package/dist/src/Server/lib/container/Utils.js +84 -0
- package/dist/src/Server/lib/container/Utils.js.map +1 -0
- package/dist/src/Validation/Validator.d.ts +21 -0
- package/dist/src/Validation/Validator.js +48 -0
- package/dist/src/Validation/Validator.js.map +1 -0
- package/index.ts +12 -10
- package/jest.config.ts +14 -21
- package/package.json +3 -3
- package/src/API/Request.ts +17 -35
- package/src/API/Response.ts +24 -42
- package/src/API/Utils.ts +5 -7
- package/src/BaseEvent/EventProcessor.ts +16 -24
- package/src/BaseEvent/Process.ts +7 -12
- package/src/BaseEvent/Transaction.ts +25 -43
- package/src/Config/Configuration.ts +8 -14
- package/src/Config/EnvironmentVar.ts +10 -20
- package/src/Crypto/Crypto.ts +10 -10
- package/src/Crypto/JWT.ts +4 -10
- package/src/Globals.ts +19 -25
- package/src/Logger/Logger.ts +36 -51
- package/src/Mailer/Mailer.ts +19 -31
- package/src/Publisher/Publisher.ts +7 -12
- package/src/Server/RouteResolver.ts +5 -6
- package/src/Server/Router.ts +7 -12
- package/src/Server/lib/ContainerServer.ts +5 -5
- package/src/Server/lib/Server.ts +26 -38
- package/src/Server/lib/container/GenericHandler.ts +8 -13
- package/src/Server/lib/container/GenericHandlerEvent.ts +21 -35
- package/src/Server/lib/container/HealthHandler.ts +2 -2
- package/src/Server/lib/container/Proxy.ts +26 -38
- package/src/Server/lib/container/Utils.ts +2 -2
- package/src/Validation/Validator.ts +6 -6
- package/tests/API/Request.test.ts +107 -111
- package/tests/API/Response.test.ts +86 -91
- package/tests/API/Utils.test.ts +64 -64
- package/tests/BaseEvent/EventProcessor.test.ts +68 -84
- package/tests/BaseEvent/Process.test.ts +11 -11
- package/tests/BaseEvent/Transaction.test.ts +44 -53
- package/tests/Config/Config.test.ts +50 -50
- package/tests/Config/EnvironmentVar.test.ts +50 -59
- package/tests/Crypto/Crypto.test.ts +20 -22
- package/tests/Crypto/JWT.test.ts +40 -40
- package/tests/Logger/Logger.test.ts +24 -36
- package/tests/Mailer/Mailer.test.ts +21 -29
- package/tests/Publisher/Publisher.test.ts +18 -18
- package/tests/Server/RouteResolver.test.ts +56 -59
- package/tests/Server/Router.test.ts +16 -16
- package/tests/Server/lib/ContainerServer.test.ts +83 -85
- package/tests/Server/lib/Server.test.ts +4 -4
- package/tests/Server/lib/container/GenericHandler.test.ts +31 -41
- package/tests/Server/lib/container/GenericHandlerEvent.test.ts +35 -36
- package/tests/Server/lib/container/HealthHandler.test.ts +7 -7
- package/tests/Server/lib/container/Proxy.test.ts +66 -79
- package/tests/Server/lib/container/Utils.test.ts +16 -17
- package/tests/Test.utils.ts +9 -9
- package/tests/Validation/Validator.test.ts +28 -40
- package/tests/main.test.ts +2 -2
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import Server from './../Server';
|
|
2
|
+
import { RouterConfig } from '../../Router';
|
|
3
|
+
/**
|
|
4
|
+
* ${1:Description placeholder}
|
|
5
|
+
*
|
|
6
|
+
* @export
|
|
7
|
+
* @class Proxy
|
|
8
|
+
* @typedef {Proxy}
|
|
9
|
+
*/
|
|
10
|
+
export default class Proxy {
|
|
11
|
+
/**
|
|
12
|
+
* ${1:Description placeholder}
|
|
13
|
+
*
|
|
14
|
+
* @private
|
|
15
|
+
* @type {boolean}
|
|
16
|
+
*/
|
|
17
|
+
private stopping;
|
|
18
|
+
/**
|
|
19
|
+
* ${1:Description placeholder}
|
|
20
|
+
*
|
|
21
|
+
* @private
|
|
22
|
+
* @readonly
|
|
23
|
+
* @type {RouterConfig}
|
|
24
|
+
*/
|
|
25
|
+
private readonly config;
|
|
26
|
+
/**
|
|
27
|
+
* ${1:Description placeholder}
|
|
28
|
+
*
|
|
29
|
+
* @private
|
|
30
|
+
* @readonly
|
|
31
|
+
* @type {express.Express}
|
|
32
|
+
*/
|
|
33
|
+
private readonly app;
|
|
34
|
+
/**
|
|
35
|
+
* ${1:Description placeholder}
|
|
36
|
+
*
|
|
37
|
+
* @private
|
|
38
|
+
* @readonly
|
|
39
|
+
* @type {Server["handleServerlessEvent"]}
|
|
40
|
+
*/
|
|
41
|
+
private readonly serverlessHandler;
|
|
42
|
+
/**
|
|
43
|
+
* ${1:Description placeholder}
|
|
44
|
+
*
|
|
45
|
+
* @private
|
|
46
|
+
* @type {HTTPServer}
|
|
47
|
+
*/
|
|
48
|
+
private listener;
|
|
49
|
+
/**
|
|
50
|
+
* Creates an instance of Proxy.
|
|
51
|
+
*
|
|
52
|
+
* @constructor
|
|
53
|
+
* @param {RouterConfig} config
|
|
54
|
+
* @param {Server["handleServerlessEvent"]} serverlessHandler
|
|
55
|
+
*/
|
|
56
|
+
constructor(config: RouterConfig, serverlessHandler: Server['handleServerlessEvent']);
|
|
57
|
+
/**
|
|
58
|
+
* ${1:Description placeholder}
|
|
59
|
+
*
|
|
60
|
+
* @async
|
|
61
|
+
* @returns {*}
|
|
62
|
+
*/
|
|
63
|
+
load(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* ${1:Description placeholder}
|
|
66
|
+
*
|
|
67
|
+
* @async
|
|
68
|
+
* @param {?*} [err]
|
|
69
|
+
* @returns {*}
|
|
70
|
+
*/
|
|
71
|
+
unload(err?: any): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* ${1:Description placeholder}
|
|
74
|
+
*
|
|
75
|
+
* @private
|
|
76
|
+
* @async
|
|
77
|
+
* @returns {Promise<void>}
|
|
78
|
+
*/
|
|
79
|
+
private startListeners;
|
|
80
|
+
/**
|
|
81
|
+
* ${1:Description placeholder}
|
|
82
|
+
*
|
|
83
|
+
* @private
|
|
84
|
+
* @async
|
|
85
|
+
* @param {?*} [err]
|
|
86
|
+
* @returns {unknown}
|
|
87
|
+
*/
|
|
88
|
+
private stopListeners;
|
|
89
|
+
/**
|
|
90
|
+
* ${1:Description placeholder}
|
|
91
|
+
*
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
private installRoutes;
|
|
95
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
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;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var http_1 = require("http");
|
|
40
|
+
var cors = require("cors");
|
|
41
|
+
var express = require("express");
|
|
42
|
+
var GenericHandler_1 = require("./GenericHandler");
|
|
43
|
+
var HealthHandler_1 = require("./HealthHandler");
|
|
44
|
+
var package_json_1 = require("../../../../package.json");
|
|
45
|
+
var Utils_1 = require("../../../API/Utils");
|
|
46
|
+
var Globals_1 = require("../../../Globals");
|
|
47
|
+
/**
|
|
48
|
+
* ${1:Description placeholder}
|
|
49
|
+
*
|
|
50
|
+
* @export
|
|
51
|
+
* @class Proxy
|
|
52
|
+
* @typedef {Proxy}
|
|
53
|
+
*/
|
|
54
|
+
var Proxy = /** @class */ (function () {
|
|
55
|
+
/**
|
|
56
|
+
* Creates an instance of Proxy.
|
|
57
|
+
*
|
|
58
|
+
* @constructor
|
|
59
|
+
* @param {RouterConfig} config
|
|
60
|
+
* @param {Server["handleServerlessEvent"]} serverlessHandler
|
|
61
|
+
*/
|
|
62
|
+
function Proxy(config, serverlessHandler) {
|
|
63
|
+
this.stopping = false;
|
|
64
|
+
this.config = config;
|
|
65
|
+
this.serverlessHandler = serverlessHandler;
|
|
66
|
+
this.app = express();
|
|
67
|
+
/* Opinionated Express configs */
|
|
68
|
+
this.app.use(express.json());
|
|
69
|
+
// apply cors config
|
|
70
|
+
var corsConfig = this.config.cors || Utils_1.default.parseObjectNullIfEmpty(process.env.CORS);
|
|
71
|
+
this.app.use(cors(corsConfig
|
|
72
|
+
? {
|
|
73
|
+
origin: corsConfig.origin,
|
|
74
|
+
allowedHeaders: corsConfig.headers,
|
|
75
|
+
credentials: !!corsConfig.allowCredentials,
|
|
76
|
+
}
|
|
77
|
+
: {}));
|
|
78
|
+
// //This supposedly fix some 502 codes where nodejs socket would hang during
|
|
79
|
+
// //a request and if behind ALB, it would cause 502 codes. Had experiencied this
|
|
80
|
+
// //and 502 codes reduced dramastically, but still some appearances. Maybe this
|
|
81
|
+
// //is just a palliative work-around for the real issue; TODO: need to investigate
|
|
82
|
+
// //in the future.
|
|
83
|
+
// this.listener.listener.keepAliveTimeout = 120e3
|
|
84
|
+
// this.listener.listener.headersTimeout = 120e3
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* ${1:Description placeholder}
|
|
88
|
+
*
|
|
89
|
+
* @async
|
|
90
|
+
* @returns {*}
|
|
91
|
+
*/
|
|
92
|
+
Proxy.prototype.load = function () {
|
|
93
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
94
|
+
return __generator(this, function (_a) {
|
|
95
|
+
switch (_a.label) {
|
|
96
|
+
case 0: return [4 /*yield*/, this.startListeners()];
|
|
97
|
+
case 1:
|
|
98
|
+
_a.sent();
|
|
99
|
+
this.installRoutes();
|
|
100
|
+
return [2 /*return*/];
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* ${1:Description placeholder}
|
|
107
|
+
*
|
|
108
|
+
* @async
|
|
109
|
+
* @param {?*} [err]
|
|
110
|
+
* @returns {*}
|
|
111
|
+
*/
|
|
112
|
+
Proxy.prototype.unload = function (err) {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
114
|
+
return __generator(this, function (_a) {
|
|
115
|
+
switch (_a.label) {
|
|
116
|
+
case 0: return [4 /*yield*/, this.stopListeners(err)];
|
|
117
|
+
case 1:
|
|
118
|
+
_a.sent();
|
|
119
|
+
return [2 /*return*/];
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
/* lifecycle */
|
|
125
|
+
/**
|
|
126
|
+
* ${1:Description placeholder}
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @async
|
|
130
|
+
* @returns {Promise<void>}
|
|
131
|
+
*/
|
|
132
|
+
Proxy.prototype.startListeners = function () {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
134
|
+
var _this = this;
|
|
135
|
+
return __generator(this, function (_a) {
|
|
136
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
137
|
+
var port = _this.config.port || Globals_1.default.Listener_HTTP_DefaultPort;
|
|
138
|
+
console.log("[Proxy] - [STARTING] - v.".concat(package_json_1.version, " - :").concat(port));
|
|
139
|
+
// Create Server
|
|
140
|
+
_this.listener = (0, http_1.createServer)(_this.app);
|
|
141
|
+
// Set defaults
|
|
142
|
+
_this.listener.setTimeout(_this.config.timeout || Globals_1.default.Listener_HTTP_DefaultTimeout);
|
|
143
|
+
// Start Server
|
|
144
|
+
_this.listener.listen(port, function () {
|
|
145
|
+
console.log("[Proxy] - [STARTED]");
|
|
146
|
+
resolve();
|
|
147
|
+
});
|
|
148
|
+
})];
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* ${1:Description placeholder}
|
|
154
|
+
*
|
|
155
|
+
* @private
|
|
156
|
+
* @async
|
|
157
|
+
* @param {?*} [err]
|
|
158
|
+
* @returns {unknown}
|
|
159
|
+
*/
|
|
160
|
+
Proxy.prototype.stopListeners = function (err) {
|
|
161
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
162
|
+
var _this = this;
|
|
163
|
+
return __generator(this, function (_a) {
|
|
164
|
+
if (this.stopping)
|
|
165
|
+
return [2 /*return*/];
|
|
166
|
+
this.stopping = true;
|
|
167
|
+
console.debug('[Proxy] - [STOPPING]');
|
|
168
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
169
|
+
_this.listener.close(function (_err) {
|
|
170
|
+
if (err || _err)
|
|
171
|
+
console.log('[Proxy] - exit output:', err || _err);
|
|
172
|
+
console.log('[Proxy] - [STOPPED]');
|
|
173
|
+
process.exit(err || _err ? 1 : 0);
|
|
174
|
+
resolve(null);
|
|
175
|
+
});
|
|
176
|
+
})];
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
/* routing */
|
|
181
|
+
/**
|
|
182
|
+
* ${1:Description placeholder}
|
|
183
|
+
*
|
|
184
|
+
* @private
|
|
185
|
+
*/
|
|
186
|
+
Proxy.prototype.installRoutes = function () {
|
|
187
|
+
//Health check route -- This is a bypass route to only check if
|
|
188
|
+
//runtime proxy is working and responding to calls.
|
|
189
|
+
console.log("[Proxy] - [HEALTH-ROUTE] - ".concat(this.config.healthCheckRoute || Globals_1.default.Listener_HTTP_DefaultHealthCheckRoute));
|
|
190
|
+
this.app
|
|
191
|
+
.route(this.config.healthCheckRoute || Globals_1.default.Listener_HTTP_DefaultHealthCheckRoute)
|
|
192
|
+
.get(HealthHandler_1.default);
|
|
193
|
+
//Main route -- We use a wildcard route because is not the job of the runtime and neither
|
|
194
|
+
//the task to deny/constrain routes that invoked this task; all the job is done by the
|
|
195
|
+
//load balancer and we just foward everything we have to the function.
|
|
196
|
+
this.app.route(Globals_1.default.Listener_HTTP_ProxyRoute).all((0, GenericHandler_1.default)(this.serverlessHandler));
|
|
197
|
+
};
|
|
198
|
+
return Proxy;
|
|
199
|
+
}());
|
|
200
|
+
exports.default = Proxy;
|
|
201
|
+
//# sourceMappingURL=Proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Proxy.js","sourceRoot":"","sources":["../../../../../src/Server/lib/container/Proxy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6BAAyD;AAEzD,2BAA4B;AAC5B,iCAAkC;AAGlC,mDAA6C;AAC7C,iDAA2C;AAC3C,yDAAgE;AAChE,4CAAsC;AACtC,4CAAsC;AAGtC;;;;;;GAMG;AACH;IAuCE;;;;;;OAMG;IACH,eAAY,MAAoB,EAAE,iBAAkD;QAClF,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;QAC1C,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAA;QACpB,iCAAiC;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5B,oBAAoB;QACpB,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,eAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrF,IAAI,CAAC,GAAG,CAAC,GAAG,CACV,IAAI,CACF,UAAU;YACR,CAAC,CAAC;gBACE,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,cAAc,EAAE,UAAU,CAAC,OAAO;gBAClC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,gBAAgB;aAC3C;YACH,CAAC,CAAC,EAAE,CACP,CACF,CAAA;QAED,6EAA6E;QAC7E,iFAAiF;QACjF,gFAAgF;QAChF,mFAAmF;QACnF,mBAAmB;QACnB,kDAAkD;QAClD,gDAAgD;IAClD,CAAC;IACD;;;;;OAKG;IACG,oBAAI,GAAV;;;;4BACE,qBAAM,IAAI,CAAC,cAAc,EAAE,EAAA;;wBAA3B,SAA2B,CAAA;wBAC3B,IAAI,CAAC,aAAa,EAAE,CAAA;;;;;KACrB;IACD;;;;;;OAMG;IACG,sBAAM,GAAZ,UAAa,GAAS;;;;4BACpB,qBAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAA;;wBAA7B,SAA6B,CAAA;;;;;KAC9B;IACD,eAAe;IACf;;;;;;OAMG;IACW,8BAAc,GAA5B;;;;gBACE,sBAAO,IAAI,OAAO,CAAC,UAAA,OAAO;wBACxB,IAAM,IAAI,GAAG,KAAI,CAAC,MAAM,CAAC,IAAI,IAAI,iBAAO,CAAC,yBAAyB,CAAA;wBAClE,OAAO,CAAC,GAAG,CAAC,mCAA4B,sBAAU,iBAAO,IAAI,CAAE,CAAC,CAAA;wBAChE,gBAAgB;wBAChB,KAAI,CAAC,QAAQ,GAAG,IAAA,mBAAY,EAAC,KAAI,CAAC,GAAG,CAAC,CAAA;wBACtC,eAAe;wBACf,KAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAI,CAAC,MAAM,CAAC,OAAO,IAAI,iBAAO,CAAC,4BAA4B,CAAC,CAAA;wBACrF,eAAe;wBACf,KAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;4BACzB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;4BAClC,OAAO,EAAE,CAAA;wBACX,CAAC,CAAC,CAAA;oBACJ,CAAC,CAAC,EAAA;;;KACH;IACD;;;;;;;OAOG;IACW,6BAAa,GAA3B,UAA4B,GAAS;;;;gBACnC,IAAI,IAAI,CAAC,QAAQ;oBAAE,sBAAM;gBACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;gBACpB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;gBACrC,sBAAO,IAAI,OAAO,CAAC,UAAA,OAAO;wBACxB,KAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAA,IAAI;4BACtB,IAAI,GAAG,IAAI,IAAI;gCAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,IAAI,IAAI,CAAC,CAAA;4BACnE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;4BAClC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;4BACjC,OAAO,CAAC,IAAI,CAAC,CAAA;wBACf,CAAC,CAAC,CAAA;oBACJ,CAAC,CAAC,EAAA;;;KACH;IACD,aAAa;IACb;;;;OAIG;IACK,6BAAa,GAArB;QACE,+DAA+D;QAC/D,mDAAmD;QACnD,OAAO,CAAC,GAAG,CACT,qCACE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,iBAAO,CAAC,qCAAqC,CAC7E,CACH,CAAA;QACD,IAAI,CAAC,GAAG;aACL,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,iBAAO,CAAC,qCAAqC,CAAC;aACpF,GAAG,CAAC,uBAAa,CAAC,CAAA;QACrB,yFAAyF;QACzF,sFAAsF;QACtF,sEAAsE;QACtE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAC9F,CAAC;IACH,YAAC;AAAD,CAAC,AAjKD,IAiKC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ${1:Description placeholder}
|
|
3
|
+
*
|
|
4
|
+
* @export
|
|
5
|
+
* @param {string} url
|
|
6
|
+
* @returns {*}
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseMultiValueQueryStringParameters(url: string): any;
|
|
9
|
+
/**
|
|
10
|
+
* ${1:Description placeholder}
|
|
11
|
+
*
|
|
12
|
+
* @export
|
|
13
|
+
* @param {*} url
|
|
14
|
+
* @returns {*}
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseQueryStringParameters(url: any): {
|
|
17
|
+
[k: string]: string;
|
|
18
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __values = (this && this.__values) || function(o) {
|
|
3
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
+
if (m) return m.call(o);
|
|
5
|
+
if (o && typeof o.length === "number") return {
|
|
6
|
+
next: function () {
|
|
7
|
+
if (o && i >= o.length) o = void 0;
|
|
8
|
+
return { value: o && o[i++], done: !o };
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.parseQueryStringParameters = exports.parseMultiValueQueryStringParameters = void 0;
|
|
31
|
+
/**
|
|
32
|
+
* ${1:Description placeholder}
|
|
33
|
+
*
|
|
34
|
+
* @export
|
|
35
|
+
* @param {string} url
|
|
36
|
+
* @returns {*}
|
|
37
|
+
*/
|
|
38
|
+
function parseMultiValueQueryStringParameters(url) {
|
|
39
|
+
var e_1, _a;
|
|
40
|
+
// dummy placeholder url for the WHATWG URL constructor
|
|
41
|
+
// https://github.com/nodejs/node/issues/12682
|
|
42
|
+
var searchParams = new URL(url, 'http://example').searchParams;
|
|
43
|
+
//
|
|
44
|
+
if (Array.from(searchParams).length === 0)
|
|
45
|
+
return {};
|
|
46
|
+
var map = new Map();
|
|
47
|
+
try {
|
|
48
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
49
|
+
for (var searchParams_1 = __values(searchParams), searchParams_1_1 = searchParams_1.next(); !searchParams_1_1.done; searchParams_1_1 = searchParams_1.next()) {
|
|
50
|
+
var _b = __read(searchParams_1_1.value, 2), key = _b[0], value = _b[1];
|
|
51
|
+
var item = map.get(key);
|
|
52
|
+
if (item)
|
|
53
|
+
item.push(value);
|
|
54
|
+
else
|
|
55
|
+
map.set(key, [value]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
59
|
+
finally {
|
|
60
|
+
try {
|
|
61
|
+
if (searchParams_1_1 && !searchParams_1_1.done && (_a = searchParams_1.return)) _a.call(searchParams_1);
|
|
62
|
+
}
|
|
63
|
+
finally { if (e_1) throw e_1.error; }
|
|
64
|
+
}
|
|
65
|
+
return Object.fromEntries(map);
|
|
66
|
+
}
|
|
67
|
+
exports.parseMultiValueQueryStringParameters = parseMultiValueQueryStringParameters;
|
|
68
|
+
/**
|
|
69
|
+
* ${1:Description placeholder}
|
|
70
|
+
*
|
|
71
|
+
* @export
|
|
72
|
+
* @param {*} url
|
|
73
|
+
* @returns {*}
|
|
74
|
+
*/
|
|
75
|
+
function parseQueryStringParameters(url) {
|
|
76
|
+
// dummy placeholder url for the WHATWG URL constructor
|
|
77
|
+
// https://github.com/nodejs/node/issues/12682
|
|
78
|
+
var searchParams = new URL(url, 'http://example').searchParams;
|
|
79
|
+
if (Array.from(searchParams).length === 0)
|
|
80
|
+
return null;
|
|
81
|
+
return Object.fromEntries(searchParams);
|
|
82
|
+
}
|
|
83
|
+
exports.parseQueryStringParameters = parseQueryStringParameters;
|
|
84
|
+
//# sourceMappingURL=Utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../src/Server/lib/container/Utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;GAMG;AACH,SAAgB,oCAAoC,CAAC,GAAW;;IAC9D,uDAAuD;IACvD,8CAA8C;IACtC,IAAA,YAAY,GAAK,IAAI,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,aAAnC,CAAmC;IACvD,EAAE;IACF,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpD,IAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;;QACrB,gDAAgD;QAChD,KAA2B,IAAA,iBAAA,SAAA,YAAY,CAAA,0CAAA,oEAAE;YAA9B,IAAA,KAAA,iCAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YACpB,IAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACzB,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;gBACrB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;SAC3B;;;;;;;;;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;AAChC,CAAC;AAdD,oFAcC;AACD;;;;;;GAMG;AACH,SAAgB,0BAA0B,CAAC,GAAG;IAC5C,uDAAuD;IACvD,8CAA8C;IACtC,IAAA,YAAY,GAAK,IAAI,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,aAAnC,CAAmC;IACvD,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACtD,OAAO,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;AACzC,CAAC;AAND,gEAMC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import Response, { ResponseErrorType } from '../API/Response';
|
|
3
|
+
/**
|
|
4
|
+
* Description placeholder
|
|
5
|
+
*
|
|
6
|
+
* @export
|
|
7
|
+
* @class Validator
|
|
8
|
+
* @typedef {Validator}
|
|
9
|
+
*/
|
|
10
|
+
export default class Validator {
|
|
11
|
+
/**
|
|
12
|
+
* Description placeholder
|
|
13
|
+
*
|
|
14
|
+
* @public
|
|
15
|
+
* @static
|
|
16
|
+
* @param {*} data
|
|
17
|
+
* @param {z.ZodObject<any>} schema
|
|
18
|
+
* @returns {(boolean | Response<ResponseErrorType>)}
|
|
19
|
+
*/
|
|
20
|
+
static validateSchema(data: any, schema: z.ZodObject<any>): boolean | Response<ResponseErrorType>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var zod_1 = require("zod");
|
|
4
|
+
var Response_1 = require("../API/Response");
|
|
5
|
+
var Globals_1 = require("../Globals");
|
|
6
|
+
/**
|
|
7
|
+
* Description placeholder
|
|
8
|
+
*
|
|
9
|
+
* @export
|
|
10
|
+
* @class Validator
|
|
11
|
+
* @typedef {Validator}
|
|
12
|
+
*/
|
|
13
|
+
var Validator = /** @class */ (function () {
|
|
14
|
+
function Validator() {
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Description placeholder
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
* @static
|
|
21
|
+
* @param {*} data
|
|
22
|
+
* @param {z.ZodObject<any>} schema
|
|
23
|
+
* @returns {(boolean | Response<ResponseErrorType>)}
|
|
24
|
+
*/
|
|
25
|
+
Validator.validateSchema = function (data, schema) {
|
|
26
|
+
var error, validatedInput;
|
|
27
|
+
// Validate body against known zod schema
|
|
28
|
+
try {
|
|
29
|
+
validatedInput = schema.parse(data);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (err instanceof zod_1.z.ZodError)
|
|
33
|
+
error = JSON.parse(err.message);
|
|
34
|
+
else
|
|
35
|
+
error = 'Unknown validation error!'; //unhandled case, hard to test
|
|
36
|
+
}
|
|
37
|
+
// Error validation
|
|
38
|
+
if (!validatedInput || error) {
|
|
39
|
+
return Response_1.default.BadRequestResponse(Globals_1.default.ErrorResponseValidationFail, Globals_1.default.ErrorCode_InvalidInput, { validationFailure: error });
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return Validator;
|
|
46
|
+
}());
|
|
47
|
+
exports.default = Validator;
|
|
48
|
+
//# sourceMappingURL=Validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Validator.js","sourceRoot":"","sources":["../../../src/Validation/Validator.ts"],"names":[],"mappings":";;AAAA,2BAAuB;AAEvB,4CAA6D;AAC7D,sCAAgC;AAEhC;;;;;;GAMG;AACH;IAAA;IAiCA,CAAC;IAhCC;;;;;;;;OAQG;IACW,wBAAc,GAA5B,UACE,IAAS,EACT,MAAwB;QAExB,IAAI,KAAK,EAAE,cAAc,CAAA;QACzB,yCAAyC;QACzC,IAAI;YACF,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAA;SACrD;QAAC,OAAO,GAAqB,EAAE;YAC9B,IAAI,GAAG,YAAY,OAAC,CAAC,QAAQ;gBAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;;gBACzD,KAAK,GAAG,2BAA2B,CAAA,CAAC,8BAA8B;SACxE;QACD,mBAAmB;QACnB,IAAI,CAAC,cAAc,IAAI,KAAK,EAAE;YAC5B,OAAO,kBAAQ,CAAC,kBAAkB,CAChC,iBAAO,CAAC,2BAA2B,EACnC,iBAAO,CAAC,sBAAsB,EAC9B,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAA;SACF;aAAM;YACL,OAAO,IAAI,CAAA;SACZ;IACH,CAAC;IACH,gBAAC;AAAD,CAAC,AAjCD,IAiCC"}
|
package/index.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import Response from
|
|
2
|
-
import Utils from
|
|
3
|
-
import EventProcessor from
|
|
4
|
-
import Process from
|
|
5
|
-
import Transaction from
|
|
6
|
-
import Configuration from
|
|
7
|
-
import Crypto from
|
|
8
|
-
import JWT from
|
|
9
|
-
import Mailer from
|
|
10
|
-
import Router, { Route } from
|
|
1
|
+
import Response, { ResponseErrorType } from './src/API/Response'
|
|
2
|
+
import Utils from './src/API/Utils'
|
|
3
|
+
import EventProcessor from './src/BaseEvent/EventProcessor'
|
|
4
|
+
import Process from './src/BaseEvent/Process'
|
|
5
|
+
import Transaction from './src/BaseEvent/Transaction'
|
|
6
|
+
import Configuration from './src/Config/Configuration'
|
|
7
|
+
import Crypto from './src/Crypto/Crypto'
|
|
8
|
+
import JWT from './src/Crypto/JWT'
|
|
9
|
+
import Mailer from './src/Mailer/Mailer'
|
|
10
|
+
import Router, { Route } from './src/Server/Router'
|
|
11
11
|
|
|
12
12
|
export {
|
|
13
13
|
// Base Events
|
|
@@ -25,4 +25,6 @@ export {
|
|
|
25
25
|
// Helpers
|
|
26
26
|
Utils,
|
|
27
27
|
Route,
|
|
28
|
+
// Misc types
|
|
29
|
+
ResponseErrorType,
|
|
28
30
|
}
|
package/jest.config.ts
CHANGED
|
@@ -1,32 +1,25 @@
|
|
|
1
|
-
import type { Config } from
|
|
1
|
+
import type { Config } from '@jest/types'
|
|
2
2
|
/* eslint-env node */
|
|
3
3
|
const config: Config.InitialOptions = {
|
|
4
|
-
preset:
|
|
5
|
-
testEnvironment:
|
|
4
|
+
preset: 'ts-jest',
|
|
5
|
+
testEnvironment: 'node',
|
|
6
6
|
reporters: [
|
|
7
|
-
|
|
7
|
+
'default',
|
|
8
8
|
[
|
|
9
|
-
|
|
9
|
+
'jest-junit',
|
|
10
10
|
{
|
|
11
|
-
outputDirectory:
|
|
12
|
-
outputName:
|
|
13
|
-
ancestorSeparator:
|
|
14
|
-
uniqueOutputName:
|
|
15
|
-
suiteNameTemplate:
|
|
16
|
-
classNameTemplate:
|
|
17
|
-
titleTemplate:
|
|
11
|
+
outputDirectory: 'coverage',
|
|
12
|
+
outputName: 'jest-junit.xml',
|
|
13
|
+
ancestorSeparator: ' › ',
|
|
14
|
+
uniqueOutputName: 'false',
|
|
15
|
+
suiteNameTemplate: '{filepath}',
|
|
16
|
+
classNameTemplate: '{classname}',
|
|
17
|
+
titleTemplate: '{title}',
|
|
18
18
|
},
|
|
19
19
|
],
|
|
20
20
|
],
|
|
21
|
-
coverageReporters: [
|
|
22
|
-
|
|
23
|
-
"json",
|
|
24
|
-
"lcov",
|
|
25
|
-
"text",
|
|
26
|
-
["text", { file: "coverage.txt" }],
|
|
27
|
-
"json-summary",
|
|
28
|
-
],
|
|
29
|
-
collectCoverageFrom: ["src/**/*.(t|j)s"],
|
|
21
|
+
coverageReporters: ['clover', 'json', 'lcov', ['text', { file: 'coverage.txt' }], 'json-summary'],
|
|
22
|
+
collectCoverageFrom: ['src/**/*.(t|j)s'],
|
|
30
23
|
coverageThreshold: {
|
|
31
24
|
global: {
|
|
32
25
|
branches: 80,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@creator.co/wapi",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"clean": "tsc --build --clean",
|
|
11
11
|
"lint-fix": "eslint . --ext .ts --fix",
|
|
12
12
|
"lint": "eslint . --ext .ts",
|
|
13
|
-
"test": "jest --coverage --silent --runInBand",
|
|
14
|
-
"test-dev": "jest --coverage --runInBand"
|
|
13
|
+
"test": "jest --coverage --silent --runInBand && cat coverage/coverage.txt",
|
|
14
|
+
"test-dev": "jest --coverage --runInBand && cat coverage/coverage.txt"
|
|
15
15
|
},
|
|
16
16
|
"author": "",
|
|
17
17
|
"license": "ISC",
|