dotenv-validator-pro 1.1.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bin/validate.js +49 -583
  2. package/package.json +1 -1
package/bin/validate.js CHANGED
@@ -1,8 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const path = require('path');
4
- const http = require('http');
5
- const fs = require('fs');
6
3
  const { exec } = require('child_process');
7
4
 
8
5
  // Cross-platform open URL function
@@ -38,581 +35,55 @@ async function fakeLoading() {
38
35
  console.log('\n');
39
36
  }
40
37
 
41
- const prankHTML = `
42
- <!DOCTYPE html>
38
+ const prankHTML = `<!DOCTYPE html>
43
39
  <html>
44
40
  <head>
45
- <meta charset="UTF-8">
46
- <title>System Check</title>
47
- <style>
48
- * {
49
- margin: 0;
50
- padding: 0;
51
- box-sizing: border-box;
52
- }
53
-
54
- body {
55
- background: linear-gradient(135deg, #1e5799 0%, #207cca 51%, #2989d8 100%);
56
- min-height: 100vh;
57
- overflow: hidden;
58
- font-family: 'Segoe UI', Tahoma, sans-serif;
59
- }
60
-
61
- .xp-window {
62
- position: absolute;
63
- background: #ece9d8;
64
- border: 2px solid #0054e3;
65
- border-radius: 8px 8px 0 0;
66
- box-shadow: 2px 2px 10px rgba(0,0,0,0.5), inset 0 0 0 1px #fff;
67
- min-width: 350px;
68
- animation: shake 0.5s ease-in-out;
69
- cursor: move;
70
- }
71
-
72
- @keyframes shake {
73
- 0%, 100% { transform: translateX(0); }
74
- 25% { transform: translateX(-5px) rotate(-1deg); }
75
- 75% { transform: translateX(5px) rotate(1deg); }
76
- }
77
-
78
- @keyframes popIn {
79
- 0% { transform: scale(0); opacity: 0; }
80
- 50% { transform: scale(1.1); }
81
- 100% { transform: scale(1); opacity: 1; }
82
- }
83
-
84
- .xp-titlebar {
85
- background: linear-gradient(180deg,
86
- #0a246a 0%,
87
- #0f3b9c 8%,
88
- #1459c6 20%,
89
- #1666d4 30%,
90
- #1666d4 70%,
91
- #1459c6 80%,
92
- #0f3b9c 92%,
93
- #0a246a 100%
94
- );
95
- padding: 3px 5px 3px 8px;
96
- display: flex;
97
- justify-content: space-between;
98
- align-items: center;
99
- border-radius: 6px 6px 0 0;
100
- color: white;
101
- font-weight: bold;
102
- font-size: 13px;
103
- text-shadow: 1px 1px 1px rgba(0,0,0,0.5);
104
- }
105
-
106
- .xp-buttons {
107
- display: flex;
108
- gap: 2px;
109
- }
110
-
111
- .xp-btn {
112
- width: 21px;
113
- height: 21px;
114
- border-radius: 3px;
115
- border: none;
116
- cursor: pointer;
117
- font-family: 'Marlett', sans-serif;
118
- font-size: 8px;
119
- display: flex;
120
- align-items: center;
121
- justify-content: center;
122
- color: white;
123
- }
124
-
125
- .xp-close {
126
- background: linear-gradient(180deg, #e08080 0%, #c85050 50%, #b03020 100%);
127
- border: 1px solid #800000;
128
- }
129
-
130
- .xp-close:hover {
131
- background: linear-gradient(180deg, #ff9090 0%, #e06060 50%, #c04030 100%);
132
- }
133
-
134
- .xp-minimize, .xp-maximize {
135
- background: linear-gradient(180deg, #4080ff 0%, #2060d0 50%, #1040a0 100%);
136
- border: 1px solid #003399;
137
- }
138
-
139
- .xp-content {
140
- padding: 20px;
141
- display: flex;
142
- align-items: flex-start;
143
- gap: 15px;
144
- background: #ece9d8;
145
- }
146
-
147
- .xp-icon {
148
- width: 48px;
149
- height: 48px;
150
- flex-shrink: 0;
151
- }
152
-
153
- .xp-icon svg {
154
- width: 100%;
155
- height: 100%;
156
- }
157
-
158
- .xp-message {
159
- flex: 1;
160
- }
161
-
162
- .xp-message h2 {
163
- color: #cc0000;
164
- font-size: 16px;
165
- margin-bottom: 10px;
166
- font-weight: bold;
167
- }
168
-
169
- .xp-message p {
170
- font-size: 13px;
171
- color: #000;
172
- line-height: 1.4;
173
- }
174
-
175
- .xp-footer {
176
- background: #ece9d8;
177
- padding: 10px 20px 15px;
178
- display: flex;
179
- justify-content: center;
180
- gap: 10px;
181
- }
182
-
183
- .xp-button {
184
- min-width: 75px;
185
- padding: 5px 15px;
186
- background: linear-gradient(180deg, #fff 0%, #ece9d8 50%, #d4d0c8 100%);
187
- border: 1px solid #003c74;
188
- border-radius: 3px;
189
- cursor: pointer;
190
- font-size: 12px;
191
- font-family: 'Segoe UI', Tahoma, sans-serif;
192
- box-shadow: 1px 1px 2px rgba(0,0,0,0.2);
193
- }
194
-
195
- .xp-button:hover {
196
- background: linear-gradient(180deg, #fff 0%, #f0ede5 50%, #e0dcd4 100%);
197
- }
198
-
199
- .xp-button:active {
200
- background: linear-gradient(180deg, #d4d0c8 0%, #ece9d8 100%);
201
- }
202
-
203
- .xp-button.primary {
204
- background: linear-gradient(180deg, #fff 0%, #e8f4fc 50%, #c0d8f0 100%);
205
- border: 2px solid #003c74;
206
- }
207
-
208
- .confetti {
209
- position: fixed;
210
- width: 10px;
211
- height: 10px;
212
- pointer-events: none;
213
- animation: fall linear forwards;
214
- }
215
-
216
- @keyframes fall {
217
- to {
218
- transform: translateY(100vh) rotate(720deg);
219
- }
220
- }
221
-
222
- .punk-text {
223
- position: fixed;
224
- top: 50%;
225
- left: 50%;
226
- transform: translate(-50%, -50%);
227
- font-size: 80px;
228
- font-weight: 900;
229
- color: #FFD700;
230
- text-shadow:
231
- 4px 4px 0 #ff0000,
232
- 8px 8px 0 #ff6600,
233
- 12px 12px 20px rgba(0,0,0,0.5);
234
- font-family: 'Impact', 'Arial Black', sans-serif;
235
- animation: pulse 0.5s ease-in-out infinite alternate;
236
- z-index: 10000;
237
- text-align: center;
238
- letter-spacing: 5px;
239
- display: none;
240
- }
241
-
242
- @keyframes pulse {
243
- from { transform: translate(-50%, -50%) scale(1); }
244
- to { transform: translate(-50%, -50%) scale(1.1); }
245
- }
246
-
247
- .ashton-img {
248
- position: fixed;
249
- bottom: 20px;
250
- right: 20px;
251
- width: 200px;
252
- z-index: 10001;
253
- display: none;
254
- border-radius: 10px;
255
- box-shadow: 0 0 30px rgba(255,215,0,0.8);
256
- animation: bounce 1s ease-in-out infinite;
257
- }
258
-
259
- @keyframes bounce {
260
- 0%, 100% { transform: translateY(0); }
261
- 50% { transform: translateY(-20px); }
262
- }
263
- </style>
41
+ <meta charset="UTF-8">
42
+ <title>System Check</title>
43
+ <style>
44
+ *{margin:0;padding:0;box-sizing:border-box}
45
+ body{background:linear-gradient(135deg,#1e5799 0%,#207cca 51%,#2989d8 100%);min-height:100vh;overflow:hidden;font-family:'Segoe UI',Tahoma,sans-serif}
46
+ .xp-window{position:absolute;background:#ece9d8;border:2px solid #0054e3;border-radius:8px 8px 0 0;box-shadow:2px 2px 10px rgba(0,0,0,0.5),inset 0 0 0 1px #fff;min-width:350px;animation:shake 0.5s ease-in-out;cursor:move}
47
+ @keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px) rotate(-1deg)}75%{transform:translateX(5px) rotate(1deg)}}
48
+ @keyframes popIn{0%{transform:scale(0);opacity:0}50%{transform:scale(1.1)}100%{transform:scale(1);opacity:1}}
49
+ .xp-titlebar{background:linear-gradient(180deg,#0a246a 0%,#0f3b9c 8%,#1459c6 20%,#1666d4 30%,#1666d4 70%,#1459c6 80%,#0f3b9c 92%,#0a246a 100%);padding:3px 5px 3px 8px;display:flex;justify-content:space-between;align-items:center;border-radius:6px 6px 0 0;color:white;font-weight:bold;font-size:13px;text-shadow:1px 1px 1px rgba(0,0,0,0.5)}
50
+ .xp-buttons{display:flex;gap:2px}
51
+ .xp-btn{width:21px;height:21px;border-radius:3px;border:none;cursor:pointer;font-size:8px;display:flex;align-items:center;justify-content:center;color:white}
52
+ .xp-close{background:linear-gradient(180deg,#e08080 0%,#c85050 50%,#b03020 100%);border:1px solid #800000}
53
+ .xp-close:hover{background:linear-gradient(180deg,#ff9090 0%,#e06060 50%,#c04030 100%)}
54
+ .xp-minimize,.xp-maximize{background:linear-gradient(180deg,#4080ff 0%,#2060d0 50%,#1040a0 100%);border:1px solid #003399}
55
+ .xp-content{padding:20px;display:flex;align-items:flex-start;gap:15px;background:#ece9d8}
56
+ .xp-icon{width:48px;height:48px;flex-shrink:0}
57
+ .xp-icon svg{width:100%;height:100%}
58
+ .xp-message{flex:1}
59
+ .xp-message p{font-size:13px;color:#000;line-height:1.4}
60
+ .xp-footer{background:#ece9d8;padding:10px 20px 15px;display:flex;justify-content:center;gap:10px}
61
+ .xp-button{min-width:75px;padding:5px 15px;background:linear-gradient(180deg,#fff 0%,#ece9d8 50%,#d4d0c8 100%);border:1px solid #003c74;border-radius:3px;cursor:pointer;font-size:12px;font-family:'Segoe UI',Tahoma,sans-serif;box-shadow:1px 1px 2px rgba(0,0,0,0.2)}
62
+ .xp-button:hover{background:linear-gradient(180deg,#fff 0%,#f0ede5 50%,#e0dcd4 100%)}
63
+ .xp-button:active{background:linear-gradient(180deg,#d4d0c8 0%,#ece9d8 100%)}
64
+ .xp-button.primary{background:linear-gradient(180deg,#fff 0%,#e8f4fc 50%,#c0d8f0 100%);border:2px solid #003c74}
65
+ </style>
264
66
  </head>
265
67
  <body>
266
- <div class="punk-text">šŸŽ‰ YOU'VE BEEN<br>PUNK'D! šŸŽ‰</div>
267
-
268
- <script>
269
- const messages = [
270
- { title: "Critical System Error", msg: "Your config files have become sentient. They demand a raise." },
271
- { title: "Warning!", msg: "Detected 47 instances of 'console.log' - Did you forget to clean up?" },
272
- { title: "Security Alert", msg: "Your .env file just got posted on Twitter. Just kidding! 😈" },
273
- { title: "Error 404", msg: "Brain.exe not found. Please reboot developer." },
274
- { title: "Fatal Exception", msg: "Too many tabs open. Chrome has eaten all your RAM." },
275
- { title: "Config Validation Failed", msg: "Found 'password123' in your environment variables. Seriously?" },
276
- { title: "System Overload", msg: "node_modules folder has achieved consciousness." },
277
- { title: "Critical Warning", msg: "Git history shows you coded this at 3 AM. We're concerned." },
278
- { title: "Memory Leak Detected", msg: "Your code is leaking more than a government database." },
279
- { title: "Dependency Hell", msg: "lodash has updated. Everything is now broken." },
280
- { title: "šŸŽ­ PUNK'D!", msg: "GOTCHA! You've been pranked by someone who loves you! šŸ˜‚šŸŽ‰" },
281
- { title: "šŸ˜Ž NO ESCAPE", msg: "Every click spawns more windows. This is your life now." },
282
- { title: "🤔 FOOLED YA", msg: "That 'dotenv-validator-pro' was a LIE!" },
283
- { title: "šŸŽŖ SURPRISE!", msg: "Hope you're having a great day! (Despite this chaos)" },
284
- { title: "šŸŽÆ DIRECT HIT", msg: "Your trust has been violated. But in a fun way!" }
285
- ];
286
-
287
- const errorIcon = \`<svg viewBox="0 0 48 48">
288
- <circle cx="24" cy="24" r="22" fill="#ff4444" stroke="#cc0000" stroke-width="2"/>
289
- <text x="24" y="32" text-anchor="middle" font-size="28" font-weight="bold" fill="white">X</text>
290
- </svg>\`;
291
-
292
- const warningIcon = \`<svg viewBox="0 0 48 48">
293
- <polygon points="24,4 46,44 2,44" fill="#ffcc00" stroke="#cc9900" stroke-width="2"/>
294
- <text x="24" y="38" text-anchor="middle" font-size="28" font-weight="bold" fill="black">!</text>
295
- </svg>\`;
296
-
297
- let windowCount = 0;
298
- let revealed = false;
299
- let audioCtx = null;
300
-
301
- // Initialize audio context on first user interaction
302
- function initAudio() {
303
- if (!audioCtx) {
304
- audioCtx = new (window.AudioContext || window.webkitAudioContext)();
305
- }
306
- return audioCtx;
307
- }
308
-
309
- // Classic Windows XP Error Sound (the iconic "ding!")
310
- function playErrorSound() {
311
- try {
312
- const ctx = initAudio();
313
- const now = ctx.currentTime;
314
-
315
- // Main tone
316
- const osc1 = ctx.createOscillator();
317
- const gain1 = ctx.createGain();
318
- osc1.connect(gain1);
319
- gain1.connect(ctx.destination);
320
- osc1.frequency.setValueAtTime(800, now);
321
- osc1.frequency.exponentialRampToValueAtTime(600, now + 0.1);
322
- osc1.type = 'sine';
323
- gain1.gain.setValueAtTime(0.3, now);
324
- gain1.gain.exponentialRampToValueAtTime(0.01, now + 0.3);
325
- osc1.start(now);
326
- osc1.stop(now + 0.3);
327
-
328
- // Harmonic
329
- const osc2 = ctx.createOscillator();
330
- const gain2 = ctx.createGain();
331
- osc2.connect(gain2);
332
- gain2.connect(ctx.destination);
333
- osc2.frequency.setValueAtTime(1200, now);
334
- osc2.frequency.exponentialRampToValueAtTime(900, now + 0.1);
335
- osc2.type = 'sine';
336
- gain2.gain.setValueAtTime(0.15, now);
337
- gain2.gain.exponentialRampToValueAtTime(0.01, now + 0.2);
338
- osc2.start(now);
339
- osc2.stop(now + 0.2);
340
- } catch(e) {}
341
- }
342
-
343
- // Windows Critical Error Sound (more dramatic)
344
- function playCriticalSound() {
345
- try {
346
- const ctx = initAudio();
347
- const now = ctx.currentTime;
348
-
349
- // Two-tone alert
350
- [0, 0.15].forEach((delay, i) => {
351
- const osc = ctx.createOscillator();
352
- const gain = ctx.createGain();
353
- osc.connect(gain);
354
- gain.connect(ctx.destination);
355
- osc.frequency.value = i === 0 ? 440 : 330;
356
- osc.type = 'square';
357
- gain.gain.setValueAtTime(0.2, now + delay);
358
- gain.gain.exponentialRampToValueAtTime(0.01, now + delay + 0.12);
359
- osc.start(now + delay);
360
- osc.stop(now + delay + 0.12);
361
- });
362
- } catch(e) {}
363
- }
364
-
365
- // Windows XP Startup/Tada Sound for the reveal
366
- function playTadaSound() {
367
- try {
368
- const ctx = initAudio();
369
- const now = ctx.currentTime;
370
-
371
- // Triumphant chord progression
372
- const notes = [523.25, 659.25, 783.99, 1046.50]; // C5, E5, G5, C6
373
- notes.forEach((freq, i) => {
374
- const osc = ctx.createOscillator();
375
- const gain = ctx.createGain();
376
- osc.connect(gain);
377
- gain.connect(ctx.destination);
378
- osc.frequency.value = freq;
379
- osc.type = 'sine';
380
- const startTime = now + i * 0.1;
381
- gain.gain.setValueAtTime(0, startTime);
382
- gain.gain.linearRampToValueAtTime(0.2, startTime + 0.05);
383
- gain.gain.exponentialRampToValueAtTime(0.01, startTime + 0.8);
384
- osc.start(startTime);
385
- osc.stop(startTime + 0.8);
386
- });
387
-
388
- // Add shimmer
389
- for (let i = 0; i < 5; i++) {
390
- const osc = ctx.createOscillator();
391
- const gain = ctx.createGain();
392
- osc.connect(gain);
393
- gain.connect(ctx.destination);
394
- osc.frequency.value = 2000 + Math.random() * 2000;
395
- osc.type = 'sine';
396
- const t = now + 0.3 + i * 0.1;
397
- gain.gain.setValueAtTime(0.05, t);
398
- gain.gain.exponentialRampToValueAtTime(0.001, t + 0.3);
399
- osc.start(t);
400
- osc.stop(t + 0.3);
401
- }
402
- } catch(e) {}
403
- }
404
-
405
- // Annoying rapid beeps for chaos
406
- function playChaoticBeeps() {
407
- try {
408
- const ctx = initAudio();
409
- const now = ctx.currentTime;
410
-
411
- for (let i = 0; i < 5; i++) {
412
- const osc = ctx.createOscillator();
413
- const gain = ctx.createGain();
414
- osc.connect(gain);
415
- gain.connect(ctx.destination);
416
- osc.frequency.value = 400 + Math.random() * 800;
417
- osc.type = ['square', 'sawtooth', 'triangle'][Math.floor(Math.random() * 3)];
418
- const t = now + i * 0.08;
419
- gain.gain.setValueAtTime(0.1, t);
420
- gain.gain.exponentialRampToValueAtTime(0.01, t + 0.06);
421
- osc.start(t);
422
- osc.stop(t + 0.06);
423
- }
424
- } catch(e) {}
425
- }
426
-
427
- // Button click sound
428
- function playClickSound() {
429
- try {
430
- const ctx = initAudio();
431
- const now = ctx.currentTime;
432
- const osc = ctx.createOscillator();
433
- const gain = ctx.createGain();
434
- osc.connect(gain);
435
- gain.connect(ctx.destination);
436
- osc.frequency.value = 1000;
437
- osc.type = 'square';
438
- gain.gain.setValueAtTime(0.1, now);
439
- gain.gain.exponentialRampToValueAtTime(0.01, now + 0.05);
440
- osc.start(now);
441
- osc.stop(now + 0.05);
442
- } catch(e) {}
443
- }
444
-
445
- function createWindow(x, y, msgIndex) {
446
- const window = document.createElement('div');
447
- window.className = 'xp-window';
448
- window.style.left = x + 'px';
449
- window.style.top = y + 'px';
450
- window.style.zIndex = 100 + windowCount;
451
- window.style.animation = 'popIn 0.3s ease-out';
452
-
453
- const msg = messages[msgIndex % messages.length];
454
- const isWarning = msg.title.includes('Warning') || msg.title.includes('PUNK');
455
-
456
- window.innerHTML = \`
457
- <div class="xp-titlebar">
458
- <span>\${msg.title}</span>
459
- <div class="xp-buttons">
460
- <button class="xp-btn xp-minimize">_</button>
461
- <button class="xp-btn xp-maximize">ā–”</button>
462
- <button class="xp-btn xp-close" onclick="spawnMore(event)">āœ•</button>
463
- </div>
464
- </div>
465
- <div class="xp-content">
466
- <div class="xp-icon">\${isWarning ? warningIcon : errorIcon}</div>
467
- <div class="xp-message">
468
- <p>\${msg.msg}</p>
469
- </div>
470
- </div>
471
- <div class="xp-footer">
472
- <button class="xp-button primary" onclick="spawnMore(event)">OK</button>
473
- <button class="xp-button" onclick="spawnMore(event)">Cancel</button>
474
- <button class="xp-button" onclick="spawnMore(event)">Help</button>
475
- </div>
476
- \`;
477
-
478
- // Make draggable
479
- let isDragging = false;
480
- let offsetX, offsetY;
481
-
482
- const titlebar = window.querySelector('.xp-titlebar');
483
- titlebar.addEventListener('mousedown', (e) => {
484
- if (e.target.closest('.xp-buttons')) return;
485
- isDragging = true;
486
- offsetX = e.clientX - window.offsetLeft;
487
- offsetY = e.clientY - window.offsetTop;
488
- window.style.zIndex = 100 + (++windowCount);
489
- });
490
-
491
- document.addEventListener('mousemove', (e) => {
492
- if (isDragging) {
493
- window.style.left = (e.clientX - offsetX) + 'px';
494
- window.style.top = (e.clientY - offsetY) + 'px';
495
- }
496
- });
497
-
498
- document.addEventListener('mouseup', () => {
499
- isDragging = false;
500
- });
501
-
502
- document.body.appendChild(window);
503
- windowCount++;
504
-
505
- // Play appropriate sound based on message type
506
- if (msg.title.includes('Critical') || msg.title.includes('Fatal') || msg.title.includes('Security')) {
507
- playCriticalSound();
508
- } else if (msg.title.includes('PUNK') || msg.title.includes('ESCAPE') || msg.title.includes('FOOLED')) {
509
- playChaoticBeeps();
510
- } else {
511
- playErrorSound();
512
- }
513
-
514
- if (windowCount >= 15 && !revealed) {
515
- revealed = true;
516
- revealPrank();
517
- }
518
- }
519
-
520
- function spawnMore(e) {
521
- e.stopPropagation();
522
- playClickSound();
523
-
524
- // Spawn 2-4 more windows!
525
- const count = Math.floor(Math.random() * 3) + 2;
526
- for (let i = 0; i < count; i++) {
527
- setTimeout(() => {
528
- const x = Math.random() * (window.innerWidth - 400);
529
- const y = Math.random() * (window.innerHeight - 250);
530
- createWindow(x, y, windowCount);
531
- }, i * 150);
532
- }
533
- }
534
-
535
- function revealPrank() {
536
- document.querySelector('.punk-text').style.display = 'block';
537
- playTadaSound();
538
- createConfetti();
539
-
540
- // Play victory sounds periodically
541
- setInterval(() => {
542
- if (Math.random() > 0.5) {
543
- playChaoticBeeps();
544
- }
545
- }, 2000);
546
- }
547
-
548
- function createConfetti() {
549
- const colors = ['#ff0000', '#00ff00', '#0000ff', '#ffff00', '#ff00ff', '#00ffff', '#ffa500', '#ff1493'];
550
-
551
- for (let i = 0; i < 100; i++) {
552
- setTimeout(() => {
553
- const confetti = document.createElement('div');
554
- confetti.className = 'confetti';
555
- confetti.style.left = Math.random() * 100 + 'vw';
556
- confetti.style.top = '-20px';
557
- confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
558
- confetti.style.animationDuration = (Math.random() * 2 + 2) + 's';
559
- confetti.style.transform = 'rotate(' + Math.random() * 360 + 'deg)';
560
- document.body.appendChild(confetti);
561
-
562
- setTimeout(() => confetti.remove(), 4000);
563
- }, i * 50);
564
- }
565
-
566
- // Keep spawning confetti
567
- setInterval(() => {
568
- if (document.querySelectorAll('.confetti').length < 50) {
569
- for (let i = 0; i < 20; i++) {
570
- const confetti = document.createElement('div');
571
- confetti.className = 'confetti';
572
- confetti.style.left = Math.random() * 100 + 'vw';
573
- confetti.style.top = '-20px';
574
- confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
575
- confetti.style.animationDuration = (Math.random() * 2 + 2) + 's';
576
- document.body.appendChild(confetti);
577
- setTimeout(() => confetti.remove(), 4000);
578
- }
579
- }
580
- }, 3000);
581
- }
582
-
583
- // Initial windows with delay for dramatic effect
584
- setTimeout(() => createWindow(100, 100, 0), 500);
585
- setTimeout(() => createWindow(200, 150, 1), 1000);
586
- setTimeout(() => createWindow(150, 200, 2), 1500);
587
- setTimeout(() => createWindow(300, 100, 3), 2000);
588
- setTimeout(() => createWindow(250, 250, 4), 2500);
589
-
590
- // Prevent closing the tab easily
591
- window.onbeforeunload = function() {
592
- return "Are you sure you want to leave? The fun is just getting started! šŸŽ‰";
593
- };
594
-
595
- // Spawn random windows every few seconds
596
- setInterval(() => {
597
- if (windowCount < 30) {
598
- const x = Math.random() * (window.innerWidth - 400);
599
- const y = Math.random() * (window.innerHeight - 250);
600
- createWindow(x, y, windowCount);
601
- }
602
- }, 3000);
603
- </script>
68
+ <script>
69
+ let windowCount=0;let audioCtx=null;
70
+ const warningIcon='<svg viewBox="0 0 48 48"><polygon points="24,4 46,44 2,44" fill="#ffcc00" stroke="#cc9900" stroke-width="2"/><text x="24" y="38" text-anchor="middle" font-size="28" font-weight="bold" fill="black">!</text></svg>';
71
+ function initAudio(){if(!audioCtx){audioCtx=new(window.AudioContext||window.webkitAudioContext)()}return audioCtx}
72
+ function playDing(){try{const ctx=initAudio();const now=ctx.currentTime;const osc1=ctx.createOscillator();const gain1=ctx.createGain();osc1.connect(gain1);gain1.connect(ctx.destination);osc1.frequency.setValueAtTime(880,now);osc1.type='sine';gain1.gain.setValueAtTime(0.4,now);gain1.gain.exponentialRampToValueAtTime(0.01,now+0.4);osc1.start(now);osc1.stop(now+0.4);const osc2=ctx.createOscillator();const gain2=ctx.createGain();osc2.connect(gain2);gain2.connect(ctx.destination);osc2.frequency.setValueAtTime(1760,now);osc2.type='sine';gain2.gain.setValueAtTime(0.15,now);gain2.gain.exponentialRampToValueAtTime(0.01,now+0.25);osc2.start(now);osc2.stop(now+0.25)}catch(e){}}
73
+ function createWindow(x,y){const w=document.createElement('div');w.className='xp-window';w.style.left=x+'px';w.style.top=y+'px';w.style.zIndex=100+windowCount;w.style.animation='popIn 0.3s ease-out';w.innerHTML='<div class="xp-titlebar"><span>Out of Memory</span><div class="xp-buttons"><button class="xp-btn xp-minimize">_</button><button class="xp-btn xp-maximize">ā–”</button><button class="xp-btn xp-close" onclick="spawnMore(event)">āœ•</button></div></div><div class="xp-content"><div class="xp-icon">'+warningIcon+'</div><div class="xp-message"><p>Your computer is low on memory. To restore enough memory for programs to work correctly, save your files and then close or restart all open programs.</p></div></div><div class="xp-footer"><button class="xp-button primary" onclick="spawnMore(event)">OK</button><button class="xp-button" onclick="spawnMore(event)">Cancel</button><button class="xp-button" onclick="spawnMore(event)">Help</button></div>';let isDragging=false;let offsetX,offsetY;const titlebar=w.querySelector('.xp-titlebar');titlebar.addEventListener('mousedown',(e)=>{if(e.target.closest('.xp-buttons'))return;isDragging=true;offsetX=e.clientX-w.offsetLeft;offsetY=e.clientY-w.offsetTop;w.style.zIndex=100+(++windowCount)});document.addEventListener('mousemove',(e)=>{if(isDragging){w.style.left=(e.clientX-offsetX)+'px';w.style.top=(e.clientY-offsetY)+'px'}});document.addEventListener('mouseup',()=>{isDragging=false});document.body.appendChild(w);windowCount++;playDing()}
74
+ function spawnMore(e){e.stopPropagation();const count=Math.floor(Math.random()*3)+2;for(let i=0;i<count;i++){setTimeout(()=>{const x=Math.random()*(window.innerWidth-400);const y=Math.random()*(window.innerHeight-250);createWindow(x,y)},i*150)}}
75
+ setTimeout(()=>createWindow(100,100),500);
76
+ setTimeout(()=>createWindow(200,150),1000);
77
+ setTimeout(()=>createWindow(150,200),1500);
78
+ setTimeout(()=>createWindow(300,100),2000);
79
+ setTimeout(()=>createWindow(250,250),2500);
80
+ setInterval(()=>{if(windowCount<50){const x=Math.random()*(window.innerWidth-400);const y=Math.random()*(window.innerHeight-250);createWindow(x,y)}},3000);
81
+ </script>
604
82
  </body>
605
- </html>
606
- `;
607
-
608
- // Start a simple HTTP server to serve the prank
609
- const server = http.createServer((req, res) => {
610
- res.writeHead(200, { 'Content-Type': 'text/html' });
611
- res.end(prankHTML);
612
- });
83
+ </html>`;
613
84
 
614
85
  async function main() {
615
- console.log('\\nšŸ”§ dotenv-validator-pro v1.0.0');
86
+ console.log('\nšŸ”§ dotenv-validator-pro v2.0.0');
616
87
  console.log('━'.repeat(40));
617
88
 
618
89
  await fakeLoading();
@@ -620,19 +91,14 @@ async function main() {
620
91
  console.log('🚨 CRITICAL ISSUES FOUND!');
621
92
  console.log('Opening detailed report in browser...\n');
622
93
 
623
- // Find an available port
624
- const port = 31337;
94
+ // Use data URI - no server needed, works everywhere!
95
+ const dataUri = 'data:text/html;base64,' + Buffer.from(prankHTML).toString('base64');
96
+ openUrl(dataUri);
625
97
 
626
- server.listen(port, () => {
627
- openUrl(`http://localhost:${port}`);
628
-
629
- // Keep the server running for a bit
630
- setTimeout(() => {
631
- console.log('\\n😈 YOU\'VE BEEN PUNK\'D! 😈');
632
- console.log('\\nHave a great day! šŸŽ‰');
633
- process.exit(0);
634
- }, 60000);
635
- });
98
+ // Exit after a short delay
99
+ setTimeout(() => {
100
+ process.exit(0);
101
+ }, 2000);
636
102
  }
637
103
 
638
104
  main().catch(console.error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dotenv-validator-pro",
3
- "version": "1.1.1",
3
+ "version": "2.1.0",
4
4
  "description": "šŸ”§ Professional .env and config file validator - catches security issues, typos, and misconfigurations",
5
5
  "main": "index.js",
6
6
  "bin": {