@auto-engineer/frontend-checks 0.6.5 → 0.8.1
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/CHANGELOG.md +11 -0
- package/dist/browser-manager.d.ts +20 -0
- package/dist/browser-manager.d.ts.map +1 -0
- package/dist/browser-manager.js +171 -0
- package/dist/browser-manager.js.map +1 -0
- package/dist/commands/check-client.d.ts +11 -24
- package/dist/commands/check-client.d.ts.map +1 -1
- package/dist/commands/check-client.js +38 -30
- package/dist/commands/check-client.js.map +1 -1
- package/dist/index.d.ts +12 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -172
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/dist/cli-manifest.d.ts +0 -3
- package/dist/cli-manifest.d.ts.map +0 -1
- package/dist/cli-manifest.js +0 -35
- package/dist/cli-manifest.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Browser } from 'playwright';
|
|
2
|
+
declare class BrowserManager {
|
|
3
|
+
private static instance;
|
|
4
|
+
private browser;
|
|
5
|
+
private browserInstalled;
|
|
6
|
+
private chromium;
|
|
7
|
+
private constructor();
|
|
8
|
+
static getInstance(): BrowserManager;
|
|
9
|
+
private getChromium;
|
|
10
|
+
private ensureBrowserInstalled;
|
|
11
|
+
getBrowser(): Promise<Browser>;
|
|
12
|
+
closeBrowser(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export { BrowserManager };
|
|
15
|
+
export declare function getConsoleErrors(url: string): Promise<string[]>;
|
|
16
|
+
export declare function closeBrowser(): Promise<void>;
|
|
17
|
+
export declare function getTsErrors(projectPath: string): Promise<string[]>;
|
|
18
|
+
export declare function getBuildErrors(projectPath: string): Promise<string[]>;
|
|
19
|
+
export declare function getPageScreenshot(url: string): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=browser-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-manager.d.ts","sourceRoot":"","sources":["../src/browser-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAgC,MAAM,YAAY,CAAC;AAOxE,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IACtD,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAA6C;IAE7D,OAAO;WAEO,WAAW,IAAI,cAAc;YAQ7B,WAAW;YAUX,sBAAsB;IAqCvB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAc9B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAU3C;AAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBrE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAIlD;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBlE;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBrE;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBpE"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { exec, execSync } from 'child_process';
|
|
2
|
+
import createDebug from 'debug';
|
|
3
|
+
const debug = createDebug('frontend-checks:browser');
|
|
4
|
+
const debugInstall = createDebug('frontend-checks:install');
|
|
5
|
+
const debugScreenshot = createDebug('frontend-checks:screenshot');
|
|
6
|
+
const debugErrors = createDebug('frontend-checks:errors');
|
|
7
|
+
class BrowserManager {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.browser = null;
|
|
10
|
+
this.browserInstalled = false;
|
|
11
|
+
this.chromium = null;
|
|
12
|
+
}
|
|
13
|
+
static getInstance() {
|
|
14
|
+
if (BrowserManager.instance === null) {
|
|
15
|
+
debug('Creating new BrowserManager instance');
|
|
16
|
+
BrowserManager.instance = new BrowserManager();
|
|
17
|
+
}
|
|
18
|
+
return BrowserManager.instance;
|
|
19
|
+
}
|
|
20
|
+
async getChromium() {
|
|
21
|
+
if (!this.chromium) {
|
|
22
|
+
debug('Dynamically importing playwright...');
|
|
23
|
+
const playwright = await import('playwright');
|
|
24
|
+
this.chromium = playwright.chromium;
|
|
25
|
+
debug('Playwright imported successfully');
|
|
26
|
+
}
|
|
27
|
+
return this.chromium;
|
|
28
|
+
}
|
|
29
|
+
async ensureBrowserInstalled() {
|
|
30
|
+
if (this.browserInstalled) {
|
|
31
|
+
debugInstall('Browser already marked as installed');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
// Try to launch to see if browser is already installed
|
|
36
|
+
debugInstall('Testing if Chromium is already installed...');
|
|
37
|
+
const chromium = await this.getChromium();
|
|
38
|
+
const testBrowser = await chromium.launch();
|
|
39
|
+
await testBrowser.close();
|
|
40
|
+
this.browserInstalled = true;
|
|
41
|
+
debugInstall('Chromium is already installed');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Browser not installed, install it
|
|
45
|
+
console.log('Playwright Chromium not found. Installing...');
|
|
46
|
+
debugInstall('Chromium not found, attempting automatic installation');
|
|
47
|
+
try {
|
|
48
|
+
// Try to install using npx (works in most environments)
|
|
49
|
+
debugInstall('Running: npx playwright install chromium');
|
|
50
|
+
execSync('npx playwright install chromium', {
|
|
51
|
+
stdio: 'inherit',
|
|
52
|
+
env: { ...process.env, PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '0' },
|
|
53
|
+
});
|
|
54
|
+
this.browserInstalled = true;
|
|
55
|
+
console.log('Playwright Chromium installed successfully.');
|
|
56
|
+
debugInstall('Chromium installation completed successfully');
|
|
57
|
+
}
|
|
58
|
+
catch (installError) {
|
|
59
|
+
debugInstall('Failed to install Chromium: %O', installError);
|
|
60
|
+
console.error('Failed to install Playwright Chromium automatically.');
|
|
61
|
+
console.error('Please run: npx playwright install chromium');
|
|
62
|
+
throw new Error('Playwright Chromium browser is not installed. Please run: npx playwright install chromium');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async getBrowser() {
|
|
67
|
+
if (!this.browser) {
|
|
68
|
+
debug('Browser not initialized, ensuring installation and launching');
|
|
69
|
+
await this.ensureBrowserInstalled();
|
|
70
|
+
debug('Launching Chromium browser');
|
|
71
|
+
const chromium = await this.getChromium();
|
|
72
|
+
this.browser = await chromium.launch();
|
|
73
|
+
debug('Browser launched successfully');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
debug('Reusing existing browser instance');
|
|
77
|
+
}
|
|
78
|
+
return this.browser;
|
|
79
|
+
}
|
|
80
|
+
async closeBrowser() {
|
|
81
|
+
if (this.browser) {
|
|
82
|
+
debug('Closing browser instance');
|
|
83
|
+
await this.browser.close();
|
|
84
|
+
this.browser = null;
|
|
85
|
+
debug('Browser closed successfully');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
debug('No browser instance to close');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
BrowserManager.instance = null;
|
|
93
|
+
export { BrowserManager };
|
|
94
|
+
export async function getConsoleErrors(url) {
|
|
95
|
+
debugErrors('Getting console errors for URL: %s', url);
|
|
96
|
+
const errors = [];
|
|
97
|
+
const browserManager = BrowserManager.getInstance();
|
|
98
|
+
const browser = await browserManager.getBrowser();
|
|
99
|
+
const page = await browser.newPage();
|
|
100
|
+
page.on('console', (msg) => {
|
|
101
|
+
if (msg.type() === 'error') {
|
|
102
|
+
debugErrors('Console error captured: %s', msg.text());
|
|
103
|
+
errors.push(msg.text());
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
debugErrors('Navigating to URL: %s', url);
|
|
107
|
+
await page.goto(url, { waitUntil: 'networkidle' });
|
|
108
|
+
await page.close();
|
|
109
|
+
debugErrors('Found %d console errors', errors.length);
|
|
110
|
+
return errors;
|
|
111
|
+
}
|
|
112
|
+
export async function closeBrowser() {
|
|
113
|
+
debug('Closing browser via exported function');
|
|
114
|
+
const browserManager = BrowserManager.getInstance();
|
|
115
|
+
await browserManager.closeBrowser();
|
|
116
|
+
}
|
|
117
|
+
export function getTsErrors(projectPath) {
|
|
118
|
+
return new Promise((resolve) => {
|
|
119
|
+
debugErrors('Checking TypeScript errors in: %s', projectPath);
|
|
120
|
+
// Using `pnpm exec tsc` is more robust as it uses the workspace's typescript compiler
|
|
121
|
+
// and correctly resolves dependencies within the monorepo.
|
|
122
|
+
const command = `tsc --noEmit`;
|
|
123
|
+
exec(command, { cwd: projectPath }, (error, stdout, _stderr) => {
|
|
124
|
+
if (error) {
|
|
125
|
+
// tsc exits with an error code if there are any type errors.
|
|
126
|
+
// The errors are in stdout, not stderr.
|
|
127
|
+
const errors = stdout.split('\n').filter((line) => line.trim().length > 0);
|
|
128
|
+
debugErrors('Found %d TypeScript errors', errors.length);
|
|
129
|
+
resolve(errors);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// No errors
|
|
133
|
+
debugErrors('No TypeScript errors found');
|
|
134
|
+
resolve([]);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
export function getBuildErrors(projectPath) {
|
|
140
|
+
return new Promise((resolve) => {
|
|
141
|
+
debugErrors('Checking build errors in: %s', projectPath);
|
|
142
|
+
const command = `pnpm exec vite build`;
|
|
143
|
+
exec(command, { cwd: projectPath }, (error, _stdout, stderr) => {
|
|
144
|
+
if (error) {
|
|
145
|
+
// Vite build errors are usually in stderr
|
|
146
|
+
const errors = stderr.split('\n').filter((line) => line.trim().length > 0);
|
|
147
|
+
debugErrors('Found %d build errors', errors.length);
|
|
148
|
+
resolve(errors);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
debugErrors('No build errors found');
|
|
152
|
+
resolve([]);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export async function getPageScreenshot(url) {
|
|
158
|
+
debugScreenshot('Taking screenshot of URL: %s', url);
|
|
159
|
+
const browserManager = BrowserManager.getInstance();
|
|
160
|
+
const browser = await browserManager.getBrowser();
|
|
161
|
+
const page = await browser.newPage();
|
|
162
|
+
debugScreenshot('New page created, navigating to URL');
|
|
163
|
+
await page.goto(url, { waitUntil: 'networkidle' });
|
|
164
|
+
debugScreenshot('Page loaded, taking screenshot');
|
|
165
|
+
const buffer = await page.screenshot();
|
|
166
|
+
debugScreenshot('Screenshot captured, size: %d bytes', buffer.length);
|
|
167
|
+
await page.close();
|
|
168
|
+
debugScreenshot('Page closed');
|
|
169
|
+
return buffer.toString('base64');
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=browser-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-manager.js","sourceRoot":"","sources":["../src/browser-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export declare const checkClientManifest: {
|
|
3
|
-
handler: () => Promise<{
|
|
4
|
-
default: CommandHandler<Readonly<{
|
|
5
|
-
type: "CheckClient";
|
|
6
|
-
data: Readonly<{
|
|
7
|
-
clientDirectory: string;
|
|
8
|
-
skipBrowserChecks?: boolean;
|
|
9
|
-
}>;
|
|
10
|
-
timestamp?: Date;
|
|
11
|
-
requestId?: string;
|
|
12
|
-
correlationId?: string;
|
|
13
|
-
}>>;
|
|
14
|
-
}>;
|
|
15
|
-
description: string;
|
|
16
|
-
usage: string;
|
|
17
|
-
examples: string[];
|
|
18
|
-
args: {
|
|
19
|
-
name: string;
|
|
20
|
-
description: string;
|
|
21
|
-
required: boolean;
|
|
22
|
-
}[];
|
|
23
|
-
};
|
|
1
|
+
import { type Command, type Event } from '@auto-engineer/message-bus';
|
|
24
2
|
export type CheckClientCommand = Command<'CheckClient', {
|
|
25
3
|
clientDirectory: string;
|
|
26
4
|
skipBrowserChecks?: boolean;
|
|
@@ -39,7 +17,16 @@ export type ClientCheckFailedEvent = Event<'ClientCheckFailed', {
|
|
|
39
17
|
clientDirectory: string;
|
|
40
18
|
error: string;
|
|
41
19
|
}>;
|
|
20
|
+
export declare const checkClientCommandHandler: import("@auto-engineer/message-bus").UnifiedCommandHandler<Readonly<{
|
|
21
|
+
type: "CheckClient";
|
|
22
|
+
data: Readonly<{
|
|
23
|
+
clientDirectory: string;
|
|
24
|
+
skipBrowserChecks?: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
timestamp?: Date;
|
|
27
|
+
requestId?: string;
|
|
28
|
+
correlationId?: string;
|
|
29
|
+
}>>;
|
|
42
30
|
export declare function handleCheckClientCommand(command: CheckClientCommand): Promise<ClientCheckedEvent | ClientCheckFailedEvent>;
|
|
43
|
-
export declare const checkClientCommandHandler: CommandHandler<CheckClientCommand>;
|
|
44
31
|
export default checkClientCommandHandler;
|
|
45
32
|
//# sourceMappingURL=check-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-client.d.ts","sourceRoot":"","sources":["../../src/commands/check-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"check-client.d.ts","sourceRoot":"","sources":["../../src/commands/check-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAwB,MAAM,4BAA4B,CAAC;AAa5F,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACtC,aAAa,EACb;IACE,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CACF,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CACpC,eAAe,EACf;IACE,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC,CACF,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,KAAK,CACxC,mBAAmB,EACnB;IACE,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CACF,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;yBA3BjB,MAAM;4BACH,OAAO;;;;;GAmE7B,CAAC;AA8IH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,kBAAkB,GAAG,sBAAsB,CAAC,CAqEtD;AAED,eAAe,yBAAyB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { defineCommandHandler } from '@auto-engineer/message-bus';
|
|
1
2
|
import path from 'path';
|
|
2
3
|
import { existsSync } from 'fs';
|
|
3
4
|
import { getTsErrors, getBuildErrors, getConsoleErrors, closeBrowser } from '../index.js';
|
|
@@ -8,13 +9,44 @@ const debugHandler = createDebug('frontend-checks:command:handler');
|
|
|
8
9
|
const debugServer = createDebug('frontend-checks:command:server');
|
|
9
10
|
const debugChecks = createDebug('frontend-checks:command:checks');
|
|
10
11
|
const debugResult = createDebug('frontend-checks:command:result');
|
|
11
|
-
export const
|
|
12
|
-
|
|
12
|
+
export const checkClientCommandHandler = defineCommandHandler({
|
|
13
|
+
name: 'CheckClient',
|
|
14
|
+
alias: 'check:client',
|
|
13
15
|
description: 'Full frontend validation suite',
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
category: 'validation',
|
|
17
|
+
fields: {
|
|
18
|
+
clientDirectory: {
|
|
19
|
+
description: 'Client directory to check',
|
|
20
|
+
required: true,
|
|
21
|
+
},
|
|
22
|
+
skipBrowserChecks: {
|
|
23
|
+
description: 'Skip browser-based validation checks',
|
|
24
|
+
required: false,
|
|
25
|
+
flag: true,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
examples: ['$ auto check:client --client-directory=./client'],
|
|
29
|
+
handle: async (command) => {
|
|
30
|
+
debug('CommandHandler executing for CheckClient');
|
|
31
|
+
const result = await handleCheckClientCommand(command);
|
|
32
|
+
if (result.type === 'ClientChecked') {
|
|
33
|
+
const { tsErrors, buildErrors, consoleErrors, allChecksPassed } = result.data;
|
|
34
|
+
if (allChecksPassed) {
|
|
35
|
+
debug('Command handler completed: all checks passed');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
debug('Command handler completed: some checks failed');
|
|
39
|
+
debug('TypeScript errors: %d', tsErrors);
|
|
40
|
+
debug('Build errors: %d', buildErrors);
|
|
41
|
+
debug('Console errors: %d', consoleErrors);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
debug('Command handler completed: failure - %s', result.data.error);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
},
|
|
49
|
+
});
|
|
18
50
|
async function startDevServer(clientDir) {
|
|
19
51
|
debugServer('Starting dev server in: %s', clientDir);
|
|
20
52
|
return new Promise((resolve, reject) => {
|
|
@@ -192,29 +224,5 @@ export async function handleCheckClientCommand(command) {
|
|
|
192
224
|
await closeBrowser();
|
|
193
225
|
}
|
|
194
226
|
}
|
|
195
|
-
export const checkClientCommandHandler = {
|
|
196
|
-
name: 'CheckClient',
|
|
197
|
-
handle: async (command) => {
|
|
198
|
-
debug('CommandHandler executing for CheckClient');
|
|
199
|
-
const result = await handleCheckClientCommand(command);
|
|
200
|
-
if (result.type === 'ClientChecked') {
|
|
201
|
-
const { tsErrors, buildErrors, consoleErrors, allChecksPassed } = result.data;
|
|
202
|
-
if (allChecksPassed) {
|
|
203
|
-
debug('Command handler completed: all checks passed');
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
debug('Command handler completed: some checks failed');
|
|
207
|
-
debug('TypeScript errors: %d', tsErrors);
|
|
208
|
-
debug('Build errors: %d', buildErrors);
|
|
209
|
-
debug('Console errors: %d', consoleErrors);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
debug('Command handler completed: failure - %s', result.data.error);
|
|
214
|
-
}
|
|
215
|
-
return result;
|
|
216
|
-
},
|
|
217
|
-
};
|
|
218
|
-
// Default export is the command handler
|
|
219
227
|
export default checkClientCommandHandler;
|
|
220
228
|
//# sourceMappingURL=check-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-client.js","sourceRoot":"","sources":["../../src/commands/check-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"check-client.js","sourceRoot":"","sources":["../../src/commands/check-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
export
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
export { BrowserManager, getConsoleErrors, closeBrowser, getTsErrors, getBuildErrors, getPageScreenshot, } from './browser-manager.js';
|
|
2
|
+
export declare const COMMANDS: import("@auto-engineer/message-bus").UnifiedCommandHandler<Readonly<{
|
|
3
|
+
type: "CheckClient";
|
|
4
|
+
data: Readonly<{
|
|
5
|
+
clientDirectory: string;
|
|
6
|
+
skipBrowserChecks?: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
timestamp?: Date;
|
|
9
|
+
requestId?: string;
|
|
10
|
+
correlationId?: string;
|
|
11
|
+
}>>[];
|
|
12
|
+
export { checkClientCommandHandler, type CheckClientCommand, type ClientCheckedEvent, type ClientCheckFailedEvent, } from './commands/check-client';
|
|
8
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAI9B,eAAO,MAAM,QAAQ;;;;;;;;;KAA8B,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,174 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const debug = createDebug('frontend-checks:browser');
|
|
4
|
-
const debugInstall = createDebug('frontend-checks:install');
|
|
5
|
-
const debugScreenshot = createDebug('frontend-checks:screenshot');
|
|
6
|
-
const debugErrors = createDebug('frontend-checks:errors');
|
|
7
|
-
class BrowserManager {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.browser = null;
|
|
10
|
-
this.browserInstalled = false;
|
|
11
|
-
this.chromium = null;
|
|
12
|
-
}
|
|
13
|
-
static getInstance() {
|
|
14
|
-
if (BrowserManager.instance === null) {
|
|
15
|
-
debug('Creating new BrowserManager instance');
|
|
16
|
-
BrowserManager.instance = new BrowserManager();
|
|
17
|
-
}
|
|
18
|
-
return BrowserManager.instance;
|
|
19
|
-
}
|
|
20
|
-
async getChromium() {
|
|
21
|
-
if (!this.chromium) {
|
|
22
|
-
debug('Dynamically importing playwright...');
|
|
23
|
-
const playwright = await import('playwright');
|
|
24
|
-
this.chromium = playwright.chromium;
|
|
25
|
-
debug('Playwright imported successfully');
|
|
26
|
-
}
|
|
27
|
-
return this.chromium;
|
|
28
|
-
}
|
|
29
|
-
async ensureBrowserInstalled() {
|
|
30
|
-
if (this.browserInstalled) {
|
|
31
|
-
debugInstall('Browser already marked as installed');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
try {
|
|
35
|
-
// Try to launch to see if browser is already installed
|
|
36
|
-
debugInstall('Testing if Chromium is already installed...');
|
|
37
|
-
const chromium = await this.getChromium();
|
|
38
|
-
const testBrowser = await chromium.launch();
|
|
39
|
-
await testBrowser.close();
|
|
40
|
-
this.browserInstalled = true;
|
|
41
|
-
debugInstall('Chromium is already installed');
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// Browser not installed, install it
|
|
45
|
-
console.log('Playwright Chromium not found. Installing...');
|
|
46
|
-
debugInstall('Chromium not found, attempting automatic installation');
|
|
47
|
-
try {
|
|
48
|
-
// Try to install using npx (works in most environments)
|
|
49
|
-
debugInstall('Running: npx playwright install chromium');
|
|
50
|
-
execSync('npx playwright install chromium', {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: { ...process.env, PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '0' },
|
|
53
|
-
});
|
|
54
|
-
this.browserInstalled = true;
|
|
55
|
-
console.log('Playwright Chromium installed successfully.');
|
|
56
|
-
debugInstall('Chromium installation completed successfully');
|
|
57
|
-
}
|
|
58
|
-
catch (installError) {
|
|
59
|
-
debugInstall('Failed to install Chromium: %O', installError);
|
|
60
|
-
console.error('Failed to install Playwright Chromium automatically.');
|
|
61
|
-
console.error('Please run: npx playwright install chromium');
|
|
62
|
-
throw new Error('Playwright Chromium browser is not installed. Please run: npx playwright install chromium');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async getBrowser() {
|
|
67
|
-
if (!this.browser) {
|
|
68
|
-
debug('Browser not initialized, ensuring installation and launching');
|
|
69
|
-
await this.ensureBrowserInstalled();
|
|
70
|
-
debug('Launching Chromium browser');
|
|
71
|
-
const chromium = await this.getChromium();
|
|
72
|
-
this.browser = await chromium.launch();
|
|
73
|
-
debug('Browser launched successfully');
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
debug('Reusing existing browser instance');
|
|
77
|
-
}
|
|
78
|
-
return this.browser;
|
|
79
|
-
}
|
|
80
|
-
async closeBrowser() {
|
|
81
|
-
if (this.browser) {
|
|
82
|
-
debug('Closing browser instance');
|
|
83
|
-
await this.browser.close();
|
|
84
|
-
this.browser = null;
|
|
85
|
-
debug('Browser closed successfully');
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
debug('No browser instance to close');
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
BrowserManager.instance = null;
|
|
93
|
-
export async function getConsoleErrors(url) {
|
|
94
|
-
debugErrors('Getting console errors for URL: %s', url);
|
|
95
|
-
const errors = [];
|
|
96
|
-
const browserManager = BrowserManager.getInstance();
|
|
97
|
-
const browser = await browserManager.getBrowser();
|
|
98
|
-
const page = await browser.newPage();
|
|
99
|
-
page.on('console', (msg) => {
|
|
100
|
-
if (msg.type() === 'error') {
|
|
101
|
-
debugErrors('Console error captured: %s', msg.text());
|
|
102
|
-
errors.push(msg.text());
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
debugErrors('Navigating to URL: %s', url);
|
|
106
|
-
await page.goto(url, { waitUntil: 'networkidle' });
|
|
107
|
-
await page.close();
|
|
108
|
-
debugErrors('Found %d console errors', errors.length);
|
|
109
|
-
return errors;
|
|
110
|
-
}
|
|
111
|
-
export async function closeBrowser() {
|
|
112
|
-
debug('Closing browser via exported function');
|
|
113
|
-
const browserManager = BrowserManager.getInstance();
|
|
114
|
-
await browserManager.closeBrowser();
|
|
115
|
-
}
|
|
116
|
-
export function getTsErrors(projectPath) {
|
|
117
|
-
return new Promise((resolve) => {
|
|
118
|
-
debugErrors('Checking TypeScript errors in: %s', projectPath);
|
|
119
|
-
// Using `pnpm exec tsc` is more robust as it uses the workspace's typescript compiler
|
|
120
|
-
// and correctly resolves dependencies within the monorepo.
|
|
121
|
-
const command = `tsc --noEmit`;
|
|
122
|
-
exec(command, { cwd: projectPath }, (error, stdout, _stderr) => {
|
|
123
|
-
if (error) {
|
|
124
|
-
// tsc exits with an error code if there are any type errors.
|
|
125
|
-
// The errors are in stdout, not stderr.
|
|
126
|
-
const errors = stdout.split('\n').filter((line) => line.trim().length > 0);
|
|
127
|
-
debugErrors('Found %d TypeScript errors', errors.length);
|
|
128
|
-
resolve(errors);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
// No errors
|
|
132
|
-
debugErrors('No TypeScript errors found');
|
|
133
|
-
resolve([]);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
export function getBuildErrors(projectPath) {
|
|
139
|
-
return new Promise((resolve) => {
|
|
140
|
-
debugErrors('Checking build errors in: %s', projectPath);
|
|
141
|
-
const command = `pnpm exec vite build`;
|
|
142
|
-
exec(command, { cwd: projectPath }, (error, _stdout, stderr) => {
|
|
143
|
-
if (error) {
|
|
144
|
-
// Vite build errors are usually in stderr
|
|
145
|
-
const errors = stderr.split('\n').filter((line) => line.trim().length > 0);
|
|
146
|
-
debugErrors('Found %d build errors', errors.length);
|
|
147
|
-
resolve(errors);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
debugErrors('No build errors found');
|
|
151
|
-
resolve([]);
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
export async function getPageScreenshot(url) {
|
|
157
|
-
debugScreenshot('Taking screenshot of URL: %s', url);
|
|
158
|
-
const browserManager = BrowserManager.getInstance();
|
|
159
|
-
const browser = await browserManager.getBrowser();
|
|
160
|
-
const page = await browser.newPage();
|
|
161
|
-
debugScreenshot('New page created, navigating to URL');
|
|
162
|
-
await page.goto(url, { waitUntil: 'networkidle' });
|
|
163
|
-
debugScreenshot('Page loaded, taking screenshot');
|
|
164
|
-
const buffer = await page.screenshot();
|
|
165
|
-
debugScreenshot('Screenshot captured, size: %d bytes', buffer.length);
|
|
166
|
-
await page.close();
|
|
167
|
-
debugScreenshot('Page closed');
|
|
168
|
-
return buffer.toString('base64');
|
|
169
|
-
}
|
|
1
|
+
// Barrel exports
|
|
2
|
+
export { BrowserManager, getConsoleErrors, closeBrowser, getTsErrors, getBuildErrors, getPageScreenshot, } from './browser-manager.js';
|
|
170
3
|
// Export CLI manifest
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
export { checkClientCommandHandler,
|
|
4
|
+
import { checkClientCommandHandler } from './commands/check-client.js';
|
|
5
|
+
export const COMMANDS = [checkClientCommandHandler];
|
|
6
|
+
export { checkClientCommandHandler, } from './commands/check-client.js';
|
|
174
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,sBAAsB;AACtB,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACpD,OAAO,EACL,yBAAyB,GAI1B,MAAM,yBAAyB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@auto-engineer/frontend-checks",
|
|
3
|
-
"version": "0.6.5",
|
|
4
3
|
"type": "module",
|
|
5
4
|
"main": "./dist/index.js",
|
|
6
5
|
"types": "./dist/index.d.ts",
|
|
@@ -16,27 +15,28 @@
|
|
|
16
15
|
"CHANGELOG.md"
|
|
17
16
|
],
|
|
18
17
|
"dependencies": {
|
|
19
|
-
"@auto-engineer/message-bus": "^0.5.5",
|
|
20
18
|
"debug": "^4.4.1",
|
|
21
19
|
"dotenv": "^16.6.1",
|
|
22
20
|
"playwright": "^1.54.1",
|
|
23
|
-
"typescript": "^5.4.5"
|
|
21
|
+
"typescript": "^5.4.5",
|
|
22
|
+
"@auto-engineer/message-bus": "0.8.1"
|
|
24
23
|
},
|
|
25
24
|
"publishConfig": {
|
|
26
25
|
"access": "public"
|
|
27
26
|
},
|
|
28
27
|
"devDependencies": {
|
|
29
|
-
"@auto-engineer/cli": "
|
|
28
|
+
"@auto-engineer/cli": "0.8.1"
|
|
30
29
|
},
|
|
30
|
+
"version": "0.8.1",
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc && tsx ../../scripts/fix-esm-imports.ts",
|
|
33
33
|
"dev": "tsc --watch",
|
|
34
|
-
"test": "vitest run",
|
|
34
|
+
"test": "vitest run --reporter=dot",
|
|
35
35
|
"lint": "eslint 'src/**/*.ts' --max-warnings 0 --config ../../eslint.config.ts",
|
|
36
36
|
"type-check": "tsc --noEmit",
|
|
37
|
-
"format": "prettier --write \"**/*.{js,ts,json,md,yml,yaml}\" --ignore-path ../../.prettierignore",
|
|
37
|
+
"format": "prettier --write \"**/*.{js,ts,json,md,yml,yaml}\" --ignore-path ../../.prettierignore --log-level warn",
|
|
38
38
|
"lint:fix": "eslint 'src/**/*.ts' --fix --config ../../eslint.config.ts",
|
|
39
|
-
"format:fix": "prettier --write \"**/*.{js,ts,json,md,yml,yaml}\" --ignore-path ../../.prettierignore",
|
|
39
|
+
"format:fix": "prettier --write \"**/*.{js,ts,json,md,yml,yaml}\" --ignore-path ../../.prettierignore --log-level warn",
|
|
40
40
|
"link:dev": "pnpm build && pnpm link --global",
|
|
41
41
|
"unlink:dev": "pnpm unlink --global"
|
|
42
42
|
}
|
package/dist/cli-manifest.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-manifest.d.ts","sourceRoot":"","sources":["../src/cli-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AA2BrE,eAAO,MAAM,YAAY,EAAE,WAM1B,CAAC"}
|
package/dist/cli-manifest.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { checkClientManifest } from './commands/check-client.js';
|
|
5
|
-
// Get version from package.json
|
|
6
|
-
const getVersion = () => {
|
|
7
|
-
try {
|
|
8
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
-
const __dirname = path.dirname(__filename);
|
|
10
|
-
// In dev: src/cli-manifest.ts -> ../../package.json
|
|
11
|
-
// In dist: dist/cli-manifest.js -> ../package.json
|
|
12
|
-
const possiblePaths = [
|
|
13
|
-
path.join(__dirname, '..', 'package.json'), // dist build
|
|
14
|
-
path.join(__dirname, '..', '..', 'package.json'), // dev/src
|
|
15
|
-
];
|
|
16
|
-
for (const packageJsonPath of possiblePaths) {
|
|
17
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
18
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
19
|
-
return packageJson.version;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
// Fall through
|
|
25
|
-
}
|
|
26
|
-
return 'unknown';
|
|
27
|
-
};
|
|
28
|
-
export const CLI_MANIFEST = {
|
|
29
|
-
category: '@auto-engineer/frontend-checks',
|
|
30
|
-
version: getVersion(),
|
|
31
|
-
commands: {
|
|
32
|
-
'check:client': checkClientManifest,
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
//# sourceMappingURL=cli-manifest.js.map
|
package/dist/cli-manifest.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-manifest.js","sourceRoot":"","sources":["../src/cli-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,gCAAgC;AAChC,MAAM,UAAU,GAAG,GAAW,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,oDAAoD;QACpD,mDAAmD;QACnD,MAAM,aAAa,GAAG;YACpB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,aAAa;YACzD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,UAAU;SAC7D,CAAC;QAEF,KAAK,MAAM,eAAe,IAAI,aAAa,EAAE,CAAC;YAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAwB,CAAC;gBACjG,OAAO,WAAW,CAAC,OAAO,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,QAAQ,EAAE,gCAAgC;IAC1C,OAAO,EAAE,UAAU,EAAE;IACrB,QAAQ,EAAE;QACR,cAAc,EAAE,mBAAmB;KACpC;CACF,CAAC"}
|