@sourceregistry/node-env 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +31 -27
- package/dist/index.es.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -124,6 +124,7 @@ const mode = env.utils.select("FEATURE_X", "enabled", "disabled");
|
|
|
124
124
|
| `env.string(key, default?)` | Return the variable as a string (or default). |
|
|
125
125
|
| `env.number(key, default?)` | Parse variable to number (or default). |
|
|
126
126
|
| `env.boolean(key, default?)` | Parse variable to boolean (or default). |
|
|
127
|
+
| `env.url(key, default?)` | Parse variable to URL object (or default(http://localhost)). |
|
|
127
128
|
| `env.has(key)` | Returns true if key exists in `process.env`. |
|
|
128
129
|
| `env.assert([keys], error_builder?)` | Throws an error if one or more keys doesn't exists in `process.env`. |
|
|
129
130
|
| `env.defined(key)` | Returns true if key exists and value is not `undefined`. |
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("fs");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("fs");function v(e=".env"){if(!c.existsSync(e))return{};try{const t=c.readFileSync(e,"utf8");return Object.fromEntries(t.split(/\r?\n/).filter(r=>r&&!r.trim().startsWith("#")&&r.includes("=")).map(r=>{const[s,...n]=r.split("=");let o=n.join("=").trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),[s.trim(),o]}))}catch(t){const r=t?.message??"Failed to load .env";return globalThis.logger?.warn?globalThis.logger.warn(r):console.warn(r),{}}}const a=v();for(const[e,t]of Object.entries(a))e in process.env||(process.env[e]=t);const i=Object.freeze({string(e,t){return e in process.env||(process.env[e]=t??""),process.env[e]},number(e,t=0){const r=process.env[e];if(r===void 0)return process.env[e]=String(t),t;const s=Number(r);return Number.isFinite(s)?s:t},boolean(e,t=!1){const r=process.env[e];if(r===void 0)return process.env[e]=t?"true":"false",t;const s=r.toLowerCase();return s==="true"||s==="1"},url(e,t=new URL("http://localhost")){const r=process.env[e];return r===void 0||!URL.canParse(r)?(process.env[e]=t.toString(),t):URL.parse(r)},has(e){return Object.prototype.hasOwnProperty.call(process.env,e)},assert(e,t=(r=>new Error(`Missing required keys(${r.join()}) in environment`))){const r=[];if(e.forEach(s=>this.has(s)?void 0:r.push(s)),r.length>0){const s=t(r);throw typeof s=="string"?new Error(s):s}},defined(e){return i.has(e)&&process.env[e]!==void 0},get dev(){return process.env.NODE_ENV!=="production"},collection(e,t={}){const{reviver:r=n=>n,removePrefix:s=!1}=t;return Object.fromEntries(Object.entries(process.env).filter(([n])=>n.startsWith(e)).map(([n,o])=>[s?n.replace(e,""):n,r(o,n)]))},utils:Object.freeze({select(e,t,r,s=n=>i.boolean(n)){return s(e,process.env[e])?t:r}}),get raw(){return Object.freeze(a)}});exports.env=i;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/index.ts"],"sourcesContent":["import {readFileSync, existsSync} from \"fs\";\n\nfunction loadDotEnv(file = \".env\") {\n if (!existsSync(file)) return {};\n\n try {\n const text = readFileSync(file, \"utf8\");\n return Object.fromEntries(\n text\n .split(/\\r?\\n/)\n .filter((line) => line && !line.trim().startsWith(\"#\") && line.includes(\"=\"))\n .map((line) => {\n const [key, ...rest] = line.split(\"=\");\n let value = rest.join(\"=\").trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return [key.trim(), value];\n })\n );\n } catch (e: any) {\n const msg = e?.message ?? \"Failed to load .env\";\n // @ts-ignore\n if (globalThis.logger?.warn) globalThis.logger.warn(msg);\n else console.warn(msg);\n return {};\n }\n}\n\n// merge .env into process.env at load\nconst dotEnvVars = loadDotEnv();\nfor (const [k, v] of Object.entries(dotEnvVars)) {\n if (!(k in process.env)) process.env[k] = v;\n}\n\nexport const env = Object.freeze({\n string<T extends string = string>(key: Uppercase<string>, _default?: T): T {\n if (!(key in process.env)) process.env[key] = _default ?? \"\";\n return process.env[key] as T;\n },\n
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/index.ts"],"sourcesContent":["import {readFileSync, existsSync} from \"fs\";\nimport {T} from \"vitest/dist/chunks/global.d.MAmajcmJ\";\n\nfunction loadDotEnv(file = \".env\") {\n if (!existsSync(file)) return {};\n\n try {\n const text = readFileSync(file, \"utf8\");\n return Object.fromEntries(\n text\n .split(/\\r?\\n/)\n .filter((line) => line && !line.trim().startsWith(\"#\") && line.includes(\"=\"))\n .map((line) => {\n const [key, ...rest] = line.split(\"=\");\n let value = rest.join(\"=\").trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return [key.trim(), value];\n })\n );\n } catch (e: any) {\n const msg = e?.message ?? \"Failed to load .env\";\n // @ts-ignore\n if (globalThis.logger?.warn) globalThis.logger.warn(msg);\n else console.warn(msg);\n return {};\n }\n}\n\n// merge .env into process.env at load\nconst dotEnvVars = loadDotEnv();\nfor (const [k, v] of Object.entries(dotEnvVars)) {\n if (!(k in process.env)) process.env[k] = v;\n}\n\nexport const env = Object.freeze({\n string<T extends string = string>(key: Uppercase<string>, _default?: T): T {\n if (!(key in process.env)) process.env[key] = _default ?? \"\";\n return process.env[key] as T;\n },\n number(key: Uppercase<string>, _default = 0): number {\n const raw = process.env[key];\n if (raw === undefined) {\n process.env[key] = String(_default);\n return _default;\n }\n const val = Number(raw);\n return Number.isFinite(val) ? val : _default;\n },\n boolean(key: Uppercase<string>, _default = false): boolean {\n const raw = process.env[key];\n if (raw === undefined) {\n process.env[key] = _default ? \"true\" : \"false\";\n return _default;\n }\n const val = raw.toLowerCase();\n return val === \"true\" || val === \"1\";\n },\n url(key: Uppercase<string>, _default = new URL(\"http://localhost\")): URL {\n const raw = process.env[key];\n if (raw === undefined || !URL.canParse(raw)) {\n process.env[key] = _default.toString();\n return _default;\n }\n return URL.parse(raw)!;\n },\n has(key: Uppercase<string>): boolean {\n return Object.prototype.hasOwnProperty.call(process.env, key);\n },\n assert(keys: Uppercase<string>[], error_builder: (missing_keys: string[]) => string | Error = ((missing_keys) => new Error(`Missing required keys(${missing_keys.join()}) in environment`)),) {\n const missing_keys: string[] = [];\n keys.forEach((key) => this.has(key) ? void 0 : missing_keys.push(key));\n if (missing_keys.length > 0) {\n const result = error_builder(missing_keys);\n if (typeof result === \"string\") throw new Error(result);\n else throw result;\n }\n },\n defined(key: Uppercase<string>): boolean {\n return env.has(key) && process.env[key] !== undefined;\n },\n\n get dev(): boolean {\n return process.env.NODE_ENV !== \"production\";\n },\n\n collection<PF extends Uppercase<string>, RemovePrefix extends boolean = false>(\n prefix: PF,\n options: Partial<{\n reviver: (value: string | undefined, key: string) => any;\n removePrefix: RemovePrefix;\n }> = {}\n ): Record<string, any> {\n const {reviver = (v) => v, removePrefix = false} = options;\n return Object.fromEntries(\n Object.entries(process.env)\n .filter(([key]) => key.startsWith(prefix))\n .map(([key, value]) => [\n removePrefix ? key.replace(prefix, \"\") : key,\n reviver(value, key),\n ])\n );\n },\n\n utils: Object.freeze({\n select<T, F>(\n key: Uppercase<string>,\n TRUE: T,\n FALSE: F,\n predicate: (key: Uppercase<string>, value: any) => boolean = (k) =>\n env.boolean(k)\n ): T | F {\n return predicate(key, process.env[key]) ? TRUE : FALSE;\n },\n }),\n get raw() {\n return Object.freeze(dotEnvVars)\n },\n});\n"],"names":["loadDotEnv","file","existsSync","text","readFileSync","line","key","rest","value","e","msg","dotEnvVars","k","v","env","_default","raw","val","keys","error_builder","missing_keys","result","prefix","options","reviver","removePrefix","TRUE","FALSE","predicate"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export declare const env: Readonly<{
|
|
|
2
2
|
string<T extends string = string>(key: Uppercase<string>, _default?: T): T;
|
|
3
3
|
number(key: Uppercase<string>, _default?: number): number;
|
|
4
4
|
boolean(key: Uppercase<string>, _default?: boolean): boolean;
|
|
5
|
+
url(key: Uppercase<string>, _default?: URL): URL;
|
|
5
6
|
has(key: Uppercase<string>): boolean;
|
|
6
7
|
assert(keys: Uppercase<string>[], error_builder?: (missing_keys: string[]) => string | Error): void;
|
|
7
8
|
defined(key: Uppercase<string>): boolean;
|
package/dist/index.es.js
CHANGED
|
@@ -2,48 +2,52 @@ import { existsSync as a, readFileSync as v } from "fs";
|
|
|
2
2
|
function l(e = ".env") {
|
|
3
3
|
if (!a(e)) return {};
|
|
4
4
|
try {
|
|
5
|
-
const
|
|
5
|
+
const s = v(e, "utf8");
|
|
6
6
|
return Object.fromEntries(
|
|
7
|
-
|
|
8
|
-
const [
|
|
7
|
+
s.split(/\r?\n/).filter((r) => r && !r.trim().startsWith("#") && r.includes("=")).map((r) => {
|
|
8
|
+
const [t, ...n] = r.split("=");
|
|
9
9
|
let o = n.join("=").trim();
|
|
10
|
-
return (o.startsWith('"') && o.endsWith('"') || o.startsWith("'") && o.endsWith("'")) && (o = o.slice(1, -1)), [
|
|
10
|
+
return (o.startsWith('"') && o.endsWith('"') || o.startsWith("'") && o.endsWith("'")) && (o = o.slice(1, -1)), [t.trim(), o];
|
|
11
11
|
})
|
|
12
12
|
);
|
|
13
|
-
} catch (
|
|
14
|
-
const r =
|
|
13
|
+
} catch (s) {
|
|
14
|
+
const r = s?.message ?? "Failed to load .env";
|
|
15
15
|
return globalThis.logger?.warn ? globalThis.logger.warn(r) : console.warn(r), {};
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
const c = l();
|
|
19
|
-
for (const [e,
|
|
20
|
-
e in process.env || (process.env[e] =
|
|
19
|
+
for (const [e, s] of Object.entries(c))
|
|
20
|
+
e in process.env || (process.env[e] = s);
|
|
21
21
|
const i = Object.freeze({
|
|
22
|
-
string(e,
|
|
23
|
-
return e in process.env || (process.env[e] =
|
|
22
|
+
string(e, s) {
|
|
23
|
+
return e in process.env || (process.env[e] = s ?? ""), process.env[e];
|
|
24
24
|
},
|
|
25
|
-
number(e,
|
|
25
|
+
number(e, s = 0) {
|
|
26
26
|
const r = process.env[e];
|
|
27
27
|
if (r === void 0)
|
|
28
|
-
return process.env[e] = String(
|
|
29
|
-
const
|
|
30
|
-
return Number.isFinite(
|
|
28
|
+
return process.env[e] = String(s), s;
|
|
29
|
+
const t = Number(r);
|
|
30
|
+
return Number.isFinite(t) ? t : s;
|
|
31
31
|
},
|
|
32
|
-
boolean(e,
|
|
32
|
+
boolean(e, s = !1) {
|
|
33
33
|
const r = process.env[e];
|
|
34
34
|
if (r === void 0)
|
|
35
|
-
return process.env[e] =
|
|
36
|
-
const
|
|
37
|
-
return
|
|
35
|
+
return process.env[e] = s ? "true" : "false", s;
|
|
36
|
+
const t = r.toLowerCase();
|
|
37
|
+
return t === "true" || t === "1";
|
|
38
|
+
},
|
|
39
|
+
url(e, s = new URL("http://localhost")) {
|
|
40
|
+
const r = process.env[e];
|
|
41
|
+
return r === void 0 || !URL.canParse(r) ? (process.env[e] = s.toString(), s) : URL.parse(r);
|
|
38
42
|
},
|
|
39
43
|
has(e) {
|
|
40
44
|
return Object.prototype.hasOwnProperty.call(process.env, e);
|
|
41
45
|
},
|
|
42
|
-
assert(e,
|
|
46
|
+
assert(e, s = ((r) => new Error(`Missing required keys(${r.join()}) in environment`))) {
|
|
43
47
|
const r = [];
|
|
44
|
-
if (e.forEach((
|
|
45
|
-
const
|
|
46
|
-
throw typeof
|
|
48
|
+
if (e.forEach((t) => this.has(t) ? void 0 : r.push(t)), r.length > 0) {
|
|
49
|
+
const t = s(r);
|
|
50
|
+
throw typeof t == "string" ? new Error(t) : t;
|
|
47
51
|
}
|
|
48
52
|
},
|
|
49
53
|
defined(e) {
|
|
@@ -52,18 +56,18 @@ const i = Object.freeze({
|
|
|
52
56
|
get dev() {
|
|
53
57
|
return process.env.NODE_ENV !== "production";
|
|
54
58
|
},
|
|
55
|
-
collection(e,
|
|
56
|
-
const { reviver: r = (n) => n, removePrefix:
|
|
59
|
+
collection(e, s = {}) {
|
|
60
|
+
const { reviver: r = (n) => n, removePrefix: t = !1 } = s;
|
|
57
61
|
return Object.fromEntries(
|
|
58
62
|
Object.entries(process.env).filter(([n]) => n.startsWith(e)).map(([n, o]) => [
|
|
59
|
-
|
|
63
|
+
t ? n.replace(e, "") : n,
|
|
60
64
|
r(o, n)
|
|
61
65
|
])
|
|
62
66
|
);
|
|
63
67
|
},
|
|
64
68
|
utils: Object.freeze({
|
|
65
|
-
select(e,
|
|
66
|
-
return
|
|
69
|
+
select(e, s, r, t = (n) => i.boolean(n)) {
|
|
70
|
+
return t(e, process.env[e]) ? s : r;
|
|
67
71
|
}
|
|
68
72
|
}),
|
|
69
73
|
get raw() {
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/index.ts"],"sourcesContent":["import {readFileSync, existsSync} from \"fs\";\n\nfunction loadDotEnv(file = \".env\") {\n if (!existsSync(file)) return {};\n\n try {\n const text = readFileSync(file, \"utf8\");\n return Object.fromEntries(\n text\n .split(/\\r?\\n/)\n .filter((line) => line && !line.trim().startsWith(\"#\") && line.includes(\"=\"))\n .map((line) => {\n const [key, ...rest] = line.split(\"=\");\n let value = rest.join(\"=\").trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return [key.trim(), value];\n })\n );\n } catch (e: any) {\n const msg = e?.message ?? \"Failed to load .env\";\n // @ts-ignore\n if (globalThis.logger?.warn) globalThis.logger.warn(msg);\n else console.warn(msg);\n return {};\n }\n}\n\n// merge .env into process.env at load\nconst dotEnvVars = loadDotEnv();\nfor (const [k, v] of Object.entries(dotEnvVars)) {\n if (!(k in process.env)) process.env[k] = v;\n}\n\nexport const env = Object.freeze({\n string<T extends string = string>(key: Uppercase<string>, _default?: T): T {\n if (!(key in process.env)) process.env[key] = _default ?? \"\";\n return process.env[key] as T;\n },\n
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/index.ts"],"sourcesContent":["import {readFileSync, existsSync} from \"fs\";\nimport {T} from \"vitest/dist/chunks/global.d.MAmajcmJ\";\n\nfunction loadDotEnv(file = \".env\") {\n if (!existsSync(file)) return {};\n\n try {\n const text = readFileSync(file, \"utf8\");\n return Object.fromEntries(\n text\n .split(/\\r?\\n/)\n .filter((line) => line && !line.trim().startsWith(\"#\") && line.includes(\"=\"))\n .map((line) => {\n const [key, ...rest] = line.split(\"=\");\n let value = rest.join(\"=\").trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n return [key.trim(), value];\n })\n );\n } catch (e: any) {\n const msg = e?.message ?? \"Failed to load .env\";\n // @ts-ignore\n if (globalThis.logger?.warn) globalThis.logger.warn(msg);\n else console.warn(msg);\n return {};\n }\n}\n\n// merge .env into process.env at load\nconst dotEnvVars = loadDotEnv();\nfor (const [k, v] of Object.entries(dotEnvVars)) {\n if (!(k in process.env)) process.env[k] = v;\n}\n\nexport const env = Object.freeze({\n string<T extends string = string>(key: Uppercase<string>, _default?: T): T {\n if (!(key in process.env)) process.env[key] = _default ?? \"\";\n return process.env[key] as T;\n },\n number(key: Uppercase<string>, _default = 0): number {\n const raw = process.env[key];\n if (raw === undefined) {\n process.env[key] = String(_default);\n return _default;\n }\n const val = Number(raw);\n return Number.isFinite(val) ? val : _default;\n },\n boolean(key: Uppercase<string>, _default = false): boolean {\n const raw = process.env[key];\n if (raw === undefined) {\n process.env[key] = _default ? \"true\" : \"false\";\n return _default;\n }\n const val = raw.toLowerCase();\n return val === \"true\" || val === \"1\";\n },\n url(key: Uppercase<string>, _default = new URL(\"http://localhost\")): URL {\n const raw = process.env[key];\n if (raw === undefined || !URL.canParse(raw)) {\n process.env[key] = _default.toString();\n return _default;\n }\n return URL.parse(raw)!;\n },\n has(key: Uppercase<string>): boolean {\n return Object.prototype.hasOwnProperty.call(process.env, key);\n },\n assert(keys: Uppercase<string>[], error_builder: (missing_keys: string[]) => string | Error = ((missing_keys) => new Error(`Missing required keys(${missing_keys.join()}) in environment`)),) {\n const missing_keys: string[] = [];\n keys.forEach((key) => this.has(key) ? void 0 : missing_keys.push(key));\n if (missing_keys.length > 0) {\n const result = error_builder(missing_keys);\n if (typeof result === \"string\") throw new Error(result);\n else throw result;\n }\n },\n defined(key: Uppercase<string>): boolean {\n return env.has(key) && process.env[key] !== undefined;\n },\n\n get dev(): boolean {\n return process.env.NODE_ENV !== \"production\";\n },\n\n collection<PF extends Uppercase<string>, RemovePrefix extends boolean = false>(\n prefix: PF,\n options: Partial<{\n reviver: (value: string | undefined, key: string) => any;\n removePrefix: RemovePrefix;\n }> = {}\n ): Record<string, any> {\n const {reviver = (v) => v, removePrefix = false} = options;\n return Object.fromEntries(\n Object.entries(process.env)\n .filter(([key]) => key.startsWith(prefix))\n .map(([key, value]) => [\n removePrefix ? key.replace(prefix, \"\") : key,\n reviver(value, key),\n ])\n );\n },\n\n utils: Object.freeze({\n select<T, F>(\n key: Uppercase<string>,\n TRUE: T,\n FALSE: F,\n predicate: (key: Uppercase<string>, value: any) => boolean = (k) =>\n env.boolean(k)\n ): T | F {\n return predicate(key, process.env[key]) ? TRUE : FALSE;\n },\n }),\n get raw() {\n return Object.freeze(dotEnvVars)\n },\n});\n"],"names":["loadDotEnv","file","existsSync","text","readFileSync","line","key","rest","value","e","msg","dotEnvVars","k","v","env","_default","raw","val","keys","error_builder","missing_keys","result","prefix","options","reviver","removePrefix","TRUE","FALSE","predicate"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sourceregistry/node-env",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "A minimal, dependency-free TypeScript/JavaScript library for environment-variable loading and typed access.",
|
|
5
5
|
"main": "./dist/index.cjs.js",
|
|
6
6
|
"module": "./dist/index.es.js",
|