import { mkdir, rm, symlink } from 'node:fs/promises' import url from 'node:url' import path from 'node:path' import { spawnSync } from 'node:child_process' const __dirname = path.dirname(url.fileURLToPath(import.meta.url)) const ROOT = path.resolve(__dirname, '..', '..') const TS_PARAMETER = '--ts=' const tsArg = process.argv.find((v) => v.startsWith(TS_PARAMETER)) const tsVersion = tsArg ? tsArg.slice(TS_PARAMETER.length) : undefined const tsDir = tsVersion ? path.join(__dirname, '@typescript', `ts${tsVersion}`) : '' // TypeScript project root for testing particular typings const outDirs = [ 'webdriverio', 'webdriver', 'mocha', 'jasmine', 'cucumber' ] const packages = { 'webdriver': 'packages/webdriver', 'webdriverio': 'packages/webdriverio', '@wdio/globals': 'packages/wdio-globals', '@wdio/utils': 'packages/wdio-utils', '@wdio/browser-runner': 'packages/wdio-browser-runner', '@wdio/reporter': 'packages/wdio-reporter', '@wdio/allure-reporter': 'packages/wdio-allure-reporter', '@wdio/appium-service': 'packages/wdio-appium-service', '@wdio/browserstack-service': 'packages/wdio-browserstack-service', '@wdio/cucumber-framework': 'packages/wdio-cucumber-framework', '@wdio/lighthouse-service': 'packages/wdio-lighthouse-service', '@wdio/firefox-profile-service': 'packages/wdio-firefox-profile-service', '@wdio/jasmine-framework': 'packages/wdio-jasmine-framework', '@wdio/mocha-framework': 'packages/wdio-mocha-framework', '@wdio/protocols': 'packages/wdio-protocols', '@wdio/sauce-service': 'packages/wdio-sauce-service', '@wdio/shared-store-service': 'packages/wdio-shared-store-service', '@wdio/static-server-service': 'packages/wdio-static-server-service', '@wdio/sumologic-reporter': 'packages/wdio-sumologic-reporter', '@wdio/testingbot-service': 'packages/wdio-testingbot-service', // '@types/puppeteer': 'packages/webdriverio/node_modules/@types/puppeteer' } /** * copy package.json and typings from package to type-generation/test/.../node_modules */ async function copy() { if (tsVersion) { spawnSync('npm', ['ci'], { cwd: tsDir }) } await Promise.all( outDirs.map(async (outDir) => { await Promise.all(Object.keys(packages).map(async (packageName) => { const destination = path.join(__dirname, outDir, 'node_modules', packageName) const packageDir = packages[packageName] const destDir = destination.split(path.sep).slice(0, -1).join(path.sep) const target = path.join(ROOT, packageDir) await mkdir(destDir, { recursive: true }) return symlink(target, destination, 'dir') })) if (tsVersion) { const typescriptDirs = ['typescript', '.bin'] await Promise.all(typescriptDirs.map((d) => symlink( path.join(tsDir, 'node_modules', d), path.join(__dirname, outDir, 'node_modules', d), 'dir' ) )) } }) ) } /** * delete eventual artifacts from test folders */ async function clean() { const artifactDirs = ['node_modules', 'dist'] await Promise.all(artifactDirs.map((dir) => Promise.all(outDirs.map((outDir) => rm(path.join(__dirname, outDir, dir), { recursive: true, force: true }) )) )) } await clean() await copy()