bini-env 1.0.7 → 1.0.8
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/dist/index.d.mts +4 -18
- package/dist/index.d.ts +4 -18
- package/dist/index.js +92 -42
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +92 -43
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,37 +1,23 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
2
|
export { Plugin } from 'vite';
|
|
3
3
|
|
|
4
|
+
declare function suppressDotenvLogsGlobally(): void;
|
|
4
5
|
interface BiniEnvPluginOptions {
|
|
5
6
|
readonly enabled?: boolean;
|
|
6
7
|
readonly clearViteHeader?: boolean;
|
|
7
8
|
readonly logo?: string;
|
|
8
9
|
readonly envPrefix?: string | string[];
|
|
10
|
+
readonly loadInPreview?: boolean;
|
|
11
|
+
readonly suppressDotenvLogs?: boolean;
|
|
9
12
|
}
|
|
10
13
|
interface DetectedEnvFile {
|
|
11
14
|
readonly name: string;
|
|
12
15
|
readonly path: string;
|
|
13
16
|
}
|
|
14
|
-
/**
|
|
15
|
-
* Read an environment variable with caching for performance.
|
|
16
|
-
* Cache is cleared on module reload in development only.
|
|
17
|
-
*/
|
|
18
17
|
declare function getEnv(key: string): string | undefined;
|
|
19
|
-
/**
|
|
20
|
-
* Optimized requireEnv with cached error messages
|
|
21
|
-
*/
|
|
22
18
|
declare function requireEnv(key: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* Load .env file with memoization and race condition prevention
|
|
25
|
-
*/
|
|
26
19
|
declare function loadEnv(projectRoot?: string): Promise<void>;
|
|
27
20
|
declare function detectEnvFiles(projectRoot?: string): DetectedEnvFile[];
|
|
28
|
-
/**
|
|
29
|
-
* Production-ready Vite plugin with performance optimizations:
|
|
30
|
-
* - Lazy loading
|
|
31
|
-
* - Caching
|
|
32
|
-
* - Minimal bundle impact
|
|
33
|
-
* - No runtime overhead in production
|
|
34
|
-
*/
|
|
35
21
|
declare function biniEnv(options?: Readonly<BiniEnvPluginOptions>): Plugin;
|
|
36
22
|
|
|
37
|
-
export { type BiniEnvPluginOptions, type DetectedEnvFile, biniEnv, detectEnvFiles, getEnv, loadEnv, requireEnv };
|
|
23
|
+
export { type BiniEnvPluginOptions, type DetectedEnvFile, biniEnv, detectEnvFiles, getEnv, loadEnv, requireEnv, suppressDotenvLogsGlobally };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,37 +1,23 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
2
|
export { Plugin } from 'vite';
|
|
3
3
|
|
|
4
|
+
declare function suppressDotenvLogsGlobally(): void;
|
|
4
5
|
interface BiniEnvPluginOptions {
|
|
5
6
|
readonly enabled?: boolean;
|
|
6
7
|
readonly clearViteHeader?: boolean;
|
|
7
8
|
readonly logo?: string;
|
|
8
9
|
readonly envPrefix?: string | string[];
|
|
10
|
+
readonly loadInPreview?: boolean;
|
|
11
|
+
readonly suppressDotenvLogs?: boolean;
|
|
9
12
|
}
|
|
10
13
|
interface DetectedEnvFile {
|
|
11
14
|
readonly name: string;
|
|
12
15
|
readonly path: string;
|
|
13
16
|
}
|
|
14
|
-
/**
|
|
15
|
-
* Read an environment variable with caching for performance.
|
|
16
|
-
* Cache is cleared on module reload in development only.
|
|
17
|
-
*/
|
|
18
17
|
declare function getEnv(key: string): string | undefined;
|
|
19
|
-
/**
|
|
20
|
-
* Optimized requireEnv with cached error messages
|
|
21
|
-
*/
|
|
22
18
|
declare function requireEnv(key: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* Load .env file with memoization and race condition prevention
|
|
25
|
-
*/
|
|
26
19
|
declare function loadEnv(projectRoot?: string): Promise<void>;
|
|
27
20
|
declare function detectEnvFiles(projectRoot?: string): DetectedEnvFile[];
|
|
28
|
-
/**
|
|
29
|
-
* Production-ready Vite plugin with performance optimizations:
|
|
30
|
-
* - Lazy loading
|
|
31
|
-
* - Caching
|
|
32
|
-
* - Minimal bundle impact
|
|
33
|
-
* - No runtime overhead in production
|
|
34
|
-
*/
|
|
35
21
|
declare function biniEnv(options?: Readonly<BiniEnvPluginOptions>): Plugin;
|
|
36
22
|
|
|
37
|
-
export { type BiniEnvPluginOptions, type DetectedEnvFile, biniEnv, detectEnvFiles, getEnv, loadEnv, requireEnv };
|
|
23
|
+
export { type BiniEnvPluginOptions, type DetectedEnvFile, biniEnv, detectEnvFiles, getEnv, loadEnv, requireEnv, suppressDotenvLogsGlobally };
|
package/dist/index.js
CHANGED
|
@@ -9,15 +9,44 @@ var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
|
9
9
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
10
10
|
|
|
11
11
|
// src/index.ts
|
|
12
|
+
if (typeof process !== "undefined" && process.env && !process.env.NODE_ENV) {
|
|
13
|
+
process.env.NODE_ENV = "production";
|
|
14
|
+
}
|
|
15
|
+
function suppressDotenvLogsGlobally() {
|
|
16
|
+
if (typeof process !== "undefined" && process.env) {
|
|
17
|
+
process.env.DOTENV_QUIET = "true";
|
|
18
|
+
}
|
|
19
|
+
const originalLog = console.log;
|
|
20
|
+
console.log = (...args) => {
|
|
21
|
+
const message = args.join(" ");
|
|
22
|
+
if (message.includes("[dotenv@") && message.includes("injecting env")) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
originalLog(...args);
|
|
26
|
+
};
|
|
27
|
+
const originalError = console.error;
|
|
28
|
+
console.error = (...args) => {
|
|
29
|
+
const message = args.join(" ");
|
|
30
|
+
if (message.includes("[dotenv@") && message.includes("injecting env")) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
originalError(...args);
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
suppressDotenvLogsGlobally();
|
|
12
37
|
var BINI_LOGO = "\xDF";
|
|
13
38
|
var DEFAULT_ENV_PREFIX = ["BINI_", "VITE_"];
|
|
14
39
|
var DEFAULT_OPTIONS = Object.freeze({
|
|
15
40
|
enabled: true,
|
|
16
41
|
clearViteHeader: true,
|
|
17
42
|
logo: BINI_LOGO,
|
|
18
|
-
envPrefix: DEFAULT_ENV_PREFIX
|
|
43
|
+
envPrefix: DEFAULT_ENV_PREFIX,
|
|
44
|
+
loadInPreview: true,
|
|
45
|
+
suppressDotenvLogs: true
|
|
19
46
|
});
|
|
20
47
|
var envCache = /* @__PURE__ */ new Map();
|
|
48
|
+
var originalConsoleLog = console.log;
|
|
49
|
+
var originalConsoleError = console.error;
|
|
21
50
|
function getEnv(key) {
|
|
22
51
|
if (envCache.has(key)) {
|
|
23
52
|
return envCache.get(key);
|
|
@@ -67,10 +96,11 @@ function getEnv(key) {
|
|
|
67
96
|
function requireEnv(key) {
|
|
68
97
|
const val = getEnv(key);
|
|
69
98
|
if (!val) {
|
|
70
|
-
|
|
99
|
+
throw new Error(
|
|
100
|
+
`[bini-env] Missing required environment variable: "${key}".
|
|
71
101
|
\u2192 In development: add it to your .env file.
|
|
72
|
-
\u2192 In production: add it to your hosting dashboard environment variables
|
|
73
|
-
|
|
102
|
+
\u2192 In production: add it to your hosting dashboard environment variables.`
|
|
103
|
+
);
|
|
74
104
|
}
|
|
75
105
|
return val;
|
|
76
106
|
}
|
|
@@ -78,9 +108,7 @@ var _envLoaded = false;
|
|
|
78
108
|
var _loadPromise = null;
|
|
79
109
|
async function loadEnv(projectRoot) {
|
|
80
110
|
if (_envLoaded) return;
|
|
81
|
-
if (_loadPromise)
|
|
82
|
-
return _loadPromise;
|
|
83
|
-
}
|
|
111
|
+
if (_loadPromise) return _loadPromise;
|
|
84
112
|
_loadPromise = (async () => {
|
|
85
113
|
try {
|
|
86
114
|
if (globalThis.Deno) {
|
|
@@ -91,22 +119,32 @@ async function loadEnv(projectRoot) {
|
|
|
91
119
|
_envLoaded = true;
|
|
92
120
|
return;
|
|
93
121
|
}
|
|
94
|
-
if (process.env.NODE_ENV === "production") {
|
|
95
|
-
_envLoaded = true;
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
122
|
const root = projectRoot ?? process.cwd();
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
123
|
+
const envFiles = [
|
|
124
|
+
".env",
|
|
125
|
+
`.env.${process.env.NODE_ENV}`,
|
|
126
|
+
`.env.${process.env.NODE_ENV}.local`,
|
|
127
|
+
".env.local"
|
|
128
|
+
];
|
|
129
|
+
suppressDotenvLogsGlobally();
|
|
106
130
|
const dotenv = await import('dotenv');
|
|
107
|
-
|
|
131
|
+
for (const envFile of envFiles) {
|
|
132
|
+
const envPath = path__default.default.join(root, envFile);
|
|
133
|
+
try {
|
|
134
|
+
await fs__default.default.promises.access(envPath, fs__default.default.constants.R_OK);
|
|
135
|
+
dotenv.config({
|
|
136
|
+
path: envPath,
|
|
137
|
+
override: true,
|
|
138
|
+
quiet: true
|
|
139
|
+
});
|
|
140
|
+
} catch {
|
|
141
|
+
}
|
|
142
|
+
}
|
|
108
143
|
envCache.clear();
|
|
109
|
-
} catch {
|
|
144
|
+
} catch (error) {
|
|
145
|
+
if (process.env.NODE_ENV !== "production") {
|
|
146
|
+
originalConsoleError("[bini-env] Warning: Failed to load .env file:", error);
|
|
147
|
+
}
|
|
110
148
|
} finally {
|
|
111
149
|
_envLoaded = true;
|
|
112
150
|
_loadPromise = null;
|
|
@@ -120,7 +158,7 @@ function detectEnvFiles(projectRoot = process.cwd()) {
|
|
|
120
158
|
if (_envFilesCache && _cachedRoot === projectRoot) {
|
|
121
159
|
return _envFilesCache;
|
|
122
160
|
}
|
|
123
|
-
const nodeEnv = process.env.NODE_ENV ?? "
|
|
161
|
+
const nodeEnv = process.env.NODE_ENV ?? "production";
|
|
124
162
|
const candidates = [
|
|
125
163
|
".env.local",
|
|
126
164
|
`.env.${nodeEnv}.local`,
|
|
@@ -149,32 +187,34 @@ function clearLine() {
|
|
|
149
187
|
function printResolvedUrls(urls) {
|
|
150
188
|
if (!urls) return;
|
|
151
189
|
if (urls.local.length > 0) {
|
|
152
|
-
|
|
190
|
+
originalConsoleLog(
|
|
191
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Local: ${"\x1B[36m" /* CYAN */}${urls.local[0]}${"\x1B[0m" /* RESET */}`
|
|
192
|
+
);
|
|
153
193
|
}
|
|
154
194
|
if (urls.network.length > 0) {
|
|
155
|
-
|
|
195
|
+
originalConsoleLog(
|
|
196
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Network: ${"\x1B[36m" /* CYAN */}${urls.network[0]}${"\x1B[0m" /* RESET */}`
|
|
197
|
+
);
|
|
156
198
|
}
|
|
157
199
|
}
|
|
158
200
|
function biniEnv(options = {}) {
|
|
159
201
|
if (options.enabled === false) {
|
|
160
|
-
return {
|
|
161
|
-
name: "vite-plugin-bini-env"
|
|
162
|
-
// Minimal plugin that does nothing
|
|
163
|
-
};
|
|
202
|
+
return { name: "vite-plugin-bini-env" };
|
|
164
203
|
}
|
|
165
204
|
const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
166
|
-
const { clearViteHeader, logo, envPrefix } = resolvedOptions;
|
|
205
|
+
const { clearViteHeader, logo, envPrefix, loadInPreview, suppressDotenvLogs } = resolvedOptions;
|
|
167
206
|
let resolvedConfig;
|
|
207
|
+
if (suppressDotenvLogs && typeof process !== "undefined") {
|
|
208
|
+
suppressDotenvLogsGlobally();
|
|
209
|
+
}
|
|
168
210
|
return {
|
|
169
211
|
name: "vite-plugin-bini-env",
|
|
170
|
-
// Optimized config merge
|
|
171
212
|
config() {
|
|
172
213
|
return { envPrefix };
|
|
173
214
|
},
|
|
174
215
|
configResolved(cfg) {
|
|
175
216
|
resolvedConfig = cfg;
|
|
176
217
|
},
|
|
177
|
-
// Optimized server configuration with lazy loading
|
|
178
218
|
configureServer(server) {
|
|
179
219
|
const loadEnvTask = () => {
|
|
180
220
|
void loadEnv(resolvedConfig?.root ?? process.cwd());
|
|
@@ -191,14 +231,13 @@ function biniEnv(options = {}) {
|
|
|
191
231
|
if (serverStarted) return;
|
|
192
232
|
serverStarted = true;
|
|
193
233
|
if (clearViteHeader) clearLine();
|
|
194
|
-
|
|
234
|
+
originalConsoleLog(`
|
|
195
235
|
${"\x1B[36m" /* CYAN */}${logo} Bini.js${"\x1B[0m" /* RESET */} (dev)`);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
236
|
+
const found = detectEnvFiles(resolvedConfig?.root);
|
|
237
|
+
if (found.length > 0) {
|
|
238
|
+
originalConsoleLog(
|
|
239
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Environments: ${found.map((f) => f.name).join(", ")}`
|
|
240
|
+
);
|
|
202
241
|
}
|
|
203
242
|
if (!clearViteHeader) {
|
|
204
243
|
originalPrintUrls();
|
|
@@ -208,8 +247,17 @@ function biniEnv(options = {}) {
|
|
|
208
247
|
};
|
|
209
248
|
}
|
|
210
249
|
},
|
|
211
|
-
// Preview server with same optimizations
|
|
212
250
|
configurePreviewServer(server) {
|
|
251
|
+
if (loadInPreview) {
|
|
252
|
+
const loadEnvTask = () => {
|
|
253
|
+
void loadEnv(resolvedConfig?.root ?? process.cwd());
|
|
254
|
+
};
|
|
255
|
+
if (server.httpServer) {
|
|
256
|
+
server.httpServer.once("listening", loadEnvTask);
|
|
257
|
+
} else {
|
|
258
|
+
setImmediate(loadEnvTask);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
213
261
|
let previewStarted = false;
|
|
214
262
|
const originalPrintUrls = server.printUrls.bind(server);
|
|
215
263
|
if (clearViteHeader || logo !== BINI_LOGO) {
|
|
@@ -217,13 +265,14 @@ function biniEnv(options = {}) {
|
|
|
217
265
|
if (previewStarted) return;
|
|
218
266
|
previewStarted = true;
|
|
219
267
|
if (clearViteHeader) clearLine();
|
|
220
|
-
|
|
268
|
+
originalConsoleLog(`
|
|
221
269
|
${"\x1B[36m" /* CYAN */}${logo} Bini.js${"\x1B[0m" /* RESET */} (preview)`);
|
|
222
|
-
if (
|
|
270
|
+
if (loadInPreview) {
|
|
223
271
|
const found = detectEnvFiles(resolvedConfig?.root);
|
|
224
272
|
if (found.length > 0) {
|
|
225
|
-
|
|
226
|
-
|
|
273
|
+
originalConsoleLog(
|
|
274
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Environments: ${found.map((f) => f.name).join(", ")}`
|
|
275
|
+
);
|
|
227
276
|
}
|
|
228
277
|
}
|
|
229
278
|
if (!clearViteHeader) {
|
|
@@ -242,5 +291,6 @@ exports.detectEnvFiles = detectEnvFiles;
|
|
|
242
291
|
exports.getEnv = getEnv;
|
|
243
292
|
exports.loadEnv = loadEnv;
|
|
244
293
|
exports.requireEnv = requireEnv;
|
|
294
|
+
exports.suppressDotenvLogsGlobally = suppressDotenvLogsGlobally;
|
|
245
295
|
//# sourceMappingURL=index.js.map
|
|
246
296
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["path","fs"],"mappings":"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","file":"index.js","sourcesContent":["// src/index.ts\nimport fs from 'fs';\nimport path from 'path';\nimport type { Plugin, ResolvedConfig, UserConfig } from 'vite';\n\n/* ==========================================================================\n Global type declarations for cross-runtime compatibility\n ========================================================================== */\n\ninterface DenoEnv {\n get(key: string): string | undefined;\n toObject(): Record<string, string>;\n}\ninterface DenoNamespace {\n env: DenoEnv;\n}\n\n/// <reference types=\"vite/client\" />\n\n/* ==========================================================================\n Types\n ========================================================================== */\n\nexport interface BiniEnvPluginOptions {\n readonly enabled?: boolean;\n readonly clearViteHeader?: boolean;\n readonly logo?: string;\n readonly envPrefix?: string | string[];\n}\n\nexport interface DetectedEnvFile {\n readonly name: string;\n readonly path: string;\n}\n\n/* ==========================================================================\n Constants - Optimized with Object.freeze for immutability\n ========================================================================== */\n\nconst BINI_LOGO = 'ß';\nconst DEFAULT_ENV_PREFIX: string[] = ['BINI_', 'VITE_'];\n\nconst DEFAULT_OPTIONS: Required<BiniEnvPluginOptions> = Object.freeze({\n enabled: true,\n clearViteHeader: true,\n logo: BINI_LOGO,\n envPrefix: DEFAULT_ENV_PREFIX,\n});\n\n// ANSI color codes - using const enum for better performance\nconst enum COLORS {\n CYAN = '\\x1b[36m',\n RESET = '\\x1b[0m',\n GREEN = '\\x1b[32m',\n}\n\n// Cache for environment variables to avoid repeated lookups\nconst envCache = new Map<string, string | undefined>();\n\n/* ==========================================================================\n Optimized getEnv with caching\n ========================================================================== */\n\n/**\n * Read an environment variable with caching for performance.\n * Cache is cleared on module reload in development only.\n */\nexport function getEnv(key: string): string | undefined {\n // Check cache first for frequent access patterns\n if (envCache.has(key)) {\n return envCache.get(key);\n }\n\n let value: string | undefined;\n\n // 1. Deno runtime (edge functions)\n const deno = (globalThis as unknown as { Deno?: DenoNamespace }).Deno;\n if (deno) {\n try {\n value = deno.env.get(key);\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n } catch {\n // Silently fall through\n }\n }\n\n // 2. Node.js / Bun runtime\n if (typeof process !== 'undefined' && process.env) {\n value = process.env[key];\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n }\n\n // 3. Vite client environment (with prefix fallback)\n try {\n const metaEnv = import.meta.env as Record<string, string | undefined> | undefined;\n if (metaEnv) {\n // Direct match\n if (metaEnv[key] !== undefined) {\n envCache.set(key, metaEnv[key]);\n return metaEnv[key];\n }\n \n // Try BINI_ prefix\n const biniKey = `BINI_${key}`;\n if (metaEnv[biniKey] !== undefined) {\n envCache.set(key, metaEnv[biniKey]);\n return metaEnv[biniKey];\n }\n \n // Try VITE_ prefix\n const viteKey = `VITE_${key}`;\n if (metaEnv[viteKey] !== undefined) {\n envCache.set(key, metaEnv[viteKey]);\n return metaEnv[viteKey];\n }\n }\n } catch {\n // import.meta.env not available\n }\n\n // Cache undefined to prevent repeated lookups\n envCache.set(key, undefined);\n return undefined;\n}\n\n/**\n * Optimized requireEnv with cached error messages\n */\nexport function requireEnv(key: string): string {\n const val = getEnv(key);\n if (!val) {\n // Create error message once\n const errorMsg = `[bini-env] Missing required environment variable: \"${key}\".\\n` +\n ` → In development: add it to your .env file.\\n` +\n ` → In production: add it to your hosting dashboard environment variables.`;\n throw new Error(errorMsg);\n }\n return val;\n}\n\n/* ==========================================================================\n Optimized loadEnv with production checks\n ========================================================================== */\n\nlet _envLoaded = false;\nlet _loadPromise: Promise<void> | null = null;\n\n/**\n * Load .env file with memoization and race condition prevention\n */\nexport async function loadEnv(projectRoot?: string): Promise<void> {\n // Fast path: already loaded\n if (_envLoaded) return;\n \n // Prevent concurrent loads\n if (_loadPromise) {\n return _loadPromise;\n }\n\n _loadPromise = (async () => {\n try {\n // Deno runtime check - fast path\n if ((globalThis as unknown as { Deno?: DenoNamespace }).Deno) {\n _envLoaded = true;\n return;\n }\n\n // Node.js runtime check\n if (typeof process === 'undefined' || !process.env) {\n _envLoaded = true;\n return;\n }\n\n // Production optimization - skip file system operations entirely\n if (process.env.NODE_ENV === 'production') {\n _envLoaded = true;\n return;\n }\n\n const root = projectRoot ?? process.cwd();\n const envPath = path.join(root, '.env');\n\n // Check file existence with fs.promises for better performance\n try {\n await fs.promises.access(envPath, fs.constants.R_OK);\n } catch {\n _envLoaded = true;\n return;\n }\n\n // Dynamic import with caching\n const dotenv = await import('dotenv');\n dotenv.config({ path: envPath });\n \n // Clear cache after loading new env vars\n envCache.clear();\n } catch {\n // Silent fail - requireEnv will handle missing vars\n } finally {\n _envLoaded = true;\n _loadPromise = null;\n }\n })();\n\n return _loadPromise;\n}\n\n/* ==========================================================================\n Optimized detectEnvFiles with caching\n ========================================================================== */\n\nlet _envFilesCache: DetectedEnvFile[] | null = null;\nlet _cachedRoot: string = '';\n\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\n // Cache results for the same root directory\n if (_envFilesCache && _cachedRoot === projectRoot) {\n return _envFilesCache;\n }\n\n const nodeEnv = process.env.NODE_ENV ?? 'development';\n const candidates = [\n '.env.local',\n `.env.${nodeEnv}.local`,\n `.env.${nodeEnv}`,\n '.env',\n ];\n\n const found: DetectedEnvFile[] = [];\n\n // Use for...of with early break if needed\n for (const file of candidates) {\n const filePath = path.join(projectRoot, file);\n try {\n if (fs.existsSync(filePath)) {\n found.push({ name: file, path: filePath });\n }\n } catch {\n // Skip files that can't be accessed\n }\n }\n\n // Cache the result\n _envFilesCache = found;\n _cachedRoot = projectRoot;\n \n return found;\n}\n\n/* ==========================================================================\n Optimized Vite plugin with minimal overhead\n ========================================================================== */\n\nfunction clearLine(): void {\n // Only write if stdout is a TTY (performance optimization)\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[2K\\r');\n }\n}\n\nfunction printResolvedUrls(urls: { local: string[]; network: string[] } | null | undefined): void {\n if (!urls) return;\n if (urls.local.length > 0) {\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\n }\n if (urls.network.length > 0) {\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\n }\n}\n\n/**\n * Production-ready Vite plugin with performance optimizations:\n * - Lazy loading\n * - Caching\n * - Minimal bundle impact\n * - No runtime overhead in production\n */\nexport function biniEnv(options: Readonly<BiniEnvPluginOptions> = {}): Plugin {\n // Fast path: disabled plugin returns no-op\n if (options.enabled === false) {\n return {\n name: 'vite-plugin-bini-env',\n // Minimal plugin that does nothing\n };\n }\n\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const { clearViteHeader, logo, envPrefix } = resolvedOptions;\n\n let resolvedConfig: ResolvedConfig;\n\n return {\n name: 'vite-plugin-bini-env',\n \n // Optimized config merge\n config(): UserConfig {\n return { envPrefix };\n },\n\n configResolved(cfg: ResolvedConfig) {\n resolvedConfig = cfg;\n },\n\n // Optimized server configuration with lazy loading\n configureServer(server) {\n // Defer env loading to avoid blocking server start\n const loadEnvTask = () => {\n void loadEnv(resolvedConfig?.root ?? process.cwd());\n };\n\n if (server.httpServer) {\n server.httpServer.once('listening', loadEnvTask);\n } else {\n // Use setImmediate for non-blocking execution\n setImmediate(loadEnvTask);\n }\n\n let serverStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n // Only override printUrls if needed\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (serverStarted) return;\n serverStarted = true;\n\n if (clearViteHeader) clearLine();\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);\n\n // Only detect env files in development\n if (process.env.NODE_ENV !== 'production') {\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n const envString = found.map((f) => f.name).join(', ');\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\n }\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n\n // Preview server with same optimizations\n configurePreviewServer(server) {\n let previewStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (previewStarted) return;\n previewStarted = true;\n\n if (clearViteHeader) clearLine();\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\n\n if (process.env.NODE_ENV !== 'production') {\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n const envString = found.map((f) => f.name).join(', ');\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\n }\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n };\n}\n\nexport type { Plugin } from 'vite';"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["path","fs"],"mappings":"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","file":"index.js","sourcesContent":["// bini-env/src/index.ts\nimport fs from 'fs';\nimport path from 'path';\nimport type { Plugin, ResolvedConfig, UserConfig } from 'vite';\n\n/* ==========================================================================\n Default NODE_ENV — must run before anything else\n ========================================================================== */\n\nif (typeof process !== 'undefined' && process.env && !process.env.NODE_ENV) {\n process.env.NODE_ENV = 'production';\n}\n\n/* ==========================================================================\n IMMEDIATE DOTENV SUPPRESSION - Runs at module load\n ========================================================================== */\n\nexport function suppressDotenvLogsGlobally(): void {\n if (typeof process !== 'undefined' && process.env) {\n process.env.DOTENV_QUIET = 'true';\n }\n\n const originalLog = console.log;\n console.log = (...args: any[]) => {\n const message = args.join(' ');\n if (message.includes('[dotenv@') && message.includes('injecting env')) {\n return;\n }\n originalLog(...args);\n };\n\n const originalError = console.error;\n console.error = (...args: any[]) => {\n const message = args.join(' ');\n if (message.includes('[dotenv@') && message.includes('injecting env')) {\n return;\n }\n originalError(...args);\n };\n}\n\n// Run suppression immediately when module loads\nsuppressDotenvLogsGlobally();\n\n/* ==========================================================================\n Global type declarations for cross-runtime compatibility\n ========================================================================== */\n\ninterface DenoEnv {\n get(key: string): string | undefined;\n toObject(): Record<string, string>;\n}\ninterface DenoNamespace {\n env: DenoEnv;\n}\n\n/// <reference types=\"vite/client\" />\n\n/* ==========================================================================\n Types\n ========================================================================== */\n\nexport interface BiniEnvPluginOptions {\n readonly enabled?: boolean;\n readonly clearViteHeader?: boolean;\n readonly logo?: string;\n readonly envPrefix?: string | string[];\n readonly loadInPreview?: boolean;\n readonly suppressDotenvLogs?: boolean;\n}\n\nexport interface DetectedEnvFile {\n readonly name: string;\n readonly path: string;\n}\n\n/* ==========================================================================\n Constants\n ========================================================================== */\n\nconst BINI_LOGO = 'ß';\nconst DEFAULT_ENV_PREFIX: string[] = ['BINI_', 'VITE_'];\n\nconst DEFAULT_OPTIONS: Required<BiniEnvPluginOptions> = Object.freeze({\n enabled: true,\n clearViteHeader: true,\n logo: BINI_LOGO,\n envPrefix: DEFAULT_ENV_PREFIX,\n loadInPreview: true,\n suppressDotenvLogs: true,\n});\n\nconst enum COLORS {\n CYAN = '\\x1b[36m',\n RESET = '\\x1b[0m',\n GREEN = '\\x1b[32m',\n}\n\nconst envCache = new Map<string, string | undefined>();\n\n// Store original console functions before any patching\nconst originalConsoleLog = console.log;\nconst originalConsoleError = console.error;\n\n/* ==========================================================================\n getEnv\n ========================================================================== */\n\nexport function getEnv(key: string): string | undefined {\n if (envCache.has(key)) {\n return envCache.get(key);\n }\n\n let value: string | undefined;\n\n // 1. Deno runtime\n const deno = (globalThis as unknown as { Deno?: DenoNamespace }).Deno;\n if (deno) {\n try {\n value = deno.env.get(key);\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n } catch {\n // fall through\n }\n }\n\n // 2. Node.js / Bun\n if (typeof process !== 'undefined' && process.env) {\n value = process.env[key];\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n }\n\n // 3. Vite client (import.meta.env)\n try {\n const metaEnv = import.meta.env as Record<string, string | undefined> | undefined;\n if (metaEnv) {\n if (metaEnv[key] !== undefined) {\n envCache.set(key, metaEnv[key]);\n return metaEnv[key];\n }\n const biniKey = `BINI_${key}`;\n if (metaEnv[biniKey] !== undefined) {\n envCache.set(key, metaEnv[biniKey]);\n return metaEnv[biniKey];\n }\n const viteKey = `VITE_${key}`;\n if (metaEnv[viteKey] !== undefined) {\n envCache.set(key, metaEnv[viteKey]);\n return metaEnv[viteKey];\n }\n }\n } catch {\n // import.meta.env not available\n }\n\n envCache.set(key, undefined);\n return undefined;\n}\n\n/* ==========================================================================\n requireEnv\n ========================================================================== */\n\nexport function requireEnv(key: string): string {\n const val = getEnv(key);\n if (!val) {\n throw new Error(\n `[bini-env] Missing required environment variable: \"${key}\".\\n` +\n ` → In development: add it to your .env file.\\n` +\n ` → In production: add it to your hosting dashboard environment variables.`,\n );\n }\n return val;\n}\n\n/* ==========================================================================\n loadEnv\n ========================================================================== */\n\nlet _envLoaded = false;\nlet _loadPromise: Promise<void> | null = null;\n\nexport async function loadEnv(projectRoot?: string): Promise<void> {\n if (_envLoaded) return;\n if (_loadPromise) return _loadPromise;\n\n _loadPromise = (async () => {\n try {\n // Deno — env is already available via Deno.env\n if ((globalThis as unknown as { Deno?: DenoNamespace }).Deno) {\n _envLoaded = true;\n return;\n }\n\n if (typeof process === 'undefined' || !process.env) {\n _envLoaded = true;\n return;\n }\n\n const root = projectRoot ?? process.cwd();\n\n // Load order: lowest → highest priority\n const envFiles = [\n '.env',\n `.env.${process.env.NODE_ENV}`,\n `.env.${process.env.NODE_ENV}.local`,\n '.env.local',\n ];\n\n suppressDotenvLogsGlobally();\n\n const dotenv = await import('dotenv');\n\n for (const envFile of envFiles) {\n const envPath = path.join(root, envFile);\n try {\n await fs.promises.access(envPath, fs.constants.R_OK);\n dotenv.config({\n path : envPath,\n override: true,\n quiet : true,\n } as Parameters<typeof dotenv.config>[0]);\n } catch {\n // file doesn't exist — skip\n }\n }\n\n // Clear cache so newly loaded vars are picked up\n envCache.clear();\n\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n originalConsoleError('[bini-env] Warning: Failed to load .env file:', error);\n }\n } finally {\n _envLoaded = true;\n _loadPromise = null;\n }\n })();\n\n return _loadPromise;\n}\n\n/* ==========================================================================\n detectEnvFiles\n ========================================================================== */\n\nlet _envFilesCache: DetectedEnvFile[] | null = null;\nlet _cachedRoot = '';\n\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\n if (_envFilesCache && _cachedRoot === projectRoot) {\n return _envFilesCache;\n }\n\n const nodeEnv = process.env.NODE_ENV ?? 'production';\n const candidates = [\n '.env.local',\n `.env.${nodeEnv}.local`,\n `.env.${nodeEnv}`,\n '.env',\n ];\n\n const found: DetectedEnvFile[] = [];\n\n for (const file of candidates) {\n const filePath = path.join(projectRoot, file);\n try {\n if (fs.existsSync(filePath)) {\n found.push({ name: file, path: filePath });\n }\n } catch {\n // skip\n }\n }\n\n _envFilesCache = found;\n _cachedRoot = projectRoot;\n\n return found;\n}\n\n/* ==========================================================================\n Vite plugin\n ========================================================================== */\n\nfunction clearLine(): void {\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[2K\\r');\n }\n}\n\nfunction printResolvedUrls(\n urls: { local: string[]; network: string[] } | null | undefined,\n): void {\n if (!urls) return;\n if (urls.local.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`,\n );\n }\n if (urls.network.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`,\n );\n }\n}\n\nexport function biniEnv(options: Readonly<BiniEnvPluginOptions> = {}): Plugin {\n if (options.enabled === false) {\n return { name: 'vite-plugin-bini-env' };\n }\n\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const { clearViteHeader, logo, envPrefix, loadInPreview, suppressDotenvLogs } = resolvedOptions;\n\n let resolvedConfig: ResolvedConfig;\n\n if (suppressDotenvLogs && typeof process !== 'undefined') {\n suppressDotenvLogsGlobally();\n }\n\n return {\n name: 'vite-plugin-bini-env',\n\n config(): UserConfig {\n return { envPrefix };\n },\n\n configResolved(cfg: ResolvedConfig) {\n resolvedConfig = cfg;\n },\n\n configureServer(server) {\n const loadEnvTask = () => {\n void loadEnv(resolvedConfig?.root ?? process.cwd());\n };\n\n if (server.httpServer) {\n server.httpServer.once('listening', loadEnvTask);\n } else {\n setImmediate(loadEnvTask);\n }\n\n let serverStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (serverStarted) return;\n serverStarted = true;\n\n if (clearViteHeader) clearLine();\n originalConsoleLog(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);\n\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${found.map(f => f.name).join(', ')}`,\n );\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n\n configurePreviewServer(server) {\n if (loadInPreview) {\n const loadEnvTask = () => {\n void loadEnv(resolvedConfig?.root ?? process.cwd());\n };\n\n if (server.httpServer) {\n server.httpServer.once('listening', loadEnvTask);\n } else {\n setImmediate(loadEnvTask);\n }\n }\n\n let previewStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (previewStarted) return;\n previewStarted = true;\n\n if (clearViteHeader) clearLine();\n originalConsoleLog(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\n\n if (loadInPreview) {\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${found.map(f => f.name).join(', ')}`,\n );\n }\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n };\n}\n\nexport type { Plugin } from 'vite';"]}
|
package/dist/index.mjs
CHANGED
|
@@ -2,15 +2,44 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
|
|
4
4
|
// src/index.ts
|
|
5
|
+
if (typeof process !== "undefined" && process.env && !process.env.NODE_ENV) {
|
|
6
|
+
process.env.NODE_ENV = "production";
|
|
7
|
+
}
|
|
8
|
+
function suppressDotenvLogsGlobally() {
|
|
9
|
+
if (typeof process !== "undefined" && process.env) {
|
|
10
|
+
process.env.DOTENV_QUIET = "true";
|
|
11
|
+
}
|
|
12
|
+
const originalLog = console.log;
|
|
13
|
+
console.log = (...args) => {
|
|
14
|
+
const message = args.join(" ");
|
|
15
|
+
if (message.includes("[dotenv@") && message.includes("injecting env")) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
originalLog(...args);
|
|
19
|
+
};
|
|
20
|
+
const originalError = console.error;
|
|
21
|
+
console.error = (...args) => {
|
|
22
|
+
const message = args.join(" ");
|
|
23
|
+
if (message.includes("[dotenv@") && message.includes("injecting env")) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
originalError(...args);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
suppressDotenvLogsGlobally();
|
|
5
30
|
var BINI_LOGO = "\xDF";
|
|
6
31
|
var DEFAULT_ENV_PREFIX = ["BINI_", "VITE_"];
|
|
7
32
|
var DEFAULT_OPTIONS = Object.freeze({
|
|
8
33
|
enabled: true,
|
|
9
34
|
clearViteHeader: true,
|
|
10
35
|
logo: BINI_LOGO,
|
|
11
|
-
envPrefix: DEFAULT_ENV_PREFIX
|
|
36
|
+
envPrefix: DEFAULT_ENV_PREFIX,
|
|
37
|
+
loadInPreview: true,
|
|
38
|
+
suppressDotenvLogs: true
|
|
12
39
|
});
|
|
13
40
|
var envCache = /* @__PURE__ */ new Map();
|
|
41
|
+
var originalConsoleLog = console.log;
|
|
42
|
+
var originalConsoleError = console.error;
|
|
14
43
|
function getEnv(key) {
|
|
15
44
|
if (envCache.has(key)) {
|
|
16
45
|
return envCache.get(key);
|
|
@@ -60,10 +89,11 @@ function getEnv(key) {
|
|
|
60
89
|
function requireEnv(key) {
|
|
61
90
|
const val = getEnv(key);
|
|
62
91
|
if (!val) {
|
|
63
|
-
|
|
92
|
+
throw new Error(
|
|
93
|
+
`[bini-env] Missing required environment variable: "${key}".
|
|
64
94
|
\u2192 In development: add it to your .env file.
|
|
65
|
-
\u2192 In production: add it to your hosting dashboard environment variables
|
|
66
|
-
|
|
95
|
+
\u2192 In production: add it to your hosting dashboard environment variables.`
|
|
96
|
+
);
|
|
67
97
|
}
|
|
68
98
|
return val;
|
|
69
99
|
}
|
|
@@ -71,9 +101,7 @@ var _envLoaded = false;
|
|
|
71
101
|
var _loadPromise = null;
|
|
72
102
|
async function loadEnv(projectRoot) {
|
|
73
103
|
if (_envLoaded) return;
|
|
74
|
-
if (_loadPromise)
|
|
75
|
-
return _loadPromise;
|
|
76
|
-
}
|
|
104
|
+
if (_loadPromise) return _loadPromise;
|
|
77
105
|
_loadPromise = (async () => {
|
|
78
106
|
try {
|
|
79
107
|
if (globalThis.Deno) {
|
|
@@ -84,22 +112,32 @@ async function loadEnv(projectRoot) {
|
|
|
84
112
|
_envLoaded = true;
|
|
85
113
|
return;
|
|
86
114
|
}
|
|
87
|
-
if (process.env.NODE_ENV === "production") {
|
|
88
|
-
_envLoaded = true;
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
115
|
const root = projectRoot ?? process.cwd();
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
116
|
+
const envFiles = [
|
|
117
|
+
".env",
|
|
118
|
+
`.env.${process.env.NODE_ENV}`,
|
|
119
|
+
`.env.${process.env.NODE_ENV}.local`,
|
|
120
|
+
".env.local"
|
|
121
|
+
];
|
|
122
|
+
suppressDotenvLogsGlobally();
|
|
99
123
|
const dotenv = await import('dotenv');
|
|
100
|
-
|
|
124
|
+
for (const envFile of envFiles) {
|
|
125
|
+
const envPath = path.join(root, envFile);
|
|
126
|
+
try {
|
|
127
|
+
await fs.promises.access(envPath, fs.constants.R_OK);
|
|
128
|
+
dotenv.config({
|
|
129
|
+
path: envPath,
|
|
130
|
+
override: true,
|
|
131
|
+
quiet: true
|
|
132
|
+
});
|
|
133
|
+
} catch {
|
|
134
|
+
}
|
|
135
|
+
}
|
|
101
136
|
envCache.clear();
|
|
102
|
-
} catch {
|
|
137
|
+
} catch (error) {
|
|
138
|
+
if (process.env.NODE_ENV !== "production") {
|
|
139
|
+
originalConsoleError("[bini-env] Warning: Failed to load .env file:", error);
|
|
140
|
+
}
|
|
103
141
|
} finally {
|
|
104
142
|
_envLoaded = true;
|
|
105
143
|
_loadPromise = null;
|
|
@@ -113,7 +151,7 @@ function detectEnvFiles(projectRoot = process.cwd()) {
|
|
|
113
151
|
if (_envFilesCache && _cachedRoot === projectRoot) {
|
|
114
152
|
return _envFilesCache;
|
|
115
153
|
}
|
|
116
|
-
const nodeEnv = process.env.NODE_ENV ?? "
|
|
154
|
+
const nodeEnv = process.env.NODE_ENV ?? "production";
|
|
117
155
|
const candidates = [
|
|
118
156
|
".env.local",
|
|
119
157
|
`.env.${nodeEnv}.local`,
|
|
@@ -142,32 +180,34 @@ function clearLine() {
|
|
|
142
180
|
function printResolvedUrls(urls) {
|
|
143
181
|
if (!urls) return;
|
|
144
182
|
if (urls.local.length > 0) {
|
|
145
|
-
|
|
183
|
+
originalConsoleLog(
|
|
184
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Local: ${"\x1B[36m" /* CYAN */}${urls.local[0]}${"\x1B[0m" /* RESET */}`
|
|
185
|
+
);
|
|
146
186
|
}
|
|
147
187
|
if (urls.network.length > 0) {
|
|
148
|
-
|
|
188
|
+
originalConsoleLog(
|
|
189
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Network: ${"\x1B[36m" /* CYAN */}${urls.network[0]}${"\x1B[0m" /* RESET */}`
|
|
190
|
+
);
|
|
149
191
|
}
|
|
150
192
|
}
|
|
151
193
|
function biniEnv(options = {}) {
|
|
152
194
|
if (options.enabled === false) {
|
|
153
|
-
return {
|
|
154
|
-
name: "vite-plugin-bini-env"
|
|
155
|
-
// Minimal plugin that does nothing
|
|
156
|
-
};
|
|
195
|
+
return { name: "vite-plugin-bini-env" };
|
|
157
196
|
}
|
|
158
197
|
const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
159
|
-
const { clearViteHeader, logo, envPrefix } = resolvedOptions;
|
|
198
|
+
const { clearViteHeader, logo, envPrefix, loadInPreview, suppressDotenvLogs } = resolvedOptions;
|
|
160
199
|
let resolvedConfig;
|
|
200
|
+
if (suppressDotenvLogs && typeof process !== "undefined") {
|
|
201
|
+
suppressDotenvLogsGlobally();
|
|
202
|
+
}
|
|
161
203
|
return {
|
|
162
204
|
name: "vite-plugin-bini-env",
|
|
163
|
-
// Optimized config merge
|
|
164
205
|
config() {
|
|
165
206
|
return { envPrefix };
|
|
166
207
|
},
|
|
167
208
|
configResolved(cfg) {
|
|
168
209
|
resolvedConfig = cfg;
|
|
169
210
|
},
|
|
170
|
-
// Optimized server configuration with lazy loading
|
|
171
211
|
configureServer(server) {
|
|
172
212
|
const loadEnvTask = () => {
|
|
173
213
|
void loadEnv(resolvedConfig?.root ?? process.cwd());
|
|
@@ -184,14 +224,13 @@ function biniEnv(options = {}) {
|
|
|
184
224
|
if (serverStarted) return;
|
|
185
225
|
serverStarted = true;
|
|
186
226
|
if (clearViteHeader) clearLine();
|
|
187
|
-
|
|
227
|
+
originalConsoleLog(`
|
|
188
228
|
${"\x1B[36m" /* CYAN */}${logo} Bini.js${"\x1B[0m" /* RESET */} (dev)`);
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
229
|
+
const found = detectEnvFiles(resolvedConfig?.root);
|
|
230
|
+
if (found.length > 0) {
|
|
231
|
+
originalConsoleLog(
|
|
232
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Environments: ${found.map((f) => f.name).join(", ")}`
|
|
233
|
+
);
|
|
195
234
|
}
|
|
196
235
|
if (!clearViteHeader) {
|
|
197
236
|
originalPrintUrls();
|
|
@@ -201,8 +240,17 @@ function biniEnv(options = {}) {
|
|
|
201
240
|
};
|
|
202
241
|
}
|
|
203
242
|
},
|
|
204
|
-
// Preview server with same optimizations
|
|
205
243
|
configurePreviewServer(server) {
|
|
244
|
+
if (loadInPreview) {
|
|
245
|
+
const loadEnvTask = () => {
|
|
246
|
+
void loadEnv(resolvedConfig?.root ?? process.cwd());
|
|
247
|
+
};
|
|
248
|
+
if (server.httpServer) {
|
|
249
|
+
server.httpServer.once("listening", loadEnvTask);
|
|
250
|
+
} else {
|
|
251
|
+
setImmediate(loadEnvTask);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
206
254
|
let previewStarted = false;
|
|
207
255
|
const originalPrintUrls = server.printUrls.bind(server);
|
|
208
256
|
if (clearViteHeader || logo !== BINI_LOGO) {
|
|
@@ -210,13 +258,14 @@ function biniEnv(options = {}) {
|
|
|
210
258
|
if (previewStarted) return;
|
|
211
259
|
previewStarted = true;
|
|
212
260
|
if (clearViteHeader) clearLine();
|
|
213
|
-
|
|
261
|
+
originalConsoleLog(`
|
|
214
262
|
${"\x1B[36m" /* CYAN */}${logo} Bini.js${"\x1B[0m" /* RESET */} (preview)`);
|
|
215
|
-
if (
|
|
263
|
+
if (loadInPreview) {
|
|
216
264
|
const found = detectEnvFiles(resolvedConfig?.root);
|
|
217
265
|
if (found.length > 0) {
|
|
218
|
-
|
|
219
|
-
|
|
266
|
+
originalConsoleLog(
|
|
267
|
+
` ${"\x1B[32m" /* GREEN */}\u279C${"\x1B[0m" /* RESET */} Environments: ${found.map((f) => f.name).join(", ")}`
|
|
268
|
+
);
|
|
220
269
|
}
|
|
221
270
|
}
|
|
222
271
|
if (!clearViteHeader) {
|
|
@@ -230,6 +279,6 @@ function biniEnv(options = {}) {
|
|
|
230
279
|
};
|
|
231
280
|
}
|
|
232
281
|
|
|
233
|
-
export { biniEnv, detectEnvFiles, getEnv, loadEnv, requireEnv };
|
|
282
|
+
export { biniEnv, detectEnvFiles, getEnv, loadEnv, requireEnv, suppressDotenvLogsGlobally };
|
|
234
283
|
//# sourceMappingURL=index.mjs.map
|
|
235
284
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// src/index.ts\nimport fs from 'fs';\nimport path from 'path';\nimport type { Plugin, ResolvedConfig, UserConfig } from 'vite';\n\n/* ==========================================================================\n Global type declarations for cross-runtime compatibility\n ========================================================================== */\n\ninterface DenoEnv {\n get(key: string): string | undefined;\n toObject(): Record<string, string>;\n}\ninterface DenoNamespace {\n env: DenoEnv;\n}\n\n/// <reference types=\"vite/client\" />\n\n/* ==========================================================================\n Types\n ========================================================================== */\n\nexport interface BiniEnvPluginOptions {\n readonly enabled?: boolean;\n readonly clearViteHeader?: boolean;\n readonly logo?: string;\n readonly envPrefix?: string | string[];\n}\n\nexport interface DetectedEnvFile {\n readonly name: string;\n readonly path: string;\n}\n\n/* ==========================================================================\n Constants - Optimized with Object.freeze for immutability\n ========================================================================== */\n\nconst BINI_LOGO = 'ß';\nconst DEFAULT_ENV_PREFIX: string[] = ['BINI_', 'VITE_'];\n\nconst DEFAULT_OPTIONS: Required<BiniEnvPluginOptions> = Object.freeze({\n enabled: true,\n clearViteHeader: true,\n logo: BINI_LOGO,\n envPrefix: DEFAULT_ENV_PREFIX,\n});\n\n// ANSI color codes - using const enum for better performance\nconst enum COLORS {\n CYAN = '\\x1b[36m',\n RESET = '\\x1b[0m',\n GREEN = '\\x1b[32m',\n}\n\n// Cache for environment variables to avoid repeated lookups\nconst envCache = new Map<string, string | undefined>();\n\n/* ==========================================================================\n Optimized getEnv with caching\n ========================================================================== */\n\n/**\n * Read an environment variable with caching for performance.\n * Cache is cleared on module reload in development only.\n */\nexport function getEnv(key: string): string | undefined {\n // Check cache first for frequent access patterns\n if (envCache.has(key)) {\n return envCache.get(key);\n }\n\n let value: string | undefined;\n\n // 1. Deno runtime (edge functions)\n const deno = (globalThis as unknown as { Deno?: DenoNamespace }).Deno;\n if (deno) {\n try {\n value = deno.env.get(key);\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n } catch {\n // Silently fall through\n }\n }\n\n // 2. Node.js / Bun runtime\n if (typeof process !== 'undefined' && process.env) {\n value = process.env[key];\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n }\n\n // 3. Vite client environment (with prefix fallback)\n try {\n const metaEnv = import.meta.env as Record<string, string | undefined> | undefined;\n if (metaEnv) {\n // Direct match\n if (metaEnv[key] !== undefined) {\n envCache.set(key, metaEnv[key]);\n return metaEnv[key];\n }\n \n // Try BINI_ prefix\n const biniKey = `BINI_${key}`;\n if (metaEnv[biniKey] !== undefined) {\n envCache.set(key, metaEnv[biniKey]);\n return metaEnv[biniKey];\n }\n \n // Try VITE_ prefix\n const viteKey = `VITE_${key}`;\n if (metaEnv[viteKey] !== undefined) {\n envCache.set(key, metaEnv[viteKey]);\n return metaEnv[viteKey];\n }\n }\n } catch {\n // import.meta.env not available\n }\n\n // Cache undefined to prevent repeated lookups\n envCache.set(key, undefined);\n return undefined;\n}\n\n/**\n * Optimized requireEnv with cached error messages\n */\nexport function requireEnv(key: string): string {\n const val = getEnv(key);\n if (!val) {\n // Create error message once\n const errorMsg = `[bini-env] Missing required environment variable: \"${key}\".\\n` +\n ` → In development: add it to your .env file.\\n` +\n ` → In production: add it to your hosting dashboard environment variables.`;\n throw new Error(errorMsg);\n }\n return val;\n}\n\n/* ==========================================================================\n Optimized loadEnv with production checks\n ========================================================================== */\n\nlet _envLoaded = false;\nlet _loadPromise: Promise<void> | null = null;\n\n/**\n * Load .env file with memoization and race condition prevention\n */\nexport async function loadEnv(projectRoot?: string): Promise<void> {\n // Fast path: already loaded\n if (_envLoaded) return;\n \n // Prevent concurrent loads\n if (_loadPromise) {\n return _loadPromise;\n }\n\n _loadPromise = (async () => {\n try {\n // Deno runtime check - fast path\n if ((globalThis as unknown as { Deno?: DenoNamespace }).Deno) {\n _envLoaded = true;\n return;\n }\n\n // Node.js runtime check\n if (typeof process === 'undefined' || !process.env) {\n _envLoaded = true;\n return;\n }\n\n // Production optimization - skip file system operations entirely\n if (process.env.NODE_ENV === 'production') {\n _envLoaded = true;\n return;\n }\n\n const root = projectRoot ?? process.cwd();\n const envPath = path.join(root, '.env');\n\n // Check file existence with fs.promises for better performance\n try {\n await fs.promises.access(envPath, fs.constants.R_OK);\n } catch {\n _envLoaded = true;\n return;\n }\n\n // Dynamic import with caching\n const dotenv = await import('dotenv');\n dotenv.config({ path: envPath });\n \n // Clear cache after loading new env vars\n envCache.clear();\n } catch {\n // Silent fail - requireEnv will handle missing vars\n } finally {\n _envLoaded = true;\n _loadPromise = null;\n }\n })();\n\n return _loadPromise;\n}\n\n/* ==========================================================================\n Optimized detectEnvFiles with caching\n ========================================================================== */\n\nlet _envFilesCache: DetectedEnvFile[] | null = null;\nlet _cachedRoot: string = '';\n\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\n // Cache results for the same root directory\n if (_envFilesCache && _cachedRoot === projectRoot) {\n return _envFilesCache;\n }\n\n const nodeEnv = process.env.NODE_ENV ?? 'development';\n const candidates = [\n '.env.local',\n `.env.${nodeEnv}.local`,\n `.env.${nodeEnv}`,\n '.env',\n ];\n\n const found: DetectedEnvFile[] = [];\n\n // Use for...of with early break if needed\n for (const file of candidates) {\n const filePath = path.join(projectRoot, file);\n try {\n if (fs.existsSync(filePath)) {\n found.push({ name: file, path: filePath });\n }\n } catch {\n // Skip files that can't be accessed\n }\n }\n\n // Cache the result\n _envFilesCache = found;\n _cachedRoot = projectRoot;\n \n return found;\n}\n\n/* ==========================================================================\n Optimized Vite plugin with minimal overhead\n ========================================================================== */\n\nfunction clearLine(): void {\n // Only write if stdout is a TTY (performance optimization)\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[2K\\r');\n }\n}\n\nfunction printResolvedUrls(urls: { local: string[]; network: string[] } | null | undefined): void {\n if (!urls) return;\n if (urls.local.length > 0) {\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\n }\n if (urls.network.length > 0) {\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\n }\n}\n\n/**\n * Production-ready Vite plugin with performance optimizations:\n * - Lazy loading\n * - Caching\n * - Minimal bundle impact\n * - No runtime overhead in production\n */\nexport function biniEnv(options: Readonly<BiniEnvPluginOptions> = {}): Plugin {\n // Fast path: disabled plugin returns no-op\n if (options.enabled === false) {\n return {\n name: 'vite-plugin-bini-env',\n // Minimal plugin that does nothing\n };\n }\n\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const { clearViteHeader, logo, envPrefix } = resolvedOptions;\n\n let resolvedConfig: ResolvedConfig;\n\n return {\n name: 'vite-plugin-bini-env',\n \n // Optimized config merge\n config(): UserConfig {\n return { envPrefix };\n },\n\n configResolved(cfg: ResolvedConfig) {\n resolvedConfig = cfg;\n },\n\n // Optimized server configuration with lazy loading\n configureServer(server) {\n // Defer env loading to avoid blocking server start\n const loadEnvTask = () => {\n void loadEnv(resolvedConfig?.root ?? process.cwd());\n };\n\n if (server.httpServer) {\n server.httpServer.once('listening', loadEnvTask);\n } else {\n // Use setImmediate for non-blocking execution\n setImmediate(loadEnvTask);\n }\n\n let serverStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n // Only override printUrls if needed\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (serverStarted) return;\n serverStarted = true;\n\n if (clearViteHeader) clearLine();\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);\n\n // Only detect env files in development\n if (process.env.NODE_ENV !== 'production') {\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n const envString = found.map((f) => f.name).join(', ');\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\n }\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n\n // Preview server with same optimizations\n configurePreviewServer(server) {\n let previewStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (previewStarted) return;\n previewStarted = true;\n\n if (clearViteHeader) clearLine();\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\n\n if (process.env.NODE_ENV !== 'production') {\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n const envString = found.map((f) => f.name).join(', ');\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\n }\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n };\n}\n\nexport type { Plugin } from 'vite';"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// bini-env/src/index.ts\nimport fs from 'fs';\nimport path from 'path';\nimport type { Plugin, ResolvedConfig, UserConfig } from 'vite';\n\n/* ==========================================================================\n Default NODE_ENV — must run before anything else\n ========================================================================== */\n\nif (typeof process !== 'undefined' && process.env && !process.env.NODE_ENV) {\n process.env.NODE_ENV = 'production';\n}\n\n/* ==========================================================================\n IMMEDIATE DOTENV SUPPRESSION - Runs at module load\n ========================================================================== */\n\nexport function suppressDotenvLogsGlobally(): void {\n if (typeof process !== 'undefined' && process.env) {\n process.env.DOTENV_QUIET = 'true';\n }\n\n const originalLog = console.log;\n console.log = (...args: any[]) => {\n const message = args.join(' ');\n if (message.includes('[dotenv@') && message.includes('injecting env')) {\n return;\n }\n originalLog(...args);\n };\n\n const originalError = console.error;\n console.error = (...args: any[]) => {\n const message = args.join(' ');\n if (message.includes('[dotenv@') && message.includes('injecting env')) {\n return;\n }\n originalError(...args);\n };\n}\n\n// Run suppression immediately when module loads\nsuppressDotenvLogsGlobally();\n\n/* ==========================================================================\n Global type declarations for cross-runtime compatibility\n ========================================================================== */\n\ninterface DenoEnv {\n get(key: string): string | undefined;\n toObject(): Record<string, string>;\n}\ninterface DenoNamespace {\n env: DenoEnv;\n}\n\n/// <reference types=\"vite/client\" />\n\n/* ==========================================================================\n Types\n ========================================================================== */\n\nexport interface BiniEnvPluginOptions {\n readonly enabled?: boolean;\n readonly clearViteHeader?: boolean;\n readonly logo?: string;\n readonly envPrefix?: string | string[];\n readonly loadInPreview?: boolean;\n readonly suppressDotenvLogs?: boolean;\n}\n\nexport interface DetectedEnvFile {\n readonly name: string;\n readonly path: string;\n}\n\n/* ==========================================================================\n Constants\n ========================================================================== */\n\nconst BINI_LOGO = 'ß';\nconst DEFAULT_ENV_PREFIX: string[] = ['BINI_', 'VITE_'];\n\nconst DEFAULT_OPTIONS: Required<BiniEnvPluginOptions> = Object.freeze({\n enabled: true,\n clearViteHeader: true,\n logo: BINI_LOGO,\n envPrefix: DEFAULT_ENV_PREFIX,\n loadInPreview: true,\n suppressDotenvLogs: true,\n});\n\nconst enum COLORS {\n CYAN = '\\x1b[36m',\n RESET = '\\x1b[0m',\n GREEN = '\\x1b[32m',\n}\n\nconst envCache = new Map<string, string | undefined>();\n\n// Store original console functions before any patching\nconst originalConsoleLog = console.log;\nconst originalConsoleError = console.error;\n\n/* ==========================================================================\n getEnv\n ========================================================================== */\n\nexport function getEnv(key: string): string | undefined {\n if (envCache.has(key)) {\n return envCache.get(key);\n }\n\n let value: string | undefined;\n\n // 1. Deno runtime\n const deno = (globalThis as unknown as { Deno?: DenoNamespace }).Deno;\n if (deno) {\n try {\n value = deno.env.get(key);\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n } catch {\n // fall through\n }\n }\n\n // 2. Node.js / Bun\n if (typeof process !== 'undefined' && process.env) {\n value = process.env[key];\n if (value !== undefined) {\n envCache.set(key, value);\n return value;\n }\n }\n\n // 3. Vite client (import.meta.env)\n try {\n const metaEnv = import.meta.env as Record<string, string | undefined> | undefined;\n if (metaEnv) {\n if (metaEnv[key] !== undefined) {\n envCache.set(key, metaEnv[key]);\n return metaEnv[key];\n }\n const biniKey = `BINI_${key}`;\n if (metaEnv[biniKey] !== undefined) {\n envCache.set(key, metaEnv[biniKey]);\n return metaEnv[biniKey];\n }\n const viteKey = `VITE_${key}`;\n if (metaEnv[viteKey] !== undefined) {\n envCache.set(key, metaEnv[viteKey]);\n return metaEnv[viteKey];\n }\n }\n } catch {\n // import.meta.env not available\n }\n\n envCache.set(key, undefined);\n return undefined;\n}\n\n/* ==========================================================================\n requireEnv\n ========================================================================== */\n\nexport function requireEnv(key: string): string {\n const val = getEnv(key);\n if (!val) {\n throw new Error(\n `[bini-env] Missing required environment variable: \"${key}\".\\n` +\n ` → In development: add it to your .env file.\\n` +\n ` → In production: add it to your hosting dashboard environment variables.`,\n );\n }\n return val;\n}\n\n/* ==========================================================================\n loadEnv\n ========================================================================== */\n\nlet _envLoaded = false;\nlet _loadPromise: Promise<void> | null = null;\n\nexport async function loadEnv(projectRoot?: string): Promise<void> {\n if (_envLoaded) return;\n if (_loadPromise) return _loadPromise;\n\n _loadPromise = (async () => {\n try {\n // Deno — env is already available via Deno.env\n if ((globalThis as unknown as { Deno?: DenoNamespace }).Deno) {\n _envLoaded = true;\n return;\n }\n\n if (typeof process === 'undefined' || !process.env) {\n _envLoaded = true;\n return;\n }\n\n const root = projectRoot ?? process.cwd();\n\n // Load order: lowest → highest priority\n const envFiles = [\n '.env',\n `.env.${process.env.NODE_ENV}`,\n `.env.${process.env.NODE_ENV}.local`,\n '.env.local',\n ];\n\n suppressDotenvLogsGlobally();\n\n const dotenv = await import('dotenv');\n\n for (const envFile of envFiles) {\n const envPath = path.join(root, envFile);\n try {\n await fs.promises.access(envPath, fs.constants.R_OK);\n dotenv.config({\n path : envPath,\n override: true,\n quiet : true,\n } as Parameters<typeof dotenv.config>[0]);\n } catch {\n // file doesn't exist — skip\n }\n }\n\n // Clear cache so newly loaded vars are picked up\n envCache.clear();\n\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n originalConsoleError('[bini-env] Warning: Failed to load .env file:', error);\n }\n } finally {\n _envLoaded = true;\n _loadPromise = null;\n }\n })();\n\n return _loadPromise;\n}\n\n/* ==========================================================================\n detectEnvFiles\n ========================================================================== */\n\nlet _envFilesCache: DetectedEnvFile[] | null = null;\nlet _cachedRoot = '';\n\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\n if (_envFilesCache && _cachedRoot === projectRoot) {\n return _envFilesCache;\n }\n\n const nodeEnv = process.env.NODE_ENV ?? 'production';\n const candidates = [\n '.env.local',\n `.env.${nodeEnv}.local`,\n `.env.${nodeEnv}`,\n '.env',\n ];\n\n const found: DetectedEnvFile[] = [];\n\n for (const file of candidates) {\n const filePath = path.join(projectRoot, file);\n try {\n if (fs.existsSync(filePath)) {\n found.push({ name: file, path: filePath });\n }\n } catch {\n // skip\n }\n }\n\n _envFilesCache = found;\n _cachedRoot = projectRoot;\n\n return found;\n}\n\n/* ==========================================================================\n Vite plugin\n ========================================================================== */\n\nfunction clearLine(): void {\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[2K\\r');\n }\n}\n\nfunction printResolvedUrls(\n urls: { local: string[]; network: string[] } | null | undefined,\n): void {\n if (!urls) return;\n if (urls.local.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`,\n );\n }\n if (urls.network.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`,\n );\n }\n}\n\nexport function biniEnv(options: Readonly<BiniEnvPluginOptions> = {}): Plugin {\n if (options.enabled === false) {\n return { name: 'vite-plugin-bini-env' };\n }\n\n const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };\n const { clearViteHeader, logo, envPrefix, loadInPreview, suppressDotenvLogs } = resolvedOptions;\n\n let resolvedConfig: ResolvedConfig;\n\n if (suppressDotenvLogs && typeof process !== 'undefined') {\n suppressDotenvLogsGlobally();\n }\n\n return {\n name: 'vite-plugin-bini-env',\n\n config(): UserConfig {\n return { envPrefix };\n },\n\n configResolved(cfg: ResolvedConfig) {\n resolvedConfig = cfg;\n },\n\n configureServer(server) {\n const loadEnvTask = () => {\n void loadEnv(resolvedConfig?.root ?? process.cwd());\n };\n\n if (server.httpServer) {\n server.httpServer.once('listening', loadEnvTask);\n } else {\n setImmediate(loadEnvTask);\n }\n\n let serverStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (serverStarted) return;\n serverStarted = true;\n\n if (clearViteHeader) clearLine();\n originalConsoleLog(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);\n\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${found.map(f => f.name).join(', ')}`,\n );\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n\n configurePreviewServer(server) {\n if (loadInPreview) {\n const loadEnvTask = () => {\n void loadEnv(resolvedConfig?.root ?? process.cwd());\n };\n\n if (server.httpServer) {\n server.httpServer.once('listening', loadEnvTask);\n } else {\n setImmediate(loadEnvTask);\n }\n }\n\n let previewStarted = false;\n const originalPrintUrls = server.printUrls.bind(server);\n\n if (clearViteHeader || logo !== BINI_LOGO) {\n server.printUrls = () => {\n if (previewStarted) return;\n previewStarted = true;\n\n if (clearViteHeader) clearLine();\n originalConsoleLog(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\n\n if (loadInPreview) {\n const found = detectEnvFiles(resolvedConfig?.root);\n if (found.length > 0) {\n originalConsoleLog(\n ` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${found.map(f => f.name).join(', ')}`,\n );\n }\n }\n\n if (!clearViteHeader) {\n originalPrintUrls();\n } else {\n printResolvedUrls(server.resolvedUrls);\n }\n };\n }\n },\n };\n}\n\nexport type { Plugin } from 'vite';"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bini-env",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Universal environment variable loader and Vite plugin for Bini.js — works in Node.js, Deno, Bun, and Vite edge functions",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|