bini-env 1.0.1 → 1.0.2
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 +9 -3
- package/dist/index.cjs +15 -54
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -11
- package/dist/index.d.ts +9 -11
- package/dist/index.js +15 -54
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/Readme.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# bini-env
|
|
2
2
|
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+
|
|
3
9
|
A lightweight Vite plugin that enhances your dev and preview server output with a clean startup banner and detected `.env` files.
|
|
4
10
|
|
|
5
11
|
## Features
|
|
@@ -34,7 +40,7 @@ export default defineConfig({
|
|
|
34
40
|
**Dev mode**
|
|
35
41
|
```
|
|
36
42
|
ß Bini.js (dev)
|
|
37
|
-
|
|
43
|
+
➜ Environments: .env.local, .env
|
|
38
44
|
➜ Local: http://localhost:5173/
|
|
39
45
|
➜ Network: http://192.168.1.10:5173/
|
|
40
46
|
```
|
|
@@ -42,7 +48,7 @@ export default defineConfig({
|
|
|
42
48
|
**Preview mode**
|
|
43
49
|
```
|
|
44
50
|
ß Bini.js (preview)
|
|
45
|
-
|
|
51
|
+
➜ Environments: .env.local, .env
|
|
46
52
|
➜ Local: http://localhost:4173/
|
|
47
53
|
➜ Network: http://192.168.1.10:4173/
|
|
48
54
|
```
|
|
@@ -107,7 +113,7 @@ import { detectEnvFiles, formatEnvFilesForDisplay } from 'bini-env';
|
|
|
107
113
|
|
|
108
114
|
const files = detectEnvFiles();
|
|
109
115
|
console.log(formatEnvFilesForDisplay(files));
|
|
110
|
-
//
|
|
116
|
+
// ➜ Environments: .env
|
|
111
117
|
```
|
|
112
118
|
|
|
113
119
|
## Types
|
package/dist/index.cjs
CHANGED
|
@@ -38,6 +38,11 @@ module.exports = __toCommonJS(index_exports);
|
|
|
38
38
|
var import_fs = __toESM(require("fs"), 1);
|
|
39
39
|
var import_path = __toESM(require("path"), 1);
|
|
40
40
|
var BINI_LOGO = "\xDF";
|
|
41
|
+
var DEFAULT_OPTIONS = {
|
|
42
|
+
enabled: true,
|
|
43
|
+
clearViteHeader: true,
|
|
44
|
+
logo: BINI_LOGO
|
|
45
|
+
};
|
|
41
46
|
var COLORS = {
|
|
42
47
|
CYAN: "\x1B[36m",
|
|
43
48
|
RESET: "\x1B[0m",
|
|
@@ -70,49 +75,30 @@ function formatEnvFilesForDisplay(envFiles) {
|
|
|
70
75
|
return "";
|
|
71
76
|
}
|
|
72
77
|
const envString = envFiles.map((f) => f.name).join(", ");
|
|
73
|
-
return `${COLORS.GREEN}\
|
|
74
|
-
}
|
|
75
|
-
function getModeLabel(command, isPreview = false) {
|
|
76
|
-
if (command === "build") {
|
|
77
|
-
return "(prod)";
|
|
78
|
-
} else if (command === "serve") {
|
|
79
|
-
if (isPreview) {
|
|
80
|
-
return "(preview)";
|
|
81
|
-
}
|
|
82
|
-
return "(dev)";
|
|
83
|
-
}
|
|
84
|
-
return "";
|
|
78
|
+
return `${COLORS.GREEN}\u279C${COLORS.RESET} Environments: ${envString}`;
|
|
85
79
|
}
|
|
86
80
|
function clearLine() {
|
|
87
81
|
process.stdout.write("\x1B[2K\r");
|
|
88
82
|
}
|
|
89
83
|
function biniEnvPlugin(options = {}) {
|
|
90
|
-
const {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
} = options;
|
|
84
|
+
const resolvedOptions = Object.freeze({
|
|
85
|
+
...DEFAULT_OPTIONS,
|
|
86
|
+
...options
|
|
87
|
+
});
|
|
88
|
+
const { enabled, clearViteHeader, logo } = resolvedOptions;
|
|
96
89
|
let config;
|
|
97
|
-
let mode = "dev";
|
|
98
90
|
let isPreviewMode = false;
|
|
99
91
|
let serverStarted = false;
|
|
100
92
|
let previewStarted = false;
|
|
101
93
|
return {
|
|
102
94
|
name: "vite-plugin-bini-env",
|
|
103
|
-
// Apply plugin conditions
|
|
104
95
|
apply: "serve",
|
|
105
|
-
// Get resolved config
|
|
106
96
|
configResolved(resolvedConfig) {
|
|
107
97
|
config = resolvedConfig;
|
|
108
|
-
if (resolvedConfig.command === "
|
|
109
|
-
mode = "prod";
|
|
110
|
-
} else if (resolvedConfig.command === "serve") {
|
|
98
|
+
if (resolvedConfig.command === "serve") {
|
|
111
99
|
isPreviewMode = process.env.VITE_PREVIEW === "true" || process.argv.includes("preview") || false;
|
|
112
|
-
mode = isPreviewMode ? "preview" : "dev";
|
|
113
100
|
}
|
|
114
101
|
},
|
|
115
|
-
// Configure server to modify the output
|
|
116
102
|
configureServer(server) {
|
|
117
103
|
if (!enabled) return;
|
|
118
104
|
const originalPrintUrls = server.printUrls;
|
|
@@ -122,13 +108,12 @@ function biniEnvPlugin(options = {}) {
|
|
|
122
108
|
if (clearViteHeader) {
|
|
123
109
|
clearLine();
|
|
124
110
|
}
|
|
125
|
-
const modeLabel = getModeLabel("serve", isPreviewMode);
|
|
126
111
|
console.log(`
|
|
127
|
-
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET}
|
|
112
|
+
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);
|
|
128
113
|
const found = detectEnvFiles(config.root);
|
|
129
114
|
if (found.length > 0) {
|
|
130
115
|
const envString = found.map((f) => f.name).join(", ");
|
|
131
|
-
console.log(` ${COLORS.GREEN}\
|
|
116
|
+
console.log(` ${COLORS.GREEN}\u279C${COLORS.RESET} Environments: ${envString}`);
|
|
132
117
|
}
|
|
133
118
|
if (!clearViteHeader) {
|
|
134
119
|
originalPrintUrls.call(server);
|
|
@@ -146,11 +131,9 @@ function biniEnvPlugin(options = {}) {
|
|
|
146
131
|
}
|
|
147
132
|
};
|
|
148
133
|
},
|
|
149
|
-
// Handle preview mode
|
|
150
134
|
configurePreviewServer(server) {
|
|
151
135
|
if (!enabled) return;
|
|
152
136
|
isPreviewMode = true;
|
|
153
|
-
mode = "preview";
|
|
154
137
|
const originalPrintUrls = server.printUrls;
|
|
155
138
|
server.printUrls = () => {
|
|
156
139
|
if (!previewStarted) {
|
|
@@ -163,7 +146,7 @@ function biniEnvPlugin(options = {}) {
|
|
|
163
146
|
const found = detectEnvFiles(config.root);
|
|
164
147
|
if (found.length > 0) {
|
|
165
148
|
const envString = found.map((f) => f.name).join(", ");
|
|
166
|
-
console.log(` ${COLORS.GREEN}\
|
|
149
|
+
console.log(` ${COLORS.GREEN}\u279C${COLORS.RESET} Environments: ${envString}`);
|
|
167
150
|
}
|
|
168
151
|
if (!clearViteHeader) {
|
|
169
152
|
originalPrintUrls.call(server);
|
|
@@ -182,28 +165,6 @@ function biniEnvPlugin(options = {}) {
|
|
|
182
165
|
}
|
|
183
166
|
};
|
|
184
167
|
},
|
|
185
|
-
// Handle build
|
|
186
|
-
buildStart() {
|
|
187
|
-
if (enabled && showEnvironmentsInBuild && config?.command === "build") {
|
|
188
|
-
const found = detectEnvFiles(config.root);
|
|
189
|
-
if (found.length > 0) {
|
|
190
|
-
console.log(`
|
|
191
|
-
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (building)`);
|
|
192
|
-
const envString = found.map((f) => f.name).join(", ");
|
|
193
|
-
console.log(` ${COLORS.GREEN}\u2713${COLORS.RESET} Environments: ${envString}
|
|
194
|
-
`);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
},
|
|
198
|
-
// Handle build completion
|
|
199
|
-
closeBundle() {
|
|
200
|
-
if (enabled && showEnvironmentsInBuild && config?.command === "build") {
|
|
201
|
-
console.log(`
|
|
202
|
-
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} ${COLORS.GREEN}\u2713${COLORS.RESET} Build completed
|
|
203
|
-
`);
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
// Cleanup
|
|
207
168
|
buildEnd() {
|
|
208
169
|
serverStarted = false;
|
|
209
170
|
previewStarted = false;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { Plugin, ResolvedConfig } from 'vite';\r\n\r\n// Types\r\nexport interface BiniEnvPluginOptions {\r\n /**\r\n * Enable/disable the plugin\r\n * @default true\r\n */\r\n enabled?: boolean;\r\n \r\n /**\r\n * Remove Vite's default header\r\n * @default true\r\n */\r\n clearViteHeader?: boolean;\r\n \r\n /**\r\n * Custom logo/text to display\r\n * @default 'ß'\r\n */\r\n logo?: string;\r\n \r\n /**\r\n * Show environments in production build\r\n * @default true\r\n */\r\n showEnvironmentsInBuild?: boolean;\r\n}\r\n\r\nexport interface DetectedEnvFile {\r\n name: string;\r\n path: string;\r\n}\r\n\r\n// Constants\r\nconst BINI_LOGO = 'ß';\r\n\r\n// Color definitions\r\nconst COLORS = {\r\n CYAN: '\\x1b[36m',\r\n RESET: '\\x1b[0m',\r\n GREEN: '\\x1b[32m',\r\n YELLOW: '\\x1b[33m',\r\n DIM: '\\x1b[2m'\r\n} as const;\r\n\r\n/**\r\n * Detect which .env files exist in project root\r\n */\r\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\r\n const nodeEnv = process.env.NODE_ENV || 'development';\r\n\r\n // Check in priority order (what Next.js loads)\r\n const envFiles = [\r\n '.env.local',\r\n `.env.${nodeEnv}.local`,\r\n `.env.${nodeEnv}`,\r\n '.env'\r\n ];\r\n\r\n const found: DetectedEnvFile[] = [];\r\n\r\n for (const file of envFiles) {\r\n const filePath = path.join(projectRoot, file);\r\n if (fs.existsSync(filePath)) {\r\n found.push({\r\n name: file,\r\n path: filePath\r\n });\r\n }\r\n }\r\n\r\n return found;\r\n}\r\n\r\n/**\r\n * Format environment files for console display\r\n */\r\nexport function formatEnvFilesForDisplay(envFiles: DetectedEnvFile[]): string {\r\n if (envFiles.length === 0) {\r\n return '';\r\n }\r\n\r\n const envString = envFiles.map(f => f.name).join(', ');\r\n return `${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}`;\r\n}\r\n\r\n/**\r\n * Get mode label based on command and mode\r\n */\r\nfunction getModeLabel(command: string, isPreview: boolean = false): string {\r\n if (command === 'build') {\r\n return '(prod)';\r\n } else if (command === 'serve') {\r\n if (isPreview) {\r\n return '(preview)';\r\n }\r\n return '(dev)';\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Clear the current line in console\r\n */\r\nfunction clearLine(): void {\r\n process.stdout.write('\\x1b[2K\\r');\r\n}\r\n\r\n/**\r\n * Main plugin function\r\n */\r\nexport default function biniEnvPlugin(options: BiniEnvPluginOptions = {}): Plugin {\r\n const {\r\n enabled = true,\r\n clearViteHeader = true,\r\n logo = BINI_LOGO,\r\n showEnvironmentsInBuild = true\r\n } = options;\r\n\r\n let config: ResolvedConfig;\r\n let mode: 'dev' | 'preview' | 'prod' = 'dev';\r\n let isPreviewMode = false;\r\n let serverStarted = false;\r\n let previewStarted = false;\r\n\r\n return {\r\n name: 'vite-plugin-bini-env',\r\n \r\n // Apply plugin conditions\r\n apply: 'serve',\r\n \r\n // Get resolved config\r\n configResolved(resolvedConfig: ResolvedConfig) {\r\n config = resolvedConfig;\r\n \r\n if (resolvedConfig.command === 'build') {\r\n mode = 'prod';\r\n } else if (resolvedConfig.command === 'serve') {\r\n isPreviewMode = process.env.VITE_PREVIEW === 'true' || \r\n process.argv.includes('preview') ||\r\n false;\r\n mode = isPreviewMode ? 'preview' : 'dev';\r\n }\r\n },\r\n\r\n // Configure server to modify the output\r\n configureServer(server) {\r\n if (!enabled) return;\r\n\r\n // Store original printUrls\r\n const originalPrintUrls = server.printUrls;\r\n \r\n // Override printUrls method\r\n server.printUrls = () => {\r\n if (!serverStarted) {\r\n serverStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n // SIMPLIFIED: Show only ß Bini.js (dev) without version\r\n const modeLabel = getModeLabel('serve', isPreviewMode);\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} ${modeLabel}`);\r\n\r\n // Show environments if found\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n },\r\n\r\n // Handle preview mode\r\n configurePreviewServer(server) {\r\n if (!enabled) return;\r\n \r\n isPreviewMode = true;\r\n mode = 'preview';\r\n \r\n const originalPrintUrls = server.printUrls;\r\n \r\n server.printUrls = () => {\r\n if (!previewStarted) {\r\n previewStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n // SIMPLIFIED: Show only ß Bini.js (preview) without version\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\r\n\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n console.log('');\r\n }\r\n }\r\n };\r\n },\r\n\r\n // Handle build\r\n buildStart() {\r\n if (enabled && showEnvironmentsInBuild && config?.command === 'build') {\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n // SIMPLIFIED: Show only ß Bini.js (building) without version\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (building)`);\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}\\n`);\r\n }\r\n }\r\n },\r\n\r\n // Handle build completion\r\n closeBundle() {\r\n if (enabled && showEnvironmentsInBuild && config?.command === 'build') {\r\n // SIMPLIFIED: Show only ß Bini.js ✓ Build completed without version\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} ${COLORS.GREEN}✓${COLORS.RESET} Build completed\\n`);\r\n }\r\n },\r\n\r\n // Cleanup\r\n buildEnd() {\r\n serverStarted = false;\r\n previewStarted = false;\r\n }\r\n };\r\n}\r\n\r\n// Export types\r\nexport type { Plugin } from 'vite';"],"mappings":"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","names":["path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { Plugin, ResolvedConfig } from 'vite';\r\n\r\n// Types\r\nexport interface BiniEnvPluginOptions {\r\n /**\r\n * Enable/disable the plugin\r\n * @default true\r\n * @readonly\r\n */\r\n readonly enabled?: boolean;\r\n \r\n /**\r\n * Remove Vite's default header\r\n * @default true\r\n * @readonly\r\n */\r\n readonly clearViteHeader?: boolean;\r\n \r\n /**\r\n * Custom logo/text to display\r\n * @default 'ß'\r\n * @readonly\r\n */\r\n readonly logo?: string;\r\n}\r\n\r\nexport interface DetectedEnvFile {\r\n readonly name: string;\r\n readonly path: string;\r\n}\r\n\r\n// Constants\r\nconst BINI_LOGO = 'ß' as const;\r\nconst DEFAULT_OPTIONS = {\r\n enabled: true,\r\n clearViteHeader: true,\r\n logo: BINI_LOGO,\r\n} as const;\r\n\r\n// Color definitions\r\nconst COLORS = {\r\n CYAN: '\\x1b[36m',\r\n RESET: '\\x1b[0m',\r\n GREEN: '\\x1b[32m',\r\n YELLOW: '\\x1b[33m',\r\n DIM: '\\x1b[2m'\r\n} as const;\r\n\r\n/**\r\n * Detect which .env files exist in project root\r\n */\r\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\r\n const nodeEnv = process.env.NODE_ENV || 'development';\r\n\r\n const envFiles = [\r\n '.env.local',\r\n `.env.${nodeEnv}.local`,\r\n `.env.${nodeEnv}`,\r\n '.env'\r\n ] as const;\r\n\r\n const found: DetectedEnvFile[] = [];\r\n\r\n for (const file of envFiles) {\r\n const filePath = path.join(projectRoot, file);\r\n if (fs.existsSync(filePath)) {\r\n found.push({\r\n name: file,\r\n path: filePath\r\n });\r\n }\r\n }\r\n\r\n return found;\r\n}\r\n\r\n/**\r\n * Format environment files for console display\r\n */\r\nexport function formatEnvFilesForDisplay(envFiles: DetectedEnvFile[]): string {\r\n if (envFiles.length === 0) {\r\n return '';\r\n }\r\n\r\n const envString = envFiles.map(f => f.name).join(', ');\r\n return `${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`;\r\n}\r\n\r\n/**\r\n * Clear the current line in console\r\n */\r\nfunction clearLine(): void {\r\n process.stdout.write('\\x1b[2K\\r');\r\n}\r\n\r\n/**\r\n * Main plugin function\r\n */\r\nexport default function biniEnvPlugin(options: Readonly<BiniEnvPluginOptions> = {}): Plugin {\r\n // Merge with defaults — user cannot override core behaviour\r\n const resolvedOptions = Object.freeze({\r\n ...DEFAULT_OPTIONS,\r\n ...options,\r\n });\r\n\r\n const { enabled, clearViteHeader, logo } = resolvedOptions;\r\n\r\n let config: ResolvedConfig;\r\n let isPreviewMode = false;\r\n let serverStarted = false;\r\n let previewStarted = false;\r\n\r\n return {\r\n name: 'vite-plugin-bini-env',\r\n \r\n apply: 'serve',\r\n \r\n configResolved(resolvedConfig: ResolvedConfig) {\r\n config = resolvedConfig;\r\n \r\n if (resolvedConfig.command === 'serve') {\r\n isPreviewMode = process.env.VITE_PREVIEW === 'true' || \r\n process.argv.includes('preview') ||\r\n false;\r\n }\r\n },\r\n\r\n configureServer(server) {\r\n if (!enabled) return;\r\n\r\n const originalPrintUrls = server.printUrls;\r\n \r\n server.printUrls = () => {\r\n if (!serverStarted) {\r\n serverStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);\r\n\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n },\r\n\r\n configurePreviewServer(server) {\r\n if (!enabled) return;\r\n \r\n isPreviewMode = true;\r\n \r\n const originalPrintUrls = server.printUrls;\r\n \r\n server.printUrls = () => {\r\n if (!previewStarted) {\r\n previewStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\r\n\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n console.log('');\r\n }\r\n }\r\n };\r\n },\r\n\r\n buildEnd() {\r\n serverStarted = false;\r\n previewStarted = false;\r\n }\r\n };\r\n}\r\n\r\nexport type { Plugin } from 'vite';"],"mappings":"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","names":["path","fs"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -5,27 +5,25 @@ interface BiniEnvPluginOptions {
|
|
|
5
5
|
/**
|
|
6
6
|
* Enable/disable the plugin
|
|
7
7
|
* @default true
|
|
8
|
+
* @readonly
|
|
8
9
|
*/
|
|
9
|
-
enabled?: boolean;
|
|
10
|
+
readonly enabled?: boolean;
|
|
10
11
|
/**
|
|
11
12
|
* Remove Vite's default header
|
|
12
13
|
* @default true
|
|
14
|
+
* @readonly
|
|
13
15
|
*/
|
|
14
|
-
clearViteHeader?: boolean;
|
|
16
|
+
readonly clearViteHeader?: boolean;
|
|
15
17
|
/**
|
|
16
18
|
* Custom logo/text to display
|
|
17
19
|
* @default 'ß'
|
|
20
|
+
* @readonly
|
|
18
21
|
*/
|
|
19
|
-
logo?: string;
|
|
20
|
-
/**
|
|
21
|
-
* Show environments in production build
|
|
22
|
-
* @default true
|
|
23
|
-
*/
|
|
24
|
-
showEnvironmentsInBuild?: boolean;
|
|
22
|
+
readonly logo?: string;
|
|
25
23
|
}
|
|
26
24
|
interface DetectedEnvFile {
|
|
27
|
-
name: string;
|
|
28
|
-
path: string;
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly path: string;
|
|
29
27
|
}
|
|
30
28
|
/**
|
|
31
29
|
* Detect which .env files exist in project root
|
|
@@ -38,6 +36,6 @@ declare function formatEnvFilesForDisplay(envFiles: DetectedEnvFile[]): string;
|
|
|
38
36
|
/**
|
|
39
37
|
* Main plugin function
|
|
40
38
|
*/
|
|
41
|
-
declare function biniEnvPlugin(options?: BiniEnvPluginOptions): Plugin;
|
|
39
|
+
declare function biniEnvPlugin(options?: Readonly<BiniEnvPluginOptions>): Plugin;
|
|
42
40
|
|
|
43
41
|
export { type BiniEnvPluginOptions, type DetectedEnvFile, biniEnvPlugin as default, detectEnvFiles, formatEnvFilesForDisplay };
|
package/dist/index.d.ts
CHANGED
|
@@ -5,27 +5,25 @@ interface BiniEnvPluginOptions {
|
|
|
5
5
|
/**
|
|
6
6
|
* Enable/disable the plugin
|
|
7
7
|
* @default true
|
|
8
|
+
* @readonly
|
|
8
9
|
*/
|
|
9
|
-
enabled?: boolean;
|
|
10
|
+
readonly enabled?: boolean;
|
|
10
11
|
/**
|
|
11
12
|
* Remove Vite's default header
|
|
12
13
|
* @default true
|
|
14
|
+
* @readonly
|
|
13
15
|
*/
|
|
14
|
-
clearViteHeader?: boolean;
|
|
16
|
+
readonly clearViteHeader?: boolean;
|
|
15
17
|
/**
|
|
16
18
|
* Custom logo/text to display
|
|
17
19
|
* @default 'ß'
|
|
20
|
+
* @readonly
|
|
18
21
|
*/
|
|
19
|
-
logo?: string;
|
|
20
|
-
/**
|
|
21
|
-
* Show environments in production build
|
|
22
|
-
* @default true
|
|
23
|
-
*/
|
|
24
|
-
showEnvironmentsInBuild?: boolean;
|
|
22
|
+
readonly logo?: string;
|
|
25
23
|
}
|
|
26
24
|
interface DetectedEnvFile {
|
|
27
|
-
name: string;
|
|
28
|
-
path: string;
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly path: string;
|
|
29
27
|
}
|
|
30
28
|
/**
|
|
31
29
|
* Detect which .env files exist in project root
|
|
@@ -38,6 +36,6 @@ declare function formatEnvFilesForDisplay(envFiles: DetectedEnvFile[]): string;
|
|
|
38
36
|
/**
|
|
39
37
|
* Main plugin function
|
|
40
38
|
*/
|
|
41
|
-
declare function biniEnvPlugin(options?: BiniEnvPluginOptions): Plugin;
|
|
39
|
+
declare function biniEnvPlugin(options?: Readonly<BiniEnvPluginOptions>): Plugin;
|
|
42
40
|
|
|
43
41
|
export { type BiniEnvPluginOptions, type DetectedEnvFile, biniEnvPlugin as default, detectEnvFiles, formatEnvFilesForDisplay };
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
4
|
var BINI_LOGO = "\xDF";
|
|
5
|
+
var DEFAULT_OPTIONS = {
|
|
6
|
+
enabled: true,
|
|
7
|
+
clearViteHeader: true,
|
|
8
|
+
logo: BINI_LOGO
|
|
9
|
+
};
|
|
5
10
|
var COLORS = {
|
|
6
11
|
CYAN: "\x1B[36m",
|
|
7
12
|
RESET: "\x1B[0m",
|
|
@@ -34,49 +39,30 @@ function formatEnvFilesForDisplay(envFiles) {
|
|
|
34
39
|
return "";
|
|
35
40
|
}
|
|
36
41
|
const envString = envFiles.map((f) => f.name).join(", ");
|
|
37
|
-
return `${COLORS.GREEN}\
|
|
38
|
-
}
|
|
39
|
-
function getModeLabel(command, isPreview = false) {
|
|
40
|
-
if (command === "build") {
|
|
41
|
-
return "(prod)";
|
|
42
|
-
} else if (command === "serve") {
|
|
43
|
-
if (isPreview) {
|
|
44
|
-
return "(preview)";
|
|
45
|
-
}
|
|
46
|
-
return "(dev)";
|
|
47
|
-
}
|
|
48
|
-
return "";
|
|
42
|
+
return `${COLORS.GREEN}\u279C${COLORS.RESET} Environments: ${envString}`;
|
|
49
43
|
}
|
|
50
44
|
function clearLine() {
|
|
51
45
|
process.stdout.write("\x1B[2K\r");
|
|
52
46
|
}
|
|
53
47
|
function biniEnvPlugin(options = {}) {
|
|
54
|
-
const {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
} = options;
|
|
48
|
+
const resolvedOptions = Object.freeze({
|
|
49
|
+
...DEFAULT_OPTIONS,
|
|
50
|
+
...options
|
|
51
|
+
});
|
|
52
|
+
const { enabled, clearViteHeader, logo } = resolvedOptions;
|
|
60
53
|
let config;
|
|
61
|
-
let mode = "dev";
|
|
62
54
|
let isPreviewMode = false;
|
|
63
55
|
let serverStarted = false;
|
|
64
56
|
let previewStarted = false;
|
|
65
57
|
return {
|
|
66
58
|
name: "vite-plugin-bini-env",
|
|
67
|
-
// Apply plugin conditions
|
|
68
59
|
apply: "serve",
|
|
69
|
-
// Get resolved config
|
|
70
60
|
configResolved(resolvedConfig) {
|
|
71
61
|
config = resolvedConfig;
|
|
72
|
-
if (resolvedConfig.command === "
|
|
73
|
-
mode = "prod";
|
|
74
|
-
} else if (resolvedConfig.command === "serve") {
|
|
62
|
+
if (resolvedConfig.command === "serve") {
|
|
75
63
|
isPreviewMode = process.env.VITE_PREVIEW === "true" || process.argv.includes("preview") || false;
|
|
76
|
-
mode = isPreviewMode ? "preview" : "dev";
|
|
77
64
|
}
|
|
78
65
|
},
|
|
79
|
-
// Configure server to modify the output
|
|
80
66
|
configureServer(server) {
|
|
81
67
|
if (!enabled) return;
|
|
82
68
|
const originalPrintUrls = server.printUrls;
|
|
@@ -86,13 +72,12 @@ function biniEnvPlugin(options = {}) {
|
|
|
86
72
|
if (clearViteHeader) {
|
|
87
73
|
clearLine();
|
|
88
74
|
}
|
|
89
|
-
const modeLabel = getModeLabel("serve", isPreviewMode);
|
|
90
75
|
console.log(`
|
|
91
|
-
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET}
|
|
76
|
+
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);
|
|
92
77
|
const found = detectEnvFiles(config.root);
|
|
93
78
|
if (found.length > 0) {
|
|
94
79
|
const envString = found.map((f) => f.name).join(", ");
|
|
95
|
-
console.log(` ${COLORS.GREEN}\
|
|
80
|
+
console.log(` ${COLORS.GREEN}\u279C${COLORS.RESET} Environments: ${envString}`);
|
|
96
81
|
}
|
|
97
82
|
if (!clearViteHeader) {
|
|
98
83
|
originalPrintUrls.call(server);
|
|
@@ -110,11 +95,9 @@ function biniEnvPlugin(options = {}) {
|
|
|
110
95
|
}
|
|
111
96
|
};
|
|
112
97
|
},
|
|
113
|
-
// Handle preview mode
|
|
114
98
|
configurePreviewServer(server) {
|
|
115
99
|
if (!enabled) return;
|
|
116
100
|
isPreviewMode = true;
|
|
117
|
-
mode = "preview";
|
|
118
101
|
const originalPrintUrls = server.printUrls;
|
|
119
102
|
server.printUrls = () => {
|
|
120
103
|
if (!previewStarted) {
|
|
@@ -127,7 +110,7 @@ function biniEnvPlugin(options = {}) {
|
|
|
127
110
|
const found = detectEnvFiles(config.root);
|
|
128
111
|
if (found.length > 0) {
|
|
129
112
|
const envString = found.map((f) => f.name).join(", ");
|
|
130
|
-
console.log(` ${COLORS.GREEN}\
|
|
113
|
+
console.log(` ${COLORS.GREEN}\u279C${COLORS.RESET} Environments: ${envString}`);
|
|
131
114
|
}
|
|
132
115
|
if (!clearViteHeader) {
|
|
133
116
|
originalPrintUrls.call(server);
|
|
@@ -146,28 +129,6 @@ function biniEnvPlugin(options = {}) {
|
|
|
146
129
|
}
|
|
147
130
|
};
|
|
148
131
|
},
|
|
149
|
-
// Handle build
|
|
150
|
-
buildStart() {
|
|
151
|
-
if (enabled && showEnvironmentsInBuild && config?.command === "build") {
|
|
152
|
-
const found = detectEnvFiles(config.root);
|
|
153
|
-
if (found.length > 0) {
|
|
154
|
-
console.log(`
|
|
155
|
-
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (building)`);
|
|
156
|
-
const envString = found.map((f) => f.name).join(", ");
|
|
157
|
-
console.log(` ${COLORS.GREEN}\u2713${COLORS.RESET} Environments: ${envString}
|
|
158
|
-
`);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
// Handle build completion
|
|
163
|
-
closeBundle() {
|
|
164
|
-
if (enabled && showEnvironmentsInBuild && config?.command === "build") {
|
|
165
|
-
console.log(`
|
|
166
|
-
${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} ${COLORS.GREEN}\u2713${COLORS.RESET} Build completed
|
|
167
|
-
`);
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
// Cleanup
|
|
171
132
|
buildEnd() {
|
|
172
133
|
serverStarted = false;
|
|
173
134
|
previewStarted = false;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { Plugin, ResolvedConfig } from 'vite';\r\n\r\n// Types\r\nexport interface BiniEnvPluginOptions {\r\n /**\r\n * Enable/disable the plugin\r\n * @default true\r\n */\r\n enabled?: boolean;\r\n \r\n /**\r\n * Remove Vite's default header\r\n * @default true\r\n */\r\n clearViteHeader?: boolean;\r\n \r\n /**\r\n * Custom logo/text to display\r\n * @default 'ß'\r\n */\r\n logo?: string;\r\n \r\n /**\r\n * Show environments in production build\r\n * @default true\r\n */\r\n showEnvironmentsInBuild?: boolean;\r\n}\r\n\r\nexport interface DetectedEnvFile {\r\n name: string;\r\n path: string;\r\n}\r\n\r\n// Constants\r\nconst BINI_LOGO = 'ß';\r\n\r\n// Color definitions\r\nconst COLORS = {\r\n CYAN: '\\x1b[36m',\r\n RESET: '\\x1b[0m',\r\n GREEN: '\\x1b[32m',\r\n YELLOW: '\\x1b[33m',\r\n DIM: '\\x1b[2m'\r\n} as const;\r\n\r\n/**\r\n * Detect which .env files exist in project root\r\n */\r\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\r\n const nodeEnv = process.env.NODE_ENV || 'development';\r\n\r\n // Check in priority order (what Next.js loads)\r\n const envFiles = [\r\n '.env.local',\r\n `.env.${nodeEnv}.local`,\r\n `.env.${nodeEnv}`,\r\n '.env'\r\n ];\r\n\r\n const found: DetectedEnvFile[] = [];\r\n\r\n for (const file of envFiles) {\r\n const filePath = path.join(projectRoot, file);\r\n if (fs.existsSync(filePath)) {\r\n found.push({\r\n name: file,\r\n path: filePath\r\n });\r\n }\r\n }\r\n\r\n return found;\r\n}\r\n\r\n/**\r\n * Format environment files for console display\r\n */\r\nexport function formatEnvFilesForDisplay(envFiles: DetectedEnvFile[]): string {\r\n if (envFiles.length === 0) {\r\n return '';\r\n }\r\n\r\n const envString = envFiles.map(f => f.name).join(', ');\r\n return `${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}`;\r\n}\r\n\r\n/**\r\n * Get mode label based on command and mode\r\n */\r\nfunction getModeLabel(command: string, isPreview: boolean = false): string {\r\n if (command === 'build') {\r\n return '(prod)';\r\n } else if (command === 'serve') {\r\n if (isPreview) {\r\n return '(preview)';\r\n }\r\n return '(dev)';\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Clear the current line in console\r\n */\r\nfunction clearLine(): void {\r\n process.stdout.write('\\x1b[2K\\r');\r\n}\r\n\r\n/**\r\n * Main plugin function\r\n */\r\nexport default function biniEnvPlugin(options: BiniEnvPluginOptions = {}): Plugin {\r\n const {\r\n enabled = true,\r\n clearViteHeader = true,\r\n logo = BINI_LOGO,\r\n showEnvironmentsInBuild = true\r\n } = options;\r\n\r\n let config: ResolvedConfig;\r\n let mode: 'dev' | 'preview' | 'prod' = 'dev';\r\n let isPreviewMode = false;\r\n let serverStarted = false;\r\n let previewStarted = false;\r\n\r\n return {\r\n name: 'vite-plugin-bini-env',\r\n \r\n // Apply plugin conditions\r\n apply: 'serve',\r\n \r\n // Get resolved config\r\n configResolved(resolvedConfig: ResolvedConfig) {\r\n config = resolvedConfig;\r\n \r\n if (resolvedConfig.command === 'build') {\r\n mode = 'prod';\r\n } else if (resolvedConfig.command === 'serve') {\r\n isPreviewMode = process.env.VITE_PREVIEW === 'true' || \r\n process.argv.includes('preview') ||\r\n false;\r\n mode = isPreviewMode ? 'preview' : 'dev';\r\n }\r\n },\r\n\r\n // Configure server to modify the output\r\n configureServer(server) {\r\n if (!enabled) return;\r\n\r\n // Store original printUrls\r\n const originalPrintUrls = server.printUrls;\r\n \r\n // Override printUrls method\r\n server.printUrls = () => {\r\n if (!serverStarted) {\r\n serverStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n // SIMPLIFIED: Show only ß Bini.js (dev) without version\r\n const modeLabel = getModeLabel('serve', isPreviewMode);\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} ${modeLabel}`);\r\n\r\n // Show environments if found\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n },\r\n\r\n // Handle preview mode\r\n configurePreviewServer(server) {\r\n if (!enabled) return;\r\n \r\n isPreviewMode = true;\r\n mode = 'preview';\r\n \r\n const originalPrintUrls = server.printUrls;\r\n \r\n server.printUrls = () => {\r\n if (!previewStarted) {\r\n previewStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n // SIMPLIFIED: Show only ß Bini.js (preview) without version\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\r\n\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n console.log('');\r\n }\r\n }\r\n };\r\n },\r\n\r\n // Handle build\r\n buildStart() {\r\n if (enabled && showEnvironmentsInBuild && config?.command === 'build') {\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n // SIMPLIFIED: Show only ß Bini.js (building) without version\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (building)`);\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}✓${COLORS.RESET} Environments: ${envString}\\n`);\r\n }\r\n }\r\n },\r\n\r\n // Handle build completion\r\n closeBundle() {\r\n if (enabled && showEnvironmentsInBuild && config?.command === 'build') {\r\n // SIMPLIFIED: Show only ß Bini.js ✓ Build completed without version\r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} ${COLORS.GREEN}✓${COLORS.RESET} Build completed\\n`);\r\n }\r\n },\r\n\r\n // Cleanup\r\n buildEnd() {\r\n serverStarted = false;\r\n previewStarted = false;\r\n }\r\n };\r\n}\r\n\r\n// Export types\r\nexport type { Plugin } from 'vite';"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { Plugin, ResolvedConfig } from 'vite';\r\n\r\n// Types\r\nexport interface BiniEnvPluginOptions {\r\n /**\r\n * Enable/disable the plugin\r\n * @default true\r\n * @readonly\r\n */\r\n readonly enabled?: boolean;\r\n \r\n /**\r\n * Remove Vite's default header\r\n * @default true\r\n * @readonly\r\n */\r\n readonly clearViteHeader?: boolean;\r\n \r\n /**\r\n * Custom logo/text to display\r\n * @default 'ß'\r\n * @readonly\r\n */\r\n readonly logo?: string;\r\n}\r\n\r\nexport interface DetectedEnvFile {\r\n readonly name: string;\r\n readonly path: string;\r\n}\r\n\r\n// Constants\r\nconst BINI_LOGO = 'ß' as const;\r\nconst DEFAULT_OPTIONS = {\r\n enabled: true,\r\n clearViteHeader: true,\r\n logo: BINI_LOGO,\r\n} as const;\r\n\r\n// Color definitions\r\nconst COLORS = {\r\n CYAN: '\\x1b[36m',\r\n RESET: '\\x1b[0m',\r\n GREEN: '\\x1b[32m',\r\n YELLOW: '\\x1b[33m',\r\n DIM: '\\x1b[2m'\r\n} as const;\r\n\r\n/**\r\n * Detect which .env files exist in project root\r\n */\r\nexport function detectEnvFiles(projectRoot: string = process.cwd()): DetectedEnvFile[] {\r\n const nodeEnv = process.env.NODE_ENV || 'development';\r\n\r\n const envFiles = [\r\n '.env.local',\r\n `.env.${nodeEnv}.local`,\r\n `.env.${nodeEnv}`,\r\n '.env'\r\n ] as const;\r\n\r\n const found: DetectedEnvFile[] = [];\r\n\r\n for (const file of envFiles) {\r\n const filePath = path.join(projectRoot, file);\r\n if (fs.existsSync(filePath)) {\r\n found.push({\r\n name: file,\r\n path: filePath\r\n });\r\n }\r\n }\r\n\r\n return found;\r\n}\r\n\r\n/**\r\n * Format environment files for console display\r\n */\r\nexport function formatEnvFilesForDisplay(envFiles: DetectedEnvFile[]): string {\r\n if (envFiles.length === 0) {\r\n return '';\r\n }\r\n\r\n const envString = envFiles.map(f => f.name).join(', ');\r\n return `${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`;\r\n}\r\n\r\n/**\r\n * Clear the current line in console\r\n */\r\nfunction clearLine(): void {\r\n process.stdout.write('\\x1b[2K\\r');\r\n}\r\n\r\n/**\r\n * Main plugin function\r\n */\r\nexport default function biniEnvPlugin(options: Readonly<BiniEnvPluginOptions> = {}): Plugin {\r\n // Merge with defaults — user cannot override core behaviour\r\n const resolvedOptions = Object.freeze({\r\n ...DEFAULT_OPTIONS,\r\n ...options,\r\n });\r\n\r\n const { enabled, clearViteHeader, logo } = resolvedOptions;\r\n\r\n let config: ResolvedConfig;\r\n let isPreviewMode = false;\r\n let serverStarted = false;\r\n let previewStarted = false;\r\n\r\n return {\r\n name: 'vite-plugin-bini-env',\r\n \r\n apply: 'serve',\r\n \r\n configResolved(resolvedConfig: ResolvedConfig) {\r\n config = resolvedConfig;\r\n \r\n if (resolvedConfig.command === 'serve') {\r\n isPreviewMode = process.env.VITE_PREVIEW === 'true' || \r\n process.argv.includes('preview') ||\r\n false;\r\n }\r\n },\r\n\r\n configureServer(server) {\r\n if (!enabled) return;\r\n\r\n const originalPrintUrls = server.printUrls;\r\n \r\n server.printUrls = () => {\r\n if (!serverStarted) {\r\n serverStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (dev)`);\r\n\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n },\r\n\r\n configurePreviewServer(server) {\r\n if (!enabled) return;\r\n \r\n isPreviewMode = true;\r\n \r\n const originalPrintUrls = server.printUrls;\r\n \r\n server.printUrls = () => {\r\n if (!previewStarted) {\r\n previewStarted = true;\r\n \r\n if (clearViteHeader) {\r\n clearLine();\r\n }\r\n \r\n console.log(`\\n ${COLORS.CYAN}${logo} Bini.js${COLORS.RESET} (preview)`);\r\n\r\n const found = detectEnvFiles(config.root);\r\n if (found.length > 0) {\r\n const envString = found.map(f => f.name).join(', ');\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Environments: ${envString}`);\r\n }\r\n \r\n if (!clearViteHeader) {\r\n originalPrintUrls.call(server);\r\n } else {\r\n const urls = server.resolvedUrls;\r\n if (urls) {\r\n if (urls.local.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Local: ${COLORS.CYAN}${urls.local[0]}${COLORS.RESET}`);\r\n }\r\n if (urls.network.length > 0) {\r\n console.log(` ${COLORS.GREEN}➜${COLORS.RESET} Network: ${COLORS.CYAN}${urls.network[0]}${COLORS.RESET}`);\r\n }\r\n }\r\n console.log('');\r\n }\r\n }\r\n };\r\n },\r\n\r\n buildEnd() {\r\n serverStarted = false;\r\n previewStarted = false;\r\n }\r\n };\r\n}\r\n\r\nexport type { Plugin } from 'vite';"],"mappings":";AACA,OAAO,QAAQ;AACf,OAAO,UAAU;AAiCjB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AAAA,EACtB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,MAAM;AACR;AAGA,IAAM,SAAS;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AACP;AAKO,SAAS,eAAe,cAAsB,QAAQ,IAAI,GAAsB;AACrF,QAAM,UAAU,QAAQ,IAAI,YAAY;AAExC,QAAM,WAAW;AAAA,IACf;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAA2B,CAAC;AAElC,aAAW,QAAQ,UAAU;AAC3B,UAAM,WAAW,KAAK,KAAK,aAAa,IAAI;AAC5C,QAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,yBAAyB,UAAqC;AAC5E,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AACrD,SAAO,GAAG,OAAO,KAAK,SAAI,OAAO,KAAK,kBAAkB,SAAS;AACnE;AAKA,SAAS,YAAkB;AACzB,UAAQ,OAAO,MAAM,WAAW;AAClC;AAKe,SAAR,cAA+B,UAA0C,CAAC,GAAW;AAE1F,QAAM,kBAAkB,OAAO,OAAO;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AAED,QAAM,EAAE,SAAS,iBAAiB,KAAK,IAAI;AAE3C,MAAI;AACJ,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AACpB,MAAI,iBAAiB;AAErB,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,OAAO;AAAA,IAEP,eAAe,gBAAgC;AAC7C,eAAS;AAET,UAAI,eAAe,YAAY,SAAS;AACtC,wBAAgB,QAAQ,IAAI,iBAAiB,UAC9B,QAAQ,KAAK,SAAS,SAAS,KAC/B;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,gBAAgB,QAAQ;AACtB,UAAI,CAAC,QAAS;AAEd,YAAM,oBAAoB,OAAO;AAEjC,aAAO,YAAY,MAAM;AACvB,YAAI,CAAC,eAAe;AAClB,0BAAgB;AAEhB,cAAI,iBAAiB;AACnB,sBAAU;AAAA,UACZ;AAEA,kBAAQ,IAAI;AAAA,IAAO,OAAO,IAAI,GAAG,IAAI,WAAW,OAAO,KAAK,QAAQ;AAEpE,gBAAM,QAAQ,eAAe,OAAO,IAAI;AACxC,cAAI,MAAM,SAAS,GAAG;AACpB,kBAAM,YAAY,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAClD,oBAAQ,IAAI,KAAK,OAAO,KAAK,SAAI,OAAO,KAAK,mBAAmB,SAAS,EAAE;AAAA,UAC7E;AAEA,cAAI,CAAC,iBAAiB;AACpB,8BAAkB,KAAK,MAAM;AAAA,UAC/B,OAAO;AACL,kBAAM,OAAO,OAAO;AACpB,gBAAI,MAAM;AACR,kBAAI,KAAK,MAAM,SAAS,GAAG;AACzB,wBAAQ,IAAI,KAAK,OAAO,KAAK,SAAI,OAAO,KAAK,cAAc,OAAO,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,GAAG,OAAO,KAAK,EAAE;AAAA,cACzG;AACA,kBAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,wBAAQ,IAAI,KAAK,OAAO,KAAK,SAAI,OAAO,KAAK,cAAc,OAAO,IAAI,GAAG,KAAK,QAAQ,CAAC,CAAC,GAAG,OAAO,KAAK,EAAE;AAAA,cAC3G;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,uBAAuB,QAAQ;AAC7B,UAAI,CAAC,QAAS;AAEd,sBAAgB;AAEhB,YAAM,oBAAoB,OAAO;AAEjC,aAAO,YAAY,MAAM;AACvB,YAAI,CAAC,gBAAgB;AACnB,2BAAiB;AAEjB,cAAI,iBAAiB;AACnB,sBAAU;AAAA,UACZ;AAEA,kBAAQ,IAAI;AAAA,IAAO,OAAO,IAAI,GAAG,IAAI,WAAW,OAAO,KAAK,YAAY;AAExE,gBAAM,QAAQ,eAAe,OAAO,IAAI;AACxC,cAAI,MAAM,SAAS,GAAG;AACpB,kBAAM,YAAY,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAClD,oBAAQ,IAAI,KAAK,OAAO,KAAK,SAAI,OAAO,KAAK,mBAAmB,SAAS,EAAE;AAAA,UAC7E;AAEA,cAAI,CAAC,iBAAiB;AACpB,8BAAkB,KAAK,MAAM;AAAA,UAC/B,OAAO;AACL,kBAAM,OAAO,OAAO;AACpB,gBAAI,MAAM;AACR,kBAAI,KAAK,MAAM,SAAS,GAAG;AACzB,wBAAQ,IAAI,KAAK,OAAO,KAAK,SAAI,OAAO,KAAK,cAAc,OAAO,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,GAAG,OAAO,KAAK,EAAE;AAAA,cACzG;AACA,kBAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,wBAAQ,IAAI,KAAK,OAAO,KAAK,SAAI,OAAO,KAAK,cAAc,OAAO,IAAI,GAAG,KAAK,QAAQ,CAAC,CAAC,GAAG,OAAO,KAAK,EAAE;AAAA,cAC3G;AAAA,YACF;AACA,oBAAQ,IAAI,EAAE;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW;AACT,sBAAgB;AAChB,uBAAiB;AAAA,IACnB;AAAA,EACF;AACF;","names":[]}
|