@catbee/utils 0.0.8-rc.0 → 0.0.8-rc.2
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 +25 -1
- package/build/esm/config.d.ts +0 -1
- package/build/esm/config.js +6 -7
- package/build/esm/index.d.ts +0 -1
- package/build/esm/index.js +0 -1
- package/build/esm/servers/server.builder.d.ts +0 -1
- package/build/esm/servers/server.builder.js +99 -147
- package/build/esm/servers/server.d.ts +0 -1
- package/build/esm/servers/server.js +591 -876
- package/build/esm/types/api-response.d.ts +0 -1
- package/build/esm/types/api-response.js +0 -1
- package/build/esm/types/index.d.ts +0 -1
- package/build/esm/types/index.js +0 -1
- package/build/esm/types/server.d.ts +0 -1
- package/build/esm/types/server.js +0 -1
- package/build/esm/utils/array.utils.d.ts +0 -1
- package/build/esm/utils/array.utils.js +48 -86
- package/build/esm/utils/async.utils.d.ts +0 -1
- package/build/esm/utils/async.utils.js +247 -524
- package/build/esm/utils/cache.utils.d.ts +0 -1
- package/build/esm/utils/cache.utils.js +96 -301
- package/build/esm/utils/context-store.utils.d.ts +0 -1
- package/build/esm/utils/context-store.utils.js +62 -79
- package/build/esm/utils/crypto.utils.d.ts +0 -1
- package/build/esm/utils/crypto.utils.js +78 -175
- package/build/esm/utils/date.utils.d.ts +0 -1
- package/build/esm/utils/date.utils.js +47 -53
- package/build/esm/utils/decorators.utils.d.ts +201 -5
- package/build/esm/utils/decorators.utils.js +632 -285
- package/build/esm/utils/dir.utils.d.ts +0 -1
- package/build/esm/utils/dir.utils.js +264 -786
- package/build/esm/utils/env.utils.d.ts +0 -1
- package/build/esm/utils/env.utils.js +180 -271
- package/build/esm/utils/exception.utils.d.ts +0 -1
- package/build/esm/utils/exception.utils.js +112 -289
- package/build/esm/utils/fs.utils.d.ts +0 -1
- package/build/esm/utils/fs.utils.js +169 -401
- package/build/esm/utils/http-status-codes.d.ts +0 -1
- package/build/esm/utils/http-status-codes.js +0 -1
- package/build/esm/utils/id.utils.d.ts +0 -1
- package/build/esm/utils/id.utils.js +5 -9
- package/build/esm/utils/logger.utils.d.ts +0 -1
- package/build/esm/utils/logger.utils.js +34 -71
- package/build/esm/utils/middleware.utils.d.ts +0 -1
- package/build/esm/utils/middleware.utils.js +65 -155
- package/build/esm/utils/obj.utils.d.ts +0 -1
- package/build/esm/utils/obj.utils.js +69 -176
- package/build/esm/utils/performance.utils.d.ts +0 -1
- package/build/esm/utils/performance.utils.js +92 -195
- package/build/esm/utils/request.utils.d.ts +0 -1
- package/build/esm/utils/request.utils.js +41 -74
- package/build/esm/utils/response.utils.d.ts +0 -1
- package/build/esm/utils/response.utils.js +84 -107
- package/build/esm/utils/stream.utils.d.ts +0 -1
- package/build/esm/utils/stream.utils.js +38 -113
- package/build/esm/utils/string.utils.d.ts +0 -1
- package/build/esm/utils/string.utils.js +6 -11
- package/build/esm/utils/type.utils.d.ts +0 -1
- package/build/esm/utils/type.utils.js +8 -12
- package/build/esm/utils/url.utils.d.ts +0 -1
- package/build/esm/utils/url.utils.js +49 -127
- package/build/esm/utils/validate.utils.d.ts +0 -1
- package/build/esm/utils/validate.utils.js +23 -40
- package/package.json +3 -33
- package/build/esm/config.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/esm/servers/server.builder.js.map +0 -1
- package/build/esm/servers/server.js.map +0 -1
- package/build/esm/types/api-response.js.map +0 -1
- package/build/esm/types/index.js.map +0 -1
- package/build/esm/types/server.js.map +0 -1
- package/build/esm/utils/array.utils.js.map +0 -1
- package/build/esm/utils/async.utils.js.map +0 -1
- package/build/esm/utils/cache.utils.js.map +0 -1
- package/build/esm/utils/context-store.utils.js.map +0 -1
- package/build/esm/utils/crypto.utils.js.map +0 -1
- package/build/esm/utils/date.utils.js.map +0 -1
- package/build/esm/utils/decorators.utils.js.map +0 -1
- package/build/esm/utils/dir.utils.js.map +0 -1
- package/build/esm/utils/env.utils.js.map +0 -1
- package/build/esm/utils/exception.utils.js.map +0 -1
- package/build/esm/utils/fs.utils.js.map +0 -1
- package/build/esm/utils/http-status-codes.js.map +0 -1
- package/build/esm/utils/id.utils.js.map +0 -1
- package/build/esm/utils/logger.utils.js.map +0 -1
- package/build/esm/utils/middleware.utils.js.map +0 -1
- package/build/esm/utils/obj.utils.js.map +0 -1
- package/build/esm/utils/performance.utils.js.map +0 -1
- package/build/esm/utils/request.utils.js.map +0 -1
- package/build/esm/utils/response.utils.js.map +0 -1
- package/build/esm/utils/stream.utils.js.map +0 -1
- package/build/esm/utils/string.utils.js.map +0 -1
- package/build/esm/utils/type.utils.js.map +0 -1
- package/build/esm/utils/url.utils.js.map +0 -1
- package/build/esm/utils/validate.utils.js.map +0 -1
- package/build/esnext/config.d.ts +0 -122
- package/build/esnext/config.js +0 -133
- package/build/esnext/config.js.map +0 -1
- package/build/esnext/index.d.ts +0 -27
- package/build/esnext/index.js +0 -50
- package/build/esnext/index.js.map +0 -1
- package/build/esnext/servers/server.builder.d.ts +0 -508
- package/build/esnext/servers/server.builder.js +0 -657
- package/build/esnext/servers/server.builder.js.map +0 -1
- package/build/esnext/servers/server.d.ts +0 -256
- package/build/esnext/servers/server.js +0 -955
- package/build/esnext/servers/server.js.map +0 -1
- package/build/esnext/types/api-response.d.ts +0 -152
- package/build/esnext/types/api-response.js +0 -34
- package/build/esnext/types/api-response.js.map +0 -1
- package/build/esnext/types/index.d.ts +0 -125
- package/build/esnext/types/index.js +0 -25
- package/build/esnext/types/index.js.map +0 -1
- package/build/esnext/types/server.d.ts +0 -268
- package/build/esnext/types/server.js +0 -25
- package/build/esnext/types/server.js.map +0 -1
- package/build/esnext/utils/array.utils.d.ts +0 -168
- package/build/esnext/utils/array.utils.js +0 -345
- package/build/esnext/utils/array.utils.js.map +0 -1
- package/build/esnext/utils/async.utils.d.ts +0 -265
- package/build/esnext/utils/async.utils.js +0 -620
- package/build/esnext/utils/async.utils.js.map +0 -1
- package/build/esnext/utils/cache.utils.d.ts +0 -153
- package/build/esnext/utils/cache.utils.js +0 -293
- package/build/esnext/utils/cache.utils.js.map +0 -1
- package/build/esnext/utils/context-store.utils.d.ts +0 -189
- package/build/esnext/utils/context-store.utils.js +0 -289
- package/build/esnext/utils/context-store.utils.js.map +0 -1
- package/build/esnext/utils/crypto.utils.d.ts +0 -160
- package/build/esnext/utils/crypto.utils.js +0 -276
- package/build/esnext/utils/crypto.utils.js.map +0 -1
- package/build/esnext/utils/date.utils.d.ts +0 -159
- package/build/esnext/utils/date.utils.js +0 -384
- package/build/esnext/utils/date.utils.js.map +0 -1
- package/build/esnext/utils/decorators.utils.d.ts +0 -315
- package/build/esnext/utils/decorators.utils.js +0 -504
- package/build/esnext/utils/decorators.utils.js.map +0 -1
- package/build/esnext/utils/dir.utils.d.ts +0 -196
- package/build/esnext/utils/dir.utils.js +0 -477
- package/build/esnext/utils/dir.utils.js.map +0 -1
- package/build/esnext/utils/env.utils.d.ts +0 -377
- package/build/esnext/utils/env.utils.js +0 -785
- package/build/esnext/utils/env.utils.js.map +0 -1
- package/build/esnext/utils/exception.utils.d.ts +0 -230
- package/build/esnext/utils/exception.utils.js +0 -381
- package/build/esnext/utils/exception.utils.js.map +0 -1
- package/build/esnext/utils/fs.utils.d.ts +0 -164
- package/build/esnext/utils/fs.utils.js +0 -349
- package/build/esnext/utils/fs.utils.js.map +0 -1
- package/build/esnext/utils/http-status-codes.d.ts +0 -266
- package/build/esnext/utils/http-status-codes.js +0 -295
- package/build/esnext/utils/http-status-codes.js.map +0 -1
- package/build/esnext/utils/id.utils.d.ts +0 -36
- package/build/esnext/utils/id.utils.js +0 -84
- package/build/esnext/utils/id.utils.js.map +0 -1
- package/build/esnext/utils/logger.utils.d.ts +0 -160
- package/build/esnext/utils/logger.utils.js +0 -300
- package/build/esnext/utils/logger.utils.js.map +0 -1
- package/build/esnext/utils/middleware.utils.d.ts +0 -100
- package/build/esnext/utils/middleware.utils.js +0 -236
- package/build/esnext/utils/middleware.utils.js.map +0 -1
- package/build/esnext/utils/obj.utils.d.ts +0 -124
- package/build/esnext/utils/obj.utils.js +0 -413
- package/build/esnext/utils/obj.utils.js.map +0 -1
- package/build/esnext/utils/performance.utils.d.ts +0 -136
- package/build/esnext/utils/performance.utils.js +0 -271
- package/build/esnext/utils/performance.utils.js.map +0 -1
- package/build/esnext/utils/request.utils.d.ts +0 -86
- package/build/esnext/utils/request.utils.js +0 -186
- package/build/esnext/utils/request.utils.js.map +0 -1
- package/build/esnext/utils/response.utils.d.ts +0 -163
- package/build/esnext/utils/response.utils.js +0 -247
- package/build/esnext/utils/response.utils.js.map +0 -1
- package/build/esnext/utils/stream.utils.d.ts +0 -88
- package/build/esnext/utils/stream.utils.js +0 -210
- package/build/esnext/utils/stream.utils.js.map +0 -1
- package/build/esnext/utils/string.utils.d.ts +0 -93
- package/build/esnext/utils/string.utils.js +0 -165
- package/build/esnext/utils/string.utils.js.map +0 -1
- package/build/esnext/utils/type.utils.d.ts +0 -90
- package/build/esnext/utils/type.utils.js +0 -187
- package/build/esnext/utils/type.utils.js.map +0 -1
- package/build/esnext/utils/url.utils.d.ts +0 -141
- package/build/esnext/utils/url.utils.js +0 -304
- package/build/esnext/utils/url.utils.js.map +0 -1
- package/build/esnext/utils/validate.utils.d.ts +0 -177
- package/build/esnext/utils/validate.utils.js +0 -320
- package/build/esnext/utils/validate.utils.js.map +0 -1
- package/build/src/config.d.ts +0 -122
- package/build/src/config.js +0 -138
- package/build/src/config.js.map +0 -1
- package/build/src/index.d.ts +0 -27
- package/build/src/index.js +0 -69
- package/build/src/index.js.map +0 -1
- package/build/src/servers/server.builder.d.ts +0 -508
- package/build/src/servers/server.builder.js +0 -661
- package/build/src/servers/server.builder.js.map +0 -1
- package/build/src/servers/server.d.ts +0 -256
- package/build/src/servers/server.js +0 -962
- package/build/src/servers/server.js.map +0 -1
- package/build/src/types/api-response.d.ts +0 -152
- package/build/src/types/api-response.js +0 -37
- package/build/src/types/api-response.js.map +0 -1
- package/build/src/types/index.d.ts +0 -125
- package/build/src/types/index.js +0 -26
- package/build/src/types/index.js.map +0 -1
- package/build/src/types/server.d.ts +0 -268
- package/build/src/types/server.js +0 -26
- package/build/src/types/server.js.map +0 -1
- package/build/src/utils/array.utils.d.ts +0 -168
- package/build/src/utils/array.utils.js +0 -364
- package/build/src/utils/array.utils.js.map +0 -1
- package/build/src/utils/async.utils.d.ts +0 -265
- package/build/src/utils/async.utils.js +0 -641
- package/build/src/utils/async.utils.js.map +0 -1
- package/build/src/utils/cache.utils.d.ts +0 -153
- package/build/src/utils/cache.utils.js +0 -297
- package/build/src/utils/cache.utils.js.map +0 -1
- package/build/src/utils/context-store.utils.d.ts +0 -189
- package/build/src/utils/context-store.utils.js +0 -296
- package/build/src/utils/context-store.utils.js.map +0 -1
- package/build/src/utils/crypto.utils.d.ts +0 -160
- package/build/src/utils/crypto.utils.js +0 -293
- package/build/src/utils/crypto.utils.js.map +0 -1
- package/build/src/utils/date.utils.d.ts +0 -159
- package/build/src/utils/date.utils.js +0 -396
- package/build/src/utils/date.utils.js.map +0 -1
- package/build/src/utils/decorators.utils.d.ts +0 -315
- package/build/src/utils/decorators.utils.js +0 -516
- package/build/src/utils/decorators.utils.js.map +0 -1
- package/build/src/utils/dir.utils.d.ts +0 -196
- package/build/src/utils/dir.utils.js +0 -501
- package/build/src/utils/dir.utils.js.map +0 -1
- package/build/src/utils/env.utils.d.ts +0 -377
- package/build/src/utils/env.utils.js +0 -789
- package/build/src/utils/env.utils.js.map +0 -1
- package/build/src/utils/exception.utils.d.ts +0 -230
- package/build/src/utils/exception.utils.js +0 -407
- package/build/src/utils/exception.utils.js.map +0 -1
- package/build/src/utils/fs.utils.d.ts +0 -164
- package/build/src/utils/fs.utils.js +0 -372
- package/build/src/utils/fs.utils.js.map +0 -1
- package/build/src/utils/http-status-codes.d.ts +0 -266
- package/build/src/utils/http-status-codes.js +0 -298
- package/build/src/utils/http-status-codes.js.map +0 -1
- package/build/src/utils/id.utils.d.ts +0 -36
- package/build/src/utils/id.utils.js +0 -91
- package/build/src/utils/id.utils.js.map +0 -1
- package/build/src/utils/logger.utils.d.ts +0 -160
- package/build/src/utils/logger.utils.js +0 -346
- package/build/src/utils/logger.utils.js.map +0 -1
- package/build/src/utils/middleware.utils.d.ts +0 -100
- package/build/src/utils/middleware.utils.js +0 -244
- package/build/src/utils/middleware.utils.js.map +0 -1
- package/build/src/utils/obj.utils.d.ts +0 -124
- package/build/src/utils/obj.utils.js +0 -429
- package/build/src/utils/obj.utils.js.map +0 -1
- package/build/src/utils/performance.utils.d.ts +0 -136
- package/build/src/utils/performance.utils.js +0 -278
- package/build/src/utils/performance.utils.js.map +0 -1
- package/build/src/utils/request.utils.d.ts +0 -86
- package/build/src/utils/request.utils.js +0 -195
- package/build/src/utils/request.utils.js.map +0 -1
- package/build/src/utils/response.utils.d.ts +0 -163
- package/build/src/utils/response.utils.js +0 -260
- package/build/src/utils/response.utils.js.map +0 -1
- package/build/src/utils/stream.utils.d.ts +0 -88
- package/build/src/utils/stream.utils.js +0 -218
- package/build/src/utils/stream.utils.js.map +0 -1
- package/build/src/utils/string.utils.d.ts +0 -93
- package/build/src/utils/string.utils.js +0 -179
- package/build/src/utils/string.utils.js.map +0 -1
- package/build/src/utils/type.utils.d.ts +0 -90
- package/build/src/utils/type.utils.js +0 -196
- package/build/src/utils/type.utils.js.map +0 -1
- package/build/src/utils/url.utils.d.ts +0 -141
- package/build/src/utils/url.utils.js +0 -317
- package/build/src/utils/url.utils.js.map +0 -1
- package/build/src/utils/validate.utils.d.ts +0 -177
- package/build/src/utils/validate.utils.js +0 -345
- package/build/src/utils/validate.utils.js.map +0 -1
|
@@ -21,42 +21,6 @@
|
|
|
21
21
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
22
|
* SOFTWARE.
|
|
23
23
|
*/
|
|
24
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
25
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
26
|
-
if (!m) return o;
|
|
27
|
-
var i = m.call(o), r, ar = [], e;
|
|
28
|
-
try {
|
|
29
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
30
|
-
}
|
|
31
|
-
catch (error) { e = { error: error }; }
|
|
32
|
-
finally {
|
|
33
|
-
try {
|
|
34
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
35
|
-
}
|
|
36
|
-
finally { if (e) throw e.error; }
|
|
37
|
-
}
|
|
38
|
-
return ar;
|
|
39
|
-
};
|
|
40
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
41
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
42
|
-
if (ar || !(i in from)) {
|
|
43
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
44
|
-
ar[i] = from[i];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
48
|
-
};
|
|
49
|
-
var __values = (this && this.__values) || function(o) {
|
|
50
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
51
|
-
if (m) return m.call(o);
|
|
52
|
-
if (o && typeof o.length === "number") return {
|
|
53
|
-
next: function () {
|
|
54
|
-
if (o && i >= o.length) o = void 0;
|
|
55
|
-
return { value: o && o[i++], done: !o };
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
59
|
-
};
|
|
60
24
|
/* eslint-disable n/no-process-env */
|
|
61
25
|
import { existsSync, readFileSync } from 'fs';
|
|
62
26
|
import { isAbsolute, resolve } from 'path';
|
|
@@ -74,76 +38,65 @@ export var Environment;
|
|
|
74
38
|
* Utility class for accessing and managing environment variables.
|
|
75
39
|
* Provides typed getters with fallback defaults and validation.
|
|
76
40
|
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
41
|
+
export class Env {
|
|
42
|
+
// Cache for parsed values to avoid repeated parsing of complex values
|
|
43
|
+
static cache = new Map();
|
|
80
44
|
/**
|
|
81
45
|
* Checks if the current NODE_ENV is 'development'.
|
|
82
46
|
*
|
|
83
47
|
* @returns {boolean} `true` if NODE_ENV is 'development', else `false`.
|
|
84
48
|
*/
|
|
85
|
-
|
|
49
|
+
static isDev() {
|
|
86
50
|
return Env.get('NODE_ENV', Environment.DEVELOPMENT) === Environment.DEVELOPMENT;
|
|
87
|
-
}
|
|
51
|
+
}
|
|
88
52
|
/**
|
|
89
53
|
* Checks if the current NODE_ENV is 'production'.
|
|
90
54
|
*
|
|
91
55
|
* @returns {boolean} `true` if NODE_ENV is 'production', else `false`.
|
|
92
56
|
*/
|
|
93
|
-
|
|
57
|
+
static isProd() {
|
|
94
58
|
return Env.get('NODE_ENV', Environment.DEVELOPMENT) === Environment.PRODUCTION;
|
|
95
|
-
}
|
|
59
|
+
}
|
|
96
60
|
/**
|
|
97
61
|
* Checks if the current NODE_ENV is 'testing'.
|
|
98
62
|
*
|
|
99
63
|
* @returns {boolean} `true` if NODE_ENV is 'testing', else `false`.
|
|
100
64
|
*/
|
|
101
|
-
|
|
65
|
+
static isTest() {
|
|
102
66
|
return Env.get('NODE_ENV', Environment.DEVELOPMENT) === Environment.TESTING;
|
|
103
|
-
}
|
|
67
|
+
}
|
|
104
68
|
/**
|
|
105
69
|
* Checks if the current NODE_ENV is 'staging'.
|
|
106
70
|
*
|
|
107
71
|
* @returns {boolean} `true` if NODE_ENV is 'staging', else `false`.
|
|
108
72
|
*/
|
|
109
|
-
|
|
73
|
+
static isStaging() {
|
|
110
74
|
return Env.get('NODE_ENV', Environment.DEVELOPMENT) === Environment.STAGING;
|
|
111
|
-
}
|
|
75
|
+
}
|
|
112
76
|
/**
|
|
113
77
|
* Sets an environment variable (only affects runtime memory).
|
|
114
78
|
*
|
|
115
79
|
* @param {string} key - The environment variable key.
|
|
116
80
|
* @param {string} value - The value to set.
|
|
117
81
|
*/
|
|
118
|
-
|
|
119
|
-
var e_1, _a;
|
|
82
|
+
static set(key, value) {
|
|
120
83
|
process.env[key] = value;
|
|
121
84
|
// Clear all cached values for this key with any prefix
|
|
122
85
|
this.cache.delete(key);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (cacheKey.includes(":".concat(key))) {
|
|
127
|
-
this.cache.delete(cacheKey);
|
|
128
|
-
}
|
|
86
|
+
for (const cacheKey of [...this.cache.keys()]) {
|
|
87
|
+
if (cacheKey.includes(`:${key}`)) {
|
|
88
|
+
this.cache.delete(cacheKey);
|
|
129
89
|
}
|
|
130
90
|
}
|
|
131
|
-
|
|
132
|
-
finally {
|
|
133
|
-
try {
|
|
134
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
135
|
-
}
|
|
136
|
-
finally { if (e_1) throw e_1.error; }
|
|
137
|
-
}
|
|
138
|
-
};
|
|
91
|
+
}
|
|
139
92
|
/**
|
|
140
93
|
* Returns all environment variables as an object.
|
|
141
94
|
*
|
|
142
95
|
* @returns {object} The current `process.env` object.
|
|
143
96
|
*/
|
|
144
|
-
|
|
97
|
+
static getAll() {
|
|
145
98
|
return process.env;
|
|
146
|
-
}
|
|
99
|
+
}
|
|
147
100
|
/**
|
|
148
101
|
* Retrieves a string environment variable with a fallback default.
|
|
149
102
|
* Supports variable expansion with ${VAR_NAME} syntax.
|
|
@@ -157,18 +110,16 @@ var Env = /** @class */ (function () {
|
|
|
157
110
|
* // and DB_NAME is "myapp"
|
|
158
111
|
* const url = Env.get('DATABASE_URL', ''); // "postgres://localhost:5432/myapp"
|
|
159
112
|
*/
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
var value = (_a = process.env[key]) !== null && _a !== void 0 ? _a : defaultValue;
|
|
113
|
+
static get(key, defaultValue) {
|
|
114
|
+
let value = process.env[key] ?? defaultValue;
|
|
163
115
|
// Expand ${VAR} references
|
|
164
116
|
if (value && value.includes('${')) {
|
|
165
|
-
value = value.replace(/\${([A-Za-z0-9_]+)}/g,
|
|
166
|
-
|
|
167
|
-
return (_a = process.env[varName]) !== null && _a !== void 0 ? _a : '';
|
|
117
|
+
value = value.replace(/\${([A-Za-z0-9_]+)}/g, (_, varName) => {
|
|
118
|
+
return process.env[varName] ?? '';
|
|
168
119
|
});
|
|
169
120
|
}
|
|
170
121
|
return value;
|
|
171
|
-
}
|
|
122
|
+
}
|
|
172
123
|
/**
|
|
173
124
|
* Retrieves a string environment variable and throws if it's missing.
|
|
174
125
|
*
|
|
@@ -176,13 +127,13 @@ var Env = /** @class */ (function () {
|
|
|
176
127
|
* @returns {string} The environment variable's value.
|
|
177
128
|
* @throws {Error} If the variable is not defined.
|
|
178
129
|
*/
|
|
179
|
-
|
|
180
|
-
|
|
130
|
+
static getRequired(key) {
|
|
131
|
+
const value = process.env[key];
|
|
181
132
|
if (value === undefined) {
|
|
182
|
-
throw new Error(
|
|
133
|
+
throw new Error(`Required environment variable '${key}' is missing`);
|
|
183
134
|
}
|
|
184
135
|
return Env.get(key, ''); // Use get to handle variable expansion
|
|
185
|
-
}
|
|
136
|
+
}
|
|
186
137
|
/**
|
|
187
138
|
* Retrieves a value using a default generating function if the key doesn't exist.
|
|
188
139
|
* Useful for expensive default calculations.
|
|
@@ -197,12 +148,12 @@ var Env = /** @class */ (function () {
|
|
|
197
148
|
* return require('os').hostname();
|
|
198
149
|
* });
|
|
199
150
|
*/
|
|
200
|
-
|
|
151
|
+
static getWithDefault(key, defaultFn) {
|
|
201
152
|
if (Env.has(key)) {
|
|
202
153
|
return Env.get(key, '');
|
|
203
154
|
}
|
|
204
155
|
return defaultFn();
|
|
205
|
-
}
|
|
156
|
+
}
|
|
206
157
|
/**
|
|
207
158
|
* Retrieves an environment variable as a number, or returns a default.
|
|
208
159
|
*
|
|
@@ -211,21 +162,21 @@ var Env = /** @class */ (function () {
|
|
|
211
162
|
* @returns {number} Parsed numeric value or default.
|
|
212
163
|
* @throws {Error} If the value is not a valid number.
|
|
213
164
|
*/
|
|
214
|
-
|
|
215
|
-
if (this.cache.has(
|
|
216
|
-
return this.cache.get(
|
|
165
|
+
static getNumber(key, defaultValue) {
|
|
166
|
+
if (this.cache.has(`number:${key}`)) {
|
|
167
|
+
return this.cache.get(`number:${key}`);
|
|
217
168
|
}
|
|
218
|
-
|
|
169
|
+
const value = process.env[key];
|
|
219
170
|
if (value === undefined) {
|
|
220
171
|
return defaultValue;
|
|
221
172
|
}
|
|
222
|
-
|
|
173
|
+
const numberValue = Number(value);
|
|
223
174
|
if (isNaN(numberValue)) {
|
|
224
|
-
throw new Error(
|
|
175
|
+
throw new Error(`Environment variable '${key}' is not a valid number, got: "${value}"`);
|
|
225
176
|
}
|
|
226
|
-
this.cache.set(
|
|
177
|
+
this.cache.set(`number:${key}`, numberValue);
|
|
227
178
|
return numberValue;
|
|
228
|
-
}
|
|
179
|
+
}
|
|
229
180
|
/**
|
|
230
181
|
* Retrieves a required environment variable as a number.
|
|
231
182
|
*
|
|
@@ -233,13 +184,13 @@ var Env = /** @class */ (function () {
|
|
|
233
184
|
* @returns {number} Parsed number.
|
|
234
185
|
* @throws {Error} If the value is missing or not a number.
|
|
235
186
|
*/
|
|
236
|
-
|
|
237
|
-
|
|
187
|
+
static getNumberRequired(key) {
|
|
188
|
+
const value = process.env[key];
|
|
238
189
|
if (value === undefined) {
|
|
239
|
-
throw new Error(
|
|
190
|
+
throw new Error(`Required environment variable '${key}' is missing`);
|
|
240
191
|
}
|
|
241
192
|
return Env.getNumber(key, 0); // The default is ignored since we know the key exists
|
|
242
|
-
}
|
|
193
|
+
}
|
|
243
194
|
/**
|
|
244
195
|
* Retrieves an integer environment variable and validates it.
|
|
245
196
|
*
|
|
@@ -254,21 +205,20 @@ var Env = /** @class */ (function () {
|
|
|
254
205
|
* // Require PORT to be between 1000 and 9999
|
|
255
206
|
* const port = Env.getInteger('PORT', 3000, { min: 1000, max: 9999 });
|
|
256
207
|
*/
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
var intValue = Math.floor(num);
|
|
208
|
+
static getInteger(key, defaultValue, options = {}) {
|
|
209
|
+
const num = Env.getNumber(key, defaultValue);
|
|
210
|
+
const intValue = Math.floor(num);
|
|
261
211
|
if (intValue !== num) {
|
|
262
|
-
throw new Error(
|
|
212
|
+
throw new Error(`Environment variable '${key}' must be an integer, got: ${num}`);
|
|
263
213
|
}
|
|
264
214
|
if (options.min !== undefined && intValue < options.min) {
|
|
265
|
-
throw new Error(
|
|
215
|
+
throw new Error(`Environment variable '${key}' must be at least ${options.min}, got: ${intValue}`);
|
|
266
216
|
}
|
|
267
217
|
if (options.max !== undefined && intValue > options.max) {
|
|
268
|
-
throw new Error(
|
|
218
|
+
throw new Error(`Environment variable '${key}' must be at most ${options.max}, got: ${intValue}`);
|
|
269
219
|
}
|
|
270
220
|
return intValue;
|
|
271
|
-
}
|
|
221
|
+
}
|
|
272
222
|
/**
|
|
273
223
|
* Retrieves an environment variable as a boolean.
|
|
274
224
|
* Accepts `true`, `1`, `yes`, `on` as true; `false`, `0`, `no`, `off` as false.
|
|
@@ -282,26 +232,25 @@ var Env = /** @class */ (function () {
|
|
|
282
232
|
* // If DEBUG=yes
|
|
283
233
|
* const isDebug = Env.getBoolean('DEBUG', false); // true
|
|
284
234
|
*/
|
|
285
|
-
|
|
286
|
-
if (
|
|
287
|
-
|
|
288
|
-
return this.cache.get("bool:".concat(key));
|
|
235
|
+
static getBoolean(key, defaultValue = false) {
|
|
236
|
+
if (this.cache.has(`bool:${key}`)) {
|
|
237
|
+
return this.cache.get(`bool:${key}`);
|
|
289
238
|
}
|
|
290
|
-
|
|
239
|
+
const value = process.env[key];
|
|
291
240
|
if (value === undefined) {
|
|
292
241
|
return defaultValue;
|
|
293
242
|
}
|
|
294
|
-
|
|
243
|
+
const lowerValue = value.toLowerCase();
|
|
295
244
|
if (['true', '1', 'yes', 'on'].includes(lowerValue)) {
|
|
296
|
-
this.cache.set(
|
|
245
|
+
this.cache.set(`bool:${key}`, true);
|
|
297
246
|
return true;
|
|
298
247
|
}
|
|
299
248
|
if (['false', '0', 'no', 'off'].includes(lowerValue)) {
|
|
300
|
-
this.cache.set(
|
|
249
|
+
this.cache.set(`bool:${key}`, false);
|
|
301
250
|
return false;
|
|
302
251
|
}
|
|
303
|
-
throw new Error(
|
|
304
|
-
}
|
|
252
|
+
throw new Error(`Environment variable '${key}' is not a valid boolean, got: "${value}". Use true/false, yes/no, 1/0, or on/off.`);
|
|
253
|
+
}
|
|
305
254
|
/**
|
|
306
255
|
* Retrieves a required environment variable as a boolean.
|
|
307
256
|
*
|
|
@@ -309,13 +258,13 @@ var Env = /** @class */ (function () {
|
|
|
309
258
|
* @returns {boolean} Parsed boolean value.
|
|
310
259
|
* @throws {Error} If missing or invalid.
|
|
311
260
|
*/
|
|
312
|
-
|
|
313
|
-
|
|
261
|
+
static getBooleanRequired(key) {
|
|
262
|
+
const value = process.env[key];
|
|
314
263
|
if (value === undefined) {
|
|
315
|
-
throw new Error(
|
|
264
|
+
throw new Error(`Required environment variable '${key}' is missing`);
|
|
316
265
|
}
|
|
317
266
|
return Env.getBoolean(key);
|
|
318
|
-
}
|
|
267
|
+
}
|
|
319
268
|
/**
|
|
320
269
|
* Parses a stringified JSON object from an environment variable.
|
|
321
270
|
*
|
|
@@ -330,23 +279,23 @@ var Env = /** @class */ (function () {
|
|
|
330
279
|
* const config = Env.getJSON('CONFIG', { debug: false });
|
|
331
280
|
* // { debug: true, api: { url: "https://api.example.com" }}
|
|
332
281
|
*/
|
|
333
|
-
|
|
334
|
-
if (this.cache.has(
|
|
335
|
-
return this.cache.get(
|
|
282
|
+
static getJSON(key, defaultValue) {
|
|
283
|
+
if (this.cache.has(`json:${key}`)) {
|
|
284
|
+
return this.cache.get(`json:${key}`);
|
|
336
285
|
}
|
|
337
|
-
|
|
286
|
+
const v = process.env[key];
|
|
338
287
|
if (v === undefined) {
|
|
339
288
|
return defaultValue;
|
|
340
289
|
}
|
|
341
290
|
try {
|
|
342
|
-
|
|
343
|
-
this.cache.set(
|
|
291
|
+
const parsed = JSON.parse(v);
|
|
292
|
+
this.cache.set(`json:${key}`, parsed);
|
|
344
293
|
return parsed;
|
|
345
294
|
}
|
|
346
295
|
catch (error) {
|
|
347
|
-
throw new Error(
|
|
296
|
+
throw new Error(`Environment variable '${key}' is not valid JSON: ${error.message}`);
|
|
348
297
|
}
|
|
349
|
-
}
|
|
298
|
+
}
|
|
350
299
|
/**
|
|
351
300
|
* Parses a comma-separated string as an array.
|
|
352
301
|
*
|
|
@@ -365,35 +314,33 @@ var Env = /** @class */ (function () {
|
|
|
365
314
|
* // With transformation function
|
|
366
315
|
* const ports = Env.getArray('PORTS', [], ',', (p) => parseInt(p, 10));
|
|
367
316
|
*/
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
if (splitter === void 0) { splitter = ','; }
|
|
371
|
-
var cacheKey = "array:".concat(key, ":").concat(splitter, ":").concat(transform ? 'transformed' : 'raw');
|
|
317
|
+
static getArray(key, defaultValue = [], splitter = ',', transform) {
|
|
318
|
+
const cacheKey = `array:${key}:${splitter}:${transform ? 'transformed' : 'raw'}`;
|
|
372
319
|
if (this.cache.has(cacheKey)) {
|
|
373
320
|
return this.cache.get(cacheKey);
|
|
374
321
|
}
|
|
375
|
-
|
|
322
|
+
const value = process.env[key];
|
|
376
323
|
if (!value || value.trim() === '') {
|
|
377
324
|
return defaultValue;
|
|
378
325
|
}
|
|
379
|
-
|
|
326
|
+
const items = value
|
|
380
327
|
.split(splitter)
|
|
381
|
-
.map(
|
|
382
|
-
.filter(
|
|
328
|
+
.map(item => item.trim())
|
|
329
|
+
.filter(item => item.length > 0);
|
|
383
330
|
if (transform) {
|
|
384
331
|
try {
|
|
385
|
-
|
|
386
|
-
this.cache.set(cacheKey,
|
|
387
|
-
return
|
|
332
|
+
const result = items.map(transform);
|
|
333
|
+
this.cache.set(cacheKey, result);
|
|
334
|
+
return result;
|
|
388
335
|
}
|
|
389
336
|
catch (error) {
|
|
390
|
-
throw new Error(
|
|
337
|
+
throw new Error(`Failed to transform items in '${key}': ${error.message}`);
|
|
391
338
|
}
|
|
392
339
|
}
|
|
393
|
-
|
|
340
|
+
const result = items;
|
|
394
341
|
this.cache.set(cacheKey, result);
|
|
395
342
|
return result;
|
|
396
|
-
}
|
|
343
|
+
}
|
|
397
344
|
/**
|
|
398
345
|
* Parses a comma-separated list of numbers.
|
|
399
346
|
*
|
|
@@ -407,17 +354,15 @@ var Env = /** @class */ (function () {
|
|
|
407
354
|
* const ports = Env.getNumberArray('ALLOWED_PORTS');
|
|
408
355
|
* // [80, 443, 3000, 8080]
|
|
409
356
|
*/
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
return Env.getArray(key, defaultValue, splitter, function (item) {
|
|
414
|
-
var num = Number(item);
|
|
357
|
+
static getNumberArray(key, defaultValue = [], splitter = ',') {
|
|
358
|
+
return Env.getArray(key, defaultValue, splitter, item => {
|
|
359
|
+
const num = Number(item);
|
|
415
360
|
if (isNaN(num)) {
|
|
416
|
-
throw new Error(
|
|
361
|
+
throw new Error(`Value "${item}" in array '${key}' is not a valid number`);
|
|
417
362
|
}
|
|
418
363
|
return num;
|
|
419
364
|
});
|
|
420
|
-
}
|
|
365
|
+
}
|
|
421
366
|
/**
|
|
422
367
|
* Retrieves an enum-like environment variable value, validating against allowed values.
|
|
423
368
|
*
|
|
@@ -433,16 +378,16 @@ var Env = /** @class */ (function () {
|
|
|
433
378
|
* const level = Env.getEnum('LOG_LEVEL', ['debug', 'info', 'warn', 'error'] as const, 'info');
|
|
434
379
|
* // 'debug' (typed as 'debug' | 'info' | 'warn' | 'error')
|
|
435
380
|
*/
|
|
436
|
-
|
|
437
|
-
|
|
381
|
+
static getEnum(key, allowedValues, defaultValue) {
|
|
382
|
+
const value = process.env[key];
|
|
438
383
|
if (!value) {
|
|
439
384
|
return defaultValue;
|
|
440
385
|
}
|
|
441
386
|
if (!allowedValues.includes(value)) {
|
|
442
|
-
throw new Error(
|
|
387
|
+
throw new Error(`Environment variable '${key}' must be one of: ${allowedValues.join(', ')}. Received: "${value}"`);
|
|
443
388
|
}
|
|
444
389
|
return value;
|
|
445
|
-
}
|
|
390
|
+
}
|
|
446
391
|
/**
|
|
447
392
|
* Retrieves an enum-like numeric environment variable.
|
|
448
393
|
*
|
|
@@ -455,13 +400,13 @@ var Env = /** @class */ (function () {
|
|
|
455
400
|
* // If NODE_VERSION=16
|
|
456
401
|
* const version = Env.getNumberEnum('NODE_VERSION', [14, 16, 18], 16);
|
|
457
402
|
*/
|
|
458
|
-
|
|
459
|
-
|
|
403
|
+
static getNumberEnum(key, allowedValues, defaultValue) {
|
|
404
|
+
const value = Env.getNumber(key, defaultValue);
|
|
460
405
|
if (!allowedValues.includes(value)) {
|
|
461
|
-
throw new Error(
|
|
406
|
+
throw new Error(`Environment variable '${key}' must be one of: ${allowedValues.join(', ')}. Received: ${value}`);
|
|
462
407
|
}
|
|
463
408
|
return value;
|
|
464
|
-
}
|
|
409
|
+
}
|
|
465
410
|
/**
|
|
466
411
|
* Retrieves a URL environment variable and validates it.
|
|
467
412
|
*
|
|
@@ -479,41 +424,40 @@ var Env = /** @class */ (function () {
|
|
|
479
424
|
* allowIp: false
|
|
480
425
|
* });
|
|
481
426
|
*/
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
var cacheKey = "url:".concat(key, ":").concat(JSON.stringify(options));
|
|
427
|
+
static getUrl(key, defaultValue, options = {}) {
|
|
428
|
+
const cacheKey = `url:${key}:${JSON.stringify(options)}`;
|
|
485
429
|
if (this.cache.has(cacheKey)) {
|
|
486
430
|
return this.cache.get(cacheKey);
|
|
487
431
|
}
|
|
488
|
-
|
|
432
|
+
const value = Env.get(key, defaultValue);
|
|
489
433
|
if (!value) {
|
|
490
|
-
throw new Error(
|
|
434
|
+
throw new Error(`URL environment variable '${key}' is missing or empty`);
|
|
491
435
|
}
|
|
492
|
-
|
|
436
|
+
let url;
|
|
493
437
|
try {
|
|
494
438
|
url = new URL(value);
|
|
495
439
|
}
|
|
496
|
-
catch
|
|
497
|
-
throw new Error(
|
|
440
|
+
catch {
|
|
441
|
+
throw new Error(`Environment variable '${key}' is not a valid URL: "${value}"`);
|
|
498
442
|
}
|
|
499
443
|
// Validate protocol
|
|
500
444
|
if (options.protocols && options.protocols.length > 0) {
|
|
501
|
-
|
|
445
|
+
const protocol = url.protocol.replace(':', '');
|
|
502
446
|
if (!options.protocols.includes(protocol)) {
|
|
503
|
-
throw new Error(
|
|
447
|
+
throw new Error(`Environment variable '${key}' must use one of the protocols: ${options.protocols.join(', ')}. Got: ${protocol}`);
|
|
504
448
|
}
|
|
505
449
|
}
|
|
506
450
|
// Validate hostname
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
451
|
+
const { hostname } = url;
|
|
452
|
+
const isIp = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/.test(hostname);
|
|
453
|
+
const isLocalhost = hostname === 'localhost';
|
|
510
454
|
// Check if hostname is an IP address when not allowed
|
|
511
455
|
if (isIp && options.allowIp === false) {
|
|
512
|
-
throw new Error(
|
|
456
|
+
throw new Error(`Environment variable '${key}' cannot be an IP address: "${hostname}"`);
|
|
513
457
|
}
|
|
514
458
|
// Check if hostname is localhost when not allowed
|
|
515
459
|
if (isLocalhost && options.allowLocalhost === false) {
|
|
516
|
-
throw new Error(
|
|
460
|
+
throw new Error(`Environment variable '${key}' cannot be localhost`);
|
|
517
461
|
}
|
|
518
462
|
// Check for TLD requirement - include localhost in check if requireTld is true and allowLocalhost is false
|
|
519
463
|
if (options.requireTld === true) {
|
|
@@ -524,12 +468,12 @@ var Env = /** @class */ (function () {
|
|
|
524
468
|
// IP is allowed, so no TLD check needed for it
|
|
525
469
|
}
|
|
526
470
|
else if (!hostname.includes('.') || hostname.endsWith('.')) {
|
|
527
|
-
throw new Error(
|
|
471
|
+
throw new Error(`Environment variable '${key}' must have a valid host with TLD: "${hostname}"`);
|
|
528
472
|
}
|
|
529
473
|
}
|
|
530
474
|
this.cache.set(cacheKey, value);
|
|
531
475
|
return value;
|
|
532
|
-
}
|
|
476
|
+
}
|
|
533
477
|
/**
|
|
534
478
|
* Retrieves an email environment variable and validates it.
|
|
535
479
|
*
|
|
@@ -541,25 +485,25 @@ var Env = /** @class */ (function () {
|
|
|
541
485
|
* @example
|
|
542
486
|
* const supportEmail = Env.getEmail('SUPPORT_EMAIL', 'support@example.com');
|
|
543
487
|
*/
|
|
544
|
-
|
|
545
|
-
if (this.cache.has(
|
|
546
|
-
return this.cache.get(
|
|
488
|
+
static getEmail(key, defaultValue) {
|
|
489
|
+
if (this.cache.has(`email:${key}`)) {
|
|
490
|
+
return this.cache.get(`email:${key}`);
|
|
547
491
|
}
|
|
548
|
-
|
|
492
|
+
const value = Env.get(key, defaultValue);
|
|
549
493
|
if (!value) {
|
|
550
494
|
if (defaultValue === undefined) {
|
|
551
|
-
throw new Error(
|
|
495
|
+
throw new Error(`Email environment variable '${key}' is missing`);
|
|
552
496
|
}
|
|
553
497
|
return defaultValue;
|
|
554
498
|
}
|
|
555
499
|
// More comprehensive email validation regex
|
|
556
|
-
|
|
500
|
+
const emailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
557
501
|
if (!emailRegex.test(value)) {
|
|
558
|
-
throw new Error(
|
|
502
|
+
throw new Error(`Environment variable '${key}' is not a valid email address: "${value}"`);
|
|
559
503
|
}
|
|
560
|
-
this.cache.set(
|
|
504
|
+
this.cache.set(`email:${key}`, value);
|
|
561
505
|
return value;
|
|
562
|
-
}
|
|
506
|
+
}
|
|
563
507
|
/**
|
|
564
508
|
* Retrieves a path environment variable and validates it exists.
|
|
565
509
|
*
|
|
@@ -576,34 +520,33 @@ var Env = /** @class */ (function () {
|
|
|
576
520
|
* allowedExtensions: ['.json', '.yaml']
|
|
577
521
|
* });
|
|
578
522
|
*/
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
var cacheKey = "path:".concat(key, ":").concat(JSON.stringify(options));
|
|
523
|
+
static getPath(key, defaultValue, options = {}) {
|
|
524
|
+
const cacheKey = `path:${key}:${JSON.stringify(options)}`;
|
|
582
525
|
if (this.cache.has(cacheKey)) {
|
|
583
526
|
return this.cache.get(cacheKey);
|
|
584
527
|
}
|
|
585
|
-
|
|
528
|
+
const value = Env.get(key, defaultValue);
|
|
586
529
|
if (!value) {
|
|
587
530
|
if (defaultValue === undefined) {
|
|
588
|
-
throw new Error(
|
|
531
|
+
throw new Error(`Path environment variable '${key}' is missing`);
|
|
589
532
|
}
|
|
590
533
|
return defaultValue;
|
|
591
534
|
}
|
|
592
|
-
|
|
535
|
+
const path = options.makeAbsolute !== false && !isAbsolute(value) ? resolve(process.cwd(), value) : value;
|
|
593
536
|
// Validate path exists if required
|
|
594
537
|
if (options.mustExist && !existsSync(path)) {
|
|
595
|
-
throw new Error(
|
|
538
|
+
throw new Error(`Path in environment variable '${key}' does not exist: "${path}"`);
|
|
596
539
|
}
|
|
597
540
|
// Validate file extension if specified
|
|
598
541
|
if (options.allowedExtensions && options.allowedExtensions.length > 0) {
|
|
599
|
-
|
|
542
|
+
const hasValidExtension = options.allowedExtensions.some(ext => path.toLowerCase().endsWith(ext.toLowerCase()));
|
|
600
543
|
if (!hasValidExtension) {
|
|
601
|
-
throw new Error(
|
|
544
|
+
throw new Error(`Path in environment variable '${key}' must have one of these extensions: ${options.allowedExtensions.join(', ')}. Got: "${path}"`);
|
|
602
545
|
}
|
|
603
546
|
}
|
|
604
547
|
this.cache.set(cacheKey, path);
|
|
605
548
|
return path;
|
|
606
|
-
}
|
|
549
|
+
}
|
|
607
550
|
/**
|
|
608
551
|
* Retrieves a port environment variable and validates it.
|
|
609
552
|
*
|
|
@@ -615,18 +558,18 @@ var Env = /** @class */ (function () {
|
|
|
615
558
|
* @example
|
|
616
559
|
* const serverPort = Env.getPort('PORT', 3000);
|
|
617
560
|
*/
|
|
618
|
-
|
|
561
|
+
static getPort(key, defaultValue) {
|
|
619
562
|
try {
|
|
620
563
|
return Env.getInteger(key, defaultValue, { min: 0, max: 65535 });
|
|
621
564
|
}
|
|
622
565
|
catch (error) {
|
|
623
566
|
// Rewrite the error message to match the expected pattern
|
|
624
567
|
if (error.message.includes('must be at most 65535')) {
|
|
625
|
-
throw new Error(
|
|
568
|
+
throw new Error(`Environment variable '${key}' must be a valid port number (0-65535)`);
|
|
626
569
|
}
|
|
627
570
|
throw error;
|
|
628
571
|
}
|
|
629
|
-
}
|
|
572
|
+
}
|
|
630
573
|
/**
|
|
631
574
|
* Retrieves an ISO date string and converts it to a Date object.
|
|
632
575
|
*
|
|
@@ -638,18 +581,17 @@ var Env = /** @class */ (function () {
|
|
|
638
581
|
* // If EXPIRY_DATE=2023-12-31T23:59:59Z
|
|
639
582
|
* const expiryDate = Env.getDate('EXPIRY_DATE', new Date());
|
|
640
583
|
*/
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
var value = Env.get(key, defaultValue instanceof Date ? defaultValue.toISOString() : defaultValue);
|
|
584
|
+
static getDate(key, defaultValue = new Date()) {
|
|
585
|
+
const value = Env.get(key, defaultValue instanceof Date ? defaultValue.toISOString() : defaultValue);
|
|
644
586
|
if (!value) {
|
|
645
587
|
return defaultValue instanceof Date ? defaultValue : new Date();
|
|
646
588
|
}
|
|
647
|
-
|
|
589
|
+
const date = new Date(value);
|
|
648
590
|
if (isNaN(date.getTime())) {
|
|
649
|
-
throw new Error(
|
|
591
|
+
throw new Error(`Environment variable '${key}' is not a valid date: "${value}"`);
|
|
650
592
|
}
|
|
651
593
|
return date;
|
|
652
|
-
}
|
|
594
|
+
}
|
|
653
595
|
/**
|
|
654
596
|
* Retrieves a duration string and converts it to milliseconds.
|
|
655
597
|
* Supports formats like "1d", "2h", "30m", "45s", "100ms" or combinations like "1h30m".
|
|
@@ -664,29 +606,28 @@ var Env = /** @class */ (function () {
|
|
|
664
606
|
* const cacheTtlMs = Env.getDuration('CACHE_TTL', '1h');
|
|
665
607
|
* // 9000000 (2.5 hours in milliseconds)
|
|
666
608
|
*/
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
var cacheKey = "duration:".concat(key);
|
|
609
|
+
static getDuration(key, defaultValue = '0') {
|
|
610
|
+
const cacheKey = `duration:${key}`;
|
|
670
611
|
if (this.cache.has(cacheKey)) {
|
|
671
612
|
return this.cache.get(cacheKey);
|
|
672
613
|
}
|
|
673
|
-
|
|
614
|
+
const value = Env.get(key, String(defaultValue));
|
|
674
615
|
if (!value)
|
|
675
616
|
return 0;
|
|
676
617
|
// Handle plain number input (assume milliseconds)
|
|
677
618
|
if (/^\d+$/.test(value)) {
|
|
678
|
-
|
|
679
|
-
this.cache.set(cacheKey,
|
|
680
|
-
return
|
|
619
|
+
const ms = parseInt(value, 10);
|
|
620
|
+
this.cache.set(cacheKey, ms);
|
|
621
|
+
return ms;
|
|
681
622
|
}
|
|
682
623
|
// Enhanced duration parsing with more precise regex
|
|
683
|
-
|
|
684
|
-
|
|
624
|
+
const durationRegex = /^(?:(\d+)y)?(?:(\d+)w)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?(?:(\d+)ms)?$/;
|
|
625
|
+
const matches = value.match(durationRegex);
|
|
685
626
|
if (!matches || matches[0] === '') {
|
|
686
|
-
throw new Error(
|
|
687
|
-
|
|
627
|
+
throw new Error(`Environment variable '${key}' has invalid duration format: "${value}". ` +
|
|
628
|
+
`Use formats like 1y, 2w, 3d, 4h, 5m, 6s, or 7ms.`);
|
|
688
629
|
}
|
|
689
|
-
|
|
630
|
+
let ms = 0;
|
|
690
631
|
if (matches[1])
|
|
691
632
|
ms += parseInt(matches[1], 10) * 31536000000; // years (approximate)
|
|
692
633
|
if (matches[2])
|
|
@@ -703,7 +644,7 @@ var Env = /** @class */ (function () {
|
|
|
703
644
|
ms += parseInt(matches[7], 10); // milliseconds
|
|
704
645
|
this.cache.set(cacheKey, ms);
|
|
705
646
|
return ms;
|
|
706
|
-
}
|
|
647
|
+
}
|
|
707
648
|
/**
|
|
708
649
|
* Gets all environment variables with sensitive values masked for safe logging.
|
|
709
650
|
*
|
|
@@ -714,31 +655,16 @@ var Env = /** @class */ (function () {
|
|
|
714
655
|
* console.log(Env.getSafeEnv(['password', 'secret', 'key']));
|
|
715
656
|
* // { DATABASE_URL: "postgres://...", API_KEY: "******", ... }
|
|
716
657
|
*/
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
var safeEnv = {};
|
|
721
|
-
var _loop_1 = function (key, value) {
|
|
658
|
+
static getSafeEnv(sensitiveKeys = ['password', 'secret', 'key', 'token', 'auth']) {
|
|
659
|
+
const safeEnv = {};
|
|
660
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
722
661
|
if (!value)
|
|
723
|
-
|
|
724
|
-
|
|
662
|
+
continue;
|
|
663
|
+
const isSensitive = sensitiveKeys.some(sensitiveKey => key.toLowerCase().includes(sensitiveKey.toLowerCase()));
|
|
725
664
|
safeEnv[key] = isSensitive ? '******' : value;
|
|
726
|
-
};
|
|
727
|
-
try {
|
|
728
|
-
for (var _b = __values(Object.entries(process.env)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
729
|
-
var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
|
|
730
|
-
_loop_1(key, value);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
734
|
-
finally {
|
|
735
|
-
try {
|
|
736
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
737
|
-
}
|
|
738
|
-
finally { if (e_2) throw e_2.error; }
|
|
739
665
|
}
|
|
740
666
|
return safeEnv;
|
|
741
|
-
}
|
|
667
|
+
}
|
|
742
668
|
/**
|
|
743
669
|
* Loads environment variables from a .env file.
|
|
744
670
|
* Does not override existing variables.
|
|
@@ -750,45 +676,44 @@ var Env = /** @class */ (function () {
|
|
|
750
676
|
* // Load variables from .env.development
|
|
751
677
|
* Env.loadFromFile('.env.development');
|
|
752
678
|
*/
|
|
753
|
-
|
|
754
|
-
if (path === void 0) { path = '.env'; }
|
|
679
|
+
static loadFromFile(path = '.env') {
|
|
755
680
|
if (!existsSync(path)) {
|
|
756
|
-
throw new Error(
|
|
681
|
+
throw new Error(`Environment file not found: "${path}"`);
|
|
757
682
|
}
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
683
|
+
const content = readFileSync(path, 'utf8');
|
|
684
|
+
const variables = {};
|
|
685
|
+
const lines = content.split(/\r?\n/);
|
|
686
|
+
let i = 0;
|
|
762
687
|
while (i < lines.length) {
|
|
763
|
-
|
|
688
|
+
let line = lines[i].trim();
|
|
764
689
|
// Skip empty lines or comment-only lines
|
|
765
690
|
if (!line || line.startsWith('#')) {
|
|
766
691
|
i++;
|
|
767
692
|
continue;
|
|
768
693
|
}
|
|
769
|
-
|
|
694
|
+
const match = line.match(/^([^=]+)=(.*)$/);
|
|
770
695
|
if (!match) {
|
|
771
696
|
i++;
|
|
772
697
|
continue;
|
|
773
698
|
}
|
|
774
|
-
|
|
775
|
-
|
|
699
|
+
const key = match[1].trim();
|
|
700
|
+
let value = match[2].trim();
|
|
776
701
|
// Remove inline comment for unquoted values
|
|
777
702
|
if (!/^['"]/.test(value)) {
|
|
778
|
-
|
|
703
|
+
const hashIndex = value.indexOf(' #');
|
|
779
704
|
if (hashIndex !== -1) {
|
|
780
705
|
value = value.slice(0, hashIndex).trim();
|
|
781
706
|
}
|
|
782
707
|
}
|
|
783
708
|
// Handle quoted values
|
|
784
709
|
if ((value.startsWith('"') || value.startsWith("'")) && value.length > 1) {
|
|
785
|
-
|
|
710
|
+
const quote = value[0];
|
|
786
711
|
if (!value.endsWith(quote) || value.length === 1) {
|
|
787
712
|
// multiline quoted
|
|
788
|
-
|
|
713
|
+
let multilineValue = value.slice(1);
|
|
789
714
|
i++;
|
|
790
715
|
while (i < lines.length) {
|
|
791
|
-
|
|
716
|
+
const nextLine = lines[i];
|
|
792
717
|
if (nextLine.endsWith(quote)) {
|
|
793
718
|
multilineValue += '\n' + nextLine.slice(0, -1);
|
|
794
719
|
break;
|
|
@@ -821,53 +746,37 @@ var Env = /** @class */ (function () {
|
|
|
821
746
|
i++;
|
|
822
747
|
}
|
|
823
748
|
return variables;
|
|
824
|
-
}
|
|
749
|
+
}
|
|
825
750
|
/**
|
|
826
751
|
* Checks whether the specified environment variable exists.
|
|
827
752
|
*
|
|
828
753
|
* @param {string} key - The environment variable key.
|
|
829
754
|
* @returns {boolean} `true` if the variable is defined, otherwise `false`.
|
|
830
755
|
*/
|
|
831
|
-
|
|
756
|
+
static has(key) {
|
|
832
757
|
return process.env[key] !== undefined;
|
|
833
|
-
}
|
|
758
|
+
}
|
|
834
759
|
/**
|
|
835
760
|
* Deletes the given environment variable (useful in tests).
|
|
836
761
|
*
|
|
837
762
|
* @param {string} key - The environment variable key to delete.
|
|
838
763
|
* @returns {void}
|
|
839
764
|
*/
|
|
840
|
-
|
|
841
|
-
var e_3, _a;
|
|
765
|
+
static delete(key) {
|
|
842
766
|
delete process.env[key];
|
|
843
767
|
this.cache.delete(key);
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
if (cacheKey.includes(":".concat(key))) {
|
|
849
|
-
this.cache.delete(cacheKey);
|
|
850
|
-
}
|
|
768
|
+
// Also clear all cached variations of this key
|
|
769
|
+
for (const cacheKey of this.cache.keys()) {
|
|
770
|
+
if (cacheKey.includes(`:${key}`)) {
|
|
771
|
+
this.cache.delete(cacheKey);
|
|
851
772
|
}
|
|
852
773
|
}
|
|
853
|
-
|
|
854
|
-
finally {
|
|
855
|
-
try {
|
|
856
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
857
|
-
}
|
|
858
|
-
finally { if (e_3) throw e_3.error; }
|
|
859
|
-
}
|
|
860
|
-
};
|
|
774
|
+
}
|
|
861
775
|
/**
|
|
862
776
|
* Clears the internal cache of parsed environment values.
|
|
863
777
|
* Useful for testing or when environment variables might change.
|
|
864
778
|
*/
|
|
865
|
-
|
|
779
|
+
static clearCache() {
|
|
866
780
|
this.cache.clear();
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
Env.cache = new Map();
|
|
870
|
-
return Env;
|
|
871
|
-
}());
|
|
872
|
-
export { Env };
|
|
873
|
-
//# sourceMappingURL=env.utils.js.map
|
|
781
|
+
}
|
|
782
|
+
}
|