123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #!/usr/bin/env node
- var debug = require('debug')('ylt:cli');
- var meow = require('meow');
- var path = require('path');
- var EasyXml = require('easyxml');
- var ylt = require('../lib/index');
- var cli = meow({
- help: [
- 'Usage',
- ' yellowlabtools <url> <options>',
- '',
- 'Options:',
- ' --device Simulates a device. Choose between phone (default), tablet, desktop and desktop-hd.',
- ' --screenshot Will take a screenshot and use this value as the output path. It needs to end with ".png".',
- ' --proxy Sets an HTTP proxy to pass through. Syntax is "host:port".',
- ' --cookie Adds a cookie on the main domain.',
- ' --auth-user Basic HTTP authentication username.',
- ' --auth-pass Basic HTTP authentication password.',
- ' --block-domain Disallow requests to given (comma-separated) domains.',
- ' --allow-domain Only allow requests to given (comma-separated) domains.',
- ' --no-externals Block all domains except the main one.',
- ' --reporter The output format: "json" or "xml". Default is "json".',
- ''
- ].join('\n'),
- pkg: require('../package.json')
- });
- // Check parameters
- if (cli.input.length < 1) {
- cli.showHelp();
- }
- var url = cli.input[0];
- var options = {};
- // Screenshot option
- var screenshot = cli.flags.screenshot;
- if (screenshot && (typeof screenshot !== 'string' || screenshot.toLowerCase().indexOf('.png', screenshot.length - 4) === -1)) {
- console.error('Incorrect parameters: screenshot must be a path that ends with ".png"');
- process.exit(1);
- }
- if (screenshot) {
- if (path.resolve(screenshot) !== path.normalize(screenshot)) {
- // It is not an absolute path, so it is relative to the current command-line directory
- screenshot = path.join(process.cwd(), screenshot);
- }
- options.screenshot = cli.flags.screenshot;
- }
- // Device simulation
- options.device = cli.flags.device || 'mobile';
- // Wait for CSS selector
- options.waitForSelector = cli.flags.waitForSelector || null;
- // Proxy
- options.proxy = cli.flags.proxy || null;
- // Cookie
- options.cookie = cli.flags.cookie || null;
- // HTTP basic auth
- options.authUser = cli.flags.authUser || null;
- options.authPass = cli.flags.authPass || null;
- // Domain blocking
- options.blockDomain = cli.flags.blockDomain || null;
- options.allowDomain = cli.flags.allowDomain || null;
- options.noExternals = cli.flags.noExternals || null;
- // Output format
- if (cli.flags.reporter && cli.flags.reporter !== 'json' && cli.flags.reporter !== 'xml') {
- console.error('Incorrect parameters: reporter has to be "json" or "xml"');
- process.exit(1);
- }
- (function execute(url, options) {
- 'use strict';
- ylt(url, options).
- then(function(data) {
- debug('Success');
- switch(cli.flags.reporter) {
- case 'xml':
- var serializer = new EasyXml({
- manifest: true
- });
- // Remove some heavy parts of the results object
- delete data.toolsResults;
- var xmlOutput = serializer.render(data);
- // Remove special chars from XML tags: # [ ]
- xmlOutput = xmlOutput.replace(/<([^>]*)#([^>]*)>/g, '<$1>');
- xmlOutput = xmlOutput.replace(/<([^>]*)\[([^>]*)>/g, '<$1>');
- xmlOutput = xmlOutput.replace(/<([^>]*)\]([^>]*)>/g, '<$1>');
- // Remove special chars from text content: \n \0
- xmlOutput = xmlOutput.replace(/(<[a-zA-Z]*>[^<]*)\n([^<]*<\/[a-zA-Z]*>)/g, '$1$2');
- xmlOutput = xmlOutput.replace(/\0/g, '');
- xmlOutput = xmlOutput.replace(/\uFFFF/g, '');
- xmlOutput = xmlOutput.replace(/\u0002/g, '');
- console.log(xmlOutput);
- break;
- default:
- console.log(JSON.stringify(data, null, 2));
- }
- }).fail(function(err) {
-
- debug('Test failed for %s', url);
- console.error(err);
-
- });
- debug('Test launched...');
- })(url, options);
|