transform @wdio/logger into ESM

This commit is contained in:
Christian Bromann 2022-05-11 13:43:48 +02:00
parent 7addacb3f4
commit 62023041e8
13 changed files with 1362 additions and 117 deletions

1
.gitignore vendored
View file

@ -69,6 +69,7 @@ tests/typings/**/dist
devtools.d.ts
!.eslintrc.js
!jest.config.js
!vitest.config.ts
packages/**/package-lock.json
.DS_Store

1320
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -79,6 +79,7 @@
"@typescript-eslint/parser": "^5.22.0",
"@typescript-eslint/utils": "^5.14.0",
"aws-sdk": "^2.1127.0",
"c8": "^7.11.2",
"camelcase": "^6.3.0",
"cheerio": "^1.0.0-rc.10",
"copyfiles": "^2.4.1",
@ -104,6 +105,7 @@
"ts-jest": "^28.0.1",
"ts-node": "^10.7.0",
"typescript": "^4.6.2",
"url-join": "^4.0.1"
"url-join": "^4.0.1",
"vitest": "^0.12.4"
}
}

View file

@ -1,24 +0,0 @@
const chalkMock = {}
chalkMock.cyanBright = jest.fn().mockImplementation((msg) => `cyanBright ${msg}`)
chalkMock.greenBright = jest.fn().mockImplementation((msg) => `greenBright ${msg}`)
chalkMock.whiteBright = jest.fn().mockImplementation((msg) => `whiteBright ${msg}`)
chalkMock.redBright = jest.fn().mockImplementation((msg) => `redBright ${msg}`)
chalkMock.cyan = jest.fn().mockImplementation((msg) => `cyan ${msg}`)
chalkMock.blue = jest.fn().mockImplementation((msg) => `blue ${msg}`)
chalkMock.grey = jest.fn().mockImplementation((msg) => `grey ${msg}`)
chalkMock.green = jest.fn().mockImplementation((msg) => `green ${msg}`)
chalkMock.red = jest.fn().mockImplementation((...msg) => `red ${msg.join(' ')}`)
chalkMock.gray = jest.fn().mockImplementation((...msg) => `gray ${msg.join(' ')}`)
chalkMock.black = jest.fn().mockImplementation((msg) => `black ${msg}`)
chalkMock.white = chalkMock
chalkMock.yellow = jest.fn().mockImplementation((...msg) => `yellow ${msg.join(' ')}`)
chalkMock.magenta = jest.fn().mockImplementation((msg) => `magenta ${msg}`)
chalkMock.bgGreen = jest.fn().mockImplementation((msg) => `bgGreen ${msg}`)
chalkMock.dim = jest.fn().mockImplementation((msg) => `dim ${msg}`)
chalkMock.supportsColor = { hasBasic: true }
chalkMock.bgYellow = chalkMock
chalkMock.bgRed = chalkMock
chalkMock.bold = function (msg) { return `bold ${msg}` }
chalkMock.bold.__proto__ = chalkMock
export default chalkMock

View file

@ -5,7 +5,20 @@
"author": "Christian Bromann <mail@bromann.dev>",
"homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-logger",
"license": "MIT",
"main": "./build/node",
"main": "./build/index.cjs.js",
"type": "module",
"module": "./build/index.js",
"exports": {
".": [
{
"import": "./build/index.js",
"require": "./build/index.cjs.js"
},
"./build/index.cjs.js"
]
},
"types": "./build/index.d.ts",
"typeScriptVersion": "3.8.3",
"engines": {
"node": "^16.13 || >=18"
},
@ -21,8 +34,6 @@
"bugs": {
"url": "https://github.com/webdriverio/webdriverio/issues"
},
"types": "./build/node.d.ts",
"typeScriptVersion": "3.8.3",
"dependencies": {
"chalk": "^4.0.0",
"loglevel": "^1.6.0",

View file

@ -1,22 +1,24 @@
/* istanbul ignore file */
import type log from 'loglevel'
/**
* environment check to allow to use this package in a web context
*/
// By default, import the web code using a literal require, so that in webpack
// contexts, it will always be bundled
let mode = require('./web').default
let mode = await import('./web.js') as any
// Then, if we're in a Node.js context, require the node version of this module
// using a variable, so that it will _not_ be included in a bundle, either
// during compilation or execution
if (typeof process !== 'undefined' && typeof process.release !== 'undefined' && process.release.name === 'node') {
const nodeMode = './node'
mode = require(nodeMode).default
const nodeMode = './node.js'
mode = await import(nodeMode)
}
// The net result will be that in a Node context, we'll have required both
// files but will use the correct one, and in the web context, we'll have only
// required the web file, thus ensuring that the Node file and related
// dependencies will not be bundled inadvertently.
export default mode
export default mode.default as (name: string) => log.Logger

View file

@ -1,4 +1,5 @@
import fs from 'fs'
import fs from 'node:fs'
import log from 'loglevel'
import util from 'util'
import chalk, { Color } from 'chalk'

View file

@ -1,5 +0,0 @@
{
"env": {
"jest": true
}
}

View file

@ -1,13 +0,0 @@
const mock = () => logMock
mock.setLevel = jest.fn()
mock.setLogLevelsConfig = jest.fn()
mock.waitForBuffer = jest.fn()
export const logMock = {
error: jest.fn(),
debug: jest.fn(),
warn: jest.fn(),
info: jest.fn(),
trace: jest.fn()
}
export default mock

View file

@ -0,0 +1,15 @@
import { vi } from 'vitest'
const mock = () => logMock
mock.setLevel = vi.fn()
mock.setLogLevelsConfig = vi.fn()
mock.waitForBuffer = vi.fn()
export const logMock = {
error: vi.fn(),
debug: vi.fn(),
warn: vi.fn(),
info: vi.fn(),
trace: vi.fn()
}
export default mock

View file

@ -0,0 +1,26 @@
import { vi } from 'vitest'
const chalkMock: any = {}
chalkMock.cyanBright = vi.fn().mockImplementation((msg) => `cyanBright ${msg}`)
chalkMock.greenBright = vi.fn().mockImplementation((msg) => `greenBright ${msg}`)
chalkMock.whiteBright = vi.fn().mockImplementation((msg) => `whiteBright ${msg}`)
chalkMock.redBright = vi.fn().mockImplementation((msg) => `redBright ${msg}`)
chalkMock.cyan = vi.fn().mockImplementation((msg) => `cyan ${msg}`)
chalkMock.blue = vi.fn().mockImplementation((msg) => `blue ${msg}`)
chalkMock.grey = vi.fn().mockImplementation((msg) => `grey ${msg}`)
chalkMock.green = vi.fn().mockImplementation((msg) => `green ${msg}`)
chalkMock.red = vi.fn().mockImplementation((...msg: string[]) => `red ${msg.join(' ')}`)
chalkMock.gray = vi.fn().mockImplementation((...msg: string[]) => `gray ${msg.join(' ')}`)
chalkMock.black = vi.fn().mockImplementation((msg) => `black ${msg}`)
chalkMock.white = chalkMock
chalkMock.yellow = vi.fn().mockImplementation((...msg: string[]) => `yellow ${msg.join(' ')}`)
chalkMock.magenta = vi.fn().mockImplementation((msg) => `magenta ${msg}`)
chalkMock.bgGreen = vi.fn().mockImplementation((msg) => `bgGreen ${msg}`)
chalkMock.dim = vi.fn().mockImplementation((msg) => `dim ${msg}`)
chalkMock.supportsColor = { hasBasic: true }
chalkMock.bgYellow = chalkMock
chalkMock.bgRed = chalkMock
chalkMock.bold = function (msg: string) { return `bold ${msg}` }
chalkMock.bold.__proto__ = chalkMock
export default chalkMock

View file

@ -1,10 +1,13 @@
import fs from 'fs'
import fs from 'node:fs'
import { it, describe, expect, vi, afterEach, beforeEach, afterAll } from 'vitest'
import nodeLogger from '../src/node'
import nodeLogger2 from '../build/node'
import type log from 'loglevel'
jest.useFakeTimers('legacy')
vi.useFakeTimers()
vi.mock('chalk', () => import('./__mocks__/chalk'))
describe('wdio-logger node', () => {
describe('log level', () => {
@ -134,10 +137,10 @@ describe('wdio-logger node', () => {
})
describe('logFile', () => {
const write = jest.fn(logText => logText)
const logInfoSpy = jest.spyOn(fs, 'createWriteStream')
const logCacheAddSpy = jest.spyOn(Set.prototype, 'add')
const logCacheForEachSpy = jest.spyOn(Set.prototype, 'forEach')
const write = vi.fn(logText => logText)
const logInfoSpy = vi.spyOn(fs, 'createWriteStream')
const logCacheAddSpy = vi.spyOn(Set.prototype, 'add')
const logCacheForEachSpy = vi.spyOn(Set.prototype, 'forEach')
let writableBuffer: any = null
logInfoSpy.mockImplementation((path: fs.PathLike): fs.WriteStream => ({
path: path as string,
@ -148,9 +151,14 @@ describe('wdio-logger node', () => {
// @ts-ignore
return writableBuffer
},
end: () => {}
// @ts-expect-error
end: vi.fn()
}))
beforeEach(() => {
logCacheAddSpy.mockClear()
})
it('should be possible to add to cache', () => {
const log = nodeLogger('test-logFile1')
log.info('foo')
@ -271,9 +279,9 @@ describe('wdio-logger node', () => {
writableBuffer = ['bar']
const waitPromise = nodeLogger.waitForBuffer()
jest.advanceTimersByTime(30)
vi.advanceTimersByTime(30)
writableBuffer = []
jest.advanceTimersByTime(30)
vi.advanceTimersByTime(30)
expect(await waitPromise).toBe(undefined)
})
})

15
vitest.config.ts Normal file
View file

@ -0,0 +1,15 @@
import { defineConfig } from 'vite'
export default defineConfig({
test: {
include: ['packages/wdio-logger/**/*.test.ts'],
coverage: {
enabled: true,
exclude: ['**/build/**', '**/*.test.ts'],
lines: 90,
functions: 90,
branches: 90,
statements: 90
}
}
})