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.
- package/bin/validate.js +49 -583
- 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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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('
|
|
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
|
-
//
|
|
624
|
-
const
|
|
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
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
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);
|