@mathiscode/pucc 1.0.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/README.md +314 -0
- package/dist/commands/about.d.ts +6 -0
- package/dist/commands/about.d.ts.map +1 -0
- package/dist/commands/echo.d.ts +3 -0
- package/dist/commands/echo.d.ts.map +1 -0
- package/dist/commands/help.d.ts +6 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/components/ShellTerminal.d.ts +73 -0
- package/dist/components/ShellTerminal.d.ts.map +1 -0
- package/dist/components/TerminalLogger.d.ts +12 -0
- package/dist/components/TerminalLogger.d.ts.map +1 -0
- package/dist/core/CommandParser.d.ts +17 -0
- package/dist/core/CommandParser.d.ts.map +1 -0
- package/dist/core/DevToolsShell.d.ts +38 -0
- package/dist/core/DevToolsShell.d.ts.map +1 -0
- package/dist/core/Pucc.d.ts +74 -0
- package/dist/core/Pucc.d.ts.map +1 -0
- package/dist/demo.css +349 -0
- package/dist/devtools-shell.esm.js +243 -0
- package/dist/devtools-shell.esm.js.map +7 -0
- package/dist/devtools-shell.js +242 -0
- package/dist/devtools-shell.js.map +7 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.html +285 -0
- package/dist/pucc.css +253 -0
- package/dist/pucc.css.map +7 -0
- package/dist/pucc.esm.css +253 -0
- package/dist/pucc.esm.css.map +7 -0
- package/dist/pucc.esm.js +10619 -0
- package/dist/pucc.esm.js.map +7 -0
- package/dist/pucc.js +10616 -0
- package/dist/pucc.js.map +7 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +64 -0
package/dist/demo.css
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--primary: #6366f1;
|
|
3
|
+
--primary-dark: #4f46e5;
|
|
4
|
+
--primary-light: #818cf8;
|
|
5
|
+
--bg: #0f172a;
|
|
6
|
+
--bg-card: #1e293b;
|
|
7
|
+
--bg-card-hover: #334155;
|
|
8
|
+
--text: #f1f5f9;
|
|
9
|
+
--text-muted: #94a3b8;
|
|
10
|
+
--border: #334155;
|
|
11
|
+
--code-bg: #0f172a;
|
|
12
|
+
--accent: #10b981;
|
|
13
|
+
--accent-hover: #059669;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
* {
|
|
17
|
+
box-sizing: border-box;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
html, body {
|
|
21
|
+
margin: 0;
|
|
22
|
+
padding: 0;
|
|
23
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
|
|
24
|
+
height: 100%;
|
|
25
|
+
width: 100%;
|
|
26
|
+
background: var(--bg);
|
|
27
|
+
color: var(--text);
|
|
28
|
+
line-height: 1.6;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
body {
|
|
32
|
+
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
|
|
33
|
+
min-height: 100vh;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
a:not(.github-button),
|
|
37
|
+
a:not(.github-button):visited {
|
|
38
|
+
color: var(--primary);
|
|
39
|
+
text-decoration: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
a:not(.github-button):hover {
|
|
43
|
+
text-decoration: underline;
|
|
44
|
+
color: var(--primary-light);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.github-button {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
gap: 0.5em;
|
|
51
|
+
background: linear-gradient(90deg, var(--primary-dark) 0%, var(--accent) 100%);
|
|
52
|
+
color: var(--text);
|
|
53
|
+
padding: 0.6em 1.3em;
|
|
54
|
+
margin-bottom: 1rem;
|
|
55
|
+
border-radius: 999px;
|
|
56
|
+
font-weight: 600;
|
|
57
|
+
box-shadow: 0 2px 12px 0 rgba(99, 102, 241, 0.13);
|
|
58
|
+
text-decoration: none;
|
|
59
|
+
transition:
|
|
60
|
+
background 0.18s cubic-bezier(.7,.3,.4,.8),
|
|
61
|
+
color 0.18s cubic-bezier(.7,.3,.4,.8),
|
|
62
|
+
box-shadow 0.18s;
|
|
63
|
+
border: none;
|
|
64
|
+
outline: none;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.github-button:hover, .github-button:focus {
|
|
68
|
+
background: linear-gradient(90deg, var(--primary-light) 0%, var(--accent-hover) 100%);
|
|
69
|
+
color: var(--bg);
|
|
70
|
+
box-shadow: 0 4px 18px 0 rgba(16, 185, 129, 0.23);
|
|
71
|
+
text-decoration: none;
|
|
72
|
+
outline: 2px solid var(--accent);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.github-button svg {
|
|
76
|
+
flex-shrink: 0;
|
|
77
|
+
margin-right: 0.3em;
|
|
78
|
+
transition: transform 0.18s cubic-bezier(.7,.3,.4,.8);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.github-button:hover svg, .github-button:focus svg {
|
|
82
|
+
transform: scale(1.13) rotate(-8deg);
|
|
83
|
+
filter: drop-shadow(0 0 5px var(--accent));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.container {
|
|
87
|
+
max-width: 1200px;
|
|
88
|
+
margin: 0 auto;
|
|
89
|
+
padding: 2rem;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.hero {
|
|
93
|
+
text-align: center;
|
|
94
|
+
padding: 4rem 2rem;
|
|
95
|
+
background: linear-gradient(135deg, rgba(99, 102, 241, 0.1) 0%, rgba(16, 185, 129, 0.1) 100%);
|
|
96
|
+
border-radius: 1rem;
|
|
97
|
+
margin-bottom: 3rem;
|
|
98
|
+
border: 1px solid var(--border);
|
|
99
|
+
position: relative;
|
|
100
|
+
overflow: hidden;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.hero::before {
|
|
104
|
+
content: '';
|
|
105
|
+
position: absolute;
|
|
106
|
+
top: 0;
|
|
107
|
+
left: 0;
|
|
108
|
+
right: 0;
|
|
109
|
+
bottom: 0;
|
|
110
|
+
background: radial-gradient(circle at 30% 50%, rgba(99, 102, 241, 0.15) 0%, transparent 50%);
|
|
111
|
+
pointer-events: none;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.hero h1 {
|
|
115
|
+
font-size: 4rem;
|
|
116
|
+
font-weight: 800;
|
|
117
|
+
margin: 0 0 1rem 0;
|
|
118
|
+
background: linear-gradient(135deg, var(--primary-light) 0%, var(--accent) 100%);
|
|
119
|
+
-webkit-background-clip: text;
|
|
120
|
+
-webkit-text-fill-color: transparent;
|
|
121
|
+
background-clip: text;
|
|
122
|
+
position: relative;
|
|
123
|
+
z-index: 1;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.hero h2 {
|
|
127
|
+
font-size: 1.5rem;
|
|
128
|
+
font-weight: 400;
|
|
129
|
+
color: var(--text-muted);
|
|
130
|
+
margin: 0 0 1.5rem 0;
|
|
131
|
+
position: relative;
|
|
132
|
+
z-index: 1;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.hero p {
|
|
136
|
+
font-size: 1.125rem;
|
|
137
|
+
color: var(--text);
|
|
138
|
+
max-width: 700px;
|
|
139
|
+
margin: 0 auto;
|
|
140
|
+
position: relative;
|
|
141
|
+
z-index: 1;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.content-grid {
|
|
145
|
+
display: grid;
|
|
146
|
+
grid-template-columns: repeat(2, 1fr);
|
|
147
|
+
gap: 2rem;
|
|
148
|
+
margin-bottom: 3rem;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.card {
|
|
152
|
+
background: var(--bg-card);
|
|
153
|
+
border: 1px solid var(--border);
|
|
154
|
+
border-radius: 0.75rem;
|
|
155
|
+
padding: 2rem;
|
|
156
|
+
transition: all 0.3s ease;
|
|
157
|
+
position: relative;
|
|
158
|
+
overflow: hidden;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.card::before {
|
|
162
|
+
content: '';
|
|
163
|
+
position: absolute;
|
|
164
|
+
top: 0;
|
|
165
|
+
left: 0;
|
|
166
|
+
right: 0;
|
|
167
|
+
height: 3px;
|
|
168
|
+
background: linear-gradient(90deg, var(--primary) 0%, var(--accent) 100%);
|
|
169
|
+
transform: scaleX(0);
|
|
170
|
+
transition: transform 0.3s ease;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.card:hover {
|
|
174
|
+
transform: translateY(-4px);
|
|
175
|
+
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
|
|
176
|
+
border-color: var(--primary);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.card:hover::before {
|
|
180
|
+
transform: scaleX(1);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.card h2 {
|
|
184
|
+
font-size: 1.75rem;
|
|
185
|
+
font-weight: 700;
|
|
186
|
+
margin: 0 0 1rem 0;
|
|
187
|
+
color: var(--text);
|
|
188
|
+
display: flex;
|
|
189
|
+
align-items: center;
|
|
190
|
+
gap: 0.5rem;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.card h2::before {
|
|
194
|
+
content: '';
|
|
195
|
+
width: 4px;
|
|
196
|
+
height: 1.5rem;
|
|
197
|
+
background: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%);
|
|
198
|
+
border-radius: 2px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.card p {
|
|
202
|
+
color: var(--text-muted);
|
|
203
|
+
margin: 0 0 1.5rem 0;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.card p:last-child {
|
|
207
|
+
margin-bottom: 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
pre {
|
|
211
|
+
background: var(--code-bg);
|
|
212
|
+
border: 1px solid var(--border);
|
|
213
|
+
border-radius: 0.5rem;
|
|
214
|
+
padding: 1.25rem;
|
|
215
|
+
overflow-x: auto;
|
|
216
|
+
margin: 1rem 0;
|
|
217
|
+
position: relative;
|
|
218
|
+
font-family: 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace;
|
|
219
|
+
font-size: 0.9rem;
|
|
220
|
+
line-height: 1.6;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
pre code {
|
|
224
|
+
color: var(--text);
|
|
225
|
+
background: transparent;
|
|
226
|
+
padding: 0;
|
|
227
|
+
border-radius: 0;
|
|
228
|
+
font-size: inherit;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
code {
|
|
232
|
+
background: rgba(99, 102, 241, 0.15);
|
|
233
|
+
color: var(--primary-light);
|
|
234
|
+
padding: 0.2em 0.4em;
|
|
235
|
+
border-radius: 0.25rem;
|
|
236
|
+
font-family: 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace;
|
|
237
|
+
font-size: 0.9em;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
pre code {
|
|
241
|
+
background: transparent;
|
|
242
|
+
color: inherit;
|
|
243
|
+
padding: 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.terminal-container {
|
|
247
|
+
margin-top: 3rem;
|
|
248
|
+
background: var(--bg-card);
|
|
249
|
+
border: 1px solid var(--border);
|
|
250
|
+
border-radius: 0.75rem;
|
|
251
|
+
padding: 1.5rem;
|
|
252
|
+
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.terminal-container h2 {
|
|
256
|
+
font-size: 1.5rem;
|
|
257
|
+
font-weight: 600;
|
|
258
|
+
margin: 0 0 1rem 0;
|
|
259
|
+
color: var(--text);
|
|
260
|
+
display: flex;
|
|
261
|
+
align-items: center;
|
|
262
|
+
gap: 0.5rem;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.terminal-container h2::before {
|
|
266
|
+
content: '▶';
|
|
267
|
+
color: var(--accent);
|
|
268
|
+
font-size: 1rem;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
pucc-terminal {
|
|
272
|
+
border-radius: 0.5rem;
|
|
273
|
+
overflow: hidden;
|
|
274
|
+
box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
@media (max-width: 768px) {
|
|
278
|
+
.hero h1 {
|
|
279
|
+
font-size: 2.5rem;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.hero h2 {
|
|
283
|
+
font-size: 1.25rem;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.content-grid {
|
|
287
|
+
grid-template-columns: 1fr;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.container {
|
|
291
|
+
padding: 1rem;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.hero {
|
|
295
|
+
padding: 2rem 1rem;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.badge {
|
|
300
|
+
display: inline-block;
|
|
301
|
+
background: rgba(16, 185, 129, 0.2);
|
|
302
|
+
color: var(--accent);
|
|
303
|
+
padding: 0.25rem 0.75rem;
|
|
304
|
+
border-radius: 9999px;
|
|
305
|
+
font-size: 0.75rem;
|
|
306
|
+
font-weight: 600;
|
|
307
|
+
margin-left: 0.5rem;
|
|
308
|
+
border: 1px solid rgba(16, 185, 129, 0.3);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
kbd {
|
|
312
|
+
display: inline-block;
|
|
313
|
+
padding: 0.25rem 0.5rem;
|
|
314
|
+
font-family: 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace;
|
|
315
|
+
font-size: 0.85em;
|
|
316
|
+
font-weight: 600;
|
|
317
|
+
line-height: 1;
|
|
318
|
+
color: var(--text);
|
|
319
|
+
background: var(--bg);
|
|
320
|
+
border: 1px solid var(--border);
|
|
321
|
+
border-radius: 0.25rem;
|
|
322
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
|
|
323
|
+
margin: 0 0.125rem;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
#dropdown-terminal {
|
|
327
|
+
min-height: 80px;
|
|
328
|
+
display: flex;
|
|
329
|
+
align-items: center;
|
|
330
|
+
justify-content: center;
|
|
331
|
+
padding: 2rem;
|
|
332
|
+
background: rgba(99, 102, 241, 0.05);
|
|
333
|
+
border: 2px dashed var(--border);
|
|
334
|
+
border-radius: 0.5rem;
|
|
335
|
+
color: var(--text-muted);
|
|
336
|
+
font-size: 0.9rem;
|
|
337
|
+
text-align: center;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
#dropdown-terminal:has(pucc-terminal) {
|
|
341
|
+
padding: 0;
|
|
342
|
+
background: transparent;
|
|
343
|
+
border: none;
|
|
344
|
+
min-height: 0;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
#dropdown-terminal:has(pucc-terminal) p {
|
|
348
|
+
display: none;
|
|
349
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/*! devtools-shell v1.0.0 */
|
|
2
|
+
|
|
3
|
+
// src/core/CommandParser.ts
|
|
4
|
+
var CommandParser = class {
|
|
5
|
+
/**
|
|
6
|
+
* Parse a command string into structured arguments
|
|
7
|
+
*/
|
|
8
|
+
static parse(input) {
|
|
9
|
+
const args = { _: [] };
|
|
10
|
+
const trimmed = input.trim();
|
|
11
|
+
if (!trimmed) {
|
|
12
|
+
return args;
|
|
13
|
+
}
|
|
14
|
+
let i = 0;
|
|
15
|
+
const length = trimmed.length;
|
|
16
|
+
while (i < length) {
|
|
17
|
+
while (i < length && /\s/.test(trimmed[i])) {
|
|
18
|
+
i++;
|
|
19
|
+
}
|
|
20
|
+
if (i >= length)
|
|
21
|
+
break;
|
|
22
|
+
const keyMatch = trimmed.slice(i).match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*=/);
|
|
23
|
+
if (keyMatch) {
|
|
24
|
+
const key = keyMatch[1];
|
|
25
|
+
i += keyMatch[0].length;
|
|
26
|
+
while (i < length && /\s/.test(trimmed[i])) {
|
|
27
|
+
i++;
|
|
28
|
+
}
|
|
29
|
+
let value = "";
|
|
30
|
+
let inQuotes = false;
|
|
31
|
+
let quoteChar = "";
|
|
32
|
+
if (i < length && (trimmed[i] === '"' || trimmed[i] === "'")) {
|
|
33
|
+
inQuotes = true;
|
|
34
|
+
quoteChar = trimmed[i];
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
while (i < length) {
|
|
38
|
+
const char = trimmed[i];
|
|
39
|
+
if (inQuotes) {
|
|
40
|
+
if (char === quoteChar) {
|
|
41
|
+
i++;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
value += char;
|
|
45
|
+
} else {
|
|
46
|
+
if (/\s/.test(char)) {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
value += char;
|
|
50
|
+
}
|
|
51
|
+
i++;
|
|
52
|
+
}
|
|
53
|
+
if (value === "true") {
|
|
54
|
+
args[key] = true;
|
|
55
|
+
} else if (value === "false") {
|
|
56
|
+
args[key] = false;
|
|
57
|
+
} else if (/^-?\d+$/.test(value)) {
|
|
58
|
+
args[key] = parseInt(value, 10);
|
|
59
|
+
} else if (/^-?\d*\.\d+$/.test(value)) {
|
|
60
|
+
args[key] = parseFloat(value);
|
|
61
|
+
} else {
|
|
62
|
+
args[key] = value;
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
let arg = "";
|
|
66
|
+
let inQuotes = false;
|
|
67
|
+
let quoteChar = "";
|
|
68
|
+
while (i < length) {
|
|
69
|
+
const char = trimmed[i];
|
|
70
|
+
if (!inQuotes && (char === '"' || char === "'")) {
|
|
71
|
+
inQuotes = true;
|
|
72
|
+
quoteChar = char;
|
|
73
|
+
i++;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (inQuotes && char === quoteChar) {
|
|
77
|
+
inQuotes = false;
|
|
78
|
+
i++;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
if (!inQuotes && /\s/.test(char)) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
arg += char;
|
|
85
|
+
i++;
|
|
86
|
+
}
|
|
87
|
+
if (arg) {
|
|
88
|
+
args._.push(arg);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return args;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// src/commands/help.ts
|
|
97
|
+
var helpCommand = (_args, shell2) => {
|
|
98
|
+
if (!shell2) {
|
|
99
|
+
console.error("DevToolsShell instance not available");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const commands = shell2.getCommands();
|
|
103
|
+
if (commands.length === 0) {
|
|
104
|
+
console.log("No commands registered.");
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
console.log("\n%cAvailable Commands:", "font-weight: bold; font-size: 14px;");
|
|
108
|
+
console.log("\u2500".repeat(50));
|
|
109
|
+
commands.forEach((cmd) => {
|
|
110
|
+
console.log(
|
|
111
|
+
`%c$${cmd.name}%c - ${cmd.description}`,
|
|
112
|
+
"color: #4CAF50; font-weight: bold;",
|
|
113
|
+
"color: inherit;"
|
|
114
|
+
);
|
|
115
|
+
});
|
|
116
|
+
console.log("\u2500".repeat(50));
|
|
117
|
+
console.log(`Total: ${commands.length} command(s)`);
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// src/commands/about.ts
|
|
121
|
+
var aboutCommand = () => {
|
|
122
|
+
console.log("%cDevTools Shell", "font-size: 20px; font-weight: bold; color: #2196F3;");
|
|
123
|
+
console.log("\u2500".repeat(50));
|
|
124
|
+
console.log("Version: 1.0.0");
|
|
125
|
+
console.log("A browser console command system library");
|
|
126
|
+
console.log("Built with TypeScript and esbuild");
|
|
127
|
+
console.log("\u2500".repeat(50));
|
|
128
|
+
console.log(
|
|
129
|
+
"Use %c$help%c to see available commands",
|
|
130
|
+
"color: #4CAF50; font-weight: bold;",
|
|
131
|
+
"color: inherit;"
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// src/core/DevToolsShell.ts
|
|
136
|
+
var DevToolsShell = class {
|
|
137
|
+
constructor() {
|
|
138
|
+
this.commands = /* @__PURE__ */ new Map();
|
|
139
|
+
this.initialized = false;
|
|
140
|
+
this.registerBuiltInCommands();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Register a custom command
|
|
144
|
+
*/
|
|
145
|
+
addCommand(name, handler, description) {
|
|
146
|
+
if (!name || typeof name !== "string") {
|
|
147
|
+
throw new Error("Command name must be a non-empty string");
|
|
148
|
+
}
|
|
149
|
+
if (name.startsWith("$")) {
|
|
150
|
+
throw new Error("Command name should not include the $ prefix");
|
|
151
|
+
}
|
|
152
|
+
if (typeof handler !== "function") {
|
|
153
|
+
throw new Error("Command handler must be a function");
|
|
154
|
+
}
|
|
155
|
+
if (this.commands.has(name)) {
|
|
156
|
+
console.warn(`Command "${name}" already exists. Overwriting...`);
|
|
157
|
+
}
|
|
158
|
+
this.commands.set(name, {
|
|
159
|
+
name,
|
|
160
|
+
description: description || "No description provided",
|
|
161
|
+
handler
|
|
162
|
+
});
|
|
163
|
+
this.attachCommandToWindow(name);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Execute a command by name with arguments
|
|
167
|
+
*/
|
|
168
|
+
execute(commandName, input = "") {
|
|
169
|
+
const command = this.commands.get(commandName);
|
|
170
|
+
if (!command) {
|
|
171
|
+
console.error(`Command "${commandName}" not found. Use $help to see available commands.`);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const args = CommandParser.parse(input);
|
|
176
|
+
const result = command.handler(args, this);
|
|
177
|
+
if (result instanceof Promise) {
|
|
178
|
+
result.catch((error) => {
|
|
179
|
+
console.error(`Error executing command "${commandName}":`, error);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
} catch (error) {
|
|
183
|
+
console.error(`Error executing command "${commandName}":`, error);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get all registered commands
|
|
188
|
+
*/
|
|
189
|
+
getCommands() {
|
|
190
|
+
return Array.from(this.commands.values());
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get a specific command by name
|
|
194
|
+
*/
|
|
195
|
+
getCommand(name) {
|
|
196
|
+
return this.commands.get(name);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Initialize the shell and attach to window
|
|
200
|
+
*/
|
|
201
|
+
initialize() {
|
|
202
|
+
if (this.initialized) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
this.commands.forEach((_, name) => {
|
|
206
|
+
this.attachCommandToWindow(name);
|
|
207
|
+
});
|
|
208
|
+
this.initialized = true;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Register built-in commands
|
|
212
|
+
*/
|
|
213
|
+
registerBuiltInCommands() {
|
|
214
|
+
this.addCommand("help", helpCommand, "Display all available commands");
|
|
215
|
+
this.addCommand("about", aboutCommand, "Show library information");
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Attach a command to window as $commandName
|
|
219
|
+
*/
|
|
220
|
+
attachCommandToWindow(name) {
|
|
221
|
+
const windowName = `$${name}`;
|
|
222
|
+
window[windowName] = (...args) => {
|
|
223
|
+
const input = args.length > 0 ? args.join(" ") : "";
|
|
224
|
+
this.execute(name, input);
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
// src/index.ts
|
|
230
|
+
var shell = new DevToolsShell();
|
|
231
|
+
if (typeof window !== "undefined") {
|
|
232
|
+
shell.initialize();
|
|
233
|
+
window.DevToolsShell = shell;
|
|
234
|
+
Promise.resolve().then(() => {
|
|
235
|
+
if (window.DevToolsShell !== shell) {
|
|
236
|
+
window.DevToolsShell = shell;
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
export {
|
|
241
|
+
DevToolsShell
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=devtools-shell.esm.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/CommandParser.ts", "../src/commands/help.ts", "../src/commands/about.ts", "../src/core/DevToolsShell.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ParsedArgs } from '../types';\n\n/**\n * Parses command strings into structured arguments\n * Supports both positional arguments and key=value pairs\n *\n * Examples:\n * - `$new customer` \u2192 `{ _: ['customer'] }`\n * - `name=\"John Smith\" balance=5400` \u2192 `{ name: \"John Smith\", balance: 5400 }`\n * - `$new customer name=\"John\"` \u2192 `{ _: ['customer'], name: \"John\" }`\n */\nexport class CommandParser {\n /**\n * Parse a command string into structured arguments\n */\n static parse(input: string): ParsedArgs {\n const args: ParsedArgs = { _: [] };\n const trimmed = input.trim();\n\n if (!trimmed) {\n return args;\n }\n\n let i = 0;\n const length = trimmed.length;\n\n while (i < length) {\n // Skip whitespace\n while (i < length && /\\s/.test(trimmed[i])) {\n i++;\n }\n\n if (i >= length) break;\n\n // Check if this looks like a key=value pair (starts with identifier followed by =)\n const keyMatch = trimmed.slice(i).match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*=/);\n \n if (keyMatch) {\n const key = keyMatch[1];\n i += keyMatch[0].length; // Move past \"key=\"\n \n // Skip whitespace after =\n while (i < length && /\\s/.test(trimmed[i])) {\n i++;\n }\n\n // Parse the value (may be quoted or unquoted)\n let value = '';\n let inQuotes = false;\n let quoteChar = '';\n \n if (i < length && (trimmed[i] === '\"' || trimmed[i] === \"'\")) {\n inQuotes = true;\n quoteChar = trimmed[i];\n i++; // Skip opening quote\n }\n\n while (i < length) {\n const char = trimmed[i];\n \n if (inQuotes) {\n if (char === quoteChar) {\n i++; // Skip closing quote\n break;\n }\n value += char;\n } else {\n // Unquoted value - stop at whitespace or end\n if (/\\s/.test(char)) {\n break;\n }\n value += char;\n }\n i++;\n }\n\n // Try to parse as number or boolean\n if (value === 'true') {\n args[key] = true;\n } else if (value === 'false') {\n args[key] = false;\n } else if (/^-?\\d+$/.test(value)) {\n args[key] = parseInt(value, 10);\n } else if (/^-?\\d*\\.\\d+$/.test(value)) {\n args[key] = parseFloat(value);\n } else {\n args[key] = value;\n }\n } else {\n // Positional argument\n let arg = '';\n let inQuotes = false;\n let quoteChar = '';\n \n while (i < length) {\n const char = trimmed[i];\n \n if (!inQuotes && (char === '\"' || char === \"'\")) {\n inQuotes = true;\n quoteChar = char;\n i++;\n continue;\n }\n \n if (inQuotes && char === quoteChar) {\n inQuotes = false;\n i++;\n break;\n }\n \n if (!inQuotes && /\\s/.test(char)) {\n break;\n }\n \n arg += char;\n i++;\n }\n \n if (arg) {\n args._.push(arg);\n }\n }\n }\n\n return args;\n }\n}\n", "import type { CommandHandler, Command } from '../types';\n\n/**\n * Built-in help command handler\n */\nexport const helpCommand: CommandHandler = (_args, shell) => {\n if (!shell) {\n console.error('DevToolsShell instance not available');\n return;\n }\n\n const commands = shell.getCommands();\n \n if (commands.length === 0) {\n console.log('No commands registered.');\n return;\n }\n\n console.log('\\n%cAvailable Commands:', 'font-weight: bold; font-size: 14px;');\n console.log('\u2500'.repeat(50));\n \n commands.forEach((cmd: Command) => {\n console.log(`%c$${cmd.name}%c - ${cmd.description}`, \n 'color: #4CAF50; font-weight: bold;', \n 'color: inherit;');\n });\n \n console.log('\u2500'.repeat(50));\n console.log(`Total: ${commands.length} command(s)`);\n};\n", "import type { CommandHandler } from '../types';\n\n/**\n * Built-in about command handler\n */\nexport const aboutCommand: CommandHandler = () => {\n console.log('%cDevTools Shell', 'font-size: 20px; font-weight: bold; color: #2196F3;');\n console.log('\u2500'.repeat(50));\n console.log('Version: 1.0.0');\n console.log('A browser console command system library');\n console.log('Built with TypeScript and esbuild');\n console.log('\u2500'.repeat(50));\n console.log('Use %c$help%c to see available commands', \n 'color: #4CAF50; font-weight: bold;', \n 'color: inherit;');\n};\n", "import type { Command, CommandHandler, ParsedArgs } from '../types';\nimport { CommandParser } from './CommandParser';\nimport { helpCommand } from '../commands/help';\nimport { aboutCommand } from '../commands/about';\n\n/**\n * Core DevToolsShell class managing command registry and execution\n */\nexport class DevToolsShell {\n private commands: Map<string, Command> = new Map();\n private initialized = false;\n\n constructor() {\n this.registerBuiltInCommands();\n }\n\n /**\n * Register a custom command\n */\n addCommand(name: string, handler: CommandHandler, description: string): void {\n if (!name || typeof name !== 'string') {\n throw new Error('Command name must be a non-empty string');\n }\n\n if (name.startsWith('$')) {\n throw new Error('Command name should not include the $ prefix');\n }\n\n if (typeof handler !== 'function') {\n throw new Error('Command handler must be a function');\n }\n\n if (this.commands.has(name)) {\n console.warn(`Command \"${name}\" already exists. Overwriting...`);\n }\n\n this.commands.set(name, {\n name,\n description: description || 'No description provided',\n handler,\n });\n\n // Attach to window for console access\n this.attachCommandToWindow(name);\n }\n\n /**\n * Execute a command by name with arguments\n */\n execute(commandName: string, input: string = ''): void {\n const command = this.commands.get(commandName);\n \n if (!command) {\n console.error(`Command \"${commandName}\" not found. Use $help to see available commands.`);\n return;\n }\n\n try {\n const args = CommandParser.parse(input);\n // Pass the shell instance to the handler so it can access shell methods\n const result = command.handler(args, this);\n \n // Handle async handlers\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(`Error executing command \"${commandName}\":`, error);\n });\n }\n } catch (error) {\n console.error(`Error executing command \"${commandName}\":`, error);\n }\n }\n\n /**\n * Get all registered commands\n */\n getCommands(): Command[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Get a specific command by name\n */\n getCommand(name: string): Command | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Initialize the shell and attach to window\n */\n initialize(): void {\n if (this.initialized) {\n return;\n }\n\n // Attach all existing commands to window\n this.commands.forEach((_, name) => {\n this.attachCommandToWindow(name);\n });\n\n this.initialized = true;\n }\n\n /**\n * Register built-in commands\n */\n private registerBuiltInCommands(): void {\n this.addCommand('help', helpCommand, 'Display all available commands');\n this.addCommand('about', aboutCommand, 'Show library information');\n }\n\n /**\n * Attach a command to window as $commandName\n */\n private attachCommandToWindow(name: string): void {\n const windowName = `$${name}` as `$${string}`;\n \n // Create a function that can be called from console\n window[windowName] = (...args: any[]) => {\n // If called as a function with arguments, join them as a string\n const input = args.length > 0 ? args.join(' ') : '';\n this.execute(name, input);\n };\n }\n}\n", "import { DevToolsShell } from './core/DevToolsShell';\n\n// Export the main class\nexport { DevToolsShell };\nexport type { Command, CommandHandler, ParsedArgs } from './types';\n\n// Create and initialize the shell instance\n// For IIFE builds, this will be executed immediately when the script loads\nconst shell = new DevToolsShell();\n\n// Auto-initialize when loaded in browser (for IIFE builds)\nif (typeof window !== 'undefined') {\n shell.initialize();\n \n // Set the instance on window for user access\n // We assign it directly - if esbuild's globalName overwrites it,\n // we'll fix it in the next microtask\n window.DevToolsShell = shell;\n \n // Ensure our instance assignment takes precedence over esbuild's globalName\n // by setting it again after the current execution context\n Promise.resolve().then(() => {\n if (window.DevToolsShell !== shell) {\n window.DevToolsShell = shell;\n }\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["shell"]
|
|
7
|
+
}
|