From f1818d2e36edad25189ec25f6ee1c90869dd749f Mon Sep 17 00:00:00 2001 From: Pinank Solanki Date: Fri, 24 Nov 2023 00:03:50 +0530 Subject: [PATCH 1/2] Add smartUISnapshot in JS selenium --- js/.gitignore | 1 + js/packages/sdk-utils/index.js | 9 + js/packages/sdk-utils/package.json | 25 ++ js/packages/sdk-utils/src/lib/httpClient.js | 52 ++++ js/packages/sdk-utils/src/lib/logger.js | 34 +++ js/packages/sdk-utils/src/lib/utils.js | 13 + js/packages/sdk-utils/src/smartui.js | 40 +++ js/packages/selenium-driver/index.js | 5 + js/packages/selenium-driver/package.json | 24 ++ js/packages/selenium-driver/src/smartui.js | 25 ++ js/packages/selenium-driver/src/utils.js | 7 + js/pnpm-lock.yaml | 275 ++++++++++++++++++++ js/pnpm-workspace.yaml | 2 + 13 files changed, 512 insertions(+) create mode 100644 js/.gitignore create mode 100644 js/packages/sdk-utils/index.js create mode 100644 js/packages/sdk-utils/package.json create mode 100644 js/packages/sdk-utils/src/lib/httpClient.js create mode 100644 js/packages/sdk-utils/src/lib/logger.js create mode 100644 js/packages/sdk-utils/src/lib/utils.js create mode 100644 js/packages/sdk-utils/src/smartui.js create mode 100644 js/packages/selenium-driver/index.js create mode 100644 js/packages/selenium-driver/package.json create mode 100644 js/packages/selenium-driver/src/smartui.js create mode 100644 js/packages/selenium-driver/src/utils.js create mode 100644 js/pnpm-lock.yaml create mode 100644 js/pnpm-workspace.yaml diff --git a/js/.gitignore b/js/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/js/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/js/packages/sdk-utils/index.js b/js/packages/sdk-utils/index.js new file mode 100644 index 0000000..027219c --- /dev/null +++ b/js/packages/sdk-utils/index.js @@ -0,0 +1,9 @@ +import { isSmartUIRunning, fetchDOMSerializer, postSnapshot } from './src/smartui.js' +import logger from './src/lib/logger.js' + +export default { + logger, + fetchDOMSerializer, + postSnapshot, + isSmartUIRunning +} diff --git a/js/packages/sdk-utils/package.json b/js/packages/sdk-utils/package.json new file mode 100644 index 0000000..3958f19 --- /dev/null +++ b/js/packages/sdk-utils/package.json @@ -0,0 +1,25 @@ +{ + "name": "@lambdatest/sdk-utils", + "version": "1.0.0", + "description": "", + "main": "index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/LambdaTest/lambdatet-sdk", + "directory": "js/packages/sdk-utils" + }, + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "lambdatest" + ], + "author": "LambdaTest ", + "license": "MIT", + "dependencies": { + "axios": "^1.6.2", + "chalk": "^5.3.0", + "winston": "^3.11.0" + } +} diff --git a/js/packages/sdk-utils/src/lib/httpClient.js b/js/packages/sdk-utils/src/lib/httpClient.js new file mode 100644 index 0000000..deeed8f --- /dev/null +++ b/js/packages/sdk-utils/src/lib/httpClient.js @@ -0,0 +1,52 @@ +import axios from 'axios' +import utils from './utils.js' + +class httpClient { + async request(config) { + return axios.request(config) + .then(resp => { + return { + status: resp.status, + statusMessage: resp.statusMessage, + headers: resp.headers, + body: resp.data + }; + }) + .catch(error => { + if (error.response) { + throw new Error(JSON.stringify(error.response.data)); + } + if (error.request) { + throw new Error(error.toJSON().message); + } + throw error; + }); + } + + isSmartUIRunning() { + return this.request({ + url: `${utils.getSmartUIServerAddress()}/healthcheck`, + method: 'GET', + }) + } + + fetchDOMSerializer() { + return this.request({ + url: `${utils.getSmartUIServerAddress()}/domserializer`, + method: 'GET' + }) + } + + postSnapshot(data) { + return this.request({ + url: `${utils.getSmartUIServerAddress()}/snapshot`, + method: 'POST', + data: data, + headers: { + 'Content-Type': 'application/json', + } + }) + } +} + +export default new httpClient(); diff --git a/js/packages/sdk-utils/src/lib/logger.js b/js/packages/sdk-utils/src/lib/logger.js new file mode 100644 index 0000000..35dd080 --- /dev/null +++ b/js/packages/sdk-utils/src/lib/logger.js @@ -0,0 +1,34 @@ +import { createLogger, transports, format, config } from 'winston' +import chalk from 'chalk' + +const logLevel = () => { + let debug = (process.env.LT_SDK_DEBUG === 'true') ? 'debug' : undefined; + return debug || process.env.LT_SDK_LOG_LEVEL || 'info' +} + +export default (logContext) => { + return createLogger({ + level: logLevel(), + format: format.combine( + format.timestamp(), + format.printf(({ message, level }) => { + if (typeof message === 'object') { + message = JSON.stringify(message); + } + switch (level) { + case 'debug': + message = chalk.blue(message); + break; + case 'warn': + message = chalk.yellow(message); + break; + case 'error': + message = chalk.red(message); + break; + } + return `[${logContext}] ${message}`; + }) + ), + transports: [new transports.Console()] + }); +}; diff --git a/js/packages/sdk-utils/src/lib/utils.js b/js/packages/sdk-utils/src/lib/utils.js new file mode 100644 index 0000000..15a8d6b --- /dev/null +++ b/js/packages/sdk-utils/src/lib/utils.js @@ -0,0 +1,13 @@ +import fs from 'fs'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; + +export function getSmartUIServerAddress() { + return process.env.SMARTUI_SERVER_ADDRESS || 'http://localhost:8080' +} + +export function getPackageName() { + return JSON.parse(fs.readFileSync(join(dirname(fileURLToPath(import.meta.url)), '../../package.json'), 'utf-8')).name +} + +export * as default from './utils.js'; diff --git a/js/packages/sdk-utils/src/smartui.js b/js/packages/sdk-utils/src/smartui.js new file mode 100644 index 0000000..57a468a --- /dev/null +++ b/js/packages/sdk-utils/src/smartui.js @@ -0,0 +1,40 @@ +import client from './lib/httpClient.js' +import logger from './lib/logger.js' +import utils from './lib/utils.js' +const log = logger(utils.getPackageName()) + +export async function isSmartUIRunning() { + try { + await client.isSmartUIRunning(); + return true; + } catch (error) { + log.debug(error); + return false; + } +} + +export async function fetchDOMSerializer() { + try { + return await client.fetchDOMSerializer(); + } catch (error) { + log.debug(error); + throw new Error(`fetch DOMSerializer failed`); + } +} + +export async function postSnapshot(snapshotDOM, snapshotName, testType) { + const data = JSON.stringify({ + snapshot: { + dom: snapshotDOM, + name: snapshotName + }, + testType + }); + + try { + return await client.postSnapshot(data); + } catch (error) { + log.debug(error); + throw new Error(`post snapshot failed`); + } +} diff --git a/js/packages/selenium-driver/index.js b/js/packages/selenium-driver/index.js new file mode 100644 index 0000000..86929c6 --- /dev/null +++ b/js/packages/selenium-driver/index.js @@ -0,0 +1,5 @@ +import { smartuiSnapshot } from './src/smartui.js'; + +export { + smartuiSnapshot +}; diff --git a/js/packages/selenium-driver/package.json b/js/packages/selenium-driver/package.json new file mode 100644 index 0000000..f71d516 --- /dev/null +++ b/js/packages/selenium-driver/package.json @@ -0,0 +1,24 @@ +{ + "name": "@lambdatest/selenium-driver", + "version": "1.0.0", + "description": "Selenium driver for all Lambdatest functionalities", + "main": "index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/LambdaTest/lambdatet-sdk", + "directory": "js/packages/selenium-driver" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "type": "module", + "keywords": [ + "lambdatest", + "selenium" + ], + "author": "LambdaTest ", + "license": "MIT", + "dependencies": { + "@lambdatest/sdk-utils": "workspace:^" + } +} diff --git a/js/packages/selenium-driver/src/smartui.js b/js/packages/selenium-driver/src/smartui.js new file mode 100644 index 0000000..0f37ad5 --- /dev/null +++ b/js/packages/selenium-driver/src/smartui.js @@ -0,0 +1,25 @@ +import utils from '@lambdatest/sdk-utils' +import { getPackageName } from './utils.js'; +const pkgName = getPackageName() + +export async function smartuiSnapshot(driver, snapshotName) { + // TODO: check if driver is selenium webdriver object + if (!driver) throw new Error('An instance of the selenium driver object is required.'); + if (!snapshotName) throw new Error('The `snapshotName` argument is required.'); + if (!(await utils.isSmartUIRunning())) throw new Error('SmartUI server is not running.'); + let log = utils.logger(pkgName); + + try { + let resp = await utils.fetchDOMSerializer(); + await driver.executeScript(resp.body.data.dom); + + let { dom } = await driver.executeScript(options => ({ + dom: SmartUIDOM.serialize(options) + }), {}); + + await utils.postSnapshot(dom.html, snapshotName, pkgName); + log.info(`Snapshot captured: ${snapshotName}`); + } catch (error) { + throw new Error(error); + } +} diff --git a/js/packages/selenium-driver/src/utils.js b/js/packages/selenium-driver/src/utils.js new file mode 100644 index 0000000..95c43e3 --- /dev/null +++ b/js/packages/selenium-driver/src/utils.js @@ -0,0 +1,7 @@ +import fs from 'fs'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; + +export function getPackageName() { + return JSON.parse(fs.readFileSync(join(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf-8')).name +} diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml new file mode 100644 index 0000000..f3c66f2 --- /dev/null +++ b/js/pnpm-lock.yaml @@ -0,0 +1,275 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + packages/sdk-utils: + dependencies: + axios: + specifier: ^1.6.2 + version: 1.6.2 + chalk: + specifier: ^5.3.0 + version: 5.3.0 + winston: + specifier: ^3.11.0 + version: 3.11.0 + + packages/selenium-driver: + dependencies: + '@lambdatest/sdk-utils': + specifier: workspace:^ + version: link:../sdk-utils + +packages: + + /@colors/colors@1.6.0: + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + dev: false + + /@dabh/diagnostics@2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: false + + /@types/triple-beam@1.3.5: + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + dev: false + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: false + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: false + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: false + + /logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: false + + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /winston-transport@4.6.0: + resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==} + engines: {node: '>= 12.0.0'} + dependencies: + logform: 2.6.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + dev: false + + /winston@3.11.0: + resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.5 + is-stream: 2.0.1 + logform: 2.6.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.4.3 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.6.0 + dev: false diff --git a/js/pnpm-workspace.yaml b/js/pnpm-workspace.yaml new file mode 100644 index 0000000..18ec407 --- /dev/null +++ b/js/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'packages/*' From cd86958994c6b6ae6a8c48f7f14509c617adc092 Mon Sep 17 00:00:00 2001 From: Pinank Solanki Date: Sat, 25 Nov 2023 13:14:12 +0530 Subject: [PATCH 2/2] Add release github workflow * Need to update it later so that releases for different languages is triggered based on tag --- .github/workflows/release-js.yaml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/release-js.yaml diff --git a/.github/workflows/release-js.yaml b/.github/workflows/release-js.yaml new file mode 100644 index 0000000..89e7411 --- /dev/null +++ b/.github/workflows/release-js.yaml @@ -0,0 +1,30 @@ +name: Publish JS packages + +on: + release: + types: [published] + +jobs: + build-and-publish: + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '16' + registry-url: 'https://registry.npmjs.org' + + - name: Install pnpm + run: npm install -g pnpm + + - name: Install dependencies + run: pnpm install + + - name: Publish packages + run: pnpm publish --recursive --access public --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}