@ -1,2 +1,3 @@
|
||||
wappalyzer.js
|
||||
apps.json
|
||||
/apps.json
|
||||
/wappalyzer.js
|
||||
/node_modules
|
||||
|
@ -1,228 +1,79 @@
|
||||
/**
|
||||
* PhantomJS driver
|
||||
*/
|
||||
|
||||
/** global: phantom */
|
||||
/** global: wappalyzer */
|
||||
|
||||
(function() {
|
||||
var
|
||||
url,
|
||||
originalUrl,
|
||||
scriptDir,
|
||||
scriptPath = require('fs').absolute(require('system').args[0]),
|
||||
resourceTimeout = 9000,
|
||||
args = [], // TODO: Not used, maybe should be `arg`
|
||||
debug = false, // Output debug messages
|
||||
quiet = false; // Don't output errors
|
||||
|
||||
try {
|
||||
// Working directory
|
||||
scriptDir = scriptPath.split('/'); scriptDir.pop(); scriptDir = scriptDir.join('/');
|
||||
|
||||
require('fs').changeWorkingDirectory(scriptDir);
|
||||
|
||||
require('system').args.forEach(function(arg) {
|
||||
var
|
||||
value,
|
||||
arr = /^(--[^=]+)=(.+)$/.exec(arg);
|
||||
|
||||
if ( arr && arr.length === 3 ) {
|
||||
arg = arr[1];
|
||||
value = arr[2];
|
||||
}
|
||||
|
||||
switch ( arg ) {
|
||||
case '-v':
|
||||
case '--verbose':
|
||||
debug = true;
|
||||
|
||||
break;
|
||||
case '-q':
|
||||
case '--quiet':
|
||||
quiet = true;
|
||||
|
||||
break;
|
||||
case '--resource-timeout':
|
||||
if ( value ) {
|
||||
resourceTimeout = value;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
url = originalUrl = arg;
|
||||
}
|
||||
});
|
||||
|
||||
if ( !url ) {
|
||||
throw new Error('Usage: phantomjs ' + require('system').args[0] + ' <url>');
|
||||
}
|
||||
|
||||
if ( !phantom.injectJs('wappalyzer.js') ) {
|
||||
throw new Error('Unable to open file js/wappalyzer.js');
|
||||
}
|
||||
|
||||
wappalyzer.driver = {
|
||||
timeout: 1000,
|
||||
|
||||
/**
|
||||
* Log messages to console
|
||||
*/
|
||||
log: function(args) {
|
||||
if ( args.type === 'error' ) {
|
||||
if ( !quiet ) {
|
||||
require('system').stderr.write(args.message + "\n");
|
||||
}
|
||||
} else if ( debug || args.type !== 'debug' ) {
|
||||
require('system').stdout.write(args.message + "\n");
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Display apps
|
||||
*/
|
||||
displayApps: function() {
|
||||
var
|
||||
app, cats,
|
||||
apps = [];
|
||||
|
||||
wappalyzer.log('driver.displayApps');
|
||||
|
||||
for ( app in wappalyzer.detected[url] ) {
|
||||
cats = [];
|
||||
|
||||
wappalyzer.apps[app].cats.forEach(function(cat) {
|
||||
cats.push(wappalyzer.categories[cat].name);
|
||||
});
|
||||
|
||||
apps.push({
|
||||
name: app,
|
||||
confidence: wappalyzer.detected[url][app].confidenceTotal.toString(),
|
||||
version: wappalyzer.detected[url][app].version,
|
||||
icon: wappalyzer.apps[app].icon || 'default.svg',
|
||||
website: wappalyzer.apps[app].website,
|
||||
categories: cats
|
||||
});
|
||||
}
|
||||
|
||||
wappalyzer.driver.sendResponse(apps);
|
||||
},
|
||||
|
||||
/**
|
||||
* Send response
|
||||
*/
|
||||
sendResponse: function(apps) {
|
||||
apps = apps || [];
|
||||
|
||||
require('system').stdout.write(JSON.stringify({ url: url, originalUrl: originalUrl, applications: apps }) + "\n");
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize
|
||||
*/
|
||||
init: function() {
|
||||
var
|
||||
page, hostname,
|
||||
headers = {},
|
||||
a = document.createElement('a'),
|
||||
json = JSON.parse(require('fs').read('apps.json'));
|
||||
|
||||
wappalyzer.log('driver.init');
|
||||
|
||||
a.href = url.replace(/#.*$/, '');
|
||||
|
||||
hostname = a.hostname;
|
||||
|
||||
wappalyzer.apps = json.apps;
|
||||
wappalyzer.categories = json.categories;
|
||||
|
||||
page = require('webpage').create();
|
||||
|
||||
page.settings.loadImages = false;
|
||||
page.settings.userAgent = 'Mozilla/5.0 (compatible; Wappalyzer; +https://github.com/AliasIO/Wappalyzer)';
|
||||
page.settings.resourceTimeout = resourceTimeout;
|
||||
|
||||
page.onError = function(message) {
|
||||
wappalyzer.log(message, 'error');
|
||||
};
|
||||
|
||||
page.onResourceTimeout = function() {
|
||||
wappalyzer.log('Resource timeout', 'error');
|
||||
|
||||
wappalyzer.driver.sendResponse();
|
||||
|
||||
phantom.exit(1);
|
||||
};
|
||||
|
||||
page.onResourceReceived = function(response) {
|
||||
if ( response.url.replace(/\/$/, '') === url.replace(/\/$/, '') ) {
|
||||
if ( response.redirectURL ) {
|
||||
url = response.redirectURL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( response.stage === 'end' && response.status === 200 && response.contentType.indexOf('text/html') !== -1 ) {
|
||||
response.headers.forEach(function(header) {
|
||||
headers[header.name.toLowerCase()] = header.value;
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
page.onResourceError = function(resourceError) {
|
||||
wappalyzer.log(resourceError.errorString, 'error');
|
||||
};
|
||||
'use strict';
|
||||
|
||||
page.open(url, function(status) {
|
||||
var html, environmentVars = '';
|
||||
const wappalyzer = require('./wappalyzer');
|
||||
const request = require('request');
|
||||
const fs = require('fs');
|
||||
const Browser = require('zombie');
|
||||
|
||||
if ( status === 'success' ) {
|
||||
html = page.content;
|
||||
const json = JSON.parse(fs.readFileSync(__dirname + '/apps.json'));
|
||||
|
||||
if ( html.length > 50000 ) {
|
||||
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
|
||||
}
|
||||
wappalyzer.apps = json.apps;
|
||||
wappalyzer.categories = json.categories;
|
||||
|
||||
// Collect environment variables
|
||||
environmentVars = page.evaluate(function() {
|
||||
var i, environmentVars = '';
|
||||
const driver = {
|
||||
quiet: true,
|
||||
|
||||
for ( i in window ) {
|
||||
environmentVars += i + ' ';
|
||||
}
|
||||
analyze: url => {
|
||||
return new Promise((resolve, reject) => {
|
||||
wappalyzer.driver.log = (message, source, type) => {
|
||||
if ( type === 'error' ) {
|
||||
return reject(message);
|
||||
}
|
||||
|
||||
return environmentVars;
|
||||
});
|
||||
if ( !driver.quiet ) {
|
||||
console.log('[wappalyzer ' + type + ']', '[' + source + ']', message);
|
||||
}
|
||||
};
|
||||
|
||||
wappalyzer.log({ message: 'environmentVars: ' + environmentVars });
|
||||
wappalyzer.driver.displayApps = detected => {
|
||||
var apps = [];
|
||||
|
||||
environmentVars = environmentVars.split(' ').slice(0, 500);
|
||||
Object.keys(detected).forEach(appName => {
|
||||
const app = detected[appName];
|
||||
|
||||
wappalyzer.analyze(hostname, url, {
|
||||
html: html,
|
||||
headers: headers,
|
||||
env: environmentVars
|
||||
});
|
||||
var categories = [];
|
||||
|
||||
phantom.exit(0);
|
||||
} else {
|
||||
wappalyzer.log('Failed to fetch page', 'error');
|
||||
app.props.cats.forEach(id => {
|
||||
var category = {};
|
||||
|
||||
wappalyzer.driver.sendResponse();
|
||||
category[id] = wappalyzer.categories[id].name;
|
||||
|
||||
phantom.exit(1);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
categories.push(category)
|
||||
});
|
||||
|
||||
wappalyzer.init();
|
||||
} catch ( e ) {
|
||||
wappalyzer.log(e, 'error');
|
||||
apps.push({
|
||||
name: app.name,
|
||||
confidence: app.confidenceTotal.toString(),
|
||||
version: app.version,
|
||||
icon: app.props.icon || 'default.svg',
|
||||
website: app.props.website,
|
||||
categories
|
||||
});
|
||||
});
|
||||
|
||||
wappalyzer.driver.sendResponse();
|
||||
resolve(apps);
|
||||
};
|
||||
|
||||
phantom.exit(1);
|
||||
}
|
||||
})();
|
||||
const browser = new Browser();
|
||||
|
||||
browser.visit(url, error => {
|
||||
wappalyzer.driver.document = browser.document;
|
||||
|
||||
const headers = browser.resources['0'].response.headers;
|
||||
const vars = Object.getOwnPropertyNames(browser.window);
|
||||
const html = browser.html();
|
||||
|
||||
const hostname = wappalyzer.parseUrl(url).hostname;
|
||||
|
||||
wappalyzer.analyze(hostname, url, {
|
||||
headers,
|
||||
html,
|
||||
env: vars
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = driver;
|
||||
|
@ -1,32 +1,23 @@
|
||||
'use strict';
|
||||
|
||||
const
|
||||
path = require('path'),
|
||||
spawn = require('child_process').spawn,
|
||||
phantomjs = require('phantomjs-prebuilt');
|
||||
const wappalyzer = require('./driver');
|
||||
|
||||
exports.run = function(args, callback) {
|
||||
args.unshift.apply(args, [path.join(__dirname, 'driver.js'), '--web-security=false', '--load-images=false', '--ignore-ssl-errors=yes', '--ssl-protocol=any']);
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
var driver = phantomjs.exec.apply(this, args);
|
||||
const url = args[0] || '';
|
||||
|
||||
driver.stdout.on('data', (data) => {
|
||||
callback(`${data}`, null);
|
||||
});
|
||||
if ( !url ) {
|
||||
process.stderr.write('No URL specified\n');
|
||||
|
||||
driver.stderr.on('data', (data) => {
|
||||
callback(null, `${data}`);
|
||||
});
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if ( !module.parent ) {
|
||||
exports.run(process.argv.slice(2), function(stdout, stderr) {
|
||||
if ( stdout ) {
|
||||
process.stdout.write(stdout);
|
||||
}
|
||||
wappalyzer.analyze(url)
|
||||
.then(json => {
|
||||
process.stdout.write(JSON.stringify(json) + '\n')
|
||||
|
||||
if ( stderr ) {
|
||||
process.stderr.write(stderr);
|
||||
}
|
||||
});
|
||||
}
|
||||
process.exit();
|
||||
})
|
||||
.catch(error => {
|
||||
throw error
|
||||
});
|
||||
|
@ -1,21 +1,23 @@
|
||||
{
|
||||
"name": "Wappalyzer",
|
||||
"name": "wappalyzer",
|
||||
"description": "Uncovers the technologies used on websites",
|
||||
"homepage": "https://github.com/AliasIO/Wappalyzer",
|
||||
"version": "4.1.4",
|
||||
"version": "5.0.5",
|
||||
"author": "Elbert Alias",
|
||||
"license": "GPL-3.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/AliasIO/Wappalyzer"
|
||||
},
|
||||
"main": "index.js",
|
||||
"files": [
|
||||
"apps.json",
|
||||
"driver.js",
|
||||
"wappalyzer.js"
|
||||
],
|
||||
"main": "driver.js",
|
||||
"files": [
|
||||
"apps.json",
|
||||
"index.js",
|
||||
"driver.js",
|
||||
"wappalyzer.js"
|
||||
],
|
||||
"dependencies": {
|
||||
"phantomjs-prebuilt": "*"
|
||||
"request": "^2.81.0",
|
||||
"zombie": "^5.0.7"
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
/apps.json
|
||||
/images/icons/converted/*
|
||||
/images/icons/*
|
||||
/images/icons/converted/*
|
||||
/js/wappalyzer.js
|
||||
/node_modules
|
||||
|
||||
!.gitkeep
|
||||
|
@ -0,0 +1,66 @@
|
||||
{
|
||||
"github": { "message": "Salin Wappalyzer di GitHub!" },
|
||||
"twitter": { "message": "Ikuti Wappalyzer di Twitter" },
|
||||
"website": { "message": "Kunjungi wappalyzer.com" },
|
||||
"options": { "message": "Pilihan" },
|
||||
"optionsSave": { "message": "Simpan pilihan" },
|
||||
"optionsSaved": { "message": "Tersimpan" },
|
||||
"optionUpgradeMessage": { "message": "Beritahu Tentang Peningkatan Versi" },
|
||||
"optionDynamicIcon": { "message": "Gunakan ikon aplikasi dan bukan logo Wappalyzer" },
|
||||
"optionTracking": { "message": "Secara anonim kirimkan laporan tentang aplikasi yang terdeteksi ke wappalyzer.com untuk penelitian" },
|
||||
"nothingToDo": { "message": "Tak ada yang dilakukan disini." },
|
||||
"noAppsDetected": { "message": "Tidak ada aplikasi yang terdeteksi." },
|
||||
"categoryName1": { "message": "Sistem Pengelola Konten" },
|
||||
"categoryName2": { "message": "Papan Pesan" },
|
||||
"categoryName3": { "message": "Pengelola Basis Data" },
|
||||
"categoryName4": { "message": "Alat Dokumentasi" },
|
||||
"categoryName5": { "message": "Widget" },
|
||||
"categoryName6": { "message": "Toko Online" },
|
||||
"categoryName7": { "message": "Galeri Foto" },
|
||||
"categoryName8": { "message": "Wiki" },
|
||||
"categoryName9": { "message": "Panel Hosting" },
|
||||
"categoryName10": { "message": "Analistik" },
|
||||
"categoryName11": { "message": "Blog" },
|
||||
"categoryName12": { "message": "Bingkai Kerja JavaScript" },
|
||||
"categoryName13": { "message": "Pelacak Masalah" },
|
||||
"categoryName14": { "message": "Pemutar Video" },
|
||||
"categoryName15": { "message": "Sistem Komentar" },
|
||||
"categoryName16": { "message": "Captcha" },
|
||||
"categoryName17": { "message": "Font Script" },
|
||||
"categoryName18": { "message": "Bingkai Kerja Web" },
|
||||
"categoryName19": { "message": "Serba Serbi" },
|
||||
"categoryName20": { "message": "Editor" },
|
||||
"categoryName21": { "message": "LMS" },
|
||||
"categoryName22": { "message": "Server Website" },
|
||||
"categoryName23": { "message": "Alat Cache" },
|
||||
"categoryName24": { "message": "Rich Text Editor" },
|
||||
"categoryName25": { "message": "JavaScript Graphics" },
|
||||
"categoryName26": { "message": "Bingkai Kerja Mobile" },
|
||||
"categoryName27": { "message": "Bahasa Pemrograman" },
|
||||
"categoryName28": { "message": "Sistem Operasi" },
|
||||
"categoryName29": { "message": "Mesin Pencari" },
|
||||
"categoryName30": { "message": "Web Mail" },
|
||||
"categoryName31": { "message": "CDN" },
|
||||
"categoryName32": { "message": "Otomasi Pemasaran" },
|
||||
"categoryName33": { "message": "Ekstensi Web Server" },
|
||||
"categoryName34": { "message": "Basis Data" },
|
||||
"categoryName35": { "message": "Peta" },
|
||||
"categoryName36": { "message": "Jaringan Periklanan" },
|
||||
"categoryName37": { "message": "Layanan Jaringan" },
|
||||
"categoryName38": { "message": "Server Media" },
|
||||
"categoryName39": { "message": "Webcam" },
|
||||
"categoryName40": { "message": "Pencetak" },
|
||||
"categoryName41": { "message": "Pemroses Pembayaran" },
|
||||
"categoryName42": { "message": "Pengelola Tag" },
|
||||
"categoryName43": { "message": "Paywall" },
|
||||
"categoryName44": { "message": "Sistem Pembuatan/CI" },
|
||||
"categoryName45": { "message": "Sistem SCADA" },
|
||||
"categoryName46": { "message": "Akses Remote" },
|
||||
"categoryName47": { "message": "Alat Pengembangan" },
|
||||
"categoryName48": { "message": "Penyimpanan Jaringan" },
|
||||
"categoryName49": { "message": "Umpan Pembaca" },
|
||||
"categoryName50": { "message": "Sistem Manajemen Dokumen" },
|
||||
"categoryName51": { "message": "Pembuat Laman Landas" },
|
||||
"categoryName52": { "message": "Chat Langsung" },
|
||||
"categoryName53": { "message": "CRM" }
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<script src="js/browser-polyfill.js"></script>
|
||||
<script src="js/wappalyzer.js"></script>
|
||||
<script src="js/driver.js"></script>
|
||||
<script src="js/network.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
|
||||
<script src="../js/wappalyzer.js"></script>
|
||||
<script src="../js/driver.js"></script>
|
||||
<script src="../js/network.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,15 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<link rel="stylesheet" href="../css/popup.css">
|
||||
|
||||
<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
|
||||
<script src="../js/jsontodom.js"></script>
|
||||
<script src="../js/popup.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
@ -1,851 +0,0 @@
|
||||
/* webextension-polyfill - v0.1.0 - Sat Mar 11 2017 11:35:13 */
|
||||
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set sts=2 sw=2 et tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
"use strict";
|
||||
|
||||
if (typeof browser === "undefined") {
|
||||
// Wrapping the bulk of this polyfill in a one-time-use function is a minor
|
||||
// optimization for Firefox. Since Spidermonkey does not fully parse the
|
||||
// contents of a function until the first time it's called, and since it will
|
||||
// never actually need to be called, this allows the polyfill to be included
|
||||
// in Firefox nearly for free.
|
||||
const wrapAPIs = () => {
|
||||
const apiMetadata = {
|
||||
"alarms": {
|
||||
"clear": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"clearAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"get": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
}
|
||||
},
|
||||
"bookmarks": {
|
||||
"create": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"export": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"get": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getChildren": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getRecent": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getTree": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"getSubTree": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"import": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"move": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"remove": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"removeTree": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"search": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"update": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 2
|
||||
}
|
||||
},
|
||||
"browserAction": {
|
||||
"getBadgeBackgroundColor": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getBadgeText": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getPopup": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getTitle": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"setIcon": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"commands": {
|
||||
"getAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
}
|
||||
},
|
||||
"contextMenus": {
|
||||
"update": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"remove": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"removeAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
}
|
||||
},
|
||||
"cookies": {
|
||||
"get": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getAll": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getAllCookieStores": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"remove": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"set": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
"download": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"cancel": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"erase": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getFileIcon": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"open": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"pause": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"removeFile": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"resume": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"search": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"show": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"extension": {
|
||||
"isAllowedFileSchemeAccess": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"isAllowedIncognitoAccess": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
}
|
||||
},
|
||||
"history": {
|
||||
"addUrl": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getVisits": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"deleteAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"deleteRange": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"deleteUrl": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"search": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"i18n": {
|
||||
"detectLanguage": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getAcceptLanguages": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
}
|
||||
},
|
||||
"idle": {
|
||||
"queryState": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"management": {
|
||||
"get": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"getSelf": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"uninstallSelf": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clear": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"create": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"getAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"getPermissionLevel": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"update": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 2
|
||||
}
|
||||
},
|
||||
"pageAction": {
|
||||
"getPopup": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getTitle": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"hide": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"setIcon": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"show": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
"getBackgroundPage": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"getBrowserInfo": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"getPlatformInfo": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"requestUpdateCheck": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"sendMessage": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 3
|
||||
},
|
||||
"sendNativeMessage": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"setUninstallURL": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"storage": {
|
||||
"local": {
|
||||
"clear": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"get": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getBytesInUse": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"remove": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"set": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"managed": {
|
||||
"get": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getBytesInUse": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"sync": {
|
||||
"clear": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"get": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getBytesInUse": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"remove": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"set": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"tabs": {
|
||||
"create": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"captureVisibleTab": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"detectLanguage": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"duplicate": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"executeScript": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"get": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getCurrent": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
},
|
||||
"getZoom": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getZoomSettings": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"highlight": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"insertCSS": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"move": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"reload": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"remove": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"query": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"removeCSS": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"sendMessage": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 3
|
||||
},
|
||||
"setZoom": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"setZoomSettings": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"update": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
}
|
||||
},
|
||||
"webNavigation": {
|
||||
"getAllFrames": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getFrame": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
}
|
||||
},
|
||||
"webRequest": {
|
||||
"handlerBehaviorChanged": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 0
|
||||
}
|
||||
},
|
||||
"windows": {
|
||||
"create": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"get": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 2
|
||||
},
|
||||
"getAll": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getCurrent": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"getLastFocused": {
|
||||
"minArgs": 0,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"remove": {
|
||||
"minArgs": 1,
|
||||
"maxArgs": 1
|
||||
},
|
||||
"update": {
|
||||
"minArgs": 2,
|
||||
"maxArgs": 2
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* A WeakMap subclass which creates and stores a value for any key which does
|
||||
* not exist when accessed, but behaves exactly as an ordinary WeakMap
|
||||
* otherwise.
|
||||
*
|
||||
* @param {function} createItem
|
||||
* A function which will be called in order to create the value for any
|
||||
* key which does not exist, the first time it is accessed. The
|
||||
* function receives, as its only argument, the key being created.
|
||||
*/
|
||||
class DefaultWeakMap extends WeakMap {
|
||||
constructor(createItem, items = undefined) {
|
||||
super(items);
|
||||
this.createItem = createItem;
|
||||
}
|
||||
|
||||
get(key) {
|
||||
if (!this.has(key)) {
|
||||
this.set(key, this.createItem(key));
|
||||
}
|
||||
|
||||
return super.get(key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given object is an object with a `then` method, and can
|
||||
* therefore be assumed to behave as a Promise.
|
||||
*
|
||||
* @param {*} value The value to test.
|
||||
* @returns {boolean} True if the value is thenable.
|
||||
*/
|
||||
const isThenable = value => {
|
||||
return value && typeof value === "object" && typeof value.then === "function";
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates and returns a function which, when called, will resolve or reject
|
||||
* the given promise based on how it is called:
|
||||
*
|
||||
* - If, when called, `chrome.runtime.lastError` contains a non-null object,
|
||||
* the promise is rejected with that value.
|
||||
* - If the function is called with exactly one argument, the promise is
|
||||
* resolved to that value.
|
||||
* - Otherwise, the promise is resolved to an array containing all of the
|
||||
* function's arguments.
|
||||
*
|
||||
* @param {object} promise
|
||||
* An object containing the resolution and rejection functions of a
|
||||
* promise.
|
||||
* @param {function} promise.resolve
|
||||
* The promise's resolution function.
|
||||
* @param {function} promise.rejection
|
||||
* The promise's rejection function.
|
||||
*
|
||||
* @returns {function}
|
||||
* The generated callback function.
|
||||
*/
|
||||
const makeCallback = promise => {
|
||||
return (...callbackArgs) => {
|
||||
if (chrome.runtime.lastError) {
|
||||
promise.reject(chrome.runtime.lastError);
|
||||
} else if (callbackArgs.length === 1) {
|
||||
promise.resolve(callbackArgs[0]);
|
||||
} else {
|
||||
promise.resolve(callbackArgs);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a wrapper function for a method with the given name and metadata.
|
||||
*
|
||||
* @param {string} name
|
||||
* The name of the method which is being wrapped.
|
||||
* @param {object} metadata
|
||||
* Metadata about the method being wrapped.
|
||||
* @param {integer} metadata.minArgs
|
||||
* The minimum number of arguments which must be passed to the
|
||||
* function. If called with fewer than this number of arguments, the
|
||||
* wrapper will raise an exception.
|
||||
* @param {integer} metadata.maxArgs
|
||||
* The maximum number of arguments which may be passed to the
|
||||
* function. If called with more than this number of arguments, the
|
||||
* wrapper will raise an exception.
|
||||
*
|
||||
* @returns {function(object, ...*)}
|
||||
* The generated wrapper function.
|
||||
*/
|
||||
const wrapAsyncFunction = (name, metadata) => {
|
||||
const pluralizeArguments = (numArgs) => numArgs == 1 ? "argument" : "arguments";
|
||||
|
||||
return function asyncFunctionWrapper(target, ...args) {
|
||||
if (args.length < metadata.minArgs) {
|
||||
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
||||
}
|
||||
|
||||
if (args.length > metadata.maxArgs) {
|
||||
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
target[name](...args, makeCallback({resolve, reject}));
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Wraps an existing method of the target object, so that calls to it are
|
||||
* intercepted by the given wrapper function. The wrapper function receives,
|
||||
* as its first argument, the original `target` object, followed by each of
|
||||
* the arguments passed to the orginal method.
|
||||
*
|
||||
* @param {object} target
|
||||
* The original target object that the wrapped method belongs to.
|
||||
* @param {function} method
|
||||
* The method being wrapped. This is used as the target of the Proxy
|
||||
* object which is created to wrap the method.
|
||||
* @param {function} wrapper
|
||||
* The wrapper function which is called in place of a direct invocation
|
||||
* of the wrapped method.
|
||||
*
|
||||
* @returns {Proxy<function>}
|
||||
* A Proxy object for the given method, which invokes the given wrapper
|
||||
* method in its place.
|
||||
*/
|
||||
const wrapMethod = (target, method, wrapper) => {
|
||||
return new Proxy(method, {
|
||||
apply(targetMethod, thisObj, args) {
|
||||
return wrapper.call(thisObj, target, ...args);
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
|
||||
|
||||
/**
|
||||
* Wraps an object in a Proxy which intercepts and wraps certain methods
|
||||
* based on the given `wrappers` and `metadata` objects.
|
||||
*
|
||||
* @param {object} target
|
||||
* The target object to wrap.
|
||||
*
|
||||
* @param {object} [wrappers = {}]
|
||||
* An object tree containing wrapper functions for special cases. Any
|
||||
* function present in this object tree is called in place of the
|
||||
* method in the same location in the `target` object tree. These
|
||||
* wrapper methods are invoked as described in {@see wrapMethod}.
|
||||
*
|
||||
* @param {object} [metadata = {}]
|
||||
* An object tree containing metadata used to automatically generate
|
||||
* Promise-based wrapper functions for asynchronous. Any function in
|
||||
* the `target` object tree which has a corresponding metadata object
|
||||
* in the same location in the `metadata` tree is replaced with an
|
||||
* automatically-generated wrapper function, as described in
|
||||
* {@see wrapAsyncFunction}
|
||||
*
|
||||
* @returns {Proxy<object>}
|
||||
*/
|
||||
const wrapObject = (target, wrappers = {}, metadata = {}) => {
|
||||
let cache = Object.create(null);
|
||||
|
||||
let handlers = {
|
||||
has(target, prop) {
|
||||
return prop in target || prop in cache;
|
||||
},
|
||||
|
||||
get(target, prop, receiver) {
|
||||
if (prop in cache) {
|
||||
return cache[prop];
|
||||
}
|
||||
|
||||
if (!(prop in target)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
let value = target[prop];
|
||||
|
||||
if (typeof value === "function") {
|
||||
// This is a method on the underlying object. Check if we need to do
|
||||
// any wrapping.
|
||||
|
||||
if (typeof wrappers[prop] === "function") {
|
||||
// We have a special-case wrapper for this method.
|
||||
value = wrapMethod(target, target[prop], wrappers[prop]);
|
||||
} else if (hasOwnProperty(metadata, prop)) {
|
||||
// This is an async method that we have metadata for. Create a
|
||||
// Promise wrapper for it.
|
||||
let wrapper = wrapAsyncFunction(prop, metadata[prop]);
|
||||
value = wrapMethod(target, target[prop], wrapper);
|
||||
} else {
|
||||
// This is a method that we don't know or care about. Return the
|
||||
// original method, bound to the underlying object.
|
||||
value = value.bind(target);
|
||||
}
|
||||
} else if (typeof value === "object" && value !== null &&
|
||||
(hasOwnProperty(wrappers, prop) ||
|
||||
hasOwnProperty(metadata, prop))) {
|
||||
// This is an object that we need to do some wrapping for the children
|
||||
// of. Create a sub-object wrapper for it with the appropriate child
|
||||
// metadata.
|
||||
value = wrapObject(value, wrappers[prop], metadata[prop]);
|
||||
} else {
|
||||
// We don't need to do any wrapping for this property,
|
||||
// so just forward all access to the underlying object.
|
||||
Object.defineProperty(cache, prop, {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get() {
|
||||
return target[prop];
|
||||
},
|
||||
set(value) {
|
||||
target[prop] = value;
|
||||
},
|
||||
});
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
cache[prop] = value;
|
||||
return value;
|
||||
},
|
||||
|
||||
set(target, prop, value, receiver) {
|
||||
if (prop in cache) {
|
||||
cache[prop] = value;
|
||||
} else {
|
||||
target[prop] = value;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
defineProperty(target, prop, desc) {
|
||||
return Reflect.defineProperty(cache, prop, desc);
|
||||
},
|
||||
|
||||
deleteProperty(target, prop) {
|
||||
return Reflect.deleteProperty(cache, prop);
|
||||
},
|
||||
};
|
||||
|
||||
return new Proxy(target, handlers);
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a set of wrapper functions for an event object, which handles
|
||||
* wrapping of listener functions that those messages are passed.
|
||||
*
|
||||
* A single wrapper is created for each listener function, and stored in a
|
||||
* map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`
|
||||
* retrieve the original wrapper, so that attempts to remove a
|
||||
* previously-added listener work as expected.
|
||||
*
|
||||
* @param {DefaultWeakMap<function, function>} wrapperMap
|
||||
* A DefaultWeakMap object which will create the appropriate wrapper
|
||||
* for a given listener function when one does not exist, and retrieve
|
||||
* an existing one when it does.
|
||||
*
|
||||
* @returns {object}
|
||||
*/
|
||||
const wrapEvent = wrapperMap => ({
|
||||
addListener(target, listener, ...args) {
|
||||
target.addListener(wrapperMap.get(listener), ...args);
|
||||
},
|
||||
|
||||
hasListener(target, listener) {
|
||||
return target.hasListener(wrapperMap.get(listener));
|
||||
},
|
||||
|
||||
removeListener(target, listener) {
|
||||
target.removeListener(wrapperMap.get(listener));
|
||||
},
|
||||
});
|
||||
|
||||
const onMessageWrappers = new DefaultWeakMap(listener => {
|
||||
if (typeof listener !== "function") {
|
||||
return listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a message listener function so that it may send responses based on
|
||||
* its return value, rather than by returning a sentinel value and calling a
|
||||
* callback. If the listener function returns a Promise, the response is
|
||||
* sent when the promise either resolves or rejects.
|
||||
*
|
||||
* @param {*} message
|
||||
* The message sent by the other end of the channel.
|
||||
* @param {object} sender
|
||||
* Details about the sender of the message.
|
||||
* @param {function(*)} sendResponse
|
||||
* A callback which, when called with an arbitrary argument, sends
|
||||
* that value as a response.
|
||||
* @returns {boolean}
|
||||
* True if the wrapped listener returned a Promise, which will later
|
||||
* yield a response. False otherwise.
|
||||
*/
|
||||
return function onMessage(message, sender, sendResponse) {
|
||||
let result = listener(message, sender);
|
||||
|
||||
if (isThenable(result)) {
|
||||
result.then(sendResponse, error => {
|
||||
console.error(error);
|
||||
sendResponse(error);
|
||||
});
|
||||
|
||||
return true;
|
||||
} else if (result !== undefined) {
|
||||
sendResponse(result);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
const staticWrappers = {
|
||||
runtime: {
|
||||
onMessage: wrapEvent(onMessageWrappers),
|
||||
},
|
||||
};
|
||||
|
||||
return wrapObject(chrome, staticWrappers, apiMetadata);
|
||||
};
|
||||
|
||||
this.browser = wrapAPIs();
|
||||
}
|
@ -1,75 +1,55 @@
|
||||
/** global: browser */
|
||||
|
||||
(function() {
|
||||
var c = {
|
||||
init: function() {
|
||||
var html = document.documentElement.outerHTML;
|
||||
|
||||
c.log('Function call: init()');
|
||||
|
||||
if ( html.length > 50000 ) {
|
||||
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
|
||||
}
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
id: 'analyze',
|
||||
subject: { html: html },
|
||||
source: 'content.js'
|
||||
});
|
||||
|
||||
c.getEnvironmentVars();
|
||||
},
|
||||
|
||||
log: function(message) {
|
||||
browser.runtime.sendMessage({
|
||||
id: 'log',
|
||||
message: message,
|
||||
source: 'content.js'
|
||||
});
|
||||
},
|
||||
|
||||
getEnvironmentVars: function() {
|
||||
var container, script;
|
||||
|
||||
c.log('Function call: getEnvironmentVars()');
|
||||
|
||||
if ( typeof document.body === 'undefined' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
container = document.createElement('wappalyzerData');
|
||||
|
||||
container.setAttribute('id', 'wappalyzerData');
|
||||
container.setAttribute('style', 'display: none');
|
||||
|
||||
script = document.createElement('script');
|
||||
|
||||
script.setAttribute('id', 'wappalyzerEnvDetection');
|
||||
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
|
||||
|
||||
container.addEventListener('wappalyzerEvent', (function(event) {
|
||||
var environmentVars = event.target.childNodes[0].nodeValue;
|
||||
|
||||
document.documentElement.removeChild(container);
|
||||
document.documentElement.removeChild(script);
|
||||
|
||||
environmentVars = environmentVars.split(' ').slice(0, 500);
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
id: 'analyze',
|
||||
subject: { env: environmentVars },
|
||||
source: 'content.js'
|
||||
});
|
||||
}), true);
|
||||
|
||||
document.documentElement.appendChild(container);
|
||||
document.documentElement.appendChild(script);
|
||||
} catch(e) {
|
||||
c.log('Error: ' + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
c.init();
|
||||
}());
|
||||
if ( document.body !== undefined ) {
|
||||
var html = document.documentElement.outerHTML;
|
||||
|
||||
if ( html.length > 50000 ) {
|
||||
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
|
||||
}
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
id: 'analyze',
|
||||
subject: { html },
|
||||
source: 'content.js'
|
||||
});
|
||||
|
||||
try {
|
||||
var container = document.createElement('wappalyzerData');
|
||||
|
||||
container.setAttribute('id', 'wappalyzerData');
|
||||
container.setAttribute('style', 'display: none');
|
||||
|
||||
var script = document.createElement('script');
|
||||
|
||||
script.setAttribute('id', 'wappalyzerEnvDetection');
|
||||
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
|
||||
|
||||
container.addEventListener('wappalyzerEvent', (event => {
|
||||
var env = event.target.childNodes[0].nodeValue;
|
||||
|
||||
document.documentElement.removeChild(container);
|
||||
document.documentElement.removeChild(script);
|
||||
|
||||
env = env.split(' ').slice(0, 500);
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
id: 'analyze',
|
||||
subject: { env },
|
||||
source: 'content.js'
|
||||
});
|
||||
}), true);
|
||||
|
||||
document.documentElement.appendChild(container);
|
||||
document.documentElement.appendChild(script);
|
||||
} catch(e) {
|
||||
log('Error: ' + e);
|
||||
}
|
||||
}
|
||||
|
||||
function log(message) {
|
||||
browser.runtime.sendMessage({
|
||||
id: 'log',
|
||||
message,
|
||||
source: 'content.js'
|
||||
});
|
||||
}
|
||||
|
@ -1,9 +0,0 @@
|
||||
/** global: browser */
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var nodes = document.querySelectorAll('[data-i18n]');
|
||||
|
||||
Array.prototype.forEach.call(nodes, function (node) {
|
||||
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
|
||||
});
|
||||
});
|
@ -1,72 +1,67 @@
|
||||
/** global: browser */
|
||||
/** global: wappalyzer */
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var d = document;
|
||||
function getOption(name, defaultValue, callback) {
|
||||
browser.storage.local.get(name)
|
||||
.then(item => {
|
||||
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
|
||||
});
|
||||
}
|
||||
|
||||
var options = {
|
||||
init: function() {
|
||||
options.load();
|
||||
function setOption(name, value) {
|
||||
var option = {};
|
||||
|
||||
d.querySelector('#github').addEventListener('click', function() {
|
||||
open(wappalyzer.config.githubURL);
|
||||
});
|
||||
option[name] = value;
|
||||
|
||||
d.querySelector('#twitter').addEventListener('click', function() {
|
||||
open(wappalyzer.config.twitterURL);
|
||||
});
|
||||
browser.storage.local.set(option);
|
||||
}
|
||||
|
||||
d.querySelector('#wappalyzer').addEventListener('click', function() {
|
||||
open(wappalyzer.config.websiteURL);
|
||||
});
|
||||
},
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
var nodes = document.querySelectorAll('[data-i18n]');
|
||||
|
||||
get: function(name, defaultValue, callback) {
|
||||
browser.storage.local.get(name).then(function(item) {
|
||||
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
|
||||
});
|
||||
},
|
||||
Array.prototype.forEach.call(nodes, node => {
|
||||
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
|
||||
});
|
||||
|
||||
set: function(name, value) {
|
||||
var option = {};
|
||||
document.querySelector('#github').addEventListener('click', () => {
|
||||
open(wappalyzer.config.githubURL);
|
||||
});
|
||||
|
||||
option[name] = value;
|
||||
document.querySelector('#twitter').addEventListener('click', () => {
|
||||
open(wappalyzer.config.twitterURL);
|
||||
});
|
||||
|
||||
browser.storage.local.set(option);
|
||||
},
|
||||
document.querySelector('#wappalyzer').addEventListener('click', () => {
|
||||
open(wappalyzer.config.websiteURL);
|
||||
});
|
||||
|
||||
load: function() {
|
||||
options.get('upgradeMessage', true, function(value) {
|
||||
var el = d.querySelector('#option-upgrade-message');
|
||||
getOption('upgradeMessage', true, value => {
|
||||
const el = document.querySelector('#option-upgrade-message');
|
||||
|
||||
el.checked = value;
|
||||
el.checked = value;
|
||||
|
||||
el.addEventListener('change', function() {
|
||||
options.set('upgradeMessage', el.checked);
|
||||
});
|
||||
});
|
||||
el.addEventListener('change', () => {
|
||||
setOption('upgradeMessage', el.checked);
|
||||
});
|
||||
});
|
||||
|
||||
options.get('dynamicIcon', true, function(value) {
|
||||
var el = d.querySelector('#option-dynamic-icon');
|
||||
getOption('dynamicIcon', true, value => {
|
||||
const el = document.querySelector('#option-dynamic-icon');
|
||||
|
||||
el.checked = value;
|
||||
el.checked = value;
|
||||
|
||||
el.addEventListener('change', function() {
|
||||
options.set('dynamicIcon', el.checked);
|
||||
});
|
||||
});
|
||||
el.addEventListener('change', () => {
|
||||
setOption('dynamicIcon', el.checked);
|
||||
});
|
||||
});
|
||||
|
||||
options.get('tracking', true, function(value) {
|
||||
var el = d.querySelector('#option-tracking');
|
||||
getOption('tracking', true, value => {
|
||||
const el = document.querySelector('#option-tracking');
|
||||
|
||||
el.checked = value;
|
||||
el.checked = value;
|
||||
|
||||
el.addEventListener('change', function() {
|
||||
options.set('tracking', el.checked);
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
options.init();
|
||||
el.addEventListener('change', () => {
|
||||
setOption('tracking', el.checked);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,122 +1,133 @@
|
||||
/** global: chrome */
|
||||
/** global: browser */
|
||||
|
||||
(function() {
|
||||
var popup = {
|
||||
init: function() {
|
||||
popup.update([ 'p', {}, ' ' ], document, {});
|
||||
|
||||
var func = function(tabs) {
|
||||
( chrome || browser ).runtime.sendMessage({ id: 'get_apps', tab: tabs[0], source: 'popup.js' }, function(response) {
|
||||
popup.update(popup.appsToDomTemplate(response));
|
||||
});
|
||||
};
|
||||
|
||||
try {
|
||||
// Chrome, Firefox
|
||||
browser.tabs.query({ active: true, currentWindow: true }).then(func);
|
||||
} catch ( e ) {
|
||||
// Edge
|
||||
browser.tabs.query({ active: true, currentWindow: true }, func);
|
||||
}
|
||||
},
|
||||
|
||||
update: function(dom) {
|
||||
if ( /complete|interactive|loaded/.test(document.readyState) ) {
|
||||
popup.replaceDom(dom);
|
||||
} else {
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
popup.replaceDom(dom);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
replaceDom: function(domTemplate) {
|
||||
var body = document.body;
|
||||
|
||||
while ( body.firstChild ) {
|
||||
body.removeChild(body.firstChild);
|
||||
}
|
||||
|
||||
body.appendChild(jsonToDOM(domTemplate, document, {}));
|
||||
},
|
||||
|
||||
appsToDomTemplate: function(response) {
|
||||
var
|
||||
appName, confidence, version,
|
||||
categories = [],
|
||||
template = [];
|
||||
|
||||
if ( response.tabCache && response.tabCache.count > 0 ) {
|
||||
for ( appName in response.tabCache.appsDetected ) {
|
||||
confidence = response.tabCache.appsDetected[appName].confidenceTotal;
|
||||
version = response.tabCache.appsDetected[appName].version;
|
||||
categories = [];
|
||||
|
||||
response.apps[appName].cats.forEach(function(cat) {
|
||||
categories.push(
|
||||
[
|
||||
'a', {
|
||||
target: '_blank',
|
||||
href: 'https://wappalyzer.com/categories/' + popup.slugify(response.categories[cat].name)
|
||||
}, [
|
||||
'span', {
|
||||
class: 'category'
|
||||
}, [
|
||||
'span', {
|
||||
class: 'name'
|
||||
},
|
||||
browser.i18n.getMessage('categoryName' + cat)
|
||||
]
|
||||
]
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
template.push(
|
||||
[
|
||||
'div', {
|
||||
class: 'detected-app'
|
||||
}, [
|
||||
'a', {
|
||||
target: '_blank',
|
||||
href: 'https://wappalyzer.com/applications/' + popup.slugify(appName)
|
||||
}, [
|
||||
'img', {
|
||||
src: 'images/icons/' + ( response.apps[appName].icon || 'default.svg' )
|
||||
}
|
||||
], [
|
||||
'span', {
|
||||
class: 'label'
|
||||
}, [
|
||||
'span', {
|
||||
class: 'name'
|
||||
},
|
||||
appName
|
||||
],
|
||||
( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' )
|
||||
]
|
||||
],
|
||||
categories
|
||||
]
|
||||
);
|
||||
}
|
||||
} else {
|
||||
template = [
|
||||
'div', {
|
||||
class: 'empty'
|
||||
},
|
||||
browser.i18n.getMessage('noAppsDetected')
|
||||
];
|
||||
}
|
||||
|
||||
return template;
|
||||
},
|
||||
|
||||
slugify: function(string) {
|
||||
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
|
||||
}
|
||||
};
|
||||
|
||||
popup.init();
|
||||
}());
|
||||
var func = tabs => {
|
||||
( chrome || browser ).runtime.sendMessage({
|
||||
id: 'get_apps',
|
||||
tab: tabs[0],
|
||||
source: 'popup.js'
|
||||
}, response => {
|
||||
replaceDomWhenReady(appsToDomTemplate(response));
|
||||
});
|
||||
};
|
||||
|
||||
try {
|
||||
// Chrome, Firefox
|
||||
browser.tabs.query({ active: true, currentWindow: true })
|
||||
.then(func)
|
||||
.catch(console.error);
|
||||
} catch ( e ) {
|
||||
// Edge
|
||||
browser.tabs.query({ active: true, currentWindow: true }, func);
|
||||
}
|
||||
|
||||
function replaceDomWhenReady(dom) {
|
||||
if ( /complete|interactive|loaded/.test(document.readyState) ) {
|
||||
replaceDom(dom);
|
||||
} else {
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
replaceDom(dom);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function replaceDom(domTemplate) {
|
||||
var body = document.body;
|
||||
|
||||
while ( body.firstChild ) {
|
||||
body.removeChild(body.firstChild);
|
||||
}
|
||||
|
||||
body.appendChild(jsonToDOM(domTemplate, document, {}));
|
||||
|
||||
var nodes = document.querySelectorAll('[data-i18n]');
|
||||
|
||||
for ( let ms = 200; ms < 500; ms += 50 ) {
|
||||
setTimeout(() => {
|
||||
let div = document.createElement('div');
|
||||
|
||||
div.style.display = 'none';
|
||||
|
||||
body.appendChild(div);
|
||||
}, ms);
|
||||
};
|
||||
|
||||
Array.prototype.forEach.call(nodes, node => {
|
||||
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
|
||||
});
|
||||
}
|
||||
|
||||
function appsToDomTemplate(response) {
|
||||
var
|
||||
appName, confidence, version, categories,
|
||||
template = [];
|
||||
|
||||
if ( response.tabCache && Object.keys(response.tabCache.detected).length > 0 ) {
|
||||
for ( appName in response.tabCache.detected ) {
|
||||
confidence = response.tabCache.detected[appName].confidenceTotal;
|
||||
version = response.tabCache.detected[appName].version;
|
||||
categories = [];
|
||||
|
||||
response.apps[appName].cats.forEach(cat => {
|
||||
categories.push(
|
||||
[
|
||||
'a', {
|
||||
target: '_blank',
|
||||
href: 'https://wappalyzer.com/categories/' + slugify(response.categories[cat].name)
|
||||
}, [
|
||||
'span', {
|
||||
class: 'category'
|
||||
}, [
|
||||
'span', {
|
||||
class: 'name'
|
||||
},
|
||||
browser.i18n.getMessage('categoryName' + cat)
|
||||
]
|
||||
]
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
template.push(
|
||||
[
|
||||
'div', {
|
||||
class: 'detected-app'
|
||||
}, [
|
||||
'a', {
|
||||
target: '_blank',
|
||||
href: 'https://wappalyzer.com/applications/' + slugify(appName)
|
||||
}, [
|
||||
'img', {
|
||||
src: '../images/icons/' + ( response.apps[appName].icon || 'default.svg' )
|
||||
}
|
||||
], [
|
||||
'span', {
|
||||
class: 'label'
|
||||
}, [
|
||||
'span', {
|
||||
class: 'name'
|
||||
},
|
||||
appName
|
||||
],
|
||||
( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' )
|
||||
]
|
||||
],
|
||||
categories
|
||||
]
|
||||
);
|
||||
}
|
||||
} else {
|
||||
template = [
|
||||
'div', {
|
||||
class: 'empty'
|
||||
},
|
||||
browser.i18n.getMessage('noAppsDetected')
|
||||
];
|
||||
}
|
||||
|
||||
return template;
|
||||
}
|
||||
|
||||
function slugify(string) {
|
||||
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
|
||||
}
|
||||
|
@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"webextension-polyfill": "^0.1.1"
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<link rel="stylesheet" href="css/popup.css">
|
||||
|
||||
<script src="js/browser-polyfill.js"></script>
|
||||
<script src="js/jsontodom.js"></script>
|
||||
<script src="js/popup.js"></script>
|
||||
<script src="js/i18n.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,7 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
webextension-polyfill@^0.1.1:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.1.1.tgz#1d172e59b9ee8706d5ce2c55eebfe0cf23972d70"
|
After Width: | Height: | Size: 783 B |
After Width: | Height: | Size: 923 B |
Before Width: | Height: | Size: 681 B |
After Width: | Height: | Size: 669 B |
After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 892 B |
After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 970 B After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 432 B |
After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 674 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 814 B |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 688 B After Width: | Height: | Size: 678 B |
@ -0,0 +1,814 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
ansi-regex@^2.0.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
|
||||
|
||||
ansi-styles@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
|
||||
|
||||
asn1@~0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
|
||||
|
||||
assert-plus@1.0.0, assert-plus@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
|
||||
|
||||
assert-plus@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
|
||||
|
||||
async@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
|
||||
aws-sign2@~0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
|
||||
|
||||
aws4@^1.2.1:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
|
||||
|
||||
bcrypt-pbkdf@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
|
||||
dependencies:
|
||||
tweetnacl "^0.14.3"
|
||||
|
||||
boom@2.x.x:
|
||||
version "2.10.1"
|
||||
resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
|
||||
dependencies:
|
||||
hoek "2.x.x"
|
||||
|
||||
builtin-modules@^1.0.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
|
||||
|
||||
camelcase@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
|
||||
|
||||
caseless@~0.11.0:
|
||||
version "0.11.0"
|
||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
|
||||
|
||||
chalk@^1.1.1:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||
dependencies:
|
||||
ansi-styles "^2.2.1"
|
||||
escape-string-regexp "^1.0.2"
|
||||
has-ansi "^2.0.0"
|
||||
strip-ansi "^3.0.0"
|
||||
supports-color "^2.0.0"
|
||||
|
||||
cliui@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
|
||||
dependencies:
|
||||
string-width "^1.0.1"
|
||||
strip-ansi "^3.0.1"
|
||||
wrap-ansi "^2.0.0"
|
||||
|
||||
code-point-at@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
|
||||
|
||||
colors@1.0.x:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
|
||||
|
||||
combined-stream@^1.0.5, combined-stream@~1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
|
||||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
commander@^2.9.0:
|
||||
version "2.11.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
|
||||
|
||||
concat-stream@1.5.0:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611"
|
||||
dependencies:
|
||||
inherits "~2.0.1"
|
||||
readable-stream "~2.0.0"
|
||||
typedarray "~0.0.5"
|
||||
|
||||
core-util-is@~1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||
|
||||
cryptiles@2.x.x:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
|
||||
dependencies:
|
||||
boom "2.x.x"
|
||||
|
||||
cycle@1.0.x:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
|
||||
|
||||
dashdash@^1.12.0:
|
||||
version "1.14.1"
|
||||
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
debug@0.7.4:
|
||||
version "0.7.4"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
|
||||
|
||||
decamelize@^1.1.1:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
|
||||
ecc-jsbn@~0.1.1:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
|
||||
dependencies:
|
||||
jsbn "~0.1.0"
|
||||
|
||||
error-ex@^1.2.0:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
|
||||
dependencies:
|
||||
is-arrayish "^0.2.1"
|
||||
|
||||
es6-promise@~4.0.3:
|
||||
version "4.0.5"
|
||||
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42"
|
||||
|
||||
escape-string-regexp@^1.0.2:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||
|
||||
extend@~3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
|
||||
|
||||
extract-zip@~1.5.0:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4"
|
||||
dependencies:
|
||||
concat-stream "1.5.0"
|
||||
debug "0.7.4"
|
||||
mkdirp "0.5.0"
|
||||
yauzl "2.4.1"
|
||||
|
||||
extsprintf@1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
|
||||
|
||||
eyes@0.1.x:
|
||||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
|
||||
|
||||
fd-slicer@~1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
|
||||
dependencies:
|
||||
pend "~1.2.0"
|
||||
|
||||
file-type@3.8.*:
|
||||
version "3.8.0"
|
||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.8.0.tgz#bcadf6a8f624ebe4a10e5ad26727b6b93f16d78d"
|
||||
|
||||
find-up@^1.0.0:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
|
||||
dependencies:
|
||||
path-exists "^2.0.0"
|
||||
pinkie-promise "^2.0.0"
|
||||
|
||||
forever-agent@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
|
||||
|
||||
form-data@~2.1.1:
|
||||
version "2.1.4"
|
||||
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
combined-stream "^1.0.5"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
fs-extra@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
|
||||
dependencies:
|
||||
graceful-fs "^4.1.2"
|
||||
jsonfile "^2.1.0"
|
||||
klaw "^1.0.0"
|
||||
|
||||
generate-function@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
|
||||
|
||||
generate-object-property@^1.1.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
|
||||
dependencies:
|
||||
is-property "^1.0.0"
|
||||
|
||||
get-caller-file@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
|
||||
|
||||
getpass@^0.1.1:
|
||||
version "0.1.7"
|
||||
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
|
||||
version "4.1.11"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
|
||||
|
||||
har-validator@~2.0.6:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
|
||||
dependencies:
|
||||
chalk "^1.1.1"
|
||||
commander "^2.9.0"
|
||||
is-my-json-valid "^2.12.4"
|
||||
pinkie-promise "^2.0.0"
|
||||
|
||||
has-ansi@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
|
||||
dependencies:
|
||||
ansi-regex "^2.0.0"
|
||||
|
||||
hasha@~2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1"
|
||||
dependencies:
|
||||
is-stream "^1.0.1"
|
||||
pinkie-promise "^2.0.0"
|
||||
|
||||
hawk@~3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
|
||||
dependencies:
|
||||
boom "2.x.x"
|
||||
cryptiles "2.x.x"
|
||||
hoek "2.x.x"
|
||||
sntp "1.x.x"
|
||||
|
||||
hoek@2.x.x:
|
||||
version "2.16.3"
|
||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
|
||||
|
||||
hosted-git-info@^2.1.4:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
|
||||
|
||||
html-comment-regex@^1.1.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
|
||||
|
||||
http-signature@~1.1.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
|
||||
dependencies:
|
||||
assert-plus "^0.2.0"
|
||||
jsprim "^1.2.2"
|
||||
sshpk "^1.7.0"
|
||||
|
||||
inherits@~2.0.1:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||
|
||||
invert-kv@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
|
||||
|
||||
is-arrayish@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
||||
|
||||
is-builtin-module@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
|
||||
dependencies:
|
||||
builtin-modules "^1.0.0"
|
||||
|
||||
is-fullwidth-code-point@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
|
||||
dependencies:
|
||||
number-is-nan "^1.0.0"
|
||||
|
||||
is-my-json-valid@^2.12.4:
|
||||
version "2.16.0"
|
||||
resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
|
||||
dependencies:
|
||||
generate-function "^2.0.0"
|
||||
generate-object-property "^1.1.0"
|
||||
jsonpointer "^4.0.0"
|
||||
xtend "^4.0.0"
|
||||
|
||||
is-property@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
|
||||
|
||||
is-stream@^1.0.1:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||
|
||||
is-svg@2.0.*:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.0.1.tgz#f93ab3bf1d6bbca30e9753cd3485b1300eebc013"
|
||||
dependencies:
|
||||
html-comment-regex "^1.1.0"
|
||||
|
||||
is-typedarray@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
||||
|
||||
is-utf8@^0.2.0:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
|
||||
|
||||
isarray@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||
|
||||
isexe@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||
|
||||
isstream@0.1.x, isstream@~0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
|
||||
|
||||
jsbn@~0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
|
||||
|
||||
json-schema@0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
|
||||
|
||||
json-stringify-safe@~5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
||||
|
||||
jsonfile@^2.1.0:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
jsonpointer@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
|
||||
|
||||
jsprim@^1.2.2:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
|
||||
dependencies:
|
||||
assert-plus "1.0.0"
|
||||
extsprintf "1.0.2"
|
||||
json-schema "0.2.3"
|
||||
verror "1.3.6"
|
||||
|
||||
kew@~0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
|
||||
|
||||
klaw@^1.0.0:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.9"
|
||||
|
||||
lcid@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
|
||||
dependencies:
|
||||
invert-kv "^1.0.0"
|
||||
|
||||
linerstream@^0.1.4:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/linerstream/-/linerstream-0.1.4.tgz#5de7bf69faa2b0f9d85e8332099b70e419a845d5"
|
||||
|
||||
load-json-file@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
|
||||
dependencies:
|
||||
graceful-fs "^4.1.2"
|
||||
parse-json "^2.2.0"
|
||||
pify "^2.0.0"
|
||||
pinkie-promise "^2.0.0"
|
||||
strip-bom "^2.0.0"
|
||||
|
||||
lodash.assign@^4.0.3, lodash.assign@^4.0.6:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
|
||||
|
||||
mime-db@~1.27.0:
|
||||
version "1.27.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
|
||||
|
||||
mime-types@^2.1.12, mime-types@~2.1.7:
|
||||
version "2.1.15"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
|
||||
dependencies:
|
||||
mime-db "~1.27.0"
|
||||
|
||||
minimist@0.0.8:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
|
||||
mkdirp@0.5.0:
|
||||
version "0.5.0"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
|
||||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
normalize-package-data@^2.3.2:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
|
||||
dependencies:
|
||||
hosted-git-info "^2.1.4"
|
||||
is-builtin-module "^1.0.0"
|
||||
semver "2 || 3 || 4 || 5"
|
||||
validate-npm-package-license "^3.0.1"
|
||||
|
||||
number-is-nan@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
|
||||
|
||||
oauth-sign@~0.8.1:
|
||||
version "0.8.2"
|
||||
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
|
||||
|
||||
os-locale@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
|
||||
dependencies:
|
||||
lcid "^1.0.0"
|
||||
|
||||
parse-json@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
|
||||
dependencies:
|
||||
error-ex "^1.2.0"
|
||||
|
||||
path-exists@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
|
||||
dependencies:
|
||||
pinkie-promise "^2.0.0"
|
||||
|
||||
path-type@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
|
||||
dependencies:
|
||||
graceful-fs "^4.1.2"
|
||||
pify "^2.0.0"
|
||||
pinkie-promise "^2.0.0"
|
||||
|
||||
pend@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||
|
||||
phantom@^2.0.x:
|
||||
version "2.1.21"
|
||||
resolved "https://registry.yarnpkg.com/phantom/-/phantom-2.1.21.tgz#76b7790ff62cf09fbe922ae844b9fb745ce8bb28"
|
||||
dependencies:
|
||||
linerstream "^0.1.4"
|
||||
phantomjs-prebuilt "^2.1.4"
|
||||
winston "^2.2.0"
|
||||
|
||||
phantomjs-prebuilt@^2.1.4:
|
||||
version "2.1.14"
|
||||
resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb24014558f1188c516da0"
|
||||
dependencies:
|
||||
es6-promise "~4.0.3"
|
||||
extract-zip "~1.5.0"
|
||||
fs-extra "~1.0.0"
|
||||
hasha "~2.2.0"
|
||||
kew "~0.7.0"
|
||||
progress "~1.1.8"
|
||||
request "~2.79.0"
|
||||
request-progress "~2.0.1"
|
||||
which "~1.2.10"
|
||||
|
||||
pify@^2.0.0, pify@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||
|
||||
pinkie-promise@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
|
||||
dependencies:
|
||||
pinkie "^2.0.0"
|
||||
|
||||
pinkie@^2.0.0:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
||||
|
||||
process-nextick-args@~1.0.6:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
|
||||
|
||||
progress@~1.1.8:
|
||||
version "1.1.8"
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
|
||||
|
||||
punycode@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
|
||||
|
||||
qs@~6.3.0:
|
||||
version "6.3.2"
|
||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
|
||||
|
||||
read-chunk@2.0.*:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.0.0.tgz#3246e877829116cec059674c4d5f300f7a9261f3"
|
||||
dependencies:
|
||||
pify "^2.3.0"
|
||||
|
||||
read-pkg-up@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
|
||||
dependencies:
|
||||
find-up "^1.0.0"
|
||||
read-pkg "^1.0.0"
|
||||
|
||||
read-pkg@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
|
||||
dependencies:
|
||||
load-json-file "^1.0.0"
|
||||
normalize-package-data "^2.3.2"
|
||||
path-type "^1.0.0"
|
||||
|
||||
readable-stream@~2.0.0:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
|
||||
dependencies:
|
||||
core-util-is "~1.0.0"
|
||||
inherits "~2.0.1"
|
||||
isarray "~1.0.0"
|
||||
process-nextick-args "~1.0.6"
|
||||
string_decoder "~0.10.x"
|
||||
util-deprecate "~1.0.1"
|
||||
|
||||
request-progress@~2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08"
|
||||
dependencies:
|
||||
throttleit "^1.0.0"
|
||||
|
||||
request@~2.79.0:
|
||||
version "2.79.0"
|
||||
resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
|
||||
dependencies:
|
||||
aws-sign2 "~0.6.0"
|
||||
aws4 "^1.2.1"
|
||||
caseless "~0.11.0"
|
||||
combined-stream "~1.0.5"
|
||||
extend "~3.0.0"
|
||||
forever-agent "~0.6.1"
|
||||
form-data "~2.1.1"
|
||||
har-validator "~2.0.6"
|
||||
hawk "~3.1.3"
|
||||
http-signature "~1.1.0"
|
||||
is-typedarray "~1.0.0"
|
||||
isstream "~0.1.2"
|
||||
json-stringify-safe "~5.0.1"
|
||||
mime-types "~2.1.7"
|
||||
oauth-sign "~0.8.1"
|
||||
qs "~6.3.0"
|
||||
stringstream "~0.0.4"
|
||||
tough-cookie "~2.3.0"
|
||||
tunnel-agent "~0.4.1"
|
||||
uuid "^3.0.0"
|
||||
|
||||
require-directory@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
||||
|
||||
require-main-filename@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
|
||||
|
||||
"semver@2 || 3 || 4 || 5":
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
|
||||
|
||||
set-blocking@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
|
||||
|
||||
sntp@1.x.x:
|
||||
version "1.0.9"
|
||||
resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
|
||||
dependencies:
|
||||
hoek "2.x.x"
|
||||
|
||||
spdx-correct@~1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
|
||||
dependencies:
|
||||
spdx-license-ids "^1.0.2"
|
||||
|
||||
spdx-expression-parse@~1.0.0:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
|
||||
|
||||
spdx-license-ids@^1.0.2:
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
|
||||
|
||||
sshpk@^1.7.0:
|
||||
version "1.13.1"
|
||||
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
|
||||
dependencies:
|
||||
asn1 "~0.2.3"
|
||||
assert-plus "^1.0.0"
|
||||
dashdash "^1.12.0"
|
||||
getpass "^0.1.1"
|
||||
optionalDependencies:
|
||||
bcrypt-pbkdf "^1.0.0"
|
||||
ecc-jsbn "~0.1.1"
|
||||
jsbn "~0.1.0"
|
||||
tweetnacl "~0.14.0"
|
||||
|
||||
stack-trace@0.0.x:
|
||||
version "0.0.10"
|
||||
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
|
||||
|
||||
string-width@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
|
||||
dependencies:
|
||||
code-point-at "^1.0.0"
|
||||
is-fullwidth-code-point "^1.0.0"
|
||||
strip-ansi "^3.0.0"
|
||||
|
||||
string_decoder@~0.10.x:
|
||||
version "0.10.31"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
|
||||
|
||||
stringstream@~0.0.4:
|
||||
version "0.0.5"
|
||||
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
|
||||
|
||||
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
|
||||
dependencies:
|
||||
ansi-regex "^2.0.0"
|
||||
|
||||
strip-bom@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
|
||||
dependencies:
|
||||
is-utf8 "^0.2.0"
|
||||
|
||||
supports-color@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
|
||||
|
||||
svg2png-many@*:
|
||||
version "0.0.7"
|
||||
resolved "https://registry.yarnpkg.com/svg2png-many/-/svg2png-many-0.0.7.tgz#e478f65fa38ca0f23a21f9519a85025e054b5552"
|
||||
dependencies:
|
||||
phantom "^2.0.x"
|
||||
yargs "^4.6.0"
|
||||
|
||||
throttleit@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
|
||||
|
||||
tough-cookie@~2.3.0:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
|
||||
dependencies:
|
||||
punycode "^1.4.1"
|
||||
|
||||
tunnel-agent@~0.4.1:
|
||||
version "0.4.3"
|
||||
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
|
||||
|
||||
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
|
||||
version "0.14.5"
|
||||
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
|
||||
|
||||
typedarray@~0.0.5:
|
||||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||
|
||||
util-deprecate@~1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
|
||||
uuid@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
|
||||
|
||||
validate-npm-package-license@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
|
||||
dependencies:
|
||||
spdx-correct "~1.0.0"
|
||||
spdx-expression-parse "~1.0.0"
|
||||
|
||||
verror@1.3.6:
|
||||
version "1.3.6"
|
||||
resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
|
||||
dependencies:
|
||||
extsprintf "1.0.2"
|
||||
|
||||
which-module@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
|
||||
|
||||
which@~1.2.10:
|
||||
version "1.2.14"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
|
||||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
window-size@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
|
||||
|
||||
winston@^2.2.0:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119"
|
||||
dependencies:
|
||||
async "~1.0.0"
|
||||
colors "1.0.x"
|
||||
cycle "1.0.x"
|
||||
eyes "0.1.x"
|
||||
isstream "0.1.x"
|
||||
stack-trace "0.0.x"
|
||||
|
||||
wrap-ansi@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
|
||||
dependencies:
|
||||
string-width "^1.0.1"
|
||||
strip-ansi "^3.0.1"
|
||||
|
||||
xtend@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||
|
||||
y18n@^3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
|
||||
|
||||
yargs-parser@^2.4.1:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
|
||||
dependencies:
|
||||
camelcase "^3.0.0"
|
||||
lodash.assign "^4.0.6"
|
||||
|
||||
yargs@^4.6.0:
|
||||
version "4.8.1"
|
||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
|
||||
dependencies:
|
||||
cliui "^3.2.0"
|
||||
decamelize "^1.1.1"
|
||||
get-caller-file "^1.0.1"
|
||||
lodash.assign "^4.0.3"
|
||||
os-locale "^1.4.0"
|
||||
read-pkg-up "^1.0.1"
|
||||
require-directory "^2.1.1"
|
||||
require-main-filename "^1.0.1"
|
||||
set-blocking "^2.0.0"
|
||||
string-width "^1.0.1"
|
||||
which-module "^1.0.0"
|
||||
window-size "^0.2.0"
|
||||
y18n "^3.2.1"
|
||||
yargs-parser "^2.4.1"
|
||||
|
||||
yauzl@2.4.1:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
|
||||
dependencies:
|
||||
fd-slicer "~1.0.1"
|