@prosopo/dotenv 3.0.49 → 3.0.51
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/.turbo/turbo-build$colon$cjs.log +11 -8
- package/.turbo/turbo-build$colon$tsc.log +7 -7
- package/.turbo/turbo-build.log +12 -9
- package/CHANGELOG.md +29 -0
- package/dist/_virtual/_rolldown/runtime.js +3 -0
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/env.cjs +73 -65
- package/dist/cjs/index.cjs +4 -5
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +65 -62
- package/dist/env.js.map +1 -1
- package/dist/index.js +2 -5
- package/dist/tests/env.test-d.d.ts +2 -0
- package/dist/tests/env.test-d.d.ts.map +1 -0
- package/dist/tests/env.test-d.js +50 -0
- package/dist/tests/env.test-d.js.map +1 -0
- package/dist/tests/env.unit.test.d.ts +2 -0
- package/dist/tests/env.unit.test.d.ts.map +1 -0
- package/dist/tests/env.unit.test.js +358 -0
- package/dist/tests/env.unit.test.js.map +1 -0
- package/package.json +7 -6
- package/src/env.ts +6 -2
- package/src/tests/env.test-d.ts +113 -0
- package/src/tests/env.unit.test.ts +624 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { getEnv, getEnvFile, loadEnv } from "../index.js";
|
|
6
|
+
const WORKSPACE_PKG_JSON = JSON.stringify({
|
|
7
|
+
name: "@prosopo/captcha-private",
|
|
8
|
+
});
|
|
9
|
+
describe("dotenv/env", () => {
|
|
10
|
+
let tmpRoot;
|
|
11
|
+
let envBackup;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "prosopo-dotenv-test-"));
|
|
14
|
+
envBackup = { ...process.env };
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
fs.rmSync(tmpRoot, { recursive: true, force: true });
|
|
18
|
+
for (const key of Object.keys(process.env)) {
|
|
19
|
+
if (!(key in envBackup))
|
|
20
|
+
delete process.env[key];
|
|
21
|
+
}
|
|
22
|
+
Object.assign(process.env, envBackup);
|
|
23
|
+
vi.restoreAllMocks();
|
|
24
|
+
});
|
|
25
|
+
const mkdir = (...segments) => {
|
|
26
|
+
const dir = path.join(tmpRoot, ...segments);
|
|
27
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
28
|
+
return dir;
|
|
29
|
+
};
|
|
30
|
+
const writeFile = (dir, name, contents) => {
|
|
31
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
32
|
+
const file = path.join(dir, name);
|
|
33
|
+
fs.writeFileSync(file, contents);
|
|
34
|
+
return file;
|
|
35
|
+
};
|
|
36
|
+
describe("getEnv", () => {
|
|
37
|
+
it("returns 'development' when NODE_ENV is not set", () => {
|
|
38
|
+
process.env.NODE_ENV = undefined;
|
|
39
|
+
delete process.env.NODE_ENV;
|
|
40
|
+
expect(getEnv()).toBe("development");
|
|
41
|
+
});
|
|
42
|
+
it("returns 'development' when NODE_ENV is the empty string", () => {
|
|
43
|
+
process.env.NODE_ENV = "";
|
|
44
|
+
expect(getEnv()).toBe("development");
|
|
45
|
+
});
|
|
46
|
+
it("returns NODE_ENV unchanged when it is already word characters only", () => {
|
|
47
|
+
process.env.NODE_ENV = "test";
|
|
48
|
+
expect(getEnv()).toBe("test");
|
|
49
|
+
});
|
|
50
|
+
it("strips non-word characters", () => {
|
|
51
|
+
process.env.NODE_ENV = "pro-duction!";
|
|
52
|
+
expect(getEnv()).toBe("production");
|
|
53
|
+
});
|
|
54
|
+
it("preserves digits and underscores, which are word characters", () => {
|
|
55
|
+
process.env.NODE_ENV = "staging_2";
|
|
56
|
+
expect(getEnv()).toBe("staging_2");
|
|
57
|
+
});
|
|
58
|
+
it("strips whitespace, including a value that is only whitespace", () => {
|
|
59
|
+
process.env.NODE_ENV = " test ";
|
|
60
|
+
expect(getEnv()).toBe("test");
|
|
61
|
+
process.env.NODE_ENV = " ";
|
|
62
|
+
expect(getEnv()).toBe("");
|
|
63
|
+
});
|
|
64
|
+
it("strips non-ASCII characters", () => {
|
|
65
|
+
process.env.NODE_ENV = "tëst";
|
|
66
|
+
expect(getEnv()).toBe("tst");
|
|
67
|
+
});
|
|
68
|
+
it("returns the empty string when NODE_ENV is entirely non-word characters", () => {
|
|
69
|
+
process.env.NODE_ENV = "!!!";
|
|
70
|
+
expect(getEnv()).toBe("");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("getEnvFile", () => {
|
|
74
|
+
it("finds the env file directly in rootDir", () => {
|
|
75
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
76
|
+
expect(getEnvFile(tmpRoot, ".env", undefined, "test")).toBe(expected);
|
|
77
|
+
});
|
|
78
|
+
it("walks up the tree to find the env file in an ancestor", () => {
|
|
79
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
80
|
+
const deep = mkdir("a", "b", "c");
|
|
81
|
+
expect(getEnvFile(deep, ".env", undefined, "test")).toBe(expected);
|
|
82
|
+
});
|
|
83
|
+
it("returns the nearest match when the file exists at several levels", () => {
|
|
84
|
+
writeFile(tmpRoot, ".env.test", "");
|
|
85
|
+
const nearestDir = mkdir("a", "b");
|
|
86
|
+
const nearest = writeFile(nearestDir, ".env.test", "");
|
|
87
|
+
const start = mkdir("a", "b", "c");
|
|
88
|
+
expect(getEnvFile(start, ".env", undefined, "test")).toBe(nearest);
|
|
89
|
+
});
|
|
90
|
+
it("respects a custom filename", () => {
|
|
91
|
+
const expected = writeFile(tmpRoot, "custom.test", "");
|
|
92
|
+
expect(getEnvFile(tmpRoot, "custom", undefined, "test")).toBe(expected);
|
|
93
|
+
});
|
|
94
|
+
it("uses the explicit nodeEnv argument in preference to NODE_ENV", () => {
|
|
95
|
+
process.env.NODE_ENV = "development";
|
|
96
|
+
const expected = writeFile(tmpRoot, ".env.production", "");
|
|
97
|
+
expect(getEnvFile(tmpRoot, ".env", undefined, "production")).toBe(expected);
|
|
98
|
+
});
|
|
99
|
+
it("falls back to NODE_ENV when nodeEnv is the empty string", () => {
|
|
100
|
+
process.env.NODE_ENV = "staging";
|
|
101
|
+
const expected = writeFile(tmpRoot, ".env.staging", "");
|
|
102
|
+
expect(getEnvFile(tmpRoot, ".env", undefined, "")).toBe(expected);
|
|
103
|
+
});
|
|
104
|
+
it("falls back to NODE_ENV when nodeEnv is omitted", () => {
|
|
105
|
+
process.env.NODE_ENV = "staging";
|
|
106
|
+
const expected = writeFile(tmpRoot, ".env.staging", "");
|
|
107
|
+
expect(getEnvFile(tmpRoot)).toBe(expected);
|
|
108
|
+
});
|
|
109
|
+
it("resolves a relative rootDir against the current working directory", () => {
|
|
110
|
+
const cwd = process.cwd();
|
|
111
|
+
const relative = path.relative(cwd, tmpRoot);
|
|
112
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
113
|
+
expect(getEnvFile(relative, ".env", undefined, "test")).toBe(expected);
|
|
114
|
+
});
|
|
115
|
+
it("treats an empty rootDir as the current working directory", () => {
|
|
116
|
+
const result = getEnvFile("", ".env", undefined, "nonexistent-env-xyz");
|
|
117
|
+
expect(path.isAbsolute(result)).toBe(true);
|
|
118
|
+
expect(result.endsWith(".env.nonexistent-env-xyz")).toBe(true);
|
|
119
|
+
});
|
|
120
|
+
it("falls back to the unsuffixed filename when the sanitised env is empty", () => {
|
|
121
|
+
process.env.NODE_ENV = "!!!";
|
|
122
|
+
const expected = writeFile(tmpRoot, ".env", "");
|
|
123
|
+
expect(getEnvFile(tmpRoot)).toBe(expected);
|
|
124
|
+
});
|
|
125
|
+
it("never appends a bare dot when the sanitised env is empty", () => {
|
|
126
|
+
process.env.NODE_ENV = "!!!";
|
|
127
|
+
const result = getEnvFile(tmpRoot);
|
|
128
|
+
expect(result).toBe(path.join(tmpRoot, ".env"));
|
|
129
|
+
expect(result.endsWith(".")).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
it("uses the unsuffixed name for a custom filename when the env is empty", () => {
|
|
132
|
+
process.env.NODE_ENV = "!!!";
|
|
133
|
+
const expected = writeFile(tmpRoot, "custom", "");
|
|
134
|
+
expect(getEnvFile(tmpRoot, "custom")).toBe(expected);
|
|
135
|
+
});
|
|
136
|
+
it("prefers the unsuffixed file over a stale trailing-dot file", () => {
|
|
137
|
+
process.env.NODE_ENV = "!!!";
|
|
138
|
+
writeFile(tmpRoot, ".env.", "");
|
|
139
|
+
const expected = writeFile(tmpRoot, ".env", "");
|
|
140
|
+
expect(getEnvFile(tmpRoot)).toBe(expected);
|
|
141
|
+
});
|
|
142
|
+
describe("workspace root sentinel", () => {
|
|
143
|
+
it("stops searching at the workspace-root package.json", () => {
|
|
144
|
+
writeFile(tmpRoot, ".env.test", "");
|
|
145
|
+
const workspaceRoot = mkdir("workspace");
|
|
146
|
+
writeFile(workspaceRoot, "package.json", WORKSPACE_PKG_JSON);
|
|
147
|
+
const start = mkdir("workspace", "packages", "thing");
|
|
148
|
+
const result = getEnvFile(start, ".env", undefined, "test");
|
|
149
|
+
expect(result).toBe(path.join(start, ".env.test"));
|
|
150
|
+
expect(fs.existsSync(result)).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
it("keeps walking past a package.json belonging to another project", () => {
|
|
153
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
154
|
+
const intermediate = mkdir("some-package");
|
|
155
|
+
writeFile(intermediate, "package.json", JSON.stringify({ name: "@prosopo/dotenv" }));
|
|
156
|
+
const start = mkdir("some-package", "src");
|
|
157
|
+
expect(getEnvFile(start, ".env", undefined, "test")).toBe(expected);
|
|
158
|
+
});
|
|
159
|
+
it("keeps walking past a package.json with no name field", () => {
|
|
160
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
161
|
+
const intermediate = mkdir("nameless");
|
|
162
|
+
writeFile(intermediate, "package.json", JSON.stringify({ version: 1 }));
|
|
163
|
+
const start = mkdir("nameless", "src");
|
|
164
|
+
expect(getEnvFile(start, ".env", undefined, "test")).toBe(expected);
|
|
165
|
+
});
|
|
166
|
+
it("keeps walking when package.json is valid JSON but not an object", () => {
|
|
167
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
168
|
+
const intermediate = mkdir("weird");
|
|
169
|
+
writeFile(intermediate, "package.json", "123");
|
|
170
|
+
const start = mkdir("weird", "src");
|
|
171
|
+
expect(getEnvFile(start, ".env", undefined, "test")).toBe(expected);
|
|
172
|
+
});
|
|
173
|
+
it("finds the env file at the workspace root itself", () => {
|
|
174
|
+
const workspaceRoot = mkdir("workspace");
|
|
175
|
+
writeFile(workspaceRoot, "package.json", WORKSPACE_PKG_JSON);
|
|
176
|
+
const expected = writeFile(workspaceRoot, ".env.test", "");
|
|
177
|
+
const start = mkdir("workspace", "packages", "thing");
|
|
178
|
+
expect(getEnvFile(start, ".env", undefined, "test")).toBe(expected);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe("depth limit", () => {
|
|
182
|
+
it("gives up after ascending more than 10 levels", () => {
|
|
183
|
+
const segments = Array.from({ length: 14 }, (_, i) => `d${i}`);
|
|
184
|
+
const start = mkdir(...segments);
|
|
185
|
+
const result = getEnvFile(start, ".env", undefined, "test");
|
|
186
|
+
expect(result).toBe(path.join(start, ".env.test"));
|
|
187
|
+
});
|
|
188
|
+
it("still finds a file exactly 10 levels up", () => {
|
|
189
|
+
const segments = Array.from({ length: 10 }, (_, i) => `d${i}`);
|
|
190
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
191
|
+
const start = mkdir(...segments);
|
|
192
|
+
expect(getEnvFile(start, ".env", undefined, "test")).toBe(expected);
|
|
193
|
+
});
|
|
194
|
+
it("terminates at the filesystem root instead of looping forever", () => {
|
|
195
|
+
const result = getEnvFile(path.parse(tmpRoot).root, ".env", undefined, "definitely-not-a-real-env-9f3a");
|
|
196
|
+
expect(result).toBe(path.join(path.parse(tmpRoot).root, ".env.definitely-not-a-real-env-9f3a"));
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe("fallback path when nothing is found", () => {
|
|
200
|
+
it("falls back to rootDir when rootDir was supplied", () => {
|
|
201
|
+
const start = mkdir("a");
|
|
202
|
+
expect(getEnvFile(start, ".env", "/some/other/place", "test")).toBe(path.join(start, ".env.test"));
|
|
203
|
+
});
|
|
204
|
+
it("falls back to the filepath argument when rootDir is falsy", () => {
|
|
205
|
+
const result = getEnvFile("", ".env", tmpRoot, "nonexistent-env-xyz");
|
|
206
|
+
expect(result).toBe(path.join(tmpRoot, ".env.nonexistent-env-xyz"));
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe("failure modes", () => {
|
|
210
|
+
it("propagates a SyntaxError when an ancestor package.json is malformed", () => {
|
|
211
|
+
writeFile(tmpRoot, ".env.test", "");
|
|
212
|
+
const intermediate = mkdir("broken");
|
|
213
|
+
writeFile(intermediate, "package.json", "{ not valid json");
|
|
214
|
+
const start = mkdir("broken", "src");
|
|
215
|
+
expect(() => getEnvFile(start, ".env", undefined, "test")).toThrow(SyntaxError);
|
|
216
|
+
});
|
|
217
|
+
it("propagates a TypeError when an ancestor package.json contains null", () => {
|
|
218
|
+
writeFile(tmpRoot, ".env.test", "");
|
|
219
|
+
const intermediate = mkdir("nullish");
|
|
220
|
+
writeFile(intermediate, "package.json", "null");
|
|
221
|
+
const start = mkdir("nullish", "src");
|
|
222
|
+
expect(() => getEnvFile(start, ".env", undefined, "test")).toThrow(TypeError);
|
|
223
|
+
});
|
|
224
|
+
it("propagates a read error when package.json vanishes after the existence check", () => {
|
|
225
|
+
writeFile(tmpRoot, ".env.test", "");
|
|
226
|
+
const intermediate = mkdir("racy");
|
|
227
|
+
writeFile(intermediate, "package.json", WORKSPACE_PKG_JSON);
|
|
228
|
+
const start = mkdir("racy", "src");
|
|
229
|
+
const readError = Object.assign(new Error("EACCES: permission denied"), {
|
|
230
|
+
code: "EACCES",
|
|
231
|
+
});
|
|
232
|
+
vi.spyOn(fs, "readFileSync").mockImplementation(() => {
|
|
233
|
+
throw readError;
|
|
234
|
+
});
|
|
235
|
+
expect(() => getEnvFile(start, ".env", undefined, "test")).toThrow(readError);
|
|
236
|
+
});
|
|
237
|
+
it("propagates an error thrown by the existence check itself", () => {
|
|
238
|
+
const statError = Object.assign(new Error("EIO: i/o error"), {
|
|
239
|
+
code: "EIO",
|
|
240
|
+
});
|
|
241
|
+
vi.spyOn(fs, "existsSync").mockImplementation(() => {
|
|
242
|
+
throw statError;
|
|
243
|
+
});
|
|
244
|
+
expect(() => getEnvFile(tmpRoot, ".env", undefined, "test")).toThrow(statError);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe("loadEnv", () => {
|
|
249
|
+
it("loads variables from the discovered file into process.env", () => {
|
|
250
|
+
writeFile(tmpRoot, ".env.test", "PROSOPO_TEST_VALUE=hello\n");
|
|
251
|
+
const returned = loadEnv(tmpRoot, ".env", undefined, "test");
|
|
252
|
+
expect(returned).toBe(path.join(tmpRoot, ".env.test"));
|
|
253
|
+
expect(process.env.PROSOPO_TEST_VALUE).toBe("hello");
|
|
254
|
+
});
|
|
255
|
+
it("loads multiple variables and ignores comments and blank lines", () => {
|
|
256
|
+
writeFile(tmpRoot, ".env.test", "# a comment\n\nPROSOPO_A=1\nPROSOPO_B=two\n");
|
|
257
|
+
loadEnv(tmpRoot, ".env", undefined, "test");
|
|
258
|
+
expect(process.env.PROSOPO_A).toBe("1");
|
|
259
|
+
expect(process.env.PROSOPO_B).toBe("two");
|
|
260
|
+
});
|
|
261
|
+
it("handles an empty env file without error", () => {
|
|
262
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
263
|
+
expect(loadEnv(tmpRoot, ".env", undefined, "test")).toBe(expected);
|
|
264
|
+
});
|
|
265
|
+
it("does not overwrite existing variables by default", () => {
|
|
266
|
+
process.env.PROSOPO_TEST_VALUE = "original";
|
|
267
|
+
writeFile(tmpRoot, ".env.test", "PROSOPO_TEST_VALUE=replacement\n");
|
|
268
|
+
loadEnv(tmpRoot, ".env", undefined, "test");
|
|
269
|
+
expect(process.env.PROSOPO_TEST_VALUE).toBe("original");
|
|
270
|
+
});
|
|
271
|
+
it("overwrites existing variables when override is true", () => {
|
|
272
|
+
process.env.PROSOPO_TEST_VALUE = "original";
|
|
273
|
+
writeFile(tmpRoot, ".env.test", "PROSOPO_TEST_VALUE=replacement\n");
|
|
274
|
+
loadEnv(tmpRoot, ".env", undefined, "test", true);
|
|
275
|
+
expect(process.env.PROSOPO_TEST_VALUE).toBe("replacement");
|
|
276
|
+
});
|
|
277
|
+
it("uses the explicit nodeEnv to choose which file to load", () => {
|
|
278
|
+
process.env.NODE_ENV = "development";
|
|
279
|
+
writeFile(tmpRoot, ".env.development", "PROSOPO_WHICH=development\n");
|
|
280
|
+
writeFile(tmpRoot, ".env.production", "PROSOPO_WHICH=production\n");
|
|
281
|
+
loadEnv(tmpRoot, ".env", undefined, "production");
|
|
282
|
+
expect(process.env.PROSOPO_WHICH).toBe("production");
|
|
283
|
+
});
|
|
284
|
+
it("respects a custom filename", () => {
|
|
285
|
+
writeFile(tmpRoot, "custom.test", "PROSOPO_CUSTOM=yes\n");
|
|
286
|
+
const returned = loadEnv(tmpRoot, "custom", undefined, "test");
|
|
287
|
+
expect(returned).toBe(path.join(tmpRoot, "custom.test"));
|
|
288
|
+
expect(process.env.PROSOPO_CUSTOM).toBe("yes");
|
|
289
|
+
});
|
|
290
|
+
it("returns a path and stays silent when no env file exists", () => {
|
|
291
|
+
const start = mkdir("empty");
|
|
292
|
+
const returned = loadEnv(start, ".env", undefined, "nonexistent-env-xyz");
|
|
293
|
+
expect(returned).toBe(path.join(start, ".env.nonexistent-env-xyz"));
|
|
294
|
+
expect(fs.existsSync(returned)).toBe(false);
|
|
295
|
+
});
|
|
296
|
+
it("loads the unsuffixed file when the sanitised env is empty", () => {
|
|
297
|
+
process.env.NODE_ENV = "!!!";
|
|
298
|
+
const expected = writeFile(tmpRoot, ".env", "PROSOPO_UNSUFFIXED=yes\n");
|
|
299
|
+
expect(loadEnv(tmpRoot)).toBe(expected);
|
|
300
|
+
expect(process.env.PROSOPO_UNSUFFIXED).toBe("yes");
|
|
301
|
+
});
|
|
302
|
+
it("defaults to the current working directory when rootDir is omitted", () => {
|
|
303
|
+
const returned = loadEnv(undefined, ".env", undefined, "nonexistent-xyz");
|
|
304
|
+
expect(path.isAbsolute(returned)).toBe(true);
|
|
305
|
+
expect(returned.endsWith(".env.nonexistent-xyz")).toBe(true);
|
|
306
|
+
});
|
|
307
|
+
it("propagates errors thrown during discovery", () => {
|
|
308
|
+
const intermediate = mkdir("broken");
|
|
309
|
+
writeFile(intermediate, "package.json", "{ not valid json");
|
|
310
|
+
const start = mkdir("broken", "src");
|
|
311
|
+
expect(() => loadEnv(start, ".env", undefined, "test")).toThrow(SyntaxError);
|
|
312
|
+
});
|
|
313
|
+
it("silently ignores a read failure on the env file", () => {
|
|
314
|
+
writeFile(tmpRoot, ".env.test", "PROSOPO_TEST_VALUE=hello\n");
|
|
315
|
+
const readError = Object.assign(new Error("EACCES: permission denied"), {
|
|
316
|
+
code: "EACCES",
|
|
317
|
+
});
|
|
318
|
+
vi.spyOn(fs, "readFileSync").mockImplementation(() => {
|
|
319
|
+
throw readError;
|
|
320
|
+
});
|
|
321
|
+
const returned = loadEnv(tmpRoot, ".env", undefined, "test");
|
|
322
|
+
expect(returned).toBe(path.join(tmpRoot, ".env.test"));
|
|
323
|
+
expect(process.env.PROSOPO_TEST_VALUE).toBeUndefined();
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
describe("debug logging", () => {
|
|
327
|
+
const importAtDebugLevel = async () => {
|
|
328
|
+
process.env.PROSOPO_LOG_LEVEL = "debug";
|
|
329
|
+
vi.resetModules();
|
|
330
|
+
return import("../index.js");
|
|
331
|
+
};
|
|
332
|
+
it("builds the search payload without throwing", async () => {
|
|
333
|
+
const { getEnvFile: getEnvFileDebug } = await importAtDebugLevel();
|
|
334
|
+
const expected = writeFile(tmpRoot, ".env.test", "");
|
|
335
|
+
expect(getEnvFileDebug(tmpRoot, ".env", undefined, "test")).toBe(expected);
|
|
336
|
+
});
|
|
337
|
+
it("builds the workspace-root payload without throwing", async () => {
|
|
338
|
+
const { getEnvFile: getEnvFileDebug } = await importAtDebugLevel();
|
|
339
|
+
const workspaceRoot = mkdir("workspace");
|
|
340
|
+
writeFile(workspaceRoot, "package.json", WORKSPACE_PKG_JSON);
|
|
341
|
+
const start = mkdir("workspace", "packages", "thing");
|
|
342
|
+
expect(getEnvFileDebug(start, ".env", undefined, "test")).toBe(path.join(start, ".env.test"));
|
|
343
|
+
});
|
|
344
|
+
it("builds the depth-limit payload without throwing", async () => {
|
|
345
|
+
const { getEnvFile: getEnvFileDebug } = await importAtDebugLevel();
|
|
346
|
+
const segments = Array.from({ length: 14 }, (_, i) => `d${i}`);
|
|
347
|
+
const start = mkdir(...segments);
|
|
348
|
+
expect(getEnvFileDebug(start, ".env", undefined, "test")).toBe(path.join(start, ".env.test"));
|
|
349
|
+
});
|
|
350
|
+
it("builds the load payload without throwing", async () => {
|
|
351
|
+
const { loadEnv: loadEnvDebug } = await importAtDebugLevel();
|
|
352
|
+
const expected = writeFile(tmpRoot, ".env.test", "PROSOPO_DEBUG_V=1\n");
|
|
353
|
+
expect(loadEnvDebug(tmpRoot, ".env", undefined, "test")).toBe(expected);
|
|
354
|
+
expect(process.env.PROSOPO_DEBUG_V).toBe("1");
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
//# sourceMappingURL=env.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.unit.test.js","sourceRoot":"","sources":["../../src/tests/env.unit.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/dotenv",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.51",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -24,25 +24,26 @@
|
|
|
24
24
|
"build:tsc": "tsc --build --verbose",
|
|
25
25
|
"build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
|
|
26
26
|
"typecheck": "tsc --project tsconfig.types.json",
|
|
27
|
+
"test": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --config ./vite.test.config.ts",
|
|
27
28
|
"cli": "node ./dist/js/cli.js"
|
|
28
29
|
},
|
|
29
30
|
"type": "module",
|
|
30
31
|
"dependencies": {
|
|
31
|
-
"@prosopo/logger": "2.0.
|
|
32
|
+
"@prosopo/logger": "2.0.5",
|
|
32
33
|
"dotenv": "16.4.5"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
|
-
"@prosopo/config": "3.3.
|
|
36
|
+
"@prosopo/config": "3.3.7",
|
|
36
37
|
"@types/node": "22.10.2",
|
|
37
|
-
"@vitest/coverage-v8": "
|
|
38
|
+
"@vitest/coverage-v8": "4.1.10",
|
|
38
39
|
"concurrently": "9.0.1",
|
|
39
40
|
"del-cli": "6.0.0",
|
|
40
41
|
"npm-run-all": "4.1.5",
|
|
41
42
|
"tslib": "2.7.0",
|
|
42
43
|
"tsx": "4.20.3",
|
|
43
44
|
"typescript": "5.6.2",
|
|
44
|
-
"vite": "
|
|
45
|
-
"vitest": "
|
|
45
|
+
"vite": "8.1.5",
|
|
46
|
+
"vitest": "4.1.10"
|
|
46
47
|
},
|
|
47
48
|
"repository": {
|
|
48
49
|
"type": "git",
|
package/src/env.ts
CHANGED
|
@@ -55,7 +55,8 @@ export function loadEnv(
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
|
-
* Get the path to the .env file. Search up directories until
|
|
58
|
+
* Get the path to the .env file. Search up directories until `${filename}.${env}`
|
|
59
|
+
* is found — or, when `env` sanitises to the empty string, plain `filename`.
|
|
59
60
|
* If not found, look in the root directory, if specified, or 2 directories up from this file.
|
|
60
61
|
* @param rootDir
|
|
61
62
|
* @param filename
|
|
@@ -69,7 +70,10 @@ export function getEnvFile(
|
|
|
69
70
|
nodeEnv?: string,
|
|
70
71
|
) {
|
|
71
72
|
const env = nodeEnv || getEnv();
|
|
72
|
-
|
|
73
|
+
// getEnv strips non-word characters, so a NODE_ENV of e.g. "!!!" sanitises
|
|
74
|
+
// to the empty string. Suffixing that would look for ".env." — a file nobody
|
|
75
|
+
// creates — so fall back to the unsuffixed filename instead.
|
|
76
|
+
const fileNameFull = env ? `${filename}.${env}` : filename;
|
|
73
77
|
|
|
74
78
|
let searchPath = path.resolve(rootDir || ".");
|
|
75
79
|
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Copyright 2021-2026 Prosopo (UK) Ltd.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
import { describe, expectTypeOf, it } from "vitest";
|
|
16
|
+
// Imported from the package entrypoint, not ../env.js: these assertions exist
|
|
17
|
+
// to pin what consumers actually receive, so a barrel that stops re-exporting
|
|
18
|
+
// something — or narrows it — must fail here.
|
|
19
|
+
import { getEnv, getEnvFile, loadEnv } from "../index.js";
|
|
20
|
+
|
|
21
|
+
describe("getEnv", () => {
|
|
22
|
+
it("always yields a string, since it falls back to development", () => {
|
|
23
|
+
// A `string | undefined` return would force every caller to handle an
|
|
24
|
+
// absent NODE_ENV that this function has already defaulted away.
|
|
25
|
+
expectTypeOf(getEnv).returns.toEqualTypeOf<string>();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("takes no arguments: it reads process.env directly", () => {
|
|
29
|
+
expectTypeOf(getEnv).parameters.toEqualTypeOf<[]>();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("loadEnv", () => {
|
|
34
|
+
it("returns the resolved env path rather than void", () => {
|
|
35
|
+
// Callers log and assert on which file was actually loaded.
|
|
36
|
+
expectTypeOf(loadEnv).returns.toEqualTypeOf<string>();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("is callable with no arguments at all", () => {
|
|
40
|
+
expectTypeOf(loadEnv).toBeCallableWith();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("takes every argument as optional, in order", () => {
|
|
44
|
+
expectTypeOf(loadEnv).parameters.toEqualTypeOf<
|
|
45
|
+
[
|
|
46
|
+
(string | undefined)?,
|
|
47
|
+
(string | undefined)?,
|
|
48
|
+
(string | undefined)?,
|
|
49
|
+
(string | undefined)?,
|
|
50
|
+
(boolean | undefined)?,
|
|
51
|
+
]
|
|
52
|
+
>();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("accepts a partially specified call", () => {
|
|
56
|
+
expectTypeOf(loadEnv).toBeCallableWith("/root");
|
|
57
|
+
expectTypeOf(loadEnv).toBeCallableWith("/root", ".env");
|
|
58
|
+
expectTypeOf(loadEnv).toBeCallableWith(
|
|
59
|
+
"/root",
|
|
60
|
+
".env",
|
|
61
|
+
"/root/.env",
|
|
62
|
+
"test",
|
|
63
|
+
true,
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("keeps override a boolean, not a truthy anything", () => {
|
|
68
|
+
// @ts-expect-error override is a boolean flag
|
|
69
|
+
loadEnv("/root", ".env", "/root/.env", "test", "yes");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("rejects a numeric root directory", () => {
|
|
73
|
+
// @ts-expect-error rootDir is a path string
|
|
74
|
+
loadEnv(1);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("getEnvFile", () => {
|
|
79
|
+
it("always resolves to a path string", () => {
|
|
80
|
+
// It returns a best-effort path even when nothing was found on disk, so
|
|
81
|
+
// the caller never has to handle undefined.
|
|
82
|
+
expectTypeOf(getEnvFile).returns.toEqualTypeOf<string>();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("is callable with no arguments, defaulting filename and search root", () => {
|
|
86
|
+
expectTypeOf(getEnvFile).toBeCallableWith();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("takes four optional positional arguments", () => {
|
|
90
|
+
expectTypeOf(getEnvFile).parameters.toEqualTypeOf<
|
|
91
|
+
[
|
|
92
|
+
(string | undefined)?,
|
|
93
|
+
(string | undefined)?,
|
|
94
|
+
(string | undefined)?,
|
|
95
|
+
(string | undefined)?,
|
|
96
|
+
]
|
|
97
|
+
>();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("accepts an explicit nodeEnv override in last position", () => {
|
|
101
|
+
expectTypeOf(getEnvFile).toBeCallableWith(
|
|
102
|
+
"/root",
|
|
103
|
+
".env",
|
|
104
|
+
"/fallback",
|
|
105
|
+
"production",
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("rejects an extra argument", () => {
|
|
110
|
+
// @ts-expect-error there is no fifth parameter
|
|
111
|
+
getEnvFile("/root", ".env", "/fallback", "production", true);
|
|
112
|
+
});
|
|
113
|
+
});
|