@sourceregistry/node-env 1.0.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 +5 -3
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +45 -34
- package/dist/index.es.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ No dependencies, focus on runtime safety.
|
|
|
13
13
|
Key features:
|
|
14
14
|
- Load `.env` file (ignores comments, blank lines, quotes) and merge into `process.env`.
|
|
15
15
|
- Access variables via `.string()`, `.number()`, `.boolean()` with defaults.
|
|
16
|
-
- Check keys with `.has()`, `.defined()`.
|
|
16
|
+
- Check keys with `.has()`, `.defined()`, `.assert()`.
|
|
17
17
|
- Get `env.dev` boolean for “development vs production” mode.
|
|
18
18
|
- Collect variables with a common prefix via `.collection()`, optional prefix removal & reviver.
|
|
19
19
|
- Utility method `.utils.select()` for feature‐flag style branching.
|
|
@@ -84,7 +84,7 @@ When you have many environment variables prefixed in a group:
|
|
|
84
84
|
|
|
85
85
|
```ts
|
|
86
86
|
// .env
|
|
87
|
-
API_URL=https://api.example.com
|
|
87
|
+
API_URL="https://api.example.com"
|
|
88
88
|
API_KEY=abcdef
|
|
89
89
|
API_TIMEOUT=5000
|
|
90
90
|
|
|
@@ -120,11 +120,13 @@ const mode = env.utils.select("FEATURE_X", "enabled", "disabled");
|
|
|
120
120
|
## API Reference
|
|
121
121
|
|
|
122
122
|
| Method | Description |
|
|
123
|
-
|
|
123
|
+
|--------------------------------------------------|-----------------------------------------------------------------------------------------------------|
|
|
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`. |
|
|
129
|
+
| `env.assert([keys], error_builder?)` | Throws an error if one or more keys doesn't exists in `process.env`. |
|
|
128
130
|
| `env.defined(key)` | Returns true if key exists and value is not `undefined`. |
|
|
129
131
|
| `env.dev` | Boolean flag: true if `NODE_ENV !== "production"`. |
|
|
130
132
|
| `env.collection(prefix, options?)` | Get an object of all env keys starting with `prefix`. Options include `removePrefix` and `reviver`. |
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
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 {
|
|
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,7 +2,9 @@ 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;
|
|
7
|
+
assert(keys: Uppercase<string>[], error_builder?: (missing_keys: string[]) => string | Error): void;
|
|
6
8
|
defined(key: Uppercase<string>): boolean;
|
|
7
9
|
readonly dev: boolean;
|
|
8
10
|
collection<PF extends Uppercase<string>, RemovePrefix extends boolean = false>(prefix: PF, options?: Partial<{
|
package/dist/index.es.js
CHANGED
|
@@ -2,68 +2,79 @@ 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
|
|
15
|
-
return globalThis.logger?.warn ? globalThis.logger.warn(
|
|
13
|
+
} catch (s) {
|
|
14
|
+
const r = s?.message ?? "Failed to load .env";
|
|
15
|
+
return globalThis.logger?.warn ? globalThis.logger.warn(r) : console.warn(r), {};
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
const
|
|
19
|
-
for (const [e,
|
|
20
|
-
e in process.env || (process.env[e] =
|
|
21
|
-
const
|
|
22
|
-
string(e,
|
|
23
|
-
return e in process.env || (process.env[e] =
|
|
18
|
+
const c = l();
|
|
19
|
+
for (const [e, s] of Object.entries(c))
|
|
20
|
+
e in process.env || (process.env[e] = s);
|
|
21
|
+
const i = Object.freeze({
|
|
22
|
+
string(e, s) {
|
|
23
|
+
return e in process.env || (process.env[e] = s ?? ""), process.env[e];
|
|
24
24
|
},
|
|
25
|
-
number(e,
|
|
26
|
-
const
|
|
27
|
-
if (
|
|
28
|
-
return process.env[e] = String(
|
|
29
|
-
const
|
|
30
|
-
return Number.isFinite(
|
|
25
|
+
number(e, s = 0) {
|
|
26
|
+
const r = process.env[e];
|
|
27
|
+
if (r === void 0)
|
|
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,
|
|
33
|
-
const
|
|
34
|
-
if (
|
|
35
|
-
return process.env[e] =
|
|
36
|
-
const
|
|
37
|
-
return
|
|
32
|
+
boolean(e, s = !1) {
|
|
33
|
+
const r = process.env[e];
|
|
34
|
+
if (r === void 0)
|
|
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
|
},
|
|
46
|
+
assert(e, s = ((r) => new Error(`Missing required keys(${r.join()}) in environment`))) {
|
|
47
|
+
const r = [];
|
|
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;
|
|
51
|
+
}
|
|
52
|
+
},
|
|
42
53
|
defined(e) {
|
|
43
|
-
return
|
|
54
|
+
return i.has(e) && process.env[e] !== void 0;
|
|
44
55
|
},
|
|
45
56
|
get dev() {
|
|
46
57
|
return process.env.NODE_ENV !== "production";
|
|
47
58
|
},
|
|
48
|
-
collection(e,
|
|
49
|
-
const { reviver:
|
|
59
|
+
collection(e, s = {}) {
|
|
60
|
+
const { reviver: r = (n) => n, removePrefix: t = !1 } = s;
|
|
50
61
|
return Object.fromEntries(
|
|
51
62
|
Object.entries(process.env).filter(([n]) => n.startsWith(e)).map(([n, o]) => [
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
t ? n.replace(e, "") : n,
|
|
64
|
+
r(o, n)
|
|
54
65
|
])
|
|
55
66
|
);
|
|
56
67
|
},
|
|
57
68
|
utils: Object.freeze({
|
|
58
|
-
select(e, r, t
|
|
59
|
-
return
|
|
69
|
+
select(e, s, r, t = (n) => i.boolean(n)) {
|
|
70
|
+
return t(e, process.env[e]) ? s : r;
|
|
60
71
|
}
|
|
61
72
|
}),
|
|
62
73
|
get raw() {
|
|
63
|
-
return Object.freeze(
|
|
74
|
+
return Object.freeze(c);
|
|
64
75
|
}
|
|
65
76
|
});
|
|
66
77
|
export {
|
|
67
|
-
|
|
78
|
+
i as env
|
|
68
79
|
};
|
|
69
80
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/index.ts"],"sourcesContent":["import {
|
|
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",
|