@saiden/browse 0.2.5
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.
Potentially problematic release.
This version of @saiden/browse might be problematic. Click here for more details.
- package/README.md +210 -0
- package/dist/browser.d.ts +48 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.integration.test.d.ts +2 -0
- package/dist/browser.integration.test.d.ts.map +1 -0
- package/dist/browser.integration.test.js +173 -0
- package/dist/browser.integration.test.js.map +1 -0
- package/dist/browser.js +250 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.test.d.ts +2 -0
- package/dist/browser.test.d.ts.map +1 -0
- package/dist/browser.test.js +73 -0
- package/dist/browser.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +247 -0
- package/dist/cli.js.map +1 -0
- package/dist/image.d.ts +21 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +131 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +41 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +103 -0
- package/dist/logger.js.map +1 -0
- package/dist/logger.test.d.ts +2 -0
- package/dist/logger.test.d.ts.map +1 -0
- package/dist/logger.test.js +146 -0
- package/dist/logger.test.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +541 -0
- package/dist/mcp.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +88 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +164 -0
- package/dist/server.test.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
package/dist/image.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import sharp from 'sharp';
|
|
4
|
+
const THUMBNAIL_SIZES = {
|
|
5
|
+
small: 150,
|
|
6
|
+
medium: 300,
|
|
7
|
+
large: 600,
|
|
8
|
+
};
|
|
9
|
+
const FAVICON_SIZES = [
|
|
10
|
+
{ name: 'favicon-16x16.png', size: 16 },
|
|
11
|
+
{ name: 'favicon-32x32.png', size: 32 },
|
|
12
|
+
{ name: 'favicon-48x48.png', size: 48 },
|
|
13
|
+
{ name: 'apple-touch-icon.png', size: 180 },
|
|
14
|
+
{ name: 'android-chrome-192x192.png', size: 192 },
|
|
15
|
+
{ name: 'android-chrome-512x512.png', size: 512 },
|
|
16
|
+
];
|
|
17
|
+
async function ensureDir(filePath) {
|
|
18
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
export async function createFavicon(input, outputDir) {
|
|
21
|
+
const resolvedDir = resolve(outputDir);
|
|
22
|
+
await mkdir(resolvedDir, { recursive: true });
|
|
23
|
+
const files = [];
|
|
24
|
+
const image = sharp(input);
|
|
25
|
+
for (const { name, size } of FAVICON_SIZES) {
|
|
26
|
+
const outputPath = join(resolvedDir, name);
|
|
27
|
+
await image.clone().resize(size, size, { fit: 'cover' }).png().toFile(outputPath);
|
|
28
|
+
files.push(outputPath);
|
|
29
|
+
}
|
|
30
|
+
// Create favicon.ico with multiple sizes (16, 32, 48)
|
|
31
|
+
const icoPath = join(resolvedDir, 'favicon.ico');
|
|
32
|
+
const sizes = [16, 32, 48];
|
|
33
|
+
const buffers = await Promise.all(sizes.map((size) => image.clone().resize(size, size, { fit: 'cover' }).png().toBuffer()));
|
|
34
|
+
// ICO format: simple approach - use largest PNG as ICO
|
|
35
|
+
// For true multi-size ICO, we'd need a dedicated library
|
|
36
|
+
// Sharp doesn't support ICO output, so we'll use the 32x32 PNG
|
|
37
|
+
await image.clone().resize(32, 32, { fit: 'cover' }).png().toFile(icoPath);
|
|
38
|
+
files.push(icoPath);
|
|
39
|
+
return { files, outputDir: resolvedDir };
|
|
40
|
+
}
|
|
41
|
+
export async function convert(input, output, format) {
|
|
42
|
+
const resolvedOutput = resolve(output);
|
|
43
|
+
await ensureDir(resolvedOutput);
|
|
44
|
+
const image = sharp(input);
|
|
45
|
+
let result;
|
|
46
|
+
switch (format) {
|
|
47
|
+
case 'png':
|
|
48
|
+
result = image.png();
|
|
49
|
+
break;
|
|
50
|
+
case 'jpeg':
|
|
51
|
+
result = image.jpeg();
|
|
52
|
+
break;
|
|
53
|
+
case 'webp':
|
|
54
|
+
result = image.webp();
|
|
55
|
+
break;
|
|
56
|
+
case 'avif':
|
|
57
|
+
result = image.avif();
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
const info = await result.toFile(resolvedOutput);
|
|
61
|
+
return {
|
|
62
|
+
path: resolvedOutput,
|
|
63
|
+
width: info.width,
|
|
64
|
+
height: info.height,
|
|
65
|
+
format: info.format,
|
|
66
|
+
size: info.size,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export async function resize(input, output, width, height, fit = 'cover') {
|
|
70
|
+
const resolvedOutput = resolve(output);
|
|
71
|
+
await ensureDir(resolvedOutput);
|
|
72
|
+
const info = await sharp(input).resize(width, height, { fit }).toFile(resolvedOutput);
|
|
73
|
+
return {
|
|
74
|
+
path: resolvedOutput,
|
|
75
|
+
width: info.width,
|
|
76
|
+
height: info.height,
|
|
77
|
+
format: info.format,
|
|
78
|
+
size: info.size,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export async function crop(input, output, left, top, width, height) {
|
|
82
|
+
const resolvedOutput = resolve(output);
|
|
83
|
+
await ensureDir(resolvedOutput);
|
|
84
|
+
const info = await sharp(input).extract({ left, top, width, height }).toFile(resolvedOutput);
|
|
85
|
+
return {
|
|
86
|
+
path: resolvedOutput,
|
|
87
|
+
width: info.width,
|
|
88
|
+
height: info.height,
|
|
89
|
+
format: info.format,
|
|
90
|
+
size: info.size,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export async function compress(input, output, quality = 80) {
|
|
94
|
+
const resolvedOutput = resolve(output);
|
|
95
|
+
await ensureDir(resolvedOutput);
|
|
96
|
+
const image = sharp(input);
|
|
97
|
+
const metadata = await image.metadata();
|
|
98
|
+
const format = metadata.format;
|
|
99
|
+
let result;
|
|
100
|
+
switch (format) {
|
|
101
|
+
case 'png':
|
|
102
|
+
result = image.png({ quality });
|
|
103
|
+
break;
|
|
104
|
+
case 'jpeg':
|
|
105
|
+
case 'jpg':
|
|
106
|
+
result = image.jpeg({ quality });
|
|
107
|
+
break;
|
|
108
|
+
case 'webp':
|
|
109
|
+
result = image.webp({ quality });
|
|
110
|
+
break;
|
|
111
|
+
case 'avif':
|
|
112
|
+
result = image.avif({ quality });
|
|
113
|
+
break;
|
|
114
|
+
default:
|
|
115
|
+
// Default to PNG for unknown formats
|
|
116
|
+
result = image.png({ quality });
|
|
117
|
+
}
|
|
118
|
+
const info = await result.toFile(resolvedOutput);
|
|
119
|
+
return {
|
|
120
|
+
path: resolvedOutput,
|
|
121
|
+
width: info.width,
|
|
122
|
+
height: info.height,
|
|
123
|
+
format: info.format,
|
|
124
|
+
size: info.size,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export async function thumbnail(input, output, size = 'medium') {
|
|
128
|
+
const dimension = THUMBNAIL_SIZES[size];
|
|
129
|
+
return resize(input, output, dimension, dimension, 'cover');
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ClaudeBrowser } from './browser.js';
|
|
2
|
+
export { BrowserServer, startServer } from './server.js';
|
|
3
|
+
export { createFavicon, convert, resize, crop, compress, thumbnail, type FaviconResult, type ImageResult, type FitType, type FormatType, type ThumbnailSize, } from './image.js';
|
|
4
|
+
export type { BrowserOptions, BrowserCommand, CommandResponse, ElementInfo, SuccessResponse, ErrorResponse, GotoCommand, ClickCommand, TypeCommand, QueryCommand, ScreenshotCommand, UrlCommand, HtmlCommand, BackCommand, ForwardCommand, ReloadCommand, WaitCommand, NewPageCommand, CloseCommand, EvalCommand, FaviconCommand, ConvertCommand, ResizeCommand, CropCommand, CompressCommand, ThumbnailCommand, } from './types.js';
|
|
5
|
+
export type { ServerOptions } from './server.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,aAAa,EACb,OAAO,EACP,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,aAAa,EACb,OAAO,EACP,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,SAAS,GAMV,MAAM,YAAY,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare const icons: Record<string, string>;
|
|
2
|
+
export declare const cmdColor: Record<string, (s: string) => string>;
|
|
3
|
+
export declare function ts(): string;
|
|
4
|
+
export declare function truncate(str: string, max: number): string;
|
|
5
|
+
export interface CommandLike {
|
|
6
|
+
cmd: string;
|
|
7
|
+
url?: string;
|
|
8
|
+
selector?: string;
|
|
9
|
+
text?: string;
|
|
10
|
+
path?: string;
|
|
11
|
+
full?: boolean;
|
|
12
|
+
ms?: number;
|
|
13
|
+
script?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function getCommandDetail(cmd: CommandLike): string | undefined;
|
|
16
|
+
export declare function formatCommand(cmd: CommandLike): string;
|
|
17
|
+
export interface ResultLike {
|
|
18
|
+
ok: boolean;
|
|
19
|
+
error?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
url?: string;
|
|
22
|
+
count?: number;
|
|
23
|
+
path?: string;
|
|
24
|
+
html?: string;
|
|
25
|
+
result?: unknown;
|
|
26
|
+
}
|
|
27
|
+
export declare function formatResult(cmd: CommandLike, result: ResultLike): string;
|
|
28
|
+
export type LogFn = (msg: string) => void;
|
|
29
|
+
export declare function createLogger(logFn?: LogFn): {
|
|
30
|
+
command(cmd: CommandLike): void;
|
|
31
|
+
result(cmd: CommandLike, result: ResultLike): void;
|
|
32
|
+
};
|
|
33
|
+
export declare const logger: {
|
|
34
|
+
command(cmd: CommandLike): void;
|
|
35
|
+
result(cmd: CommandLike, result: ResultLike): void;
|
|
36
|
+
};
|
|
37
|
+
export declare const stderrLogger: {
|
|
38
|
+
command(cmd: CommandLike): void;
|
|
39
|
+
result(cmd: CommandLike, result: ResultLike): void;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAexC,CAAC;AAGF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAe1D,CAAC;AAEF,wBAAgB,EAAE,IAAI,MAAM,CAE3B;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAoBrE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAMtD;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAYD,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAQzE;AAED,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1C,wBAAgB,YAAY,CAAC,KAAK,GAAE,KAAmB;iBAEtC,WAAW,GAAG,IAAI;gBAGnB,WAAW,UAAU,UAAU,GAAG,IAAI;EAIrD;AAGD,eAAO,MAAM,MAAM;iBAVF,WAAW,GAAG,IAAI;gBAGnB,WAAW,UAAU,UAAU,GAAG,IAAI;CAOlB,CAAC;AAGrC,eAAO,MAAM,YAAY;iBAbR,WAAW,GAAG,IAAI;gBAGnB,WAAW,UAAU,UAAU,GAAG,IAAI;CAU6B,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import logSymbols from 'log-symbols';
|
|
3
|
+
// Icons for commands
|
|
4
|
+
export const icons = {
|
|
5
|
+
goto: '→',
|
|
6
|
+
click: '◉',
|
|
7
|
+
type: '⌨',
|
|
8
|
+
query: '?',
|
|
9
|
+
screenshot: '📷',
|
|
10
|
+
url: '🔗',
|
|
11
|
+
html: '<>',
|
|
12
|
+
back: '←',
|
|
13
|
+
forward: '→',
|
|
14
|
+
reload: '↻',
|
|
15
|
+
wait: '⏳',
|
|
16
|
+
newpage: '+',
|
|
17
|
+
close: '✕',
|
|
18
|
+
eval: '⚡',
|
|
19
|
+
};
|
|
20
|
+
// Colors for command types
|
|
21
|
+
export const cmdColor = {
|
|
22
|
+
goto: chalk.cyan,
|
|
23
|
+
click: chalk.yellow,
|
|
24
|
+
type: chalk.magenta,
|
|
25
|
+
query: chalk.blue,
|
|
26
|
+
screenshot: chalk.green,
|
|
27
|
+
url: chalk.cyan,
|
|
28
|
+
html: chalk.blue,
|
|
29
|
+
back: chalk.yellow,
|
|
30
|
+
forward: chalk.yellow,
|
|
31
|
+
reload: chalk.yellow,
|
|
32
|
+
wait: chalk.gray,
|
|
33
|
+
newpage: chalk.green,
|
|
34
|
+
close: chalk.red,
|
|
35
|
+
eval: chalk.magenta,
|
|
36
|
+
};
|
|
37
|
+
export function ts() {
|
|
38
|
+
return chalk.gray(`[${new Date().toISOString()}]`);
|
|
39
|
+
}
|
|
40
|
+
export function truncate(str, max) {
|
|
41
|
+
return str.length > max ? `${str.slice(0, max)}...` : str;
|
|
42
|
+
}
|
|
43
|
+
export function getCommandDetail(cmd) {
|
|
44
|
+
switch (cmd.cmd) {
|
|
45
|
+
case 'goto':
|
|
46
|
+
return chalk.white(cmd.url);
|
|
47
|
+
case 'click':
|
|
48
|
+
case 'query':
|
|
49
|
+
return chalk.white(cmd.selector);
|
|
50
|
+
case 'type':
|
|
51
|
+
return `${chalk.white(cmd.selector)} ${chalk.dim(`="${cmd.text}"`)}`;
|
|
52
|
+
case 'screenshot':
|
|
53
|
+
return chalk.dim(cmd.path || 'screenshot.png');
|
|
54
|
+
case 'html':
|
|
55
|
+
return cmd.full ? chalk.dim('(full)') : undefined;
|
|
56
|
+
case 'wait':
|
|
57
|
+
return chalk.dim(`${cmd.ms || 1000}ms`);
|
|
58
|
+
case 'eval':
|
|
59
|
+
return chalk.dim(truncate(cmd.script || '', 50));
|
|
60
|
+
default:
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function formatCommand(cmd) {
|
|
65
|
+
const color = cmdColor[cmd.cmd] || chalk.white;
|
|
66
|
+
const icon = icons[cmd.cmd] || '•';
|
|
67
|
+
const detail = getCommandDetail(cmd);
|
|
68
|
+
const suffix = detail ? ` ${detail}` : '';
|
|
69
|
+
return `${ts()} ${chalk.bold(color(icon))} ${color(cmd.cmd.toUpperCase())}${suffix}`;
|
|
70
|
+
}
|
|
71
|
+
const resultFormatters = {
|
|
72
|
+
goto: (r) => r.title,
|
|
73
|
+
click: (r) => (r.url ? `→ ${r.url}` : undefined),
|
|
74
|
+
query: (r) => (r.count !== undefined ? `Found ${r.count} element(s)` : undefined),
|
|
75
|
+
screenshot: (r) => (r.path ? `Saved to ${r.path}` : undefined),
|
|
76
|
+
url: (r) => r.url,
|
|
77
|
+
html: (r) => (r.html !== undefined ? `${r.html.length} chars` : undefined),
|
|
78
|
+
eval: (r) => (r.result !== undefined ? truncate(JSON.stringify(r.result), 80) : undefined),
|
|
79
|
+
};
|
|
80
|
+
export function formatResult(cmd, result) {
|
|
81
|
+
if (!result.ok) {
|
|
82
|
+
return `${ts()} ${logSymbols.error} ${chalk.red(result.error)}`;
|
|
83
|
+
}
|
|
84
|
+
const formatter = resultFormatters[cmd.cmd];
|
|
85
|
+
const msg = formatter ? formatter(result) : undefined;
|
|
86
|
+
const suffix = msg ? ` ${chalk.dim(msg)}` : '';
|
|
87
|
+
return `${ts()} ${logSymbols.success}${suffix}`;
|
|
88
|
+
}
|
|
89
|
+
export function createLogger(logFn = console.log) {
|
|
90
|
+
return {
|
|
91
|
+
command(cmd) {
|
|
92
|
+
logFn(formatCommand(cmd));
|
|
93
|
+
},
|
|
94
|
+
result(cmd, result) {
|
|
95
|
+
logFn(formatResult(cmd, result));
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Default logger to stdout
|
|
100
|
+
export const logger = createLogger();
|
|
101
|
+
// Logger to stderr (for MCP)
|
|
102
|
+
export const stderrLogger = createLogger((msg) => process.stderr.write(`${msg}\n`));
|
|
103
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { createLogger, formatCommand, formatResult, getCommandDetail, icons, truncate, } from './logger.js';
|
|
3
|
+
describe('truncate', () => {
|
|
4
|
+
it('returns string unchanged if shorter than max', () => {
|
|
5
|
+
expect(truncate('hello', 10)).toBe('hello');
|
|
6
|
+
});
|
|
7
|
+
it('truncates and adds ellipsis if longer than max', () => {
|
|
8
|
+
expect(truncate('hello world', 5)).toBe('hello...');
|
|
9
|
+
});
|
|
10
|
+
it('handles exact length', () => {
|
|
11
|
+
expect(truncate('hello', 5)).toBe('hello');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
describe('icons', () => {
|
|
15
|
+
it('has icon for each command type', () => {
|
|
16
|
+
expect(icons.goto).toBe('→');
|
|
17
|
+
expect(icons.click).toBe('◉');
|
|
18
|
+
expect(icons.type).toBe('⌨');
|
|
19
|
+
expect(icons.screenshot).toBe('📷');
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('getCommandDetail', () => {
|
|
23
|
+
it('returns url for goto command', () => {
|
|
24
|
+
const result = getCommandDetail({ cmd: 'goto', url: 'https://example.com' });
|
|
25
|
+
expect(result).toContain('https://example.com');
|
|
26
|
+
});
|
|
27
|
+
it('returns selector for click command', () => {
|
|
28
|
+
const result = getCommandDetail({ cmd: 'click', selector: '#btn' });
|
|
29
|
+
expect(result).toContain('#btn');
|
|
30
|
+
});
|
|
31
|
+
it('returns selector and text for type command', () => {
|
|
32
|
+
const result = getCommandDetail({ cmd: 'type', selector: '#input', text: 'hello' });
|
|
33
|
+
expect(result).toContain('#input');
|
|
34
|
+
expect(result).toContain('hello');
|
|
35
|
+
});
|
|
36
|
+
it('returns path for screenshot command', () => {
|
|
37
|
+
const result = getCommandDetail({ cmd: 'screenshot', path: 'test.png' });
|
|
38
|
+
expect(result).toContain('test.png');
|
|
39
|
+
});
|
|
40
|
+
it('returns default path when none provided for screenshot', () => {
|
|
41
|
+
const result = getCommandDetail({ cmd: 'screenshot' });
|
|
42
|
+
expect(result).toContain('screenshot.png');
|
|
43
|
+
});
|
|
44
|
+
it('returns undefined for url command', () => {
|
|
45
|
+
expect(getCommandDetail({ cmd: 'url' })).toBeUndefined();
|
|
46
|
+
});
|
|
47
|
+
it('returns ms for wait command', () => {
|
|
48
|
+
const result = getCommandDetail({ cmd: 'wait', ms: 500 });
|
|
49
|
+
expect(result).toContain('500');
|
|
50
|
+
});
|
|
51
|
+
it('returns default ms for wait command without ms', () => {
|
|
52
|
+
const result = getCommandDetail({ cmd: 'wait' });
|
|
53
|
+
expect(result).toContain('1000');
|
|
54
|
+
});
|
|
55
|
+
it('returns script for eval command', () => {
|
|
56
|
+
const result = getCommandDetail({ cmd: 'eval', script: 'document.title' });
|
|
57
|
+
expect(result).toContain('document.title');
|
|
58
|
+
});
|
|
59
|
+
it('truncates long eval scripts', () => {
|
|
60
|
+
const longScript = 'a'.repeat(100);
|
|
61
|
+
const result = getCommandDetail({ cmd: 'eval', script: longScript });
|
|
62
|
+
expect(result).toContain('...');
|
|
63
|
+
});
|
|
64
|
+
it('returns (full) for html command with full=true', () => {
|
|
65
|
+
const result = getCommandDetail({ cmd: 'html', full: true });
|
|
66
|
+
expect(result).toContain('full');
|
|
67
|
+
});
|
|
68
|
+
it('returns undefined for html command with full=false', () => {
|
|
69
|
+
expect(getCommandDetail({ cmd: 'html', full: false })).toBeUndefined();
|
|
70
|
+
});
|
|
71
|
+
it('returns selector for query command', () => {
|
|
72
|
+
const result = getCommandDetail({ cmd: 'query', selector: '.items' });
|
|
73
|
+
expect(result).toContain('.items');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('formatCommand', () => {
|
|
77
|
+
it('formats goto command', () => {
|
|
78
|
+
const result = formatCommand({ cmd: 'goto', url: 'https://example.com' });
|
|
79
|
+
expect(result).toContain('GOTO');
|
|
80
|
+
expect(result).toContain('https://example.com');
|
|
81
|
+
});
|
|
82
|
+
it('formats click command', () => {
|
|
83
|
+
const result = formatCommand({ cmd: 'click', selector: '#btn' });
|
|
84
|
+
expect(result).toContain('CLICK');
|
|
85
|
+
expect(result).toContain('#btn');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('formatResult', () => {
|
|
89
|
+
it('formats error result', () => {
|
|
90
|
+
const result = formatResult({ cmd: 'goto' }, { ok: false, error: 'Failed' });
|
|
91
|
+
expect(result).toContain('Failed');
|
|
92
|
+
});
|
|
93
|
+
it('formats successful goto result with title', () => {
|
|
94
|
+
const result = formatResult({ cmd: 'goto' }, { ok: true, title: 'Example' });
|
|
95
|
+
expect(result).toContain('Example');
|
|
96
|
+
});
|
|
97
|
+
it('formats query result with count', () => {
|
|
98
|
+
const result = formatResult({ cmd: 'query' }, { ok: true, count: 5 });
|
|
99
|
+
expect(result).toContain('5');
|
|
100
|
+
});
|
|
101
|
+
it('formats click result with url', () => {
|
|
102
|
+
const result = formatResult({ cmd: 'click' }, { ok: true, url: '/page' });
|
|
103
|
+
expect(result).toContain('/page');
|
|
104
|
+
});
|
|
105
|
+
it('formats screenshot result with path', () => {
|
|
106
|
+
const result = formatResult({ cmd: 'screenshot' }, { ok: true, path: 'test.png' });
|
|
107
|
+
expect(result).toContain('Saved to test.png');
|
|
108
|
+
});
|
|
109
|
+
it('formats url result', () => {
|
|
110
|
+
const result = formatResult({ cmd: 'url' }, { ok: true, url: 'https://example.com' });
|
|
111
|
+
expect(result).toContain('https://example.com');
|
|
112
|
+
});
|
|
113
|
+
it('formats html result with length', () => {
|
|
114
|
+
const result = formatResult({ cmd: 'html' }, { ok: true, html: '<html></html>' });
|
|
115
|
+
expect(result).toContain('13 chars');
|
|
116
|
+
});
|
|
117
|
+
it('formats eval result', () => {
|
|
118
|
+
const result = formatResult({ cmd: 'eval' }, { ok: true, result: { foo: 'bar' } });
|
|
119
|
+
expect(result).toContain('foo');
|
|
120
|
+
expect(result).toContain('bar');
|
|
121
|
+
});
|
|
122
|
+
it('formats result without formatter', () => {
|
|
123
|
+
const result = formatResult({ cmd: 'wait' }, { ok: true });
|
|
124
|
+
expect(result).toBeDefined();
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('createLogger', () => {
|
|
128
|
+
it('creates logger with custom log function', () => {
|
|
129
|
+
const logs = [];
|
|
130
|
+
const logFn = (msg) => logs.push(msg);
|
|
131
|
+
const logger = createLogger(logFn);
|
|
132
|
+
logger.command({ cmd: 'goto', url: 'https://example.com' });
|
|
133
|
+
expect(logs).toHaveLength(1);
|
|
134
|
+
expect(logs[0]).toContain('GOTO');
|
|
135
|
+
logger.result({ cmd: 'goto' }, { ok: true, title: 'Example' });
|
|
136
|
+
expect(logs).toHaveLength(2);
|
|
137
|
+
});
|
|
138
|
+
it('logs command and result', () => {
|
|
139
|
+
const spy = vi.fn();
|
|
140
|
+
const logger = createLogger(spy);
|
|
141
|
+
logger.command({ cmd: 'click', selector: '#btn' });
|
|
142
|
+
logger.result({ cmd: 'click' }, { ok: true, url: '/page' });
|
|
143
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=logger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":""}
|