144 lines
3.9 KiB
JavaScript
144 lines
3.9 KiB
JavaScript
#!/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 <provide ${packageType} description>",
|
|
"author": "<your-name> <your@email.com>",
|
|
"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))
|