Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate utils modules to TS. #3869

Merged
merged 13 commits into from
Aug 22, 2023
Merged
28 changes: 28 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"root": true,
"extends": [
"eslint:recommended"
],
Expand All @@ -13,6 +14,33 @@
"mocha": true,
"node": true
},
"overrides": [
{
"files": [
"**/*.ts"
],
"excludedFiles": [
"test/**/*.ts"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint"
],
"parserOptions": {
"ecmaVersion": 2020,
"sourceType": "module",
"ecmaFeatures": {
"jsx": false
},
"project": "./tsconfig.json"
}
}
],
"rules": {
"eqeqeq": [
"error",
Expand Down
19 changes: 10 additions & 9 deletions lib/utils/addDetailedError.js → lib/utils/addDetailedError.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import {NightwatchError} from './types';

/**
* @method addDetailedError
* @param {Error} err
*/
module.exports = function(err) {
let detailedErr;
export = function(err: NightwatchError) {
let detailedErr: string | undefined;

if (err instanceof TypeError) {
if (err.detailedErr && /browser\..+ is not a function$/.test(err.detailedErr)) {
Expand All @@ -25,14 +26,14 @@ module.exports = function(err) {
detailedErr = ' - writing an ES6 async test case? - keep in mind that commands return a Promise; \n - writing unit tests? - make sure to specify "unit_tests_mode=true" in your config.';
}
} else if (err instanceof SyntaxError) {
const stackParts = err.stack.split('SyntaxError:');
detailedErr = stackParts[0];
let modulePath = err.stack.split('\n')[0];
if (modulePath.includes(':')) {
const stackParts = err.stack?.split('SyntaxError:');
detailedErr = stackParts?.[0];
let modulePath = err.stack?.split('\n')[0];
if (modulePath?.includes(':')) {
modulePath = modulePath.split(':')[0];
}

if (stackParts[1]) {
if (stackParts?.[1]) {
if (detailedErr) {
err.stack = '';
}
Expand All @@ -46,7 +47,7 @@ module.exports = function(err) {
detailedErr = header + detailedErr;
}

if (modulePath.endsWith('.jsx') || modulePath.endsWith('.tsx')) {
if (modulePath?.endsWith('.jsx') || modulePath?.endsWith('.tsx')) {
detailedErr = `\n In order to be able to load JSX files, one of these plugins is needed:
- @nightwatch/react
- @nightwatch/storybook (only if using Storybook in your project)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module.exports = function(err) {
export = function(err: unknown) {
return (err instanceof Error) && [
'TypeError', 'SyntaxError', 'ReferenceError', 'RangeError'
].includes(err.name);
};
};
2 changes: 1 addition & 1 deletion lib/utils/beautifyStackTrace.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const fs = require('fs');
const stackTraceParser = require('stacktrace-parser');
const AssertionError = require('assertion-error');
const {filterStackTrace} = require('./stackTrace.js');
const alwaysDisplayError = require('./alwaysDisplayError.js');
const alwaysDisplayError = require('./alwaysDisplayError');
const {colors} = require('./chalkColors.js');

/**
Expand Down
16 changes: 8 additions & 8 deletions lib/utils/browsername.js → lib/utils/browsername.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
const BrowserName = module.exports = {
class BrowserName {
get CHROME() {
return 'chrome';
},
}

get FIREFOX() {
return 'firefox';
},
}

get SAFARI() {
return 'safari';
},
}

get EDGE() {
return 'MicrosoftEdge';
},
}

get INTERNET_EXPLORER() {
return 'internet explorer';
},
}

get OPERA() {
return 'opera';
}
};
}

Object.freeze(BrowserName);
export = new BrowserName();
17 changes: 0 additions & 17 deletions lib/utils/createPromise.js

This file was deleted.

16 changes: 16 additions & 0 deletions lib/utils/createPromise.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
interface Deferred<T> {
promise: Promise<T>;
resolve: ((value: T | PromiseLike<T>) => void);
reject: ((reason?: unknown) => void);
}

export = function createPromise<T>(): Deferred<T> {
const deferred = <Deferred<T>> {};

deferred.promise = new Promise((resolve, reject) => {
deferred.resolve = resolve;
deferred.reject = reject;
});

return deferred;
};
21 changes: 13 additions & 8 deletions lib/utils/getFreePort.js → lib/utils/getFreePort.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
import * as net from 'net';

/**
* @method getFreePort
* @param host
* @returns {Promise<number>}
*/
module.exports = function(host = 'localhost') {
const net = require('net');

export = function(host = 'localhost'): Promise<number> {
vaibhavsingh97 marked this conversation as resolved.
Show resolved Hide resolved
return new Promise((resolve, reject) => {
const server = net.createServer();

server.on('listening', function () {
resolve(server.address().port);
const serverAddress = server.address();

if (!serverAddress || typeof serverAddress === 'string') {
reject(new Error('Unable to get port from server address.'));
} else {
resolve(serverAddress.port);
}

server.close();
});

server.on('error', (e) => {
server.on('error', (e: NodeJS.ErrnoException) => {
let err;
if (e.code === 'EADDRINUSE' || e.code === 'EACCES') {
err = new Error('Unable to find a free port');
Expand All @@ -28,4 +33,4 @@ module.exports = function(host = 'localhost') {
// By providing 0 we let the operative system find an arbitrary port
server.listen(0, host);
});
};
};
11 changes: 5 additions & 6 deletions lib/utils/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@ const {By, Capabilities} = require('selenium-webdriver');
const {inspect} = require('util');

const Logger = require('./logger');
const BrowserName = require('./browsername.js');
const BrowserName = require('./browsername');
const LocateStrategy = require('./locatestrategy.js');
const PeriodicPromise = require('./periodic-promise.js');
const createPromise = require('./createPromise.js');
const isErrorObject = require('./isErrorObject.js');
const alwaysDisplayError = require('./alwaysDisplayError.js');
const createPromise = require('./createPromise');
const isErrorObject = require('./isErrorObject');
const alwaysDisplayError = require('./alwaysDisplayError');
const Screenshots = require('./screenshots.js');
const Snapshots = require('./snapshots.js');
const TimedCallback = require('./timed-callback.js');
const getFreePort = require('./getFreePort.js');
const getFreePort = require('./getFreePort');
const requireModule = require('./requireModule.js');
const getAllClassMethodNames = require('./getAllClassMethodNames.js');
const VERSION = require('./version.js');
Expand Down Expand Up @@ -715,7 +715,6 @@ lodashMerge(Utils, {
Screenshots,
Snapshots,
TimedCallback,


getFreePort,
VERSION,
Expand Down
4 changes: 2 additions & 2 deletions lib/utils/isErrorObject.js → lib/utils/isErrorObject.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module.exports = function(err) {
export = function(err: unknown) {
return err instanceof Error || Object.prototype.toString.call(err) === '[object Error]';
};
};
4 changes: 2 additions & 2 deletions lib/utils/logger/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ const lodashEscape = require('lodash.escape');
const LogSettings = require('./log_settings.js');
const chalkColors = require('../chalkColors.js');

const addDetailedError = require('../addDetailedError.js');
const addDetailedError = require('../addDetailedError');

const Errors = require('../../transport/errors');
const beautifyStackTrace = require('../beautifyStackTrace');

const alwaysDisplayError = require('../alwaysDisplayError.js');
const alwaysDisplayError = require('../alwaysDisplayError');

const Severity = {
LOG: 'LOG',
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/periodic-promise.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const EventEmitter = require('events');
const createPromise = require('./createPromise.js');
const createPromise = require('./createPromise');

class PeriodicPromise extends EventEmitter {
get rescheduleInterval() {
Expand Down
4 changes: 2 additions & 2 deletions lib/utils/stackTrace.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const boxen = require('boxen');
const {colors} = require('./chalkColors.js');
const isErrorObject = require('./isErrorObject.js');
const addDetailedError = require('./addDetailedError.js');
const isErrorObject = require('./isErrorObject');
const addDetailedError = require('./addDetailedError');
const indentRegex = /^/gm;

const stackTraceFilter = function (parts) {
Expand Down
5 changes: 5 additions & 0 deletions lib/utils/types/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface NightwatchError extends Error {
detailedErr: string;
link: string;
help: string[];
}
Loading