diff --git a/core/api/package.json b/core/api/package.json index 35024bfb2..a2a7fb53e 100644 --- a/core/api/package.json +++ b/core/api/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/async-assert/package.json b/core/async-assert/package.json index a959b5e82..58a02696b 100644 --- a/core/async-assert/package.json +++ b/core/async-assert/package.json @@ -15,7 +15,8 @@ "url": "git+https://github.com/ringcentral/testring.git" }, "scripts": { - "test": "echo \"Error: run tests from root\" && exit 1" + "test": "echo \"Error: run tests from root\" && exit 1", + "build": "tsc -p tsconfig.build.json" }, "bugs": { "url": "https://github.com/ringcentral/testring/issues" diff --git a/core/async-breakpoints/package.json b/core/async-breakpoints/package.json index afaaafa34..911f02025 100644 --- a/core/async-breakpoints/package.json +++ b/core/async-breakpoints/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "bugs": { diff --git a/core/child-process/package.json b/core/child-process/package.json index 7ecb3877e..3eefcca93 100644 --- a/core/child-process/package.json +++ b/core/child-process/package.json @@ -11,6 +11,9 @@ "@testring/types": "0.8.1", "@testring/utils": "0.8.1" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT" } diff --git a/core/cli-config/package.json b/core/cli-config/package.json index bbdeb51f3..b6bf6012f 100644 --- a/core/cli-config/package.json +++ b/core/cli-config/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/cli/package.json b/core/cli/package.json index d29680b72..45e406882 100644 --- a/core/cli/package.json +++ b/core/cli/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/dependencies-builder/package.json b/core/dependencies-builder/package.json index 3acb24484..47bca1f9b 100644 --- a/core/dependencies-builder/package.json +++ b/core/dependencies-builder/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/fs-reader/package.json b/core/fs-reader/package.json index a0654f7f6..ae4168061 100644 --- a/core/fs-reader/package.json +++ b/core/fs-reader/package.json @@ -10,7 +10,8 @@ "author": "RingCentral", "license": "MIT", "scripts": { - "test:performance": "mocha --performance --reporter spec" + "test:performance": "mocha --performance --reporter spec", + "build": "tsc -p tsconfig.build.json" }, "dependencies": { "@testring/logger": "0.8.1", diff --git a/core/fs-store/package.json b/core/fs-store/package.json index f32509de5..8ee2e203a 100644 --- a/core/fs-store/package.json +++ b/core/fs-store/package.json @@ -24,7 +24,8 @@ "@testring/utils": "0.8.1" }, "scripts": { - "test": "mocha" + "test": "mocha", + "build": "tsc -p tsconfig.build.json" }, "bugs": { "url": "https://github.com/ringcentral/testring/issues" diff --git a/core/logger/package.json b/core/logger/package.json index 5a5277aa6..c0f1c5aff 100644 --- a/core/logger/package.json +++ b/core/logger/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/pluggable-module/package.json b/core/pluggable-module/package.json index 89f9167a0..fbd0287d8 100644 --- a/core/pluggable-module/package.json +++ b/core/pluggable-module/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/plugin-api/package.json b/core/plugin-api/package.json index 424cd0451..ade620f93 100644 --- a/core/plugin-api/package.json +++ b/core/plugin-api/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/sandbox/package.json b/core/sandbox/package.json index f00f98d31..43ed0bca0 100644 --- a/core/sandbox/package.json +++ b/core/sandbox/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/test-run-controller/package.json b/core/test-run-controller/package.json index b750ac29f..1adbb6829 100644 --- a/core/test-run-controller/package.json +++ b/core/test-run-controller/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/test-worker/package.json b/core/test-worker/package.json index 063ccc47a..b5014bc84 100644 --- a/core/test-worker/package.json +++ b/core/test-worker/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/testring/package.json b/core/testring/package.json index 53eaa799f..4675bef8a 100644 --- a/core/testring/package.json +++ b/core/testring/package.json @@ -11,6 +11,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/transport/package.json b/core/transport/package.json index b1239c589..7f18b38d9 100644 --- a/core/transport/package.json +++ b/core/transport/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/types/package.json b/core/types/package.json index 14980569e..ccb4089c0 100644 --- a/core/types/package.json +++ b/core/types/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/core/utils/package.json b/core/utils/package.json index 9daabf320..714e6c995 100644 --- a/core/utils/package.json +++ b/core/utils/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 42da099a0..4703067d7 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "test:ci": "npm run test:coverage && npm run test:e2e", "build": "npm run build:main && npm run build:devtool && npm run build:extension", "build:watch": "lerna exec --ignore=\"@testring/@(e2e-test-app|devtool-frontend|devtool-extension|ui-kit)\" --parallel -- tsc --watch --inlineSourceMap", - "build:main": "lerna exec --ignore=\"@testring/@(e2e-test-app|devtool-frontend|devtool-extension|ui-kit)\" -- tsc -p tsconfig.build.json", + "build:main": "lerna run build --ignore=\"@testring/@(e2e-test-app|devtool-frontend|devtool-extension|ui-kit)\"", "check-types:main": "lerna exec --ignore=\"@testring/@(e2e-test-app|devtool-frontend|devtool-extension|ui-kit)\" -- tsc", "build:devtool": "lerna run --stream --scope @testring/devtool-frontend build", "build:extension": "lerna run --stream --scope @testring/devtool-extension build", diff --git a/packages/browser-proxy/package.json b/packages/browser-proxy/package.json index bd997fcda..c46003bc8 100644 --- a/packages/browser-proxy/package.json +++ b/packages/browser-proxy/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/packages/client-ws-transport/package.json b/packages/client-ws-transport/package.json index b43f44e18..3c8a5f4e6 100644 --- a/packages/client-ws-transport/package.json +++ b/packages/client-ws-transport/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/packages/devtool-backend/package.json b/packages/devtool-backend/package.json index eb55928ec..1de2a6e68 100644 --- a/packages/devtool-backend/package.json +++ b/packages/devtool-backend/package.json @@ -10,7 +10,8 @@ "license": "MIT", "scripts": { "start": "ts-node src/test-server.ts", - "start:watch": "nodemon --watch 'src/**/*' -e ts,tsx --exec 'ts-node' ./src/index.ts" + "start:watch": "nodemon --watch 'src/**/*' -e ts,tsx --exec 'ts-node' ./src/index.ts", + "build": "tsc -p tsconfig.build.json" }, "dependencies": { "@testring/child-process": "0.8.1", diff --git a/packages/devtool-extension/static/manifest.json b/packages/devtool-extension/static/manifest.json index e74cf3708..e05dc8bfb 100644 --- a/packages/devtool-extension/static/manifest.json +++ b/packages/devtool-extension/static/manifest.json @@ -1,6 +1,9 @@ { "manifest_version": 2, "name": "TestRing", + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "description": "TestRing recording extension.", "browser_action": { diff --git a/packages/download-collector-crx/package.json b/packages/download-collector-crx/package.json index 815cab225..ae957f106 100644 --- a/packages/download-collector-crx/package.json +++ b/packages/download-collector-crx/package.json @@ -10,10 +10,11 @@ "author": "RingCentral", "license": "MIT", "scripts": { - "postinstall": "shx mkdir -p dist && crx pack src/extension -o dist/extension.crx" + "postinstall": "shx mkdir -p dist && crx pack src/extension -o dist/extension.crx", + "build": "tsc -p tsconfig.build.json" }, "dependencies": { "crx": "5.0.1", "shx": "0.3.4" } -} +} \ No newline at end of file diff --git a/packages/e2e-test-app/test/selenium/config.coverage.js b/packages/e2e-test-app/test/selenium/config.coverage.js index 362890ce1..ade5e284d 100644 --- a/packages/e2e-test-app/test/selenium/config.coverage.js +++ b/packages/e2e-test-app/test/selenium/config.coverage.js @@ -45,6 +45,7 @@ module.exports = async (config) => { { clientTimeout: 60000, path: '/wd/hub', + localVersion: 'v4', chromeDriverPath: process.env['CHROMEDRIVER_PATH'] || chromedriver.executablePath, workerLimit: 'local', capabilities: local diff --git a/packages/element-path/package.json b/packages/element-path/package.json index 789154c42..fe42cbfc1 100644 --- a/packages/element-path/package.json +++ b/packages/element-path/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT" } diff --git a/packages/http-api/package.json b/packages/http-api/package.json index 43826c835..d388cad31 100644 --- a/packages/http-api/package.json +++ b/packages/http-api/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/packages/plugin-babel/package.json b/packages/plugin-babel/package.json index 7af26292a..0d11ca6fe 100644 --- a/packages/plugin-babel/package.json +++ b/packages/plugin-babel/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/packages/plugin-fs-store/package.json b/packages/plugin-fs-store/package.json index c0dfa0d60..04a3a7dd2 100644 --- a/packages/plugin-fs-store/package.json +++ b/packages/plugin-fs-store/package.json @@ -19,7 +19,8 @@ "@testring/transport": "0.8.1" }, "scripts": { - "test": "mocha" + "test": "mocha", + "build": "tsc -p tsconfig.build.json" }, "bugs": { "url": "https://github.com/ringcentral/testring/issues" diff --git a/packages/plugin-selenium-driver/copy-selenium-server.js b/packages/plugin-selenium-driver/copy-selenium-server.js new file mode 100644 index 000000000..ad21ab032 --- /dev/null +++ b/packages/plugin-selenium-driver/copy-selenium-server.js @@ -0,0 +1,40 @@ +const fs = require('fs'); +const path = require('path'); + +/** + * Copy selenium-server folder to dist directory + */ +function copySeleniumServer() { + const sourceDir = path.join(__dirname, 'src', 'selenium-server-v4'); + const destDir = path.join(__dirname, 'dist', 'selenium-server-v4'); + + try { + // Check if source directory exists + if (!fs.existsSync(sourceDir)) { + console.error(`Source directory does not exist: ${sourceDir}`); + process.exit(1); + } + + // Create dist directory if it doesn't exist + const distDir = path.join(__dirname, 'dist'); + if (!fs.existsSync(distDir)) { + fs.mkdirSync(distDir, { recursive: true }); + } + + // Remove existing selenium-server folder in dist if it exists + if (fs.existsSync(destDir)) { + fs.rmSync(destDir, { recursive: true, force: true }); + } + + // Copy the entire selenium-server folder + fs.cpSync(sourceDir, destDir, { recursive: true }); + + console.log(`Successfully copied selenium-server folder to ${destDir}`); + } catch (error) { + console.error('Error copying selenium-server folder:', error.message); + process.exit(1); + } +} + +// Run the copy function +copySeleniumServer(); diff --git a/packages/plugin-selenium-driver/package.json b/packages/plugin-selenium-driver/package.json index 7251eb2d8..664669d74 100644 --- a/packages/plugin-selenium-driver/package.json +++ b/packages/plugin-selenium-driver/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json && node copy-selenium-server.js" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/packages/plugin-selenium-driver/src/plugin/index.ts b/packages/plugin-selenium-driver/src/plugin/index.ts index b69a7d2a9..31a2ce2f0 100644 --- a/packages/plugin-selenium-driver/src/plugin/index.ts +++ b/packages/plugin-selenium-driver/src/plugin/index.ts @@ -1,4 +1,4 @@ -import {SeleniumPluginConfig} from '../types'; +import {SeleniumPluginConfig, SeleniumVersion} from '../types'; import { IBrowserProxyPlugin, SavePdfOptions, @@ -7,6 +7,8 @@ import { } from '@testring/types'; import {ChildProcess} from 'child_process'; +import * as path from 'path'; +import * as fs from 'fs'; import {remote} from 'webdriverio'; import * as deepmerge from 'deepmerge'; @@ -49,6 +51,8 @@ const DEFAULT_CONFIG: SeleniumPluginConfig = { } as any, cdpCoverage: false, disableClientPing: false, + localVersion: 'v3' as SeleniumVersion, + seleniumArgs: [], }; function delay(timeout: number) { @@ -68,6 +72,97 @@ function stringifyWindowFeatures(windowFeatures: WindowFeaturesConfig) { return result; } +function getSeleniumJarPath(version: SeleniumVersion): string { + if (version === 'v4') { + // For Selenium v4, we expect the JAR to be in a specific location + const seleniumV4Path = path.join(__dirname, '..', 'selenium-server-v4', 'selenium-server-4.34.0.jar'); + + if (!fs.existsSync(seleniumV4Path)) { + throw new Error( + `Selenium v4 JAR not found at expected path: ${seleniumV4Path}. ` + + 'Please ensure selenium-server-4.34.0.jar is available in the package directory.' + ); + } + + return seleniumV4Path; + } + + // For v3 and other versions, use the original logic + const seleniumServer = require('selenium-server'); + return seleniumServer.path; +} + + +function setupProcessListeners( + seleniumProcess: ChildProcess, + resolve: () => void, + reject: (error: Error) => void, + version: SeleniumVersion, + logger: { verbose: (message: string) => void } +) { + if (!seleniumProcess.stderr && !seleniumProcess.stdout) { + reject(new Error('There is no STDERR or STDOUT on selenium worker')); + return; + } + + let isReady = false; + const timeout = setTimeout(() => { + if (!isReady) { + reject(new Error(`Selenium server failed to start within 30 seconds (version: ${version})`)); + } + }, 30000); + + // Check for server readiness + const readyMessages: Record = { + v4: 'Started Selenium Standalone', + v3: 'SeleniumServer.boot', + }; + + const checkForReadyMessage = (message: string, stream: 'stdout' | 'stderr') => { + logger.verbose(`[Selenium ${version}] [${stream.toUpperCase()}] ${message.trim()}`); + + if (message.includes(readyMessages[version])) { + isReady = true; + clearTimeout(timeout); + setTimeout(resolve, 500); // Small delay to ensure server is fully ready + } + }; + + // For v4, ready message appears in stdout + if (version === 'v4') { + seleniumProcess.stdout?.on('data', (data) => { + checkForReadyMessage(data.toString(), 'stdout'); + }); + + // Also listen to stderr for error messages + seleniumProcess.stderr?.on('data', (data) => { + logger.verbose(`[Selenium ${version}] [STDERR] ${data.toString().trim()}`); + }); + } else { + // For v3, ready message appears in stderr + seleniumProcess.stderr?.on('data', (data) => { + checkForReadyMessage(data.toString(), 'stderr'); + }); + + // Also listen to stdout for other messages + seleniumProcess.stdout?.on('data', (data) => { + logger.verbose(`[Selenium ${version}] [STDOUT] ${data.toString().trim()}`); + }); + } + + seleniumProcess.on('error', (error) => { + clearTimeout(timeout); + reject(new Error(`Selenium process error: ${error.message}`)); + }); + + seleniumProcess.on('exit', (code) => { + if (!isReady) { + clearTimeout(timeout); + reject(new Error(`Selenium process exited with code ${code} before becoming ready`)); + } + }); +} + export class SeleniumPlugin implements IBrowserProxyPlugin { private logger = loggerClient.withPrefix('[selenium-browser-process]'); @@ -165,49 +260,69 @@ export class SeleniumPlugin implements IBrowserProxyPlugin { return Promise.all(clientsRequests); } - private getChromeDriverArgs() { - let chromeDriverPath; - + private getChromeDriverPath() { if (this.config.chromeDriverPath) { - chromeDriverPath = this.config.chromeDriverPath; - } else { - chromeDriverPath = require('chromedriver').path; + return this.config.chromeDriverPath; } + + return require('chromedriver').path; + } + + private getChromeDriverArgs() { + const chromeDriverPath = this.getChromeDriverPath(); return [`-Dwebdriver.chrome.driver=${chromeDriverPath}`]; } + private buildSeleniumArgs(seleniumJarPath: string, version: SeleniumVersion, port: number, chromeDriverArgs: string[]): string[] { + const args = [...chromeDriverArgs]; + + if (version === 'v4') { + args.push( + '-jar', + seleniumJarPath, + 'standalone', + '--port', + port.toString(), + '--bind-host', + 'false', + ); + } else { + args.push('-jar', seleniumJarPath, '-port', port.toString()); + } + + // Append custom selenium arguments if provided + if (this.config.seleniumArgs && this.config.seleniumArgs.length > 0) { + args.push(...this.config.seleniumArgs); + } + + return args; + } + private async runLocalSelenium() { - const seleniumServer = require('selenium-server'); - const seleniumJarPath = seleniumServer.path; - this.logger.debug('Init local selenium server'); + const version = this.config.localVersion || 'v3'; + this.logger.debug(`Init local selenium server (version: ${version})`); try { - this.localSelenium = spawnWithPipes('java', [ - ...this.getChromeDriverArgs(), - '-jar', - seleniumJarPath, - '-port', - this.config.port, - ]); + const seleniumJarPath = getSeleniumJarPath(version); + const chromeDriverArgs = this.getChromeDriverArgs(); + const seleniumArgs = this.buildSeleniumArgs(seleniumJarPath, version, this.config.port || 4444, chromeDriverArgs); + + this.logger.debug(`Starting Selenium with command: java ${seleniumArgs.join(' ')}`); + + this.localSelenium = spawnWithPipes('java', seleniumArgs); this.waitForReadyState = new Promise((resolve, reject) => { - if (this.localSelenium?.stderr) { - this.localSelenium.stderr.on('data', (data) => { - const message = data.toString(); - - this.logger.verbose(message); - - if (message.includes('SeleniumServer.boot')) { - delay(500).then(resolve); - } - }); - } else { - reject(new Error('There is no STDERR on selenium worker')); - } + setupProcessListeners(this.localSelenium!, resolve, reject, version, this.logger); }); + + // Wait for the server to be ready + await this.waitForReadyState; + this.logger.debug(`Selenium server (${version}) is ready`); + } catch (err) { - this.logger.error('Local selenium server init failed', err); + this.logger.error(`Local selenium server init failed (version: ${version})`, err); + throw err; // Re-throw to allow upstream error handling } } diff --git a/packages/plugin-selenium-driver/src/selenium-server-v4/selenium-server-4.34.0.jar b/packages/plugin-selenium-driver/src/selenium-server-v4/selenium-server-4.34.0.jar new file mode 100644 index 000000000..4e5bbd1df Binary files /dev/null and b/packages/plugin-selenium-driver/src/selenium-server-v4/selenium-server-4.34.0.jar differ diff --git a/packages/plugin-selenium-driver/src/types.ts b/packages/plugin-selenium-driver/src/types.ts index def83fddb..45342e548 100644 --- a/packages/plugin-selenium-driver/src/types.ts +++ b/packages/plugin-selenium-driver/src/types.ts @@ -1,5 +1,7 @@ import {Capabilities} from '@wdio/types'; +export type SeleniumVersion = 'v3' | 'v4'; + export type SeleniumPluginConfig = Capabilities.WebdriverIOConfig & { chromeDriverPath?: string; recorderExtension: boolean; @@ -11,4 +13,6 @@ export type SeleniumPluginConfig = Capabilities.WebdriverIOConfig & { workerLimit?: number | 'local'; disableClientPing?: boolean; delayAfterSessionClose?: number; + localVersion?: SeleniumVersion; + seleniumArgs?: string[]; // Additional CLI arguments to pass to Selenium server }; diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index b2181fb09..5ab83eda0 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": { diff --git a/packages/web-application/package.json b/packages/web-application/package.json index 37b0d8af9..d1a7f7950 100644 --- a/packages/web-application/package.json +++ b/packages/web-application/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/ringcentral/testring.git" }, + "scripts": { + "build": "tsc -p tsconfig.build.json" + }, "author": "RingCentral", "license": "MIT", "dependencies": {