UNPKG

protractor-pom-generator

Version:

A small tool use for generating page object model for protractor.

127 lines (117 loc) 3.99 kB
#!/usr/bin/env node 'use strict'; require('babel-register'); var ArgumentParser = require('argparse').ArgumentParser; var path = require('path'); var rootDir = path.join(__dirname, '..'); var libsDir = path.join(__dirname, 'libs'); var packagejson = require(path.join(rootDir, 'package.json')); var parser = new ArgumentParser({ description: packagejson.description, version: packagejson.version }); var JSDOM = require("jsdom"); parser.addArgument(['-l', '--language'], { choices: ['cs', 'java', 'robot', 'js'], help: 'Language target', required: true }); parser.addArgument(['-n', '--name'], { help: 'Page name (no spaces)', required: true }); parser.addArgument(['-d', '--destination'], { help: 'Destination page name (no spaces)', required: false }); parser.addArgument(['-u', '--url'], { help: 'Source url', required: false }); parser.addArgument(['-f', '--file'], { help: 'Path to source file', required: false }); var args = parser.parseArgs(); var execDir = process.cwd(); var fs = require('fs'); var mkdirp = require('mkdirp'); var common = require(path.join(libsDir, 'common.js')).Common; var generator = require(path.join(libsDir, 'generator.js')).Generator; global.Handlebars = require('handlebars'); require(path.join(libsDir, 'helpers.js')); var overrides = { model: { name: args.name.replace(/\s+/g, ''), target: args.destination } }; var paths = { config: path.join(rootDir, 'configs', args.language + '.json'), target: path.join(execDir, args.destination || 'pages', args.name + '.' + args.language), template: path.join(rootDir, 'templates', args.language + '.handlebars') }; var targets = { cs: { label: 'C#' }, java: { label: 'Java' }, robot: { label: 'Robot Framework' }, js: { label: 'JS' } }; function getFileContent(path) { var response = ''; try { response = fs.readFileSync(path, 'utf-8'); } catch (ex) { if (ex.code === 'ENOENT') { console.error(path + ' does not exist.'); } throw ex; } return response; } function generatePage(dom) { try { var _generator = new generator(); var _common = new common(); var config = require(paths.config); config = _common.setDefaultValues(config); overrides.model.include = config.model.include; overrides.model.namespace = config.model.namespace; var input = Object.extend({}, config, overrides); var output = _generator.generate(dom.window, input); var template = getFileContent(paths.template); var generated = Handlebars.compile(template)(output); mkdirp.sync(path.dirname(paths.target)); fs.writeFileSync(paths.target, generated); console.log('The file is saved: ' + paths.target); } catch (e) { console.log("There is an error when generating, please retry "); console.log(e); } finally { dom.window.close(); } } var virtualConsole = new JSDOM.VirtualConsole(); var scripts = [path.join(libsDir, 'jquery-3.3.1.js'), path.join(libsDir, 'treewalker-polyfill-0.2.0.js')]; var options = { runScripts: "dangerously", virtualConsole: virtualConsole, pretendToBeVisual: true, FetchExternalResources: scripts, ProcessExternalResources: scripts, resources: "usable" // need this to execute scripts }; console.log("Start generating page ......"); if (args.url && args.file) { throw new Error("Please choose only one parameter : file or url. This stupid tool can not generate more than a page at once"); } else if (args.url) { JSDOM.JSDOM.fromURL(args.url, options).then(function (dom) { generatePage(dom); }); } else if (args.file) { JSDOM.JSDOM.fromFile(args.file, options).then(function (dom) { generatePage(dom); }); } else { throw new Error("How can I know what page youre gonna generate? Please input your source by url or from file "); }