diff --git a/eslint.config.mjs b/eslint.config.mjs index eda1eff..3ff35a9 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -192,6 +192,31 @@ const languageOptions = { } }; +const importOrderRules = { + "import/order": [ + 2, + { + groups: [ + "builtin", + "external", + "internal", + ["parent", "sibling"], + "index", + "type", + ], + }, + ], + "import/consistent-type-specifier-style": [2, "prefer-top-level"], +}; + +const noFloatingPromisesRules = { + "@typescript-eslint/no-floating-promises": "error", +}; + +const noBooleanCompareRules = { + "@typescript-eslint/no-unnecessary-boolean-literal-compare": 2, +}; + export default [ { ignores: ["**/*.js"], @@ -200,6 +225,11 @@ export default [ files: ["**/*.ts", "**/*.tsx"], plugins, languageOptions, - rules: baseRules, + rules: { + ...baseRules, + ...importOrderRules, + ...noFloatingPromisesRules, + ...noBooleanCompareRules, + }, }, ]; diff --git a/src/config.ts b/src/config.ts index 994cd4f..a0e8680 100644 --- a/src/config.ts +++ b/src/config.ts @@ -18,10 +18,9 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import { devices } from 'playwright'; - +import { sanitizeForFilePath } from './tools/utils.js'; import type { Config, ToolCapability } from '../config.js'; import type { BrowserContextOptions, LaunchOptions } from 'playwright'; -import { sanitizeForFilePath } from './tools/utils.js'; export type CLIOptions = { allowedOrigins?: string[]; diff --git a/src/extension/cdpRelay.ts b/src/extension/cdpRelay.ts index 5fabd25..101f2ad 100644 --- a/src/extension/cdpRelay.ts +++ b/src/extension/cdpRelay.ts @@ -22,15 +22,15 @@ * - /extension/guid - Extension connection for chrome.debugger forwarding */ +import http from 'http'; +import { promisify } from 'util'; +import { exec } from 'child_process'; import { WebSocket, WebSocketServer } from 'ws'; -import type websocket from 'ws'; -import http from 'node:http'; import debug from 'debug'; -import { promisify } from 'node:util'; -import { exec } from 'node:child_process'; +import * as playwright from 'playwright'; import { httpAddressToString, startHttpServer } from '../transport.js'; import { BrowserContextFactory } from '../browserContextFactory.js'; -import { Browser, chromium, type BrowserContext } from 'playwright'; +import type websocket from 'ws'; const debugLogger = debug('pw:mcp:relay'); @@ -284,13 +284,13 @@ export class CDPRelayServer { class ExtensionContextFactory implements BrowserContextFactory { private _relay: CDPRelayServer; - private _browserPromise: Promise | undefined; + private _browserPromise: Promise | undefined; constructor(relay: CDPRelayServer) { this._relay = relay; } - async createContext(clientInfo: { name: string, version: string }): Promise<{ browserContext: BrowserContext, close: () => Promise }> { + async createContext(clientInfo: { name: string, version: string }): Promise<{ browserContext: playwright.BrowserContext, close: () => Promise }> { // First call will establish the connection to the extension. if (!this._browserPromise) this._browserPromise = this._obtainBrowser(clientInfo); @@ -301,9 +301,9 @@ class ExtensionContextFactory implements BrowserContextFactory { }; } - private async _obtainBrowser(clientInfo: { name: string, version: string }): Promise { + private async _obtainBrowser(clientInfo: { name: string, version: string }): Promise { await this._relay.ensureExtensionConnectionForMCPContext(clientInfo); - return await chromium.connectOverCDP(this._relay.cdpEndpoint()); + return await playwright.chromium.connectOverCDP(this._relay.cdpEndpoint()); } } diff --git a/src/index.ts b/src/index.ts index 2f5f2f9..417492d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,10 +15,9 @@ */ import { createConnection as createConnectionImpl } from './connection.js'; -import type { Connection } from '../index.js'; import { resolveConfig } from './config.js'; import { contextFactory } from './browserContextFactory.js'; - +import type { Connection } from '../index.js'; import type { Config } from '../config.js'; import type { BrowserContext } from 'playwright'; import type { BrowserContextFactory } from './browserContextFactory.js'; diff --git a/src/tools/install.ts b/src/tools/install.ts index 3b45e37..43fe1c4 100644 --- a/src/tools/install.ts +++ b/src/tools/install.ts @@ -16,11 +16,10 @@ import { fork } from 'child_process'; import path from 'path'; - +import { fileURLToPath } from 'url'; import { z } from 'zod'; import { defineTool } from './tool.js'; -import { fileURLToPath } from 'node:url'; const install = defineTool({ capability: 'core-install', diff --git a/tests/files.spec.ts b/tests/files.spec.ts index b45b5fa..600d392 100644 --- a/tests/files.spec.ts +++ b/tests/files.spec.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { test, expect } from './fixtures.js'; import fs from 'fs/promises'; +import { test, expect } from './fixtures.js'; test('browser_file_upload', async ({ client, server }, testInfo) => { server.setContent('/', ` diff --git a/tests/library.spec.ts b/tests/library.spec.ts index 954403f..2029b3d 100644 --- a/tests/library.spec.ts +++ b/tests/library.spec.ts @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import child_process from 'child_process'; +import fs from 'fs/promises'; import { test, expect } from './fixtures.js'; -import fs from 'node:fs/promises'; -import child_process from 'node:child_process'; test('library can be used from CommonJS', { annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright-mcp/issues/456' } }, async ({}, testInfo) => { const file = testInfo.outputPath('main.cjs');