ee-core 2.9.2 → 2.10.1

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.
Files changed (103) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +65 -65
  3. package/addon/index.js +34 -34
  4. package/addon/window/index.js +98 -98
  5. package/bin/tools.js +8 -8
  6. package/config/cache.js +41 -38
  7. package/config/config.default.js +331 -330
  8. package/config/index.js +86 -73
  9. package/const/channel.js +17 -17
  10. package/const/index.js +8 -8
  11. package/controller/baseContextClass.js +34 -34
  12. package/controller/index.js +34 -34
  13. package/core/index.js +10 -10
  14. package/core/lib/ee.js +216 -216
  15. package/core/lib/loader/context_loader.js +106 -106
  16. package/core/lib/loader/ee_loader.js +435 -435
  17. package/core/lib/loader/file_loader.js +326 -326
  18. package/core/lib/loader/mixin/addon.js +32 -32
  19. package/core/lib/loader/mixin/config.js +130 -130
  20. package/core/lib/loader/mixin/controller.js +125 -125
  21. package/core/lib/loader/mixin/service.js +28 -28
  22. package/core/lib/utils/base_context_class.js +34 -34
  23. package/core/lib/utils/function.js +30 -30
  24. package/core/lib/utils/index.js +133 -133
  25. package/core/lib/utils/sequencify.js +59 -59
  26. package/core/lib/utils/timing.js +77 -77
  27. package/cross/index.js +183 -183
  28. package/cross/spawnProcess.js +183 -183
  29. package/ee/appLoader.js +48 -48
  30. package/ee/application.js +99 -99
  31. package/ee/baseApp.js +103 -102
  32. package/ee/eeApp.js +408 -408
  33. package/ee/index.js +57 -57
  34. package/electron/app/index.js +64 -58
  35. package/electron/index.js +19 -19
  36. package/electron/window/index.js +73 -73
  37. package/electron/window/winState.js +186 -186
  38. package/exception/index.js +112 -112
  39. package/html/boot.html +98 -98
  40. package/html/cross-failure.html +28 -28
  41. package/html/failure.html +28 -28
  42. package/html/index.js +13 -13
  43. package/httpclient/index.js +161 -161
  44. package/index.js +54 -54
  45. package/jobs/baseJobClass.js +16 -16
  46. package/jobs/child/app.js +58 -65
  47. package/jobs/child/forkProcess.js +145 -145
  48. package/jobs/child/index.js +82 -82
  49. package/jobs/child-pool/index.js +213 -213
  50. package/jobs/index.js +8 -8
  51. package/jobs/load-balancer/algorithm/index.js +11 -11
  52. package/jobs/load-balancer/algorithm/minimumConnection.js +18 -18
  53. package/jobs/load-balancer/algorithm/polling.js +11 -11
  54. package/jobs/load-balancer/algorithm/random.js +9 -9
  55. package/jobs/load-balancer/algorithm/specify.js +14 -14
  56. package/jobs/load-balancer/algorithm/weights.js +21 -21
  57. package/jobs/load-balancer/algorithm/weightsMinimumConnection.js +29 -29
  58. package/jobs/load-balancer/algorithm/weightsPolling.js +22 -22
  59. package/jobs/load-balancer/algorithm/weightsRandom.js +16 -16
  60. package/jobs/load-balancer/consts.js +9 -9
  61. package/jobs/load-balancer/index.js +201 -201
  62. package/jobs/load-balancer/scheduler.js +31 -31
  63. package/jobs/renderer/index.js +141 -141
  64. package/jobs/renderer/loadView.js +40 -40
  65. package/jobs/unification.js +63 -63
  66. package/loader/index.js +172 -172
  67. package/log/index.js +68 -68
  68. package/log/logger.js +86 -80
  69. package/main/index.js +56 -56
  70. package/message/childMessage.js +54 -54
  71. package/message/index.js +18 -18
  72. package/old-utils/index.js +91 -91
  73. package/package.json +38 -38
  74. package/ps/index.js +371 -371
  75. package/services/baseContextClass.js +34 -34
  76. package/services/index.js +40 -40
  77. package/socket/httpServer.js +147 -147
  78. package/socket/index.js +81 -81
  79. package/socket/io.js +27 -27
  80. package/socket/ipcServer.js +112 -112
  81. package/socket/socketServer.js +69 -67
  82. package/storage/index.js +38 -38
  83. package/storage/jsondb/adapters/Base.js +23 -23
  84. package/storage/jsondb/adapters/FileSync.js +64 -52
  85. package/storage/jsondb/main.js +55 -42
  86. package/storage/jsondbStorage.js +195 -195
  87. package/storage/sqliteStorage.js +123 -123
  88. package/utils/co.js +237 -237
  89. package/utils/copyto.js +160 -160
  90. package/utils/depd/index.js +538 -538
  91. package/utils/depd/lib/browser/index.js +77 -77
  92. package/utils/extend.js +73 -73
  93. package/utils/get-port/index.d.ts +64 -64
  94. package/utils/get-port/index.js +148 -148
  95. package/utils/helper.js +220 -220
  96. package/utils/index.js +160 -160
  97. package/utils/ip.js +261 -261
  98. package/utils/is.js +145 -145
  99. package/utils/json.js +72 -72
  100. package/utils/pargv.js +263 -263
  101. package/utils/time/index.js +19 -19
  102. package/utils/time/ms.js +162 -162
  103. package/utils/wrap.js +35 -35
package/utils/pargv.js CHANGED
@@ -1,263 +1,263 @@
1
- 'use strict';
2
-
3
- function hasKey(obj, keys) {
4
- var o = obj;
5
- keys.slice(0, -1).forEach(function (key) {
6
- o = o[key] || {};
7
- });
8
-
9
- var key = keys[keys.length - 1];
10
- return key in o;
11
- }
12
-
13
- function isNumber(x) {
14
- if (typeof x === 'number') { return true; }
15
- if ((/^0x[0-9a-f]+$/i).test(x)) { return true; }
16
- return (/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/).test(x);
17
- }
18
-
19
- function isConstructorOrProto(obj, key) {
20
- return (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__';
21
- }
22
-
23
- module.exports = function (args, opts) {
24
- if (!opts) { opts = {}; }
25
-
26
- var flags = {
27
- bools: {},
28
- strings: {},
29
- unknownFn: null,
30
- };
31
-
32
- if (typeof opts.unknown === 'function') {
33
- flags.unknownFn = opts.unknown;
34
- }
35
-
36
- if (typeof opts.boolean === 'boolean' && opts.boolean) {
37
- flags.allBools = true;
38
- } else {
39
- [].concat(opts.boolean).filter(Boolean).forEach(function (key) {
40
- flags.bools[key] = true;
41
- });
42
- }
43
-
44
- var aliases = {};
45
-
46
- function aliasIsBoolean(key) {
47
- return aliases[key].some(function (x) {
48
- return flags.bools[x];
49
- });
50
- }
51
-
52
- Object.keys(opts.alias || {}).forEach(function (key) {
53
- aliases[key] = [].concat(opts.alias[key]);
54
- aliases[key].forEach(function (x) {
55
- aliases[x] = [key].concat(aliases[key].filter(function (y) {
56
- return x !== y;
57
- }));
58
- });
59
- });
60
-
61
- [].concat(opts.string).filter(Boolean).forEach(function (key) {
62
- flags.strings[key] = true;
63
- if (aliases[key]) {
64
- [].concat(aliases[key]).forEach(function (k) {
65
- flags.strings[k] = true;
66
- });
67
- }
68
- });
69
-
70
- var defaults = opts.default || {};
71
-
72
- var argv = { _: [] };
73
-
74
- function argDefined(key, arg) {
75
- return (flags.allBools && (/^--[^=]+$/).test(arg))
76
- || flags.strings[key]
77
- || flags.bools[key]
78
- || aliases[key];
79
- }
80
-
81
- function setKey(obj, keys, value) {
82
- var o = obj;
83
- for (var i = 0; i < keys.length - 1; i++) {
84
- var key = keys[i];
85
- if (isConstructorOrProto(o, key)) { return; }
86
- if (o[key] === undefined) { o[key] = {}; }
87
- if (
88
- o[key] === Object.prototype
89
- || o[key] === Number.prototype
90
- || o[key] === String.prototype
91
- ) {
92
- o[key] = {};
93
- }
94
- if (o[key] === Array.prototype) { o[key] = []; }
95
- o = o[key];
96
- }
97
-
98
- var lastKey = keys[keys.length - 1];
99
- if (isConstructorOrProto(o, lastKey)) { return; }
100
- if (
101
- o === Object.prototype
102
- || o === Number.prototype
103
- || o === String.prototype
104
- ) {
105
- o = {};
106
- }
107
- if (o === Array.prototype) { o = []; }
108
- if (o[lastKey] === undefined || flags.bools[lastKey] || typeof o[lastKey] === 'boolean') {
109
- o[lastKey] = value;
110
- } else if (Array.isArray(o[lastKey])) {
111
- o[lastKey].push(value);
112
- } else {
113
- o[lastKey] = [o[lastKey], value];
114
- }
115
- }
116
-
117
- function setArg(key, val, arg) {
118
- if (arg && flags.unknownFn && !argDefined(key, arg)) {
119
- if (flags.unknownFn(arg) === false) { return; }
120
- }
121
-
122
- var value = !flags.strings[key] && isNumber(val)
123
- ? Number(val)
124
- : val;
125
- setKey(argv, key.split('.'), value);
126
-
127
- (aliases[key] || []).forEach(function (x) {
128
- setKey(argv, x.split('.'), value);
129
- });
130
- }
131
-
132
- Object.keys(flags.bools).forEach(function (key) {
133
- setArg(key, defaults[key] === undefined ? false : defaults[key]);
134
- });
135
-
136
- var notFlags = [];
137
-
138
- if (args.indexOf('--') !== -1) {
139
- notFlags = args.slice(args.indexOf('--') + 1);
140
- args = args.slice(0, args.indexOf('--'));
141
- }
142
-
143
- for (var i = 0; i < args.length; i++) {
144
- var arg = args[i];
145
- var key;
146
- var next;
147
-
148
- if ((/^--.+=/).test(arg)) {
149
- // Using [\s\S] instead of . because js doesn't support the
150
- // 'dotall' regex modifier. See:
151
- // http://stackoverflow.com/a/1068308/13216
152
- var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
153
- key = m[1];
154
- var value = m[2];
155
- if (flags.bools[key]) {
156
- value = value !== 'false';
157
- }
158
- setArg(key, value, arg);
159
- } else if ((/^--no-.+/).test(arg)) {
160
- key = arg.match(/^--no-(.+)/)[1];
161
- setArg(key, false, arg);
162
- } else if ((/^--.+/).test(arg)) {
163
- key = arg.match(/^--(.+)/)[1];
164
- next = args[i + 1];
165
- if (
166
- next !== undefined
167
- && !(/^(-|--)[^-]/).test(next)
168
- && !flags.bools[key]
169
- && !flags.allBools
170
- && (aliases[key] ? !aliasIsBoolean(key) : true)
171
- ) {
172
- setArg(key, next, arg);
173
- i += 1;
174
- } else if ((/^(true|false)$/).test(next)) {
175
- setArg(key, next === 'true', arg);
176
- i += 1;
177
- } else {
178
- setArg(key, flags.strings[key] ? '' : true, arg);
179
- }
180
- } else if ((/^-[^-]+/).test(arg)) {
181
- var letters = arg.slice(1, -1).split('');
182
-
183
- var broken = false;
184
- for (var j = 0; j < letters.length; j++) {
185
- next = arg.slice(j + 2);
186
-
187
- if (next === '-') {
188
- setArg(letters[j], next, arg);
189
- continue;
190
- }
191
-
192
- if ((/[A-Za-z]/).test(letters[j]) && next[0] === '=') {
193
- setArg(letters[j], next.slice(1), arg);
194
- broken = true;
195
- break;
196
- }
197
-
198
- if (
199
- (/[A-Za-z]/).test(letters[j])
200
- && (/-?\d+(\.\d*)?(e-?\d+)?$/).test(next)
201
- ) {
202
- setArg(letters[j], next, arg);
203
- broken = true;
204
- break;
205
- }
206
-
207
- if (letters[j + 1] && letters[j + 1].match(/\W/)) {
208
- setArg(letters[j], arg.slice(j + 2), arg);
209
- broken = true;
210
- break;
211
- } else {
212
- setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
213
- }
214
- }
215
-
216
- key = arg.slice(-1)[0];
217
- if (!broken && key !== '-') {
218
- if (
219
- args[i + 1]
220
- && !(/^(-|--)[^-]/).test(args[i + 1])
221
- && !flags.bools[key]
222
- && (aliases[key] ? !aliasIsBoolean(key) : true)
223
- ) {
224
- setArg(key, args[i + 1], arg);
225
- i += 1;
226
- } else if (args[i + 1] && (/^(true|false)$/).test(args[i + 1])) {
227
- setArg(key, args[i + 1] === 'true', arg);
228
- i += 1;
229
- } else {
230
- setArg(key, flags.strings[key] ? '' : true, arg);
231
- }
232
- }
233
- } else {
234
- if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
235
- argv._.push(flags.strings._ || !isNumber(arg) ? arg : Number(arg));
236
- }
237
- if (opts.stopEarly) {
238
- argv._.push.apply(argv._, args.slice(i + 1));
239
- break;
240
- }
241
- }
242
- }
243
-
244
- Object.keys(defaults).forEach(function (k) {
245
- if (!hasKey(argv, k.split('.'))) {
246
- setKey(argv, k.split('.'), defaults[k]);
247
-
248
- (aliases[k] || []).forEach(function (x) {
249
- setKey(argv, x.split('.'), defaults[k]);
250
- });
251
- }
252
- });
253
-
254
- if (opts['--']) {
255
- argv['--'] = notFlags.slice();
256
- } else {
257
- notFlags.forEach(function (k) {
258
- argv._.push(k);
259
- });
260
- }
261
-
262
- return argv;
263
- };
1
+ 'use strict';
2
+
3
+ function hasKey(obj, keys) {
4
+ var o = obj;
5
+ keys.slice(0, -1).forEach(function (key) {
6
+ o = o[key] || {};
7
+ });
8
+
9
+ var key = keys[keys.length - 1];
10
+ return key in o;
11
+ }
12
+
13
+ function isNumber(x) {
14
+ if (typeof x === 'number') { return true; }
15
+ if ((/^0x[0-9a-f]+$/i).test(x)) { return true; }
16
+ return (/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/).test(x);
17
+ }
18
+
19
+ function isConstructorOrProto(obj, key) {
20
+ return (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__';
21
+ }
22
+
23
+ module.exports = function (args, opts) {
24
+ if (!opts) { opts = {}; }
25
+
26
+ var flags = {
27
+ bools: {},
28
+ strings: {},
29
+ unknownFn: null,
30
+ };
31
+
32
+ if (typeof opts.unknown === 'function') {
33
+ flags.unknownFn = opts.unknown;
34
+ }
35
+
36
+ if (typeof opts.boolean === 'boolean' && opts.boolean) {
37
+ flags.allBools = true;
38
+ } else {
39
+ [].concat(opts.boolean).filter(Boolean).forEach(function (key) {
40
+ flags.bools[key] = true;
41
+ });
42
+ }
43
+
44
+ var aliases = {};
45
+
46
+ function aliasIsBoolean(key) {
47
+ return aliases[key].some(function (x) {
48
+ return flags.bools[x];
49
+ });
50
+ }
51
+
52
+ Object.keys(opts.alias || {}).forEach(function (key) {
53
+ aliases[key] = [].concat(opts.alias[key]);
54
+ aliases[key].forEach(function (x) {
55
+ aliases[x] = [key].concat(aliases[key].filter(function (y) {
56
+ return x !== y;
57
+ }));
58
+ });
59
+ });
60
+
61
+ [].concat(opts.string).filter(Boolean).forEach(function (key) {
62
+ flags.strings[key] = true;
63
+ if (aliases[key]) {
64
+ [].concat(aliases[key]).forEach(function (k) {
65
+ flags.strings[k] = true;
66
+ });
67
+ }
68
+ });
69
+
70
+ var defaults = opts.default || {};
71
+
72
+ var argv = { _: [] };
73
+
74
+ function argDefined(key, arg) {
75
+ return (flags.allBools && (/^--[^=]+$/).test(arg))
76
+ || flags.strings[key]
77
+ || flags.bools[key]
78
+ || aliases[key];
79
+ }
80
+
81
+ function setKey(obj, keys, value) {
82
+ var o = obj;
83
+ for (var i = 0; i < keys.length - 1; i++) {
84
+ var key = keys[i];
85
+ if (isConstructorOrProto(o, key)) { return; }
86
+ if (o[key] === undefined) { o[key] = {}; }
87
+ if (
88
+ o[key] === Object.prototype
89
+ || o[key] === Number.prototype
90
+ || o[key] === String.prototype
91
+ ) {
92
+ o[key] = {};
93
+ }
94
+ if (o[key] === Array.prototype) { o[key] = []; }
95
+ o = o[key];
96
+ }
97
+
98
+ var lastKey = keys[keys.length - 1];
99
+ if (isConstructorOrProto(o, lastKey)) { return; }
100
+ if (
101
+ o === Object.prototype
102
+ || o === Number.prototype
103
+ || o === String.prototype
104
+ ) {
105
+ o = {};
106
+ }
107
+ if (o === Array.prototype) { o = []; }
108
+ if (o[lastKey] === undefined || flags.bools[lastKey] || typeof o[lastKey] === 'boolean') {
109
+ o[lastKey] = value;
110
+ } else if (Array.isArray(o[lastKey])) {
111
+ o[lastKey].push(value);
112
+ } else {
113
+ o[lastKey] = [o[lastKey], value];
114
+ }
115
+ }
116
+
117
+ function setArg(key, val, arg) {
118
+ if (arg && flags.unknownFn && !argDefined(key, arg)) {
119
+ if (flags.unknownFn(arg) === false) { return; }
120
+ }
121
+
122
+ var value = !flags.strings[key] && isNumber(val)
123
+ ? Number(val)
124
+ : val;
125
+ setKey(argv, key.split('.'), value);
126
+
127
+ (aliases[key] || []).forEach(function (x) {
128
+ setKey(argv, x.split('.'), value);
129
+ });
130
+ }
131
+
132
+ Object.keys(flags.bools).forEach(function (key) {
133
+ setArg(key, defaults[key] === undefined ? false : defaults[key]);
134
+ });
135
+
136
+ var notFlags = [];
137
+
138
+ if (args.indexOf('--') !== -1) {
139
+ notFlags = args.slice(args.indexOf('--') + 1);
140
+ args = args.slice(0, args.indexOf('--'));
141
+ }
142
+
143
+ for (var i = 0; i < args.length; i++) {
144
+ var arg = args[i];
145
+ var key;
146
+ var next;
147
+
148
+ if ((/^--.+=/).test(arg)) {
149
+ // Using [\s\S] instead of . because js doesn't support the
150
+ // 'dotall' regex modifier. See:
151
+ // http://stackoverflow.com/a/1068308/13216
152
+ var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
153
+ key = m[1];
154
+ var value = m[2];
155
+ if (flags.bools[key]) {
156
+ value = value !== 'false';
157
+ }
158
+ setArg(key, value, arg);
159
+ } else if ((/^--no-.+/).test(arg)) {
160
+ key = arg.match(/^--no-(.+)/)[1];
161
+ setArg(key, false, arg);
162
+ } else if ((/^--.+/).test(arg)) {
163
+ key = arg.match(/^--(.+)/)[1];
164
+ next = args[i + 1];
165
+ if (
166
+ next !== undefined
167
+ && !(/^(-|--)[^-]/).test(next)
168
+ && !flags.bools[key]
169
+ && !flags.allBools
170
+ && (aliases[key] ? !aliasIsBoolean(key) : true)
171
+ ) {
172
+ setArg(key, next, arg);
173
+ i += 1;
174
+ } else if ((/^(true|false)$/).test(next)) {
175
+ setArg(key, next === 'true', arg);
176
+ i += 1;
177
+ } else {
178
+ setArg(key, flags.strings[key] ? '' : true, arg);
179
+ }
180
+ } else if ((/^-[^-]+/).test(arg)) {
181
+ var letters = arg.slice(1, -1).split('');
182
+
183
+ var broken = false;
184
+ for (var j = 0; j < letters.length; j++) {
185
+ next = arg.slice(j + 2);
186
+
187
+ if (next === '-') {
188
+ setArg(letters[j], next, arg);
189
+ continue;
190
+ }
191
+
192
+ if ((/[A-Za-z]/).test(letters[j]) && next[0] === '=') {
193
+ setArg(letters[j], next.slice(1), arg);
194
+ broken = true;
195
+ break;
196
+ }
197
+
198
+ if (
199
+ (/[A-Za-z]/).test(letters[j])
200
+ && (/-?\d+(\.\d*)?(e-?\d+)?$/).test(next)
201
+ ) {
202
+ setArg(letters[j], next, arg);
203
+ broken = true;
204
+ break;
205
+ }
206
+
207
+ if (letters[j + 1] && letters[j + 1].match(/\W/)) {
208
+ setArg(letters[j], arg.slice(j + 2), arg);
209
+ broken = true;
210
+ break;
211
+ } else {
212
+ setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
213
+ }
214
+ }
215
+
216
+ key = arg.slice(-1)[0];
217
+ if (!broken && key !== '-') {
218
+ if (
219
+ args[i + 1]
220
+ && !(/^(-|--)[^-]/).test(args[i + 1])
221
+ && !flags.bools[key]
222
+ && (aliases[key] ? !aliasIsBoolean(key) : true)
223
+ ) {
224
+ setArg(key, args[i + 1], arg);
225
+ i += 1;
226
+ } else if (args[i + 1] && (/^(true|false)$/).test(args[i + 1])) {
227
+ setArg(key, args[i + 1] === 'true', arg);
228
+ i += 1;
229
+ } else {
230
+ setArg(key, flags.strings[key] ? '' : true, arg);
231
+ }
232
+ }
233
+ } else {
234
+ if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
235
+ argv._.push(flags.strings._ || !isNumber(arg) ? arg : Number(arg));
236
+ }
237
+ if (opts.stopEarly) {
238
+ argv._.push.apply(argv._, args.slice(i + 1));
239
+ break;
240
+ }
241
+ }
242
+ }
243
+
244
+ Object.keys(defaults).forEach(function (k) {
245
+ if (!hasKey(argv, k.split('.'))) {
246
+ setKey(argv, k.split('.'), defaults[k]);
247
+
248
+ (aliases[k] || []).forEach(function (x) {
249
+ setKey(argv, x.split('.'), defaults[k]);
250
+ });
251
+ }
252
+ });
253
+
254
+ if (opts['--']) {
255
+ argv['--'] = notFlags.slice();
256
+ } else {
257
+ notFlags.forEach(function (k) {
258
+ argv._.push(k);
259
+ });
260
+ }
261
+
262
+ return argv;
263
+ };
@@ -1,20 +1,20 @@
1
- 'use strict';
2
-
3
- const util = require('util');
4
- const ms = require('./ms');
5
-
6
- function humanizeToMs (t) {
7
- if (typeof t === 'number') return t;
8
- var r = ms(t);
9
- if (r === undefined) {
10
- var err = new Error(util.format('humanize-ms(%j) result undefined', t));
11
- console.warn(err.stack);
12
- }
13
- return r;
14
- }
15
-
16
- const TIME = {
17
- humanizeToMs,
18
- ms
19
- }
1
+ 'use strict';
2
+
3
+ const util = require('util');
4
+ const ms = require('./ms');
5
+
6
+ function humanizeToMs (t) {
7
+ if (typeof t === 'number') return t;
8
+ var r = ms(t);
9
+ if (r === undefined) {
10
+ var err = new Error(util.format('humanize-ms(%j) result undefined', t));
11
+ console.warn(err.stack);
12
+ }
13
+ return r;
14
+ }
15
+
16
+ const TIME = {
17
+ humanizeToMs,
18
+ ms
19
+ }
20
20
  module.exports = TIME;