chore: eslint instead of standard

This commit is contained in:
Julien Fontanet
2017-11-21 11:47:21 +01:00
parent 4a6ba998d4
commit 5dfefe8d35
51 changed files with 603 additions and 896 deletions
+11
View File
@@ -0,0 +1,11 @@
module.exports = {
'extends': [
'standard',
],
'parser': 'babel-eslint',
'rules': {
'comma-dangle': ['error', 'always-multiline'],
'no-var': 'error',
'prefer-const': 'error'
}
}
+9 -10
View File
@@ -1,12 +1,17 @@
{ {
"devDependencies": { "devDependencies": {
"babel-eslint": "^8.0.1", "babel-eslint": "^8.0.1",
"eslint": "^4.11.0",
"eslint-config-standard": "^10.2.1",
"eslint-plugin-import": "^2.8.0",
"eslint-plugin-node": "^5.2.1",
"eslint-plugin-promise": "^3.6.0",
"eslint-plugin-standard": "^3.0.1",
"exec-promise": "^0.7.0", "exec-promise": "^0.7.0",
"husky": "^0.14.3", "husky": "^0.14.3",
"jest": "^21.2.1", "jest": "^21.2.1",
"lint-staged": "^5.0.0", "lint-staged": "^5.0.0",
"promise-toolbox": "^0.9.5", "promise-toolbox": "^0.9.5"
"standard": "^10.0.3"
}, },
"engines": { "engines": {
"yarn": "^1.2.1" "yarn": "^1.2.1"
@@ -23,7 +28,7 @@
"lint-staged": { "lint-staged": {
"*.js": [ "*.js": [
"lint-staged-stash", "lint-staged-stash",
"standard --fix", "eslint --fix",
"jest --findRelatedTests", "jest --findRelatedTests",
"lint-staged-unstash" "lint-staged-unstash"
] ]
@@ -35,15 +40,9 @@
"lint-staged-unstash": "git stash pop && rm -f .lint-staged && true", "lint-staged-unstash": "git stash pop && rm -f .lint-staged && true",
"precommit": "lint-staged", "precommit": "lint-staged",
"prepublish": "scripts/run-script prepublish", "prepublish": "scripts/run-script prepublish",
"pretest": "standard && jest", "pretest": "eslint --ignore-path .gitignore . && jest",
"test": "scripts/run-script test" "test": "scripts/run-script test"
}, },
"standard": {
"ignore": [
"packages/*/dist"
],
"parser": "babel-eslint"
},
"workspaces": [ "workspaces": [
"packages/*" "packages/*"
] ]
+12 -12
View File
@@ -30,7 +30,7 @@ const fuFooter = fu.struct([
fu.uint32('fileFormatVersion'), // 12 fu.uint32('fileFormatVersion'), // 12
fu.struct('dataOffset', [ fu.struct('dataOffset', [
fu.uint32('high'), // 16 fu.uint32('high'), // 16
fu.uint32('low') // 20 fu.uint32('low'), // 20
]), ]),
fu.uint32('timestamp'), // 24 fu.uint32('timestamp'), // 24
fu.char('creatorApplication', 4), // 28 fu.char('creatorApplication', 4), // 28
@@ -38,23 +38,23 @@ const fuFooter = fu.struct([
fu.uint32('creatorHostOs'), // 36 fu.uint32('creatorHostOs'), // 36
fu.struct('originalSize', [ // At the creation, current size of the hard disk. fu.struct('originalSize', [ // At the creation, current size of the hard disk.
fu.uint32('high'), // 40 fu.uint32('high'), // 40
fu.uint32('low') // 44 fu.uint32('low'), // 44
]), ]),
fu.struct('currentSize', [ // Current size of the virtual disk. At the creation: currentSize = originalSize. fu.struct('currentSize', [ // Current size of the virtual disk. At the creation: currentSize = originalSize.
fu.uint32('high'), // 48 fu.uint32('high'), // 48
fu.uint32('low') // 52 fu.uint32('low'), // 52
]), ]),
fu.struct('diskGeometry', [ fu.struct('diskGeometry', [
fu.uint16('cylinders'), // 56 fu.uint16('cylinders'), // 56
fu.uint8('heads'), // 58 fu.uint8('heads'), // 58
fu.uint8('sectorsPerTrackCylinder') // 59 fu.uint8('sectorsPerTrackCylinder'), // 59
]), ]),
fu.uint32('diskType'), // 60 Disk type, must be equal to HARD_DISK_TYPE_DYNAMIC/HARD_DISK_TYPE_DIFFERENCING. fu.uint32('diskType'), // 60 Disk type, must be equal to HARD_DISK_TYPE_DYNAMIC/HARD_DISK_TYPE_DIFFERENCING.
fu.uint32('checksum'), // 64 fu.uint32('checksum'), // 64
fu.uint8('uuid', 16), // 68 fu.uint8('uuid', 16), // 68
fu.char('saved'), // 84 fu.char('saved'), // 84
fu.char('hidden'), // 85 fu.char('hidden'), // 85
fu.byte('reserved', 426) // 86 fu.byte('reserved', 426), // 86
]) ])
const FOOTER_SIZE = fuFooter.size const FOOTER_SIZE = fuFooter.size
@@ -62,11 +62,11 @@ const fuHeader = fu.struct([
fu.char('cookie', 8), fu.char('cookie', 8),
fu.struct('dataOffset', [ fu.struct('dataOffset', [
fu.uint32('high'), fu.uint32('high'),
fu.uint32('low') fu.uint32('low'),
]), ]),
fu.struct('tableOffset', [ // Absolute byte offset of the Block Allocation Table. fu.struct('tableOffset', [ // Absolute byte offset of the Block Allocation Table.
fu.uint32('high'), fu.uint32('high'),
fu.uint32('low') fu.uint32('low'),
]), ]),
fu.uint32('headerVersion'), fu.uint32('headerVersion'),
fu.uint32('maxTableEntries'), // Max entries in the Block Allocation Table. fu.uint32('maxTableEntries'), // Max entries in the Block Allocation Table.
@@ -83,10 +83,10 @@ const fuHeader = fu.struct([
fu.uint32('reserved'), fu.uint32('reserved'),
fu.struct('platformDataOffset', [ // Absolute byte offset of the locator data. fu.struct('platformDataOffset', [ // Absolute byte offset of the locator data.
fu.uint32('high'), fu.uint32('high'),
fu.uint32('low') fu.uint32('low'),
]) ]),
], 8), ], 8),
fu.byte('reserved2', 256) fu.byte('reserved2', 256),
]) ])
const HEADER_SIZE = fuHeader.size const HEADER_SIZE = fuHeader.size
@@ -265,7 +265,7 @@ export default class Vhd {
return this._handler.createReadStream(this._path, { return this._handler.createReadStream(this._path, {
end: begin + length - 1, end: begin + length - 1,
start: begin start: begin,
}).then(buf }).then(buf
? stream => streamToExistingBuffer(stream, buf, offset, (offset || 0) + length) ? stream => streamToExistingBuffer(stream, buf, offset, (offset || 0) + length)
: streamToNewBuffer : streamToNewBuffer
@@ -324,7 +324,7 @@ export default class Vhd {
const sectorsPerBlock = header.blockSize / SECTOR_SIZE const sectorsPerBlock = header.blockSize / SECTOR_SIZE
assert(sectorsPerBlock % 1 === 0) assert(sectorsPerBlock % 1 === 0)
// 1 bit per sector, rounded up to full sectors // 1 bit per sector, rounded up to full sectors
this._blockBitmapSize = Math.ceil(sectorsPerBlock / 8 / SECTOR_SIZE) * SECTOR_SIZE this._blockBitmapSize = Math.ceil(sectorsPerBlock / 8 / SECTOR_SIZE) * SECTOR_SIZE
assert(this._blockBitmapSize === SECTOR_SIZE) assert(this._blockBitmapSize === SECTOR_SIZE)
+4 -4
View File
@@ -39,8 +39,8 @@ const main = async args => {
debounce: 'd', debounce: 'd',
help: 'h', help: 'h',
'read-only': 'ro', 'read-only': 'ro',
verbose: 'v' verbose: 'v',
} },
}) })
if (opts.help) { if (opts.help) {
@@ -72,12 +72,12 @@ const main = async args => {
allowUnauthorized: opts.au, allowUnauthorized: opts.au,
auth, auth,
debounce: opts.debounce != null ? +opts.debounce : null, debounce: opts.debounce != null ? +opts.debounce : null,
readOnly: opts.ro readOnly: opts.ro,
}) })
await xapi.connect() await xapi.connect()
const repl = createRepl({ const repl = createRepl({
prompt: `${xapi._humanId}> ` prompt: `${xapi._humanId}> `,
}) })
repl.context.xapi = xapi repl.context.xapi = xapi
+24 -24
View File
@@ -14,7 +14,7 @@ import {
defer, defer,
delay as pDelay, delay as pDelay,
fromEvents, fromEvents,
lastly lastly,
} from 'promise-toolbox' } from 'promise-toolbox'
import autoTransport from './transports/auto' import autoTransport from './transports/auto'
@@ -41,7 +41,7 @@ const NETWORK_ERRORS = {
EHOSTUNREACH: true, EHOSTUNREACH: true,
// Connection configured timed out has been reach. // Connection configured timed out has been reach.
ETIMEDOUT: true ETIMEDOUT: true,
} }
const isNetworkError = ({code}) => NETWORK_ERRORS[code] const isNetworkError = ({code}) => NETWORK_ERRORS[code]
@@ -50,7 +50,7 @@ const isNetworkError = ({code}) => NETWORK_ERRORS[code]
const XAPI_NETWORK_ERRORS = { const XAPI_NETWORK_ERRORS = {
HOST_STILL_BOOTING: true, HOST_STILL_BOOTING: true,
HOST_HAS_NO_MANAGEMENT_IP: true HOST_HAS_NO_MANAGEMENT_IP: true,
} }
const isXapiNetworkError = ({code}) => XAPI_NETWORK_ERRORS[code] const isXapiNetworkError = ({code}) => XAPI_NETWORK_ERRORS[code]
@@ -101,7 +101,7 @@ const {
create: createObject, create: createObject,
defineProperties, defineProperties,
defineProperty, defineProperty,
freeze: freezeObject freeze: freezeObject,
} = Object } = Object
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -171,7 +171,7 @@ export class Xapi extends EventEmitter {
if (user !== undefined) { if (user !== undefined) {
this._auth = { this._auth = {
user, user,
password: url.password password: url.password,
} }
delete url.username delete url.username
delete url.password delete url.password
@@ -214,7 +214,7 @@ export class Xapi extends EventEmitter {
this.__url = url this.__url = url
this._call = autoTransport({ this._call = autoTransport({
allowUnauthorized: this._allowUnauthorized, allowUnauthorized: this._allowUnauthorized,
url url,
}) })
} }
@@ -306,7 +306,7 @@ export class Xapi extends EventEmitter {
return this._transportCall('session.login_with_password', [ return this._transportCall('session.login_with_password', [
auth.user, auth.user,
auth.password auth.password,
]).then( ]).then(
sessionId => { sessionId => {
this._sessionId = sessionId this._sessionId = sessionId
@@ -363,7 +363,7 @@ export class Xapi extends EventEmitter {
createTask (nameLabel, nameDescription = '') { createTask (nameLabel, nameDescription = '') {
const promise = this._sessionCall('task.create', [ const promise = this._sessionCall('task.create', [
nameLabel, nameLabel,
nameDescription nameDescription,
]) ])
promise.then(taskRef => { promise.then(taskRef => {
@@ -423,7 +423,7 @@ export class Xapi extends EventEmitter {
getResource ($cancelToken, pathname, { getResource ($cancelToken, pathname, {
host, host,
query, query,
task task,
}) { }) {
return this._autoTask( return this._autoTask(
task, task,
@@ -444,12 +444,12 @@ export class Xapi extends EventEmitter {
$cancelToken, $cancelToken,
this._url, this._url,
host && { host && {
hostname: this.getObject(host).address hostname: this.getObject(host).address,
}, },
{ {
pathname, pathname,
query, query,
rejectUnauthorized: !this._allowUnauthorized rejectUnauthorized: !this._allowUnauthorized,
} }
) )
@@ -468,7 +468,7 @@ export class Xapi extends EventEmitter {
putResource ($cancelToken, body, pathname, { putResource ($cancelToken, body, pathname, {
host, host,
query, query,
task task,
} = {}) { } = {}) {
return this._autoTask( return this._autoTask(
task, task,
@@ -500,14 +500,14 @@ export class Xapi extends EventEmitter {
$cancelToken, $cancelToken,
this._url, this._url,
host && { host && {
hostname: this.getObject(host).address hostname: this.getObject(host).address,
}, },
{ {
body, body,
headers, headers,
pathname, pathname,
query, query,
rejectUnauthorized: !this._allowUnauthorized rejectUnauthorized: !this._allowUnauthorized,
}, },
override override
) )
@@ -523,7 +523,7 @@ export class Xapi extends EventEmitter {
? omit(query, 'task_id') ? omit(query, 'task_id')
: query, : query,
maxRedirects: 0 maxRedirects: 0,
}).then( }).then(
response => { response => {
response.req.abort() response.req.abort()
@@ -645,7 +645,7 @@ export class Xapi extends EventEmitter {
id: true, id: true,
pool: true, pool: true,
ref: true, ref: true,
type: true type: true,
} }
const getKey = (key, obj) => reservedKeys[key] && obj === object const getKey = (key, obj) => reservedKeys[key] && obj === object
? `$$${key}` ? `$$${key}`
@@ -659,7 +659,7 @@ export class Xapi extends EventEmitter {
// it is not supposed to contain links, therefore, in // it is not supposed to contain links, therefore, in
// benefice of the doubt, a resolved property is defined. // benefice of the doubt, a resolved property is defined.
defineProperty(object, getKey(key, object), { defineProperty(object, getKey(key, object), {
value: EMPTY_ARRAY value: EMPTY_ARRAY,
}) })
// Minor memory optimization, use the same empty array for // Minor memory optimization, use the same empty array for
@@ -668,7 +668,7 @@ export class Xapi extends EventEmitter {
} else if (isOpaqueRef(value[0])) { } else if (isOpaqueRef(value[0])) {
// This is an array of refs. // This is an array of refs.
defineProperty(object, getKey(key, object), { defineProperty(object, getKey(key, object), {
get: () => freezeObject(map(value, (ref) => objectsByRefs[ref])) get: () => freezeObject(map(value, (ref) => objectsByRefs[ref])),
}) })
freezeObject(value) freezeObject(value)
@@ -679,7 +679,7 @@ export class Xapi extends EventEmitter {
freezeObject(value) freezeObject(value)
} else if (isOpaqueRef(value)) { } else if (isOpaqueRef(value)) {
defineProperty(object, getKey(key, object), { defineProperty(object, getKey(key, object), {
get: () => objectsByRefs[value] get: () => objectsByRefs[value],
}) })
} }
}) })
@@ -689,7 +689,7 @@ export class Xapi extends EventEmitter {
$id: { value: object.uuid || ref }, $id: { value: object.uuid || ref },
$pool: { get: this._getPool }, $pool: { get: this._getPool },
$ref: { value: ref }, $ref: { value: ref },
$type: { value: type } $type: { value: type },
}) })
// Finally freezes the object. // Finally freezes the object.
@@ -711,7 +711,7 @@ export class Xapi extends EventEmitter {
this._pool = object this._pool = object
} else if (type === 'task') { } else if (type === 'task') {
const taskWatchers = this._taskWatchers const taskWatchers = this._taskWatchers
let taskWatcher = taskWatchers[ref] const taskWatcher = taskWatchers[ref]
if ( if (
taskWatcher !== undefined && taskWatcher !== undefined &&
getTaskResult(object, taskWatcher.resolve, taskWatcher.reject) getTaskResult(object, taskWatcher.resolve, taskWatcher.reject)
@@ -768,7 +768,7 @@ export class Xapi extends EventEmitter {
const loop = () => this.status === CONNECTED && this._sessionCall('event.from', [ const loop = () => this.status === CONNECTED && this._sessionCall('event.from', [
['*'], ['*'],
this._fromToken, this._fromToken,
60 + 0.1 // Force float. 60 + 0.1, // Force float.
]).then(onSuccess, onFailure) ]).then(onSuccess, onFailure)
const onSuccess = ({token, events}) => { const onSuccess = ({token, events}) => {
@@ -906,7 +906,7 @@ Xapi.prototype._transportCall = reduce([
const newUrl = { const newUrl = {
...this._url, ...this._url,
hostname: master hostname: master,
} }
this.emit('redirect', newUrl) this.emit('redirect', newUrl)
this._url = newUrl this._url = newUrl
@@ -938,7 +938,7 @@ Xapi.prototype._transportCall = reduce([
throw error throw error
} }
) )
} },
], (call, decorator) => decorator(call)) ], (call, decorator) => decorator(call))
// =================================================================== // ===================================================================
+1 -1
View File
@@ -10,7 +10,7 @@ const xapi = (() => {
return createClient({ return createClient({
auth: { user, password }, auth: { user, password },
url, url,
watchEvents: false watchEvents: false,
}) })
})() })()
+1 -1
View File
@@ -18,5 +18,5 @@ const [ , , url, user, password ] = process.argv
createClient({ createClient({
auth: { user, password }, auth: { user, password },
readOnly: true, readOnly: true,
url url,
}).connect() }).connect()
+2 -2
View File
@@ -9,9 +9,9 @@ export default ({ allowUnauthorized, url }) => {
body: format.request(0, method, args), body: format.request(0, method, args),
headers: { headers: {
'Accept': 'application/json', 'Accept': 'application/json',
'Content-Type': 'application/json' 'Content-Type': 'application/json',
}, },
path: '/jsonrpc' path: '/jsonrpc',
}).readAll('utf8').then( }).readAll('utf8').then(
text => { text => {
let response let response
@@ -18,7 +18,7 @@ const logError = error => {
const SPECIAL_CHARS = { const SPECIAL_CHARS = {
'\r': '\\r', '\r': '\\r',
'\t': '\\t' '\t': '\\t',
} }
const SPECIAL_CHARS_RE = new RegExp( const SPECIAL_CHARS_RE = new RegExp(
Object.keys(SPECIAL_CHARS).join('|'), Object.keys(SPECIAL_CHARS).join('|'),
@@ -76,7 +76,7 @@ const parseResult = result => {
export default ({ export default ({
allowUnauthorized, allowUnauthorized,
url: { hostname, path, port, protocol } url: { hostname, path, port, protocol },
}) => { }) => {
const client = ( const client = (
protocol === 'https:' protocol === 'https:'
@@ -86,7 +86,7 @@ export default ({
host: hostname, host: hostname,
path: '/json', path: '/json',
port, port,
rejectUnauthorized: !allowUnauthorized rejectUnauthorized: !allowUnauthorized,
}) })
const call = promisify(client.methodCall, client) const call = promisify(client.methodCall, client)
+2 -2
View File
@@ -32,7 +32,7 @@ const parseResult = result => {
export default ({ export default ({
allowUnauthorized, allowUnauthorized,
url: { hostname, path, port, protocol } url: { hostname, path, port, protocol },
}) => { }) => {
const client = ( const client = (
protocol === 'https:' protocol === 'https:'
@@ -41,7 +41,7 @@ export default ({
)({ )({
host: hostname, host: hostname,
port, port,
rejectUnauthorized: !allowUnauthorized rejectUnauthorized: !allowUnauthorized,
}) })
const call = promisify(client.methodCall, client) const call = promisify(client.methodCall, client)
+1 -1
View File
@@ -85,7 +85,7 @@ const checkAuthorizationByTypes = {
'VM-snapshot': checkMember('$snapshot_of'), 'VM-snapshot': checkMember('$snapshot_of'),
'VM-template': or(checkSelf, checkMember('$pool')) 'VM-template': or(checkSelf, checkMember('$pool')),
} }
// Hoisting is important for this function. // Hoisting is important for this function.
+12 -12
View File
@@ -2,24 +2,24 @@
// =================================================================== // ===================================================================
var promisify = require('bluebird').promisify const promisify = require('bluebird').promisify
var readFile = promisify(require('fs').readFile) const readFile = promisify(require('fs').readFile)
var writeFile = promisify(require('fs').writeFile) const writeFile = promisify(require('fs').writeFile)
var assign = require('lodash/assign') const assign = require('lodash/assign')
var l33t = require('l33teral') const l33t = require('l33teral')
var mkdirp = promisify(require('mkdirp')) const mkdirp = promisify(require('mkdirp'))
var xdgBasedir = require('xdg-basedir') const xdgBasedir = require('xdg-basedir')
// =================================================================== // ===================================================================
var configPath = xdgBasedir.config + '/xo-cli' const configPath = xdgBasedir.config + '/xo-cli'
var configFile = configPath + '/config.json' const configFile = configPath + '/config.json'
// =================================================================== // ===================================================================
var load = exports.load = function () { const load = exports.load = function () {
return readFile(configFile).then(JSON.parse).catch(function () { return readFile(configFile).then(JSON.parse).catch(function () {
return {} return {}
}) })
@@ -31,7 +31,7 @@ exports.get = function (path) {
}) })
} }
var save = exports.save = function (config) { const save = exports.save = function (config) {
return mkdirp(configPath).then(function () { return mkdirp(configPath).then(function () {
return writeFile(configFile, JSON.stringify(config)) return writeFile(configFile, JSON.stringify(config))
}) })
@@ -45,7 +45,7 @@ exports.set = function (data) {
exports.unset = function (paths) { exports.unset = function (paths) {
return load().then(function (config) { return load().then(function (config) {
var l33tConfig = l33t(config) const l33tConfig = l33t(config)
;[].concat(paths).forEach(function (path) { ;[].concat(paths).forEach(function (path) {
l33tConfig.purge(path, true) l33tConfig.purge(path, true)
}) })
+9 -9
View File
@@ -103,7 +103,7 @@ function parseParameters (args) {
const humanFormatOpts = { const humanFormatOpts = {
unit: 'B', unit: 'B',
scale: 'binary' scale: 'binary',
} }
function printProgress (progress) { function printProgress (progress) {
@@ -214,7 +214,7 @@ async function register (args) {
password = await new Promise(function (resolve) { password = await new Promise(function (resolve) {
process.stdout.write('Password: ') process.stdout.write('Password: ')
pw(resolve) pw(resolve)
}) }),
] = args ] = args
const xo = new Xo({ url }) const xo = new Xo({ url })
@@ -224,7 +224,7 @@ async function register (args) {
await config.set({ await config.set({
server: url, server: url,
token: await xo.call('token.create', { expiresIn }) token: await xo.call('token.create', { expiresIn }),
}) })
} }
exports.register = register exports.register = register
@@ -232,7 +232,7 @@ exports.register = register
function unregister () { function unregister () {
return config.unset([ return config.unset([
'server', 'server',
'token' 'token',
]) ])
} }
exports.unregister = unregister exports.unregister = unregister
@@ -367,7 +367,7 @@ async function call (args) {
} }
}), }),
progress, progress,
output output,
]), 'finish') ]), 'finish')
} }
@@ -381,16 +381,16 @@ async function call (args) {
createReadStream(file), createReadStream(file),
progressStream({ progressStream({
length: length, length: length,
time: 1e3 time: 1e3,
}, printProgress) }, printProgress),
]) ])
const response = await got.post(url, { const response = await got.post(url, {
body: input, body: input,
headers: { headers: {
'content-length': length 'content-length': length,
}, },
method: 'POST' method: 'POST',
}) })
return response.body return response.body
} }
+2 -2
View File
@@ -10,7 +10,7 @@ import isObject from './is-object'
const { const {
create: createObject, create: createObject,
prototype: { hasOwnProperty } prototype: { hasOwnProperty },
} = Object } = Object
export const ACTION_ADD = 'add' export const ACTION_ADD = 'add'
@@ -269,7 +269,7 @@ export default class Collection extends EventEmitter {
const data = { const data = {
add: createObject(null), add: createObject(null),
remove: createObject(null), remove: createObject(null),
update: createObject(null) update: createObject(null),
} }
for (const key in this._buffer) { for (const key in this._buffer) {
+19 -19
View File
@@ -261,58 +261,58 @@ describe('Collection', function () {
'add & update → add': [ 'add & update → add': [
[ [
['add', 'foo', 0], ['add', 'foo', 0],
['update', 'foo', 1] ['update', 'foo', 1],
], ],
{ {
add: { add: {
foo: 1 foo: 1,
} },
} },
], ],
'add & remove → ∅': [ 'add & remove → ∅': [
[ [
['add', 'foo', 0], ['add', 'foo', 0],
['remove', 'foo'] ['remove', 'foo'],
], ],
{} {},
], ],
'update & update → update': [ 'update & update → update': [
[ [
['update', 'bar', 1], ['update', 'bar', 1],
['update', 'bar', 2] ['update', 'bar', 2],
], ],
{ {
update: { update: {
bar: 2 bar: 2,
} },
} },
], ],
'update & remove → remove': [ 'update & remove → remove': [
[ [
['update', 'bar', 1], ['update', 'bar', 1],
['remove', 'bar'] ['remove', 'bar'],
], ],
{ {
remove: { remove: {
bar: undefined bar: undefined,
} },
} },
], ],
'remove & add → update': [ 'remove & add → update': [
[ [
['remove', 'bar'], ['remove', 'bar'],
['add', 'bar', 0] ['add', 'bar', 0],
], ],
{ {
update: { update: {
bar: 0 bar: 0,
} },
} },
] ],
}, ([operations, results], label) => { }, ([operations, results], label) => {
it(label, function () { it(label, function () {
forEach(operations, ([method, ...args]) => { forEach(operations, ([method, ...args]) => {
+4 -4
View File
@@ -6,7 +6,7 @@ import NotImplemented from './not-implemented'
import { import {
ACTION_ADD, ACTION_ADD,
ACTION_UPDATE, ACTION_UPDATE,
ACTION_REMOVE ACTION_REMOVE,
} from './collection' } from './collection'
// =================================================================== // ===================================================================
@@ -77,7 +77,7 @@ export default class Index {
const { const {
computeHash, computeHash,
_itemsByHash: itemsByHash, _itemsByHash: itemsByHash,
_keysToHash: keysToHash _keysToHash: keysToHash,
} = this } = this
for (const key in items) { for (const key in items) {
@@ -104,7 +104,7 @@ export default class Index {
const { const {
computeHash, computeHash,
_itemsByHash: itemsByHash, _itemsByHash: itemsByHash,
_keysToHash: keysToHash _keysToHash: keysToHash,
} = this } = this
for (const key in items) { for (const key in items) {
@@ -135,7 +135,7 @@ export default class Index {
_onRemove (items) { _onRemove (items) {
const { const {
_itemsByHash: itemsByHash, _itemsByHash: itemsByHash,
_keysToHash: keysToHash _keysToHash: keysToHash,
} = this } = this
for (const key in items) { for (const key in items) {
+30 -30
View File
@@ -29,18 +29,18 @@ describe('Index', function () {
let col, byGroup let col, byGroup
const item1 = { const item1 = {
id: '2ccb8a72-dc65-48e4-88fe-45ef541f2cba', id: '2ccb8a72-dc65-48e4-88fe-45ef541f2cba',
group: 'foo' group: 'foo',
} }
const item2 = { const item2 = {
id: '7d21dc51-4da8-4538-a2e9-dd6f4784eb76', id: '7d21dc51-4da8-4538-a2e9-dd6f4784eb76',
group: 'bar' group: 'bar',
} }
const item3 = { const item3 = {
id: '668c1274-4442-44a6-b99a-512188e0bb09', id: '668c1274-4442-44a6-b99a-512188e0bb09',
group: 'foo' group: 'foo',
} }
const item4 = { const item4 = {
id: 'd90b7335-e540-4a44-ad22-c4baae9cd0a9' id: 'd90b7335-e540-4a44-ad22-c4baae9cd0a9',
} }
beforeEach(function () { beforeEach(function () {
@@ -61,19 +61,19 @@ describe('Index', function () {
byGroup: { byGroup: {
foo: { foo: {
[item1.id]: item1, [item1.id]: item1,
[item3.id]: item3 [item3.id]: item3,
}, },
bar: { bar: {
[item2.id]: item2 [item2.id]: item2,
} },
} },
}) })
}) })
it('works with added items', function () { it('works with added items', function () {
const item5 = { const item5 = {
id: '823b56c4-4b96-4f3a-9533-5d08177167ac', id: '823b56c4-4b96-4f3a-9533-5d08177167ac',
group: 'baz' group: 'baz',
} }
col.add(item5) col.add(item5)
@@ -83,15 +83,15 @@ describe('Index', function () {
byGroup: { byGroup: {
foo: { foo: {
[item1.id]: item1, [item1.id]: item1,
[item3.id]: item3 [item3.id]: item3,
}, },
bar: { bar: {
[item2.id]: item2 [item2.id]: item2,
}, },
baz: { baz: {
[item5.id]: item5 [item5.id]: item5,
} },
} },
}) })
}) })
}) })
@@ -99,7 +99,7 @@ describe('Index', function () {
it('works with updated items', function () { it('works with updated items', function () {
const item1bis = { const item1bis = {
id: item1.id, id: item1.id,
group: 'bar' group: 'bar',
} }
col.update(item1bis) col.update(item1bis)
@@ -108,13 +108,13 @@ describe('Index', function () {
expect(col.indexes).toEqual({ expect(col.indexes).toEqual({
byGroup: { byGroup: {
foo: { foo: {
[item3.id]: item3 [item3.id]: item3,
}, },
bar: { bar: {
[item1.id]: item1bis, [item1.id]: item1bis,
[item2.id]: item2 [item2.id]: item2,
} },
} },
}) })
}) })
}) })
@@ -127,10 +127,10 @@ describe('Index', function () {
byGroup: { byGroup: {
foo: { foo: {
[item1.id]: item1, [item1.id]: item1,
[item3.id]: item3 [item3.id]: item3,
}, },
bar: {} bar: {},
} },
}) })
}) })
}) })
@@ -139,7 +139,7 @@ describe('Index', function () {
const item1bis = { const item1bis = {
id: item1.id, id: item1.id,
group: item1.group, group: item1.group,
newProp: true newProp: true,
} }
col.update(item1bis) col.update(item1bis)
@@ -149,12 +149,12 @@ describe('Index', function () {
byGroup: { byGroup: {
foo: { foo: {
[item1.id]: item1bis, [item1.id]: item1bis,
[item3.id]: item3 [item3.id]: item3,
}, },
bar: { bar: {
[item2.id]: item2 [item2.id]: item2,
} },
} },
}) })
}) })
}) })
@@ -170,9 +170,9 @@ describe('Index', function () {
byGroup: { byGroup: {
foo: { foo: {
[item1.id]: item1, [item1.id]: item1,
[item3.id]: item3 [item3.id]: item3,
} },
} },
}) })
}) })
}) })
+4 -4
View File
@@ -5,7 +5,7 @@ import NotImplemented from './not-implemented'
import { import {
ACTION_ADD, ACTION_ADD,
ACTION_UPDATE, ACTION_UPDATE,
ACTION_REMOVE ACTION_REMOVE,
} from './collection' } from './collection'
// =================================================================== // ===================================================================
@@ -66,7 +66,7 @@ export default class UniqueIndex {
const { const {
computeHash, computeHash,
_itemByHash: itemByHash, _itemByHash: itemByHash,
_keysToHash: keysToHash _keysToHash: keysToHash,
} = this } = this
for (const key in items) { for (const key in items) {
@@ -85,7 +85,7 @@ export default class UniqueIndex {
const { const {
computeHash, computeHash,
_itemByHash: itemByHash, _itemByHash: itemByHash,
_keysToHash: keysToHash _keysToHash: keysToHash,
} = this } = this
for (const key in items) { for (const key in items) {
@@ -110,7 +110,7 @@ export default class UniqueIndex {
_onRemove (items) { _onRemove (items) {
const { const {
_itemByHash: itemByHash, _itemByHash: itemByHash,
_keysToHash: keysToHash _keysToHash: keysToHash,
} = this } = this
for (const key in items) { for (const key in items) {
+16 -16
View File
@@ -29,14 +29,14 @@ describe('UniqueIndex', function () {
let col, byKey let col, byKey
const item1 = { const item1 = {
id: '2ccb8a72-dc65-48e4-88fe-45ef541f2cba', id: '2ccb8a72-dc65-48e4-88fe-45ef541f2cba',
key: '036dee1b-9a3b-4fb5-be8a-4f535b355581' key: '036dee1b-9a3b-4fb5-be8a-4f535b355581',
} }
const item2 = { const item2 = {
id: '7d21dc51-4da8-4538-a2e9-dd6f4784eb76', id: '7d21dc51-4da8-4538-a2e9-dd6f4784eb76',
key: '103cd893-d2cc-4d37-96fd-c259ad04c0d4' key: '103cd893-d2cc-4d37-96fd-c259ad04c0d4',
} }
const item3 = { const item3 = {
id: '668c1274-4442-44a6-b99a-512188e0bb09' id: '668c1274-4442-44a6-b99a-512188e0bb09',
} }
beforeEach(function () { beforeEach(function () {
@@ -56,15 +56,15 @@ describe('UniqueIndex', function () {
expect(col.indexes).toEqual({ expect(col.indexes).toEqual({
byKey: { byKey: {
[item1.key]: item1, [item1.key]: item1,
[item2.key]: item2 [item2.key]: item2,
} },
}) })
}) })
it('works with added items', function () { it('works with added items', function () {
const item4 = { const item4 = {
id: '823b56c4-4b96-4f3a-9533-5d08177167ac', id: '823b56c4-4b96-4f3a-9533-5d08177167ac',
key: '1437af14-429a-40db-8a51-8a2f5ed03201' key: '1437af14-429a-40db-8a51-8a2f5ed03201',
} }
col.add(item4) col.add(item4)
@@ -74,8 +74,8 @@ describe('UniqueIndex', function () {
byKey: { byKey: {
[item1.key]: item1, [item1.key]: item1,
[item2.key]: item2, [item2.key]: item2,
[item4.key]: item4 [item4.key]: item4,
} },
}) })
}) })
}) })
@@ -83,7 +83,7 @@ describe('UniqueIndex', function () {
it('works with updated items', function () { it('works with updated items', function () {
const item1bis = { const item1bis = {
id: item1.id, id: item1.id,
key: 'e03d4a3a-0331-4aca-97a2-016bbd43a29b' key: 'e03d4a3a-0331-4aca-97a2-016bbd43a29b',
} }
col.update(item1bis) col.update(item1bis)
@@ -92,8 +92,8 @@ describe('UniqueIndex', function () {
expect(col.indexes).toEqual({ expect(col.indexes).toEqual({
byKey: { byKey: {
[item1bis.key]: item1bis, [item1bis.key]: item1bis,
[item2.key]: item2 [item2.key]: item2,
} },
}) })
}) })
}) })
@@ -104,8 +104,8 @@ describe('UniqueIndex', function () {
return waitTicks().then(() => { return waitTicks().then(() => {
expect(col.indexes).toEqual({ expect(col.indexes).toEqual({
byKey: { byKey: {
[item1.key]: item1 [item1.key]: item1,
} },
}) })
}) })
}) })
@@ -114,7 +114,7 @@ describe('UniqueIndex', function () {
const item1bis = { const item1bis = {
id: item1.id, id: item1.id,
key: item1.key, key: item1.key,
newProp: true newProp: true,
} }
col.update(item1bis) col.update(item1bis)
@@ -123,8 +123,8 @@ describe('UniqueIndex', function () {
expect(col.indexes).toEqual({ expect(col.indexes).toEqual({
byKey: { byKey: {
[item1.key]: item1bis, [item1.key]: item1bis,
[item2.key]: item2 [item2.key]: item2,
} },
}) })
}) })
}) })
+6 -6
View File
@@ -11,18 +11,18 @@ users.getKey = (user) => user.name
// Inserts some data. // Inserts some data.
users.add({ users.add({
name: 'bob' name: 'bob',
}) })
users.add({ users.add({
name: 'clara', name: 'clara',
active: true active: true,
}) })
users.add({ users.add({
name: 'ophelia' name: 'ophelia',
}) })
users.add({ users.add({
name: 'Steve', name: 'Steve',
active: true active: true,
}) })
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -48,9 +48,9 @@ setTimeout(function () {
users.set({ users.set({
name: 'ophelia', name: 'ophelia',
active: true active: true,
}) })
users.set({ users.set({
name: 'Steve' name: 'Steve',
}) })
}, 10) }, 10)
+1 -1
View File
@@ -3,7 +3,7 @@ import { bind, forEach, iteratee as createCallback } from 'lodash'
import Collection, { import Collection, {
ACTION_ADD, ACTION_ADD,
ACTION_UPDATE, ACTION_UPDATE,
ACTION_REMOVE ACTION_REMOVE,
} from './collection' } from './collection'
// =================================================================== // ===================================================================
+30 -30
View File
@@ -12,7 +12,7 @@ class XoError extends BaseError {
return { return {
message: this.message, message: this.message,
code: this.code, code: this.code,
data: this.data data: this.data,
} }
} }
} }
@@ -28,44 +28,44 @@ const create = (code, getProps) => {
// ============================================================================= // =============================================================================
export const notImplemented = create(0, () => ({ export const notImplemented = create(0, () => ({
message: 'not implemented' message: 'not implemented',
})) }))
export const noSuchObject = create(1, (id, type) => ({ export const noSuchObject = create(1, (id, type) => ({
data: { id, type }, data: { id, type },
message: 'no such object' message: 'no such object',
})) }))
export const unauthorized = create(2, () => ({ export const unauthorized = create(2, () => ({
message: 'not authenticated or not enough permissions' message: 'not authenticated or not enough permissions',
})) }))
export const invalidCredentials = create(3, () => ({ export const invalidCredentials = create(3, () => ({
message: 'invalid credentials' message: 'invalid credentials',
})) }))
// Deprecated alreadyAuthenticated (4) // Deprecated alreadyAuthenticated (4)
export const forbiddenOperation = create(5, (operation, reason) => ({ export const forbiddenOperation = create(5, (operation, reason) => ({
data: { operation, reason }, data: { operation, reason },
message: `forbidden operation: ${operation}` message: `forbidden operation: ${operation}`,
})) }))
// Deprecated GenericError (6) // Deprecated GenericError (6)
export const noHostsAvailable = create(7, () => ({ export const noHostsAvailable = create(7, () => ({
message: 'no hosts available' message: 'no hosts available',
})) }))
export const authenticationFailed = create(8, () => ({ export const authenticationFailed = create(8, () => ({
message: 'authentication failed' message: 'authentication failed',
})) }))
export const serverUnreachable = create(9, objectId => ({ export const serverUnreachable = create(9, objectId => ({
data: { data: {
objectId objectId,
}, },
message: 'server unreachable' message: 'server unreachable',
})) }))
export const invalidParameters = create(10, (message, errors) => { export const invalidParameters = create(10, (message, errors) => {
@@ -76,22 +76,22 @@ export const invalidParameters = create(10, (message, errors) => {
return { return {
data: { errors }, data: { errors },
message: message || 'invalid parameters' message: message || 'invalid parameters',
} }
}) })
export const vmMissingPvDrivers = create(11, ({ vm }) => ({ export const vmMissingPvDrivers = create(11, ({ vm }) => ({
data: { data: {
objectId: vm objectId: vm,
}, },
message: 'missing PV drivers' message: 'missing PV drivers',
})) }))
export const vmIsTemplate = create(12, ({ vm }) => ({ export const vmIsTemplate = create(12, ({ vm }) => ({
data: { data: {
objectId: vm objectId: vm,
}, },
message: 'VM is a template' message: 'VM is a template',
})) }))
// TODO: We should probably create a more generic error which gathers all incorrect state errors. // TODO: We should probably create a more generic error which gathers all incorrect state errors.
@@ -109,58 +109,58 @@ export const vmBadPowerState = create(13, ({ vm, expected, actual }) => ({
data: { data: {
objectId: vm, objectId: vm,
expected, expected,
actual actual,
}, },
message: `VM state is ${actual} but should be ${expected}` message: `VM state is ${actual} but should be ${expected}`,
})) }))
export const vmLacksFeature = create(14, ({ vm, feature }) => ({ export const vmLacksFeature = create(14, ({ vm, feature }) => ({
data: { data: {
objectId: vm, objectId: vm,
feature feature,
}, },
message: `VM lacks feature ${feature || ''}` message: `VM lacks feature ${feature || ''}`,
})) }))
export const notSupportedDuringUpgrade = create(15, () => ({ export const notSupportedDuringUpgrade = create(15, () => ({
message: 'not supported during upgrade' message: 'not supported during upgrade',
})) }))
export const objectAlreadyExists = create(16, ({ objectId, objectType }) => ({ export const objectAlreadyExists = create(16, ({ objectId, objectType }) => ({
data: { data: {
objectId, objectId,
objectType objectType,
}, },
message: `${objectType || 'object'} already exists` message: `${objectType || 'object'} already exists`,
})) }))
export const vdiInUse = create(17, ({ vdi, operation }) => ({ export const vdiInUse = create(17, ({ vdi, operation }) => ({
data: { data: {
objectId: vdi, objectId: vdi,
operation operation,
}, },
message: 'VDI in use' message: 'VDI in use',
})) }))
export const hostOffline = create(18, ({ host }) => ({ export const hostOffline = create(18, ({ host }) => ({
data: { data: {
objectId: host objectId: host,
}, },
message: 'host offline' message: 'host offline',
})) }))
export const operationBlocked = create(19, ({ objectId, code }) => ({ export const operationBlocked = create(19, ({ objectId, code }) => ({
data: { data: {
objectId, objectId,
code code,
}, },
message: 'operation blocked' message: 'operation blocked',
})) }))
export const patchPrecheckFailed = create(20, ({ errorType, patch }) => ({ export const patchPrecheckFailed = create(20, ({ errorType, patch }) => ({
data: { data: {
objectId: patch, objectId: patch,
errorType errorType,
}, },
message: `patch precheck failed: ${errorType}` message: `patch precheck failed: ${errorType}`,
})) }))
+5 -5
View File
@@ -4,10 +4,10 @@ process.on('unhandledRejection', function (error) {
console.log(error) console.log(error)
}) })
var Xo = require('./').default const Xo = require('./').default
var xo = new Xo({ const xo = new Xo({
url: 'localhost:9000' url: 'localhost:9000',
}) })
xo.open().then(function () { xo.open().then(function () {
@@ -19,7 +19,7 @@ xo.open().then(function () {
}).then(function () { }).then(function () {
return xo.signIn({ return xo.signIn({
email: 'admin@admin.net', email: 'admin@admin.net',
password: 'admin' password: 'admin',
}).then(function () { }).then(function () {
console.log('connected as ', xo.user) console.log('connected as ', xo.user)
}).catch(function (error) { }).catch(function (error) {
@@ -28,7 +28,7 @@ xo.open().then(function () {
}).then(function () { }).then(function () {
return xo.signIn({ return xo.signIn({
email: 'tom', email: 'tom',
password: 'tom' password: 'tom',
}).then(function () { }).then(function () {
console.log('connected as', xo.user) console.log('connected as', xo.user)
+1 -1
View File
@@ -1,6 +1,6 @@
import JsonRpcWebSocketClient, { import JsonRpcWebSocketClient, {
OPEN, OPEN,
CLOSED CLOSED,
} from 'jsonrpc-websocket-client' } from 'jsonrpc-websocket-client'
import { BaseError } from 'make-error' import { BaseError } from 'make-error'
import { startsWith } from 'lodash' import { startsWith } from 'lodash'
+15 -15
View File
@@ -12,8 +12,8 @@ const data = deepFreeze({
string: 'file:///var/lib/xoa/backup', string: 'file:///var/lib/xoa/backup',
object: { object: {
type: 'file', type: 'file',
path: '/var/lib/xoa/backup' path: '/var/lib/xoa/backup',
} },
}, },
SMB: { SMB: {
string: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0', string: 'smb://Administrator:pas:sw@ord@toto\\\\192.168.100.225\\smb\0',
@@ -23,17 +23,17 @@ const data = deepFreeze({
path: '', path: '',
domain: 'toto', domain: 'toto',
username: 'Administrator', username: 'Administrator',
password: 'pas:sw@ord' password: 'pas:sw@ord',
} },
}, },
NFS: { NFS: {
string: 'nfs://192.168.100.225:/media/nfs', string: 'nfs://192.168.100.225:/media/nfs',
object: { object: {
type: 'nfs', type: 'nfs',
host: '192.168.100.225', host: '192.168.100.225',
path: '/media/nfs' path: '/media/nfs',
} },
} },
}) })
const parseData = deepFreeze({ const parseData = deepFreeze({
@@ -43,17 +43,17 @@ const parseData = deepFreeze({
string: 'file://var/lib/xoa/backup', string: 'file://var/lib/xoa/backup',
object: { object: {
type: 'file', type: 'file',
path: '/var/lib/xoa/backup' path: '/var/lib/xoa/backup',
} },
}, },
'nfs with missing leading slash': { 'nfs with missing leading slash': {
string: 'nfs://192.168.100.225:media/nfs', string: 'nfs://192.168.100.225:media/nfs',
object: { object: {
type: 'nfs', type: 'nfs',
host: '192.168.100.225', host: '192.168.100.225',
path: '/media/nfs' path: '/media/nfs',
} },
} },
}) })
const formatData = deepFreeze({ const formatData = deepFreeze({
@@ -63,9 +63,9 @@ const formatData = deepFreeze({
string: 'file:///var/lib/xoa/backup', string: 'file:///var/lib/xoa/backup',
object: { object: {
type: 'local', type: 'local',
path: '/var/lib/xoa/backup' path: '/var/lib/xoa/backup',
} },
} },
}) })
// ------------------------------------------------------------------- // -------------------------------------------------------------------
+4 -4
View File
@@ -6,13 +6,13 @@ export const configurationSchema = {
type: 'object', type: 'object',
properties: { properties: {
clientID: { clientID: {
type: 'string' type: 'string',
}, },
clientSecret: { clientSecret: {
type: 'string' type: 'string',
} },
}, },
required: ['clientID', 'clientSecret'] required: ['clientID', 'clientSecret'],
} }
// =================================================================== // ===================================================================
+6 -6
View File
@@ -7,22 +7,22 @@ export const configurationSchema = {
properties: { properties: {
callbackURL: { callbackURL: {
type: 'string', type: 'string',
description: 'Must be exactly the same as specified on the Google developer console.' description: 'Must be exactly the same as specified on the Google developer console.',
}, },
clientID: { clientID: {
type: 'string' type: 'string',
}, },
clientSecret: { clientSecret: {
type: 'string' type: 'string',
}, },
scope: { scope: {
default: 'https://www.googleapis.com/auth/plus.login', default: 'https://www.googleapis.com/auth/plus.login',
description: 'Note that changing this value will break existing users.', description: 'Note that changing this value will break existing users.',
enum: [ 'https://www.googleapis.com/auth/plus.login', 'email' ], enum: [ 'https://www.googleapis.com/auth/plus.login', 'email' ],
enumNames: [ 'Google+ name', 'Simple email address' ] enumNames: [ 'Google+ name', 'Simple email address' ],
} },
}, },
required: ['callbackURL', 'clientID', 'clientSecret'] required: ['callbackURL', 'clientID', 'clientSecret'],
} }
// =================================================================== // ===================================================================
+22 -22
View File
@@ -25,7 +25,7 @@ export const configurationSchema = {
properties: { properties: {
uri: { uri: {
description: 'URI of the LDAP server.', description: 'URI of the LDAP server.',
type: 'string' type: 'string',
}, },
certificateAuthorities: { certificateAuthorities: {
description: ` description: `
@@ -35,13 +35,13 @@ If not specified, it will use a default set of well-known CAs.
`.trim(), `.trim(),
type: 'array', type: 'array',
items: { items: {
type: 'string' type: 'string',
} },
}, },
checkCertificate: { checkCertificate: {
description: 'Enforce the validity of the server\'s certificates. You can disable it when connecting to servers that use a self-signed certificate.', description: 'Enforce the validity of the server\'s certificates. You can disable it when connecting to servers that use a self-signed certificate.',
type: 'boolean', type: 'boolean',
default: true default: true,
}, },
bind: { bind: {
description: 'Credentials to use before looking for the user record.', description: 'Credentials to use before looking for the user record.',
@@ -55,18 +55,18 @@ Example: uid=xoa-auth,ou=people,dc=company,dc=net
For Microsoft Active Directory, it can also be \`<user>@<domain>\`. For Microsoft Active Directory, it can also be \`<user>@<domain>\`.
`.trim(), `.trim(),
type: 'string' type: 'string',
}, },
password: { password: {
description: 'Password of the user permitted of search the LDAP directory.', description: 'Password of the user permitted of search the LDAP directory.',
type: 'string' type: 'string',
} },
}, },
required: ['dn', 'password'] required: ['dn', 'password'],
}, },
base: { base: {
description: 'The base is the part of the description tree where the users are looked for.', description: 'The base is the part of the description tree where the users are looked for.',
type: 'string' type: 'string',
}, },
filter: { filter: {
description: ` description: `
@@ -85,10 +85,10 @@ something like:
- \`(&(uid={{name}})(memberOf=<group DN>))\` - \`(&(uid={{name}})(memberOf=<group DN>))\`
`.trim(), `.trim(),
type: 'string', type: 'string',
default: '(uid={{name}})' default: '(uid={{name}})',
} },
}, },
required: ['uri', 'base'] required: ['uri', 'base'],
} }
export const testSchema = { export const testSchema = {
@@ -96,14 +96,14 @@ export const testSchema = {
properties: { properties: {
username: { username: {
description: 'LDAP username', description: 'LDAP username',
type: 'string' type: 'string',
}, },
password: { password: {
description: 'LDAP password', description: 'LDAP password',
type: 'string' type: 'string',
} },
}, },
required: ['username', 'password'] required: ['username', 'password'],
} }
// =================================================================== // ===================================================================
@@ -119,14 +119,14 @@ class AuthLdap {
const clientOpts = this._clientOpts = { const clientOpts = this._clientOpts = {
url: conf.uri, url: conf.uri,
maxConnections: 5, maxConnections: 5,
tlsOptions: {} tlsOptions: {},
} }
{ {
const { const {
bind, bind,
checkCertificate = true, checkCertificate = true,
certificateAuthorities certificateAuthorities,
} = conf } = conf
if (bind) { if (bind) {
@@ -147,7 +147,7 @@ class AuthLdap {
const { const {
bind: credentials, bind: credentials,
base: searchBase, base: searchBase,
filter: searchFilter = '(uid={{name}})' filter: searchFilter = '(uid={{name}})',
} = conf } = conf
this._credentials = credentials this._credentials = credentials
@@ -166,7 +166,7 @@ class AuthLdap {
test ({ username, password }) { test ({ username, password }) {
return this._authenticate({ return this._authenticate({
username, username,
password password,
}).then(result => { }).then(result => {
if (result === null) { if (result === null) {
throw new Error('could not authenticate user') throw new Error('could not authenticate user')
@@ -207,8 +207,8 @@ class AuthLdap {
const response = await search(this._searchBase, { const response = await search(this._searchBase, {
scope: 'sub', scope: 'sub',
filter: evalFilter(this._searchFilter, { filter: evalFilter(this._searchFilter, {
name: username name: username,
}) }),
}) })
response.on('searchEntry', entry => { response.on('searchEntry', entry => {
@@ -9,46 +9,46 @@ const EMPTY_OBJECT = Object.freeze({ __proto__: null })
const _extractValue = ({ value }) => value const _extractValue = ({ value }) => value
export const confirm = (message, { export const confirm = (message, {
default: defaultValue = null default: defaultValue = null,
} = EMPTY_OBJECT) => prompt({ } = EMPTY_OBJECT) => prompt({
default: defaultValue, default: defaultValue,
message, message,
name: 'value', name: 'value',
type: 'confirm' type: 'confirm',
}).then(_extractValue) }).then(_extractValue)
export const input = (message, { export const input = (message, {
default: defaultValue = null, default: defaultValue = null,
filter = undefined, filter = undefined,
validate = undefined validate = undefined,
} = EMPTY_OBJECT) => prompt({ } = EMPTY_OBJECT) => prompt({
default: defaultValue, default: defaultValue,
message, message,
name: 'value', name: 'value',
type: 'input', type: 'input',
validate validate,
}).then(_extractValue) }).then(_extractValue)
export const list = (message, choices, { export const list = (message, choices, {
default: defaultValue = null default: defaultValue = null,
} = EMPTY_OBJECT) => prompt({ } = EMPTY_OBJECT) => prompt({
default: defaultValue, default: defaultValue,
choices, choices,
message, message,
name: 'value', name: 'value',
type: 'list' type: 'list',
}).then(_extractValue) }).then(_extractValue)
export const password = (message, { export const password = (message, {
default: defaultValue = null, default: defaultValue = null,
filter = undefined, filter = undefined,
validate = undefined validate = undefined,
} = EMPTY_OBJECT) => prompt({ } = EMPTY_OBJECT) => prompt({
default: defaultValue, default: defaultValue,
message, message,
name: 'value', name: 'value',
type: 'password', type: 'password',
validate validate,
}).then(_extractValue) }).then(_extractValue)
// =================================================================== // ===================================================================
@@ -86,7 +86,7 @@ const promptByType = {
while ( while (
i < n && // eslint-disable-line no-unmodified-loop-condition i < n && // eslint-disable-line no-unmodified-loop-condition
await confirm('additional item?', { await confirm('additional item?', {
default: false default: false,
}) })
) { ) {
await promptItem() await promptItem()
@@ -96,23 +96,23 @@ const promptByType = {
}, },
boolean: (schema, defaultValue, path) => confirm(path, { boolean: (schema, defaultValue, path) => confirm(path, {
default: defaultValue != null ? defaultValue : schema.default default: defaultValue != null ? defaultValue : schema.default,
}), }),
enum: (schema, defaultValue, path) => list(path, schema.enum, { enum: (schema, defaultValue, path) => list(path, schema.enum, {
defaultValue: defaultValue || schema.defaultValue defaultValue: defaultValue || schema.defaultValue,
}), }),
integer: (schema, defaultValue, path) => input(path, { integer: (schema, defaultValue, path) => input(path, {
default: defaultValue || schema.default, default: defaultValue || schema.default,
filter: input => +input, filter: input => +input,
validate: input => isInteger(+input) validate: input => isInteger(+input),
}), }),
number: (schema, defaultValue, path) => input(path, { number: (schema, defaultValue, path) => input(path, {
default: defaultValue || schema.default, default: defaultValue || schema.default,
filter: input => +input, filter: input => +input,
validate: input => isFinite(+input) validate: input => isFinite(+input),
}), }),
object: async (schema, defaultValue, path) => { object: async (schema, defaultValue, path) => {
@@ -131,7 +131,7 @@ const promptByType = {
if ( if (
required[name] || required[name] ||
await confirm(`fill optional ${subpath}?`, { await confirm(`fill optional ${subpath}?`, {
default: Boolean(defaultValue && name in defaultValue) default: Boolean(defaultValue && name in defaultValue),
}) })
) { ) {
value[name] = await promptGeneric( value[name] = await promptGeneric(
@@ -148,8 +148,8 @@ const promptByType = {
}, },
string: (schema, defaultValue, path) => input(path, { string: (schema, defaultValue, path) => input(path, {
default: defaultValue || schema.default default: defaultValue || schema.default,
}) }),
} }
export default function promptGeneric (schema, defaultValue, path) { export default function promptGeneric (schema, defaultValue, path) {
+4 -4
View File
@@ -7,10 +7,10 @@ import { readFile, writeFile } from 'fs'
import promptSchema, { import promptSchema, {
input, input,
password password,
} from './prompt-schema' } from './prompt-schema'
import createPlugin, { import createPlugin, {
configurationSchema configurationSchema,
} from './' } from './'
// =================================================================== // ===================================================================
@@ -42,8 +42,8 @@ execPromise(async args => {
await plugin._authenticate({ await plugin._authenticate({
username: await input('Username', { username: await input('Username', {
validate: input => !!input.length validate: input => !!input.length,
}), }),
password: await password('Password') password: await password('Password'),
}, bind(console.log, console)) }, bind(console.log, console))
}) })
+6 -6
View File
@@ -6,19 +6,19 @@ export const configurationSchema = {
type: 'object', type: 'object',
properties: { properties: {
cert: { cert: {
type: 'string' type: 'string',
}, },
entryPoint: { entryPoint: {
type: 'string' type: 'string',
}, },
issuer: { issuer: {
type: 'string' type: 'string',
}, },
usernameField: { usernameField: {
type: 'string' type: 'string',
} },
}, },
required: ['cert', 'entryPoint', 'issuer'] required: ['cert', 'entryPoint', 'issuer'],
} }
// =================================================================== // ===================================================================
+16 -16
View File
@@ -14,9 +14,9 @@ export const configurationSchema = {
description: 'an array of recipients (mails)', description: 'an array of recipients (mails)',
items: { items: {
type: 'string' type: 'string',
}, },
minItems: 1 minItems: 1,
}, },
toXmpp: { toXmpp: {
type: 'array', type: 'array',
@@ -24,11 +24,11 @@ export const configurationSchema = {
description: 'an array of recipients (xmpp)', description: 'an array of recipients (xmpp)',
items: { items: {
type: 'string' type: 'string',
}, },
minItems: 1 minItems: 1,
} },
} },
} }
// =================================================================== // ===================================================================
@@ -50,13 +50,13 @@ const formatMethod = method =>
const formatSize = bytes => const formatSize = bytes =>
humanFormat(bytes, { humanFormat(bytes, {
scale: 'binary', scale: 'binary',
unit: 'B' unit: 'B',
}) })
const formatSpeed = (bytes, milliseconds) => const formatSpeed = (bytes, milliseconds) =>
humanFormat(bytes * 1e3 / milliseconds, { humanFormat(bytes * 1e3 / milliseconds, {
scale: 'binary', scale: 'binary',
unit: 'B/s' unit: 'B/s',
}) })
const logError = e => { const logError = e => {
@@ -115,7 +115,7 @@ class BackupReportsXoPlugin {
const reportOnFailure = const reportOnFailure =
reportWhen === 'fail' || // xo-web < 5 reportWhen === 'fail' || // xo-web < 5
reportWhen === 'failure' // xo-web >= 5 reportWhen === 'failure' // xo-web >= 5
let globalMergeSize = 0 let globalMergeSize = 0
let globalTransferSize = 0 let globalTransferSize = 0
@@ -143,7 +143,7 @@ class BackupReportsXoPlugin {
`- **UUID**: ${vm !== undefined ? vm.uuid : id}`, `- **UUID**: ${vm !== undefined ? vm.uuid : id}`,
`- **Start time**: ${formatDate(start)}`, `- **Start time**: ${formatDate(start)}`,
`- **End time**: ${formatDate(end)}`, `- **End time**: ${formatDate(end)}`,
`- **Duration**: ${formatDuration(duration)}` `- **Duration**: ${formatDuration(duration)}`,
] ]
const { error } = call const { error } = call
@@ -205,7 +205,7 @@ class BackupReportsXoPlugin {
`- **Start time**: ${formatDate(start)}`, `- **Start time**: ${formatDate(start)}`,
`- **End time**: ${formatDate(end)}`, `- **End time**: ${formatDate(end)}`,
`- **Duration**: ${formatDuration(duration)}`, `- **Duration**: ${formatDuration(duration)}`,
`- **Successes**: ${nSuccesses} / ${nCalls}` `- **Successes**: ${nSuccesses} / ${nCalls}`,
] ]
if (globalTransferSize !== 0) { if (globalTransferSize !== 0) {
markdown.push( markdown.push(
@@ -256,21 +256,21 @@ class BackupReportsXoPlugin {
} Backup report for ${tag} ${ } Backup report for ${tag} ${
globalSuccess ? ICON_SUCCESS : ICON_FAILURE globalSuccess ? ICON_SUCCESS : ICON_FAILURE
}`, }`,
markdown markdown,
}), }),
xo.sendToXmppClient !== undefined && xo.sendToXmppClient({ xo.sendToXmppClient !== undefined && xo.sendToXmppClient({
to: this._xmppReceivers, to: this._xmppReceivers,
message: markdown message: markdown,
}), }),
xo.sendSlackMessage !== undefined && xo.sendSlackMessage({ xo.sendSlackMessage !== undefined && xo.sendSlackMessage({
message: markdown message: markdown,
}), }),
xo.sendPassiveCheck !== undefined && xo.sendPassiveCheck({ xo.sendPassiveCheck !== undefined && xo.sendPassiveCheck({
status: globalSuccess ? 0 : 2, status: globalSuccess ? 0 : 2,
message: globalSuccess message: globalSuccess
? `[Xen Orchestra] [Success] Backup report for ${tag}` ? `[Xen Orchestra] [Success] Backup report for ${tag}`
: `[Xen Orchestra] [Failure] Backup report for ${tag} - VMs : ${nagiosText.join(' ')}` : `[Xen Orchestra] [Failure] Backup report for ${tag} - VMs : ${nagiosText.join(' ')}`,
}) }),
]) ])
} }
} }
+6 -6
View File
@@ -13,7 +13,7 @@ class XoServerCloud {
constructor ({ xo }) { constructor ({ xo }) {
this._xo = xo this._xo = xo
// Defined in configure(). // Defined in configure().
this._conf = null this._conf = null
this._key = null this._key = null
} }
@@ -31,16 +31,16 @@ class XoServerCloud {
registerResource.description = 'Register a resource via cloud plugin' registerResource.description = 'Register a resource via cloud plugin'
registerResource.params = { registerResource.params = {
namespace: { namespace: {
type: 'string' type: 'string',
} },
} }
registerResource.permission = 'admin' registerResource.permission = 'admin'
this._unsetApiMethods = this._xo.addApiMethods({ this._unsetApiMethods = this._xo.addApiMethods({
cloud: { cloud: {
getResourceCatalog, getResourceCatalog,
registerResource registerResource,
} },
}) })
this._unsetRequestResource = this._xo.defineProperty('requestResource', this._requestResource, this) this._unsetRequestResource = this._xo.defineProperty('requestResource', this._requestResource, this)
@@ -127,7 +127,7 @@ class XoServerCloud {
const downloadToken = await this._updater.call('getResourceDownloadToken', { const downloadToken = await this._updater.call('getResourceDownloadToken', {
token: namespaceCatalog._token, token: namespaceCatalog._token,
id, id,
version version,
}) })
if (!downloadToken) { if (!downloadToken) {
@@ -21,11 +21,11 @@ export default class DensityPlan extends Plan {
const { const {
hosts, hosts,
toOptimize toOptimize,
} = results } = results
let { let {
averages: hostsAverages averages: hostsAverages,
} = results } = results
const pools = await this._getPlanPools() const pools = await this._getPlanPools()
@@ -34,11 +34,11 @@ export default class DensityPlan extends Plan {
for (const hostToOptimize of toOptimize) { for (const hostToOptimize of toOptimize) {
const { const {
id: hostId, id: hostId,
$poolId: poolId $poolId: poolId,
} = hostToOptimize } = hostToOptimize
const { const {
master: masterId master: masterId,
} = pools[poolId] } = pools[poolId]
// Avoid master optimization. // Avoid master optimization.
@@ -60,7 +60,7 @@ export default class DensityPlan extends Plan {
for (const dest of hosts) { for (const dest of hosts) {
const { const {
id: destId, id: destId,
$poolId: destPoolId $poolId: destPoolId,
} = dest } = dest
// Destination host != Host to optimize! // Destination host != Host to optimize!
@@ -87,9 +87,9 @@ export default class DensityPlan extends Plan {
[ poolMaster ], [ poolMaster ],
poolHosts, poolHosts,
masters, masters,
otherHosts otherHosts,
], ],
hostsAverages: clone(hostsAverages) hostsAverages: clone(hostsAverages),
}) })
if (simulResults) { if (simulResults) {
@@ -127,7 +127,7 @@ export default class DensityPlan extends Plan {
const simulResults = { const simulResults = {
hostsAverages, hostsAverages,
moves: [] moves: [],
} }
// Try to find a destination for each VM. // Try to find a destination for each VM.
@@ -140,7 +140,7 @@ export default class DensityPlan extends Plan {
vm, vm,
destinations: subDestinations, destinations: subDestinations,
hostsAverages, hostsAverages,
vmsAverages vmsAverages,
}) })
// Destination found. // Destination found.
@@ -164,8 +164,8 @@ export default class DensityPlan extends Plan {
_testMigration ({ vm, destinations, hostsAverages, vmsAverages }) { _testMigration ({ vm, destinations, hostsAverages, vmsAverages }) {
const { const {
_thresholds: { _thresholds: {
critical: criticalThreshold critical: criticalThreshold,
} },
} = this } = this
// Sort the destinations by available memory. (- -> +) // Sort the destinations by available memory. (- -> +)
@@ -192,7 +192,7 @@ export default class DensityPlan extends Plan {
// Available movement. // Available movement.
return { return {
vm, vm,
destination destination,
} }
} }
} }
@@ -206,7 +206,7 @@ export default class DensityPlan extends Plan {
mapToArray(moves, move => { mapToArray(moves, move => {
const { const {
vm, vm,
destination destination,
} = move } = move
const xapiDest = this.xo.getXapi(destination) const xapiDest = this.xo.getXapi(destination)
debug(`Migrate VM (${vm.id}) to Host (${destination.id}) from Host (${vm.$container}).`) debug(`Migrate VM (${vm.id}) to Host (${destination.id}) from Host (${vm.$container}).`)
+18 -18
View File
@@ -7,11 +7,11 @@ import DensityPlan from './density-plan'
import PerformancePlan from './performance-plan' import PerformancePlan from './performance-plan'
import { import {
DEFAULT_CRITICAL_THRESHOLD_CPU, DEFAULT_CRITICAL_THRESHOLD_CPU,
DEFAULT_CRITICAL_THRESHOLD_MEMORY_FREE DEFAULT_CRITICAL_THRESHOLD_MEMORY_FREE,
} from './plan' } from './plan'
import { import {
EXECUTION_DELAY, EXECUTION_DELAY,
debug debug,
} from './utils' } from './utils'
// =================================================================== // ===================================================================
@@ -37,12 +37,12 @@ export const configurationSchema = {
properties: { properties: {
name: { name: {
type: 'string', type: 'string',
title: 'Name' title: 'Name',
}, },
mode: { mode: {
enum: [ 'Performance mode', 'Density mode' ], enum: [ 'Performance mode', 'Density mode' ],
title: 'Mode' title: 'Mode',
}, },
pools: { pools: {
@@ -51,8 +51,8 @@ export const configurationSchema = {
items: { items: {
type: 'string', type: 'string',
$type: 'Pool' $type: 'Pool',
} },
}, },
thresholds: { thresholds: {
@@ -63,14 +63,14 @@ export const configurationSchema = {
cpu: { cpu: {
type: 'integer', type: 'integer',
title: 'CPU (%)', title: 'CPU (%)',
default: DEFAULT_CRITICAL_THRESHOLD_CPU default: DEFAULT_CRITICAL_THRESHOLD_CPU,
}, },
memoryFree: { memoryFree: {
type: 'integer', type: 'integer',
title: 'RAM, Free memory (MB)', title: 'RAM, Free memory (MB)',
default: DEFAULT_CRITICAL_THRESHOLD_MEMORY_FREE default: DEFAULT_CRITICAL_THRESHOLD_MEMORY_FREE,
} },
} },
}, },
excludedHosts: { excludedHosts: {
@@ -80,19 +80,19 @@ export const configurationSchema = {
items: { items: {
type: 'string', type: 'string',
$type: 'Host' $type: 'Host',
} },
} },
}, },
required: [ 'name', 'mode', 'pools' ] required: [ 'name', 'mode', 'pools' ],
}, },
minItems: 1 minItems: 1,
} },
}, },
additionalProperties: false additionalProperties: false,
} }
// =================================================================== // ===================================================================
@@ -102,7 +102,7 @@ export const configurationSchema = {
const makeJob = (cronPattern, fn) => { const makeJob = (cronPattern, fn) => {
const job = { const job = {
running: false, running: false,
emitter: new EventEmitter() emitter: new EventEmitter(),
} }
job.cron = new CronJob(cronPattern, async () => { job.cron = new CronJob(cronPattern, async () => {
@@ -54,7 +54,7 @@ export default class PerformancePlan extends Plan {
const { const {
averages, averages,
toOptimize toOptimize,
} = results } = results
let { hosts } = results let { hosts } = results
@@ -75,7 +75,7 @@ export default class PerformancePlan extends Plan {
await this._optimize({ await this._optimize({
exceededHost, exceededHost,
hosts, hosts,
hostsAverages: averages hostsAverages: averages,
}) })
} }
} }
+9 -9
View File
@@ -2,7 +2,7 @@ import { filter, includes, map as mapToArray } from 'lodash'
import { import {
EXECUTION_DELAY, EXECUTION_DELAY,
debug debug,
} from './utils' } from './utils'
const MINUTES_OF_HISTORICAL_DATA = 30 const MINUTES_OF_HISTORICAL_DATA = 30
@@ -58,7 +58,7 @@ function computeRessourcesAverage (objects, objectsStats, nPoints) {
), ),
nCpus: stats.cpus.length, nCpus: stats.cpus.length,
memoryFree: computeAverage(stats.memoryFree, nPoints), memoryFree: computeAverage(stats.memoryFree, nPoints),
memory: computeAverage(stats.memory, nPoints) memory: computeAverage(stats.memory, nPoints),
} }
} }
@@ -91,7 +91,7 @@ function setRealCpuAverageOfVms (vms, vmsAverages, nCpus) {
export default class Plan { export default class Plan {
constructor (xo, name, poolIds, { constructor (xo, name, poolIds, {
excludedHosts, excludedHosts,
thresholds thresholds,
} = {}) { } = {}) {
this.xo = xo this.xo = xo
this._name = name this._name = name
@@ -99,11 +99,11 @@ export default class Plan {
this._excludedHosts = excludedHosts this._excludedHosts = excludedHosts
this._thresholds = { this._thresholds = {
cpu: { cpu: {
critical: numberOrDefault(thresholds && thresholds.cpu, DEFAULT_CRITICAL_THRESHOLD_CPU) critical: numberOrDefault(thresholds && thresholds.cpu, DEFAULT_CRITICAL_THRESHOLD_CPU),
}, },
memoryFree: { memoryFree: {
critical: numberOrDefault(thresholds && thresholds.memoryFree, DEFAULT_CRITICAL_THRESHOLD_MEMORY_FREE) * 1024 critical: numberOrDefault(thresholds && thresholds.memoryFree, DEFAULT_CRITICAL_THRESHOLD_MEMORY_FREE) * 1024,
} },
} }
for (const key in this._thresholds) { for (const key in this._thresholds) {
@@ -157,7 +157,7 @@ export default class Plan {
return { return {
toOptimize, toOptimize,
averages: avgWithRatio, averages: avgWithRatio,
hosts hosts,
} }
} }
@@ -213,7 +213,7 @@ export default class Plan {
hostsStats[host.id] = { hostsStats[host.id] = {
nPoints: hostStats.stats.cpus[0].length, nPoints: hostStats.stats.cpus[0].length,
stats: hostStats.stats, stats: hostStats.stats,
averages: {} averages: {},
} }
}) })
)) ))
@@ -229,7 +229,7 @@ export default class Plan {
vmsStats[vm.id] = { vmsStats[vm.id] = {
nPoints: vmStats.stats.cpus[0].length, nPoints: vmStats.stats.cpus[0].length,
stats: vmStats.stats, stats: vmStats.stats,
averages: {} averages: {},
} }
}) })
)) ))
+7 -7
View File
@@ -9,10 +9,10 @@ exports.configurationSchema = {
type: 'object', type: 'object',
properties: { properties: {
foo: { foo: {
type: 'string' type: 'string',
} },
}, },
required: ['foo'] required: ['foo'],
} }
// This (optional) schema is used to test the configuration // This (optional) schema is used to test the configuration
@@ -21,10 +21,10 @@ exports.testSchema = {
type: 'object', type: 'object',
properties: { properties: {
test: { test: {
type: 'string' type: 'string',
} },
}, },
required: ['test'] required: ['test'],
} }
// The default export is just a factory function which will create an // The default export is just a factory function which will create an
@@ -73,6 +73,6 @@ exports.default = function (opts) {
test: function (data) { test: function (data) {
console.log('the configuration is about to be tested') console.log('the configuration is about to be tested')
// TODO: test the configuration, i.e, use the main feature of the plugin and throws any errors. // TODO: test the configuration, i.e, use the main feature of the plugin and throws any errors.
} },
} }
} }
+23 -23
View File
@@ -33,16 +33,16 @@ export const configurationSchema = {
properties: { properties: {
name: { name: {
type: 'string', type: 'string',
description: 'human readable name of the sender' description: 'human readable name of the sender',
}, },
address: { address: {
type: 'string', type: 'string',
description: 'email address of the sender' description: 'email address of the sender',
} },
}, },
additionalProperties: false, additionalProperties: false,
required: ['address'] required: ['address'],
}, },
transport: { transport: {
@@ -51,11 +51,11 @@ export const configurationSchema = {
properties: { properties: {
host: { host: {
type: 'string', type: 'string',
description: 'hostname or IP address of the SMTP server' description: 'hostname or IP address of the SMTP server',
}, },
port: { port: {
type: 'integer', type: 'integer',
description: 'port of the SMTP server (defaults to 25 or 465 for TLS)' description: 'port of the SMTP server (defaults to 25 or 465 for TLS)',
}, },
secure: { secure: {
default: false, default: false,
@@ -64,24 +64,24 @@ export const configurationSchema = {
'auto (uses STARTTLS if available)', 'auto (uses STARTTLS if available)',
'force (requires STARTTLS or fail)', 'force (requires STARTTLS or fail)',
'disabled (never use STARTTLS)', 'disabled (never use STARTTLS)',
'TLS' 'TLS',
], ],
description: 'whether the connection should use TLS' description: 'whether the connection should use TLS',
}, },
ignoreUnauthorized: { ignoreUnauthorized: {
type: 'boolean', type: 'boolean',
description: 'ignore certificates error (e.g. self-signed certificate)' description: 'ignore certificates error (e.g. self-signed certificate)',
}, },
// FIXME: xo-web does not support edition of too nested // FIXME: xo-web does not support edition of too nested
user: { user: {
type: 'string', type: 'string',
description: 'name to use to authenticate' description: 'name to use to authenticate',
}, },
password: { password: {
type: 'string', type: 'string',
description: 'password to use to authenticate' description: 'password to use to authenticate',
} },
// properties. // properties.
// auth: { // auth: {
// type: 'object', // type: 'object',
@@ -103,12 +103,12 @@ export const configurationSchema = {
}, },
additionalProperties: false, additionalProperties: false,
required: ['host'] required: ['host'],
} },
}, },
additionalProperties: false, additionalProperties: false,
required: ['from', 'transport'] required: ['from', 'transport'],
} }
export const testSchema = { export const testSchema = {
@@ -117,12 +117,12 @@ export const testSchema = {
properties: { properties: {
to: { to: {
type: 'string', type: 'string',
description: 'recipient of the test mail' description: 'recipient of the test mail',
} },
}, },
additionalProperties: false, additionalProperties: false,
required: ['to'] required: ['to'],
} }
// =================================================================== // ===================================================================
@@ -144,7 +144,7 @@ class TransportEmailPlugin {
secure, secure,
user, user,
...transportConf ...transportConf
} },
}) { }) {
if (ignoreUnauthorized != null) { if (ignoreUnauthorized != null) {
( (
@@ -190,8 +190,8 @@ The transport-email plugin for Xen Orchestra server seems to be working fine, ni
`, `,
attachments: [ { attachments: [ {
filename: 'example.txt', filename: 'example.txt',
content: 'Attachments are working too, great!\n' content: 'Attachments are working too, great!\n',
} ] } ],
}) })
} }
@@ -200,7 +200,7 @@ The transport-email plugin for Xen Orchestra server seems to be working fine, ni
to, cc, bcc, to, cc, bcc,
subject, subject,
markdown, markdown,
attachments attachments,
}) { }) {
return this._send(removeUndefined({ return this._send(removeUndefined({
from, from,
@@ -209,7 +209,7 @@ The transport-email plugin for Xen Orchestra server seems to be working fine, ni
bcc, bcc,
subject, subject,
markdown, markdown,
attachments attachments,
})).catch(logAndRethrow) })).catch(logAndRethrow)
} }
} }
@@ -10,27 +10,27 @@ export const configurationSchema = {
properties: { properties: {
server: { server: {
type: 'string', type: 'string',
description: 'The nagios server adress' description: 'The nagios server adress',
}, },
port: { port: {
type: 'integer', type: 'integer',
description: 'The NSCA port' description: 'The NSCA port',
}, },
key: { key: {
type: 'string', type: 'string',
description: 'The encryption key' description: 'The encryption key',
}, },
host: { host: {
type: 'string', type: 'string',
description: 'The host name in Nagios' description: 'The host name in Nagios',
}, },
service: { service: {
type: 'string', type: 'string',
description: 'The service description in Nagios' description: 'The service description in Nagios',
} },
}, },
additionalProperties: false, additionalProperties: false,
required: ['server', 'port', 'key', 'host', 'service'] required: ['server', 'port', 'key', 'host', 'service'],
} }
// =================================================================== // ===================================================================
@@ -45,7 +45,7 @@ function nscaPacketBuilder ({
message, message,
service, service,
status, status,
timestamp timestamp,
}) { }) {
// Building NSCA packet // Building NSCA packet
const SIZE = 720 const SIZE = 720
@@ -92,7 +92,7 @@ class XoServerNagios {
this._set = bind(xo.defineProperty, xo) this._set = bind(xo.defineProperty, xo)
this._unset = null this._unset = null
// Defined in configure(). // Defined in configure().
this._conf = null this._conf = null
this._key = null this._key = null
} }
@@ -113,13 +113,13 @@ class XoServerNagios {
test () { test () {
return this._sendPassiveCheck({ return this._sendPassiveCheck({
message: 'The server-nagios plugin for Xen Orchestra server seems to be working fine, nicely done :)', message: 'The server-nagios plugin for Xen Orchestra server seems to be working fine, nicely done :)',
status: OK status: OK,
}) })
} }
_sendPassiveCheck ({ _sendPassiveCheck ({
message, message,
status status,
}) { }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (/\r|\n/.test(message)) { if (/\r|\n/.test(message)) {
@@ -140,7 +140,7 @@ class XoServerNagios {
iv, iv,
message, message,
status, status,
timestamp timestamp,
}) })
// 1) Using xor between the NSCA packet and the initialization vector // 1) Using xor between the NSCA packet and the initialization vector
@@ -16,23 +16,23 @@ export const configurationSchema = {
properties: { properties: {
webhookUri: { webhookUri: {
type: 'string', type: 'string',
description: 'The Mattermost or Slack webhook URL.' description: 'The Mattermost or Slack webhook URL.',
}, },
channel: { channel: {
type: 'string', type: 'string',
description: 'Channel, private group, or IM channel to send message to.' description: 'Channel, private group, or IM channel to send message to.',
}, },
username: { username: {
type: 'string', type: 'string',
description: 'Bot username.' description: 'Bot username.',
}, },
icon_emoji: { icon_emoji: {
type: 'string', type: 'string',
description: 'The bot icon. It can be a slack emoji or a URL image.' description: 'The bot icon. It can be a slack emoji or a URL image.',
} },
}, },
additionalProperties: false, additionalProperties: false,
required: ['webhookUri', 'channel'] required: ['webhookUri', 'channel'],
} }
// =================================================================== // ===================================================================
@@ -43,7 +43,7 @@ class XoServerTransportSlack {
this._set = ::xo.defineProperty this._set = ::xo.defineProperty
this._unset = null this._unset = null
// Defined in configure(). // Defined in configure().
this._conf = null this._conf = null
this._send = null this._send = null
} }
@@ -70,12 +70,12 @@ class XoServerTransportSlack {
return this._sendSlack({ return this._sendSlack({
message: `Hi there, message: `Hi there,
The transport-slack plugin for Xen Orchestra server seems to be working fine, nicely done :)` The transport-slack plugin for Xen Orchestra server seems to be working fine, nicely done :)`,
}) })
} }
_sendSlack ({ _sendSlack ({
message message,
}) { }) {
// TODO: handle errors // TODO: handle errors
return this._send({ ...this._conf, text: message }).catch(logAndRethrow) return this._send({ ...this._conf, text: message }).catch(logAndRethrow)
@@ -9,26 +9,26 @@ export const configurationSchema = {
properties: { properties: {
host: { host: {
type: 'string', type: 'string',
description: 'host where the XMPP server is located' description: 'host where the XMPP server is located',
}, },
port: { port: {
type: 'integer', type: 'integer',
description: 'port of the XMPP server (default to 5222)', description: 'port of the XMPP server (default to 5222)',
default: 5222 default: 5222,
}, },
jid: { jid: {
type: 'string', type: 'string',
title: 'user', title: 'user',
description: 'Xmpp address to use to authenticate' description: 'Xmpp address to use to authenticate',
}, },
password: { password: {
type: 'string', type: 'string',
description: 'password to use to authenticate' description: 'password to use to authenticate',
} },
}, },
additionalProperties: false, additionalProperties: false,
required: ['jid', 'password'] required: ['jid', 'password'],
} }
// =================================================================== // ===================================================================
@@ -73,7 +73,7 @@ class TransportXmppPlugin {
this._client.send( this._client.send(
new XmppClient.Stanza('message', { new XmppClient.Stanza('message', {
to: receiver, to: receiver,
type: 'chat' type: 'chat',
}).c('body').t(message) }).c('body').t(message)
) )
} }
+49 -49
View File
@@ -12,14 +12,14 @@ import {
orderBy, orderBy,
round, round,
values, values,
zipObject zipObject,
} from 'lodash' } from 'lodash'
import { import {
promisify promisify,
} from 'promise-toolbox' } from 'promise-toolbox'
import { import {
readFile, readFile,
writeFile writeFile,
} from 'fs' } from 'fs'
// =================================================================== // ===================================================================
@@ -30,10 +30,10 @@ const pWriteFile = promisify(writeFile)
const currDate = new Date().toISOString().slice(0, 10) const currDate = new Date().toISOString().slice(0, 10)
const compareOperators = { const compareOperators = {
'>': (l, r) => l > r '>': (l, r) => l > r,
} }
const mathOperators = { const mathOperators = {
'+': (l, r) => l + r '+': (l, r) => l + r,
} }
const gibPower = Math.pow(2, 30) const gibPower = Math.pow(2, 30)
@@ -50,7 +50,7 @@ pReadFile(`${__dirname}/../report.html.tpl`, 'utf8')
removeAttributeQuotes: true, removeAttributeQuotes: true,
removeComments: true, removeComments: true,
removeOptionalTags: true, removeOptionalTags: true,
removeRedundantAttributes: true removeRedundantAttributes: true,
})) }))
}) })
@@ -69,18 +69,18 @@ export const configurationSchema = {
emails: { emails: {
type: 'array', type: 'array',
items: { items: {
type: 'string' type: 'string',
} },
}, },
periodicity: { periodicity: {
type: 'string', type: 'string',
enum: ['monthly', 'weekly'], enum: ['monthly', 'weekly'],
description: 'If you choose weekly you will receive the report every sunday and if you choose monthly you will receive it every first day of the month.' description: 'If you choose weekly you will receive the report every sunday and if you choose monthly you will receive it every first day of the month.',
} },
}, },
additionalProperties: false, additionalProperties: false,
required: [ 'emails', 'periodicity' ] required: [ 'emails', 'periodicity' ],
} }
// =================================================================== // ===================================================================
@@ -137,7 +137,7 @@ function computeMeans (objects, options) {
options, options,
map( map(
options, options,
opt => round(computeMean(map(objects, opt)), 2) opt => round(computeMean(map(objects, opt)), 2)
) )
) )
} }
@@ -156,7 +156,7 @@ function getTop (objects, options) {
obj => ({ obj => ({
uuid: obj.uuid, uuid: obj.uuid,
name: obj.name, name: obj.name,
value: round(obj[opt], 2) value: round(obj[opt], 2),
}) })
) )
) )
@@ -176,7 +176,7 @@ function conputePercentage (curr, prev, options) {
function getDiff (oldElements, newElements) { function getDiff (oldElements, newElements) {
return { return {
added: differenceBy(oldElements, newElements, 'uuid'), added: differenceBy(oldElements, newElements, 'uuid'),
removed: differenceBy(newElements, oldElements, 'uuid') removed: differenceBy(newElements, oldElements, 'uuid'),
} }
} }
@@ -184,7 +184,7 @@ function getDiff (oldElements, newElements) {
function getVmsStats ({ function getVmsStats ({
runningVms, runningVms,
xo xo,
}) { }) {
return Promise.all(map(runningVms, async vm => { return Promise.all(map(runningVms, async vm => {
const vmStats = await xo.getXapiVmStats(vm, 'days') const vmStats = await xo.getXapiVmStats(vm, 'days')
@@ -196,14 +196,14 @@ function getVmsStats ({
diskRead: computeDoubleMean(values(vmStats.stats.xvds.r)) / mibPower, diskRead: computeDoubleMean(values(vmStats.stats.xvds.r)) / mibPower,
diskWrite: computeDoubleMean(values(vmStats.stats.xvds.w)) / mibPower, diskWrite: computeDoubleMean(values(vmStats.stats.xvds.w)) / mibPower,
netReception: computeDoubleMean(vmStats.stats.vifs.rx) / kibPower, netReception: computeDoubleMean(vmStats.stats.vifs.rx) / kibPower,
netTransmission: computeDoubleMean(vmStats.stats.vifs.tx) / kibPower netTransmission: computeDoubleMean(vmStats.stats.vifs.tx) / kibPower,
} }
})) }))
} }
function getHostsStats ({ function getHostsStats ({
runningHosts, runningHosts,
xo xo,
}) { }) {
return Promise.all(map(runningHosts, async host => { return Promise.all(map(runningHosts, async host => {
const hostStats = await xo.getXapiHostStats(host, 'days') const hostStats = await xo.getXapiHostStats(host, 'days')
@@ -214,7 +214,7 @@ function getHostsStats ({
ram: computeMean(hostStats.stats.memoryUsed) / gibPower, ram: computeMean(hostStats.stats.memoryUsed) / gibPower,
load: computeMean(hostStats.stats.load), load: computeMean(hostStats.stats.load),
netReception: computeDoubleMean(hostStats.stats.pifs.rx) / kibPower, netReception: computeDoubleMean(hostStats.stats.pifs.rx) / kibPower,
netTransmission: computeDoubleMean(hostStats.stats.pifs.tx) / kibPower netTransmission: computeDoubleMean(hostStats.stats.pifs.tx) / kibPower,
} }
})) }))
} }
@@ -222,76 +222,76 @@ function getHostsStats ({
function computeGlobalVmsStats ({ function computeGlobalVmsStats ({
haltedVms, haltedVms,
vmsStats, vmsStats,
xo xo,
}) { }) {
const allVms = concat( const allVms = concat(
map(vmsStats, vm => ({ map(vmsStats, vm => ({
uuid: vm.uuid, uuid: vm.uuid,
name: vm.name name: vm.name,
})), })),
map(haltedVms, vm => ({ map(haltedVms, vm => ({
uuid: vm.uuid, uuid: vm.uuid,
name: vm.name_label name: vm.name_label,
})) }))
) )
return assign(computeMeans(vmsStats, ['cpu', 'ram', 'diskRead', 'diskWrite', 'netReception', 'netTransmission']), { return assign(computeMeans(vmsStats, ['cpu', 'ram', 'diskRead', 'diskWrite', 'netReception', 'netTransmission']), {
number: allVms.length, number: allVms.length,
allVms allVms,
}) })
} }
function computeGlobalHostsStats ({ function computeGlobalHostsStats ({
haltedHosts, haltedHosts,
hostsStats, hostsStats,
xo xo,
}) { }) {
const allHosts = concat( const allHosts = concat(
map(hostsStats, host => ({ map(hostsStats, host => ({
uuid: host.uuid, uuid: host.uuid,
name: host.name name: host.name,
})), })),
map(haltedHosts, host => ({ map(haltedHosts, host => ({
uuid: host.uuid, uuid: host.uuid,
name: host.name_label name: host.name_label,
})) }))
) )
return assign(computeMeans(hostsStats, ['cpu', 'ram', 'load', 'netReception', 'netTransmission']), { return assign(computeMeans(hostsStats, ['cpu', 'ram', 'load', 'netReception', 'netTransmission']), {
number: allHosts.length, number: allHosts.length,
allHosts allHosts,
}) })
} }
function getTopVms ({ function getTopVms ({
vmsStats, vmsStats,
xo xo,
}) { }) {
return getTop(vmsStats, ['cpu', 'ram', 'diskRead', 'diskWrite', 'netReception', 'netTransmission']) return getTop(vmsStats, ['cpu', 'ram', 'diskRead', 'diskWrite', 'netReception', 'netTransmission'])
} }
function getTopHosts ({ function getTopHosts ({
hostsStats, hostsStats,
xo xo,
}) { }) {
return getTop(hostsStats, ['cpu', 'ram', 'load', 'netReception', 'netTransmission']) return getTop(hostsStats, ['cpu', 'ram', 'load', 'netReception', 'netTransmission'])
} }
function getMostAllocatedSpaces ({ function getMostAllocatedSpaces ({
disks, disks,
xo xo,
}) { }) {
return map( return map(
orderBy(disks, ['size'], ['desc']).slice(0, 3), disk => ({ orderBy(disks, ['size'], ['desc']).slice(0, 3), disk => ({
uuid: disk.uuid, uuid: disk.uuid,
name: disk.name_label, name: disk.name_label,
size: round(disk.size / gibPower, 2) size: round(disk.size / gibPower, 2),
})) }))
} }
async function getHostsMissingPatches ({ async function getHostsMissingPatches ({
runningHosts, runningHosts,
xo xo,
}) { }) {
const hostsMissingPatches = await Promise.all(map(runningHosts, async host => { const hostsMissingPatches = await Promise.all(map(runningHosts, async host => {
const hostsPatches = await xo.getXapi(host).listMissingPoolPatchesOnHost(host._xapiId) const hostsPatches = await xo.getXapi(host).listMissingPoolPatchesOnHost(host._xapiId)
@@ -299,7 +299,7 @@ async function getHostsMissingPatches ({
return { return {
uuid: host.uuid, uuid: host.uuid,
name: host.name_label, name: host.name_label,
patches: map(hostsPatches, 'name') patches: map(hostsPatches, 'name'),
} }
} }
})) }))
@@ -312,7 +312,7 @@ function getAllUsersEmail (users) {
async function storeStats ({ async function storeStats ({
data, data,
storedStatsPath storedStatsPath,
}) { }) {
await pWriteFile(storedStatsPath, JSON.stringify(data)) await pWriteFile(storedStatsPath, JSON.stringify(data))
} }
@@ -332,12 +332,12 @@ async function computeEvolution ({
const vmsEvolution = { const vmsEvolution = {
number: newStatsVms.number - oldStatsVms.number, number: newStatsVms.number - oldStatsVms.number,
...conputePercentage(newStatsVms, oldStatsVms, ['cpu', 'ram', 'diskRead', 'diskWrite', 'netReception', 'netTransmission']) ...conputePercentage(newStatsVms, oldStatsVms, ['cpu', 'ram', 'diskRead', 'diskWrite', 'netReception', 'netTransmission']),
} }
const hostsEvolution = { const hostsEvolution = {
number: newStatsHosts.number - oldStatsHosts.number, number: newStatsHosts.number - oldStatsHosts.number,
...conputePercentage(newStatsHosts, oldStatsHosts, ['cpu', 'ram', 'load', 'netReception', 'netTransmission']) ...conputePercentage(newStatsHosts, oldStatsHosts, ['cpu', 'ram', 'load', 'netReception', 'netTransmission']),
} }
const vmsRessourcesEvolution = getDiff(oldStatsVms.allVms, newStatsVms.allVms) const vmsRessourcesEvolution = getDiff(oldStatsVms.allVms, newStatsVms.allVms)
@@ -351,7 +351,7 @@ async function computeEvolution ({
prevDate, prevDate,
vmsRessourcesEvolution, vmsRessourcesEvolution,
hostsRessourcesEvolution, hostsRessourcesEvolution,
usersEvolution usersEvolution,
} }
} catch (err) { } catch (err) {
if (err.code !== 'ENOENT') throw err if (err.code !== 'ENOENT') throw err
@@ -360,7 +360,7 @@ async function computeEvolution ({
async function dataBuilder ({ async function dataBuilder ({
xo, xo,
storedStatsPath storedStatsPath,
}) { }) {
const xoObjects = values(xo.getObjects()) const xoObjects = values(xo.getObjects())
const runningVms = filter(xoObjects, {type: 'VM', power_state: 'Running'}) const runningVms = filter(xoObjects, {type: 'VM', power_state: 'Running'})
@@ -373,7 +373,7 @@ async function dataBuilder ({
getVmsStats({xo, runningVms}), getVmsStats({xo, runningVms}),
getHostsStats({xo, runningHosts}), getHostsStats({xo, runningHosts}),
getMostAllocatedSpaces({xo, disks}), getMostAllocatedSpaces({xo, disks}),
getHostsMissingPatches({xo, runningHosts}) getHostsMissingPatches({xo, runningHosts}),
]) ])
const [globalVmsStats, globalHostsStats, topVms, topHosts, usersEmail] = await Promise.all([ const [globalVmsStats, globalHostsStats, topVms, topHosts, usersEmail] = await Promise.all([
@@ -381,13 +381,13 @@ async function dataBuilder ({
computeGlobalHostsStats({xo, hostsStats, haltedHosts}), computeGlobalHostsStats({xo, hostsStats, haltedHosts}),
getTopVms({xo, vmsStats}), getTopVms({xo, vmsStats}),
getTopHosts({xo, hostsStats}), getTopHosts({xo, hostsStats}),
getAllUsersEmail(users) getAllUsersEmail(users),
]) ])
const evolution = await computeEvolution({ const evolution = await computeEvolution({
storedStatsPath, storedStatsPath,
hosts: globalHostsStats, hosts: globalHostsStats,
usersEmail, usersEmail,
vms: globalVmsStats vms: globalVmsStats,
}) })
const data = { const data = {
@@ -395,7 +395,7 @@ async function dataBuilder ({
vms: globalVmsStats, vms: globalVmsStats,
hosts: globalHostsStats, hosts: globalHostsStats,
vmsEvolution: evolution && evolution.vmsEvolution, vmsEvolution: evolution && evolution.vmsEvolution,
hostsEvolution: evolution && evolution.hostsEvolution hostsEvolution: evolution && evolution.hostsEvolution,
}, },
topVms, topVms,
topHosts, topHosts,
@@ -409,8 +409,8 @@ async function dataBuilder ({
imgXo, imgXo,
currDate, currDate,
prevDate: evolution && evolution.prevDate, prevDate: evolution && evolution.prevDate,
page: '{{page}}' page: '{{page}}',
} },
} }
return data return data
@@ -432,7 +432,7 @@ class UsageReportPlugin {
this._job = new CronJob({ this._job = new CronJob({
cronTime: configuration.periodicity === 'monthly' ? '00 06 1 * *' : '00 06 * * 0', cronTime: configuration.periodicity === 'monthly' ? '00 06 1 * *' : '00 06 * * 0',
onTick: () => this._sendReport(), onTick: () => this._sendReport(),
start: false start: false,
}) })
} }
@@ -454,7 +454,7 @@ class UsageReportPlugin {
async _sendReport () { async _sendReport () {
const data = await dataBuilder({ const data = await dataBuilder({
xo: this._xo, xo: this._xo,
storedStatsPath: this._storedStatsPath storedStatsPath: this._storedStatsPath,
}) })
await Promise.all([ await Promise.all([
@@ -469,13 +469,13 @@ class UsageReportPlugin {
best regards.`, best regards.`,
attachments: [{ attachments: [{
filename: `xoReport_${currDate}.html`, filename: `xoReport_${currDate}.html`,
content: template(data) content: template(data),
}] }],
}), }),
storeStats({ storeStats({
data, data,
storedStatsPath: this._storedStatsPath storedStatsPath: this._storedStatsPath,
}) }),
]) ])
} }
} }
+8 -8
View File
@@ -124,7 +124,7 @@ export class VHDFile {
} }
export function computeGeometryForSize (size) { export function computeGeometryForSize (size) {
let totalSectors = Math.ceil(size / 512) const totalSectors = Math.ceil(size / 512)
let sectorsPerTrack let sectorsPerTrack
let heads let heads
let cylinderTimesHeads let cylinderTimesHeads
@@ -154,13 +154,13 @@ export function computeGeometryForSize (size) {
cylinderTimesHeads = totalSectors / sectorsPerTrack cylinderTimesHeads = totalSectors / sectorsPerTrack
} }
} }
let cylinders = Math.floor(cylinderTimesHeads / heads) const cylinders = Math.floor(cylinderTimesHeads / heads)
let actualSize = cylinders * heads * sectorsPerTrack * sectorSize const actualSize = cylinders * heads * sectorsPerTrack * sectorSize
return {cylinders, heads, sectorsPerTrack, actualSize} return {cylinders, heads, sectorsPerTrack, actualSize}
} }
export function createFooter (size, timestamp, geometry, diskType, dataOffsetLow = 0xFFFFFFFF, dataOffsetHigh = 0xFFFFFFFF) { export function createFooter (size, timestamp, geometry, diskType, dataOffsetLow = 0xFFFFFFFF, dataOffsetHigh = 0xFFFFFFFF) {
let footer = Buffer.alloc(512) const footer = Buffer.alloc(512)
Buffer.from(footerCookie, 'ascii').copy(footer) Buffer.from(footerCookie, 'ascii').copy(footer)
footer.writeUInt32BE(2, 8) footer.writeUInt32BE(2, 8)
footer.writeUInt32BE(0x00010000, 12) footer.writeUInt32BE(0x00010000, 12)
@@ -180,13 +180,13 @@ export function createFooter (size, timestamp, geometry, diskType, dataOffsetLow
footer.writeUInt8(geometry['heads'], 58) footer.writeUInt8(geometry['heads'], 58)
footer.writeUInt8(geometry['sectorsPerTrack'], 59) footer.writeUInt8(geometry['sectorsPerTrack'], 59)
footer.writeUInt32BE(diskType, 60) footer.writeUInt32BE(diskType, 60)
let checksum = computeChecksum(footer) const checksum = computeChecksum(footer)
footer.writeUInt32BE(checksum, 64) footer.writeUInt32BE(checksum, 64)
return footer return footer
} }
export function createDynamicDiskHeader (tableEntries, blockSize) { export function createDynamicDiskHeader (tableEntries, blockSize) {
let header = Buffer.alloc(1024) const header = Buffer.alloc(1024)
Buffer.from(headerCookie, 'ascii').copy(header) Buffer.from(headerCookie, 'ascii').copy(header)
// hard code no next data // hard code no next data
header.writeUInt32BE(0xFFFFFFFF, 8) header.writeUInt32BE(0xFFFFFFFF, 8)
@@ -197,7 +197,7 @@ export function createDynamicDiskHeader (tableEntries, blockSize) {
header.writeUInt32BE(0x00010000, 24) header.writeUInt32BE(0x00010000, 24)
header.writeUInt32BE(tableEntries, 28) header.writeUInt32BE(tableEntries, 28)
header.writeUInt32BE(blockSize, 32) header.writeUInt32BE(blockSize, 32)
let checksum = computeChecksum(header) const checksum = computeChecksum(header)
header.writeUInt32BE(checksum, 36) header.writeUInt32BE(checksum, 36)
return header return header
} }
@@ -213,7 +213,7 @@ export class ReadableRawVHDStream extends stream.Readable {
constructor (size, vmdkParser) { constructor (size, vmdkParser) {
super() super()
this.size = size this.size = size
var geometry = computeGeometryForSize(size) const geometry = computeGeometryForSize(size)
this.footer = createFooter(size, Math.floor(Date.now() / 1000), geometry, fixedHardDiskType) this.footer = createFooter(size, Math.floor(Date.now() / 1000), geometry, fixedHardDiskType)
this.position = 0 this.position = 0
this.vmdkParser = vmdkParser this.vmdkParser = vmdkParser
@@ -12,7 +12,7 @@ import {
createDynamicDiskHeader, createDynamicDiskHeader,
createFooter, createFooter,
ReadableRawVHDStream, ReadableRawVHDStream,
VHDFile VHDFile,
} from './vhd-write' } from './vhd-write'
describe('VHD writing', () => { describe('VHD writing', () => {
@@ -37,10 +37,10 @@ describe('VHD writing', () => {
it('ReadableRawVHDStream does not crash', () => { it('ReadableRawVHDStream does not crash', () => {
const data = [{ const data = [{
lbaBytes: 100, lbaBytes: 100,
grain: Buffer.from('azerzaerazeraze', 'ascii') grain: Buffer.from('azerzaerazeraze', 'ascii'),
}, { }, {
lbaBytes: 700, lbaBytes: 700,
grain: Buffer.from('gdfslkdfguer', 'ascii') grain: Buffer.from('gdfslkdfguer', 'ascii'),
}] }]
let index = 0 let index = 0
const mockParser = { const mockParser = {
@@ -52,7 +52,7 @@ describe('VHD writing', () => {
} else { } else {
return null return null
} }
} },
} }
const stream = new ReadableRawVHDStream(100000, mockParser) const stream = new ReadableRawVHDStream(100000, mockParser)
const pipe = stream.pipe(createWriteStream('outputStream')) const pipe = stream.pipe(createWriteStream('outputStream'))
@@ -65,10 +65,10 @@ describe('VHD writing', () => {
it('ReadableRawVHDStream detects when blocks are out of order', () => { it('ReadableRawVHDStream detects when blocks are out of order', () => {
const data = [{ const data = [{
lbaBytes: 700, lbaBytes: 700,
grain: Buffer.from('azerzaerazeraze', 'ascii') grain: Buffer.from('azerzaerazeraze', 'ascii'),
}, { }, {
lbaBytes: 100, lbaBytes: 100,
grain: Buffer.from('gdfslkdfguer', 'ascii') grain: Buffer.from('gdfslkdfguer', 'ascii'),
}] }]
let index = 0 let index = 0
const mockParser = { const mockParser = {
@@ -80,7 +80,7 @@ describe('VHD writing', () => {
} else { } else {
return null return null
} }
} },
} }
return expect(new Promise((resolve, reject) => { return expect(new Promise((resolve, reject) => {
const stream = new ReadableRawVHDStream(100000, mockParser) const stream = new ReadableRawVHDStream(100000, mockParser)
@@ -7,7 +7,7 @@ import {VirtualBuffer} from './virtual-buffer'
describe('Virtual Buffer', function () { describe('Virtual Buffer', function () {
it('can read a file correctly', async () => { it('can read a file correctly', async () => {
let rawFileName = 'random-data' const rawFileName = 'random-data'
await exec('base64 /dev/urandom | head -c 104448 > ' + rawFileName) await exec('base64 /dev/urandom | head -c 104448 > ' + rawFileName)
const buffer = new VirtualBuffer(createReadStream(rawFileName)) const buffer = new VirtualBuffer(createReadStream(rawFileName))
const part1 = await buffer.readChunk(10) const part1 = await buffer.readChunk(10)
+6 -6
View File
@@ -37,8 +37,8 @@ function parseDescriptor (descriptorSlice) {
const lines = descriptorText.split(/\r?\n/).filter((line) => { const lines = descriptorText.split(/\r?\n/).filter((line) => {
return line.trim().length > 0 && line[0] !== '#' return line.trim().length > 0 && line[0] !== '#'
}) })
for (let line of lines) { for (const line of lines) {
let defLine = line.split('=') const defLine = line.split('=')
// the wonky quote test is to avoid having an equal sign in the name of an extent // the wonky quote test is to avoid having an equal sign in the name of an extent
if (defLine.length === 2 && defLine[0].indexOf('"') === -1) { if (defLine.length === 2 && defLine[0].indexOf('"') === -1) {
descriptorDict[defLine[0]] = defLine[1].replace(/['"]+/g, '') descriptorDict[defLine[0]] = defLine[1].replace(/['"]+/g, '')
@@ -49,7 +49,7 @@ function parseDescriptor (descriptorSlice) {
sizeSectors: items[1], sizeSectors: items[1],
type: items[2], type: items[2],
name: items[3], name: items[3],
offset: items.length > 4 ? items[4] : 0 offset: items.length > 4 ? items[4] : 0,
}) })
} }
} }
@@ -63,7 +63,7 @@ function parseFlags (flagBuffer) {
useSecondaryGrain: !!(number & (1 << 1)), useSecondaryGrain: !!(number & (1 << 1)),
useZeroedGrainTable: !!(number & (1 << 2)), useZeroedGrainTable: !!(number & (1 << 2)),
compressedGrains: !!(number & (1 << 16)), compressedGrains: !!(number & (1 << 16)),
hasMarkers: !!(number & (1 << 17)) hasMarkers: !!(number & (1 << 17)),
} }
} }
@@ -98,7 +98,7 @@ function parseHeader (buffer) {
grainDirectoryOffsetSectors, grainDirectoryOffsetSectors,
rGrainDirectoryOffsetSectors, rGrainDirectoryOffsetSectors,
l1EntrySectors, l1EntrySectors,
numGTEsPerGT numGTEsPerGT,
} }
} }
async function readGrain (offsetSectors, buffer, compressed) { async function readGrain (offsetSectors, buffer, compressed) {
@@ -115,7 +115,7 @@ async function readGrain (offsetSectors, buffer, compressed) {
size, size,
buffer: grainBuffer, buffer: grainBuffer,
grain: grainContent, grain: grainContent,
grainSize: grainContent.byteLength grainSize: grainContent.byteLength,
} }
} }
@@ -7,8 +7,8 @@ import {VMDKDirectParser} from './vmdk-read'
describe('VMDK reading', () => { describe('VMDK reading', () => {
it('VMDKDirectParser reads OK', async () => { it('VMDKDirectParser reads OK', async () => {
let rawFileName = 'random-data' const rawFileName = 'random-data'
let fileName = 'random-data.vmdk' const fileName = 'random-data.vmdk'
await exec('base64 /dev/urandom | head -c 104448 > ' + rawFileName) await exec('base64 /dev/urandom | head -c 104448 > ' + rawFileName)
await exec('rm -f ' + fileName + '&& VBoxManage convertfromraw --format VMDK --variant Stream ' + rawFileName + ' ' + fileName) await exec('rm -f ' + fileName + '&& VBoxManage convertfromraw --format VMDK --variant Stream ' + rawFileName + ' ' + fileName)
const parser = new VMDKDirectParser(createReadStream(fileName)) const parser = new VMDKDirectParser(createReadStream(fileName))
+11 -11
View File
@@ -9,11 +9,11 @@ import {VHDFile, convertFromVMDK, computeGeometryForSize} from './vhd-write'
describe('VMDK to VHD conversion', () => { describe('VMDK to VHD conversion', () => {
it('can convert a random data file with readRawContent()', async () => { it('can convert a random data file with readRawContent()', async () => {
let inputRawFileName = 'random-data.raw' const inputRawFileName = 'random-data.raw'
let vmdkFileName = 'random-data.vmdk' const vmdkFileName = 'random-data.vmdk'
let vhdFileName = 'from-vmdk-readRawContent.vhd' const vhdFileName = 'from-vmdk-readRawContent.vhd'
let reconvertedRawFilemane = 'from-vhd.raw' const reconvertedRawFilemane = 'from-vhd.raw'
let dataSize = 5222400 const dataSize = 5222400
await exec('rm -f ' + [inputRawFileName, vmdkFileName, vhdFileName, reconvertedRawFilemane].join(' ')) await exec('rm -f ' + [inputRawFileName, vmdkFileName, vhdFileName, reconvertedRawFilemane].join(' '))
await exec('base64 /dev/urandom | head -c ' + dataSize + ' > ' + inputRawFileName) await exec('base64 /dev/urandom | head -c ' + dataSize + ' > ' + inputRawFileName)
await exec('VBoxManage convertfromraw --format VMDK --variant Stream ' + inputRawFileName + ' ' + vmdkFileName) await exec('VBoxManage convertfromraw --format VMDK --variant Stream ' + inputRawFileName + ' ' + vmdkFileName)
@@ -33,12 +33,12 @@ describe('VMDK to VHD conversion', () => {
}) })
it('can convert a random data file with VMDKDirectParser', async () => { it('can convert a random data file with VMDKDirectParser', async () => {
let inputRawFileName = 'random-data.raw' const inputRawFileName = 'random-data.raw'
let vmdkFileName = 'random-data.vmdk' const vmdkFileName = 'random-data.vmdk'
let vhdFileName = 'from-vmdk-VMDKDirectParser.vhd' const vhdFileName = 'from-vmdk-VMDKDirectParser.vhd'
let reconvertedRawFilemane = 'from-vhd.raw' const reconvertedRawFilemane = 'from-vhd.raw'
let reconvertedByVBoxRawFilemane = 'from-vhd-by-vbox.raw' const reconvertedByVBoxRawFilemane = 'from-vhd-by-vbox.raw'
let dataSize = computeGeometryForSize(8 * 1024 * 1024).actualSize const dataSize = computeGeometryForSize(8 * 1024 * 1024).actualSize
await exec('rm -f ' + [inputRawFileName, vmdkFileName, vhdFileName, reconvertedRawFilemane, reconvertedByVBoxRawFilemane].join(' ')) await exec('rm -f ' + [inputRawFileName, vmdkFileName, vhdFileName, reconvertedRawFilemane, reconvertedByVBoxRawFilemane].join(' '))
await exec('base64 /dev/urandom | head -c ' + dataSize + ' > ' + inputRawFileName) await exec('base64 /dev/urandom | head -c ' + dataSize + ' > ' + inputRawFileName)
await exec('VBoxManage convertfromraw --format VMDK --variant Stream ' + inputRawFileName + ' ' + vmdkFileName) await exec('VBoxManage convertfromraw --format VMDK --variant Stream ' + inputRawFileName + ' ' + vmdkFileName)
+1 -1
View File
@@ -9,7 +9,7 @@ exports.getPackages = (readPackageJson = false) => {
).then(names => { ).then(names => {
const pkgs = names.map(name => ({ const pkgs = names.map(name => ({
dir: `${PKGS_DIR}/${name}`, dir: `${PKGS_DIR}/${name}`,
name name,
})) }))
return readPackageJson return readPackageJson
? Promise.all(pkgs.map(pkg => ? Promise.all(pkgs.map(pkg =>
+114 -417
View File
@@ -140,18 +140,18 @@ acorn@^5.2.1:
version "5.2.1" version "5.2.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7"
ajv-keywords@^1.0.0: ajv-keywords@^2.1.0:
version "1.5.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
ajv@^4.7.0, ajv@^4.9.1: ajv@^4.9.1:
version "4.11.8" version "4.11.8"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
dependencies: dependencies:
co "^4.6.0" co "^4.6.0"
json-stable-stringify "^1.0.1" json-stable-stringify "^1.0.1"
ajv@^5.1.0: ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
version "5.3.0" version "5.3.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda"
dependencies: dependencies:
@@ -172,7 +172,7 @@ amdefine@>=0.0.4:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: ansi-escapes@^1.0.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
@@ -280,13 +280,6 @@ array-unique@^0.3.2:
version "0.3.2" version "0.3.2"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
array.prototype.find@^2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90"
dependencies:
define-properties "^1.1.2"
es-abstract "^1.7.0"
arrify@^1.0.0, arrify@^1.0.1: arrify@^1.0.0, arrify@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
@@ -398,7 +391,7 @@ babel-code-frame@7.0.0-beta.3:
esutils "^2.0.2" esutils "^2.0.2"
js-tokens "^3.0.0" js-tokens "^3.0.0"
babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
version "6.26.0" version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
dependencies: dependencies:
@@ -1887,7 +1880,7 @@ clean-css@4.1.x:
dependencies: dependencies:
source-map "0.5.x" source-map "0.5.x"
cli-cursor@^1.0.1, cli-cursor@^1.0.2: cli-cursor@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
dependencies: dependencies:
@@ -1973,7 +1966,7 @@ concat-map@0.0.1:
version "0.0.1" version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
concat-stream@^1.5.2: concat-stream@^1.6.0:
version "1.6.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
dependencies: dependencies:
@@ -2083,12 +2076,6 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
dependencies: dependencies:
cssom "0.3.x" cssom "0.3.x"
d@1:
version "1.0.0"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
dependencies:
es5-ext "^0.10.9"
dashdash@^1.12.0, dashdash@^1.14.0: dashdash@^1.12.0, dashdash@^1.14.0:
version "1.14.1" version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -2099,17 +2086,13 @@ date-fns@^1.27.2:
version "1.29.0" version "1.29.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
debug-log@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
debug@3.1.0, debug@^3.0.1, debug@^3.1.0: debug@3.1.0, debug@^3.0.1, debug@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies: dependencies:
ms "2.0.0" ms "2.0.0"
debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies: dependencies:
@@ -2151,13 +2134,6 @@ default-require-extensions@^1.0.0:
dependencies: dependencies:
strip-bom "^2.0.0" strip-bom "^2.0.0"
define-properties@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
dependencies:
foreach "^2.0.5"
object-keys "^1.0.8"
define-property@^0.2.5: define-property@^0.2.5:
version "0.2.5" version "0.2.5"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
@@ -2178,17 +2154,6 @@ deflate-js@^0.2.3:
version "0.2.3" version "0.2.3"
resolved "https://registry.yarnpkg.com/deflate-js/-/deflate-js-0.2.3.tgz#f85abb58ebc5151a306147473d57c3e4f7e4426b" resolved "https://registry.yarnpkg.com/deflate-js/-/deflate-js-0.2.3.tgz#f85abb58ebc5151a306147473d57c3e4f7e4426b"
deglob@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a"
dependencies:
find-root "^1.0.0"
glob "^7.0.5"
ignore "^3.0.9"
pkg-config "^1.1.0"
run-parallel "^1.1.2"
uniq "^1.0.1"
del@^2.0.2: del@^2.0.2:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
@@ -2247,7 +2212,7 @@ diff@^3.2.0:
version "3.4.0" version "3.4.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
doctrine@1.5.0, doctrine@^1.2.2: doctrine@1.5.0:
version "1.5.0" version "1.5.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
dependencies: dependencies:
@@ -2313,76 +2278,6 @@ error-ex@^1.2.0, error-ex@^1.3.1:
dependencies: dependencies:
is-arrayish "^0.2.1" is-arrayish "^0.2.1"
es-abstract@^1.7.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227"
dependencies:
es-to-primitive "^1.1.1"
function-bind "^1.1.1"
has "^1.0.1"
is-callable "^1.1.3"
is-regex "^1.0.4"
es-to-primitive@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
dependencies:
is-callable "^1.1.1"
is-date-object "^1.0.1"
is-symbol "^1.0.1"
es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
version "0.10.35"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f"
dependencies:
es6-iterator "~2.0.1"
es6-symbol "~3.1.1"
es6-iterator@^2.0.1, es6-iterator@~2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
dependencies:
d "1"
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-map@^0.1.3:
version "0.1.5"
resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
dependencies:
d "1"
es5-ext "~0.10.14"
es6-iterator "~2.0.1"
es6-set "~0.1.5"
es6-symbol "~3.1.1"
event-emitter "~0.3.5"
es6-set@~0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
dependencies:
d "1"
es5-ext "~0.10.14"
es6-iterator "~2.0.1"
es6-symbol "3.1.1"
event-emitter "~0.3.5"
es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
dependencies:
d "1"
es5-ext "~0.10.14"
es6-weak-map@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
dependencies:
d "1"
es5-ext "^0.10.14"
es6-iterator "^2.0.1"
es6-symbol "^3.1.1"
escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -2398,122 +2293,106 @@ escodegen@^1.6.1:
optionalDependencies: optionalDependencies:
source-map "~0.5.6" source-map "~0.5.6"
escope@^3.6.0: eslint-config-standard@^10.2.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
dependencies:
es6-map "^0.1.3"
es6-weak-map "^2.0.1"
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-config-standard-jsx@4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz#009e53c4ddb1e9ee70b4650ffe63a7f39f8836e1"
eslint-config-standard@10.2.1:
version "10.2.1" version "10.2.1"
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591"
eslint-import-resolver-node@^0.2.0: eslint-import-resolver-node@^0.3.1:
version "0.2.3" version "0.3.1"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc"
dependencies: dependencies:
debug "^2.2.0" debug "^2.6.8"
object-assign "^4.0.1" resolve "^1.2.0"
resolve "^1.1.6"
eslint-module-utils@^2.0.0: eslint-module-utils@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449"
dependencies: dependencies:
debug "^2.6.8" debug "^2.6.8"
pkg-dir "^1.0.0" pkg-dir "^1.0.0"
eslint-plugin-import@~2.2.0: eslint-plugin-import@^2.8.0:
version "2.2.0" version "2.8.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz#fa1b6ef31fcb3c501c09859c1b86f1fc5b986894"
dependencies: dependencies:
builtin-modules "^1.1.1" builtin-modules "^1.1.1"
contains-path "^0.1.0" contains-path "^0.1.0"
debug "^2.2.0" debug "^2.6.8"
doctrine "1.5.0" doctrine "1.5.0"
eslint-import-resolver-node "^0.2.0" eslint-import-resolver-node "^0.3.1"
eslint-module-utils "^2.0.0" eslint-module-utils "^2.1.1"
has "^1.0.1" has "^1.0.1"
lodash.cond "^4.3.0" lodash.cond "^4.3.0"
minimatch "^3.0.3" minimatch "^3.0.3"
pkg-up "^1.0.0" read-pkg-up "^2.0.0"
eslint-plugin-node@~4.2.2: eslint-plugin-node@^5.2.1:
version "4.2.3" version "5.2.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz#c04390ab8dbcbb6887174023d6f3a72769e63b97" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29"
dependencies: dependencies:
ignore "^3.0.11" ignore "^3.3.6"
minimatch "^3.0.2" minimatch "^3.0.4"
object-assign "^4.0.1" resolve "^1.3.3"
resolve "^1.1.7"
semver "5.3.0" semver "5.3.0"
eslint-plugin-promise@~3.5.0: eslint-plugin-promise@^3.6.0:
version "3.5.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz#78fbb6ffe047201627569e85a6c5373af2a68fca" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz#54b7658c8f454813dc2a870aff8152ec4969ba75"
eslint-plugin-react@~6.10.0: eslint-plugin-standard@^3.0.1:
version "6.10.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78"
dependencies:
array.prototype.find "^2.0.1"
doctrine "^1.2.2"
has "^1.0.1"
jsx-ast-utils "^1.3.4"
object.assign "^4.0.4"
eslint-plugin-standard@~3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2"
eslint@~3.19.0: eslint-scope@^3.7.1:
version "3.19.0" version "3.7.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
dependencies: dependencies:
babel-code-frame "^6.16.0" esrecurse "^4.1.0"
chalk "^1.1.3" estraverse "^4.1.1"
concat-stream "^1.5.2"
debug "^2.1.1" eslint@^4.11.0:
version "4.11.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.11.0.tgz#39a8c82bc0a3783adf5a39fa27fdd9d36fac9a34"
dependencies:
ajv "^5.3.0"
babel-code-frame "^6.22.0"
chalk "^2.1.0"
concat-stream "^1.6.0"
cross-spawn "^5.1.0"
debug "^3.0.1"
doctrine "^2.0.0" doctrine "^2.0.0"
escope "^3.6.0" eslint-scope "^3.7.1"
espree "^3.4.0" espree "^3.5.2"
esquery "^1.0.0" esquery "^1.0.0"
estraverse "^4.2.0" estraverse "^4.2.0"
esutils "^2.0.2" esutils "^2.0.2"
file-entry-cache "^2.0.0" file-entry-cache "^2.0.0"
glob "^7.0.3" functional-red-black-tree "^1.0.1"
globals "^9.14.0" glob "^7.1.2"
ignore "^3.2.0" globals "^9.17.0"
ignore "^3.3.3"
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
inquirer "^0.12.0" inquirer "^3.0.6"
is-my-json-valid "^2.10.0"
is-resolvable "^1.0.0" is-resolvable "^1.0.0"
js-yaml "^3.5.1" js-yaml "^3.9.1"
json-stable-stringify "^1.0.0" json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.3.0" levn "^0.3.0"
lodash "^4.0.0" lodash "^4.17.4"
mkdirp "^0.5.0" minimatch "^3.0.2"
mkdirp "^0.5.1"
natural-compare "^1.4.0" natural-compare "^1.4.0"
optionator "^0.8.2" optionator "^0.8.2"
path-is-inside "^1.0.1" path-is-inside "^1.0.2"
pluralize "^1.2.1" pluralize "^7.0.0"
progress "^1.1.8" progress "^2.0.0"
require-uncached "^1.0.2" require-uncached "^1.0.3"
shelljs "^0.7.5" semver "^5.3.0"
strip-bom "^3.0.0" strip-ansi "^4.0.0"
strip-json-comments "~2.0.1" strip-json-comments "~2.0.1"
table "^3.7.8" table "^4.0.1"
text-table "~0.2.0" text-table "~0.2.0"
user-home "^2.0.0"
espree@^3.4.0: espree@^3.5.2:
version "3.5.2" version "3.5.2"
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca"
dependencies: dependencies:
@@ -2549,13 +2428,6 @@ esutils@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
event-emitter@~0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
dependencies:
d "1"
es5-ext "~0.10.14"
event-to-promise@^0.7.0: event-to-promise@^0.7.0:
version "0.7.0" version "0.7.0"
resolved "https://registry.yarnpkg.com/event-to-promise/-/event-to-promise-0.7.0.tgz#cb07dfcd418da2221d90f77eab713bc235e2090f" resolved "https://registry.yarnpkg.com/event-to-promise/-/event-to-promise-0.7.0.tgz#cb07dfcd418da2221d90f77eab713bc235e2090f"
@@ -2719,7 +2591,7 @@ fb-watchman@^2.0.0:
dependencies: dependencies:
bser "^2.0.0" bser "^2.0.0"
figures@^1.3.5, figures@^1.7.0: figures@^1.7.0:
version "1.7.0" version "1.7.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
dependencies: dependencies:
@@ -2773,10 +2645,6 @@ find-parent-dir@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
find-root@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
find-up@^1.0.0: find-up@^1.0.0:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -2813,10 +2681,6 @@ for-own@^0.1.4:
dependencies: dependencies:
for-in "^1.0.1" for-in "^1.0.1"
foreach@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
forever-agent@~0.6.1: forever-agent@~0.6.1:
version "0.6.1" version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -2901,10 +2765,14 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
mkdirp ">=0.5 0" mkdirp ">=0.5 0"
rimraf "2" rimraf "2"
function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: function-bind@^1.0.2:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
gauge@~2.7.3: gauge@~2.7.3:
version "2.7.4" version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@ -2918,16 +2786,6 @@ gauge@~2.7.3:
strip-ansi "^3.0.1" strip-ansi "^3.0.1"
wide-align "^1.1.0" wide-align "^1.1.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: get-caller-file@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
@@ -2936,10 +2794,6 @@ get-own-enumerable-property-symbols@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b"
get-stdin@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
get-stream@^2.1.0: get-stream@^2.1.0:
version "2.3.1" version "2.3.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
@@ -2999,7 +2853,7 @@ globals@^10.0.0:
version "10.4.0" version "10.4.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-10.4.0.tgz#5c477388b128a9e4c5c5d01c7a2aca68c68b2da7" resolved "https://registry.yarnpkg.com/globals/-/globals-10.4.0.tgz#5c477388b128a9e4c5c5d01c7a2aca68c68b2da7"
globals@^9.14.0, globals@^9.18.0: globals@^9.17.0, globals@^9.18.0:
version "9.18.0" version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
@@ -3245,7 +3099,7 @@ iconv-lite@0.4.19, iconv-lite@^0.4.17:
version "0.4.19" version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
ignore@^3.0.11, ignore@^3.0.9, ignore@^3.2.0: ignore@^3.3.3, ignore@^3.3.6:
version "3.3.7" version "3.3.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
@@ -3278,25 +3132,7 @@ ini@~1.3.0:
version "1.3.4" version "1.3.4"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
inquirer@^0.12.0: inquirer@^3.0.1, inquirer@^3.0.6:
version "0.12.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
dependencies:
ansi-escapes "^1.1.0"
ansi-regex "^2.0.0"
chalk "^1.0.0"
cli-cursor "^1.0.1"
cli-width "^2.0.0"
figures "^1.3.5"
lodash "^4.3.0"
readline2 "^1.0.1"
run-async "^0.1.0"
rx-lite "^3.1.2"
string-width "^1.0.1"
strip-ansi "^3.0.0"
through "^2.3.6"
inquirer@^3.0.1:
version "3.3.0" version "3.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
dependencies: dependencies:
@@ -3315,10 +3151,6 @@ inquirer@^3.0.1:
strip-ansi "^4.0.0" strip-ansi "^4.0.0"
through "^2.3.6" through "^2.3.6"
interpret@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0"
invariant@^2.2.0, invariant@^2.2.2: invariant@^2.2.0, invariant@^2.2.2:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
@@ -3359,10 +3191,6 @@ is-builtin-module@^1.0.0:
dependencies: dependencies:
builtin-modules "^1.0.0" builtin-modules "^1.0.0"
is-callable@^1.1.1, is-callable@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
is-ci@^1.0.10: is-ci@^1.0.10:
version "1.0.10" version "1.0.10"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
@@ -3375,10 +3203,6 @@ is-data-descriptor@^0.1.4:
dependencies: dependencies:
kind-of "^3.0.2" kind-of "^3.0.2"
is-date-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
is-descriptor@^0.1.0: is-descriptor@^0.1.0:
version "0.1.6" version "0.1.6"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
@@ -3455,15 +3279,6 @@ is-glob@^4.0.0:
dependencies: dependencies:
is-extglob "^2.1.1" is-extglob "^2.1.1"
is-my-json-valid@^2.10.0:
version "2.16.1"
resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11"
dependencies:
generate-function "^2.0.0"
generate-object-property "^1.1.0"
jsonpointer "^4.0.0"
xtend "^4.0.0"
is-number@^2.1.0: is-number@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -3534,20 +3349,10 @@ is-promise@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
is-property@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
is-redirect@^1.0.0: is-redirect@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
is-regex@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
dependencies:
has "^1.0.1"
is-regexp@^1.0.0: is-regexp@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
@@ -3572,10 +3377,6 @@ is-stream@^1.0.0, is-stream@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
is-symbol@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
is-typedarray@~1.0.0: is-typedarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -3919,7 +3720,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
js-yaml@^3.5.1, js-yaml@^3.7.0, js-yaml@^3.9.0: js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
version "3.10.0" version "3.10.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
dependencies: dependencies:
@@ -3993,7 +3794,11 @@ json-schema@0.2.3:
version "0.2.3" version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
json-stable-stringify@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
dependencies: dependencies:
@@ -4017,10 +3822,6 @@ jsonify@~0.0.0:
version "0.0.0" version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
jsonpointer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
jsonrpc-websocket-client@^0.2.0: jsonrpc-websocket-client@^0.2.0:
version "0.2.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/jsonrpc-websocket-client/-/jsonrpc-websocket-client-0.2.0.tgz#553e35687e8d6cf81a9a6655734ba9774caa90c2" resolved "https://registry.yarnpkg.com/jsonrpc-websocket-client/-/jsonrpc-websocket-client-0.2.0.tgz#553e35687e8d6cf81a9a6655734ba9774caa90c2"
@@ -4041,10 +3842,6 @@ jsprim@^1.2.2:
json-schema "0.2.3" json-schema "0.2.3"
verror "1.10.0" verror "1.10.0"
jsx-ast-utils@^1.3.4:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2" version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -4291,7 +4088,7 @@ lodash.keys@^3.0.0:
dependencies: dependencies:
lodash._createwrapper "^3.0.0" lodash._createwrapper "^3.0.0"
lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.2, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.2, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0:
version "4.17.4" version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
@@ -4462,7 +4259,7 @@ minimist@0.0.8:
version "0.0.8" version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: minimist@^1.1.1, minimist@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
@@ -4477,7 +4274,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2" for-in "^1.0.2"
is-extendable "^0.1.1" is-extendable "^0.1.1"
mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1:
version "0.5.1" version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies: dependencies:
@@ -4522,10 +4319,6 @@ must@^0.13.2:
lodash.wrap ">= 3 < 4" lodash.wrap ">= 3 < 4"
oolong ">= 1.11.0 < 2" oolong ">= 1.11.0 < 2"
mute-stream@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
mute-stream@0.0.7: mute-stream@0.0.7:
version "0.0.7" version "0.0.7"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@@ -4759,24 +4552,12 @@ object-copy@^0.1.0:
define-property "^0.2.5" define-property "^0.2.5"
kind-of "^3.0.3" kind-of "^3.0.3"
object-keys@^1.0.10, object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
object-visit@^1.0.0: object-visit@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
dependencies: dependencies:
isobject "^3.0.0" isobject "^3.0.0"
object.assign@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc"
dependencies:
define-properties "^1.1.2"
function-bind "^1.1.0"
object-keys "^1.0.10"
object.omit@^2.0.0: object.omit@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@@ -5060,42 +4841,21 @@ pipette@^0.9.3:
dependencies: dependencies:
typ "~0.6.1" typ "~0.6.1"
pkg-conf@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279"
dependencies:
find-up "^2.0.0"
load-json-file "^2.0.0"
pkg-config@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4"
dependencies:
debug-log "^1.0.0"
find-root "^1.0.0"
xtend "^4.0.1"
pkg-dir@^1.0.0: pkg-dir@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
dependencies: dependencies:
find-up "^1.0.0" find-up "^1.0.0"
pkg-up@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26"
dependencies:
find-up "^1.0.0"
plur@^2.1.2: plur@^2.1.2:
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a"
dependencies: dependencies:
irregular-plurals "^1.0.0" irregular-plurals "^1.0.0"
pluralize@^1.2.1: pluralize@^7.0.0:
version "1.2.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
posix-character-classes@^0.1.0: posix-character-classes@^0.1.0:
version "0.1.1" version "0.1.1"
@@ -5146,9 +4906,9 @@ progress-stream@^2.0.0:
speedometer "~1.0.0" speedometer "~1.0.0"
through2 "~2.0.3" through2 "~2.0.3"
progress@^1.1.8: progress@^2.0.0:
version "1.1.8" version "2.0.0"
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
promise-polyfill@^6.0.1: promise-polyfill@^6.0.1:
version "6.0.2" version "6.0.2"
@@ -5278,20 +5038,6 @@ readdirp@^2.0.0:
readable-stream "^2.0.2" readable-stream "^2.0.2"
set-immediate-shim "^1.0.1" set-immediate-shim "^1.0.1"
readline2@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
mute-stream "0.0.5"
rechoir@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
dependencies:
resolve "^1.1.6"
"reconnect-core@https://github.com/dodo/reconnect-core/tarball/merged": "reconnect-core@https://github.com/dodo/reconnect-core/tarball/merged":
version "0.0.1" version "0.0.1"
resolved "https://github.com/dodo/reconnect-core/tarball/merged#b9daf2adc45b19a6cc5fd2f048f8d9406cece498" resolved "https://github.com/dodo/reconnect-core/tarball/merged#b9daf2adc45b19a6cc5fd2f048f8d9406cece498"
@@ -5483,7 +5229,7 @@ require-package-name@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9"
require-uncached@^1.0.2: require-uncached@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
dependencies: dependencies:
@@ -5502,7 +5248,7 @@ resolve@1.1.7:
version "1.1.7" version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.3.3:
version "1.5.0" version "1.5.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
dependencies: dependencies:
@@ -5540,22 +5286,12 @@ rimraf@~2.4.0:
dependencies: dependencies:
glob "^6.0.1" glob "^6.0.1"
run-async@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
dependencies:
once "^1.3.0"
run-async@^2.2.0: run-async@^2.2.0:
version "2.3.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
dependencies: dependencies:
is-promise "^2.1.0" is-promise "^2.1.0"
run-parallel@^1.1.2:
version "1.1.6"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039"
rx-lite-aggregates@^4.0.8: rx-lite-aggregates@^4.0.8:
version "4.0.8" version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
@@ -5566,10 +5302,6 @@ rx-lite@*, rx-lite@^4.0.8:
version "4.0.8" version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
rx-lite@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
rxjs@^5.4.2: rxjs@^5.4.2:
version "5.5.2" version "5.5.2"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3"
@@ -5652,14 +5384,6 @@ shebang-regex@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
shelljs@^0.7.5:
version "0.7.8"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
dependencies:
glob "^7.0.0"
interpret "^1.0.0"
rechoir "^0.6.2"
shellwords@^0.1.0: shellwords@^0.1.0:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
@@ -5682,6 +5406,12 @@ slice-ansi@0.0.4:
version "0.0.4" version "0.0.4"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
slice-ansi@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
dependencies:
is-fullwidth-code-point "^2.0.0"
snapdragon-node@^2.0.1: snapdragon-node@^2.0.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -5801,29 +5531,6 @@ staged-git-files@0.0.4:
version "0.0.4" version "0.0.4"
resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35"
standard-engine@~7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-7.0.0.tgz#ebb77b9c8fc2c8165ffa353bd91ba0dff41af690"
dependencies:
deglob "^2.1.0"
get-stdin "^5.0.1"
minimist "^1.1.0"
pkg-conf "^2.0.0"
standard@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/standard/-/standard-10.0.3.tgz#7869bcbf422bdeeaab689a1ffb1fea9677dd50ea"
dependencies:
eslint "~3.19.0"
eslint-config-standard "10.2.1"
eslint-config-standard-jsx "4.0.2"
eslint-plugin-import "~2.2.0"
eslint-plugin-node "~4.2.2"
eslint-plugin-promise "~3.5.0"
eslint-plugin-react "~6.10.0"
eslint-plugin-standard "~3.0.1"
standard-engine "~7.0.0"
static-extend@^0.1.1: static-extend@^0.1.1:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -5852,7 +5559,7 @@ string-width@^1.0.1, string-width@^1.0.2:
is-fullwidth-code-point "^1.0.0" is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
string-width@^2.0.0, string-width@^2.1.0: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
dependencies: dependencies:
@@ -5960,16 +5667,16 @@ symbol-tree@^3.2.1:
version "3.2.2" version "3.2.2"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
table@^3.7.8: table@^4.0.1:
version "3.8.3" version "4.0.2"
resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
dependencies: dependencies:
ajv "^4.7.0" ajv "^5.2.3"
ajv-keywords "^1.0.0" ajv-keywords "^2.1.0"
chalk "^1.1.1" chalk "^2.1.0"
lodash "^4.0.0" lodash "^4.17.4"
slice-ansi "0.0.4" slice-ansi "1.0.0"
string-width "^2.0.0" string-width "^2.1.1"
tar-pack@^3.4.0: tar-pack@^3.4.0:
version "3.4.1" version "3.4.1"
@@ -6186,10 +5893,6 @@ union-value@^1.0.0:
is-extendable "^0.1.1" is-extendable "^0.1.1"
set-value "^0.4.3" set-value "^0.4.3"
uniq@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
unset-value@^1.0.0: unset-value@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
@@ -6227,12 +5930,6 @@ user-home@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
user-home@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
dependencies:
os-homedir "^1.0.0"
util-deprecate@~1.0.1: util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -6468,7 +6165,7 @@ xpath@0.0.5:
version "0.0.5" version "0.0.5"
resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.5.tgz#454036f6ef0f3df5af5d4ba4a119fb75674b3e6c" resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.5.tgz#454036f6ef0f3df5af5d4ba4a119fb75674b3e6c"
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: xtend@^4.0.1, xtend@~4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"