diff --git a/package-lock.json b/package-lock.json index 7269188e..9d020915 100644 --- a/package-lock.json +++ b/package-lock.json @@ -799,12 +799,6 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -2900,9 +2894,9 @@ } }, "eslint": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.2.0.tgz", - "integrity": "sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.3.0.tgz", + "integrity": "sha512-dJMVXwfU5PT1cj2Nv2VPPrKahKTGdX+5Dh0Q3YuKt+Y2UhdL2YbzsVaBMyG9HC0tBismlv/r1+eZqs6SMIV38Q==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -2911,6 +2905,7 @@ "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", + "enquirer": "^2.3.5", "eslint-scope": "^5.1.0", "eslint-utils": "^2.0.0", "eslint-visitor-keys": "^1.2.0", @@ -2924,7 +2919,6 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -4449,79 +4443,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, - "inquirer": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", - "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -6128,9 +6049,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "nanomatch": { @@ -7919,9 +7840,9 @@ } }, "snyk": { - "version": "1.343.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.343.0.tgz", - "integrity": "sha512-isQJrmoMt4OAvcUJViyA9luPYZxKlyuKexigvUE5XJWewQXNDh/cFBHM251362cjyTqcJri4BbGg05OFd5eEkA==", + "version": "1.346.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.346.0.tgz", + "integrity": "sha512-uwJDC0CRefppngm1J1M+Sja5CVfdmzLYkxGYp3ZYXrzvd912pgzrdYm8ciUL5a8x1/C+2L0iZ09W68daSuObhA==", "dev": true, "requires": { "@snyk/cli-interface": "2.8.0", @@ -9287,9 +9208,9 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" }, "ts-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.0.tgz", - "integrity": "sha512-JbhQdyDMYN5nfKXaAwCIyaWLGwevcT2/dbqRPsQeh6NZPUuXjZQZEfeLb75tz0ubCIgEELNm6xAzTe5NXs5Y4Q==", + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.1.tgz", + "integrity": "sha512-Lk/357quLg5jJFyBQLnSbhycnB3FPe+e9i7ahxokyXxAYoB0q1pPmqxxRPYr4smJic1Rjcf7MXDBhZWgxlli0A==", "dev": true, "requires": { "bs-logger": "0.x", diff --git a/package.json b/package.json index c603a211..40558273 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@typescript-eslint/eslint-plugin": "3.3.0", "@typescript-eslint/parser": "3.3.0", "coveralls": "3.1.0", - "eslint": "7.2.0", + "eslint": "7.3.0", "eslint-config-airbnb-base": "14.2.0", "eslint-config-prettier": "6.11.0", "eslint-plugin-import": "2.21.2", @@ -73,8 +73,8 @@ "playwright-chromium": ">=1.1.1", "playwright-core": "npm:playwright-chromium@>=1.1.1", "prettier": "2.0.5", - "snyk": "^1.343.0", - "ts-jest": "26.1.0", + "snyk": "^1.346.0", + "ts-jest": "26.1.1", "typescript": "3.9.5" } } diff --git a/src/PlaywrightEnvironment.ts b/src/PlaywrightEnvironment.ts index ce903526..0d1ca54c 100644 --- a/src/PlaywrightEnvironment.ts +++ b/src/PlaywrightEnvironment.ts @@ -13,7 +13,6 @@ import { getDeviceType, getPlaywrightInstance, readConfig, - readPackage, } from './utils' import { savePageCoverage } from './coverage' @@ -68,8 +67,14 @@ export const getPlaywrightEnv = (basicEnv = 'node') => { const browserType = getBrowserType(browserName) const { exitOnPageError, selectors } = config let { contextOptions } = config - const playwrightPackage = await readPackage() - if (playwrightPackage === IMPORT_KIND_PLAYWRIGHT) { + const device = getDeviceType(this._config.device) + const { + name, + instance: playwrightInstance, + devices, + } = getPlaywrightInstance(browserType) + + if (name === IMPORT_KIND_PLAYWRIGHT) { // eslint-disable-next-line @typescript-eslint/no-var-requires const playwright = require('playwright') if (selectors) { @@ -80,11 +85,6 @@ export const getPlaywrightEnv = (basicEnv = 'node') => { ) } } - const device = getDeviceType(this._config.device) - const { instance: playwrightInstance, devices } = getPlaywrightInstance( - playwrightPackage, - browserType, - ) if (device) { const { viewport, userAgent } = devices[device] diff --git a/src/PlaywrightRunner.ts b/src/PlaywrightRunner.ts index ac223447..8457c13f 100644 --- a/src/PlaywrightRunner.ts +++ b/src/PlaywrightRunner.ts @@ -21,7 +21,6 @@ import { getDisplayName, readConfig, getPlaywrightInstance, - readPackage, } from './utils' import { DEFAULT_TEST_PLAYWRIGHT_TIMEOUT } from './constants' import { BrowserServer } from 'playwright-core' @@ -72,13 +71,11 @@ class PlaywrightRunner extends JestRunner { async getTests(tests: Test[], config: JestPlaywrightConfig): Promise { const { browsers, devices, launchOptions } = config - const playwrightPackage = await readPackage() const pwTests: Test[] = [] for (const test of tests) { for (const browser of browsers) { checkBrowserEnv(browser) const { devices: availableDevices, instance } = getPlaywrightInstance( - playwrightPackage, browser, ) if (!this.browser2Server[browser]) { diff --git a/src/types.d.ts b/src/types.d.ts index 7ff5aa29..bbfebacd 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -28,13 +28,14 @@ export type SelectorType = { name: string } +export type PlaywrightRequireType = BrowserType | typeof IMPORT_KIND_PLAYWRIGHT + export interface Playwright { + name: PlaywrightRequireType instance: GenericBrowser devices: typeof devices } -export type PlaywrightRequireType = BrowserType | typeof IMPORT_KIND_PLAYWRIGHT - export interface JestPlaywrightConfig { launchOptions?: LaunchOptions connectOptions?: Parameters[0] diff --git a/src/utils.test.ts b/src/utils.test.ts index afcd2f89..4d748ea0 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -1,7 +1,7 @@ import fs from 'fs' import path from 'path' import * as Utils from './utils' -import { DEFAULT_CONFIG, CHROMIUM, WEBKIT, FIREFOX } from './constants' +import { DEFAULT_CONFIG, CHROMIUM } from './constants' import type { BrowserType } from './types' const { @@ -10,8 +10,6 @@ const { getDeviceType, checkBrowserEnv, checkDeviceEnv, - checkDependencies, - readPackage, getPlaywrightInstance, getDisplayName, } = Utils @@ -152,147 +150,35 @@ describe('checkDeviceEnv', () => { }) }) -describe('checkDependencies', () => { - it('should return null for empty dependencies', () => { - const dep = checkDependencies({}) - expect(dep).toBe(null) - }) - - it('should return null for dependencies without playwright packages', () => { - const dep = checkDependencies({ test: '0.0.1' }) - expect(dep).toBe(null) - }) - - it('should return right package object for single package', () => { - const dep = checkDependencies({ 'playwright-chromium': '*' }) - expect(dep).toStrictEqual({ [CHROMIUM]: CHROMIUM }) - }) - - it('should return right package object for multiple packages', () => { - const dep = checkDependencies({ - 'playwright-webkit': '*', - 'playwright-chromium': '*', - }) - expect(dep).toStrictEqual({ [WEBKIT]: WEBKIT, [CHROMIUM]: CHROMIUM }) - }) -}) - -describe('readPackage', () => { - it('should return null when dependencies does not passed', async () => { - ;((fs.exists as unknown) as jest.Mock).mockImplementationOnce( - (_, cb: (exists: boolean) => void) => cb(true), - ) - jest.mock( - path.join(__dirname, '..', 'package.json'), - () => ({ - dependencies: {}, - }), - { virtual: true }, - ) - - await expect(readPackage()).rejects.toThrowError( - 'None of playwright packages was not found in dependencies', - ) - }) - it('should return playwright when it is defined', async () => { - ;((fs.exists as unknown) as jest.Mock).mockImplementationOnce( - (_, cb: (exists: boolean) => void) => cb(true), - ) - jest.mock( - path.join(__dirname, '..', 'package.json'), - () => ({ - dependencies: { - playwright: '*', - }, - }), - { virtual: true }, - ) - - const playwright = await readPackage() - expect(playwright).toEqual('playwright') - }) - it('should return playwright-firefox when it is defined', async () => { - ;((fs.exists as unknown) as jest.Mock).mockImplementationOnce( - (_, cb: (exists: boolean) => void) => cb(true), - ) - jest.mock( - path.join(__dirname, '..', 'package.json'), - () => ({ - devDependencies: { - 'playwright-firefox': '*', - }, - }), - { virtual: true }, - ) - - const playwright = await readPackage() - expect(playwright).toStrictEqual({ [FIREFOX]: FIREFOX }) - }) - it('should return playwright-firefox when it is defined and empty dependencies are persistent', async () => { - ;((fs.exists as unknown) as jest.Mock).mockImplementationOnce( - (_, cb: (exists: boolean) => void) => cb(true), - ) - jest.mock( - path.join(__dirname, '..', 'package.json'), - () => ({ - dependencies: {}, - devDependencies: { - 'playwright-firefox': '*', - }, - }), - { virtual: true }, - ) - - const playwright = await readPackage() - expect(playwright).toStrictEqual({ [FIREFOX]: FIREFOX }) - }) -}) - describe('getPlaywrightInstance', () => { - const spy = jest.spyOn(Utils, 'readPackage') - it('should return specified instance from playwright package', async () => { - spy.mockResolvedValue('playwright') - jest.doMock('playwright', () => ({ firefox: 'firefox', chromium: 'chromium', })) - const { instance } = getPlaywrightInstance('playwright', 'firefox') + const { instance } = getPlaywrightInstance('firefox') expect(instance).toEqual('firefox') }) it('should return specified instance from specified playwright package', () => { - spy.mockResolvedValue({ - chromium: 'chromium', - }) - jest.doMock('playwright-chromium', () => ({ chromium: 'chromium', })) - const { instance } = getPlaywrightInstance( - { chromium: 'chromium' }, - 'chromium', - ) + const { instance } = getPlaywrightInstance('chromium') expect(instance).toEqual('chromium') }) it('should throw error when playwright package is not provided', () => { - spy.mockResolvedValue({ - chromium: 'chromium', - }) - - jest.doMock('playwright-chromium', () => ({ + jest.doMock('playwright', () => ({ chromium: 'chromium', })) - const getMissedPlaywrightInstance = () => - getPlaywrightInstance({ chromium: 'chromium' }, 'firefox') + const getMissedPlaywrightInstance = () => getPlaywrightInstance('firefox') expect(getMissedPlaywrightInstance).toThrowError( - 'Cannot find provided playwright package', + 'jest-playwright-preset: Cannot find playwright package to use firefox', ) }) }) diff --git a/src/utils.ts b/src/utils.ts index 747cb67a..7a62c5b0 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -6,7 +6,7 @@ import type { DeviceType, JestPlaywrightConfig, Playwright, - Packages, + PlaywrightRequireType, } from './types' import { CHROMIUM, @@ -19,27 +19,6 @@ import { const exists = promisify(fs.exists) -export const checkDependencies = ( - dependencies: Record, -): Packages | typeof IMPORT_KIND_PLAYWRIGHT | null => { - const packages: Packages = {} - if (!dependencies || Object.keys(dependencies).length === 0) return null - if (dependencies.playwright) return IMPORT_KIND_PLAYWRIGHT - if (dependencies[`playwright-${CHROMIUM}`]) { - packages[CHROMIUM] = CHROMIUM - } - if (dependencies[`playwright-${FIREFOX}`]) { - packages[FIREFOX] = FIREFOX - } - if (dependencies[`playwright-${WEBKIT}`]) { - packages[WEBKIT] = WEBKIT - } - if (Object.keys(packages).length === 0) { - return null - } - return packages -} - export const checkBrowserEnv = (param: BrowserType): void => { if (param !== CHROMIUM && param !== FIREFOX && param !== WEBKIT) { throw new Error( @@ -86,48 +65,32 @@ export const getBrowserType = (browser?: BrowserType): BrowserType => { return browser || CHROMIUM } -export const readPackage = async (): Promise< - Packages | typeof IMPORT_KIND_PLAYWRIGHT -> => { - const packagePath = 'package.json' - const absConfigPath = path.resolve(process.cwd(), packagePath) - const packageConfig = await require(absConfigPath) - // for handling the local tests - if (packageConfig.name === 'jest-playwright-preset') { - return IMPORT_KIND_PLAYWRIGHT +export const getPlaywrightInstance = (browserName: BrowserType): Playwright => { + let pw + let name: PlaywrightRequireType + try { + pw = require(`${IMPORT_KIND_PLAYWRIGHT}-${browserName}`) + name = browserName + } catch (e) { + try { + pw = require(IMPORT_KIND_PLAYWRIGHT) + name = IMPORT_KIND_PLAYWRIGHT + } catch (e) { + throw new Error( + formatError(`Cannot find playwright package to use ${browserName}`), + ) + } } - const playwright = - checkDependencies(packageConfig.dependencies) || - checkDependencies(packageConfig.devDependencies) - if (playwright === null) { + if (!pw[browserName]) { throw new Error( - formatError('None of playwright packages was not found in dependencies'), + formatError(`Cannot find playwright package to use ${browserName}`), ) } - return playwright -} - -export const getPlaywrightInstance = ( - playwrightPackage: typeof IMPORT_KIND_PLAYWRIGHT | Packages, - browserName: BrowserType, -): Playwright => { - const buildPlaywrightStructure = (importName: string): Playwright => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const pw = require(importName) - return { - instance: pw[browserName], - devices: pw['devices'], - } - } - if (playwrightPackage === IMPORT_KIND_PLAYWRIGHT) { - return buildPlaywrightStructure('playwright') - } - if (!playwrightPackage[browserName]) { - throw new Error(formatError('Cannot find provided playwright package')) + return { + name, + instance: pw[browserName], + devices: pw['devices'], } - return buildPlaywrightStructure( - `playwright-${playwrightPackage[browserName]}`, - ) } const validateConfig = (config: JestPlaywrightConfig) => {