From 3013e4f9515b1dc6e3d5966f2870bd0b4ec9c81e Mon Sep 17 00:00:00 2001 From: blm7 Date: Thu, 19 Sep 2019 07:42:50 -0700 Subject: [PATCH] Release 7.2.0 --- README.md | 4 +- RELEASENOTES.md | 17 +- lib/add.js | 2 +- lib/addtypescript.js | 82 + lib/buildCommon.js | 120 +- lib/buildHybrid.js | 2 + lib/buildWeb.js | 2 + lib/config.js | 1 + lib/constants.js | 17 +- lib/defaultconfig.js | 7 +- lib/scopes/component.js | 139 +- lib/scopes/exchange.js | 57 +- lib/scopes/pack.js | 172 +- lib/serve/watch.js | 5 +- lib/serveWebFileChangeHandler.js | 80 +- lib/templates/pack/component.json | 2 +- lib/templates/typescript/tsconfig.json | 26 + lib/util.js | 291 ++- lib/utils.exchange.js | 427 +++- oraclejet-tooling.js | 1 + package-lock.json | 2624 ------------------------ package.json | 8 +- 22 files changed, 1036 insertions(+), 3050 deletions(-) create mode 100644 lib/addtypescript.js create mode 100644 lib/templates/typescript/tsconfig.json delete mode 100644 package-lock.json diff --git a/README.md b/README.md index ef4be67..e37ca1a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# @oracle/oraclejet-tooling 7.1.1 +# @oracle/oraclejet-tooling 7.2.0 ## About the tooling API This tooling API contains methods to build and serve Oracle JET web and hybrid mobile apps. It is intended to be used with task running tools such as grunt or gulp. The APIs can also be invoked directly. @@ -6,7 +6,7 @@ This tooling API contains methods to build and serve Oracle JET web and hybrid m This is an open source project maintained by Oracle Corp. ## Installation -This module will be automatically installed when you scaffold a web or hybrid mobile app following the [Oracle JET Developers Guide](http://www.oracle.com/pls/topic/lookup?ctx=jet711&id=homepage). +This module will be automatically installed when you scaffold a web or hybrid mobile app following the [Oracle JET Developers Guide](http://www.oracle.com/pls/topic/lookup?ctx=jet720&id=homepage). ## [Contributing](https://github.com/oracle/oraclejet-tooling/tree/master/CONTRIBUTING.md) Oracle JET is an open source project. Pull Requests are currently not being accepted. See diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 90d128b..4d1b9fe 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,21 +1,6 @@ ## Release Notes for oraclejet-tooling ## -### 7.1.1 -* Updated to use newer svgo due to bug - -### 7.1.0 -* No changes - -### 7.0.0 -* No changes - -### 6.2.0 -* No changes - -### 6.1.0 -* No changes - -### 6.0.0 +### 7.2.0 * No changes ### 5.2.0 diff --git a/lib/add.js b/lib/add.js index 5d85b89..907418e 100644 --- a/lib/add.js +++ b/lib/add.js @@ -29,7 +29,7 @@ module.exports = function (scope, parameters, options) { case (CONSTANTS.API_SCOPES.COMPONENT): return component.add(parameters, options); case (CONSTANTS.API_SCOPES.PACK): - return pack.add(parameters); + return pack.add(parameters, options); default: util.log.error(`Please specify ojet.${CONSTANTS.API_TASKS.ADD}() 'scope' parameter.`); return false; diff --git a/lib/addtypescript.js b/lib/addtypescript.js new file mode 100644 index 0000000..7878cd2 --- /dev/null +++ b/lib/addtypescript.js @@ -0,0 +1,82 @@ +#! /usr/bin/env node +/** + Copyright (c) 2015, 2019, Oracle and/or its affiliates. + The Universal Permissive License (UPL), Version 1.0 +*/ + +'use strict'; + +/** + * ## Dependencies + */ + +const util = require('./util'); +const fs = require('fs'); +const exec = require('child_process').exec; +const CONSTANTS = require('./constants'); + +/** + * ## Helpers + */ + +function installTypescipt(validGlobalTypescriptAvailable) { + return new Promise((resolve) => { + if (validGlobalTypescriptAvailable) { + resolve(); + } else { + util.log('Installing Typescript'); + exec('npm install typescript --save-dev=true', { + env: { + ...process.env, + NO_UPDATE_NOTIFIER: true + } + }, (error) => { + if (error) { + util.log.error(error); + } else { + resolve(); + } + }); + } + }); +} + +function injectTypscriptConfig() { + util.log('Adding tsconfig.json'); + function copyTsconfigToRoot(resolve) { + fs.copyFile(CONSTANTS.PATH_TO_TSCONFIG_TEMPLATE, CONSTANTS.PATH_TO_TSCONFIG, (error) => { + if (error) { + util.log.error(error); + } else { + resolve(); + } + }); + } + return new Promise((resolve) => { + util.fsExists(CONSTANTS.PATH_TO_TSCONFIG, (fsExistsError) => { + if (fsExistsError) { + copyTsconfigToRoot(resolve); + } else { + fs.rename(CONSTANTS.PATH_TO_TSCONFIG, CONSTANTS.PATH_TO_TSCONFIG.replace('.', '_old.'), (fsRenameError) => { + if (fsRenameError) { + util.log.error(fsRenameError); + } else { + copyTsconfigToRoot(resolve); + } + }); + } + }); + }); +} + +/** + * # 'addTypescript' + * + * @public + * @returns {Promise} + */ +module.exports = function () { + return util.validGlobalTypescriptAvailable() + .then(installTypescipt) + .then(injectTypscriptConfig); +}; diff --git a/lib/buildCommon.js b/lib/buildCommon.js index 2b85d23..e9cd2a3 100644 --- a/lib/buildCommon.js +++ b/lib/buildCommon.js @@ -19,6 +19,9 @@ const indexHtmlInjector = require('./indexHtmlInjector'); const svg = require('./svg'); const CONSTANTS = require('./constants'); const hookRunner = require('./hookRunner'); +const pathGenerator = require('./rjsConfigGenerator'); + +const childProcess = require('child_process'); function _getUglyCode(file, uglifyOptions) { const code = fs.readFileSync(file, 'utf-8'); @@ -405,18 +408,20 @@ module.exports = { requireJs: function _requireJs(context) { util.log('Running requirejs task.'); - - const opts = context.opts; - const requireConfig = opts.requireJs; + // copy the paths mapping into requireJs.paths + const pathsObj = pathGenerator.getPathsMapping(context); + // assign paths obj. - making accessible to the before_optimize hook. + context.opts.requireJs.paths = pathsObj; // eslint-disable-line no-param-reassign return new Promise((resolve, reject) => { - requirejs.optimize(requireConfig, () => { - util.log('Task requirejs finished.'); - resolve(context); - }, (err) => { - util.log(err); - reject(err); - }); + hookRunner('before_optimize', context) + .then(requirejs.optimize(context.opts.requireJs, () => { + util.log('Task requirejs finished *.'); + resolve(context); + }, (err) => { + util.log(err); + reject(err); + })); }); }, @@ -631,6 +636,101 @@ module.exports = { promises.push(hookRunner('after_component_build', newContext)); }); }); + }, + + typescript: function _runTypescriptCompilation(context) { + return new Promise((resolve) => { + const tsconfigStagingPath = path.join('.', context.opts.stagingPath, CONSTANTS.PATH_TO_TSCONFIG); + const localTypescriptPath = 'node_modules/typescript/bin/tsc'; + let compilerArguments = ['--project', tsconfigStagingPath]; + let compiledMessage; + const _resolve = () => { + util.log(compiledMessage); + resolve(context); + }; + util.fsExists(CONSTANTS.PATH_TO_TSCONFIG, (fsExistsError) => { + if (fsExistsError) { + resolve(context); + } else { + util.log('Compiling Typescript'); + fs.readJSON(CONSTANTS.PATH_TO_TSCONFIG).then((tsconfigJson) => { + const pathToStaging = path.join('.', config('paths').src.common, context.opts.stagingPath); + const pathToCommon = path.join('.', config('paths').src.common); + // eslint-disable-next-line no-param-reassign + tsconfigJson.compilerOptions.baseUrl = path.relative(pathToStaging, pathToCommon); + // eslint-disable-next-line no-param-reassign + tsconfigJson.include = ['./ts/**/*']; + if (context.buildType === 'dev') { + // eslint-disable-next-line no-param-reassign + tsconfigJson.compilerOptions.outDir = path.join('.', config('paths').src.javascript); + } + fs.writeJSON(tsconfigStagingPath, tsconfigJson, { spaces: 2 }).then(() => { + Promise.all([ + util.validGlobalTypescriptAvailable(), + fs.pathExists(localTypescriptPath).then(pathExists => pathExists) + ]).then((values) => { + const [validGlobalTypescriptAvailable, localTypescriptAvailable] = values; + if (validGlobalTypescriptAvailable) { + compilerArguments = [ + 'tsc', + ...compilerArguments + ]; + compiledMessage = 'Compiled using global Typescript'; + } else if (localTypescriptAvailable) { + compilerArguments = [ + 'node', + localTypescriptPath, + ...compilerArguments + ]; + compiledMessage = 'Compiled using local Typescript'; + } else { + util.log.error('Please run \'ojet add typescript\' to add typescript support to your application'); + } + childProcess.exec(compilerArguments.join(' '), (execError, stdout, stderr) => { + if (/No inputs were found/.test(stdout.toString())) { + util.log('\x1b[31mNo ts directory or .ts files found\x1b[0m'); + } + if (execError) { + util.log(`\x1b[31m${execError.toString().trim()}\x1b[0m`); + if (stdout && stdout.length) { + util.log(`\x1b[31m${stdout.toString().trim()}\x1b[0m`); + } + if (stderr && stderr.length) { + util.log(`\x1b[31m${stderr.toString().trim()}\x1b[0m`); + } + if (!context.serving) { + process.exit(1); + } + } + if (context.buildType !== 'dev') { + fs.remove(tsconfigStagingPath, () => { + _resolve(); + }); + } else { + _resolve(); + } + }); + }); + }); + }); + } + }); + }); + }, + + cleanTypescript: function _cleanTypescriptStagingDirectory(context) { + util.log('Cleaning Typescript staging directory'); + const typescriptStagingDirectory = path.join('.', context.opts.stagingPath, config('paths').src.typescript); + return new Promise((resolve, reject) => { + fs.remove(typescriptStagingDirectory, (error) => { + if (error) { + reject(error); + return; + } + util.log('Task cleanTypescript finished'); + resolve(context); + }); + }); } }; diff --git a/lib/buildHybrid.js b/lib/buildHybrid.js index 1973721..52610df 100644 --- a/lib/buildHybrid.js +++ b/lib/buildHybrid.js @@ -122,6 +122,7 @@ function _runCommonBuildTasks(context) { .then(buildCommon.copyLocalCca) .then(buildCommon.spriteSvg) .then(buildCommon.sass) + .then(buildCommon.typescript) .then(buildCommon.injectCdnBundleScript) .then(buildCommon.copyThemes) .then(buildCommon.injectTheme) @@ -142,6 +143,7 @@ function _runReleaseBuildTasks(context) { .then(buildCommon.uglify) .then(buildCommon.requireJs) .then(buildCommon.cleanTemp) + .then(buildCommon.cleanTypescript) .then(data => resolve(data)) .catch(err => reject(err)); } diff --git a/lib/buildWeb.js b/lib/buildWeb.js index 2f10f23..eab101f 100644 --- a/lib/buildWeb.js +++ b/lib/buildWeb.js @@ -17,6 +17,7 @@ function _runReleaseBuildTasks(context) { .then(buildCommon.uglify) .then(buildCommon.requireJs) .then(buildCommon.cleanTemp) + .then(buildCommon.cleanTypescript) .then(data => resolve(data)) .catch(err => reject(err)); } @@ -33,6 +34,7 @@ function _runCommonBuildTasks(context) { .then(buildCommon.copyLocalCca) .then(buildCommon.spriteSvg) .then(buildCommon.sass) + .then(buildCommon.typescript) .then(buildCommon.injectCdnBundleScript) .then(buildCommon.injectTheme) .then(buildCommon.copyThemes) diff --git a/lib/config.js b/lib/config.js index b5ef212..70c4a24 100644 --- a/lib/config.js +++ b/lib/config.js @@ -57,6 +57,7 @@ config.getConfiguredPaths = (platform) => { src.common = srcConfig.common ? path.normalize(srcConfig.common) : CONSTANTS.APP_SRC_DIRECTORY; src.javascript = srcConfig.javascript ? path.normalize(srcConfig.javascript) : 'js'; + src.typescript = srcConfig.typescript ? path.normalize(srcConfig.typescript) : 'ts'; src.styles = srcConfig.styles ? path.normalize(srcConfig.styles) : 'css'; src.themes = srcConfig.themes ? path.normalize(srcConfig.themes) : 'themes'; src.tests = srcConfig.tests ? path.normalize(srcConfig.tests) : 'tests'; diff --git a/lib/constants.js b/lib/constants.js index b5a12e4..6044fa9 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -44,6 +44,9 @@ module.exports = { PATH_MAPPING_JSON: 'path_mapping.json', PATH_MAPPING_VERSION_TOKEN: '#{version}', PATH_TO_HOOKS_CONFIG: 'scripts/hooks/hooks.json', + PATH_TO_TSCONFIG: 'tsconfig.json', + PATH_TO_TSCONFIG_TEMPLATE: 'node_modules/@oracle/oraclejet-tooling/lib/templates/typescript/tsconfig.json', + MIN_TYPESCRIPT_VERSION: '3.5.0', API_TASKS: { ADD: 'add', @@ -53,12 +56,22 @@ module.exports = { LIST: 'list', PUBLISH: 'publish', REMOVE: 'remove', - SEARCH: 'search' + SEARCH: 'search', + ADDTYPESCRIPT: 'addtypescript' }, API_SCOPES: { EXCHANGE: 'exchange', COMPONENT: 'component', PACK: 'pack' }, - EXCHANGE_URL_PARAM: 'exchange-url' + EXCHANGE_URL_PARAM: 'exchange-url', + EXCHANGE_TOKEN_STORE_DIR: '.ojet', + EXCHANGE_TOKEN_STORE_FILE: 'exchange-access.json', + EXCHANGE_HEADER_NEXT_TOKEN: 'x-compcatalog-auth-next-token', + EXCHANGE_HEADER_NEXT_TOKEN_EXPIRATION: 'x-compcatalog-auth-next-token-expiration', + EXCHANGE_AUTH_ACCESS_TOKEN: 'access_token', + EXCHANGE_AUTH_TOKEN_TYPE: 'token_type', + EXCHANGE_AUTH_EXPIRATION: 'expiration', + + }; diff --git a/lib/defaultconfig.js b/lib/defaultconfig.js index 57f849d..3110987 100644 --- a/lib/defaultconfig.js +++ b/lib/defaultconfig.js @@ -34,6 +34,11 @@ module.exports = { src: ['**/*.js', '!main.js', `!${paths.composites}/**/*.js`], dest: `${paths.staging.stagingPath}/${paths.src.javascript}` }, + { + cwd: `${paths.staging.stagingPath}/${paths.src.typescript}`, + src: ['**/*.js'], + dest: `${paths.staging.stagingPath}/${paths.src.javascript}` + }, { cwd: `${paths.staging.stagingPath}/${paths.src.javascript}`, src: ['main-temp.js'], @@ -162,7 +167,6 @@ module.exports = { requireJs: paths => ({ baseUrl: `${paths.staging.stagingPath}/${paths.src.javascript}`, name: 'main-temp', - mainConfigFile: `${paths.staging.stagingPath}/${paths.src.javascript}/main-temp.js`, optimize: 'none', out: `${paths.staging.stagingPath}/${paths.src.javascript}/main.js` }), @@ -250,6 +254,7 @@ module.exports = { `${paths.src.common}/${paths.src.javascript}/!(libs)/**/*.json`, `${paths.src.common}/${paths.src.javascript}/!(libs)/**/*.css`, `${paths.src.common}/${paths.src.javascript}/{,*/}*.js`, + `${paths.src.common}/${paths.src.typescript}/{,*/}*.ts`, `${paths.src.common}/${paths.src.styles}/{,*/}*.css`, `${paths.src.common}/${paths.src.tests}/**/*.css`, `${paths.src.common}/${paths.src.tests}/**/*.js`, diff --git a/lib/scopes/component.js b/lib/scopes/component.js index 51312f9..156c99d 100644 --- a/lib/scopes/component.js +++ b/lib/scopes/component.js @@ -12,15 +12,12 @@ // Node const fs = require('fs'); const fse = require('fs-extra'); -const http = require('http'); -const https = require('https'); const path = require('path'); const url = require('url'); // 3rd party const archiver = require('archiver'); const extract = require('extract-zip'); -const FormData = require('form-data'); // Oracle const CONSTANTS = require('../constants'); @@ -52,7 +49,13 @@ component.add = function (componentNames, options) { util.ensureExchangeUrl(); util.ensureDir(`./${CONSTANTS.JET_COMPONENTS_DIRECTORY}`); - exchangeUtils.resolve('add', componentNames, options) + // The first level function stores user input for the session + process.env.options = JSON.stringify(options); + + util.loginIfCredentialsProvided() + .then(() => { // eslint-disable-line + return exchangeUtils.resolve('add', componentNames, options); + }) .then(_executeSolutions) .then(() => { util.log.success(`Component(s) '${componentNames}' added.`); @@ -321,7 +324,7 @@ function _fetchMetadata(componentName) { if (cachedComponentData) { resolve(cachedComponentData); } else { - util.fetchComponentMetadata(componentName) + exchangeUtils.getComponentMetadata(componentName) .then((metadata) => { resolve(metadata); }); @@ -338,23 +341,32 @@ function _fetchMetadata(componentName) { */ function _fetchArchive(componentMetadata) { const metadata = componentMetadata; - const connection = url.parse(metadata.codeUrl); + const codeUrl = url.parse(metadata.codeUrl); - return new Promise((resolve) => { + return new Promise((resolve, reject) => { util.log(`Fetching '${metadata.name}' bits from Exchange.`); - const protocol = connection.protocol === 'https:' ? https : http; - - protocol.get(connection, (response) => { - const buffers = []; - response.on('data', (body) => { - buffers.push(body); - }); - response.on('end', () => { - util.checkForHttpErrors(response, buffers.toString()); - fs.writeFileSync(`./${metadata.name}.zip`, Buffer.concat(buffers)); - resolve(metadata); - }); + util.request({ + useUrl: codeUrl, + }) + .then((responseData) => { + const response = responseData.response; + return exchangeUtils.validateAuthenticationOfRequest( + response, + () => { return _fetchArchive(componentMetadata); }, // eslint-disable-line + () => { // eslint-disable-line + util.checkForHttpErrors(response, responseData.responseBody); + + fs.writeFileSync(`./${metadata.name}.zip`, Buffer.concat(responseData.buffer)); + return metadata; + } + ); + }) + .then((data) => { + resolve(data); + }) + .catch((error) => { + reject(error); }); }); } @@ -511,9 +523,13 @@ component.list = function () { */ component.publish = function (componentName, options) { return new Promise((resolve) => { - const opts = options || {}; util.ensureParameters(componentName, CONSTANTS.API_TASKS.PUBLISH); + // The first level function stores user input for the session + process.env.options = JSON.stringify(options); + + const opts = options || {}; + let componentComponentJsonPath = ''; let componentVersion = ''; let packComponentJsonPath = ''; @@ -576,39 +592,15 @@ component.publish = function (componentName, options) { } if (existsInWebDir || existsInHybridDir) { - let user = ''; - let pass = ''; - - if (opts) { - user = opts.username; - pass = opts.password; - } - - let loginUser; - - if (opts._accessToken) { - loginUser = function () { - return new Promise((res) => { - res(opts._accessToken); - }); - }; - } else { - loginUser = function () { - return (user && typeof user !== 'boolean' && pass && typeof pass !== 'boolean') ? - exchangeUtils.getAccessToken(user, pass) : exchangeUtils.login(); - }; - } - const componentPath = existsInHybridDir ? componentHybridDirPath : componentWebDirPath; buildPromise - .then(loginUser) - .then((resolvedAccessToken) => { - opts._accessToken = resolvedAccessToken; + .then(util.loginIfCredentialsProvided) + .then(() => { // eslint-disable-line return _packArchive(componentName, componentPath, opts); }) .then(() => { // eslint-disable-line - return _uploadToExchange(componentName, opts); + return exchangeUtils.uploadToExchange(componentName, opts); }) .then(() => { const resolvedComponentName = opts.pack ? `'${componentName}' of a pack '${opts.pack}'` : `'${componentName}'`; @@ -676,59 +668,6 @@ function _packArchive(componentName, componentPath, options) { }); } -/** - * ## _uploadToExchange - * - * @private - * @param {string} componentName - * @param {Object} options - * @returns {Promise} - */ -function _uploadToExchange(componentName, options) { - return new Promise((resolve, reject) => { - const compName = options.pack ? `'${componentName}' of a pack '${options.pack}'` : `'${componentName}'`; - - util.log(`Uploading ${compName} archive to Exchange.`); - const archivePath = './component.zip'; - - // Sending multipart form data - // https://www.npmjs.com/package/form-data#alternative-submission-methods - const multipart = new FormData(); - multipart.append('file', fs.createReadStream('./component.zip')); - - const multipartHeaders = multipart.getHeaders(); - const customHeaders = { - Authorization: `${options._accessToken}` - }; - const headers = Object.assign(multipartHeaders, customHeaders); - - util.request({ - method: 'POST', - headers, - path: '/components?access=PUBLIC', - }, undefined, multipart) - .then((response) => { - let responseBody = ''; - response.on('data', (respBody) => { - responseBody += respBody; - }); - response.on('end', () => { - util.checkForHttpErrors(response, responseBody, () => { - util.deleteFile(archivePath); - }); - const resolvedComponentName = options.pack ? `'${componentName}' of a pack '${options.pack}'` : `'${componentName}'`; - util.log(`Component ${resolvedComponentName} was successfully uploaded to Exchange.`); - util.deleteFile(archivePath, () => { - resolve(); - }); - }); - }) - .catch((error) => { - reject(error); - }); - }); -} - /** * ## remove * diff --git a/lib/scopes/exchange.js b/lib/scopes/exchange.js index bb878e8..c945891 100644 --- a/lib/scopes/exchange.js +++ b/lib/scopes/exchange.js @@ -14,6 +14,7 @@ const fs = require('fs'); // Oracle const CONSTANTS = require('../constants'); +const exchangeUtils = require('../utils.exchange'); const util = require('../util'); /** @@ -52,32 +53,46 @@ exchange.configureUrl = function (url) { * @returns {Promise} */ exchange.search = function (parameter, options) { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { util.ensureParameters(parameter, CONSTANTS.API_TASKS.SEARCH); util.log(`Searching for '${parameter}' in the Exchange ...`); - util.request({ - path: `/components/?q=${parameter}*&format=full`, - }).then((response) => { - let responseBody = ''; - response.on('data', (respBody) => { - responseBody += respBody; - }); - response.on('end', () => { - util.checkForHttpErrors(response, responseBody); - const components = JSON.parse(responseBody).items; - if (components.length === 0) { - util.log.success('No components found.'); - } else { - _customisePrintOutput(options); - _printHead(); - _printResults(components, parameter); - } + // The first level function stores user input for the session + process.env.options = JSON.stringify(options); + + util.loginIfCredentialsProvided() + .then(() => { // eslint-disable-line + return util.request({ + path: `/components/?q=${parameter}*&format=compact&extraFields=tags`, + }) + .then((responseData) => { + const response = responseData.response; + const responseBody = responseData.responseBody; + return exchangeUtils.validateAuthenticationOfRequest( + response, + () => { return this.search(parameter, options); }, // eslint-disable-line + () => { + util.checkForHttpErrors(response, responseBody); + + const components = JSON.parse(responseBody).items; + if (components.length === 0) { + util.log.success('No components found.'); + } else { + _customisePrintOutput(options); + _printHead(); + _printResults(components, parameter); + } + } + ); + }); + }) + .then(() => { resolve(); + }) + .catch((error) => { + reject(); + util.log.error(error, true); }); - }).catch((error) => { - util.log.error(error, true); - }); }); }; diff --git a/lib/scopes/pack.js b/lib/scopes/pack.js index 41d00b4..9dfcc16 100644 --- a/lib/scopes/pack.js +++ b/lib/scopes/pack.js @@ -33,15 +33,21 @@ const pack = module.exports; * @param {Array} packNames * @return {Promise} */ -pack.add = function (packNames) { +pack.add = function (packNames, options) { return new Promise((resolve, reject) => { + util.ensureExchangeUrl(); + util.ensureDir(`./${CONSTANTS.JET_COMPONENTS_DIRECTORY}`); + + // The first level function stores user input for the session + process.env.options = JSON.stringify(options); + let i = 0; function fn() { if (i < packNames.length) { const packName = packNames[i]; - util.fetchComponentMetadata(packName) + exchangeUtils.getComponentMetadata(packName) .then((metadata) => { // eslint-disable-line return new Promise((res, rej) => { if (metadata.type === 'pack') { @@ -173,12 +179,18 @@ pack.list = function () { * * @public * @param {string} packName + * @param {Object} [options] * @return {Promise} */ pack.publish = function (packName, options) { return new Promise((resolve) => { util.ensureParameters(packName, CONSTANTS.API_TASKS.PUBLISH); + // The first level function stores user input for the session + process.env.options = JSON.stringify(options); + + const opts = options || {}; + const packComponentJsonPath = path.join(CONSTANTS.APP_SRC_DIRECTORY, 'js', CONSTANTS.JET_COMPOSITE_DIRECTORY, packName, CONSTANTS.JET_COMPONENT_JSON); let packComponentJson = {}; let packVersion = ''; @@ -195,21 +207,15 @@ pack.publish = function (packName, options) { const existsInHybridDir = fs.existsSync(packHybridDirPath); if (existsInWebDir || existsInHybridDir) { - let user = ''; - let pass = ''; - - if (options) { - user = options.username; - pass = options.password; - } - // Save available components names for publishing const packComponentNamesAndVersions = []; + const packComponentNames = []; Object.keys(packComponentJson.dependencies).forEach((packComponentName) => { // Remove pack name from full component name const shortComponentName = packComponentName.replace(`${packName}-`, ''); const packComponentComponentJsonPath = path.join(CONSTANTS.APP_SRC_DIRECTORY, 'js', CONSTANTS.JET_COMPOSITE_DIRECTORY, packName, shortComponentName, CONSTANTS.JET_COMPONENT_JSON); if (fs.existsSync(packComponentComponentJsonPath)) { + packComponentNames.push(shortComponentName); packComponentNamesAndVersions.push({ [shortComponentName]: util.readJsonAndReturnObject(packComponentComponentJsonPath).version @@ -224,32 +230,28 @@ pack.publish = function (packName, options) { // Save pack directories (not components) packDirs = packDirs.filter((packDir) => { // eslint-disable-line - return Object.keys(packComponentNamesAndVersions).indexOf(packDir) === -1; + return packComponentNames.indexOf(packDir) === -1; }); - let packComponentNames = []; - - // Performing verification of pack and components to reduce possilbe errors - _verifyPack(packName, packVersion) + // Performing verification of pack and components to reduce possible errors + util.loginIfCredentialsProvided() .then(() => { // eslint-disable-line - return _verifyPackComponents(packName, packComponentNamesAndVersions); + return _verifyPack(packName, packVersion); }) - .then((packComponentNamesToPublish) => { - packComponentNames = packComponentNamesToPublish; - return _userSignIn(user, pass); + .then(() => { // eslint-disable-line + return _verifyPackComponents(packName, packComponentNamesAndVersions); }) - .then((accessToken) => { // eslint-disable-line + .then((packComponentNamesToPublish) => { // eslint-disable-line return new Promise((res, rej) => { let i = 0; function fn() { - if (i < packComponentNames.length) { - const packComponentName = packComponentNames[i]; + if (i < packComponentNamesToPublish.length) { + const packComponentName = packComponentNamesToPublish[i]; - component.publish(packComponentName, { + component.publish(packComponentName, Object.assign(opts, { pack: packName, - _accessToken: accessToken, - _suppressMsgColor: true, - }) + _suppressMsgColor: true + })) .then(() => { i += 1; fn(); @@ -258,25 +260,27 @@ pack.publish = function (packName, options) { rej(error); }); } else { - res(accessToken); + res(); } } fn(); }); }) - .then((accessToken) => { // eslint-disable-line + .then(() => { // eslint-disable-line // Publish pack - return component.publish(packName, { - _accessToken: accessToken, + if (opts.pack) { delete opts.pack; } + return component.publish(packName, Object.assign(opts, { _contentToArchive: { dirs: packDirs, files: util.getFiles(packPath) }, _suppressMsgColor: true, - }); + })); }) .then(() => { - util.log.success(`Pack '${packName}' was uploaded to Exchange.`, options); + util.log.success(`Pack '${packName}' was uploaded to Exchange.`, Object.assign(opts, { + _suppressMsgColor: false, + })); resolve(); }) .catch((error) => { @@ -291,19 +295,6 @@ Please use 'ojet build' to build the project.\``); }); }; -/** - * ## _userSignIn - * - * @private - * @param {string} user - * @param {string} pass - * @return {Promise} - */ -function _userSignIn(user, pass) { - return (user && typeof user !== 'boolean' && pass && typeof pass !== 'boolean') ? - exchangeUtils.getAccessToken(user, pass) : exchangeUtils.login(); -} - /** * ## _verifyPack * @@ -316,29 +307,32 @@ function _verifyPack(packName, packVersion) { return new Promise((resolve, reject) => { util.request({ path: path.join('components', packName, 'versions') - }).then((response) => { - let responseBody = ''; - response.on('data', (respBody) => { - responseBody += respBody; - }); - response.on('end', () => { - if (response.statusCode.toString() === '404') { - // Pack does not exists yet, continue ... - resolve(); - } else { - util.checkForHttpErrors(response, responseBody); - const availableVersions = JSON.parse(responseBody); - if (availableVersions.items.indexOf(packVersion) !== -1) { - util.log.error(`Pack '${packName}@${packVersion}' is already published. Please update its version.`); - } else { - resolve(); + }) + .then((responseData) => { + const responseBody = responseData.responseBody; + const response = responseData.response; + return exchangeUtils.validateAuthenticationOfRequest( + response, + () => { return _verifyPack(packName, packVersion); }, // eslint-disable-line + () => { + if (response.statusCode.toString() !== '404') { + // Pack already exists... + util.checkForHttpErrors(response, responseBody); + + const availableVersions = JSON.parse(responseBody); + if (availableVersions.items.indexOf(packVersion) !== -1) { + util.log.error(`Pack '${packName}@${packVersion}' is already published. Please update its version.`); + } } } - }); + ); }) - .catch((error) => { - reject(error); - }); + .then(() => { + resolve(); + }) + .catch((error) => { + reject(error); + }); }); } @@ -362,31 +356,37 @@ function _verifyPackComponents(packName, packComponentNamesAndVersions) { const packComponentVersion = currentPackComponent[packComponentShortName]; util.request({ path: path.join('components', packComponentFullName, 'versions') - }).then((response) => { - let responseBody = ''; - response.on('data', (respBody) => { - responseBody += respBody; - }); - response.on('end', () => { - if (response.statusCode.toString() === '404') { - // Component does not exists yet, continue ... - packComponentNamesToPublish.push(packComponentShortName); - } else { - util.checkForHttpErrors(response, responseBody); - const availableVersions = JSON.parse(responseBody); - if (availableVersions.items.indexOf(packComponentVersion) !== -1) { - util.log(`Component '${packComponentShortName}@${packComponentVersion}' of a pack '${packName}' is already published. Skipping.`); - } else { + }) + .then((responseData) => { + const responseBody = responseData.responseBody; + const response = responseData.response; + return exchangeUtils.validateAuthenticationOfRequest( + response, + () => { // eslint-disable-line + return _verifyPackComponents(packName, packComponentNamesAndVersions); + }, + () => { + if (response.statusCode.toString() === '404') { + // Component does not exists yet, continue ... packComponentNamesToPublish.push(packComponentShortName); + } else { + util.checkForHttpErrors(response, responseBody); + + const availableVersions = JSON.parse(responseBody); + if (availableVersions.items.indexOf(packComponentVersion) !== -1) { + util.log(`Component '${packComponentShortName}@${packComponentVersion}' of a pack '${packName}' is already published. Skipping.`); + } else { + packComponentNamesToPublish.push(packComponentShortName); + } } + i += 1; + fn(); } - i += 1; - fn(); - }); + ); }) - .catch((error) => { - reject(error); - }); + .catch((error) => { + reject(error); + }); } else { resolve(packComponentNamesToPublish); } diff --git a/lib/serve/watch.js b/lib/serve/watch.js index 6f88f7e..2f7d7fa 100644 --- a/lib/serve/watch.js +++ b/lib/serve/watch.js @@ -135,8 +135,9 @@ function _defaultFileChangeHandler(context) { } resolve(context); } else if (config.get('platform') === 'web') { - serveWebFileChangeHandler(filePath, buildContext); - resolve(context); + serveWebFileChangeHandler(filePath, buildContext).then(() => { + resolve(context); + }); } else { serveHybridFileChangeHandler(filePath, buildContext, _isSrcFile(context.target)); resolve(context); diff --git a/lib/serveWebFileChangeHandler.js b/lib/serveWebFileChangeHandler.js index e31c1c2..ce1a72d 100644 --- a/lib/serveWebFileChangeHandler.js +++ b/lib/serveWebFileChangeHandler.js @@ -21,37 +21,50 @@ const path = require('path'); * * @public * @param {string} filePath - Path to the file + * @param {object} buildContext - Build configurations + * @returns {Promise} */ -module.exports = (filePath, buildContext) => { - const pathComponents = util.getPathComponents(filePath); - if (_isFileOverridden(pathComponents)) { - console.log(`Overridden file not changed: ${filePath}`); - return; - } - /* Copies file over for the watch events */ - if (util.isPathCCA(pathComponents.end)) { - let name = util.getCCANameFromPath(pathComponents.end); - let version = config('componentVersionObj')[name]; - // If the simple name lookup fails, then we check to see if we have a jetpack component. - if (version === undefined) { - name = util.getJetpackCompNameFromConfigObj(config('componentVersionObj'), pathComponents.end); - if (name !== null) { - version = config('componentVersionObj')[name]; +module.exports = function (filePath, buildContext) { + return new Promise((resolve) => { + const pathComponents = util.getPathComponents(filePath); + if (_isFileOverridden(pathComponents)) { + console.log(`Overridden file not changed: ${filePath}`); + return; + } + /* Copies file over for the watch events */ + if (util.isPathCCA(pathComponents.end)) { + let name = util.getCCANameFromPath(pathComponents.end); + let version = config('componentVersionObj')[name]; + // If the simple name lookup fails, then we check to see if we have a jetpack component. + if (version === undefined) { + name = util.getJetpackCompNameFromConfigObj(config('componentVersionObj'), pathComponents.end); + if (name !== null) { + version = config('componentVersionObj')[name]; + } } + const basePathArray = pathComponents.end.split(path.sep); + let basePath = ''; + for (let i = 4; i < basePathArray.length; i++) { + basePath = path.join(basePath, basePathArray[i]); + } + const dest = path.join(pathComponents.beg, config('paths').staging.web, + config('paths').src.javascript, config('paths').composites, name, version, basePath); + fs.copySync(filePath, dest); + } else if (util.isTypescriptFile(pathComponents)) { + _copyTypescriptToStagingDirectory(pathComponents); + } else { + fs.copySync(filePath, pathComponents.beg + config('paths').staging.web + pathComponents.end); } - const basePathArray = pathComponents.end.split(path.sep); - let basePath = ''; - for (let i = 4; i < basePathArray.length; i++) { - basePath = path.join(basePath, basePathArray[i]); + _injectThemeIfIndexHtml(filePath, buildContext); + if (util.isTypescriptFile(pathComponents)) { + buildCommon.typescript({ ...buildContext, serving: true }).then(() => { + resolve(); + }); + } else { + resolve(); } - const dest = path.join(pathComponents.beg, config('paths').staging.web, - config('paths').src.javascript, config('paths').composites, name, version, basePath); - fs.copySync(filePath, dest); - } else { - fs.copySync(filePath, pathComponents.beg + config('paths').staging.web + pathComponents.end); - } - _injectThemeIfIndexHtml(filePath, buildContext); + }); }; /** @@ -103,3 +116,18 @@ function _isFileOverridden(pathComponents) { return util.fsExistsSync(filePath); } + +/** + * # _copyTypescriptToStagingDirectory + * + * Copy all the files in src/ts to the appropriate + * staging directory in preparation for compiling + * + * @private + * @param {object} pathComponents - file path specification + */ +function _copyTypescriptToStagingDirectory(pathComponents) { + const typescriptSourceDirectory = path.join(pathComponents.beg, pathComponents.mid, config('paths').src.typescript); + const typescriptStagingDirectory = path.join(pathComponents.beg, config('paths').staging.web, config('paths').src.typescript); + fs.copySync(typescriptSourceDirectory, typescriptStagingDirectory); +} diff --git a/lib/templates/pack/component.json b/lib/templates/pack/component.json index 679674d..0447067 100644 --- a/lib/templates/pack/component.json +++ b/lib/templates/pack/component.json @@ -1,7 +1,7 @@ { "name": "@pack@", "version": "1.0.0", - "jetVersion": "7.1.1", + "jetVersion": "7.2.0", "type": "pack", "displayName": "A user friendly, translatable name of the pack.", "description": "A translatable high-level description for the pack.", diff --git a/lib/templates/typescript/tsconfig.json b/lib/templates/typescript/tsconfig.json new file mode 100644 index 0000000..f4fd5cd --- /dev/null +++ b/lib/templates/typescript/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": true, + "compilerOptions": { + "allowJs": true, + "alwaysStrict": false, + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "target": "es5", + "noEmitOnError": true, + "module": "amd", + "checkJs": false, + "sourceMap": true, + "baseUrl": ".", + "moduleResolution": "node", + "paths": { + "ojs/*":["./node_modules/@oracle/oraclejet/dist/types/*"], + "knockout": ["./node_modules/knockout"] + }, + "lib": ["dom","es5","scripthost", "es2015.core","es2015.collection","es2015","esnext.asynciterable"] + }, + "include": [ + "./src/ts/**/*" + ] +} \ No newline at end of file diff --git a/lib/util.js b/lib/util.js index 1e9e4fa..9133cda 100644 --- a/lib/util.js +++ b/lib/util.js @@ -30,6 +30,7 @@ const url = require('url'); /* Oracle */ const CONSTANTS = require('./constants'); +const exchangeUtils = require('./utils.exchange'); /** * # Utils @@ -40,6 +41,16 @@ const util = module.exports; util.rootPath = __dirname; +util.convertJsonToObject = (string) => { + let obj; + try { + obj = JSON.parse(string); + // If came to here, then valid json + } catch (e) { + util.log.error(`String '${string}' is not valid 'json'.`); + } + return obj; +}; /** * get the minified component path. @@ -47,7 +58,7 @@ util.rootPath = __dirname; * @param {String} path to component * @returns the minified componentPath */ -util.getComponentDest = function (componentPath) { +util.getComponentDest = function (componentPath) { // eslint-disable-line return path.join(componentPath, 'min'); }; @@ -57,7 +68,7 @@ util.getComponentDest = function (componentPath) { * @returns an updated config object. */ util.processContextForHooks = function (context) { - // + // // Assemble the necessary environment variables for writing hooks // Create hooks context from context parameter. // Note that "ojet build" defines the .platform, .opts, and .buildType properties, @@ -80,6 +91,10 @@ util.processContextForHooks = function (context) { if (context.opts && context.opts.userOptions) { obj.userOptions = context.opts.userOptions; } + // requireJs properties can now be modified by the user in the before_optimize hook. + if (context.opts && context.opts.requireJs) { + obj.requireJs = context.opts.requireJs; + } } const config = require('./config'); // eslint-disable-line global-require obj.paths = config('paths'); @@ -767,13 +782,13 @@ util.cloneObject = function (original) { */ util.checkForHttpErrors = function (serverResponse, serverResponseBody, doBeforeErrorCallback) { // Log error for 4xx or 5xx http codes + // except of 401 (triggers authentication) const code = serverResponse.statusCode.toString(); - if (['4', '5'].indexOf(code.charAt(0)) > -1) { + if (code !== '401' && ['4', '5'].indexOf(code.charAt(0)) > -1) { if (typeof doBeforeErrorCallback === 'function') { doBeforeErrorCallback(); } let errors = ''; - let resp; try { resp = JSON.parse(serverResponseBody); @@ -856,6 +871,27 @@ util.getDefaultPlatform = () => { return 'web'; }; +/** + * ## getOraclejetConfigJson + * + * @public + * @returns {Object} | @throws + */ +util.getOraclejetConfigJson = () => { + const configFileName = CONSTANTS.ORACLE_JET_CONFIG_JSON; + const env = process.env; + + // Check cache + const cachedConfigObj = env.oraclejetConfigJson; + if (cachedConfigObj) { + return cachedConfigObj; + } + const configObj = util.readJsonAndReturnObject(`./${configFileName}`); + // Put to cache + env.oraclejetConfigJson = configObj; + return configObj; +}; + util.printList = (itemsInConfig, itemsByFolder) => { // Output variables const nameMaxLength = 30; @@ -941,9 +977,10 @@ util.readPathMappingJson = () => { * * @public * @param {string} path - * @returns {Object} object + * @param {boolean} [doNotThrowIfNotFound] + * @returns {Object} | @throws */ -util.readJsonAndReturnObject = function (pathToFile) { +util.readJsonAndReturnObject = function (pathToFile, doNotThrowIfNotFound) { // eslint-disable-line let object = {}; if (fs.existsSync(pathToFile)) { const file = fs.readFileSync(pathToFile, 'utf8'); @@ -953,20 +990,22 @@ util.readJsonAndReturnObject = function (pathToFile) { } catch (e) { util.log.error(`File '${pathToFile}' is not of type 'json'.`); } - } else { - util.log.error(`File path '${pathToFile}' not found.`); + return object; + } else if (doNotThrowIfNotFound) { + if (util.isVerbose()) { + util.log(`File '${pathToFile}' not found. Skipping.`); + } + return null; } - return object; + util.log.error(`File path '${pathToFile}' not found.`); }; /** * ## request - * https://nodejs.org/dist/latest-v6.x/docs/api/http.html - * https://nodejs.org/dist/latest-v6.x/docs/api/https.html * * @public - * @param {Object} [options] - List: https://nodejs.org/dist/latest-v6.x/docs/api/http.html#http_http_request_options_callback - * @param {string || undefined} [body] + * @param {Object|string} options - List: https://nodejs.org/api/http.html#http_http_request_url_options_callback + * @param {string|undefined} [body] * @param {Object} [multipartFormData] * @returns {Promise} */ @@ -974,31 +1013,33 @@ util.request = function (options, body, multipartFormData) { return new Promise((resolve, reject) => { let opts = options || {}; - let protocol = {}; + // HTTP/HTTPS request + // https://nodejs.org/api/http.html#http_http_request_url_options_callback + // https://nodejs.org/api/https.html#https_https_request_options_callback + + // Always add security option + opts.secure = util.getOptionsProperty('secure'); + + // Automatically Add Authorization header + // Except of the token request + if (opts.path !== '/auth/token') { + opts.headers = Object.assign(opts.headers || {}, { + Authorization: exchangeUtils.getAccessTokenFromFS() + }); + } - if (typeof opts === 'string') { - // Url case - const urlSplit = opts.split('://'); - protocol = urlSplit[0] === 'https:' ? https : http; + if (opts.useUrl) { + // Overwrite protocol, host, path, port etc. by values from provided url + opts = Object.assign(opts, url.parse(opts.useUrl)); } else { - // Options case // If exchange url defined, use it as the default - if (fs.existsSync(`./${CONSTANTS.ORACLE_JET_CONFIG_JSON}`)) { - const file = fs.readFileSync(`./${CONSTANTS.ORACLE_JET_CONFIG_JSON}`, 'utf8'); - const configObj = JSON.parse(file); - const exchangeUrl = configObj[CONSTANTS.EXCHANGE_URL_PARAM]; - if (exchangeUrl) { - process.env.exchangeUrl = exchangeUrl; - const defaults = url.parse(exchangeUrl); - if (defaults.path && opts.path) { - opts.path = (defaults.path + opts.path).replace('//', '/'); - } - opts = Object.assign(defaults, opts); - } + const defaults = url.parse(exchangeUtils.getExchangeUrl()); + if (defaults.path && opts.path) { + opts.path = (defaults.path + opts.path).replace('//', '/'); } - - protocol = opts.protocol === 'https:' ? https : http; + opts = Object.assign(defaults, opts); } + const protocol = _validateProtocol(opts.protocol, opts.secure); if (util.isVerbose()) { util.log('Request options:'); @@ -1017,7 +1058,23 @@ util.request = function (options, body, multipartFormData) { util.log(response.headers); } - resolve(response); + let responseBody = ''; + const buffer = []; + response.on('data', (respBody) => { + responseBody += respBody; + buffer.push(respBody); + }); + response.on('end', () => { + if (util.isVerbose()) { + util.log('Response body:'); + util.log(responseBody); + } + resolve({ + response, + responseBody, + buffer + }); + }); }); request.on('error', (error) => { @@ -1039,6 +1096,58 @@ util.request = function (options, body, multipartFormData) { }); }; +util.loginIfCredentialsProvided = () => { + const username = util.getOptionsProperty('username'); + const password = util.getOptionsProperty('password'); + + if (username && password) { + // Credentials were provided, get and store brand new access token + // even there might be a one (even valid) stored + return exchangeUtils.getAccessToken(username, password) + .then((authInfo) => { + exchangeUtils.writeAuthInfoToFS(util.convertJsonToObject(authInfo)); + }); + } + // Credentials not provided, just continue + return Promise.resolve(); +}; + +util.getOptionsProperty = (property) => { + const options = process.env.options; + if (options) { + return JSON.parse(options)[property]; + } + return null; +}; + +/** + * ## _checkProtocol + * + * @private + * @param {string} requestedProtocol - http || https + * @param {boolean} [secure='true'] - security option + * @returns {Object} | @throws - returns valid protocol or throws error + */ + +function _validateProtocol(requestedProtocol, secure) { // eslint-disable-line + // Cache secure options for the current session + const env = process.env; + let secureCopy; + // Check cache + if (env.secure) { + secureCopy = env.secure === 'true'; // Convert to boolean + } else { + secureCopy = typeof secure === 'undefined' ? true : secure; + // Cache + env.secure = secure; // Convert to string + } + + if (requestedProtocol === 'https:' || !secureCopy) { + return requestedProtocol === 'https:' ? https : http; + } + util.log.error('HTTP protocol is insecure. Please use HTTPS instead. At your own risk, you can force the HTTP protocol with the —secure=false or {secure: false} option.'); +} + /** * ## getLibVersionsObj * @@ -1085,48 +1194,6 @@ util.mapToSourceSkinName = function (skin) { } }; -/** - * ## fetchComponentMetadata - * - * @private - * @param {string} componentName - * @returns {Promise} - */ -util.fetchComponentMetadata = function (componentName) { - const config = require('./config'); // eslint-disable-line - const requestedVersion = util.getRequestedComponentVersion(componentName); - const plainComponentName = util.getPlainComponentName(componentName); - - const pathBase = `/components/${plainComponentName}`; - const requestPath = requestedVersion ? `${pathBase}/versions/${requestedVersion}` : pathBase; - return new Promise((resolve, reject) => { - util.log(`Fetching '${plainComponentName}' metadata from Exchange.`); - - util.request({ - path: requestPath, - }).then((response) => { - let responseBody = ''; - response.on('data', (respBody) => { - responseBody += respBody; - }); - response.on('end', () => { - util.checkForHttpErrors(response, responseBody); - - util.log(`Component '${plainComponentName}' metadata successfully fetched.`); - - const metadata = JSON.parse(responseBody); - - // Cache metadata - config(`${componentName}@${metadata.version}`, metadata); - resolve(metadata); - }); - }) - .catch((error) => { - reject(error); - }); - }); -}; - util.isPathCCA = function (filePath) { const jetCCA = new RegExp(CONSTANTS.JET_COMPOSITE_DIRECTORY); return jetCCA.test(filePath); @@ -1366,3 +1433,75 @@ util.getNpmPckgInitFileRelativePath = function (componentJson, buildType) { return retObj; }; +/** + * ## writeObjectAsJson + * + * @public + * @param {string} path + * @param {Object} object + */ +util.writeObjectAsJson = (filePath, object) => { + // Path validation + if (!filePath) { + util.log.error(`Missing path to write an object ${JSON.stringify(object)}`); + } + // Object validation - warning only, empty object written + if (util.isObjectEmpty(object)) { + util.log.warning(`Empty object written to ${filePath}`); + } + + const compiledObject = JSON.stringify(object || {}, null, 2); + try { + fs.writeFileSync(filePath, compiledObject); + } catch (error) { + util.log.error(`File '${filePath}' could not be written. More details: ${error}`); + } +}; +/* ## validGlobalTypescriptAvailable + * + * @private + * @return {boolean} + * + * Returns true of a valid global version of Typescript + * is available and false otherwise. + * + */ +util.validGlobalTypescriptAvailable = function () { + let version = null; + function isValidGlobalTypescript(_version) { + if (!_version) { + return false; + } + const [versionMajor, versionMinor] = _version.split('.'); + const [minMajor, minMinor] = CONSTANTS.MIN_TYPESCRIPT_VERSION.split('.'); + return versionMajor > minMajor || (versionMajor === minMajor && versionMinor >= minMinor); + } + return new Promise((resolve) => { + childProcess.exec('tsc -v', (error, stdout) => { + if (stdout && /^Version/.test(stdout)) { + version = (stdout.split(/\s+/)[1]).trim(); + if (!isValidGlobalTypescript(version)) { + util.log.error(`Please update your global Typescript to at least ${CONSTANTS.MIN_TYPESCRIPT_VERSION}.`); + } else { + resolve(true); + } + } else { + resolve(false); + } + }); + }); +}; + +/** + * ## isTypescriptFile + * + * @private + * @param {object} pathComponents + * @returns {boolean} + * Returns true if the file path refers to a + * Typescript file and false otherwise + */ +util.isTypescriptFile = function (pathComponents) { + return pathComponents.end.endsWith('.ts'); +}; + diff --git a/lib/utils.exchange.js b/lib/utils.exchange.js index f2fb25e..2825a5c 100644 --- a/lib/utils.exchange.js +++ b/lib/utils.exchange.js @@ -11,6 +11,8 @@ */ // Node const fs = require('fs'); +const FormData = require('form-data'); +const homedir = require('os').homedir(); const path = require('path'); const readline = require('readline'); const Writable = require('stream').Writable; @@ -28,33 +30,49 @@ const exchangeUtils = module.exports; let requestObject = {}; /** - * ## resolve + * ## getComponentMetadata * - * @public - * @param {string} changeType - * @param {Array} componentNames - * @param {Object} options + * @private + * @param {string} componentName * @returns {Promise} */ -exchangeUtils.resolve = function (changeType, componentNames, options) { - requestObject = { - // jetVersion: util.getJETVersion(), - config: _getConfig(), - environment: _getEnvironment(), - changes: { - [changeType]: {} - } - }; +exchangeUtils.getComponentMetadata = function (componentName) { + const requestedVersion = util.getRequestedComponentVersion(componentName); + const plainComponentName = util.getPlainComponentName(componentName); + const pathBase = `/components/${plainComponentName}`; + const requestPath = requestedVersion ? `${pathBase}/versions/${requestedVersion}` : pathBase; return new Promise((resolve, reject) => { - _getChanges(changeType, componentNames, options) - .then(_resolveDependencies) - .then((solutions) => { - resolve(solutions); - }) - .catch((error) => { - reject(error); - }); + util.log(`Fetching '${plainComponentName}' metadata from Exchange.`); + + util.request({ + path: requestPath + }) + .then((responseData) => { + const response = responseData.response; + const responseBody = responseData.responseBody; + return exchangeUtils.validateAuthenticationOfRequest( + response, + () => { return exchangeUtils.getComponentMetadata(componentName); }, // eslint-disable-line + () => { + util.checkForHttpErrors(response, responseBody); + + util.log(`Component '${plainComponentName}' metadata successfully fetched.`); + const metadata = util.convertJsonToObject(responseBody); + + // Cache metadata + const config = require('./config'); // eslint-disable-line + config(`${componentName}@${metadata.version}`, metadata); + return metadata; + } + ); + }) + .then((data) => { + resolve(data); + }) + .catch((error) => { + reject(error); + }); }); }; @@ -126,7 +144,7 @@ function _getChanges(changeType, componentNames, options) { const plainComponentName = util.getPlainComponentName(componentName); if (changeType === 'add' && options && options['pack-version']) { - util.fetchComponentMetadata(componentName) + exchangeUtils.getComponentMetadata(componentName) .then((metadata) => { // Add component to changes property requestObject.changes[changeType][plainComponentName] = requestedVersion || '*'; @@ -168,58 +186,56 @@ function _getChanges(changeType, componentNames, options) { } /** - * ## _resolveDependencies + * ## resolveDependencies * - * @private + * @public * @returns {Promise} */ -function _resolveDependencies() { +exchangeUtils.resolveDependencies = function () { return new Promise((resolve, reject) => { util.log('Resolving dependencies.'); + util.request({ method: 'PUT', path: '/dependencyResolver', headers: { Accept: 'application/json', 'Content-Type': 'application/json' - } + }, }, JSON.stringify(requestObject)) - .then((response) => { - let responseBody = ''; - response.on('data', (respBody) => { - responseBody += respBody; - }); - response.on('end', () => { - util.checkForHttpErrors(response, responseBody); - if (util.isVerbose()) { - util.log('Response body'); - util.log(responseBody); - } - const res = JSON.parse(responseBody); - if (res.solutions && res.solutions.length === 0) { - util.log.warning('Requested component(s)/version(s) or their dependencies cannot be found in Exchange or are in conflict with already installed components.'); - } else { - util.log('Dependencies resolved.'); - } - resolve(JSON.parse(responseBody)); - }); - response.on('error', (error) => { - reject(error); - }); + .then((responseData) => { + const response = responseData.response; + const responseBody = responseData.responseBody; + return exchangeUtils.validateAuthenticationOfRequest( + response, + () => { return exchangeUtils.resolveDependencies(); }, // eslint-disable-line + () => { + util.checkForHttpErrors(response, responseBody); + + const responseBodyCopy = util.convertJsonToObject(responseBody); + if (responseBodyCopy.solutions && responseBodyCopy.solutions.length === 0) { + util.log.warning('Requested component(s)/version(s) or their dependencies cannot be found in Exchange or are in conflict with already installed components.'); + } else { + util.log('Dependencies resolved.'); + } + return responseBodyCopy; + }); + }) + .then((resp) => { + resolve(resp); }) .catch((error) => { reject(error); }); }); -} +}; /** - * ## _getAccessToken + * ## getAccessToken * * @private * @param {string} user * @param {string} pass - * @param {function} callback * @returns {Promise} */ exchangeUtils.getAccessToken = function (user, pass) { @@ -228,43 +244,76 @@ exchangeUtils.getAccessToken = function (user, pass) { // CLI case - Resource Owner Password Credentials Grant Type return new Promise((resolve, reject) => { - const body = `username=${user}&password=${pass}`; + const basicAuthCredentials = `${user || ''}:${pass || ''}`; + const credentialsBuffer = new Buffer.from(basicAuthCredentials); // eslint-disable-line + const base64data = credentialsBuffer.toString('base64'); util.request({ - method: 'POST', + method: 'GET', path: '/auth/token', headers: { - 'Content-Type': 'application/x-www-form-urlencoded' + Authorization: `Basic ${base64data}` } - }, body) - .then((response) => { - let responseBody = ''; - response.on('data', (respBody) => { - responseBody += respBody; - }); - response.on('end', () => { - if (util.isVerbose()) { - util.log('Access token:'); - util.log(responseBody); - } - util.checkForHttpErrors(response, responseBody); - resolve(responseBody); - }); - }) - .catch((error) => { - reject(error); - }); + }) + .then((responseData) => { + const response = responseData.response; + const responseBody = responseData.responseBody; + + if (util.isVerbose()) { + util.log('Access token:'); + util.log(responseBody); + } + + util.checkForHttpErrors(response, responseBody); + // ToDo: post 7.2 repeat login instead throwing + if (response.statusCode === 401) { + util.log.error('Authorization failed. Please try signing in again.'); + } + resolve(responseBody); + }) + .catch((error) => { + reject(error); + }); }); }; +exchangeUtils.getAccessTokenFromFS = () => { + const authInfo = exchangeUtils.readAuthInfoFromFS(); + return util.isObjectEmpty(authInfo) ? '' : `${authInfo.token_type} ${authInfo.access_token}`; +}; + /** - * ## _login + * ## getExchangeUrl + * + * @public + * @returns {string} | @throws + */ +exchangeUtils.getExchangeUrl = () => { + const env = process.env; + // Check cache + const cachedExchangeUrl = env.exchangeUrl; + if (cachedExchangeUrl) { + return cachedExchangeUrl; + } + const configObj = util.getOraclejetConfigJson(); + const exchangeUrl = configObj[CONSTANTS.EXCHANGE_URL_PARAM]; + if (exchangeUrl) { + // Put to cache + env.exchangeUrl = exchangeUrl; + return exchangeUrl; + } + util.log.error('Exchange not configured. Please configure with \'ojet configure --exchange-url=\'.'); + return false; +}; + +/** + * ## login * * @private * @returns {Promise} */ exchangeUtils.login = function () { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { const mutableStdout = new Writable({ write(chunk, encoding, cb) { if (!this.muted) { @@ -287,12 +336,234 @@ exchangeUtils.login = function () { rl.close(); exchangeUtils.getAccessToken(user, pass) - .then((accessToken) => { - util.log('Access token successfully retrieved.'); - resolve(accessToken); + .then((response) => { + if (util.isVerbose()) { + util.log('Access token successfully retrieved.'); + } + resolve(response); + }) + .catch((error) => { + reject(error); }); }); mutableStdout.muted = true; }); }); }; + +/** + * ## readAccessTokenFromFile + * + * @public + * @returns Object | @throws + */ +exchangeUtils.readAuthInfoFromFS = () => { + const env = process.env; + const exchangeUrl = exchangeUtils.getExchangeUrl(); + + const cachedAccessTokenMap = env.accessTokenMap; + if (cachedAccessTokenMap) { + return JSON.parse(cachedAccessTokenMap)[exchangeUrl]; + } + const accessTokenMap = util.readJsonAndReturnObject( + path.join(homedir, CONSTANTS.EXCHANGE_TOKEN_STORE_DIR, CONSTANTS.EXCHANGE_TOKEN_STORE_FILE), + true + ); + if (accessTokenMap && accessTokenMap[exchangeUrl]) { + // Token storage file already exists + // Cache + env.accessTokenMap = JSON.stringify(accessTokenMap); + return accessTokenMap[exchangeUrl]; + } + // Token storage file does not exist + return {}; +}; + +/** + * ## resolve + * + * @public + * @param {string} changeType + * @param {Array} componentNames + * @param {Object} options + * @returns {Promise} + */ +exchangeUtils.resolve = function (changeType, componentNames, options) { + requestObject = { + // jetVersion: util.getJETVersion(), + config: _getConfig(), + environment: _getEnvironment(), + changes: { + [changeType]: {} + } + }; + + return new Promise((resolve, reject) => { + _getChanges(changeType, componentNames, options) + .then(exchangeUtils.resolveDependencies) + .then((solutions) => { + resolve(solutions); + }) + .catch((error) => { + reject(error); + }); + }); +}; + +/** + * ## updateAuthInfo + * + * @public + * @param {Object} serverResponse + */ +exchangeUtils.updateAuthInfoFromResponseHeaders = (serverResponse) => { + const authInfo = exchangeUtils.readAuthInfoFromFS(); + + const headers = serverResponse.headers; + const nextTokenHeaderName = CONSTANTS.EXCHANGE_HEADER_NEXT_TOKEN; + const tokenExpirationHeaderName = CONSTANTS.EXCHANGE_HEADER_NEXT_TOKEN_EXPIRATION; + if (headers) { + if (headers[nextTokenHeaderName]) { + const tokenSplit = headers[nextTokenHeaderName].split(' '); + authInfo[CONSTANTS.EXCHANGE_AUTH_ACCESS_TOKEN] = tokenSplit[1]; + } + if (headers[tokenExpirationHeaderName]) { + authInfo[CONSTANTS.EXCHANGE_AUTH_EXPIRATION] = headers[tokenExpirationHeaderName]; + } + + // Write to FS if any change detected + if (headers[nextTokenHeaderName] || headers[tokenExpirationHeaderName]) { + exchangeUtils.writeAuthInfoToFS(authInfo); + } + } +}; + +/** + * ## uploadToExchange + * + * @public + * @param {string} componentName + * @param {Object} options + * @returns {Promise} + */ +exchangeUtils.uploadToExchange = function (componentName, options) { + return new Promise((resolve, reject) => { + const compName = options.pack ? `'${componentName}' of a pack '${options.pack}'` : `'${componentName}'`; + + util.log(`Uploading ${compName} archive to Exchange.`); + const archivePath = './component.zip'; + + // Sending multipart form data + // https://www.npmjs.com/package/form-data#alternative-submission-methods + const multipart = new FormData(); + multipart.append('file', fs.createReadStream('./component.zip')); + + const multipartHeaders = multipart.getHeaders(); + + util.request({ + method: 'POST', + headers: multipartHeaders, + path: '/components?access=PUBLIC', + }, undefined, multipart) + .then((responseData) => { + const response = responseData.response; + return exchangeUtils.validateAuthenticationOfRequest( + response, + () => { return exchangeUtils.uploadToExchange(componentName, options); }, // eslint-disable-line + () => { + util.checkForHttpErrors(response, responseData.responseBody, () => { + util.deleteFile(archivePath); + }); + + const resolvedComponentName = options.pack ? `'${componentName}' of a pack '${options.pack}'` : `'${componentName}'`; + util.log(`Component ${resolvedComponentName} was successfully uploaded to Exchange.`); + util.deleteFile(archivePath); + } + ); + }) + .then(() => { + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); +}; + +/** + * ## validateAuthenticationErrorCode + * + * @public + * @param {Object} serverResponse + * @returns {Promise} + */ +exchangeUtils.validateAuthenticationErrorCode = function (serverResponse) { + return new Promise((resolve, reject) => { + if (serverResponse.statusCode === 401) { + // Unauthenticated, offer to login + exchangeUtils.login() + .then((accessToken) => { // eslint-disable-line + return exchangeUtils.writeAuthInfoToFS(util.convertJsonToObject(accessToken)); + }) + .then(() => { + resolve(true); + }) + .catch((error) => { + reject(error); + }); + } else { + // Do nothing, everything's good + resolve(false); + } + }); +}; + +/** + * ## validateAuthenticationOfRequest + * + * @public + * @param {Object} response + * @param {Object} methodToRepeatIfNotAuthenticated + * @param {function} callback + * @returns {Promise} + */ +exchangeUtils.validateAuthenticationOfRequest = ( + response, + methodToRepeatIfNotAuthenticated, + callback +) => { // eslint-disable-line + return exchangeUtils.validateAuthenticationErrorCode(response) + .then((authenticationErrorAppeared) => { + if (authenticationErrorAppeared) { + if (util.isVerbose()) { + util.log('Request required authentication. Repeating request.'); + } + + // Trigger request again + return methodToRepeatIfNotAuthenticated(); + } + if (util.isVerbose()) { + util.log('Request was successfully authenticated.'); + } + // Execute successful follow-up promise chain + exchangeUtils.updateAuthInfoFromResponseHeaders(response); + return callback(); + }); +}; + +exchangeUtils.writeAuthInfoToFS = (authResponse) => { + const storeDir = path.join(homedir, CONSTANTS.EXCHANGE_TOKEN_STORE_DIR); + util.ensureDir(storeDir); + const pathToFile = path.join(storeDir, CONSTANTS.EXCHANGE_TOKEN_STORE_FILE); + const accessTokenMap = util.readJsonAndReturnObject(pathToFile, true) || {}; + const exchangeUrl = exchangeUtils.getExchangeUrl(); + + // accessTokenMap[exchangeUrl] = accessTokenMap[exchangeUrl] ? accessTokenMap[exchangeUrl] || {} + accessTokenMap[exchangeUrl] = Object.assign(accessTokenMap[exchangeUrl] || {}, authResponse); + + // Write file + util.writeObjectAsJson(pathToFile, accessTokenMap); + + // Cache new map (so that 'reads' do not need to use File System) + process.env.accessTokenMap = JSON.stringify(accessTokenMap); +}; diff --git a/oraclejet-tooling.js b/oraclejet-tooling.js index f0a7626..8bbe191 100644 --- a/oraclejet-tooling.js +++ b/oraclejet-tooling.js @@ -32,6 +32,7 @@ const CONSTANTS = require('./lib/constants'); CONSTANTS.API_TASKS.PUBLISH, CONSTANTS.API_TASKS.REMOVE, CONSTANTS.API_TASKS.SEARCH, + CONSTANTS.API_TASKS.ADDTYPESCRIPT, 'serve', 'strip' ].forEach((name) => { diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index e85ccd7..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2624 +0,0 @@ -{ - "name": "@oracle/oraclejet-tooling", - "version": "7.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "archiver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", - "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^1.2.0" - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "body": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", - "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", - "requires": { - "continuable-cache": "^0.3.1", - "error": "^7.0.0", - "raw-body": "~1.1.0", - "safe-json-parse": "~1.0.1" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "requires": { - "chalk": "^1.1.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" - }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - } - }, - "connect-livereload": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", - "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==" - }, - "continuable-cache": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", - "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "requires": { - "buffer": "^5.1.0" - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^2.1.2", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-selector-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.3.0.tgz", - "integrity": "sha1-XxrUPi2O77/cME/NOaUhZklD4+s=" - }, - "css-tree": { - "version": "1.0.0-alpha.33", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", - "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.5.3" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "cssmin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.4.3.tgz", - "integrity": "sha1-yRlAd+Dr2s1pHV9ZAVudgZ840BU=" - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" - } - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.x" - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "env-variable": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", - "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "requires": { - "pend": "~1.2.0" - } - }, - "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.0.tgz", - "integrity": "sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { - "colornames": "^1.1.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "livereload-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", - "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash._arraymap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraymap/-/lodash._arraymap-3.0.0.tgz", - "integrity": "sha1-Go/Q9MDfS2HeoHbXF83Jfwo8PmY=" - }, - "lodash._basecallback": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", - "integrity": "sha1-t7K7Q9whYEJKIczybFfkQ3cqjic=", - "requires": { - "lodash._baseisequal": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.pairs": "^3.0.0" - } - }, - "lodash._baseeach": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", - "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", - "requires": { - "lodash.keys": "^3.0.0" - } - }, - "lodash._baseget": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/lodash._baseget/-/lodash._baseget-3.7.2.tgz", - "integrity": "sha1-G2rh1frPPCVTI1ChPBGXy4u2dPQ=" - }, - "lodash._baseisequal": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", - "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", - "requires": { - "lodash.isarray": "^3.0.0", - "lodash.istypedarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._topath": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/lodash._topath/-/lodash._topath-3.8.1.tgz", - "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", - "requires": { - "lodash.isarray": "^3.0.0" - } - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "lodash.istypedarray": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", - "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.map": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-3.1.4.tgz", - "integrity": "sha1-tIOs0beGxce0ksSV97UmYim8AMI=", - "requires": { - "lodash._arraymap": "^3.0.0", - "lodash._basecallback": "^3.0.0", - "lodash._baseeach": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" - }, - "lodash.pairs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", - "integrity": "sha1-u+CNV4bu6qCaFckevw3LfSvjJqk=", - "requires": { - "lodash.keys": "^3.0.0" - } - }, - "lodash.pluck": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.pluck/-/lodash.pluck-3.1.2.tgz", - "integrity": "sha1-s0fwN0wBafDusE1nLYnOyGMsIjE=", - "requires": { - "lodash._baseget": "^3.0.0", - "lodash._topath": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.map": "^3.0.0" - } - }, - "lodash.remove": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.remove/-/lodash.remove-4.7.0.tgz", - "integrity": "sha1-8x0x58OaBpDVB07A02JxYjNO5iY=" - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mustache": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz", - "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA==" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" - }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "prettysize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-1.1.0.tgz", - "integrity": "sha512-U5Noa+FYV1dGkICyLJz8IWlDUehPF4Bk9tZRO8YqPhLA9EoiHuFqtnpWY2mvMjHh5eOLo82HipeLn4RIiSsGqQ==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - }, - "psl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", - "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", - "requires": { - "bytes": "1", - "string_decoder": "0.10" - }, - "dependencies": { - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "requires": { - "throttleit": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "requirejs": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", - "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-json-parse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", - "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=" - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-sprite": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/svg-sprite/-/svg-sprite-1.5.0.tgz", - "integrity": "sha512-0mE5BLY3K8wg3+HrYfzpiKbIM44IGcg8uINED8ri22EdQbLvGecOHjRtkrNAlphbiU5kyGyqoBlIaukL45fs2Q==", - "requires": { - "async": "^2.6.1", - "css-selector-parser": "^1.3.0", - "cssmin": "^0.4.3", - "cssom": "^0.3.4", - "dateformat": "^3.0.3", - "glob": "^7.1.3", - "js-yaml": "^3.12.0", - "lodash": "^4.17.11", - "lodash.pluck": "^3.1.2", - "mkdirp": "^0.5.1", - "mocha": "^5.2.0", - "mustache": "^3.0.0", - "phantomjs-prebuilt": "^2.1.16", - "prettysize": "^1.1.0", - "should": "^13.2.3", - "svgo": "^1.1.1", - "vinyl": "^2.2.0", - "winston": "^3.1.0", - "xmldom": "0.1.27", - "xpath": "^0.0.27", - "yargs": "^12.0.2" - }, - "dependencies": { - "svgo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", - "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.33", - "csso": "^3.5.1", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - } - } - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - }, - "dependencies": { - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "requires": { - "q": "^1.1.2" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" - }, - "tiny-lr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", - "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", - "requires": { - "body": "^5.1.0", - "debug": "^3.1.0", - "faye-websocket": "~0.10.0", - "livereload-js": "^2.3.0", - "object-assign": "^4.1.0", - "qs": "^6.4.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", - "requires": { - "readable-stream": "^2.3.6", - "triple-beam": "^1.2.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" - }, - "xpath": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "requires": { - "fd-slicer": "~1.0.1" - } - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } - } - } -} diff --git a/package.json b/package.json index 6d131a5..73f77b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@oracle/oraclejet-tooling", - "version": "7.1.1", + "version": "7.2.0", "license": "UPL-1.0", "description": "Programmatic API to build and serve Oracle JET web and mobile applications", "keywords": [ @@ -24,20 +24,20 @@ "requirejs": "^2.2.0", "uglify-es": "^3.3.5", "gaze": "^1.1.2", - "js-yaml": "~3.13.0", + "js-yaml":"~3.13.0", "connect": "^3.5.0", "connect-livereload": "^0.6.0", "tiny-lr": "^1.0.3", "serve-static": "^1.11.1", "serve-index": "^1.8.0", "opn": "^4.0.2", - "svgo": "1.2.2", + "svgo": "~1.2.2", "svg-sprite": "^1.3.7", "archiver": "^2.1.1", "extract-zip": "^1.6.6", "form-data": "^2.3.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.0.0" } }