diff --git a/src/commander/capture.ts b/src/commander/capture.ts index ba67936d..a0bfc757 100644 --- a/src/commander/capture.ts +++ b/src/commander/capture.ts @@ -9,6 +9,9 @@ import createBuild from '../tasks/createBuild.js' import captureScreenshots from '../tasks/captureScreenshots.js' import finalizeBuild from '../tasks/finalizeBuild.js' import { validateWebStaticConfig } from '../lib/schemaValidation.js' +import constants from '../lib/constants.js'; +import pkgJSON from '../../package.json' +import chalk from 'chalk' const command = new Command(); @@ -29,7 +32,36 @@ command console.log(`Error: The '--buildName' option cannot be an empty string.`); process.exit(1); } - let ctx: Context = ctxInit(command.optsWithGlobals()); + + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } + ctx.isSnapshotCaptured = true if (!fs.existsSync(file)) { diff --git a/src/commander/exec.ts b/src/commander/exec.ts index adf91e80..faff4221 100644 --- a/src/commander/exec.ts +++ b/src/commander/exec.ts @@ -12,6 +12,10 @@ import processSnapshots from '../tasks/processSnapshot.js' import finalizeBuild from '../tasks/finalizeBuild.js' import snapshotQueue from '../lib/snapshotQueue.js' import startTunnel from '../tasks/startTunnel.js' +import fs from 'fs'; +import constants from '../lib/constants.js'; +import pkgJSON from '../../package.json' +import chalk from 'chalk' const command = new Command(); @@ -31,8 +35,40 @@ command console.log(`Error: The '--buildName' option cannot be an empty string.`); process.exit(1); } + + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } + + + + if (!which.sync(execCommand[0], { nothrow: true })) { ctx.log.error(`Error: Command not found "${execCommand[0]}"`); return diff --git a/src/commander/mergeBranch.ts b/src/commander/mergeBranch.ts index 0dcd8900..2dd50548 100644 --- a/src/commander/mergeBranch.ts +++ b/src/commander/mergeBranch.ts @@ -6,6 +6,10 @@ import ctxInit from '../lib/ctx.js'; import fetchBranchInfo from '../tasks/fetchBranchInfo.js' import mergeBuilds from '../tasks/mergeBuilds.js' import getGitInfo from '../tasks/getGitInfo.js' +import constants from '../lib/constants.js'; +import fs from 'fs'; +import pkgJSON from '../../package.json' +import chalk from 'chalk' const command = new Command(); @@ -16,7 +20,35 @@ command .requiredOption('--target ', 'Target branch to merge into') .action(async function(this: Command, options: { source: string, target: string }) { const { source, target } = options; - let ctx: Context = ctxInit(command.optsWithGlobals()); + + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } if (!source || source.trim() === '') { ctx.log.error('Error: The --source option cannot be empty.'); diff --git a/src/commander/mergeBuild.ts b/src/commander/mergeBuild.ts index 513e3624..126eaacb 100644 --- a/src/commander/mergeBuild.ts +++ b/src/commander/mergeBuild.ts @@ -6,6 +6,10 @@ import ctxInit from '../lib/ctx.js'; import fetchBuildInfo from '../tasks/fetchBuildInfo.js' import mergeBuilds from '../tasks/mergeBuilds.js' import getGitInfo from '../tasks/getGitInfo.js' +import constants from '../lib/constants.js'; +import fs from 'fs'; +import pkgJSON from '../../package.json' +import chalk from 'chalk' const command = new Command(); @@ -16,7 +20,33 @@ command .requiredOption('--target ', 'Target build to merge into') .action(async function(this: Command, options: { source: string, target: string }) { const { source, target } = options; - let ctx: Context = ctxInit(command.optsWithGlobals()); + + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } if (!source || source.trim() === '') { ctx.log.error('Error: The --source option cannot be empty.'); diff --git a/src/commander/server.ts b/src/commander/server.ts index 81781622..f062e122 100644 --- a/src/commander/server.ts +++ b/src/commander/server.ts @@ -8,6 +8,10 @@ import getGitInfo from '../tasks/getGitInfo.js'; import createBuildExec from '../tasks/createBuildExec.js'; import snapshotQueue from '../lib/snapshotQueue.js'; import { startPolling, startPingPolling } from '../lib/utils.js'; +import fs from 'fs'; +import constants from '../lib/constants.js'; +import pkgJSON from '../../package.json' +import chalk from 'chalk' const command = new Command(); @@ -23,7 +27,32 @@ command console.log(`Error: The '--buildName' option cannot be an empty string.`); process.exit(1); } - let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } ctx.snapshotQueue = new snapshotQueue(ctx); ctx.totalSnapshots = 0 ctx.isStartExec = true diff --git a/src/commander/stopServer.ts b/src/commander/stopServer.ts index 3aae301e..accbd0ae 100644 --- a/src/commander/stopServer.ts +++ b/src/commander/stopServer.ts @@ -1,6 +1,8 @@ import { Command } from 'commander'; import axios from 'axios'; // Import axios for HTTP requests import chalk from 'chalk' +import { Context } from '../types.js' +import ctxInit from '../lib/ctx.js' const command = new Command(); @@ -15,7 +17,9 @@ command .action(async function(this: Command) { try { const serverAddress = getSmartUIServerAddress(); + let ctx: Context = ctxInit(command.optsWithGlobals()); console.log(chalk.yellow(`Stopping server at ${serverAddress} from terminal...`)); + ctx.log_stop.debug(`Stopping server at ${serverAddress} from terminal...`); // Send POST request to the /stop endpoint with the correct headers const response = await axios.post(`${serverAddress}/stop`, { timeout: 15000 }, { @@ -28,8 +32,11 @@ command if (response.status === 200) { console.log(chalk.green('Server stopped successfully')); console.log(chalk.green(`Response: ${JSON.stringify(response.data)}`)); // Log response data if needed + ctx.log_stop.info('Server stopped successfully'); + ctx.log_stop.debug(`Response: ${JSON.stringify(response.data)}`); } else { console.log(chalk.red('Failed to stop server')); + ctx.log.error('Failed to stop server'); } } catch (error: any) { // Handle any errors during the HTTP request diff --git a/src/commander/upload.ts b/src/commander/upload.ts index 1729bf01..1fb4a61f 100644 --- a/src/commander/upload.ts +++ b/src/commander/upload.ts @@ -10,6 +10,8 @@ import createBuild from '../tasks/createBuild.js'; import uploadScreenshots from '../tasks/uploadScreenshots.js'; import finalizeBuild from '../tasks/finalizeBuild.js'; import constants from '../lib/constants.js'; +import pkgJSON from '../../package.json' +import chalk from 'chalk' const command = new Command(); @@ -30,12 +32,39 @@ command .option('--userName ', 'Specify the LT username') .option('--accessKey ', 'Specify the LT accesskey') .action(async function(directory, _, command) { + + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + const options = command.optsWithGlobals(); if (options.buildName === '') { console.log(`Error: The '--buildName' option cannot be an empty string.`); process.exit(1); } - let ctx: Context = ctxInit(command.optsWithGlobals()); + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } ctx.isSnapshotCaptured = true if (!fs.existsSync(directory)) { diff --git a/src/commander/uploadFigma.ts b/src/commander/uploadFigma.ts index 7dd7ec93..ad7cd0c4 100644 --- a/src/commander/uploadFigma.ts +++ b/src/commander/uploadFigma.ts @@ -12,6 +12,8 @@ import uploadWebFigma from '../tasks/uploadWebFigma.js' import uploadAppFigma from '../tasks/uploadAppFigma.js' import { verifyFigmaWebConfig } from '../lib/config.js' import chalk from 'chalk'; +import constants from '../lib/constants.js'; +import pkgJSON from '../../package.json' const uploadFigma = new Command(); @@ -26,7 +28,34 @@ uploadFigma .option('--markBaseline', 'Mark the uploaded images as baseline') .option('--buildName ', 'Name of the build') .action(async function (file, _, command) { - let ctx: Context = ctxInit(command.optsWithGlobals()); + + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } ctx.isSnapshotCaptured = true; if (!fs.existsSync(file)) { @@ -77,7 +106,35 @@ uploadWebFigmaCommand .option('--buildName ', 'Name of the build') .option('--fetch-results [filename]', 'Fetch results and optionally specify an output file, e.g., .json') .action(async function (file, _, command) { - let ctx: Context = ctxInit(command.optsWithGlobals()); + + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } if (!fs.existsSync(file)) { console.log(`Error: figma-web config file ${file} not found.`); @@ -144,8 +201,33 @@ uploadWebFigmaCommand .option('--buildName ', 'Name of the build') .option('--fetch-results [filename]', 'Fetch results and optionally specify an output file, e.g., .json') .action(async function (file, _, command) { - let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + if (fs.existsSync(constants.LOG_FILE_PATH)) { + fs.unlinkSync(constants.LOG_FILE_PATH); + } + } catch (err) {} + try { + if (fs.existsSync(constants.LOG_FILE_PATH_STOP)) { + fs.unlinkSync(constants.LOG_FILE_PATH_STOP); + } + } catch (err) {} + let ctx: Context = ctxInit(command.optsWithGlobals()); + try { + let { data: { latestVersion, deprecated, additionalDescription } } = await ctx.client.checkUpdate(ctx.log); + console.log(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); + console.log(chalk.yellow(`${additionalDescription}`)); + if (deprecated){ + console.warn(`This version is deprecated. A new version ${latestVersion} is available!`); + } + else if (pkgJSON.version !== latestVersion){ + console.log(chalk.green(`A new version ${latestVersion} is available!`)); + } + else console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } catch (error) { + // console.error(error); + console.log(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); + } if (!fs.existsSync(file)) { console.log(`Error: figma-app config file ${file} not found.`); return; diff --git a/src/index.ts b/src/index.ts index a791be80..a51bc65b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,35 +1,7 @@ #!/usr/bin/env node import commander from './commander/commander.js' -import getEnv from './lib/env.js' -import httpClient from './lib/httpClient.js' -import logger from './lib/logger.js' -import chalk from 'chalk' -import pkgJSON from './../package.json' -import constants from './lib/constants.js'; -import fs from 'fs'; (async function() { - let client = new httpClient(getEnv()); - let log = logger; - - try { - // Delete log file - fs.unlinkSync(constants.LOG_FILE_PATH); - let { data: { latestVersion, deprecated, additionalDescription } } = await client.checkUpdate(log); - log.info(`\nLambdaTest SmartUI CLI v${pkgJSON.version}`); - log.info(chalk.yellow(`${additionalDescription}`)); - if (deprecated){ - log.warn(`This version is deprecated. A new version ${latestVersion} is available!`); - } - else if (pkgJSON.version !== latestVersion){ - log.info(chalk.green(`A new version ${latestVersion} is available!`)); - } - else log.info(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); - } catch (error) { - log.debug(error); - log.info(chalk.gray('https://www.npmjs.com/package/@lambdatest/smartui-cli\n')); - } - commander.parse(); })(); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index b81f8dca..1972f581 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -131,6 +131,7 @@ export default { // log file path LOG_FILE_PATH: '.smartui.log', + LOG_FILE_PATH_STOP: '.smartui_stop.log', // Disallowed file extension FILE_EXTENSION_ZIP: '.zip', diff --git a/src/lib/ctx.ts b/src/lib/ctx.ts index e6faa1c0..47d351da 100644 --- a/src/lib/ctx.ts +++ b/src/lib/ctx.ts @@ -2,7 +2,7 @@ import { Context, Env, WebConfig, MobileConfig, basicAuth, tunnelConfig } from ' import constants from './constants.js' import { version } from '../../package.json' import { validateConfig, validateConfigForScheduled } from './schemaValidation.js' -import logger from './logger.js' +import logger, { logger_stop } from './logger.js' import getEnv from './env.js' import httpClient from './httpClient.js' import fs from 'fs' @@ -102,13 +102,14 @@ export default (options: Record): Context => { } //if config.waitForPageRender has value and if its less than 30000 then make it to 30000 default - if (config.waitForPageRender && config.waitForPageRender < 30000) { - config.waitForPageRender = 30000; - } + // if (config.waitForPageRender && config.waitForPageRender < 30000) { + // config.waitForPageRender = 30000; + // } return { env: env, log: logger, + log_stop: logger_stop, client: new httpClient(env), config: { web: webConfig, diff --git a/src/lib/logger.ts b/src/lib/logger.ts index 2d8376a6..89eee8f0 100644 --- a/src/lib/logger.ts +++ b/src/lib/logger.ts @@ -49,4 +49,32 @@ const logger = createLogger({ })] }); +const logger_stop = createLogger({ + format: format.combine( + format.timestamp(), + format.printf(info => { + let contextString = Object.values(logContext).join(' | '); + let message = (typeof info.message === 'object') ? stringify(info.message) : info.message.trim(); + switch (info.level) { + case 'warn': + message = chalk.yellow(message); + break; + case 'error': + message = chalk.red(message); + break; + } + return (info.level === 'info') ? message : `[${contextString}:${info.level}] ` + message; + }) + ), + transports: [ + new transports.Console({ + level: logLevel() + }), + new transports.File({ + level: 'debug', + filename: constants.LOG_FILE_PATH_STOP + })] +}); + export default logger +export { logger_stop } diff --git a/src/lib/server.ts b/src/lib/server.ts index 29145264..0972d3b4 100644 --- a/src/lib/server.ts +++ b/src/lib/server.ts @@ -107,7 +107,7 @@ export default async (ctx: Context): Promise; try { if(ctx.config.delayedUpload){ - ctx.log.debug("started after processing because of delayedUpload") + ctx.log_stop.debug("started after processing because of delayedUpload") ctx.snapshotQueue?.startProcessingfunc() } await new Promise((resolve) => { @@ -135,19 +135,21 @@ export default async (ctx: Context): Promise; server?: FastifyInstance; client: httpClient;