@nightintelligence/cloudflare-workers-utils 0.35.0-patch1
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 -0
- package/dist/browser.d.mts +47 -0
- package/dist/browser.mjs +4 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/chunk-3D4BXUZX.mjs +54 -0
- package/dist/chunk-3D4BXUZX.mjs.map +1 -0
- package/dist/chunk-4RE36JUD.mjs +3160 -0
- package/dist/chunk-4RE36JUD.mjs.map +1 -0
- package/dist/chunk-6LYDFTTF.mjs +40 -0
- package/dist/chunk-6LYDFTTF.mjs.map +1 -0
- package/dist/chunk-CPLEE7LH.mjs +64 -0
- package/dist/chunk-CPLEE7LH.mjs.map +1 -0
- package/dist/chunk-G5FCNCLK.mjs +47 -0
- package/dist/chunk-G5FCNCLK.mjs.map +1 -0
- package/dist/chunk-IGC3TZGH.mjs +157 -0
- package/dist/chunk-IGC3TZGH.mjs.map +1 -0
- package/dist/chunk-NXPJWJ2B.mjs +180 -0
- package/dist/chunk-NXPJWJ2B.mjs.map +1 -0
- package/dist/chunk-OPAKTV2K.mjs +75 -0
- package/dist/chunk-OPAKTV2K.mjs.map +1 -0
- package/dist/chunk-VKFVZ67V.mjs +35 -0
- package/dist/chunk-VKFVZ67V.mjs.map +1 -0
- package/dist/chunk-W7DIL5J2.mjs +267 -0
- package/dist/chunk-W7DIL5J2.mjs.map +1 -0
- package/dist/chunk-ZLUHKBEC.mjs +44 -0
- package/dist/chunk-ZLUHKBEC.mjs.map +1 -0
- package/dist/chunk-ZQ2EZEOC.mjs +477 -0
- package/dist/chunk-ZQ2EZEOC.mjs.map +1 -0
- package/dist/compatibility-date.d.mts +80 -0
- package/dist/compatibility-date.mjs +4 -0
- package/dist/compatibility-date.mjs.map +1 -0
- package/dist/compliance-j3-tqeao.d.mts +3616 -0
- package/dist/compliance.d.mts +4 -0
- package/dist/compliance.mjs +9 -0
- package/dist/compliance.mjs.map +1 -0
- package/dist/docker-path.d.mts +8 -0
- package/dist/docker-path.mjs +5 -0
- package/dist/docker-path.mjs.map +1 -0
- package/dist/errors.d.mts +55 -0
- package/dist/errors.mjs +4 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/fs-helpers.d.mts +40 -0
- package/dist/fs-helpers.mjs +4 -0
- package/dist/fs-helpers.mjs.map +1 -0
- package/dist/global-wrangler-config-path.d.mts +35 -0
- package/dist/global-wrangler-config-path.mjs +5 -0
- package/dist/global-wrangler-config-path.mjs.map +1 -0
- package/dist/index.d.mts +1263 -0
- package/dist/index.mjs +26282 -0
- package/dist/index.mjs.map +1 -0
- package/dist/local-env.d.mts +54 -0
- package/dist/local-env.mjs +178 -0
- package/dist/local-env.mjs.map +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/open-OYMIZX6T.mjs +609 -0
- package/dist/open-OYMIZX6T.mjs.map +1 -0
- package/dist/prometheus-metrics.d.mts +50 -0
- package/dist/prometheus-metrics.mjs +4 -0
- package/dist/prometheus-metrics.mjs.map +1 -0
- package/dist/test-helpers/index.d.mts +46 -0
- package/dist/test-helpers/index.mjs +310 -0
- package/dist/test-helpers/index.mjs.map +1 -0
- package/dist/zod-format.d.mts +6 -0
- package/dist/zod-format.mjs +4 -0
- package/dist/zod-format.mjs.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
type LocalEnvValueSource = {
|
|
2
|
+
type: "file";
|
|
3
|
+
path: string;
|
|
4
|
+
} | {
|
|
5
|
+
type: "process";
|
|
6
|
+
};
|
|
7
|
+
interface LoadedEnv {
|
|
8
|
+
values: Record<string, string>;
|
|
9
|
+
sources: Record<string, LocalEnvValueSource>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Returns the local `.env` candidates in increasing precedence order.
|
|
13
|
+
*
|
|
14
|
+
* @param envDir The resolved environment directory. `false` disables file
|
|
15
|
+
* loading, matching Vite's `envDir` convention.
|
|
16
|
+
* @param mode The optional mode used for mode-specific files.
|
|
17
|
+
* @returns Absolute candidate paths in load order.
|
|
18
|
+
*/
|
|
19
|
+
declare function getEnvPaths(envDir: string | false, mode?: string): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Returns the `.dev.vars` candidates in decreasing selection priority.
|
|
22
|
+
*
|
|
23
|
+
* @param envDir The resolved environment directory. `false` disables file
|
|
24
|
+
* loading, matching Vite's `envDir` convention.
|
|
25
|
+
* @param mode The optional mode used to select `.dev.vars.<mode>`.
|
|
26
|
+
* @returns Absolute candidate paths in selection order.
|
|
27
|
+
*/
|
|
28
|
+
declare function getDevVarsCandidatePaths(envDir: string | false, mode?: string): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Loads local `.env` files using Vite-compatible file precedence and
|
|
31
|
+
* Wrangler-compatible parsing and expansion.
|
|
32
|
+
*
|
|
33
|
+
* Expansion is progressive: references can use process values and values
|
|
34
|
+
* declared earlier in the merged environment, but not values declared later.
|
|
35
|
+
* Loading has no process-global side effects.
|
|
36
|
+
*
|
|
37
|
+
* @param envDir The resolved environment directory. `false` disables file
|
|
38
|
+
* loading, matching Vite's `envDir` convention.
|
|
39
|
+
* @param mode The optional mode used for mode-specific files.
|
|
40
|
+
* @returns Resolved values and metadata describing their sources.
|
|
41
|
+
*/
|
|
42
|
+
declare function loadEnv(envDir: string | false, mode?: string): Promise<LoadedEnv>;
|
|
43
|
+
/**
|
|
44
|
+
* Loads the first existing `.dev.vars` candidate without merging it with other
|
|
45
|
+
* files or process-environment values.
|
|
46
|
+
*
|
|
47
|
+
* @param envDir The resolved environment directory. `false` disables file
|
|
48
|
+
* loading, matching Vite's `envDir` convention.
|
|
49
|
+
* @param mode The optional mode used to select `.dev.vars.<mode>`.
|
|
50
|
+
* @returns The selected `.dev.vars` values, or `undefined` when no candidate exists.
|
|
51
|
+
*/
|
|
52
|
+
declare function loadDevVars(envDir: string | false, mode?: string): Promise<Record<string, string> | undefined>;
|
|
53
|
+
|
|
54
|
+
export { type LoadedEnv, type LocalEnvValueSource, getDevVarsCandidatePaths, getEnvPaths, loadDevVars, loadEnv };
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { __commonJS, __name, __toESM } from './chunk-6LYDFTTF.mjs';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { parse } from 'dotenv';
|
|
5
|
+
|
|
6
|
+
// ../../node_modules/.pnpm/dotenv-expand@13.0.0/node_modules/dotenv-expand/lib/main.js
|
|
7
|
+
var require_main = __commonJS({
|
|
8
|
+
"../../node_modules/.pnpm/dotenv-expand@13.0.0/node_modules/dotenv-expand/lib/main.js"(exports$1, module) {
|
|
9
|
+
function _resolveEscapeSequences(value) {
|
|
10
|
+
return value.replace(/\\\$/g, "$");
|
|
11
|
+
}
|
|
12
|
+
__name(_resolveEscapeSequences, "_resolveEscapeSequences");
|
|
13
|
+
function expandValue(value, processEnv, runningParsed) {
|
|
14
|
+
const env = { ...runningParsed, ...processEnv };
|
|
15
|
+
const regex = /(?<!\\)\${([^{}]+)}|(?<!\\)\$([A-Za-z_][A-Za-z0-9_]*)/g;
|
|
16
|
+
let result = value;
|
|
17
|
+
let match;
|
|
18
|
+
const seen = /* @__PURE__ */ new Set();
|
|
19
|
+
while ((match = regex.exec(result)) !== null) {
|
|
20
|
+
seen.add(result);
|
|
21
|
+
const [template, bracedExpression, unbracedExpression] = match;
|
|
22
|
+
const expression = bracedExpression || unbracedExpression;
|
|
23
|
+
const opRegex = /(:\+|\+|:-|-)/;
|
|
24
|
+
const opMatch = expression.match(opRegex);
|
|
25
|
+
const splitter = opMatch ? opMatch[0] : null;
|
|
26
|
+
const r = expression.split(splitter);
|
|
27
|
+
let defaultValue;
|
|
28
|
+
let value2;
|
|
29
|
+
const key = r.shift();
|
|
30
|
+
if ([":+", "+"].includes(splitter)) {
|
|
31
|
+
defaultValue = env[key] ? r.join(splitter) : "";
|
|
32
|
+
value2 = null;
|
|
33
|
+
} else {
|
|
34
|
+
defaultValue = r.join(splitter);
|
|
35
|
+
value2 = env[key];
|
|
36
|
+
}
|
|
37
|
+
if (value2) {
|
|
38
|
+
if (seen.has(value2)) {
|
|
39
|
+
result = result.replace(template, defaultValue);
|
|
40
|
+
} else {
|
|
41
|
+
result = result.replace(template, value2);
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
result = result.replace(template, defaultValue);
|
|
45
|
+
}
|
|
46
|
+
if (result === runningParsed[key]) {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
regex.lastIndex = 0;
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
__name(expandValue, "expandValue");
|
|
54
|
+
function expand2(options) {
|
|
55
|
+
const runningParsed = {};
|
|
56
|
+
let processEnv = process.env;
|
|
57
|
+
if (options && options.processEnv != null) {
|
|
58
|
+
processEnv = options.processEnv;
|
|
59
|
+
}
|
|
60
|
+
for (const key in options.parsed) {
|
|
61
|
+
let value = options.parsed[key];
|
|
62
|
+
if (processEnv[key] && processEnv[key] !== value) {
|
|
63
|
+
value = processEnv[key];
|
|
64
|
+
} else {
|
|
65
|
+
value = expandValue(value, processEnv, runningParsed);
|
|
66
|
+
}
|
|
67
|
+
options.parsed[key] = _resolveEscapeSequences(value);
|
|
68
|
+
runningParsed[key] = _resolveEscapeSequences(value);
|
|
69
|
+
}
|
|
70
|
+
for (const processKey in options.parsed) {
|
|
71
|
+
processEnv[processKey] = options.parsed[processKey];
|
|
72
|
+
}
|
|
73
|
+
return options;
|
|
74
|
+
}
|
|
75
|
+
__name(expand2, "expand");
|
|
76
|
+
module.exports.expand = expand2;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// src/local-env.ts
|
|
81
|
+
var import_dotenv_expand = __toESM(require_main());
|
|
82
|
+
function getEnvPaths(envDir, mode) {
|
|
83
|
+
if (envDir === false) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const filenames = [
|
|
87
|
+
".env",
|
|
88
|
+
".env.local",
|
|
89
|
+
...mode === void 0 ? [] : [`.env.${mode}`, `.env.${mode}.local`]
|
|
90
|
+
];
|
|
91
|
+
return filenames.map((filename) => path.resolve(envDir, filename));
|
|
92
|
+
}
|
|
93
|
+
__name(getEnvPaths, "getEnvPaths");
|
|
94
|
+
function getDevVarsCandidatePaths(envDir, mode) {
|
|
95
|
+
if (envDir === false) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
return [
|
|
99
|
+
...mode === void 0 ? [] : [`.dev.vars.${mode}`],
|
|
100
|
+
".dev.vars"
|
|
101
|
+
].map((filename) => path.resolve(envDir, filename));
|
|
102
|
+
}
|
|
103
|
+
__name(getDevVarsCandidatePaths, "getDevVarsCandidatePaths");
|
|
104
|
+
async function loadEnv(envDir, mode) {
|
|
105
|
+
if (mode === "local") {
|
|
106
|
+
throw new Error(
|
|
107
|
+
'"local" cannot be used as a mode name because it conflicts with the .local postfix for .env files.'
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
const candidateFiles = getEnvPaths(envDir, mode);
|
|
111
|
+
const parsed = {};
|
|
112
|
+
const parsedSources = {};
|
|
113
|
+
for (const candidate of candidateFiles) {
|
|
114
|
+
const loaded = await tryParseFile(candidate, parse);
|
|
115
|
+
if (loaded === void 0) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
for (const [key, value] of Object.entries(loaded.values)) {
|
|
119
|
+
parsed[key] = value;
|
|
120
|
+
parsedSources[key] = { type: "file", path: loaded.path };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const processEnv = copyProcessEnv();
|
|
124
|
+
(0, import_dotenv_expand.expand)({ parsed, processEnv: { ...processEnv } });
|
|
125
|
+
const values = { ...parsed };
|
|
126
|
+
const sources = { ...parsedSources };
|
|
127
|
+
for (const [key, value] of Object.entries(processEnv)) {
|
|
128
|
+
values[key] = value;
|
|
129
|
+
sources[key] = { type: "process" };
|
|
130
|
+
}
|
|
131
|
+
return { values, sources };
|
|
132
|
+
}
|
|
133
|
+
__name(loadEnv, "loadEnv");
|
|
134
|
+
async function loadDevVars(envDir, mode) {
|
|
135
|
+
const candidateFiles = getDevVarsCandidatePaths(envDir, mode);
|
|
136
|
+
for (const candidate of candidateFiles) {
|
|
137
|
+
const loaded = await tryParseFile(candidate, parse);
|
|
138
|
+
if (loaded === void 0) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
return loaded.values;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
__name(loadDevVars, "loadDevVars");
|
|
145
|
+
async function tryParseFile(filePath, parse) {
|
|
146
|
+
try {
|
|
147
|
+
const stat2 = await fs.stat(filePath);
|
|
148
|
+
if (!stat2.isFile() && !stat2.isFIFO()) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
path: filePath,
|
|
153
|
+
values: parse(await fs.readFile(filePath, "utf8"))
|
|
154
|
+
};
|
|
155
|
+
} catch (error) {
|
|
156
|
+
if (isMissingFileError(error)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
__name(tryParseFile, "tryParseFile");
|
|
163
|
+
function isMissingFileError(error) {
|
|
164
|
+
return error instanceof Error && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR");
|
|
165
|
+
}
|
|
166
|
+
__name(isMissingFileError, "isMissingFileError");
|
|
167
|
+
function copyProcessEnv() {
|
|
168
|
+
return Object.fromEntries(
|
|
169
|
+
Object.entries(process.env).filter(
|
|
170
|
+
(entry) => entry[1] !== void 0
|
|
171
|
+
)
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
__name(copyProcessEnv, "copyProcessEnv");
|
|
175
|
+
|
|
176
|
+
export { getDevVarsCandidatePaths, getEnvPaths, loadDevVars, loadEnv };
|
|
177
|
+
//# sourceMappingURL=local-env.mjs.map
|
|
178
|
+
//# sourceMappingURL=local-env.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/dotenv-expand@13.0.0/node_modules/dotenv-expand/lib/main.js","../src/local-env.ts"],"names":["exports","value","expand","parseDotEnv","stat"],"mappings":"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","file":"local-env.mjs","sourcesContent":["'use strict'\n\nfunction _resolveEscapeSequences (value) {\n return value.replace(/\\\\\\$/g, '$')\n}\n\nfunction expandValue (value, processEnv, runningParsed) {\n const env = { ...runningParsed, ...processEnv } // process.env wins\n\n const regex = /(?<!\\\\)\\${([^{}]+)}|(?<!\\\\)\\$([A-Za-z_][A-Za-z0-9_]*)/g\n\n let result = value\n let match\n const seen = new Set() // self-referential checker\n\n while ((match = regex.exec(result)) !== null) {\n seen.add(result)\n\n const [template, bracedExpression, unbracedExpression] = match\n const expression = bracedExpression || unbracedExpression\n\n // match the operators `:+`, `+`, `:-`, and `-`\n const opRegex = /(:\\+|\\+|:-|-)/\n // find first match\n const opMatch = expression.match(opRegex)\n const splitter = opMatch ? opMatch[0] : null\n\n const r = expression.split(splitter)\n\n let defaultValue\n let value\n\n const key = r.shift()\n\n if ([':+', '+'].includes(splitter)) {\n defaultValue = env[key] ? r.join(splitter) : ''\n value = null\n } else {\n defaultValue = r.join(splitter)\n value = env[key]\n }\n\n if (value) {\n // self-referential check\n if (seen.has(value)) {\n result = result.replace(template, defaultValue)\n } else {\n result = result.replace(template, value)\n }\n } else {\n result = result.replace(template, defaultValue)\n }\n\n // if the result equaled what was in process.env and runningParsed then stop expanding\n if (result === runningParsed[key]) {\n break\n }\n\n regex.lastIndex = 0 // reset regex search position to re-evaluate after each replacement\n }\n\n return result\n}\n\nfunction expand (options) {\n // for use with progressive expansion\n const runningParsed = {}\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n // dotenv.config() ran before this so the assumption is process.env has already been set\n for (const key in options.parsed) {\n let value = options.parsed[key]\n\n // short-circuit scenario: process.env was already set prior to the file value\n if (processEnv[key] && processEnv[key] !== value) {\n value = processEnv[key]\n } else {\n value = expandValue(value, processEnv, runningParsed)\n }\n\n options.parsed[key] = _resolveEscapeSequences(value)\n\n // for use with progressive expansion\n runningParsed[key] = _resolveEscapeSequences(value)\n }\n\n for (const processKey in options.parsed) {\n processEnv[processKey] = options.parsed[processKey]\n }\n\n return options\n}\n\nmodule.exports.expand = expand\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { parse as parseDotEnv } from \"dotenv\";\nimport { expand } from \"dotenv-expand\";\n\nexport type LocalEnvValueSource =\n\t| { type: \"file\"; path: string }\n\t| { type: \"process\" };\n\nexport interface LoadedEnv {\n\tvalues: Record<string, string>;\n\tsources: Record<string, LocalEnvValueSource>;\n}\n\ninterface ParsedFile {\n\tpath: string;\n\tvalues: Record<string, string>;\n}\n\n/**\n * Returns the local `.env` candidates in increasing precedence order.\n *\n * @param envDir The resolved environment directory. `false` disables file\n * loading, matching Vite's `envDir` convention.\n * @param mode The optional mode used for mode-specific files.\n * @returns Absolute candidate paths in load order.\n */\nexport function getEnvPaths(envDir: string | false, mode?: string): string[] {\n\tif (envDir === false) {\n\t\treturn [];\n\t}\n\n\tconst filenames = [\n\t\t\".env\",\n\t\t\".env.local\",\n\t\t...(mode === undefined ? [] : [`.env.${mode}`, `.env.${mode}.local`]),\n\t];\n\treturn filenames.map((filename) => path.resolve(envDir, filename));\n}\n\n/**\n * Returns the `.dev.vars` candidates in decreasing selection priority.\n *\n * @param envDir The resolved environment directory. `false` disables file\n * loading, matching Vite's `envDir` convention.\n * @param mode The optional mode used to select `.dev.vars.<mode>`.\n * @returns Absolute candidate paths in selection order.\n */\nexport function getDevVarsCandidatePaths(\n\tenvDir: string | false,\n\tmode?: string\n): string[] {\n\tif (envDir === false) {\n\t\treturn [];\n\t}\n\n\treturn [\n\t\t...(mode === undefined ? [] : [`.dev.vars.${mode}`]),\n\t\t\".dev.vars\",\n\t].map((filename) => path.resolve(envDir, filename));\n}\n\n/**\n * Loads local `.env` files using Vite-compatible file precedence and\n * Wrangler-compatible parsing and expansion.\n *\n * Expansion is progressive: references can use process values and values\n * declared earlier in the merged environment, but not values declared later.\n * Loading has no process-global side effects.\n *\n * @param envDir The resolved environment directory. `false` disables file\n * loading, matching Vite's `envDir` convention.\n * @param mode The optional mode used for mode-specific files.\n * @returns Resolved values and metadata describing their sources.\n */\nexport async function loadEnv(\n\tenvDir: string | false,\n\tmode?: string\n): Promise<LoadedEnv> {\n\tif (mode === \"local\") {\n\t\tthrow new Error(\n\t\t\t'\"local\" cannot be used as a mode name because it conflicts with the .local postfix for .env files.'\n\t\t);\n\t}\n\n\tconst candidateFiles = getEnvPaths(envDir, mode);\n\tconst parsed: Record<string, string> = {};\n\tconst parsedSources: Record<string, LocalEnvValueSource> = {};\n\n\tfor (const candidate of candidateFiles) {\n\t\tconst loaded = await tryParseFile(candidate, parseDotEnv);\n\t\tif (loaded === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const [key, value] of Object.entries(loaded.values)) {\n\t\t\tparsed[key] = value;\n\t\t\tparsedSources[key] = { type: \"file\", path: loaded.path };\n\t\t}\n\t}\n\n\tconst processEnv = copyProcessEnv();\n\texpand({ parsed, processEnv: { ...processEnv } });\n\n\tconst values = { ...parsed };\n\tconst sources = { ...parsedSources };\n\n\tfor (const [key, value] of Object.entries(processEnv)) {\n\t\tvalues[key] = value;\n\t\tsources[key] = { type: \"process\" };\n\t}\n\n\treturn { values, sources };\n}\n\n/**\n * Loads the first existing `.dev.vars` candidate without merging it with other\n * files or process-environment values.\n *\n * @param envDir The resolved environment directory. `false` disables file\n * loading, matching Vite's `envDir` convention.\n * @param mode The optional mode used to select `.dev.vars.<mode>`.\n * @returns The selected `.dev.vars` values, or `undefined` when no candidate exists.\n */\nexport async function loadDevVars(\n\tenvDir: string | false,\n\tmode?: string\n): Promise<Record<string, string> | undefined> {\n\tconst candidateFiles = getDevVarsCandidatePaths(envDir, mode);\n\tfor (const candidate of candidateFiles) {\n\t\tconst loaded = await tryParseFile(candidate, parseDotEnv);\n\t\tif (loaded === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn loaded.values;\n\t}\n}\n\nasync function tryParseFile(\n\tfilePath: string,\n\tparse: (contents: string) => Record<string, string>\n): Promise<ParsedFile | undefined> {\n\ttry {\n\t\tconst stat = await fs.stat(filePath);\n\t\tif (!stat.isFile() && !stat.isFIFO()) {\n\t\t\treturn;\n\t\t}\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\tvalues: parse(await fs.readFile(filePath, \"utf8\")),\n\t\t};\n\t} catch (error) {\n\t\tif (isMissingFileError(error)) {\n\t\t\treturn;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\t\"code\" in error &&\n\t\t(error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n\t);\n}\n\nfunction copyProcessEnv(): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries(process.env).filter(\n\t\t\t(entry): entry is [string, string] => entry[1] !== undefined\n\t\t)\n\t);\n}\n"]}
|