#!/usr/bin/env node /** * This script generates new sub package with initial structure and files */ import fs from 'node:fs' import url from 'node:url' import path from 'node:path' import shell from 'shelljs' import inquirer from 'inquirer' const __dirname = path.dirname(url.fileURLToPath(import.meta.url)) const questions = [{ type: 'list', name: 'packageType', message: 'Select sub package type:', choices: ['reporter', 'service', 'runner', 'framework'], default: 'reporter' }, { type: 'input', name: 'packageName', message: 'Provide sub package name:' }] const { packageName, packageType } = await inquirer.prompt(questions) const packagesDir = path.join(__dirname, '..', 'packages') const fullPackageName = `wdio-${packageName}-${packageType}` const fullScopedPackageName = `@wdio/${packageName}-${packageType}` const mainPackageFolder = path.join(packagesDir, fullPackageName) const mainPackageFolderFiles = [{ name: '.npmignore', content: 'src\ntests\ntsconfig.json\ntsconfig.prod.json' }, { name: 'tsconfig.json', content: `{ "extends": "../../tsconfig", "compilerOptions": { "baseUrl": ".", "outDir": "./build", "rootDir": "./src" }, "include": [ "src/**/*" ] }` }, { name: 'tsconfig.prod.json', content: `{ "extends": "../../tsconfig.prod", "compilerOptions": { "baseUrl": ".", "outDir": "./build", "rootDir": "./src" }, "include": [ "src/**/*" ] }` }, { name: 'package.json', content: `{ "name": "${fullScopedPackageName}", "version": "0.0.0", "description": "A WebdriverIO ${packageType} that ", "author": " ", "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/${fullPackageName}", "license": "MIT", "type": "module", "exports": "./build/index.js", "types": "./build/index.d.ts", "typeScriptVersion": "3.8.3", "engines": { "node": ">=12.0.0" }, "repository": { "type": "git", "url": "git+https://github.com/webdriverio/webdriverio.git" }, "keywords": [ "webdriver", "wdio", "wdio-${packageType}" ], "bugs": { "url": "https://github.com/webdriverio/webdriverio/issues" }, "dependencies": { }, "publishConfig": { "access": "public" } }` }, { name: 'README.md', content: `WebdriverIO ${packageName.toUpperCase()} ${packageType.charAt(0).toUpperCase()}${packageType.substr(1)}\n========================` }] const srcPackageFolder = path.join(mainPackageFolder, 'src') const srcPackageFolderFiles = [{ name: 'index.js', content: 'export default {}' }] const testsPackageFolder = path.join(mainPackageFolder, 'tests') const testsPackageFolderFiles = [{ name: 'example.test.ts', content: `import { describe, it, expect } from 'vitest' describe('Unit test example', () => { it('Test #1', () => { expect(1).toBe(1) }) })` }] const existingPackages = fs.readdirSync(packagesDir) .map(name => path.join(packagesDir, name)) .filter(source => fs.lstatSync(source).isDirectory()) const createFile = (file: string, content: string) => { shell.touch(file) shell.ShellString(content).to(file) } if (packageName === '') { throw new Error('Package name can not be empty') } if (existingPackages.includes(mainPackageFolder)) { throw new Error(`Package '${fullPackageName}' already exists. Please choose another name.`) } // create package structure [mainPackageFolder, srcPackageFolder, testsPackageFolder].map(folder => shell.mkdir(folder)) // create main folder files mainPackageFolderFiles.map(file => createFile(path.join(mainPackageFolder, file.name), file.content)) // create src folder files srcPackageFolderFiles.map(file => createFile(path.join(srcPackageFolder, file.name), file.content)) // create tests folder files testsPackageFolderFiles.map(file => createFile(path.join(testsPackageFolder, file.name), file.content))