From 26f25fde65c94acc871fc9f1f18dedfef25eb2fc Mon Sep 17 00:00:00 2001 From: Frank Weigel Date: Tue, 26 Jun 2018 22:08:49 +0200 Subject: [PATCH] [WIP] Task to create JSDoc for a library, using the UI5 template/plugin Note: the code is full of console.log just to track down an unexpected exit of the Node.js process. --- lib/builder/builder.js | 1 + lib/processors/jsdoc/create-api-index.js | 270 ++ lib/processors/jsdoc/dummy-child.js | 5 + .../jsdoc/jsdoc-config-template.json | 23 + lib/processors/jsdoc/jsdoc.js | 128 + .../jsdoc/transform-apijson-for-sdk.js | 1732 +++++++ lib/processors/jsdoc/ui5/plugin.js | 2321 ++++++++++ lib/processors/jsdoc/ui5/template/publish.js | 4056 +++++++++++++++++ lib/tasks/createJSDoc.js | 29 + lib/types/library/LibraryBuilder.js | 19 + package-lock.json | 3531 +++++++------- package.json | 4 +- 12 files changed, 10353 insertions(+), 1766 deletions(-) create mode 100644 lib/processors/jsdoc/create-api-index.js create mode 100644 lib/processors/jsdoc/dummy-child.js create mode 100644 lib/processors/jsdoc/jsdoc-config-template.json create mode 100644 lib/processors/jsdoc/jsdoc.js create mode 100644 lib/processors/jsdoc/transform-apijson-for-sdk.js create mode 100644 lib/processors/jsdoc/ui5/plugin.js create mode 100644 lib/processors/jsdoc/ui5/template/publish.js create mode 100644 lib/tasks/createJSDoc.js diff --git a/lib/builder/builder.js b/lib/builder/builder.js index aadb1d81b..9017ddb61 100644 --- a/lib/builder/builder.js +++ b/lib/builder/builder.js @@ -6,6 +6,7 @@ const definedTasks = { replaceCopyright: require("../tasks/replaceCopyright"), replaceVersion: require("../tasks/replaceVersion"), createDebugFiles: require("../tasks/createDebugFiles"), + createJSDoc: require("../tasks/createJSDoc"), uglify: require("../tasks/uglify"), buildThemes: require("../tasks/buildThemes"), generateVersionInfo: require("../tasks/generateVersionInfo"), diff --git a/lib/processors/jsdoc/create-api-index.js b/lib/processors/jsdoc/create-api-index.js new file mode 100644 index 000000000..b68357dde --- /dev/null +++ b/lib/processors/jsdoc/create-api-index.js @@ -0,0 +1,270 @@ +/* + * Node script to create cross-library API index files for use in the UI5 SDKs. + * + * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. + * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. + */ + +"use strict"; +const fs = require("fs"); +const path = require("path"); + +function process(versionInfoFile, unpackedTestresourcesRoot, targetFile, targetFileDeprecated, targetFileExperimental, targetFileSince) { + + console.log("[INFO] creating API index files"); + console.log("[INFO] sap-ui-version.json: " + versionInfoFile); + console.log("[INFO] unpacked test-resources: " + unpackedTestresourcesRoot); + console.log("[INFO] target file: " + targetFile); + console.log("[INFO] target file deprecated: " + targetFileDeprecated); + console.log("[INFO] target file experimental: " + targetFileExperimental); + console.log("[INFO] target file since: " + targetFileSince); + console.log("[INFO]"); + + // Deprecated, Experimental and Since collections + let oListCollection = { + deprecated: { + noVersion: { + apis: [] + } + }, + experimental: { + noVersion: { + apis: [] + } + }, + since: { + noVersion: { + apis: [] + } + } + }; + + function readJSONFile(file) { + return new Promise(function (resolve, reject) { + fs.readFile(file, 'utf8', function (err, data) { + if (err) { + reject(err); + } else { + // Handle empty files scenario + if (data.trim() === "") { + resolve({}); + } else { + resolve(JSON.parse(String(data))); + } + } + }); + }); + } + + function mkdirSync(dir) { + if (dir && !fs.existsSync(dir)) { + mkdirSync( path.dirname(dir) ); + fs.mkdirSync(dir); + } + } + + function writeJSON(file, content) { + return new Promise(function(resolve,reject) { + // Create dir if it does not exist + mkdirSync( path.dirname(file) ); + fs.writeFile(file, JSON.stringify(content), "utf-8", function(err) { + if ( err ) { + reject(err); + return; + } + resolve(true); + }); + }); + } + + /* + * Extracts main symbol information from a library api.json. + * Also collects deprecated, experimental and since api's. + * Returns a promise that resolves with an array of symbols. + */ + function createSymbolSummaryForLib(lib) { + let file = path.join(unpackedTestresourcesRoot, lib.replace(/\./g, "/"), "designtime/api.json"); + + return readJSONFile(file).then(function (apijson) { + if (!apijson.hasOwnProperty("symbols") || !Array.isArray(apijson.symbols)) { + // Ignore libraries with invalid api.json content like empty object or non-array "symbols" property. + return []; + } + return apijson.symbols.map(symbol => { + collectLists(symbol); + return { + name: symbol.name, + kind: symbol.kind, + visibility: symbol.visibility, + extends: symbol.extends, + implements: symbol.implements, + lib: lib + }; + }); + }) + } + + /* + * Collects Deprecated, Experimental and Since data from passed symbol + * including symbol itself, methods and events. + */ + function collectLists(oSymbol) { + + function addData(oDataType, oEntityObject, sObjectType, sSymbolName) { + let sSince = oDataType !== "since" ? oEntityObject[oDataType].since : oEntityObject.since, + oData = { + control: sSymbolName, + text: oEntityObject[oDataType].text || oEntityObject.description, + type: sObjectType, + "static": !!oEntityObject.static, + visibility: oEntityObject.visibility + }; + + // For class we skip entityName + if (sObjectType !== "class") { + oData.entityName = oEntityObject.name; + } + + if (sSince) { + // take only major and minor versions + let sVersion = sSince.split(".").slice(0, 2).join("."); + + oData.since = sSince; + + if (!oListCollection[oDataType][sVersion]) { + oListCollection[oDataType][sVersion] = { + name: sVersion, + apis: [] + }; + } + + oListCollection[oDataType][sVersion].apis.push(oData); + } else { + oListCollection[oDataType].noVersion.apis.push(oData); + } + } + + // Classes + if (oSymbol.deprecated) { + addData("deprecated", oSymbol, "class", oSymbol.name); + } + + if (oSymbol.experimental) { + addData("experimental", oSymbol, "class", oSymbol.name); + } + + if (oSymbol.since) { + addData("since", oSymbol, "class", oSymbol.name); + } + + // Methods + oSymbol.methods && oSymbol.methods.forEach(oMethod => { + if (oMethod.deprecated) { + addData("deprecated", oMethod, "methods", oSymbol.name); + } + + if (oMethod.experimental) { + addData("experimental", oMethod, "methods", oSymbol.name); + } + + if (oMethod.since) { + addData("since", oMethod, "methods", oSymbol.name); + } + }); + + // Events + oSymbol.events && oSymbol.events.forEach(oEvent => { + if (oEvent.deprecated) { + addData("deprecated", oEvent, "events", oSymbol.name); + } + + if (oEvent.experimental) { + addData("experimental", oEvent, "events", oSymbol.name); + } + + if (oEvent.since) { + addData("since", oEvent, "events", oSymbol.name); + } + }); + + } + + function deepMerge(arrayOfArrays) { + return arrayOfArrays.reduce((array, items) => { + array.push.apply(array, items); + return array; + }, []); + } + + function expandHierarchyInfo(symbols) { + let byName = new Map(); + symbols.forEach(symbol => { + byName.set(symbol.name, symbol); + }); + symbols.forEach(symbol => { + let parent = symbol.extends && byName.get(symbol.extends); + if (parent) { + parent.extendedBy = parent.extendedBy ||  []; + parent.extendedBy.push(symbol.name); + } + if (symbol.implements) { + symbol.implements.forEach(intfName => { + let intf = byName.get(intfName); + if (intf) { + intf.implementedBy = intf.implementedBy ||  []; + intf.implementedBy.push(symbol.name); + } + }); + } + }); + return symbols; + } + + function createOverallIndex() { + let version = "0.0.0"; + + var p = readJSONFile(versionInfoFile) + .then(versionInfo => { + version = versionInfo.version; + return Promise.all( + versionInfo.libraries.map( + lib => createSymbolSummaryForLib(lib.name).catch(err => { + // ignore 'file not found' errors as some libs don't have an api.json (themes, server libs) + if (err.code === 'ENOENT') { + return []; + } + throw err; + }) + ) + ); + }) + .then(deepMerge) + .then(expandHierarchyInfo) + .then(symbols => { + let result = { + "$schema-ref": "http://schemas.sap.com/sapui5/designtime/api.json/1.0", + version: version, + library: "*", + symbols: symbols + }; + return writeJSON(targetFile, result); + }) + .then(() => Promise.all([ + // write deprecated, experimental and since collections in the respective index files + writeJSON(targetFileDeprecated, oListCollection.deprecated), + writeJSON(targetFileExperimental, oListCollection.experimental), + writeJSON(targetFileSince, oListCollection.since) + ])) + .catch(err => { + console.error("**** failed to create API index for libraries:", err) + throw err; + }); + + return p; + } + + return createOverallIndex(); + +} + +module.exports = process; diff --git a/lib/processors/jsdoc/dummy-child.js b/lib/processors/jsdoc/dummy-child.js new file mode 100644 index 000000000..64a4a6727 --- /dev/null +++ b/lib/processors/jsdoc/dummy-child.js @@ -0,0 +1,5 @@ +console.log('child executing'); +setTimeout(function() { + console.log("child done"); + //process.exit(0); +},20000); diff --git a/lib/processors/jsdoc/jsdoc-config-template.json b/lib/processors/jsdoc/jsdoc-config-template.json new file mode 100644 index 000000000..52569ef4c --- /dev/null +++ b/lib/processors/jsdoc/jsdoc-config-template.json @@ -0,0 +1,23 @@ +{ + "source": { + "excludePattern": "(/|\\\\)library-all\\.js|(/|\\\\).*-preload\\.js|^jquery-.*\\.js|^sap-.*\\.js" + }, + "opts" : { + "recurse": true, + "template" : "lib/jsdoc/ui5/template" + }, + "plugins": [ + "lib/jsdoc/ui5/plugin.js" + ], + "templates" : { + "ui5" : { + "variants": [ + "apijson" + ], + "version": "${version}", + "apiJsonFolder": "${apiJsonFolder}", + "apiJsonFile": "${apiJsonFile}", + "includeSettingsInConstructor": false + } + } +} diff --git a/lib/processors/jsdoc/jsdoc.js b/lib/processors/jsdoc/jsdoc.js new file mode 100644 index 000000000..8cc13afd7 --- /dev/null +++ b/lib/processors/jsdoc/jsdoc.js @@ -0,0 +1,128 @@ +const spawn = require('cross-spawn').spawn; +const fs = require('fs'); +const path = require('path'); +const tmp = require('tmp'); +const resourceFactory = require("@ui5/fs").resourceFactory; + +function createJSDocConfig({source, target, namespace, libraryName, version}) { + // resolve path to the package.json to get the path to the jsdocext folder + const jsdocext = path.normalize(__dirname); + + const config = `{ + "plugins": ["${jsdocext}/ui5/plugin.js"], + "opts": { + "recurse": true, + "lenient": true, + "template": "${jsdocext}/ui5/template", + "ui5": { + "saveSymbols": true + } + }, + "templates": { + "ui5": { + "variants": [ "apijson", "fullapixml", "apijs", "api.xml"], + "version": "${version}", + "jsapiFile": "${target}/libraries/${libraryName}.js", + "apiJsonFolder": "${target}/dependency-apis", + "apiJsonFile": "${target}/test-resources/${namespace}/designtime/api.json" + } + } + }`; + console.log(config); + return config; +} + +function jsdoc({sources, target, namespace, libraryName, version}) { + + const tmpobj = tmp.fileSync(); + fs.writeFileSync(tmpobj.name, createJSDocConfig({target, namespace, libraryName, version}), 'utf8'); // TODO async + promise + + console.log("jsdoc called for ", sources); + var args = [ + require.resolve("jsdoc/jsdoc"), + '-c', + tmpobj.name, + '--verbose' + ]; + args = args.concat(sources); + + return new Promise((resolve, reject) => { + const child = spawn('node', args); + child.stdout.on('data', function(data) { + console.log(String(data)); + }); + child.stderr.on('data', function(data) { + console.error(String(data)); + }); + child.on('exit', function(code) { + var resolvedDest; + console.log("jsdoc exited with code ", code); + if (code === 0 || code === 1) { + resolve(code); + } else { + reject(code) + } + }); + }); +} + +/** + * Creates *-dbg.js files for all JavaScript-resources supplied and writes them to target locator. + * + * @module build/processors/dbg + * + * @param {Object} parameters Parameters + * @param {Array} parameters.resources List of resources to be processed + * @param {ResourceLocatorCollection} parameters.sourceLocator Source locator + * @param {ResourceLocator} parameters.targetLocator Target locator + * @param {Object} [parameters.config] Configuration + * @return {Promise} Promise resolving with undefined once data has been written to the target locator + */ +module.exports = function({resources, options}) { + if ( !options.libraryName ) { + throw new TypeError("Cannot execute JSDoc build without a library name"); + } + const namespace = options.libraryName.replace(/\./g, "/"); + const tmpDirObj = tmp.dirSync(); + const tmpSourceDir = path.join(tmpDirObj.name, 'src'); + const tmpTargetDir = path.join(tmpDirObj.name, 'target'); + + const fsSources = resourceFactory.createAdapter({ + fsBasePath: tmpSourceDir, + virBasePath: "/resources/" + }); + const fsTarget = resourceFactory.createAdapter({ + fsBasePath: tmpTargetDir, + virBasePath: "/" + }); + + //return Promise.resolve([]); + + return Promise.all( + // write all resources to the tmp folder + resources.map((resource) => fsSources.write(resource)) + // after this step, a follow-up step aborts silenty for an unknown reasons + // cloning the resources before writing them avoids the problem: + // resources.map((resource) => resource.clone().then((resource) => fsSources.write(resource))) + ).then(() => [], (err) => { + console.log(err); + return []; + }).then((files) => { + return jsdoc({ + sources: [tmpSourceDir], + target: tmpTargetDir, + namespace, + libraryName: options.libraryName, + version: options.version + }); + }).then(() => { + // create resources from the output files + return Promise.all([ + fsTarget.byPath(`/test-resources/${namespace}/designtime/api.json`) + //,fsTarget.byPath(`/libraries/${options.libraryName}.js`) + ]).then((res) => res.filter($=>$)); + }).then((result) => { + // TODO cleanup tmp dir + return result; + }); +}; diff --git a/lib/processors/jsdoc/transform-apijson-for-sdk.js b/lib/processors/jsdoc/transform-apijson-for-sdk.js new file mode 100644 index 000000000..f4f3a8544 --- /dev/null +++ b/lib/processors/jsdoc/transform-apijson-for-sdk.js @@ -0,0 +1,1732 @@ +/* + * Node script to preprocess api.json files for use in the UI5 SDKs. + * + * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. + * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. + */ + +"use strict"; +const fs = require("fs"); +const cheerio = require("cheerio"); +const path = require('path'); + +module.exports = function transformer(sInputFile, sOutputFile, sLibraryFile) { + + console.log("[INFO] Transform API index files for sap.ui.documentation"); + console.log("[INFO] original file: " + sInputFile); + console.log("[INFO] output file: " + sOutputFile); + console.log("[INFO]"); + + /** + * Transforms api.json file + * @param {object} oChainObject chain object + */ + let transformApiJson = function (oChainObject) { + function isBuiltInType(type) { + return formatters._baseTypes.indexOf(type) >= 0; + } + + /** + * Heuristically determining if there is a possibility the given input string + * to be a UI5 symbol + * @param {string} sName + * @returns {boolean} + */ + function possibleUI5Symbol(sName) { + return /^[a-zA-Z][a-zA-Z.]*[a-zA-Z]$/.test(sName); + } + + // Function is a copy from: LibraryInfo.js => LibraryInfo.prototype._getActualComponent => "match" inline method + function matchComponent(sModuleName, sPattern) { + sModuleName = sModuleName.toLowerCase(); + sPattern = sPattern.toLowerCase(); + return ( + sModuleName === sPattern + || sPattern.match(/\*$/) && sModuleName.indexOf(sPattern.slice(0,-1)) === 0 // simple prefix match + || sPattern.match(/\.\*$/) && sModuleName === sPattern.slice(0,-2) // directory pattern also matches directory itself + ); + } + + // Transform to object + let oData = JSON.parse(oChainObject.fileData); + + // Attach default component for the library if available + if (oChainObject.defaultComponent) { + oData.defaultComponent = oChainObject.defaultComponent; + } + + // Populate methods.aTreeContent for later use for symbol children if applicable + // NOTE: This will inject missing root sub_namespace entries in oData.symbols array!!! + methods._parseLibraryElements(oData.symbols); + + // Apply formatter's and modify data as needed + oData.symbols.forEach((oSymbol) => { + + // when the module name starts with the library name, then we apply the default component + if (oSymbol.name.indexOf(oData.library) === 0) { + oSymbol.component = oChainObject.defaultComponent; + } + + // Attach symbol specific component if available (special cases) + // Note: Last hit wins as there may be a more specific component pattern + if (oChainObject.customSymbolComponents) { + Object.keys(oChainObject.customSymbolComponents).forEach(sComponent => { + if (matchComponent(oSymbol.name, sComponent)) { + oSymbol.component = oChainObject.customSymbolComponents[sComponent]; + } + }); + } + + // Attach symbol sample flag if available + if (oChainObject.entitiesWithSamples) { + oSymbol.hasSample = oChainObject.entitiesWithSamples.indexOf(oSymbol.name) >= 0; + } + + // Apply settings to formatter object - needed until formatter's are rewritten + formatters._sTopicId = oSymbol.name; + formatters._oTopicData = oSymbol; + + // Format Page Title + oSymbol.title = (oSymbol.abstract ? "abstract " : "") + oSymbol.kind + " " + oSymbol.name; + oSymbol.subTitle = formatters.formatSubtitle(oSymbol.deprecated); + + // Symbol children + let aControlChildren = methods._getControlChildren(oSymbol.name); + if (aControlChildren) { + oSymbol.nodes = aControlChildren; + methods._addChildrenDescription(oData.symbols, oSymbol.nodes); + } + + // Constructor + if (oSymbol.constructor) { + let oConstructor = oSymbol.constructor; + + // Description + if (oConstructor.description) { + oConstructor.description = formatters.formatDescription(oConstructor.description); + } + + // References + methods.modifyReferences(oSymbol); + + // Examples + if (oConstructor.examples) { + oConstructor.examples.forEach((oExample) => { + oExample.data = formatters.formatExample(oExample.caption, oExample.text); + + // Keep file size in check + if (oExample.caption) { + delete oExample.caption; + } + if (oExample.text) { + delete oExample.text; + } + }); + } + + // Code Example string + oConstructor.codeExample = formatters.formatConstructor(oSymbol.name, oConstructor.parameters); + + // Parameters + if (oConstructor.parameters) { + oConstructor.parameters = methods.buildConstructorParameters(oConstructor.parameters); + + let aParameters = oConstructor.parameters; + aParameters.forEach(oParameter => { + + // Types + oParameter.types = []; + if (oParameter.type) { + let aTypes = oParameter.type.split("|"); + + for (let i = 0; i < aTypes.length; i++) { + oParameter.types.push({ + name: aTypes[i], + linkEnabled: !isBuiltInType(aTypes[i]) + }); + } + + // Keep file size in check + delete oParameter.type; + } + + // Default value + oParameter.defaultValue = formatters.formatDefaultValue(oParameter.defaultValue); + + // Description + if (oParameter.description) { + oParameter.description = formatters.formatDescription(oParameter.description); + } + + }) + } + + // Throws + if (oConstructor.throws) { + oConstructor.throws.forEach(oThrows => { + + // Description + if (oThrows.description) { + oThrows.description = formatters.formatDescription(oThrows.description); + } + + // Exception link enabled + if (oThrows.type) { + oThrows.linkEnabled = formatters.formatExceptionLink(oThrows.type); + } + + }); + } + } + + // Description + if (oSymbol.description) { + oSymbol.description = formatters.formatOverviewDescription(oSymbol.description, oSymbol.constructor.references); + } + + // Deprecated + if (oSymbol.deprecated) { + oSymbol.deprecatedText = formatters.formatDeprecated(oSymbol.deprecated.since, oSymbol.deprecated.text); + // Keep file size in check + delete oSymbol.deprecated; + } + + // Properties + if (oSymbol.properties) { + oSymbol.properties.forEach((oProperty) => { + + // Name + oProperty.name = formatters.formatEntityName(oProperty.name, oSymbol.name, oProperty.static); + + // Description + if (oProperty.deprecated) { + oProperty.description = formatters.formatDescription(oProperty.description, + oProperty.deprecated.text, oProperty.deprecated.since); + } else { + oProperty.description = formatters.formatDescription(oProperty.description); + } + + // Link Enabled + if (!isBuiltInType(oProperty.type)) { + oProperty.linkEnabled = true; + } + + // Keep file size in check + if (oProperty.static) { + delete oProperty.static; + } + if (oProperty.type) { + delete oProperty.type; + } + + }); + } + + // UI5 Metadata + if (oSymbol["ui5-metadata"]) { + let oMeta = oSymbol["ui5-metadata"]; + + // Properties + if (oMeta.properties) { + // Sort + oMeta.properties.sort(function (a, b) { + if (a.name < b.name) { + return -1; + } else if (a.name > b.name) { + return 1; + } else { + return 0; + } + }); + + // Pre-process + oMeta.properties.forEach((oProperty) => { + // Name + oProperty.name = formatters.formatEntityName(oProperty.name, oSymbol.name, oProperty.static); + + // Description + oProperty.description = formatters.formatDescriptionSince(oProperty.description, oProperty.since); + + // Link Enabled + if (!isBuiltInType(oProperty.type)) { + oProperty.linkEnabled = true; + } + + // Default value + oProperty.defaultValue = formatters.formatDefaultValue(oProperty.defaultValue); + + // Deprecated + if (oProperty.deprecated) { + oProperty.deprecatedText = formatters.formatDeprecated(oProperty.deprecated.since, + oProperty.deprecated.text); + + // Keep file size in check + delete oProperty.deprecated; + } + }); + } + + // Aggregations + if (oMeta.aggregations) { + // Sort + oMeta.aggregations.sort(function (a, b) { + if (a.name < b.name) { + return -1; + } else if (a.name > b.name) { + return 1; + } else { + return 0; + } + }); + + // Pre-process + oMeta.aggregations.forEach((oAggregation) => { + // Link Enabled + if (!isBuiltInType(oAggregation.type)) { + oAggregation.linkEnabled = true; + } + + // Description + if (oAggregation.deprecated) { + oAggregation.description = formatters.formatDescription(oAggregation.description, + oAggregation.deprecated.text, oAggregation.deprecated.since); + } else { + oAggregation.description = formatters.formatDescription(oAggregation.description); + } + + // Link enabled + oAggregation.linkEnabled = !isBuiltInType(oAggregation.type); + }); + } + + // Associations + + if (oMeta.associations) { + // Sort + oMeta.associations.sort(function (a, b) { + if (a.name < b.name) { + return -1; + } else if (a.name > b.name) { + return 1; + } else { + return 0; + } + }); + + // Pre-process + oMeta.associations.forEach((oAssociation) => { + // Link Enabled + if (!isBuiltInType(oAssociation.type)) { + oAssociation.linkEnabled = true; + } + + // Description + if (oAssociation.deprecated) { + oAssociation.description = formatters.formatDescription(oAssociation.description, + oAssociation.deprecated.text, oAssociation.deprecated.since); + } else { + oAssociation.description = formatters.formatDescription(oAssociation.description); + } + }); + } + + // Events + if (oMeta.events) { + // We don't need event's data from the UI5-metadata for now. Keep file size in check + delete oMeta.events; + } + + // Special Settings + if (oMeta.specialSettings) { + oMeta.specialSettings.forEach(oSetting => { + + // Link Enabled + if (!isBuiltInType(oSetting.type)) { + oSetting.linkEnabled = true; + } + + // Description + if (oSetting.deprecated) { + oSetting.description = formatters.formatDescription(oSetting.description, + oSetting.deprecated.text, oSetting.deprecated.since); + } else { + oSetting.description = formatters.formatDescription(oSetting.description); + } + + }); + } + + // Annotations + if (oMeta.annotations) { + oMeta.annotations.forEach(oAnnotation => { + + // Description + oAnnotation.description = formatters.formatAnnotationDescription(oAnnotation.description, + oAnnotation.since); + + // Namespace + oAnnotation.namespaceText = oAnnotation.namespace; + oAnnotation.namespace = formatters.formatAnnotationNamespace(oAnnotation.namespace); + + // Target + oAnnotation.target = formatters.formatAnnotationTarget(oAnnotation.target); + + // Applies to + oAnnotation.appliesTo = formatters.formatAnnotationTarget(oAnnotation.appliesTo); + + }); + } + + } + + if (oSymbol.events) { + + // Pre-process events + methods.buildEventsModel(oSymbol.events); + + oSymbol.events.forEach(oEvent => { + + // Description + if (oEvent.description) { + oEvent.description = formatters.formatDescriptionSince(oEvent.description, oEvent.since); + } + + // Deprecated + if (oEvent.deprecated) { + oEvent.deprecatedText = formatters.formatEventDeprecated(oEvent.deprecated.since, + oEvent.deprecated.text); + } + + // Parameters + if (oEvent.parameters && Array.isArray(oEvent.parameters)) { + oEvent.parameters.forEach(oParameter => { + + // Link Enabled + if (!isBuiltInType(oParameter.type)) { + oParameter.linkEnabled = true; + } + + // Description + if (oParameter.deprecated) { + oParameter.description = formatters.formatDescription(oParameter.description, + oParameter.deprecated.text, oParameter.deprecated.since); + } else { + oParameter.description = formatters.formatDescription(oParameter.description); + } + + }); + } + + }); + + } + + // Methods + if (oSymbol.methods) { + + // Pre-process methods + methods.buildMethodsModel(oSymbol.methods); + + oSymbol.methods.forEach(oMethod => { + + // Name + if (oMethod.name) { + oMethod.name = formatters.formatEntityName(oMethod.name, oSymbol.name, oMethod.static); + } + + // Description + if (oMethod.description) { + oMethod.description = formatters.formatDescription(oMethod.description); + } + + // Examples + oMethod.examples && oMethod.examples.forEach(oExample => { + oExample = formatters.formatExample(oExample.caption, oExample.text); + }); + + // Deprecated + if (oMethod.deprecated) { + oMethod.deprecatedText = formatters.formatEventDeprecated(oMethod.deprecated.since, + oMethod.deprecated.text); + } + + // Code example + oMethod.code = formatters.formatMethodCode(oMethod.name, oMethod.parameters, oMethod.returnValue); + + // Parameters + if (oMethod.parameters) { + oMethod.parameters.forEach(oParameter => { + + // Types + if (oParameter.types) { + oParameter.types.forEach(oType => { + + // Link Enabled + if (!isBuiltInType(oType.value) && possibleUI5Symbol(oType.value)) { + oType.linkEnabled = true; + oType.href = "#/api/" + oType.value.replace("[]", ""); + } + + }); + } + + // Default value + oParameter.defaultValue = formatters.formatDefaultValue(oParameter.defaultValue); + + // Description + if (oParameter.deprecated) { + oParameter.description = formatters.formatDescription(oParameter.description, + oParameter.deprecated.text, oParameter.deprecated.since); + } else { + oParameter.description = formatters.formatDescription(oParameter.description); + } + + }); + } + + // Return value + if (oMethod.returnValue) { + + // Description + oMethod.returnValue.description = formatters.formatDescription(oMethod.returnValue.description); + + // Types + if (oMethod.returnValue.types) { + oMethod.returnValue.types.forEach(oType => { + + // Link Enabled + if (!isBuiltInType(oType.value)) { + oType.linkEnabled = true; + } + + }); + } + + } + + // Throws + if (oMethod.throws) { + oMethod.throws.forEach(oThrows => { + + // Description + if (oThrows.description) { + oThrows.description = formatters.formatDescription(oThrows.description); + } + + // Exception link enabled + if (oThrows.type) { + oThrows.linkEnabled = formatters.formatExceptionLink(oThrows.type); + } + + }); + } + + // Examples + if (oMethod.examples) { + oMethod.examples.forEach((oExample) => { + oExample.data = formatters.formatExample(oExample.caption, oExample.text); + + // Keep file size in check + if (oExample.caption) { + delete oExample.caption; + } + if (oExample.text) { + delete oExample.text; + } + }); + + } + + + }); + } + + }); + + oChainObject.parsedData = oData; + + return oChainObject; + }; + + /** + * Create api.json from parsed data + * @param oChainObject chain object + */ + function createApiRefApiJson(oChainObject) { + let sOutputDir = path.dirname(oChainObject.outputFile); + + // Create dir if it does not exist + if (!fs.existsSync(sOutputDir)) { + fs.mkdirSync(sOutputDir); + } + + // Write result to file + fs.writeFileSync(oChainObject.outputFile, JSON.stringify(oChainObject.parsedData) /* Transform back to string */, 'utf8'); + } + + /** + * Load .library file + * @param oChainObject chain return object + * @returns {Promise} library file promise + */ + function getLibraryPromise(oChainObject) { + return new Promise(function(oResolve) { + fs.readFile(oChainObject.libraryFile, 'utf8', (oError, oData) => { + oChainObject.libraryFileData = oData; + oResolve(oChainObject); + }); + }); + } + + /** + * Extracts components list and docuindex.json relative path from .library file data + * @param {object} oChainObject chain object + * @returns {object} chain object + */ + function extractComponentAndDocuindexUrl(oChainObject) { + oChainObject.modules = []; + + if (oChainObject.libraryFileData) { + let $ = cheerio.load(oChainObject.libraryFileData, { + ignoreWhitespace: true, + xmlMode: true, + lowerCaseTags: false + }); + + // Extract documentation URL + oChainObject.docuPath = $("appData documentation").attr("indexUrl"); + + // Extract components + $("ownership > component").each((i, oComponent) => { + + if (oComponent.children) { + if (oComponent.children.length === 1) { + oChainObject.defaultComponent = $(oComponent).text(); + } else { + let sCurrentComponentName = $(oComponent).find("name").text(); + let aCurrentModules = []; + $(oComponent).find("module").each((a, oC) => { + aCurrentModules.push($(oC).text().replace(/\//g, ".")); + }); + + oChainObject.modules.push({ + componentName: sCurrentComponentName, + modules: aCurrentModules + }); + } + } + + }); + + } + + return oChainObject; + } + + /** + * Adds to the passed object custom symbol component map generated from the extracted components list + * to be easily searchable later + * @param {object} oChainObject chain object + * @returns {object} chain object + */ + function flattenComponents(oChainObject) { + if (oChainObject.modules && oChainObject.modules.length > 0) { + oChainObject.customSymbolComponents = {}; + oChainObject.modules.forEach(oComponent => { + let sCurrentComponent = oComponent.componentName; + oComponent.modules.forEach(sModule => { + oChainObject.customSymbolComponents[sModule] = sCurrentComponent; + }); + }); + } + + return oChainObject; + } + + /** + * Adds to the passed object array with entities which have explored samples + * @param {object} oChainObject chain object + * @returns {object} chain object + */ + function extractSamplesFromDocuIndex(oChainObject) { + // If we have not extracted docuPath we return early + if (!oChainObject.docuPath) { + return oChainObject; + } + return new Promise(function(oResolve) { + // Join .library path with relative docuindex.json path + let sPath = path.join(path.dirname(oChainObject.libraryFile), oChainObject.docuPath); + // Normalize path to resolve relative path + sPath = path.normalize(sPath); + + fs.readFile(sPath, 'utf8', (oError, oFileData) => { + if (!oError) { + oFileData = JSON.parse(oFileData); + if (oFileData.explored && oFileData.explored.entities && oFileData.explored.entities.length > 0) { + oChainObject.entitiesWithSamples = []; + oFileData.explored.entities.forEach(oEntity => { + oChainObject.entitiesWithSamples.push(oEntity.id); + }); + } + } + // We aways resolve as this data is not mandatory + oResolve(oChainObject); + }); + + }); + } + + /** + * Load api.json file + * @param {object} oChainObject chain object + * @returns {object} chain object + */ + function getAPIJSONPromise(oChainObject) { + return new Promise(function(oResolve, oReject) { + fs.readFile(sInputFile, 'utf8', (oError, sFileData) => { + if (oError) { + oReject(oError); + } else { + oChainObject.fileData = sFileData; + oResolve(oChainObject); + } + }); + }); + } + + /* + * ===================================================================================================================== + * IMPORTANT NOTE: Formatter code is a copy from APIDetail.controller.js with a very little modification and mocking and + * code can be significantly improved + * ===================================================================================================================== + */ + let formatters = { + + _sTopicId: "", + _oTopicData: {}, + _baseTypes: [ + "sap.ui.core.any", + "sap.ui.core.object", + "sap.ui.core.function", + "sap.ui.core.number", // TODO discuss with Thomas, type does not exist + "sap.ui.core.float", + "sap.ui.core.int", + "sap.ui.core.boolean", + "sap.ui.core.string", + "sap.ui.core.void", + "null", + "any", + "any[]", + "Error", + "Error[]", + "array", + "element", + "Element", + "DomRef", + "object", + "Object", + "object[]", + "object|object[]", + "[object Object][]", + "Array.<[object Object]>", + "Object.", + "function", + "float", + "int", + "boolean", + "string", + "string[]", + "number", + "map", + "promise", + "Promise", + "document", + "Document", + "Touch", + "TouchList", + "undefined" + ], + ANNOTATIONS_LINK: 'http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part3-csdl.html', + ANNOTATIONS_NAMESPACE_LINK: 'http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/vocabularies/', + + /** + * Adds "deprecated" information if such exists to the header area + * @param deprecated - object containing information about deprecation + * @returns {string} - the deprecated text to display + */ + formatSubtitle: function (deprecated) { + var result = ""; + + if (deprecated) { + result += "Deprecated in version: " + deprecated.since; + } + + return result; + }, + + /** + * Formats the target and applies to texts of annotations + * @param target - the array of texts to be formatted + * @returns string - the formatted text + */ + formatAnnotationTarget: function (target) { + var result = ""; + + if (target) { + target.forEach(function (element) { + result += element + '
'; + }); + } + + result = this._preProcessLinksInTextBlock(result); + return result; + }, + + /** + * Formats the namespace of annotations + * @param namespace - the namespace to be formatted + * @returns string - the formatted text + */ + formatAnnotationNamespace: function (namespace) { + var result, + aNamespaceParts = namespace.split("."); + + if (aNamespaceParts[0] === "Org" && aNamespaceParts[1] === "OData") { + result = '' + namespace + ''; + } else { + result = namespace; + } + + result = this._preProcessLinksInTextBlock(result); + return result; + }, + + /** + * Formats the description of annotations + * @param description - the description of the annotation + * @param since - the since version information of the annotation + * @returns string - the formatted description + */ + formatAnnotationDescription: function (description, since) { + var result = description || ""; + + result += '
For more information, see ' + 'OData v4 Annotations'; + + if (since) { + result += '

Since: ' + since + '.'; + } + + result = this._preProcessLinksInTextBlock(result); + return result; + }, + + formatExceptionLink: function (linkText) { + linkText = linkText || ''; + return linkText.indexOf('sap.ui.') !== -1; + }, + + formatMethodCode: function (sName, aParams, aReturnValue) { + var result = '
' + sName + '(';
+
+			if (aParams && aParams.length > 0) {
+				/* We consider only root level parameters so we get rid of all that are not on the root level */
+				aParams = aParams.filter(oElem => {
+					return oElem.depth === undefined;
+				});
+				aParams.forEach(function (element, index, array) {
+					result += element.name;
+
+					if (element.optional) {
+						result += '?';
+					}
+
+					if (index < array.length - 1) {
+						result += ', ';
+					}
+				});
+			}
+
+			result += ') : ';
+
+			if (aReturnValue) {
+				result += aReturnValue.type;
+			} else {
+				result += 'void';
+			}
+
+			result += "
"; + + return result; + }, + + /** + * Formats method deprecation message and pre-process jsDoc link and code blocks + * @param {string} sSince since text + * @param {string} sDescription deprecation description text + * @returns {string} formatted deprecation message + */ + formatMethodDeprecated: function (sSince, sDescription) { + return this.formatDeprecated(sSince, sDescription, "methods"); + }, + + /** + * Formats event deprecation message and pre-process jsDoc link and code blocks + * @param {string} sSince since text + * @param {string} sDescription deprecation description text + * @returns {string} formatted deprecation message + */ + formatEventDeprecated: function (sSince, sDescription) { + return this.formatDeprecated(sSince, sDescription, "events"); + }, + + /** + * Formats the description of control properties + * @param description - the description of the property + * @param since - the since version information of the property + * @returns string - the formatted description + */ + formatDescriptionSince: function (description, since) { + var result = description || ""; + + if (since) { + result += '

Since: ' + since + '.'; + } + + result = this._preProcessLinksInTextBlock(result); + return result; + }, + + /** + * Formats the default value of the property as a string. + * @param defaultValue - the default value of the property + * @returns string - The default value of the property formatted as a string. + */ + formatDefaultValue: function (defaultValue) { + var sReturn; + + switch (defaultValue) { + case null: + case undefined: + sReturn = ''; + break; + case '': + sReturn = 'empty string'; + break; + default: + sReturn = defaultValue; + } + + return Array.isArray(sReturn) ? sReturn.join(', ') : sReturn; + }, + + /** + * Formats the constructor of the class + * @param name + * @param params + * @returns string - The code needed to create an object of that class + */ + formatConstructor: function (name, params) { + var result = '
new ';
+
+			if (name) {
+				result += name + '(';
+			}
+
+			if (params) {
+				params.forEach(function (element, index, array) {
+					result += element.name;
+
+					if (element.optional) {
+						result += '?';
+					}
+
+					if (index < array.length - 1) {
+						result += ', ';
+					}
+				});
+			}
+
+			if (name) {
+				result += ')
'; + } + + return result; + }, + + formatExample: function (sCaption, sText) { + return this.formatDescription( + ["Example: ", + sCaption, + "
",
+					sText,
+					"
"].join("") + ); + }, + + /** + * Formats the name of a property or a method depending on if it's static or not + * @param sName {string} - Name + * @param sClassName {string} - Name of the class + * @param bStatic {boolean} - If it's static + * @returns {string} - Formatted name + */ + formatEntityName: function (sName, sClassName, bStatic) { + return (bStatic === true) ? sClassName + "." + sName : sName; + }, + + JSDocUtil: function () { + + var rEscapeRegExp = /[[\]{}()*+?.\\^$|]/g; + + // Local mocked methods + var escapeRegExp = function escapeRegExp(sString) { + return sString.replace(rEscapeRegExp, "\\$&"); + }; + + function defaultLinkFormatter(target, text) { + return "" + (text || target) + ""; + } + + function format(src, options) { + + options = options || {}; + var beforeParagraph = options.beforeParagraph === undefined ? '

' : options.beforeParagraph; + var afterParagraph = options.afterParagraph === undefined ? '

' : options.afterParagraph; + var beforeFirstParagraph = options.beforeFirstParagraph === undefined ? beforeParagraph : options.beforeFirstParagraph; + var afterLastParagraph = options.afterLastParagraph === undefined ? afterParagraph : options.afterLastParagraph; + var linkFormatter = typeof options.linkFormatter === 'function' ? options.linkFormatter : defaultLinkFormatter; + + /* + * regexp to recognize important places in the text + * + * Capturing groups of the RegExp: + * group 1: begin of a pre block + * group 2: end of a pre block + * group 3: begin of a header, implicitly ends a paragraph + * group 4: end of a header, implicitly starts a new paragraph + * group 5: target portion of an inline @link tag + * group 6: (optional) text portion of an inline link tag + * group 7: an empty line which implicitly starts a new paragraph + * + * [--
 block -] [---- some header ----] [---- an inline [@link ...} tag ----] [---------- an empty line ---------]  */
+				var r = /(
)|(<\/pre>)|()|(<\/h[\d+]>)|\{@link\s+([^}\s]+)(?:\s+([^\}]*))?\}|((?:\r\n|\r|\n)[ \t]*(?:\r\n|\r|\n))/gi;
+				var inpre = false;
+
+				src = src || '';
+				linkFormatter = linkFormatter || defaultLinkFormatter;
+
+				src = beforeFirstParagraph + src.replace(r, function(match, pre, endpre, header, endheader, linkTarget, linkText, emptyline) {
+					if ( pre ) {
+						inpre = true;
+					} else if ( endpre ) {
+						inpre = false;
+					} else if ( header ) {
+						if ( !inpre ) {
+							return afterParagraph + match;
+						}
+					} else if ( endheader ) {
+						if ( !inpre ) {
+							return match + beforeParagraph;
+						}
+					} else if ( emptyline ) {
+						if ( !inpre ) {
+							return afterParagraph + beforeParagraph;
+						}
+					} else if ( linkTarget ) {
+						if ( !inpre ) {
+							return linkFormatter(linkTarget, linkText);
+						}
+					}
+					return match;
+				}) + afterLastParagraph;
+
+				// remove empty paragraphs
+				if (beforeParagraph !== "" && afterParagraph !== "") {
+					src = src.replace(new RegExp(escapeRegExp(beforeParagraph) + "\\s*" + escapeRegExp(afterParagraph), "g"), "");
+				}
+
+				return src;
+			}
+
+			return {
+				formatTextBlock: format
+			};
+
+		},
+
+		/**
+		 * Pre-process links in text block
+		 * @param {string} sText text block
+		 * @returns {string} processed text block
+		 * @private
+		 */
+		_preProcessLinksInTextBlock: function (sText, bSkipParagraphs) {
+			var topicsData = this._oTopicData, //this.getModel('topics').oData,
+				topicName = topicsData.name || "",
+				topicMethods = topicsData.methods || [],
+				oOptions = {
+					linkFormatter: function (target, text) {
+						var iHashIndex, // indexOf('#')
+							iHashDotIndex, // indexOf('#.')
+							iHashEventIndex, // indexOf('#event:')
+							aMatched,
+							sRoute = "api",
+							sTargetBase,
+							sScrollHandlerClass = "scrollToMethod",
+							sEntityName,
+							aMatch,
+							sLink;
+
+						text = text || target; // keep the full target in the fallback text
+
+						// If the link has a protocol, do not modify, but open in a new window
+						if (target.match("://")) {
+							return '' + text + '';
+						}
+
+						target = target.trim().replace(/\.prototype\./g, "#");
+
+						// Link matches the pattern of an static extend method sap.ui.core.Control.extend
+						// BCP: 1780477951
+						aMatch = target.match(/^([a-zA-Z0-9\.]*)\.extend$/);
+						if (aMatch) {
+							// In this case the link should be a link to a static method of the control like for example
+							// #/api/sap.ui.core.Control/methods/sap.ui.core.Control.extend
+							target = aMatch[1] + "/methods/" + aMatch[0];
+							sEntityName = aMatch[1];
+							sScrollHandlerClass = false; // No scroll handler needed
+						} else {
+
+							iHashIndex = target.indexOf('#');
+							iHashDotIndex = target.indexOf('#.');
+							iHashEventIndex = target.indexOf('#event:');
+
+							if (iHashIndex === -1) {
+								var lastDotIndex = target.lastIndexOf('.'),
+									entityName = sEntityName = target.substring(lastDotIndex + 1),
+									targetMethod = topicMethods.filter(function (method) {
+										if (method.name === entityName) {
+											return method;
+										}
+									})[0];
+
+								if (targetMethod) {
+									if (targetMethod.static === true) {
+										sEntityName = target;
+										// We need to handle links to static methods in a different way if static method is
+										// a child of the current or a different entity
+										sTargetBase = target.replace("." + entityName, "");
+										if (sTargetBase.length > 0 && sTargetBase !== topicName) {
+											// Different entity
+											target = sTargetBase + "/methods/" + target;
+											// We will navigate to a different entity so no scroll is needed
+											sScrollHandlerClass = false;
+										} else {
+											// Current entity
+											target = topicName + '/methods/' + target;
+										}
+									} else {
+										target = topicName + '/methods/' + entityName;
+									}
+								} else {
+									// Handle links to documentation
+									aMatched = target.match(/^topic:(\w{32})$/);
+									if (aMatched) {
+										target = sEntityName = aMatched[1];
+										sRoute = "topic";
+									}
+								}
+							}
+
+							if (iHashDotIndex === 0) {
+								// clear '#.' from target string
+								target = target.slice(2);
+
+								target = topicName + '/methods/' + topicName + '.' + target;
+							} else if (iHashEventIndex >= 0) {
+								//format is 'className#event:eventName'  or  '#event:eventName'
+								var sClassName = target.substring(0, iHashIndex);
+								target = target.substring(iHashIndex);
+
+								// clear '#event:' from target string
+								target = target.slice('#event:'.length);
+
+								if (!sClassName) {
+									sClassName = topicName; // if no className => event is relative to current topicName
+									sScrollHandlerClass = "scrollToEvent"; // mark the element as relative link to the events section
+								}
+
+								target = sClassName + '/events/' + target;
+								sEntityName = target;
+
+							} else if (iHashIndex === 0) {
+								// clear '#' from target string
+								target = target.slice(1);
+								sEntityName = target;
+
+								target = topicName + '/methods/' + target;
+							} else if (iHashIndex > 0) {
+								target = target.replace('#', '/methods/');
+								sEntityName = target;
+							}
+
+						}
+
+						sLink = '' + text + '';
+
+						return sLink;
+
+					}
+				};
+
+			if (bSkipParagraphs) {
+				oOptions.beforeParagraph = "";
+				oOptions.afterParagraph = "";
+			}
+
+			return this.JSDocUtil().formatTextBlock(sText, oOptions);
+		},
+
+		/**
+		 * Formatter for Overview section
+		 * @param {string} sDescription - Class about description
+		 * @param {array} aReferences - References
+		 * @returns {string} - formatted text block
+		 */
+		formatOverviewDescription: function (sDescription, aReferences) {
+			var iLen,
+				i;
+
+			// format references
+			if (aReferences && aReferences.length > 0) {
+				sDescription += "

Documentation links:
    "; + + iLen = aReferences.length; + for (i = 0; i < iLen; i++) { + // We treat references as links but as they may not be defined as such we enforce it if needed + if (/{@link.*}/.test(aReferences[i])) { + sDescription += "
  • " + aReferences[i] + "
  • "; + } else { + sDescription += "
  • {@link " + aReferences[i] + "}
  • "; + } + } + + sDescription += "
"; + } + + // Calling formatDescription so it could handle further formatting + return this.formatDescription(sDescription); + }, + + /** + * Formats the description of the property + * @param description - the description of the property + * @param deprecatedText - the text explaining this property is deprecated + * @param deprecatedSince - the version when this property was deprecated + * @returns string - the formatted description + */ + formatDescription: function (description, deprecatedText, deprecatedSince) { + if (!description && !deprecatedText && !deprecatedSince) { + return ""; + } + + var result = description || ""; + + if (deprecatedSince || deprecatedText) { + // Note: sapUiDocumentationDeprecated - transformed to sapUiDeprecated to keep json file size low + result += "
"; + + result += this.formatDeprecated(deprecatedSince, deprecatedText); + + result += "
"; + } + + result = this._preProcessLinksInTextBlock(result); + return result; + }, + + /** + * Formats the entity deprecation message and pre-process jsDoc link and code blocks + * @param {string} sSince since text + * @param {string} sDescription deprecation description text + * @param {string} sEntityType string representation of entity type + * @returns {string} formatted deprecation message + */ + formatDeprecated: function (sSince, sDescription, sEntityType) { + var aResult; + + // Build deprecation message + // Note: there may be no since or no description text available + aResult = ["Deprecated"]; + if (sSince) { + aResult.push(" as of version " + sSince); + } + if (sDescription) { + // Evaluate code blocks - Handle ... pattern + sDescription = sDescription.replace(/(\S+)<\/code>/gi, function (sMatch, sCodeEntity) { + return ['', sCodeEntity, ''].join(""); + } + ); + + // Evaluate links in the deprecation description + aResult.push(". " + this._preProcessLinksInTextBlock(sDescription, true)); + } + + return aResult.join(""); + }, + + _formatChildDescription: function (description) { + if (description) { + return this._extractFirstSentence(description); + } + }, + + /** Just the first sentence (up to a full stop). Should not break on dotted variable names. */ + _extractFirstSentence: function(desc) { + if ( desc ) { + desc = String(desc).replace(/\s+/g, ' '). + replace(/^(<\/?p>||\w+<\/h\d>|\s)+/, ''); + + var match = /([\w\W]+?\.)[^a-z0-9_$]/i.exec(desc); + return match ? match[1] : desc; + } + return ""; + }, + + _sliceSpecialTags: function (descriptionCopy, startSymbol, endSymbol) { + var startIndex, endIndex; + while (descriptionCopy.indexOf(startSymbol) !== -1 && descriptionCopy.indexOf(startSymbol) < descriptionCopy.indexOf(".")) { + startIndex = descriptionCopy.indexOf(startSymbol); + endIndex = descriptionCopy.indexOf(endSymbol); + descriptionCopy = descriptionCopy.slice(0, startIndex) + descriptionCopy.slice(endIndex + endSymbol.length, descriptionCopy.length); + } + return descriptionCopy; + } + + }; + + /* Methods direct copy from API Detail */ + let methods = { + + /** + * Pre-process and modify references + * @param {object} oSymbol control data object which will be modified + * @private + */ + modifyReferences: function (oSymbol) { + var bHeaderDocuLinkFound = false, + bUXGuidelinesLinkFound = false, + aReferences = []; + + if (oSymbol.constructor.references && oSymbol.constructor.references.length > 0) { + oSymbol.constructor.references.forEach(function (sReference) { + var aParts; + + // Docu link - For the header we take into account only the first link that matches one of the patterns + if (!bHeaderDocuLinkFound) { + + // Handled patterns: + // * topic:59a0e11712e84a648bb990a1dba76bc7 + // * {@link topic:59a0e11712e84a648bb990a1dba76bc7} + // * {@link topic:59a0e11712e84a648bb990a1dba76bc7 Link text} + aParts = sReference.match(/^{@link\s+topic:(\w{32})(\s.+)?}$|^topic:(\w{32})$/); + + if (aParts) { + if (aParts[3]) { + // Link is of type topic:GUID + oSymbol.docuLink = aParts[3]; + oSymbol.docuLinkText = oSymbol.basename; + } else if (aParts[1]) { + // Link of type {@link topic:GUID} or {@link topic:GUID Link text} + oSymbol.docuLink = aParts[1]; + oSymbol.docuLinkText = aParts[2] ? aParts[2] : oSymbol.basename; + } + bHeaderDocuLinkFound = true; + return; + } + } + + // Fiori link - Handled patterns: + // * fiori:https://experience.sap.com/fiori-design-web/flexible-column-layout/ + // * {@link fiori:https://experience.sap.com/fiori-design-web/flexible-column-layout/} + // * {@link fiori:https://experience.sap.com/fiori-design-web/flexible-column-layout/ Flexible Column Layout} + aParts = sReference.match(/^{@link\s+fiori:(\S+)(\s.+)?}$|^fiori:(\S+)$/); + + if (aParts) { + + if (!bUXGuidelinesLinkFound) { + // Extract first found UX Guidelines link as primary + if (aParts) { + if (aParts[3]) { + // String of type: "fiori:https://experience.sap.com/fiori-design-web/flexible-column-layout/" + oSymbol.uxGuidelinesLink = aParts[3]; + oSymbol.uxGuidelinesLinkText = oSymbol.basename; + } else if (aParts[1]) { + // String of type: "{@link fiori:https://experience.sap.com/fiori-design-web/flexible-column-layout/}" + // or + // String of type: "{@link fiori:https://experience.sap.com/fiori-design-web/flexible-column-layout/ Flexible Column Layout}" + oSymbol.uxGuidelinesLink = aParts[1]; + oSymbol.uxGuidelinesLinkText = aParts[2] ? aParts[2] : oSymbol.basename; + } + bUXGuidelinesLinkFound = true; + return; + } + } else { + // BCP: 1870155880 - Every consecutive "fiori:" link should be handled as a normal link + sReference = sReference.replace("fiori:", ""); + } + + } + + aReferences.push(sReference); + }); + oSymbol.constructor.references = aReferences; + } else { + oSymbol.constructor.references = []; + } + }, + + /** + * Adjusts methods info so that it can be easily displayed in a table + * @param aMethods - the methods array initially coming from the server + */ + buildMethodsModel: function (aMethods) { + var fnCreateTypesArr = function (sTypes) { + return sTypes.split("|").map(function (sType) { + return {value: sType} + }); + }; + var fnExtractParameterProperties = function (oParameter, aParameters, iDepth, aPhoneName) { + if (oParameter.parameterProperties) { + Object.keys(oParameter.parameterProperties).forEach(function (sProperty) { + var oProperty = oParameter.parameterProperties[sProperty]; + + oProperty.depth = iDepth; + + // Handle types + if (oProperty.type) { + oProperty.types = fnCreateTypesArr(oProperty.type); + } + + // Phone name - available only for parameters + oProperty.phoneName = [aPhoneName.join("."), oProperty.name].join("."); + + // Add property to parameter array as we need a simple structure + aParameters.push(oProperty); + + // Handle child parameterProperties + fnExtractParameterProperties(oProperty, aParameters, (iDepth + 1), aPhoneName.concat([oProperty.name])); + + // Keep file size in check + delete oProperty.type; + }); + + // Keep file size in check + delete oParameter.parameterProperties; + } + }; + aMethods.forEach(function (oMethod) { + // New array to hold modified parameters + var aParameters = []; + + // Handle parameters + if (oMethod.parameters) { + oMethod.parameters.forEach(function (oParameter) { + if (oParameter.type) { + oParameter.types = fnCreateTypesArr(oParameter.type); + } + + // Keep file size in check + delete oParameter.type; + + // Add the parameter before the properties + aParameters.push(oParameter); + + // Handle Parameter Properties + // Note: We flatten the structure + fnExtractParameterProperties(oParameter, aParameters, 1, [oParameter.name]); + + }); + + // Override the old data + oMethod.parameters = aParameters; + } + + // Handle return values + if (oMethod.returnValue && oMethod.returnValue.type) { + // Handle types + oMethod.returnValue.types = fnCreateTypesArr(oMethod.returnValue.type); + } + + }); + }, + + /** + * Adjusts events info so that it can be easily displayed in a table + * @param {Array} aEvents - the events array initially coming from the server + */ + buildEventsModel: function (aEvents) { + var fnExtractParameterProperties = function (oParameter, aParameters, iDepth, aPhoneName) { + if (oParameter.parameterProperties) { + Object.keys(oParameter.parameterProperties).forEach(function (sProperty) { + var oProperty = oParameter.parameterProperties[sProperty], + sPhoneTypeSuffix; + + oProperty.depth = iDepth; + + // Phone name - available only for parameters + sPhoneTypeSuffix = oProperty.type === "array" ? "[]" : ""; + oProperty.phoneName = [aPhoneName.join("."), (oProperty.name + sPhoneTypeSuffix)].join("."); + + // Add property to parameter array as we need a simple structure + aParameters.push(oProperty); + + // Handle child parameterProperties + fnExtractParameterProperties(oProperty, aParameters, (iDepth + 1), + aPhoneName.concat([oProperty.name + sPhoneTypeSuffix])); + }); + + // Keep file size in check + delete oParameter.parameterProperties; + } + }; + aEvents.forEach(function (aEvents) { + // New array to hold modified parameters + var aParameters = []; + + // Handle parameters + if (aEvents.parameters) { + aEvents.parameters.forEach(function (oParameter) { + // Add the parameter before the properties + aParameters.push(oParameter); + + // Handle Parameter Properties + // Note: We flatten the structure + fnExtractParameterProperties(oParameter, aParameters, 1, [oParameter.name]); + }); + + // Override the old data + aEvents.parameters = aParameters; + } + }); + }, + + /** + * Adjusts constructor parameters info so that it can be easily displayed in a table + * @param {Array} aParameters - the events array initially coming from the server + */ + buildConstructorParameters: function (aParameters) { + // New array to hold modified parameters + var aNodes = [], + processNode = function (oNode, sPhoneName, iDepth, aNodes) { + // Handle phone name + oNode.phoneName = sPhoneName ? [sPhoneName, oNode.name].join(".") : oNode.name; + + // Depth + oNode.depth = iDepth; + + // Add to array + aNodes.push(oNode); + + // Handle nesting + if (oNode.parameterProperties) { + Object.keys(oNode.parameterProperties).forEach(function (sNode) { + processNode(oNode.parameterProperties[sNode], oNode.phoneName, (iDepth + 1), aNodes); + }); + } + + delete oNode.parameterProperties; + }; + + aParameters.forEach(function (oParameter) { + // Handle Parameter Properties + // Note: We flatten the structure + processNode(oParameter, undefined, 0, aNodes); + }); + + return aNodes; + }, + + oLibsData: {}, + aTreeContent: [], + + _getControlChildren: function (sTopicId) { + // Find tree node + var findTreeNode = function (aNodes, sTopicId) { + var iLen, + oNode, + i; + + for (i = 0, iLen = aNodes.length; i < iLen; i++) { + oNode = aNodes[i]; + if (oNode.name === sTopicId) { + return oNode; + } + if (oNode.nodes) { + oNode = findTreeNode(aNodes[i].nodes, sTopicId); + if (oNode) { + return oNode; + } + } + } + }, + oNode = findTreeNode(this.aTreeContent, sTopicId); + + return oNode.nodes ? oNode.nodes : false; + }, + + _parseLibraryElements : function (aLibraryElements) { + var oLibraryElement, + aNodes, + i; + + for (i = 0; i < aLibraryElements.length; i++) { + oLibraryElement = aLibraryElements[i]; + aNodes = oLibraryElement.nodes; + + if (!aNodes) { + this.oLibsData[oLibraryElement.name] = oLibraryElement; + } + + this._addElementToTreeData(oLibraryElement, aLibraryElements); + + if (aNodes) { + this._parseLibraryElements(aNodes, true); + } + } + + return this.aTreeContent; + }, + + _addElementToTreeData : function (oJSONElement, aLibraryElements) { + var oNewNodeNamespace; + + if (oJSONElement.kind !== "namespace") { + var aNameParts = oJSONElement.name.split("."), + sBaseName = aNameParts.pop(), + sNodeNamespace = aNameParts.join("."), // Note: Array.pop() on the previous line modifies the array itself + oTreeNode = this._createTreeNode(sBaseName, oJSONElement.name), + oExistingNodeNamespace = this._findNodeNamespaceInTreeStructure(sNodeNamespace); + + if (oExistingNodeNamespace) { + if (!oExistingNodeNamespace.nodes) { + oExistingNodeNamespace.nodes = []; + } + oExistingNodeNamespace.nodes.push(oTreeNode); + } else if (sNodeNamespace) { + oNewNodeNamespace = this._createTreeNode(sNodeNamespace, sNodeNamespace); + oNewNodeNamespace.nodes = []; + oNewNodeNamespace.nodes.push(oTreeNode); + this.aTreeContent.push(oNewNodeNamespace); + + this._removeDuplicatedNodeFromTree(sNodeNamespace); + + // Inject missing new root namespace in main collection + aLibraryElements.push({ + kind: "namespace", // Note: we show this elements as namespaces + name: sNodeNamespace, + ref: "#/api/" + sNodeNamespace + }); + + } else { + // Entities for which we can't resolve namespace we are shown in the root level + oNewNodeNamespace = this._createTreeNode(oJSONElement.name, oJSONElement.name); + this.aTreeContent.push(oNewNodeNamespace); + } + } else { + oNewNodeNamespace = this._createTreeNode(oJSONElement.name, oJSONElement.name); + this.aTreeContent.push(oNewNodeNamespace); + } + }, + + _createTreeNode : function (text, name, sLib) { + var oTreeNode = {}; + oTreeNode.text = text; + oTreeNode.name = name; + oTreeNode.ref = "#/api/" + name; + return oTreeNode; + }, + + _findNodeNamespaceInTreeStructure : function (sNodeNamespace, aTreeStructure) { + aTreeStructure = aTreeStructure || this.aTreeContent; + for (var i = 0; i < aTreeStructure.length; i++) { + var oTreeNode = aTreeStructure[i]; + if (oTreeNode.name === sNodeNamespace) { + return oTreeNode; + } + if (oTreeNode.nodes) { + var oChildNode = this._findNodeNamespaceInTreeStructure(sNodeNamespace, oTreeNode.nodes); + if (oChildNode) { + return oChildNode; + } + } + } + }, + + _removeNodeFromNamespace : function (sNode, oNamespace) { + for (var i = 0; i < oNamespace.nodes.length; i++) { + if (oNamespace.nodes[i].text === sNode) { + oNamespace.nodes.splice(i, 1); + return; + } + } + }, + + _removeDuplicatedNodeFromTree : function (sNodeFullName) { + if (this.oLibsData[sNodeFullName]) { + var sNodeNamespace = sNodeFullName.substring(0, sNodeFullName.lastIndexOf(".")); + var oNamespace = this._findNodeNamespaceInTreeStructure(sNodeNamespace); + var sNode = sNodeFullName.substring(sNodeFullName.lastIndexOf(".") + 1, sNodeFullName.lenght); + this._removeNodeFromNamespace(sNode, oNamespace); + } + }, + _addChildrenDescription: function (aLibsData, aControlChildren) { + function getDataByName (sName) { + var iLen, + i; + + for (i = 0, iLen = aLibsData.length; i < iLen; i++) { + if (aLibsData[i].name === sName) { + return aLibsData[i]; + } + } + return false; + } + for (var i = 0; i < aControlChildren.length; i++) { + aControlChildren[i].description = formatters._formatChildDescription(getDataByName(aControlChildren[i].name).description); + aControlChildren[i].description = formatters._preProcessLinksInTextBlock(aControlChildren[i].description, true); + + // Handle nesting + if (aControlChildren[i].nodes) { + this._addChildrenDescription(aLibsData, aControlChildren[i].nodes); + } + } + } + }; + + // Create the chain object + let oChainObject = { + inputFile: sInputFile, + outputFile: sOutputFile, + libraryFile: sLibraryFile + }; + + // Start the work here + var p = getLibraryPromise(oChainObject) + .then(extractComponentAndDocuindexUrl) + .then(flattenComponents) + .then(extractSamplesFromDocuIndex) + .then(getAPIJSONPromise) + .then(transformApiJson) + .then(createApiRefApiJson); + return p; + +} diff --git a/lib/processors/jsdoc/ui5/plugin.js b/lib/processors/jsdoc/ui5/plugin.js new file mode 100644 index 000000000..9a323ea06 --- /dev/null +++ b/lib/processors/jsdoc/ui5/plugin.js @@ -0,0 +1,2321 @@ +/* + * JSDoc3 plugin for UI5 documentation generation. + * + * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. + * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. + */ + +/* global require, exports, env */ +/* eslint strict: [2, "global"]*/ + +'use strict'; + +/** + * UI5 plugin for JSDoc3 (3.3.0-alpha5) + * + * The plugin adds the following SAPUI5 specific tag definitions to JSDoc3 + * + * disclaimer + * + * experimental + * + * final + * + * interface + * + * implements + * + * + * + * It furthermore listens to the following JSDoc3 events to implement additional functionality + * + * parseBegin + * to create short names for all file that are to be parsed + * + * fileBegin + * to write some line to the log (kind of a progress indicator) + * + * jsdocCommentFound + * to pre-process comments, empty lines are used as paragraph markers + * a default visibility is added, legacy tag combinations used in JSdoc2 are converted to JSDoc3 conventions + * + * newDoclet + * + * parseComplete + * remove undocumented/ignored/private doclets or duplicate doclets + * + * + * Last but not least, it implements an astNodeVisitor to detect UI5 specific "extend" calls and to create + * documentation for the properties, aggregations etc. that are created with the "extend" call. + * + * @module plugins/sapui5-jsdoc + */ + +/* imports */ +var Syntax = require('jsdoc/src/syntax').Syntax; +var Doclet = require('jsdoc/doclet').Doclet; +var fs = require('jsdoc/fs'); +var path = require('jsdoc/path'); +var pluginConfig = (env.conf && env.conf.templates && env.conf.templates.ui5) || {}; + +/* ---- global vars---- */ + +/** + * Potential path prefixes. + * + * Will be determined in the handler for the parseBegin event + */ +var pathPrefixes = []; + +/** + * Prefixes of the UI5 unified resource name for the source files is NOT part of the file name. + * (e.g. when a common root namespaces has been omitted from the folder structure). + * + * The prefix will be prepended to all resource names. + */ +var resourceNamePrefixes = []; + +/** + * A UI5 specific unique Id for all doclets. + */ +var docletUid = 0; + +var currentProgram; + +/** + * Information about the current module. + * + * The info object is created in the 'fileBegin' event handler and the 'resource' and 'module' properties + * are derived from the filename provided by the event. The derived information is only correct, when the + * resource name prefix is known for the directory from which a source is loaded (prefixes can be configured + * via sapui5.resourceNamePrefixes, for UI5 libraries it is empty by default). + * + * During AST visiting, the 'name' property and the 'localeNames' map will be filled. + * 'name' will be the name of the class defined by the module (assuming that there is only one). + * 'localNames' will contain information objects for each parameter of an AMD Factory function and for + * all shortcut variables that are defined top-level in the module factory function (e.g. something like + * var ButtonDesign = coreLibrary.ButtonDesign; ). + * An info object for a local name either can have a 'value' property (simple, constant value) or it can + * have a 'module' and optionally a 'path' value. In that case, the local name represents an AMD + * module import or a shortcut derived from such an import. + * + * See {@link getREsolvedObjectName} how the knowledge about locale names is used. + * + * @type {{name:string,resource:string,module:string,localName:Object}} + */ +var currentModule; + +var currentSource; + +/** + * Cached UI5 metadata for encountered UI5 classes. + * + * The metadata is collected from the 'metadata' property of 'extend' calls. It is stored + * in this map keyed by the name of the class (as defined in the first parameter of the extend call). + * Only after all files have been parsed, the collected information can be associated with the + * corresponding JSDoc doclet (e.g. with the class documentation). + */ +var classInfos = Object.create(null); + +/** + * + */ +var typeInfos = Object.create(null); + +/** + * Cached designtime info for encountered sources. + * + * The designtime information is collected only for files named '*.designtime.js'. + * It is stored in this map keyed by the corresponding module name (e.g. 'sap/m/designtime/Button.designtime'). + * Only after all files have been parsed, the collected information can be associated with runtime metadata + * that refers to that designtime module name. + */ +var designtimeInfos = Object.create(null); + +/* ---- private functions ---- */ + +function ui5data(doclet) { + return doclet.__ui5 || (doclet.__ui5 = { id: ++docletUid }); +} + +var pendingMessageHeader; + +function msgHeader(str) { + pendingMessageHeader = str; +} + +function debug() { + if ( env.opts.debug ) { + console.log.apply(console, arguments); + } +} + +function info() { + if ( env.opts.verbose || env.opts.debug ) { + if ( pendingMessageHeader ) { + console.log(""); + pendingMessageHeader = null; + } + console.log.apply(console, arguments); + } +} + +function warning(msg) { + if ( pendingMessageHeader ) { + if ( !env.opts.verbose && !env.opts.debug ) { + console.log(pendingMessageHeader); + } else { + console.log(""); + } + pendingMessageHeader = null; + } + var args = Array.prototype.slice.apply(arguments); + args[0] = "**** warning: " + args[0]; + console.log.apply(console, args); +} + +function error(msg) { + if ( pendingMessageHeader && !env.opts.verbose && !env.opts.debug ) { + if ( !env.opts.verbose && !env.opts.debug ) { + console.log(pendingMessageHeader); + } else { + console.log(""); + } + pendingMessageHeader = null; + } + var args = Array.prototype.slice.apply(arguments); + args[0] = "**** error: " + args[0]; + console.log.apply(console, args); +} + +//---- path handling --------------------------------------------------------- + +function ensureEndingSlash(path) { + path = path || ''; + return path && path.slice(-1) !== '/' ? path + '/' : path; +} + +function getRelativePath(filename) { + var relative = path.resolve(filename); + for ( var i = 0; i < pathPrefixes.length; i++ ) { + if ( relative.indexOf(pathPrefixes[i]) === 0 ) { + relative = relative.slice(pathPrefixes[i].length); + break; + } + } + return relative.replace(/\\/g, '/'); +} + +function getResourceName(filename) { + var resource = path.resolve(filename); + for ( var i = 0; i < pathPrefixes.length; i++ ) { + if ( resource.indexOf(pathPrefixes[i]) === 0 ) { + resource = resourceNamePrefixes[i] + resource.slice(pathPrefixes[i].length); + break; + } + } + return resource.replace(/\\/g, '/'); +} + +function getModuleName(resource) { + return resource.replace(/\.js$/,''); +} + +/* + * resolves relative AMD module identifiers relative to a given base name + */ +function resolveModuleName(base, name) { + var stack = base.split('/'); + stack.pop(); + name.split('/').forEach(function(segment, i) { + if ( segment == '..' ) { + stack.pop(); + } else if ( segment === '.' ) { + // ignore + } else { + if ( i === 0 ) { + stack = []; + } + stack.push(segment); + } + }); + return stack.join('/'); +} + +// ---- AMD handling + +function analyzeModuleDefinition(node) { + var args = node.arguments; + var arg = 0; + if ( arg < args.length + && args[arg].type === Syntax.Literal && typeof args[arg].value === 'string' ) { + warning("module explicitly defined a module name '" + args[arg].value + "'"); + currentModule.name = args[arg].value; + arg++; + } + if ( arg < args.length && args[arg].type === Syntax.ArrayExpression ) { + currentModule.dependencies = convertValue(args[arg], "string[]"); + arg++; + } + if ( arg < args.length && args[arg].type === Syntax.FunctionExpression ) { + currentModule.factory = args[arg]; + arg++; + } + if ( currentModule.dependencies && currentModule.factory ) { + for ( var i = 0; i < currentModule.dependencies.length && i < currentModule.factory.params.length; i++ ) { + var name = currentModule.factory.params[i].name; + var module = resolveModuleName(currentModule.module, currentModule.dependencies[i]); + debug(" import " + name + " from '" + module + "'"); + currentModule.localNames[name] = { + module: module + // no (or empty) path + }; + } + } + if ( currentModule.factory ) { + collectShortcuts(currentModule.factory.body); + } +} + +/** + * Searches the given body for variable declarations that can be evaluated statically, + * either because they refer to known AMD modukle imports (e.g. shortcut varialbes) + * or because they have a (design time) constant value. + * + * @param {ASTNode} body + */ +function collectShortcuts(body) { + + function checkAssignment(name, valueNode) { + if ( valueNode.type === Syntax.Literal ) { + currentModule.localNames[name] = { + value: valueNode.value + }; + debug("compile time constant found ", name, valueNode.value); + } else if ( valueNode.type === Syntax.MemberExpression ) { + var _import = getLeftmostName(valueNode); + var local = _import && currentModule.localNames[_import]; + if ( typeof local === 'object' && local.module ) { + currentModule.localNames[name] = { + module: local.module, + path: getObjectName(valueNode).split('.').slice(1).join('.') // TODO chaining if local has path + }; + debug(" found local shortcut: ", name, currentModule.localNames[name]); + } + } + } + + if ( body.type === Syntax.BlockStatement ) { + body.body.forEach(function ( stmt ) { + // console.log(stmt); + if ( stmt.type === Syntax.VariableDeclaration ) { + stmt.declarations.forEach(function(decl) { + if ( decl.init ) { + checkAssignment(decl.id.name, decl.init); + } + }) + } else if ( stmt.type === Syntax.ExpressionStatement + && stmt.expression.type === Syntax.AssignmentExpression + && stmt.expression.left.type === Syntax.Identifier ) { + checkAssignment(stmt.expression.left.name, stmt.expression.right); + } + }); + } +} + +// ---- text handling --------------------------------------------------------- + +var rPlural = /(children|ies|ves|oes|ses|ches|shes|xes|s)$/i; +var mSingular = {'children' : -3, 'ies' : 'y', 'ves' : 'f', 'oes' : -2, 'ses' : -2, 'ches' : -2, 'shes' : -2, 'xes' : -2, 's' : -1 }; + +function guessSingularName(sPluralName) { + return sPluralName.replace(rPlural, function($,sPlural) { + var vRepl = mSingular[sPlural.toLowerCase()]; + return typeof vRepl === "string" ? vRepl : sPlural.slice(0,vRepl); + }); +} + +/** + * Creates a map of property values from an AST 'object literal' node. + * + * The values in the map are again AST 'property' nodes (representing key/value pairs). + * It would be more convenient to just return the values, but the property node is needed + * to find the corresponding (preceding) documentation comment. + * + * @param node + * @param defaultKey + * @returns {Map} + */ +function createPropertyMap(node, defaultKey) { + + var result; + + if ( node != null ) { + + // if, instead of an object literal only a literal is given and there is a defaultKey, then wrap the literal in a map + if ( node.type === Syntax.Literal && defaultKey != null ) { + result = {}; + result[defaultKey] = { type: Syntax.Property, value: node }; + return result; + } + + if ( node.type != Syntax.ObjectExpression ) { + // something went wrong, it's not an object literal + error("not an object literal:" + node.type + ":" + node.value); + // console.log(node.toSource()); + return undefined; + } + + // invariant: node.type == Syntax.ObjectExpression + result = {}; + for (var i = 0; i < node.properties.length; i++) { + var prop = node.properties[i]; + var name; + //console.log("objectproperty " + prop.type); + if ( prop.key.type === Syntax.Identifier ) { + name = prop.key.name; + } else if ( prop.key.type === Syntax.Literal ) { + name = String(prop.key.value); + } else { + name = prop.key.toSource(); + } + //console.log("objectproperty " + prop.type + ":" + name); + result[name] = prop; + } + } + return result; +} + +function isExtendCall(node) { + + return ( + node + && node.type === Syntax.CallExpression + && node.callee.type === Syntax.MemberExpression + && node.callee.property.type === Syntax.Identifier + && node.callee.property.name === 'extend' + && node.arguments.length >= 2 + && node.arguments[0].type === Syntax.Literal + && typeof node.arguments[0].value === "string" + && node.arguments[1].type === Syntax.ObjectExpression + ); + +} + +function isSapUiDefineCall(node) { + + return ( + node + && node.type === Syntax.CallExpression + && node.callee.type === Syntax.MemberExpression + && node.callee.object.type === Syntax.MemberExpression + && node.callee.object.object.type === Syntax.Identifier + && node.callee.object.object.name === 'sap' + && node.callee.object.property.type === Syntax.Identifier + && node.callee.object.property.name === 'ui' + && node.callee.property.type === Syntax.Identifier + && node.callee.property.name === 'define' + ); + +} + +function isCreateDataTypeCall(node) { + return ( + node + && node.type === Syntax.CallExpression + && node.callee.type === Syntax.MemberExpression + && /^(sap\.ui\.base\.)?DataType$/.test(getObjectName(node.callee.object)) + && node.callee.property.type === Syntax.Identifier + && node.callee.property.name === 'createType' + ); +} + +function getObjectName(node) { + if ( node.type === Syntax.MemberExpression && !node.computed && node.property.type === Syntax.Identifier ) { + var prefix = getObjectName(node.object); + return prefix ? prefix + "." + node.property.name : null; + } else if ( node.type === Syntax.Identifier ) { + return /* scope[node.name] ? scope[node.name] : */ node.name; + } else { + return null; + } +} + +/* + * Checks whether the node is a qualified name (a.b.c) and if so, + * returns the leftmost identifier a + */ +function getLeftmostName(node) { + while ( node.type === Syntax.MemberExpression ) { + node = node.object; + } + if ( node.type === Syntax.Identifier ) { + return node.name; + } + // return undefined; +} + +function getResolvedObjectName(node) { + var name = getObjectName(node); + var _import = getLeftmostName(node); + var local = _import && currentModule.localNames[_import]; + if ( local && local.module ) { + var resolvedName = local.module.replace(/\//g, ".").replace(/\.library$/, ""); + if ( local.path ) { + resolvedName = resolvedName + "." + local.path; + } + if ( name.indexOf('.') > 0 ) { + resolvedName = resolvedName + name.slice(name.indexOf('.')); + } + debug("resolved " + name + " to " + resolvedName); + return resolvedName; + } + return name; +} + +function convertValue(node, type, propertyName) { + + var value; + + if ( node.type === Syntax.Literal ) { + + // 'string' or number or true or false + return node.value; + + } else if ( node.type === Syntax.UnaryExpression + && node.prefix + && node.argument.type === Syntax.Literal + && typeof node.argument.value === 'number' + && ( node.operator === '-' || node.operator === '+' )) { + + // -n or +n + value = node.argument.value; + return node.operator === '-' ? -value : value; + + } else if ( node.type === Syntax.MemberExpression && type ) { + + // enum value (a.b.c) + value = getResolvedObjectName(node); + if ( value.indexOf(type + ".") === 0 ) { + // starts with fully qualified enum name -> cut off name + return value.slice(type.length + 1); +// } else if ( value.indexOf(type.split(".").slice(-1)[0] + ".") === 0 ) { +// // unqualified name might be a local name (just a guess - would need static code analysis for proper solution) +// return value.slice(type.split(".").slice(-1)[0].length + 1); + } else { + warning("did not understand default value '%s'%s, falling back to source", value, propertyName ? " of property '" + propertyName + "'" : ""); + return value; + } + + } else if ( node.type === Syntax.Identifier ) { + if ( node.name === 'undefined') { + // undefined + return undefined; + } + var local = currentModule.localNames[node.name]; + if ( typeof local === 'object' && 'value' in local ) { + // TODO check type + return local.value; + } + } else if ( node.type === Syntax.ArrayExpression ) { + + if ( node.elements.length === 0 ) { + // empty array literal + return "[]"; // TODO return this string or an empty array + } + + if ( type && type.slice(-2) === "[]" ) { + var componentType = type.slice(0,-2); + return node.elements.map( function(elem) { + return convertValue(elem, componentType, propertyName); + }); + } + + } else if ( node.type === Syntax.ObjectExpression ) { + + if ( node.properties.length === 0 && (type === 'object' || type === 'any') ) { + return {}; + } + + } + + value = '???'; + if ( currentSource && node.range ) { + value = currentSource.slice( node.range[0], node.range[1] ); + } + error("unexpected type of default value (type='%s', source='%s')%s, falling back to '%s'", node.type, node.toString(), propertyName ? " of property '" + propertyName + "'" : "", value); + return value; +} + +function convertStringArray(node) { + if ( node.type !== Syntax.ArrayExpression ) { + throw new Error("not an array"); + } + var result = []; + for ( var i = 0; i < node.elements.length; i++ ) { + if ( node.elements[i].type !== Syntax.Literal || typeof node.elements[i].value !== 'string' ) { + throw new Error("not a string literal"); + } + result.push(node.elements[i].value); + } + // console.log(result); + return result; +} + +function convertDragDropValue(node, cardinality) { + var mDragDropValue; + var mPossibleKeys = {draggable: 1, droppable: 1}; + var mDefaults = { + "self" : { draggable : true, droppable: true }, + "0..1" : { draggable : true, droppable: true }, + "0..n" : { draggable : false, droppable: false } + }; + + if ( node.type === Syntax.ObjectExpression ) { + mDragDropValue = (node.properties || []).reduce(function(oObject, oProperty) { + var sKey = convertValue(oProperty.key); + if (mPossibleKeys[sKey]) { + oObject[sKey] = convertValue(oProperty.value); + } + return oObject; + }, {}); + } else if ( node.type === Syntax.Literal ) { + mDragDropValue = { + draggable : node.value, + droppable : node.value + }; + } else { + throw new Error("not a valid dnd node"); + } + + return Object.assign(mDefaults[cardinality || "self"], mDragDropValue); +} + +function collectClassInfo(extendCall, classDoclet) { + + var baseType; + if ( classDoclet && classDoclet.augments && classDoclet.augments.length === 1 ) { + baseType = classDoclet.augments[0]; + } + if ( extendCall.callee.type === Syntax.MemberExpression ) { + var baseCandidate = getResolvedObjectName(extendCall.callee.object); + if ( baseCandidate && baseType == null ) { + baseType = baseCandidate; + } else if ( baseCandidate !== baseType ) { + error("documented base type '" + baseType + "' doesn't match technical base type '" + baseCandidate + "'"); + } + } + + var oClassInfo = { + name : extendCall.arguments[0].value, + baseType : baseType, + interfaces : [], + doc : classDoclet && classDoclet.description, + deprecation : classDoclet && classDoclet.deprecated, + since : classDoclet && classDoclet.since, + experimental : classDoclet && classDoclet.experimental, + specialSettings : {}, + properties : {}, + aggregations : {}, + associations : {}, + events : {}, + methods : {}, + annotations : {}, + designtime: false + }; + + function upper(n) { + return n.slice(0,1).toUpperCase() + n.slice(1); + } + + function each(node, defaultKey, callback) { + var map,n,settings,doclet; + + map = node && createPropertyMap(node.value); + if ( map ) { + for (n in map ) { + if ( map.hasOwnProperty(n) ) { + doclet = getLeadingDoclet(map[n]); + settings = createPropertyMap(map[n].value, defaultKey); + if ( settings == null ) { + error("no valid metadata for " + n + " (AST type '" + map[n].value.type + "')"); + continue; + } + + callback(n, settings, doclet, map[n]); + } + } + } + } + + var classInfoNode = extendCall.arguments[1]; + var classInfoMap = createPropertyMap(classInfoNode); + if ( classInfoMap && classInfoMap.metadata && classInfoMap.metadata.value.type !== Syntax.ObjectExpression ) { + warning("class metadata exists but can't be analyzed. It is not of type 'ObjectExpression', but a '" + classInfoMap.metadata.value.type + "'."); + return null; + } + + var metadata = classInfoMap && classInfoMap.metadata && createPropertyMap(classInfoMap.metadata.value); + if ( metadata ) { + + debug(" analyzing metadata for '" + oClassInfo.name + "'"); + + oClassInfo["abstract"] = !!(metadata["abstract"] && metadata["abstract"].value.value); + oClassInfo["final"] = !!(metadata["final"] && metadata["final"].value.value); + oClassInfo.dnd = metadata.dnd && convertDragDropValue(metadata.dnd.value); + + if ( metadata.interfaces ) { + oClassInfo.interfaces = convertStringArray(metadata.interfaces.value); + } + + each(metadata.specialSettings, "type", function(n, settings, doclet) { + oClassInfo.specialSettings[n] = { + name : n, + doc : doclet && doclet.description, + since : doclet && doclet.since, + deprecation : doclet && doclet.deprecated, + experimental : doclet && doclet.experimental, + visibility : (settings.visibility && settings.visibility.value.value) || "public", + type : settings.type ? settings.type.value.value : "any" + }; + }); + + oClassInfo.defaultProperty = (metadata.defaultProperty && metadata.defaultProperty.value.value) || undefined; + + each(metadata.properties, "type", function(n, settings, doclet) { + var type; + var N = upper(n); + var methods; + oClassInfo.properties[n] = { + name : n, + doc : doclet && doclet.description, + since : doclet && doclet.since, + deprecation : doclet && doclet.deprecated, + experimental : doclet && doclet.experimental, + visibility : (settings.visibility && settings.visibility.value.value) || "public", + type : (type = settings.type ? settings.type.value.value : "string"), + defaultValue : settings.defaultValue ? convertValue(settings.defaultValue.value, type, n) : null, + group : settings.group ? settings.group.value.value : 'Misc', + bindable : settings.bindable ? !!convertValue(settings.bindable.value) : false, + methods: (methods = { + "get": "get" + N, + "set": "set" + N + }) + }; + if ( oClassInfo.properties[n].bindable ) { + methods["bind"] = "bind" + N; + methods["unbind"] = "unbind" + N; + } + // if ( !settings.defaultValue ) { + // console.log("property without defaultValue: " + oClassInfo.name + "." + n); + //} + if ( oClassInfo.properties[n].visibility !== 'public' ) { + error("Property '" + n + "' uses visibility '" + oClassInfo.properties[n].visibility + "' which is not supported by the runtime"); + } + }); + + oClassInfo.defaultAggregation = (metadata.defaultAggregation && metadata.defaultAggregation.value.value) || undefined; + + each(metadata.aggregations, "type", function(n, settings, doclet) { + var N = upper(n); + var methods; + var aggr = oClassInfo.aggregations[n] = { + name: n, + doc : doclet && doclet.description, + deprecation : doclet && doclet.deprecated, + since : doclet && doclet.since, + experimental : doclet && doclet.experimental, + visibility : (settings.visibility && settings.visibility.value.value) || "public", + type : settings.type ? settings.type.value.value : "sap.ui.core.Control", + altTypes: settings.altTypes ? convertStringArray(settings.altTypes.value) : undefined, + singularName : settings.singularName ? settings.singularName.value.value : guessSingularName(n), + cardinality : (settings.multiple && !settings.multiple.value.value) ? "0..1" : "0..n", + bindable : settings.bindable ? !!convertValue(settings.bindable.value) : false, + methods: (methods = { + "get": "get" + N, + "destroy": "destroy" + N + }) + }; + + aggr.dnd = settings.dnd && convertDragDropValue(settings.dnd.value, aggr.cardinality); + + if ( aggr.cardinality === "0..1" ) { + methods["set"] = "set" + N; + } else { + var N1 = upper(aggr.singularName); + methods["insert"] = "insert" + N1; + methods["add"] = "add" + N1; + methods["remove"] = "remove" + N1; + methods["indexOf"] = "indexOf" + N1; + methods["removeAll"] = "removeAll" + N; + } + if ( aggr.bindable ) { + methods["bind"] = "bind" + N; + methods["unbind"] = "unbind" + N; + } + }); + + each(metadata.associations, "type", function(n, settings, doclet) { + var N = upper(n); + var methods; + oClassInfo.associations[n] = { + name: n, + doc : doclet && doclet.description, + deprecation : doclet && doclet.deprecated, + since : doclet && doclet.since, + experimental : doclet && doclet.experimental, + visibility : (settings.visibility && settings.visibility.value.value) || "public", + type : settings.type ? settings.type.value.value : "sap.ui.core.Control", + singularName : settings.singularName ? settings.singularName.value.value : guessSingularName(n), + cardinality : (settings.multiple && settings.multiple.value.value) ? "0..n" : "0..1", + methods: (methods = { + "get": "get" + N + }) + }; + if ( oClassInfo.associations[n].cardinality === "0..1" ) { + methods["set"] = "set" + N; + } else { + var N1 = upper(oClassInfo.associations[n].singularName); + methods["add"] = "add" + N1; + methods["remove"] = "remove" + N1; + methods["removeAll"] = "removeAll" + N; + } + if ( oClassInfo.associations[n].visibility !== 'public' ) { + error("Association '" + n + "' uses visibility '" + oClassInfo.associations[n].visibility + "' which is not supported by the runtime"); + } + }); + + each(metadata.events, null, function(n, settings, doclet) { + var N = upper(n); + var info = oClassInfo.events[n] = { + name: n, + doc : doclet && doclet.description, + deprecation : doclet && doclet.deprecated, + since : doclet && doclet.since, + experimental : doclet && doclet.experimental, + visibility : /* (settings.visibility && settings.visibility.value.value) || */ "public", + allowPreventDefault : !!(settings.allowPreventDefault && settings.allowPreventDefault.value.value), + parameters : {}, + methods: { + "attach": "attach" + N, + "detach": "detach" + N, + "fire": "fire" + N + } + }; + each(settings.parameters, "type", function(pName, pSettings, pDoclet) { + info.parameters[pName] = { + name : pName, + doc : pDoclet && pDoclet.description, + deprecation : pDoclet && pDoclet.deprecated, + since : pDoclet && pDoclet.since, + experimental : pDoclet && pDoclet.experimental, + type : pSettings && pSettings.type ? pSettings.type.value.value : "" + }; + }); + }); + + var designtime = (metadata.designtime && convertValue(metadata.designtime.value)) || (metadata.designTime && convertValue(metadata.designTime.value)); + if ( typeof designtime === 'string' || typeof designtime === 'boolean' ) { + oClassInfo.designtime = designtime; + } + // console.log(oClassInfo.name + ":" + JSON.stringify(oClassInfo, null, " ")); + } + + // remember class info by name + classInfos[oClassInfo.name] = oClassInfo; + + return oClassInfo; +} + +function collectDesigntimeInfo(dtNode) { + + function each(node, defaultKey, callback) { + var map,n,settings,doclet; + + map = node && createPropertyMap(node.value); + if ( map ) { + for (n in map ) { + if ( map.hasOwnProperty(n) ) { + doclet = getLeadingDoclet(map[n], true); + settings = createPropertyMap(map[n].value, defaultKey); + if ( settings == null ) { + error("no valid metadata for " + n + " (AST type '" + map[n].value.type + "')"); + continue; + } + + callback(n, settings, doclet, map[n]); + } + } + } + } + + var oDesigntimeInfo; + + var map = createPropertyMap(dtNode.argument); + + if (map.annotations) { + + oDesigntimeInfo = { + annotations: {} + }; + + each(map.annotations, null, function(n, settings, doclet) { + var appliesTo = [], + targets = [], + i, oAnno, iPos; + + if (settings.appliesTo) { + for (i = 0; i < settings.appliesTo.value.elements.length; i++) { + appliesTo.push(settings.appliesTo.value.elements[i].value); + } + } + + if (settings.target) { + for (i = 0; i < settings.target.value.elements.length; i++) { + targets.push(settings.target.value.elements[i].value); + } + } + + oDesigntimeInfo.annotations[n] = { + name: n, + doc : doclet && doclet.description, + deprecation : doclet && doclet.deprecated, + since : doclet && doclet.since || settings.since && settings.since.value.value, + namespace: settings.namespace && settings.namespace.value.value, + annotation: settings.annotation && settings.annotation.value.value, + appliesTo: appliesTo, + target: targets, + interpretation: settings.interpretation && settings.interpretation.value.value, + defaultValue: settings.defaultValue && settings.defaultValue.value.value + }; + + oAnno = oDesigntimeInfo.annotations[n].annotation; + iPos = oAnno && oAnno.lastIndexOf("."); + + if ( !oDesigntimeInfo.annotations[n].namespace && iPos > 0 ) { + oDesigntimeInfo.annotations[n].namespace = oAnno.slice(0, iPos); + oDesigntimeInfo.annotations[n].annotation = oAnno.slice(iPos + 1); + } + }) + } + + return oDesigntimeInfo; +} + +function determineValueRangeBorder(range, expression, varname, inverse) { + if ( expression.type === Syntax.BinaryExpression ) { + var value; + if ( expression.left.type === Syntax.Identifier && expression.left.name === varname && expression.right.type === Syntax.Literal ) { + value = expression.right.value; + } else if ( expression.left.type === Syntax.Literal && expression.right.type === Syntax.Identifier && expression.right.name === varname ) { + inverse = !inverse; + value = expression.left.value; + } else { + return false; + } + switch (expression.operator) { + case '<': + range[inverse ? 'minExclusive' : 'maxExclusive'] = value; + break; + case '<=': + range[inverse ? 'minInclusive' : 'maxInclusive'] = value; + break; + case '>=': + range[inverse ? 'maxInclusive' : 'minInclusive'] = value; + break; + case '>': + range[inverse ? 'maxExclusive' : 'minExclusive'] = value; + break; + default: + return false; + } + return true; + } + return false; +} + +function determineValueRange(expression, varname, inverse) { + var range = {}; + if ( expression.type === Syntax.LogicalExpression + && expression.operator === '&&' + && expression.left.type === Syntax.BinaryExpression + && expression.right.type === Syntax.BinaryExpression + && determineValueRangeBorder(range, expression.left, varname, inverse) + && determineValueRangeBorder(range, expression.right, varname, inverse) ) { + return range; + } else if ( expression.type === Syntax.BinaryExpression + && determineValueRangeBorder(range, expression, varname, inverse) ) { + return range; + } + return undefined; +} + +function collectDataTypeInfo(extendCall, classDoclet) { + var args = extendCall.arguments, + i = 0, + name, def, base, pattern, range; + + if ( i < args.length && args[i].type === Syntax.Literal && typeof args[i].value === 'string' ) { + name = args[i++].value; + } + if ( i < args.length && args[i].type === Syntax.ObjectExpression ) { + def = createPropertyMap(args[i++]); + } + if ( i < args.length ) { + if ( args[i].type === Syntax.Literal && typeof args[i].value === 'string' ) { + base = args[i++].value; + } else if ( args[i].type === Syntax.CallExpression + && args[i].callee.type === Syntax.MemberExpression + && /^(sap\.ui\.base\.)?DataType$/.test(getObjectName(args[i].callee.object)) + && args[i].callee.property.type === Syntax.Identifier + && args[i].callee.property.name === 'getType' + && args[i].arguments.length === 1 + && args[i].arguments[0].type === Syntax.Literal + && typeof args[i].arguments[0].value === 'string' ) { + base = args[i++].arguments[0].value; + } else { + error("could not identify base type of data type '" + name + "'"); + } + } else { + base = "any"; + } + + if ( def + && def.isValid + && def.isValid.value.type === Syntax.FunctionExpression + && def.isValid.value.params.length === 1 + && def.isValid.value.params[0].type === Syntax.Identifier + && def.isValid.value.body.body.length === 1 ) { + var varname = def.isValid.value.params[0].name; + var stmt = def.isValid.value.body.body[0]; + if ( stmt.type === Syntax.ReturnStatement && stmt.argument ) { + if ( stmt.argument.type === Syntax.CallExpression + && stmt.argument.callee.type === Syntax.MemberExpression + && stmt.argument.callee.object.type === Syntax.Literal + && stmt.argument.callee.object.regex + && stmt.argument.callee.property.type === Syntax.Identifier + && stmt.argument.callee.property.name === 'test' ) { + pattern = stmt.argument.callee.object.regex.pattern; + // console.log(pattern); + } else { + range = determineValueRange(stmt.argument, varname, false); + } + } else if ( stmt.type === Syntax.IfStatement + && stmt.consequent.type === Syntax.BlockStatement + && stmt.consequent.body.length === 1 + && stmt.consequent.body[0].type === Syntax.ReturnStatement + && stmt.consequent.body[0].argument + && stmt.consequent.body[0].argument.type === Syntax.Literal + && typeof stmt.consequent.body[0].argument.value === 'boolean' + && stmt.alternate.type === Syntax.BlockStatement + && stmt.alternate.body.length === 1 + && stmt.alternate.body[0].type === Syntax.ReturnStatement + && stmt.alternate.body[0].argument + && stmt.alternate.body[0].argument.type === Syntax.Literal + && typeof stmt.alternate.body[0].argument.value === 'boolean' + && stmt.consequent.body[0].argument.value !== typeof stmt.alternate.body[0].argument.value ) { + var inverse = stmt.alternate.body[0].argument.value; + range = determineValueRange(stmt.test, varname, inverse); + } else { + console.log(stmt); + } + } + + // remember type info by name + if ( name && def && base ) { + typeInfos[name] = { + name: name, + def: def, + pattern: pattern, + range: range, + base: base + }; + // console.log("found data type:", typeInfos[name]); + } +} + +var rEmptyLine = /^\s*$/; + +function createAutoDoc(oClassInfo, classComment, node, parser, filename, commentAlreadyProcessed) { + + var newStyle = !!pluginConfig.newStyle, + includeSettings = !!pluginConfig.includeSettingsInConstructor, + rawClassComment = getRawComment(classComment), + p,n,n1,pName,info,lines,link; + + function isEmpty(obj) { + if ( !obj ) { + return true; + } + for (var n in obj) { + if ( obj.hasOwnProperty(n) ) { + return false; + } + } + return true; + } + + function jsdocCommentFound(comment) { + parser.emit('jsdocCommentFound', { + event:'jsdocCommentFound', + comment : comment, + lineno : node.loc.start.line, + filename : filename, + range : [ node.range[0], node.range[0] ] + }, parser); + } + + function removeDuplicateEmptyLines(lines) { + var lastWasEmpty = false, + i,j,l,line; + + for (i = 0, j = 0, l = lines.length; i < l; i++) { + line = lines[i]; + if ( line == null || rEmptyLine.test(line) ) { + if ( !lastWasEmpty ) { + lines[j++] = line; + } + lastWasEmpty = true; + } else { + lines[j++] = line; + lastWasEmpty = false; + } + } + return j < i ? lines.slice(0,j) : lines; + } + + function newJSDoc(lines) { + //console.log("add completely new jsdoc comment to prog " + node.type + ":" + node.nodeId + ":" + Object.keys(node)); + + lines = removeDuplicateEmptyLines(lines); + lines.push("@synthetic"); + + var comment = " * " + lines.join("\r\n * "); + jsdocCommentFound("/**\r\n" + comment + "\r\n */") + + var m = /@name\s+([^\r\n\t ]+)/.exec(comment); + debug(" creating synthetic comment '" + (m && m[1]) + "'"); + } + + function rname(prefix,n,_static) { + return (_static ? "." : "#") + prefix + n.slice(0,1).toUpperCase() + n.slice(1); + } + + function name(prefix,n,_static) { + return oClassInfo.name + rname(prefix,n,_static); + } + + /* + * creates a JSDoc type string from the given metadata info object. + * It takes into account the type, the altTypes and the cardinality + * (the latter only if componentTypeOnly is not set). + */ + function makeTypeString(aggr, componentTypeOnly) { + var s = aggr.type; + if ( aggr.altTypes ) { + s = s + "|" + aggr.altTypes.join("|"); + } + if ( !componentTypeOnly && aggr.cardinality === "0..n" ) { + // if multiple types are allowed, use Array.<> for proper grouping + if ( aggr.altTypes ) { + s = "Array.<" + s + ">"; + } else { + s = s + "[]"; + } + } + return s; + } + +// function shortname(s) { +// return s.slice(s.lastIndexOf('.') + 1); +// } + + var HUNGARIAN_PREFIXES = { + 'int' : 'i', + 'boolean' : 'b', + 'float' : 'f', + 'string' : 's', + 'function' : 'fn', + 'object' : 'o', + 'regexp' : 'r', + 'jQuery' : '$', + 'any' : 'o', + 'variant' : 'v', + 'map' : 'm' + }; + + function varname(n, type, property) { + var prefix = HUNGARIAN_PREFIXES[type] || (property ? "s" : "o"); + return prefix + n.slice(0,1).toUpperCase() + n.slice(1); + } + + // add a list of the possible settings if and only if + // - documentation for the constructor exists + // - no (generated) documentation for settings exists already + // - a suitable place for inserting the settings can be found + var m = /(?:^|\r\n|\n|\r)[ \t]*\**[ \t]*@[a-zA-Z]/.exec(rawClassComment); + p = m ? m.index : -1; + var hasSettingsDocs = rawClassComment.indexOf("The supported settings are:") >= 0; + + // heuristic to recognize a ManagedObject + var isManagedObject = ( + /@extends\s+sap\.ui\.(?:base\.ManagedObject|core\.(?:Element|Control|Component))(?:\s|$)/.test(rawClassComment) + || oClassInfo.library + || !isEmpty(oClassInfo.specialSettings) + || !isEmpty(oClassInfo.properties) + || !isEmpty(oClassInfo.aggregations) + || !isEmpty(oClassInfo.associations) + || !isEmpty(oClassInfo.events) + ); + + if ( p >= 0 && !hasSettingsDocs ) { + lines = [ + "" + ]; + + if ( isManagedObject ) { // only a ManagedObject has settings + + if ( oClassInfo.name !== "sap.ui.base.ManagedObject" ) { + // add the hint for the general description only when the current class is not ManagedObject itself + lines.push( + "", + "Accepts an object literal mSettings that defines initial", + "property values, aggregated and associated objects as well as event handlers.", + "See {@link sap.ui.base.ManagedObject#constructor} for a general description of the syntax of the settings object." + ); + } + + // add the settings section only if there are any settings + if ( !isEmpty(oClassInfo.properties) + || !isEmpty(oClassInfo.aggregations) + || !isEmpty(oClassInfo.associations) + || !isEmpty(oClassInfo.events) ) { + + lines.push( + "", + includeSettings ? "" : "@ui5-settings", + "The supported settings are:", + "
    " + ); + if ( !isEmpty(oClassInfo.properties) ) { + lines.push("
  • Properties"); + lines.push("
      "); + for (n in oClassInfo.properties) { + lines.push("
    • {@link " + rname("get", n) + " " + n + "} : " + oClassInfo.properties[n].type + (oClassInfo.properties[n].defaultValue !== null ? " (default: " + oClassInfo.properties[n].defaultValue + ")" : "") + (oClassInfo.defaultProperty == n ? " (default)" : "") + "
    • "); + } + lines.push("
    "); + lines.push("
  • "); + } + if ( !isEmpty(oClassInfo.aggregations) ) { + lines.push("
  • Aggregations"); + lines.push("
      "); + for (n in oClassInfo.aggregations) { + if ( oClassInfo.aggregations[n].visibility !== "hidden" ) { + lines.push("
    • {@link " + rname("get", n) + " " + n + "} : " + makeTypeString(oClassInfo.aggregations[n]) + (oClassInfo.defaultAggregation == n ? " (default)" : "") + "
    • "); + } + } + lines.push("
    "); + lines.push("
  • "); + } + if ( !isEmpty(oClassInfo.associations) ) { + lines.push("
  • Associations"); + lines.push("
      "); + for (n in oClassInfo.associations) { + lines.push("
    • {@link " + rname("get", n) + " " + n + "} : (sap.ui.core.ID | " + oClassInfo.associations[n].type + ")" + (oClassInfo.associations[n].cardinality === "0..n" ? "[]" : "") + "
    • "); + } + lines.push("
    "); + lines.push("
  • "); + } + if ( !isEmpty(oClassInfo.events) ) { + lines.push("
  • Events"); + lines.push("
      "); + for (n in oClassInfo.events) { + lines.push("
    • {@link " + "#event:" + n + " " + n + "} : fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject]
    • "); + } + lines.push("
    "); + lines.push("
  • "); + } + lines.push("
"); + + // add the reference to the base class only if this is not ManagedObject and if the base class is known + if ( oClassInfo.name !== "sap.ui.base.ManagedObject" && oClassInfo.baseType ) { + lines.push( + "", + "In addition, all settings applicable to the base type {@link " + oClassInfo.baseType + "#constructor " + oClassInfo.baseType + "}", + "can be used as well." + ); + } + lines.push(""); + + } else if ( oClassInfo.name !== "sap.ui.base.ManagedObject" && oClassInfo.baseType && oClassInfo.hasOwnProperty("abstract") ) { + + // if a class has no settings, but metadata, point at least to the base class - if it makes sense + lines.push( + "", + newStyle && !includeSettings ? "@ui5-settings" : "", + "This class does not have its own settings, but all settings applicable to the base type", + "{@link " + oClassInfo.baseType + "#constructor " + oClassInfo.baseType + "} can be used." + ); + + } + } + + debug(" enhancing constructor documentation with settings"); + var enhancedComment = + rawClassComment.slice(0,p) + + "\n * " + removeDuplicateEmptyLines(lines).join("\n * ") + + (commentAlreadyProcessed ? "@ui5-updated-doclet\n * " : "") + + rawClassComment.slice(p); + enhancedComment = preprocessComment({ comment : enhancedComment, lineno : classComment.lineno }); + + if ( commentAlreadyProcessed ) { + jsdocCommentFound(enhancedComment); + } else { + setRawComment(classComment, enhancedComment); + } + + } + + newJSDoc([ + "Returns a metadata object for class " + oClassInfo.name + ".", + "", + "@returns {sap.ui.base.Metadata} Metadata object describing this class", + "@public", + "@static", + "@name " + name("getMetadata", "", true), + "@function" + ]); + + if ( !oClassInfo["final"] ) { + newJSDoc([ + "Creates a new subclass of class " + oClassInfo.name + " with name sClassName", + "and enriches it with the information contained in oClassInfo.", + "", + "oClassInfo might contain the same kind of information as described in {@link " + (oClassInfo.baseType ? oClassInfo.baseType + ".extend" : "sap.ui.base.Object.extend Object.extend") + "}.", + "", + "@param {string} sClassName Name of the class being created", + "@param {object} [oClassInfo] Object literal with information about the class", + "@param {function} [FNMetaImpl] Constructor function for the metadata object; if not given, it defaults to sap.ui.core.ElementMetadata", + "@returns {function} Created class / constructor function", + "@public", + "@static", + "@name " + name("extend", "", true), + "@function" + ]); + } + + for (n in oClassInfo.properties ) { + info = oClassInfo.properties[n]; + if ( info.visibility === 'hidden' ) { + continue; + } + // link = newStyle ? "{@link #setting:" + n + " " + n + "}" : "" + n + ""; + link = "{@link " + (newStyle ? "#setting:" + n : rname("get", n)) + " " + n + "}"; + newJSDoc([ + "Gets current value of property " + link + ".", + "", + !newStyle && info.doc ? info.doc : "", + "", + info.defaultValue !== null ? "Default value is " + (info.defaultValue === "" ? "empty string" : info.defaultValue) + "." : "", + "@returns {" + info.type + "} Value of property " + n + "", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("get",n), + "@function" + ]); + newJSDoc([ + "Sets a new value for property " + link + ".", + "", + !newStyle && info.doc ? info.doc : "", + "", + "When called with a value of null or undefined, the default value of the property will be restored.", + "", + info.defaultValue !== null ? "Default value is " + (info.defaultValue === "" ? "empty string" : info.defaultValue) + "." : "", + "@param {" + info.type + "} " + varname(n,info.type,true) + " New value for property " + n + "", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("set",n), + "@function" + ]); + if ( info.bindable ) { + newJSDoc([ + "Binds property " + link + " to model data.", + "", + "See {@link sap.ui.base.ManagedObject#bindProperty ManagedObject.bindProperty} for a ", + "detailed description of the possible properties of oBindingInfo", + "@param {object} oBindingInfo The binding information", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("bind",n), + "@function" + ]); + newJSDoc([ + "Unbinds property " + link + " from model data.", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("unbind",n), + "@function" + ]); + } + } + + for (n in oClassInfo.aggregations ) { + info = oClassInfo.aggregations[n]; + if ( info.visibility === 'hidden' ) { + continue; + } + // link = newStyle ? "{@link #setting:" + n + " " + n + "}" : "" + n + ""; + link = "{@link " + (newStyle ? "#setting:" + n : rname("get", n)) + " " + n + "}"; + newJSDoc([ + "Gets content of aggregation " + link + ".", + "", + !newStyle && info.doc ? info.doc : "", + "", + n === info.defaultAggregation ? "Note: this is the default aggregation for " + n + "." : "", + "@returns {" + makeTypeString(info) + "}", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("get",n), + "@function" + ]); + if ( info.cardinality == "0..n" ) { + n1 = info.singularName; + newJSDoc([ + "Inserts a " + n1 + " into the aggregation " + link + ".", + "", + "@param {" + makeTypeString(info, true) + "}", + " " + varname(n1,info.altTypes ? "variant" : info.type) + " The " + n1 + " to insert; if empty, nothing is inserted", + "@param {int}", + " iIndex The 0-based index the " + n1 + " should be inserted at; for", + " a negative value of iIndex, the " + n1 + " is inserted at position 0; for a value", + " greater than the current size of the aggregation, the " + n1 + " is inserted at", + " the last position", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("insert",n1), + "@function" + ]); + newJSDoc([ + "Adds some " + n1 + " to the aggregation " + link + ".", + + "@param {" + makeTypeString(info, true) + "}", + " " + varname(n1,info.altTypes ? "variant" : info.type) + " The " + n1 + " to add; if empty, nothing is inserted", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("add",n1), + "@function" + ]); + newJSDoc([ + "Removes a " + n1 + " from the aggregation " + link + ".", + "", + "@param {int | string | " + makeTypeString(info, true) + "} " + varname(n1,"variant") + " The " + n1 + " to remove or its index or id", + "@returns {" + makeTypeString(info, true) + "} The removed " + n1 + " or null", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("remove", n1), + "@function" + ]); + newJSDoc([ + "Removes all the controls from the aggregation " + link + ".", + "", + "Additionally, it unregisters them from the hosting UIArea.", + "@returns {" + makeTypeString(info) + "} An array of the removed elements (might be empty)", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("removeAll", n), + "@function" + ]); + newJSDoc([ + "Checks for the provided " + info.type + " in the aggregation " + link + ".", + "and returns its index if found or -1 otherwise.", + "@param {" + makeTypeString(info, true) + "}", + " " + varname(n1, info.altTypes ? "variant" : info.type) + " The " + n1 + " whose index is looked for", + "@returns {int} The index of the provided control in the aggregation if found, or -1 otherwise", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("indexOf", n1), + "@function" + ]); + } else { + newJSDoc([ + "Sets the aggregated " + link + ".", + "@param {" + makeTypeString(info) + "} " + varname(n, info.altTypes ? "variant" : info.type) + " The " + n + " to set", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("set", n), + "@function" + ]); + } + newJSDoc([ + "Destroys " + (info.cardinality === "0..n" ? "all " : "") + "the " + n + " in the aggregation " + link + ".", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("destroy", n), + "@function" + ]); + if ( info.bindable ) { + newJSDoc([ + "Binds aggregation " + link + " to model data.", + "", + "See {@link sap.ui.base.ManagedObject#bindAggregation ManagedObject.bindAggregation} for a ", + "detailed description of the possible properties of oBindingInfo.", + "@param {object} oBindingInfo The binding information", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("bind",n), + "@function" + ]); + newJSDoc([ + "Unbinds aggregation " + link + " from model data.", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("unbind",n), + "@function" + ]); + } + } + + for (n in oClassInfo.associations ) { + info = oClassInfo.associations[n]; + if ( info.visibility === 'hidden' ) { + continue; + } + // link = newStyle ? "{@link #setting:" + n + " " + n + "}" : "" + n + ""; + link = "{@link " + (newStyle ? "#setting:" + n : rname("get", n)) + " " + n + "}"; + newJSDoc([ + info.cardinality === "0..n" ? + "Returns array of IDs of the elements which are the current targets of the association " + link + "." : + "ID of the element which is the current target of the association " + link + ", or null.", + "", + newStyle && info.doc ? info.doc : "", + "", + "@returns {sap.ui.core.ID" + (info.cardinality === "0..n" ? "[]" : "") + "}", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("get",n), + "@function" + ]); + if ( info.cardinality === "0..n" ) { + n1 = info.singularName; + newJSDoc([ + "Adds some " + n1 + " into the association " + link + ".", + "", + "@param {sap.ui.core.ID | " + info.type + "} " + varname(n1, "variant") + " The " + n + " to add; if empty, nothing is inserted", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("add",n1), + "@function" + ]); + newJSDoc([ + "Removes an " + n1 + " from the association named " + link + ".", + "@param {int | sap.ui.core.ID | " + info.type + "} " + varname(n1,"variant") + " The " + n1 + " to be removed or its index or ID", + "@returns {sap.ui.core.ID} The removed " + n1 + " or null", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("remove", n1), + "@function" + ]); + newJSDoc([ + "Removes all the controls in the association named " + link + ".", + "@returns {sap.ui.core.ID[]} An array of the removed elements (might be empty)", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("removeAll", n), + "@function" + ]); + } else { + newJSDoc([ + "Sets the associated " + link + ".", + "@param {sap.ui.core.ID | " + info.type + "} " + varname(n, info.type) + " ID of an element which becomes the new target of this " + n + " association; alternatively, an element instance may be given", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("set", n), + "@function" + ]); + } + } + + for (n in oClassInfo.events ) { + info = oClassInfo.events[n]; + //link = newStyle ? "{@link #event:" + n + " " + n + "}" : "" + n + ""; + link = "{@link #event:" + n + " " + n + "}"; + + lines = [ + info.doc ? info.doc : "", + "", + "@name " + oClassInfo.name + "#" + n, + "@event", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@param {sap.ui.base.Event} oControlEvent", + "@param {sap.ui.base.EventProvider} oControlEvent.getSource", + "@param {object} oControlEvent.getParameters" + ]; + for (pName in info.parameters ) { + lines.push( + "@param {" + (info.parameters[pName].type || "") + "} oControlEvent.getParameters." + pName + " " + (info.parameters[pName].doc || "") + ); + } + lines.push("@public"); + newJSDoc(lines); + + newJSDoc([ + "Attaches event handler fnFunction to the " + link + " event of this " + oClassInfo.name + ".", + "", + "When called, the context of the event handler (its this) will be bound to oListener if specified, ", + "otherwise it will be bound to this " + oClassInfo.name + " itself.", + "", + !newStyle && info.doc ? info.doc : "", + "", + "@param {object}", + " [oData] An application-specific payload object that will be passed to the event handler along with the event object when firing the event", + "@param {function}", + " fnFunction The function to be called when the event occurs", + "@param {object}", + " [oListener] Context object to call the event handler with. Defaults to this " + oClassInfo.name + " itself", + "", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + "@public", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@name " + name("attach", n), + "@function" + ]); + newJSDoc([ + "Detaches event handler fnFunction from the " + link + " event of this " + oClassInfo.name + ".", + "", + "The passed function and listener object must match the ones used for event registration.", + "", + "@param {function}", + " fnFunction The function to be called, when the event occurs", + "@param {object}", + " oListener Context object on which the given function had to be called", + "@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@public", + "@name " + name("detach", n), + "@function" + ]); + + // build documentation for fireEvent. It contains conditional parts which makes it a bit more complicated + lines = [ + "Fires event " + link + " to attached listeners." + ]; + if ( info.allowPreventDefault ) { + lines.push( + "", + "Listeners may prevent the default action of this event by using the preventDefault-method on the event object.", + ""); + } + lines.push( + "", + "@param {object} [mParameters] Parameters to pass along with the event" + ); + if ( !isEmpty(info.parameters) ) { + for (pName in info.parameters) { + lines.push( + "@param {" + (info.parameters[pName].type || "any") + "} [mParameters." + pName + "] " + (info.parameters[pName].doc || "") + ); + } + lines.push(""); + } + if ( info.allowPreventDefault ) { + lines.push("@returns {boolean} Whether or not to prevent the default action"); + } else { + lines.push("@returns {" + oClassInfo.name + "} Reference to this in order to allow method chaining"); + } + lines.push( + "@protected", + info.since ? "@since " + info.since : "", + info.deprecation ? "@deprecated " + info.deprecation : "", + info.experimental ? "@experimental " + info.experimental : "", + "@name " + name("fire", n), + "@function" + ); + newJSDoc(lines); + } + +} + +function createDataTypeAutoDoc(oTypeInfo, classComment, node, parser, filename) { +} + +/** + * Creates a human readable location info for a given doclet. + * @param doclet + * @returns {String} + */ +function location(doclet) { + var filename = (doclet.meta && doclet.meta.filename) || "unknown"; + return " #" + ui5data(doclet).id + "@" + filename + (doclet.meta.lineno != null ? ":" + doclet.meta.lineno : "") + (doclet.synthetic ? "(synthetic)" : ""); +} + +// ---- Comment handling --------------------------------------------------------------------------- + +// --- comment related functions that depend on the JSdoc version (e.g. on the used parser) + +var isDocComment; +var getLeadingCommentNode; + +// JSDoc added the node type Syntax.File with the same change that activated Babylon +// See https://github.com/jsdoc3/jsdoc/commit/ffec4a42291de6d68e6240f304b68d6abb82a869 +if ( Syntax.File === 'File' ) { + + // JSDoc starting with version 3.5.0 + + isDocComment = function isDocCommentBabylon(comment) { + return comment && comment.type === 'CommentBlock' && comment.value && comment.value.charAt(0) === '*'; + } + + getLeadingCommentNode = function getLeadingCommentNodeBabylon(node, longname) { + var leadingComments = node.leadingComments; + if ( Array.isArray(leadingComments) ) { + // in babylon, all comments are already attached to the node + // and the last one is the closest one and should win + // non-block comments have to be filtered out + leadingComments = leadingComments.filter(isDocComment); + if ( leadingComments.length > 0 ) { + return leadingComments[leadingComments.length - 1]; + } + } + } + +} else { + + // JSDoc versions before 3.5.0 + + isDocComment = function isDoccommentEsprima(comment) { + return comment && comment.type === 'Block'; + }; + + getLeadingCommentNode = function getLeadingCommentNodeEsprima(node, longname) { + var comment, + leadingComments = node.leadingComments; + + // when espree is used, JSDOc attached the leading comment and the first one was picked + if (Array.isArray(leadingComments) && leadingComments.length && leadingComments[0].raw) { + comment = leadingComments[0]; + } + + // also check all comments attached to the Program node (if found) whether they refer to the same longname + // TODO check why any matches here override the direct leading comment from above + if ( longname && currentProgram && currentProgram.leadingComments && currentProgram.leadingComments.length ) { + leadingComments = currentProgram.leadingComments; + var rLongname = new RegExp("@(name|alias|class|namespace)\\s+" + longname.replace(/\./g, '\\.')); + for ( var i = 0; i < leadingComments.length; i++ ) { + var raw = getRawComment(leadingComments[i]); + if ( /^\/\*\*[\s\S]*\*\/$/.test(raw) && rLongname.test(raw) ) { + comment = leadingComments[i]; + // console.log("\n\n**** alternative comment found for " + longname + " on program level\n\n", comment); + break; + } + } + } + + return comment; + } +} + +//--- comment related functions that are independent from the JSdoc version + +function getLeadingComment(node) { + var comment = getLeadingCommentNode(node); + return comment ? getRawComment(comment) : null; +} + +function getLeadingDoclet(node, preprocess) { + var comment = getLeadingComment(node) + if ( comment && preprocess ) { + comment = preprocessComment({comment:comment, lineno: node.loc.start.line }); + } + return comment ? new Doclet(comment, {}) : null; +} + +/** + * Determines the raw comment string (source code form, including leading and trailing comment markers / *...* /) from a comment node. + * Works for Esprima and Babylon based JSDoc versions. + * @param commentNode + * @returns + */ +function getRawComment(commentNode) { + // in esprima, there's a 'raw' property, in babylon, the 'raw' string has to be reconstructed from the 'value' by adding the markers + return commentNode ? commentNode.raw || '/*' + commentNode.value + '*/' : ''; +} + +function setRawComment(commentNode, newRawComment) { + if ( commentNode.raw ) { + commentNode.raw = newRawComment; + } + commentNode.value = newRawComment.slice(2, -2); +} + +/** + * Removes the mandatory comment markers and the optional but common asterisks at the beginning of each JSDoc comment line. + * + * The result is easier to parse/analyze. + * + * Implementation is a 1:1 copy from JSDoc's lib/jsdoc/doclet.js (closure function, not directly reusable) + * + * @param {string} docletSrc the source comment with or without block comment markers + * @returns {string} the unwrapped content of the JSDoc comment + * + */ +function unwrap(docletSrc) { + if (!docletSrc) { return ''; } + + // note: keep trailing whitespace for @examples + // extra opening/closing stars are ignored + // left margin is considered a star and a space + // use the /m flag on regex to avoid having to guess what this platform's newline is + docletSrc = + docletSrc.replace(/^\/\*\*+/, '') // remove opening slash+stars + .replace(/\**\*\/$/, "\\Z") // replace closing star slash with end-marker + .replace(/^\s*(\* ?|\\Z)/gm, '') // remove left margin like: spaces+star or spaces+end-marker + .replace(/\s*\\Z$/g, ''); // remove end-marker + + return docletSrc; +} + +/** + * Inverse operation of unwrap. + * + * The prefix for lines is fixed to be " * ", lines are separated with '\n', independent from the platform. + */ +function wrap(lines) { + if ( typeof lines === "string" ) { + lines = lines.split(/\r\n?|\n/); + } + return "/**\n * " + lines.join('\n * ') + "\n */"; +} + +/** + * Preprocesses a JSDoc comment string to ensure some UI5 standards. + * + * @param {event} e Event for the new comment + * @returns {event} + */ +function preprocessComment(e) { + + var src = e.comment; + + // add a default visibility + if ( !/@private|@public|@protected|@sap-restricted|@ui5-restricted/.test(src) ) { + src = unwrap(src); + src = src + "\n@private"; + src = wrap(src); + // console.log("added default visibility to '" + src + "'"); + } + + if ( /@class/.test(src) && /@static/.test(src) ) { + warning("combination of @class and @static is no longer supported with jsdoc3, converting it to @namespace and @classdesc: (line " + e.lineno + ")"); + src = unwrap(src); + src = src.replace(/@class/, "@classdesc").replace(/@static/, "@namespace"); + src = wrap(src); + //console.log(src); + } + + return src; + +} + +// ---- other functionality --------------------------------------------------------------------------- + +// HACK: override cli.exit() to avoid that JSDoc3 exits the VM +if ( pluginConfig.noExit ) { + info("disabling exit() call"); + require( path.join(global.env.dirname, 'cli') ).exit = function(retval) { + info("cli.exit(): do nothing (ret val=" + retval + ")"); + }; +} + + +// ---- exports ---------------------------------------------------------------------------------------- + +exports.defineTags = function(dictionary) { + + /** + * a special value that is not 'falsy' but results in an empty string when output + * Used for the disclaimer and experimental tag + */ + var EMPTY = { + toString: function() { return ""; } + }; + + /** + * A sapui5 specific tag to add a disclaimer to a symbol + */ + dictionary.defineTag('disclaimer', { + // value is optional + onTagged: function(doclet, tag) { + doclet.disclaimer = tag.value || EMPTY; + } + }); + + /** + * A sapui5 specific tag to mark a symbol as experimental. + */ + dictionary.defineTag('experimental', { + // value is optional + onTagged: function(doclet, tag) { + doclet.experimental = tag.value || EMPTY; + } + }); + + /** + * Re-introduce the deprecated 'final tag. JSDoc used it as a synonym for readonly, but we use it to mark classes as final + */ + dictionary.defineTag('final', { + mustNotHaveValue: true, + onTagged: function(doclet, tag) { + doclet.final_ = true; + } + }); + + /** + * Introduce a new kind of symbol: 'interface' + * 'interface' is like 'class', but without a constructor. + * Support for 'interface' might not be complete (only standard UI5 use cases tested) + */ + dictionary.defineTag('interface', { + //mustNotHaveValue: true, + onTagged: function(doclet, tag) { + // debug("setting kind of " + doclet.name + " to 'interface'"); + doclet.kind = 'interface'; + if ( tag.value ) { + doclet.classdesc = tag.value; + } + } + }); + + /** + * Classes can declare that they implement a set of interfaces + */ + dictionary.defineTag('implements', { + mustHaveValue: true, + onTagged: function(doclet, tag) { + // console.log("setting implements of " + doclet.name + " to 'interface'"); + if ( tag.value ) { + doclet.implements = doclet.implements || []; + tag.value.split(/\s*,\s*/g).forEach(function($) { + if ( doclet.implements.indexOf($) < 0 ) { + doclet.implements.push($); + } + }); + } + } + }); + + /** + * Set the visibility of a doclet to 'restricted'. + */ + dictionary.defineTag('ui5-restricted', { + onTagged: function(doclet, tag) { + doclet.access = 'restricted'; + if ( tag.value ) { + ui5data(doclet).stakeholders = tag.value.trim().split(/(?:\s*,\s*|\s+)/); + } + } + }); + dictionary.defineSynonym('ui5-restricted', 'sap-restricted'); + + /** + * Mark a doclet as synthetic. + * + * Used for doclets that the autodoc generation creates. This helps the template + * later to recognize such doclets and maybe filter them out. + */ + dictionary.defineTag('synthetic', { + mustNotHaveValue: true, + onTagged: function(doclet, tag) { + doclet.synthetic = true; + } + }); + + /** + * Mark a doclet that intentionally updates a previous doclet + */ + dictionary.defineTag('ui5-updated-doclet', { + mustNotHaveValue: true, + onTagged: function(doclet, tag) { + ui5data(doclet).updatedDoclet = true; + } + }); + + /** + * The @hideconstructor tag tells JSDoc that the generated documentation should not display the constructor for a class. + * Note: this tag will be natively available in JSDoc >= 3.5.0 + */ + dictionary.defineTag('hideconstructor', { + mustNotHaveValue: true, + onTagged: function(doclet, tag) { + doclet.hideconstructor = true; + } + }); + +}; + +exports.handlers = { + + /** + * Before all files are parsed, determine the common path prefix of all filenames + */ + parseBegin : function(e) { + + pathPrefixes = env.opts._.reduce(function(result, fileOrDir) { + fileOrDir = path.resolve( path.normalize(fileOrDir) ); + if ( fs.statSync(fileOrDir).isDirectory() ) { + if ( !fileOrDir.endsWith(path.sep) ) { + fileOrDir += path.sep; + } + result.push(fileOrDir); + } + return result; + }, []); + resourceNamePrefixes = pluginConfig.resourceNamePrefixes || []; + if ( !Array.isArray(resourceNamePrefixes) ) { + resourceNamePrefixes = [resourceNamePrefixes]; + } + resourceNamePrefixes.forEach(ensureEndingSlash); + while ( resourceNamePrefixes.length < pathPrefixes.length ) { + resourceNamePrefixes.push(''); + } + + debug("path prefixes " + JSON.stringify(pathPrefixes)); + debug("resource name prefixes " + JSON.stringify(resourceNamePrefixes)); + }, + + /** + * Log each file before it is parsed + */ + fileBegin: function (e) { + currentProgram = undefined; + currentModule = { + name: null, + resource: getResourceName(e.filename), + module: getModuleName(getResourceName(e.filename)), + localNames: Object.create(null) + }; + debug(currentModule); + }, + + fileComplete: function (e) { + currentSource = undefined; + currentProgram = undefined; + currentModule = undefined; + }, + + jsdocCommentFound: function(e) { + // console.log("jsdocCommentFound: " + e.comment); + e.comment = preprocessComment(e); + }, + + symbolFound: function(e) { + // console.log("symbolFound: " + e.comment); + }, + + newDoclet: function(e) { + + var _ui5data = ui5data(e.doclet); + + // remove code: this is a try to reduce the required heap size + if ( e.doclet.meta ) { + if ( e.doclet.meta.code ) { + e.doclet.meta.code = {}; + } + var filepath = (e.doclet.meta.path && e.doclet.meta.path !== 'null' ) ? path.join(e.doclet.meta.path, e.doclet.meta.filename) : e.doclet.meta.filename; + e.doclet.meta.__shortpath = getRelativePath(filepath); + _ui5data.resource = currentModule.resource; + _ui5data.module = currentModule.name || currentModule.module; + } + + + // JSDoc 3 has a bug when it encounters a property in an object literal with an empty string as name + // (e.g. { "" : something } will result in a doclet without longname + if ( !e.doclet.longname ) { + if ( e.doclet.memberof ) { + e.doclet.longname = e.doclet.memberof + "." + e.doclet.name; // TODO '.' depends on scope? + warning("found doclet without longname, derived longname: " + e.doclet.longname + " " + location(e.doclet)); + } else { + error("found doclet without longname, could not derive longname " + location(e.doclet)); + } + return; + } + + // try to detect misused memberof + if ( e.doclet.memberof && e.doclet.longname.indexOf(e.doclet.memberof) !== 0 ) { + warning("potentially unsupported use of @name and @memberof " + location(e.doclet)); + //console.log(e.doclet); + } + + if ( e.doclet.returns + && e.doclet.returns.length > 0 + && e.doclet.returns[0] + && e.doclet.returns[0].type + && e.doclet.returns[0].type.names + && e.doclet.returns[0].type.names[0] === 'this' + && e.doclet.memberof ) { + warning("fixing return type 'this' with " + e.doclet.memberof); + e.doclet.returns[0].type.names[0] = e.doclet.memberof; + } + }, + + beforeParse : function(e) { + msgHeader("parsing " + getRelativePath(e.filename)); + currentSource = e.source; + }, + + parseComplete : function(e) { + + var doclets = e.doclets; + var l = doclets.length,i,j,doclet; + //var noprivate = !env.opts.private; + var rAnonymous = /^(~|$)/; + + // remove undocumented symbols, ignored symbols, anonymous functions and their members, scope members + for (i = 0, j = 0; i < l; i++) { + + doclet = doclets[i]; + if ( !doclet.undocumented && + !doclet.ignore && + !(doclet.memberof && rAnonymous.test(doclet.memberof)) && + doclet.longname.indexOf("~") < 0 ) { + doclets[j++] = doclet; + } + } + if ( j < l ) { + doclets.splice(j, l - j); + info("removed " + (l - j) + " undocumented, ignored or anonymous symbols"); + l = j; + } + + // sort doclets by name, synthetic, lineno, uid + // 'ignore' is a combination of criteria, see function above + debug("sorting doclets by name"); + doclets.sort(function(a,b) { + if ( a.longname === b.longname ) { + if ( a.synthetic === b.synthetic ) { + if ( a.meta && b.meta && a.meta.filename == b.meta.filename ) { + if ( a.meta.lineno !== b.meta.lineno ) { + return a.meta.lineno < b.meta.lineno ? -1 : 1; + } + } + return a.__ui5.id - b.__ui5.id; + } + return a.synthetic && !b.synthetic ? -1 : 1; + } + return a.longname < b.longname ? -1 : 1; + }); + debug("sorting doclets by name done."); + + for (i = 0, j = 0; i < l; i++) { + + doclet = doclets[i]; + + // add metadata to symbol + if ( classInfos[doclet.longname] ) { + doclet.__ui5.metadata = classInfos[doclet.longname]; + + // add designtime infos, if configured + var designtimeModule = doclet.__ui5.metadata.designtime; + if ( designtimeModule && typeof designtimeModule !== 'string' ) { + designtimeModule = doclet.__ui5.module + ".designtime"; + } + if ( designtimeModule && designtimeInfos[designtimeModule] ) { + info("associating designtime data with class metadata: ", designtimeModule); + // TODO do a more generic merge or maybe add whole information as "designtime" information + doclet.__ui5.metadata.annotations = designtimeInfos[designtimeModule].annotations; + } + + // derive extends from UI5 APIs + if ( doclet.__ui5.metadata.baseType + && !(doclet.augments && doclet.augments.length > 0) ) { + doclet.augments = doclet.augments || []; + info(" @extends " + doclet.__ui5.metadata.baseType + " derived from UI5 APIs (" + doclet.longname + ")"); + doclet.augments.push(doclet.__ui5.metadata.baseType); + } + + // derive interface implementations from UI5 metadata + if ( doclet.__ui5.metadata.interfaces && doclet.__ui5.metadata.interfaces.length ) { + doclet.__ui5.metadata.interfaces.forEach(function(intf) { + doclet.implements = doclet.implements || []; + if ( doclet.implements.indexOf(intf) < 0 ) { + info(" @implements " + intf + " derived from UI5 metadata (" + doclet.longname + ")"); + doclet.implements.push(intf); + } + }) + } + } + + if ( typeInfos[doclet.longname] ) { + doclet.__ui5.stereotype = 'datatype'; + doclet.__ui5.metadata = { + basetype: typeInfos[doclet.longname].base, + pattern: typeInfos[doclet.longname].pattern, + range: typeInfos[doclet.longname].range + }; + } + + // check for duplicates: last one wins + if ( j > 0 && doclets[j - 1].longname === doclet.longname ) { + if ( !doclets[j - 1].synthetic && !doclet.__ui5.updatedDoclet ) { + // replacing synthetic comments or updating comments are trivial case. Just log non-trivial duplicates + debug("ignoring duplicate doclet for " + doclet.longname + ":" + location(doclet) + " overrides " + location(doclets[j - 1])); + } + doclets[j - 1] = doclet; + } else { + doclets[j++] = doclet; + } + } + + if ( j < l ) { + doclets.splice(j, l - j); + info("removed " + (l - j) + " duplicate symbols - " + doclets.length + " remaining"); + } + + if ( pluginConfig.saveSymbols ) { + + fs.mkPath(env.opts.destination); + fs.writeFileSync(path.join(env.opts.destination, "symbols-parseComplete.json"), JSON.stringify(e.doclets, null, "\t"), 'utf8'); + + } + + } +}; + +exports.astNodeVisitor = { + + visitNode: function(node, e, parser, currentSourceName) { + + var comment; + + if ( node.type === Syntax.Program ) { + currentProgram = node; + } + + function processExtendCall(extendCall, comment, commentAlreadyProcessed) { + var doclet = comment && new Doclet(getRawComment(comment), {}); + var classInfo = collectClassInfo(extendCall, doclet); + if ( classInfo ) { + createAutoDoc(classInfo, comment, extendCall, parser, currentSourceName, commentAlreadyProcessed); + } + } + + function processDataType(createCall, comment) { + var doclet = comment && new Doclet(getRawComment(comment), {}); + var typeInfo = collectDataTypeInfo(createCall, doclet); + if ( typeInfo ) { + createDataTypeAutoDoc(typeInfo, comment, createCall, parser, currentSourceName); + } + } + + if ( node.type === Syntax.ExpressionStatement ) { + if ( isSapUiDefineCall(node.expression) ) { + analyzeModuleDefinition(node.expression); + /* + } else if ( isJQuerySapDeclareCall(node.expression) + && node.expression.arguments.length > 0 + && node.expression.arguments[0].type === Syntax.Literal + && typeof node.expression.arguments[0].value === "string" ) { + warning("module has explicit module name " + node.expression.arguments[0].value); + */ + } + + } + + if (node.type === Syntax.ReturnStatement && node.argument && node.argument.type === Syntax.ObjectExpression && /\.designtime\.js$/.test(currentSourceName) ) { + + // assume this node to return designtime metadata. Collect it and remember it by its module name + var oDesigntimeInfo = collectDesigntimeInfo(node); + if ( oDesigntimeInfo ) { + designtimeInfos[currentModule.module] = oDesigntimeInfo; + info("collected designtime info " + currentModule.module); + } + + } else if ( node.type === Syntax.ExpressionStatement && isExtendCall(node.expression) ) { + + // Something.extend(...) -- return value (new class) is not used in an assignment + + // className = node.expression.arguments[0].value; + comment = getLeadingCommentNode(node) || getLeadingCommentNode(node.expression); + // console.log("ast node with comment " + comment); + processExtendCall(node.expression, comment); + + } else if ( node.type === Syntax.VariableDeclaration && node.declarations.length == 1 && isExtendCall(node.declarations[0].init) ) { + + // var NewClass = Something.extend(...) + + // className = node.declarations[0].init.arguments[0].value; + comment = getLeadingCommentNode(node) || getLeadingCommentNode(node.declarations[0]); + // console.log("ast node with comment " + comment); + processExtendCall(node.declarations[0].init, comment); + + } else if ( node.type === Syntax.ReturnStatement && isExtendCall(node.argument) ) { + + // return Something.extend(...) + + var className = node.argument.arguments[0].value; + comment = getLeadingCommentNode(node, className) || getLeadingCommentNode(node.argument, className); + // console.log("ast node with comment " + comment); + processExtendCall(node.argument, comment, true); + } else if ( node.type === Syntax.ExpressionStatement && node.expression.type === Syntax.AssignmentExpression && isCreateDataTypeCall(node.expression.right) ) { + + // thisLib.TypeName = DataType.createType( ... ) + comment = getLeadingCommentNode(node) || getLeadingCommentNode(node.expression); + processDataType(node.expression.right); + } + } + +}; diff --git a/lib/processors/jsdoc/ui5/template/publish.js b/lib/processors/jsdoc/ui5/template/publish.js new file mode 100644 index 000000000..5a766771a --- /dev/null +++ b/lib/processors/jsdoc/ui5/template/publish.js @@ -0,0 +1,4056 @@ +/* + * JSDoc3 template for UI5 documentation generation. + * + * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. + * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. + */ + +/*global env: true */ +/*eslint strict: [2, "global"]*/ + +"use strict"; + +/* imports */ +var template = require('jsdoc/template'), + helper = require('jsdoc/util/templateHelper'), + fs = require('jsdoc/fs'), + doclet = require('jsdoc/doclet'), + path = require('jsdoc/path'); + +/* globals, constants */ +var MY_TEMPLATE_NAME = "ui5", + ANONYMOUS_LONGNAME = doclet.ANONYMOUS_LONGNAME, + A_SECURITY_TAGS = [ + { + name : "SecSource", + caption : "Taint Source", + description : "APIs that might introduce tainted data into an application, e.g. due to user input or network access", + params : ["out","flags"] + }, + { + name : "SecEntryPoint", + caption : "Taint Entry Point", + description: "APIs that are called implicitly by a framework or server and trigger execution of application logic", + params : ["in","flags"] + }, + { + name : "SecSink", + caption : "Taint Sink", + description : "APIs that pose a security risk when they receive tainted data", + params : ["in","flags"] + }, + { + name : "SecPassthrough", + caption : "Taint Passthrough", + description : "APIs that might propagate tainted data when they receive it as input", + params : ["in","out","flags"] + }, + { + name : "SecValidate", + caption : "Validation", + description : "APIs that (partially) cleanse tainted data so that it no longer poses a security risk in the further data flow of an application", + params : ["in","out","flags"] + } + ]; + +var rSecurityTags = new RegExp(A_SECURITY_TAGS.map(function($) {return $.name.toLowerCase(); }).join('|'), "i"); + //debug(A_SECURITY_TAGS.map(function($) {return $.name; }).join('|')); + +var templateConf = (env.conf.templates || {})[MY_TEMPLATE_NAME] || {}, + pluginConf = templateConf, + conf = {}, + view; + +var __db; +var __longnames; +var __missingLongnames = {}; + +/** + * Maps the symbol 'longname's to the unique filename that contains the documentation of that symbol. + * This map is maintained to deal with names that only differ in case (e.g. the namespace sap.ui.model.type and the class sap.ui.model.Type). + */ +var __uniqueFilenames = {}; + +function info() { + if ( env.opts.verbose || env.opts.debug ) { + console.log.apply(console, arguments); + } +} + +function warning(msg) { + var args = Array.prototype.slice.apply(arguments); + args[0] = "**** warning: " + args[0]; + console.log.apply(console, args); +} + +function error(msg) { + var args = Array.prototype.slice.apply(arguments); + args[0] = "**** error: " + args[0]; + console.log.apply(console, args); +} + +function debug() { + if ( env.opts.debug ) { + console.log.apply(console, arguments); + } +} + +function merge(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + Object.keys(source).forEach(function(p) { + var v = source[p]; + target[p] = ( v.constructor === Object ) ? merge(target[p] || {}, v) : v; + }); + } + return target; +} + +function lookup(longname /*, variant*/) { + var key = longname; // variant ? longname + "|" + variant : longname; + if ( !Object.prototype.hasOwnProperty.call(__longnames, key) ) { + __missingLongnames[key] = (__missingLongnames[key] || 0) + 1; + var oResult = __db({longname: longname /*, variant: variant ? variant : {isUndefined: true}*/}); + __longnames[key] = oResult.first(); + } + return __longnames[key]; +} + +var externalSymbols = {}; + +function loadExternalSymbols(apiJsonFolder) { + + var files; + + try { + files = fs.readdirSync(templateConf.apiJsonFolder); + } catch (e) { + error("failed to list symbol files in folder '" + apiJsonFolder + "': " + (e.message || e)); + return; + } + + if ( files && files.length ) { + files.forEach(function(localFileName) { + try { + var file = path.join(templateConf.apiJsonFolder, localFileName); + var sJSON = fs.readFileSync(file, 'UTF-8'); + var data = JSON.parse(sJSON); + if ( !Array.isArray(data.symbols) ) { + throw new TypeError("api.json does not contain a 'symbols' array"); + } + data.symbols.forEach(function(symbol) { + debug(" adding external symbol " + symbol.name); + externalSymbols[symbol.name] = symbol; + }); + } catch (e) { + error("failed to load symbols from " + file + ": " + (e.message || e)); + } + }); + } +} + +function isaClass($) { + return /^(namespace|interface|class|typedef)$/.test($.kind) || ($.kind === 'member' && $.isEnum) /* isNonEmptyNamespace($) */; +} + +var REGEXP_ARRAY_TYPE = /^Array\.<(.*)>$/; + +// ---- Version class ----------------------------------------------------------------------------------------------------------------------------------------------------------- + +var Version = (function() { + + var rVersion = /^[0-9]+(?:\.([0-9]+)(?:\.([0-9]+))?)?(.*)$/; + + /** + * Returns a Version instance created from the given parameters. + * + * This function can either be called as a constructor (using new) or as a normal function. + * It always returns an immutable Version instance. + * + * The parts of the version number (major, minor, patch, suffix) can be provided in several ways: + *
    + *
  • Version("1.2.3-SNAPSHOT") - as a dot-separated string. Any non-numerical char or a dot followed by a non-numerical char starts the suffix portion. + * Any missing major, minor or patch versions will be set to 0.
  • + *
  • Version(1,2,3,"-SNAPSHOT") - as individual parameters. Major, minor and patch must be integer numbers or empty, suffix must be a string not starting with digits.
  • + *
  • Version([1,2,3,"-SNAPSHOT"]) - as an array with the individual parts. The same type restrictions apply as before.
  • + *
  • Version(otherVersion) - as a Version instance (cast operation). Returns the given instance instead of creating a new one.
  • + *
+ * + * To keep the code size small, this implementation mainly validates the single string variant. + * All other variants are only validated to some degree. It is the responsibility of the caller to + * provide proper parts. + * + * @param {int|string|any[]|jQuery.sap.Version} vMajor the major part of the version (int) or any of the single parameter variants explained above. + * @param {int} iMinor the minor part of the version number + * @param {int} iPatch the patch part of the version number + * @param {string} sSuffix the suffix part of the version number + * @return {jQuery.sap.Version} the version object as determined from the parameters + * + * @class Represents a version consisting of major, minor, patch version and suffix, e.g. '1.2.7-SNAPSHOT'. + * + * @author SAP SE + * @version ${version} + * @constructor + * @public + * @since 1.15.0 + * @name jQuery.sap.Version + */ + function Version(versionStr) { + + var match = rVersion.exec(versionStr) || []; + + function norm(v) { + v = parseInt(v,10); + return isNaN(v) ? 0 : v; + } + + Object.defineProperty(this, "major", { + enumerable: true, + value: norm(match[0]) + }); + Object.defineProperty(this, "minor", { + enumerable: true, + value: norm(match[1]) + }); + Object.defineProperty(this, "patch", { + enumerable: true, + value: norm(match[2]) + }); + Object.defineProperty(this, "suffix", { + enumerable: true, + value: String(match[3] || "") + }); + + } + + Version.prototype.toMajorMinor = function() { + return new Version(this.major + "." + this.minor); + }; + + Version.prototype.toString = function() { + return this.major + "." + this.minor + "." + this.patch + this.suffix; + }; + + Version.prototype.compareTo = function(other) { + return this.major - other.major || + this.minor - other.minor || + this.patch - other.patch || + ((this.suffix < other.suffix) ? -1 : (this.suffix === other.suffix) ? 0 : 1); + }; + + return Version; + +}()); + +// ---- Link class -------------------------------------------------------------------------------------------------------------------------------------------------------------- + +//TODO move to separate module + +var Link = (function() { + + var Link = function() { + }; + + Link.prototype.toSymbol = function(longname) { + if ( longname != null ) { + longname = String(longname); + if ( /#constructor$/.test(longname) ) { + if ( !this.innerName ) { + this.innerName = 'constructor'; + } + longname = longname.slice(0, -"#constructor".length); + } + this.longname = longname; + } + return this; + }; + + Link.prototype.withText = function(text) { + this.text = text; + return this; + }; + + Link.prototype.withTooltip = function(text) { + this.tooltip = text; + return this; + }; + + Link.prototype.toFile = function(file) { + if ( file != null ) this.file = file; + return this; + }; + + function _makeLink(href, target, tooltip, text) { + return '' + text + ''; + } + + Link.prototype.toString = function() { + var longname = this.longname, + linkString; + + if (longname) { + + if ( /^(?:(?:ftp|https?):\/\/|\.\.?\/)/.test(longname) ) { + // handle real hyperlinks (TODO should be handled with a different "to" method + linkString = _makeLink(longname, this.targetName, this.tooltip, this.text || longname); + } else if ( /^topic:/.test(longname) ) { + // handle documentation links + longname = conf.topicUrlPattern.replace("{{topic}}", longname.slice("topic:".length)); + linkString = _makeLink(longname, this.targetName, this.tooltip, this.text || longname); + } else { + linkString = this._makeSymbolLink(longname); + } + + } else if (this.file) { + linkString = _makeLink(Link.base + this.file, this.targetName, null, this.text || this.file); + } + + return linkString; + }; + + var missingTypes = {}; + Link.getMissingTypes = function() { + return Object.keys(missingTypes); + }; + + Link.prototype._makeSymbolLink = function(longname) { + + // normalize .prototype. and # + longname = longname.replace(/\.prototype\./g, '#'); + + // if it is an internal reference, then don't validate against symbols, just create a link + if ( longname.charAt(0) == "#" ) { + + return _makeLink(longname + (this.innerName ? "#" + this.innerName : ""), this.targetName, this.tooltip, this.text || longname.slice(1)); + + } + + var linkTo = lookup(longname); + // if there is no symbol by that name just return the name unaltered + if ( !linkTo ) { + + missingTypes[longname] = true; + + return this.text || longname; + + } + + // it's a full symbol reference (potentially to another file) + var mainSymbol, anchor; + if ( (linkTo.kind === 'member' && !linkTo.isEnum) || linkTo.kind === 'constant' || linkTo.kind === 'function' || linkTo.kind === 'event' ) { // it's a method or property + + mainSymbol = linkTo.memberof; + anchor = ( linkTo.kind === 'event' ? "event:" : "") + Link.symbolNameToLinkName(linkTo); + + } else { + + mainSymbol = linkTo.longname; + anchor = this.innerName; + + } + + return _makeLink(Link.baseSymbols + __uniqueFilenames[mainSymbol] + conf.ext + (anchor ? "#" + anchor : ""), this.targetName, this.tooltip, this.text || longname); + } + + Link.symbolNameToLinkName = function(symbol) { + var linker = ""; + if ( symbol.scope === 'static' ) { + linker = "."; + } else if (symbol.isInner) { + linker = "-"; // TODO-migrate? + } + return linker + symbol.name; + }; + + return Link; + +}()); + + + +// ---- publish() - main entry point for JSDoc templates ------------------------------------------------------------------------------------------------------- + +/** Called automatically by JsDoc Toolkit. */ +function publish(symbolSet) { + + info("entering sapui5 template"); + + // create output dir + fs.mkPath(env.opts.destination); + +// if ( symbolSet().count() < 20000 ) { +// info("writing raw symbols to " + path.join(env.opts.destination, "symbols-unpruned-ui5.json")); +// fs.writeFileSync(path.join(env.opts.destination, "symbols-unpruned-ui5.json"), JSON.stringify(symbolSet().get(), filter, "\t"), 'utf8'); +// } + + info("before prune: " + symbolSet().count() + " symbols."); + symbolSet = helper.prune(symbolSet); + info("after prune: " + symbolSet().count() + " symbols."); + + __db = symbolSet; + __longnames = {}; + __db().each(function($) { + __longnames[$.longname] = $; + }); + + if ( templateConf.apiJsonFolder ) { + info("loading external apis from folder '" + templateConf.apiJsonFolder + "'"); + loadExternalSymbols(templateConf.apiJsonFolder); + } + + var templatePath = path.join(env.opts.template, 'tmpl/'); + info("using templates from '" + templatePath + "'"); + view = new template.Template(templatePath); + + function filter(key,value) { + if ( key === 'meta' ) { + //return; + } + if ( key === '__ui5' && value ) { + var v = { + resource: value.resource, + module: value.module, + stakeholders: value.stakeholders + }; + if ( value.derived ) { + v.derived = value.derived.map(function($) { return $.longname }); + } + if ( value.base ) { + v.base = value.base.longname; + } + if ( value.implementations ) { + v.base = value.implementations.map(function($) { return $.longname }); + } + if ( value.parent ) { + v.parent = value.parent.longname; + } + if ( value.children ) { + v.children = value.children.map(function($) { return $.longname }); + } + return v; + } + return value; + } + + // now resolve relationships + var aRootNamespaces = createNamespaceTree(); + var hierarchyRoots = createInheritanceTree(); + collectMembers(); + mergeEventDocumentation(); + + if ( symbolSet().count() < 20000 ) { + info("writing raw symbols to " + path.join(env.opts.destination, "symbols-pruned-ui5.json")); + fs.writeFileSync(path.join(env.opts.destination, "symbols-pruned-ui5.json"), JSON.stringify(symbolSet().get(), filter, "\t"), 'utf8'); + } + + // used to allow Link to check the details of things being linked to + Link.symbolSet = symbolSet; + + // get an array version of the symbol set, useful for filtering + var symbols = symbolSet().get(); + + // ----- + + var PUBLISHING_VARIANTS = { + + "apixml" : { + defaults : { + apiXmlFile: path.join(env.opts.destination, "jsapi.xml") + }, + processor : function(conf) { + createAPIXML(symbols, conf.apiXmlFile, { + legacyContent: true + }); + } + }, + + "apijson" : { + defaults : { + apiJsonFile: path.join(env.opts.destination, "api.json") + }, + processor : function(conf) { + createAPIJSON(symbols, conf.apiJsonFile); + } + }, + + "fullapixml" : { + defaults : { + fullXmlFile: path.join(env.opts.destination, "fulljsapi.xml") + }, + processor : function(conf) { + createAPIXML(symbols, conf.fullXmlFile, { + roots: aRootNamespaces, + omitDefaults : conf.omitDefaultsInFullXml, + resolveInheritance: true + }); + } + }, + + "apijs" : { + defaults: { + jsapiFile: path.join(env.opts.destination, "api.js") + }, + processor: function(conf) { + createAPIJS(symbols, conf.jsapiFile); + } + }, + + "full" : { + defaults : { + outdir: path.join(env.opts.destination, "full/"), + contentOnly: false, + hierarchyIndex: true + }, + processor: function() { + publishClasses(symbolSet, aRootNamespaces, hierarchyRoots); + } + }, + + "public" : { + defaults: { + outdir: path.join(env.opts.destination, "public/"), + filter: function($) { return $.access === 'public' || $.access === 'protected' || $.access == null; }, + contentOnly: false, + hierarchyIndex: true + }, + processor: function(conf) { + publishClasses(symbolSet, aRootNamespaces, hierarchyRoots); + } + }, + + "demokit" : { + defaults: { + outdir: path.join(env.opts.destination, "demokit/"), + filter: function($) { return $.access === 'public' || $.access === 'protected' || $.access == null; }, + contentOnly: true, + modulePages: true, + hierarchyIndex: false, + securityIndex: true, + sinceIndex: true, + deprecationIndex: true, + experimentalIndex: true, + suppressAuthor: true, + suppressVersion: true + }, + processor: function(conf) { + publishClasses(symbolSet, aRootNamespaces, hierarchyRoots); + } + }, + + "demokit-internal" : { + defaults: { + outdir: path.join(env.opts.destination, "demokit-internal/"), + // filter: function($) { return $.access === 'public' || $.access === 'protected' || $.access === 'restricted' || $.access == null; }, + contentOnly: true, + modulePages: true, + hierarchyIndex: false, + securityIndex: true, + sinceIndex: true, + deprecationIndex: true, + experimentalIndex: true, + suppressAuthor: true, + suppressVersion: true + }, + processor: function(conf) { + publishClasses(symbolSet, aRootNamespaces, hierarchyRoots); + } + } + + }; + + var now = new Date(); + + info("start publishing"); + for (var i = 0; i < templateConf.variants.length; i++) { + + var vVariant = templateConf.variants[i]; + if ( typeof vVariant === "string" ) { + vVariant = { variant : vVariant }; + } + + info(""); + + if ( PUBLISHING_VARIANTS[vVariant.variant] ) { + + // Merge different sources of configuration (listed in increasing priority order - last one wins) + // and expose the result in the global 'conf' variable + // - global defaults + // - defaults for current variant + // - user configuration for sapui5 template + // - user configuration for current variant + // + // Note: trailing slash expected for dirs + conf = merge({ + ext: ".html", + filter: function($) { return true; }, + templatesDir: "/templates/sapui5/", + symbolsDir: "symbols/", + modulesDir: "modules/", + topicUrlPattern: "../../guide/{{topic}}.html", + srcDir: "symbols/src/", + creationDate : now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDay() + " " + now.getHours() + ":" + now.getMinutes(), + outdir: env.opts.destination + }, PUBLISHING_VARIANTS[vVariant.variant].defaults, templateConf, vVariant); + + info("publishing as variant '" + vVariant.variant + "'"); + debug("final configuration:"); + debug(conf); + + PUBLISHING_VARIANTS[vVariant.variant].processor(conf); + + info("done with variant " + vVariant.variant); + + } else { + + info("cannot publish unknown variant '" + vVariant.variant + "' (ignored)"); + + } + } + + var builtinSymbols = templateConf.builtinSymbols; + if ( builtinSymbols ) { + Link.getMissingTypes().filter(function($) { + return builtinSymbols.indexOf($) < 0; + }).sort().forEach(function($) { + error(" unresolved reference: " + $); + }); + } + info("publishing done."); + +} + +//---- namespace tree -------------------------------------------------------------------------------- + +/** + * Completes the tree of namespaces. Namespaces for which content is available + * but which have not been documented are created as dummy without documentation. + */ +function createNamespaceTree() { + + info("create namespace tree (" + __db().count() + " symbols)"); + + var aRootNamespaces = []; + var aTypes = __db(function() { return isaClass(this); }).get(); + + for (var i = 0; i < aTypes.length; i++) { // loop with a for-loop as it can handle concurrent modifications + + var symbol = aTypes[i]; + if ( symbol.memberof ) { + + var parent = lookup(symbol.memberof); + if ( !parent ) { + warning("create missing namespace '" + symbol.memberof + "' (referenced by " + symbol.longname + ")"); + parent = makeNamespace(symbol.memberof); + __longnames[symbol.memberof] = parent; + __db.insert(parent); + aTypes.push(parent); // concurrent modification: parent will be processed later in this loop + } + symbol.__ui5.parent = parent; + parent.__ui5.children = parent.__ui5.children || []; + parent.__ui5.children.push(symbol); + + } else if ( symbol.longname !== ANONYMOUS_LONGNAME ) { + + aRootNamespaces.push(symbol); + + } + } + + return aRootNamespaces; +} + +function makeNamespace(memberof) { + + info("adding synthetic namespace symbol " + memberof); + + var comment = [ + "@name " + memberof, + "@namespace", + "@synthetic", + "@public" + ]; + + var symbol = new doclet.Doclet("/**\n * " + comment.join("\n * ") + "\n */", {}); + symbol.__ui5 = {}; + + return symbol; +} + +//---- inheritance hierarchy ---------------------------------------------------------------------------- + +/** + * Calculates the inheritance hierarchy for all class/interface/namespace symbols. + * Each node in the tree has the content + * + * Node : { + * longname : {string} // name of the node (usually equals symbol.longname) + * symbol : {Symbol} // backlink to the original symbol + * base : {Node} // parent node or undefined for root nodes + * derived : {Node[]} // subclasses/-types + * } + * + */ +function createInheritanceTree() { + + function makeDoclet(longname, lines) { + lines.push("@name " + longname); + var newDoclet = new doclet.Doclet("/**\n * " + lines.join("\n * ") + "\n */", {}); + newDoclet.__ui5 = {}; + __longnames[longname] = newDoclet; + __db.insert(newDoclet); + return newDoclet; + } + + info("create inheritance tree (" + __db().count() + " symbols)"); + + var oTypes = __db(function() { return isaClass(this); }); + var aRootTypes = []; + + var oObject = lookup("Object"); + if ( !oObject ) { + oObject = makeDoclet("Object", [ + "@class", + "@synthetic", + "@public" + ]); + aRootTypes.push(oObject); + } + + function getOrCreateClass(sClass, sExtendingClass) { + var oClass = lookup(sClass); + if ( !oClass ) { + warning("create missing class " + sClass + " (extended by " + sExtendingClass + ")"); + var sBaseClass = 'Object'; + if ( externalSymbols[sClass] ) { + sBaseClass = externalSymbols[sClass].extends || sBaseClass; + } + var oBaseClass = getOrCreateClass(sBaseClass, sClass); + oClass = makeDoclet(sClass, [ + "@extends " + sBaseClass, + "@class", + "@synthetic", + "@public" + ]); + oClass.__ui5.base = oBaseClass; + oBaseClass.__ui5.derived = oBaseClass.__ui5.derived || []; + oBaseClass.__ui5.derived.push(oClass); + } + return oClass; + } + + // link them according to the inheritance infos + oTypes.each(function(oClass) { + + if ( oClass.longname === 'Object') { + return; + } + + var sBaseClass = "Object"; + if ( oClass.augments && oClass.augments.length > 0 ) { + if ( oClass.augments.length > 1 ) { + warning("multiple inheritance detected in " + oClass.longname); + } + sBaseClass = oClass.augments[0]; + } else { + aRootTypes.push(oClass); + } + + var oBaseClass = getOrCreateClass(sBaseClass, oClass.longname); + oClass.__ui5.base = oBaseClass; + oBaseClass.__ui5.derived = oBaseClass.__ui5.derived || []; + oBaseClass.__ui5.derived.push(oClass); + + if ( oClass.implements ) { + for (var j = 0; j < oClass.implements.length; j++) { + var oInterface = lookup(oClass.implements[j]); + if ( !oInterface ) { + warning("create missing interface " + oClass.implements[j]); + oInterface = makeDoclet(oClass.implements[j], [ + "@extends Object", + "@interface", + "@synthetic", + "@public" + ]); + oInterface.__ui5.base = oObject; + oObject.__ui5.derived = oObject.__ui5.derived || []; + oObject.__ui5.derived.push(oInterface); + } + oInterface.__ui5.implementations = oInterface.__ui5.implementations || []; + oInterface.__ui5.implementations.push(oClass); + } + } + }); + + function setStereotype(oSymbol, sStereotype) { + if ( !oSymbol ) { + return; + } + oSymbol.__ui5.stereotype = sStereotype; + var derived = oSymbol.__ui5.derived; + if ( derived ) { + for (var i = 0; i < derived.length; i++ ) { + if ( !derived[i].__ui5.stereotype ) { + setStereotype(derived[i], sStereotype); + } + } + } + } + + setStereotype(lookup("sap.ui.core.Component"), "component"); + setStereotype(lookup("sap.ui.core.Control"), "control"); + setStereotype(lookup("sap.ui.core.Element"), "element"); + setStereotype(lookup("sap.ui.base.Object"), "object"); + + // check for cyclic inheritance (not supported) + // Note: the check needs to run bottom up, not top down as a typical cyclic dependency never will end at the root node + oTypes.each(function(oStartClass) { + var visited = {}; + function visit(oClass) { + if ( visited[oClass.longname] ) { + throw new Error("cyclic inheritance detected: " + JSON.stringify(Object.keys(visited))); + } + if ( oClass.__ui5.base ) { + visited[oClass.longname] = true; + visit(oClass.__ui5.base); + delete visited[oClass.longname]; + } + } + visit(oStartClass); + }); + + // collect root nodes (and ignore pure packages) + return aRootTypes; + /* + return __db(function() { + return R_KINDS.test(this.kind) && this.__ui5 && this.__ui5.base == null; + }).get(); + */ +} + +function collectMembers() { + __db().each(function($) { + if ( $.memberof ) { + var parent = lookup($.memberof); + if ( parent && isaClass(parent) ) { + parent.__ui5.members = parent.__ui5.members || []; + parent.__ui5.members.push($); + } + } + }); +} + +function mergeEventDocumentation() { + + console.log("merging JSDoc event documentation into UI5 metadata"); + + var oTypes = __db(function() { return isaClass(this); }); + + oTypes.each(function(symbol) { + + var metadata = symbol.__ui5.metadata; + var members = symbol.__ui5.members; + + if ( !metadata || !metadata.events || Object.keys(metadata.events).length <= 0 || !members ) { + return; + } + + // console.log('mergeing events for ' + symbol.longname); + members.forEach(function($) { + if ( $.kind === 'event' && !$.inherited + && ($.access === 'public' || $.access === 'protected' || $.access == null) + && metadata.events[$.name] + && Array.isArray($.params) + && !$.synthetic ) { + + var event = metadata.events[$.name]; + var modified = false; + //console.log("<<<<<<<"); + //console.log(event); + //console.log("======="); + //console.log($); + + $.params.forEach(function(param) { + var m = /^\w+\.getParameters\.(.*)$/.exec(param.name); + if ( m ) { + var pname = m[1]; + var ui5param = event.parameters[pname] || ( event.parameters[pname] = {}); + if ( ui5param.type == null ) { + ui5param.type = listTypes(param.type); + modified = true; + } + if ( ui5param.doc == null ) { + ui5param.doc = param.description; + modified = true; + } + } + }); + + if ( modified ) { + console.log(" merged documentation for managed event " + symbol.longname + "#" + $.name); + } + + //console.log("======="); + //console.log(JSON.stringify(event, null, '\t')); + //console.log(">>>>>>>"); + } + }); + + }); + +} + +// ---- publishing ----------------------------------------------------------------------- + +function publishClasses(symbols, aRootNamespaces, hierarchyRoots) { + + // create output dir + fs.mkPath(path.join(conf.outdir, conf.symbolsDir)); + + // get a list of all the classes in the symbolset + var classes = symbols(function() { + return isaClass(this) && conf.filter(this); + }).order("longname"); + + // create unique file names + __uniqueFilenames = {}; + var filenames = {}; + classes.get().sort(sortByAlias).forEach(function(symbol) { + var filename = escape(symbol.longname); + if ( filenames.hasOwnProperty(filename.toUpperCase()) && (filenames[filename.toUpperCase()].longname !== symbol.longname) ) { + // find an unused filename by appending "-n" where n is an integer > 0 + for (var j = 1; filenames.hasOwnProperty(filename.toUpperCase() + "-" + j); j++); + warning("duplicate symbol names " + filenames[filename.toUpperCase()].longname + " and " + symbol.longname + ", renaming the latter to " + filename + "-" + j); + filename = filename + "-" + j; + } + filenames[filename.toUpperCase()] = symbol; + __uniqueFilenames[symbol.longname] = filename; + }); + filenames = null; + + // create a class index, displayed in the left-hand column of every class page + var classTemplate; + if ( !conf.contentOnly ) { + info("create embedded class index"); + Link.base = "../"; + Link.baseSymbols = ""; + classTemplate = 'classWithIndex.html.tmpl'; + publish.header = processTemplate("_header.tmpl", classes); + publish.footer = processTemplate("_footer.tmpl", classes); + publish.classesIndex = processTemplate("_navIndex.tmpl", classes); // kept in memory + } else { + var newStyle = !!pluginConf.newStyle; + classTemplate = newStyle ? "class-new.html.tmpl" : "class.html.tmpl"; + publish.header = ''; + publish.footer = ''; + publish.classesIndex = ''; + + // instead create an index as XML + Link.base = ""; + Link.baseSymbols = conf.symbolsDir; + processTemplateAndSave("index.xml.tmpl", aRootNamespaces, "index.xml"); + } + + // create each of the class pages + info("create class/namespace pages"); + Link.base = "../"; + Link.baseSymbols = ""; + classes.each(function(symbol) { + var sOutName = path.join(conf.symbolsDir, __uniqueFilenames[symbol.longname]) + conf.ext; + processTemplateAndSave(classTemplate, symbol, sOutName); + }); + + if ( conf.modulePages ) { + info("create module pages"); + Link.base = "../"; + Link.baseSymbols = "../" + conf.symbolsDir; + fs.mkPath(path.join(conf.outdir, conf.modulesDir)); + groupByModule(classes.get()).forEach(function(module) { + var sOutName = path.join(conf.modulesDir, module.name.replace(/\//g, '_')) + conf.ext; + processTemplateAndSave("module.html.tmpl", module, sOutName); + }); + } + + // regenerate the index with a different link base, used in the overview pages + info("create global class/namespace index"); + Link.base = ""; + Link.baseSymbols = conf.symbolsDir; + publish.header = processTemplate("_header.tmpl", classes); + publish.footer = processTemplate("_footer.tmpl", classes); + publish.classesIndex = processTemplate("_navIndex.tmpl", classes); + + // create the all classes index + processTemplateAndSave("index.html.tmpl", classes, "index" + conf.ext); + + // create the class hierarchy page + if ( conf.hierarchyIndex ) { + info("create class hierarchy index"); + Link.base = ""; + Link.baseSymbols = conf.symbolsDir; + processTemplateAndSave("hierarchy.html.tmpl", hierarchyRoots.filter(conf.filter), "hierarchy" + conf.ext); + } + + if ( conf.sinceIndex ) { + info("create API by version index"); + Link.base = ""; + Link.baseSymbols = conf.symbolsDir; + var sinceSymbols = symbols(function() { + var r = !!this.since && !this.inherited && conf.filter(this); + if ( r && this.memberof ) { + var parent = lookup(this.memberof); + // filter out symbol when parent is filtered out + if ( !parent || !conf.filter(parent) ) { + debug("since index: filtering out " + this.longname + ", member of " + this.memberof); + r = false; + } + if ( parent && parent.since === this.since ) { + // r = false; + } + } + return r; + }).order("longname"); + processTemplateAndSave("since.html.tmpl", sinceSymbols, "since" + conf.ext); + } + + if ( conf.deprecationIndex ) { + info("create deprecated API index"); + Link.base = ""; + Link.baseSymbols = conf.symbolsDir; + var deprecatedSymbols = symbols(function() { + return !!this.deprecated && !this.inherited && conf.filter(this); + }).order("longname"); + processTemplateAndSave("deprecation.html.tmpl", deprecatedSymbols, "deprecation" + conf.ext); + } + + if ( conf.experimentalIndex ) { + info("create experimental API index"); + Link.base = ""; + Link.baseSymbols = conf.symbolsDir; + var experimentalSymbols = symbols(function() { + return !!this.experimental && !this.inherited && conf.filter(this); + }).order("longname"); + processTemplateAndSave("experimental.html.tmpl", experimentalSymbols, "experimental" + conf.ext); + } + + if ( conf.securityIndex ) { + info("create Security Relevant API index"); + + var securityRelevantSymbols = {}; + A_SECURITY_TAGS.forEach(function(oTagDef) { + securityRelevantSymbols[oTagDef.name.toLowerCase()] = { tag : oTagDef, symbols: [] }; + }); + symbols().each(function($) { + var tags = $.tags; + if ( !$.inherited && conf.filter($) && tags ) { + for (var i = 0; i < tags.length; i++) { + if ( rSecurityTags.test(tags[i].title) ) { + securityRelevantSymbols[tags[i].title.toLowerCase()].symbols.push({ symbol: $, tag : tags[i]}); + } + } + } + }); + + Link.base = ""; + Link.baseSymbols = conf.symbolsDir; + processTemplateAndSave("security.html.tmpl", securityRelevantSymbols, "security" + conf.ext); + } + + classes = null; + + // copy needed mimes + info("copy mimes"); + // copy the template's static files to outdir + var templatePath = env.opts.template; + var fromDir = path.join(templatePath, 'static'); + var staticFiles = fs.ls(fromDir, 3); + staticFiles.forEach(function(fileName) { + var toDir = fs.toDir( fileName.replace(fromDir, conf.outdir) ); + fs.mkPath(toDir); + fs.copyFileSync(fileName, toDir); + }); + + __uniqueFilenames = null; + + info("publishing done."); +} + +// ---- helper functions for the templates ---- + +var rSinceVersion = /^([0-9]+(?:\.[0-9]+(?:\.[0-9]+)?)?([-.][0-9A-Z]+)?)(?:\s|$)/i; + +function extractVersion(value) { + + if ( !value ) { + return; + } + + if ( value === true ) { + value = ''; + } else { + value = String(value); + } + + var m = rSinceVersion.exec(value); + return m ? m[1] : undefined; + +} + +var rSince = /^(?:as\s+of|since)(?:\s+version)?\s*([0-9]+(?:\.[0-9]+(?:\.[0-9]+)?)?([-.][0-9A-Z]+)?)(?:\.$|\.\s+|[,:]\s*|\s-\s*|\s|$)/i; + +function extractSince(value) { + + if ( !value ) { + return; + } + + if ( value === true ) { + value = ''; + } else { + value = String(value); + } + + var m = rSince.exec(value); + if ( m ) { + return { + since : m[1], + pos : m[0].length, + value : value.slice(m[0].length).trim() + } + } + + return { + pos : 0, + value: value.trim() + }; + +} + +function sortByAlias(a, b) { + var partsA = a.longname.split(/[.#]/); + var partsB = b.longname.split(/[.#]/); + var i = 0; + while ( i < partsA.length && i < partsB.length ) { + if ( partsA[i].toLowerCase() < partsB[i].toLowerCase() ) + return -1; + if ( partsA[i].toLowerCase() > partsB[i].toLowerCase() ) + return 1; + i++; + } + if ( partsA.length < partsB.length ) + return -1; + if ( partsA.length > partsB.length ) + return 1; + // as a last resort, try to compare the aliases case sensitive in case we have aliases that only + // differ in case like with "sap.ui.model.type" and "sap.ui.model.Type" + if ( a.longname < b.longname ) { + return -1; + } + if ( a.longname > b.longname ) { + return 1; + } + return 0; +} + +/* +function isNonEmptyNamespace($) { + return $.isNamespace && ( + ($.properties && $.properties.length > 0) || + ($.methods && $.methods.length > 0) || + ($.augments && $.augments.length > 0) || + ($.children && $.children.length > 0)); +};*/ + +/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */ +function summarize(desc) { + if ( desc != null ) { + desc = String(desc).replace(/\s+/g, ' '). + replace(/"'/g, '"'). + replace(/^(<\/?p>||\s)+/, ''); + + var match = /([\w\W]+?\.)[^a-z0-9_$]/i.exec(desc); + return match ? match[1] : desc; + } +} + +/** Make a symbol sorter by some attribute. */ +function makeSortby(/* fields ...*/) { + var aFields = Array.prototype.slice.apply(arguments), + aNorms = [], + aFuncs = []; + for (var i = 0; i < arguments.length; i++) { + aNorms[i] = 1; + if ( typeof aFields[i] === 'function' ) { + aFuncs[i] = aFields[i]; + continue; + } + aFuncs[i] = function($,n) { return $[n]; }; + if ( aFields[i].indexOf("!") === 0 ) { + aNorms[i] = -1; + aFields[i] = aFields[i].slice(1); + } + if ( aFields[i] === 'deprecated' ) { + aFuncs[i] = function($,n) { return !!$[n]; }; + } else if ( aFields[i] === 'static' ) { + aFields[i] = 'scope'; + aFuncs[i] = function($,n) { return $[n] === 'static'; }; + } else if ( aFields[i].indexOf("#") === 0 ) { + aFields[i] = aFields[i].slice(1); + aFuncs[i] = function($,n) { return $.comment.getTag(n).length > 0; }; + } + } + return function(a, b) { + // info("compare " + a.longname + " : " + b.longname); + var r = 0,i,va,vb; + for (i = 0; r === 0 && i < aFields.length; i++) { + va = aFuncs[i](a,aFields[i]); + vb = aFuncs[i](b,aFields[i]); + if ( va && !vb ) { + r = -aNorms[i]; + } else if ( !va && vb ) { + r = aNorms[i]; + } else if ( va && vb ) { + va = String(va).toLowerCase(); + vb = String(vb).toLowerCase(); + if (va < vb) r = -aNorms[i]; + if (va > vb) r = aNorms[i]; + } + // debug(" " + aFields[i] + ": " + va + " ? " + vb + " = " + r); + } + return r; + } +} + +/** Pull in the contents of an external file at the given path. */ + +function processTemplateAndSave(sTemplateName, oData, sOutputName) { + var sResult = processTemplate(sTemplateName, oData); + if ( conf.normalizeWhitespace && /\.html$/.test(sOutputName) ) { + sResult = normalizeWhitespace(sResult); + } + var sOutpath = path.join(conf.outdir, sOutputName); + try { + fs.writeFileSync(sOutpath, sResult, 'utf8'); + } catch (e) { + error("failed to write generated file '" + sOutpath + "':" + (e.message || String(e))); + } +} + +function processTemplate(sTemplateName, data) { + debug("processing template '" + sTemplateName + "' for " + data.longname); + + try { + var result = view.render(sTemplateName, { + asPlainSummary: asPlainSummary, + bySimpleName: bySimpleName, + childrenOfKind: childrenOfKind, + conf: conf, + data: data, + getConstructorDescription : getConstructorDescription, + getNSClass: getNSClass, + groupByVersion: groupByVersion, + extractSince: extractSince, + include: processTemplate, + Link: Link, + listTypes: listTypes, + linkTypes: linkTypes, + makeExample: makeExample, + makeLinkList: makeLinkList, + makeLinkToSymbolFile: makeLinkToSymbolFile, + makeSignature: makeSignature, + makeSortby: makeSortby, + publish : publish, + formatText: formatText, + simpleNameOf: simpleNameOf, + sortByAlias: sortByAlias, + summarize: summarize, + Version : Version + }); + } catch (e) { + if ( e.source ) { + var filename = path.join(env.opts.destination, sTemplateName + ".js"); + console.log("**** failed to process template, source written to " + filename); + fs.mkPath(path.dirname(filename)); + fs.writeFileSync(filename, e.source, 'utf8'); + } + console.log("error while processing " + sTemplateName); + throw e; + } + debug("processing template done."); + return result; +} + +function groupByVersion(symbols, extractVersion) { + + var map = {}; + + symbols.forEach(function(symbol) { + + var version = extractVersion(symbol), + key = String(version); + + if ( !map[key] ) { + map[key] = { version: version, symbols : [] }; + } + map[key].symbols.push(symbol); + + }); + + var groups = Object.keys(map).map(function(key) { return map[key]; }); + + return groups.sort(function(a,b) { + if ( !a.version && b.version ) { + return -1; + } else if ( a.version && !b.version ) { + return 1; + } else if ( a.version && b.version ) { + return -a.version.compareTo(b.version); + } + return 0; + }); +} + +function groupByModule(symbols) { + + var map = {}; + + function add(key, symbol) { + if ( !map[key] ) { + map[key] = { name: key, symbols : [] }; + } + if ( map[key].symbols.indexOf(symbol) < 0 ) { + map[key].symbols.push(symbol); + } + } + + symbols.forEach(function(symbol) { + + var key = symbol.__ui5.module; + + if ( key ) { + add(key, symbol); + if ( symbol.__ui5.members ) { + symbol.__ui5.members.forEach(function($) { + if ( !$.inherited && $.__ui5.module && $.__ui5.module !== key && conf.filter($) ) { + add($.__ui5.module, $); + } + }); + } + } + + }); + + var groups = Object.keys(map).map(function(key) { return map[key]; }); + + return groups; +} + + +var REGEXP_TAG = /<(\/?(?:[A-Z][A-Z0-9_-]*:)?[A-Z][A-Z0-9_-]*)(?:\s[^>]*)?>/gi; + +/** + * Removes unnecessary whitespace from an HTML document: + * - if the text between two adjacent HTML tags consists of whitespace only, the whole text is removed + * - otherwise, any sequence of whitespace in the text is reduced to a single blank + * - inside a
 tag, whitespace is preserved
+ *
+ * Whitespace inside an element tag is not touched (although it could be normalized as well)
+ * @param {string} content raw HTML file
+ * @returns {string} HTML file with normalized whitespace
+ */
+function normalizeWhitespace(content) {
+	var compressed = '',
+		preformatted = 0,
+		p = 0, m, text;
+
+	REGEXP_TAG.lastIndex = 0;
+	while ( m = REGEXP_TAG.exec(content) ) {
+		if ( m.index > p ) {
+			text = content.slice(p, m.index);
+			if ( preformatted ) {
+				compressed += text;
+				// console.log('  "' + text + '" (preformatted)');
+			} else {
+				text = text.replace(/\s+/g,' ');
+				if ( text.trim() ) {
+					compressed += text;
+				}
+				// console.log('  "' + text + '" (trimmed)');
+			}
+		}
+
+		compressed += m[0];
+		// console.log('  "' + m[0] + '" (tag)');
+		p = m.index + m[0].length;
+
+		if ( /^pre$/i.test(m[1]) ) {
+			preformatted++;
+		} else if ( /^\/pre$/i.test(m[1]) && preformatted ) {
+			preformatted--;
+		}
+
+	}
+
+	if ( content.length > p ) {
+		text = content.slice(p, content.length);
+		if ( preformatted ) {
+			compressed += text;
+			// console.log('  "' + text + '" (preformatted)');
+		} else {
+			text = text.replace(/\s+/g,' ');
+			if ( text.trim() ) {
+				compressed += text;
+			}
+			// console.log('  "' + text + '" (trimmed)');
+		}
+	}
+
+	return compressed;
+}
+
+function makeLinkToSymbolFile(longname) {
+	return Link.baseSymbols + __uniqueFilenames[longname] + conf.ext;
+}
+
+function simpleNameOf(longname) {
+	longname = String(longname);
+	var p = longname.lastIndexOf('.');
+	return p < 0 ? longname : longname.slice(p + 1);
+}
+
+function bySimpleName(a,b) {
+	if ( a === b ) {
+		return 0;
+	}
+	var simpleA = simpleNameOf(a);
+	var simpleB = simpleNameOf(b);
+	if ( simpleA === simpleB ) {
+		return a < b ? -1 : 1;
+	} else {
+		return simpleA < simpleB ? -1 : 1;
+	}
+}
+
+/** Build output for displaying function parameters. */
+function makeSignature(params) {
+	var r = ['('], desc;
+	if ( params ) {
+		for (var i = 0, p; p = params[i]; i++) {
+			// ignore @param tags for 'virtual' params that are used to document members of config-like params
+			// (e.g. like "@param param1.key ...")
+			if (p.name && p.name.indexOf('.') == -1) {
+				if (i > 0)
+					r.push(', ');
+
+				r.push('');
+				r.push(p.name);
+				r.push('');
+				if ( p.optional )
+					r.push('?');
+			}
+		}
+	}
+	r.push(')');
+	return r.join('');
+}
+
+
+/*
+ * regexp to recognize important places in the text
+ *
+ * Capturing groups of the RegExp:
+ *   group 1: begin of a pre block
+ *   group 2: end of a pre block
+ *   group 3: begin of a header/ul/ol/table, implicitly ends a paragraph
+ *   group 4: end of a header/ul/ol/table, implicitly starts a new paragraph
+ *   group 5: target portion of an inline @link tag
+ *   group 6: (optional) text portion of an inline link tag
+ *   group 7: an empty line which implicitly starts a new paragraph
+ *
+ *                 [------- 
 block -------] [----------------------- some flow content -----------------------] [---- an inline {@link ...} tag ----] [---------- an empty line ---------]  */
+var rFormatText = /(]*)?>)|(<\/pre>)|(<(?:h[\d+]|ul|ol|table)(?:\s[^>]*)?>)|(<\/(?:h[\d+]|ul|ol|table)>)|\{@link\s+([^}\s]+)(?:\s+([^\}]*))?\}|((?:\r\n|\r|\n)[ \t]*(?:\r\n|\r|\n))/gi;
+
+function formatText(text) {
+
+	if ( !text ) {
+		return '';
+	}
+
+	var inpre = false,
+		paragraphs = 0;
+	
+	text = String(text).replace(rFormatText, function(match, pre, endpre, flow, endflow, linkTarget, linkText, emptyline) {
+		if ( pre ) {
+			inpre = true;
+			return pre.replace(/
/gi, "
").replace(//gi, "
");
+		} else if ( endpre ) {
+			inpre = false;
+		} else if ( flow ) {
+			if ( !inpre ) {
+				paragraphs++;
+				return '

' + match; + } + } else if ( endflow ) { + if ( !inpre ) { + paragraphs++; + return match + '

'; + } + } else if ( emptyline ) { + if ( !inpre ) { + paragraphs++; + return '

'; + } + } else if ( linkTarget ) { + if ( !inpre ) { + // convert to a hyperlink + var link = new Link().toSymbol(linkTarget); + // if link tag contained a replacement text, use it + if ( linkText && linkText.trim()) { + link = link.withText(linkText.trim()); + } + return link.toString(); + } + } + return match; + }); + + if ( paragraphs > 0 ) { + text = '

' + text + '

'; + } + + // remove empty paragraphs + text = text.replace(/

\s*<\/p>/g, ''); + + return text; +} + + +//console.log("#### samples"); +//console.log(formatText(summarize("This is a first\n\nparagraph with empty \n \n \nlines in it. This is the remainder."))); + +function childrenOfKind(data, kind) { + /* old version based on TaffyDB (slow) + var oChildren = symbolSet({kind: kind, memberof: data.longname === GLOBAL_LONGNAME ? {isUndefined: true} : data.longname}).filter(function() { return conf.filter(this); }); + return { + own : oChildren.filter({inherited: {isUndefined:true}}).get().sort(makeSortby("!deprecated","static","name")), + borrowed : groupByContributors(data, oChildren.filter({inherited: true}).get().sort(makeSortby("name"))) + } */ + var oResult = { + own: [], + borrowed: [] + }; + //console.log("calculating kind " + kind + " from " + data.longname); + //console.log(data); + var fnFilter; + switch (kind) { + case 'property': + fnFilter = function($) { + return $.kind === 'constant' || ($.kind === 'member' && !$.isEnum); + } + break; + case 'event': + fnFilter = function($) { + return $.kind === 'event'; + } + break; + case 'method': + fnFilter = function($) { + return $.kind === 'function'; + } + break; + default: + // default: none + fnFilter = function($) { return false; }; + break; + } + + if ( data.__ui5.members ) { + data.__ui5.members.forEach(function($) { + if ( fnFilter($) && conf.filter($) ) { + oResult[$.inherited ? 'borrowed' : 'own'].push($); + } + }); + } + oResult.own.sort(makeSortby("!deprecated","static","name")); + oResult.borrowed = groupByContributors(data, oResult.borrowed); + + return oResult; +} + +/** + * Determines the set of contributors of the given borrowed members. + * The contributors are sorted according to the inheritance hierarchy: + * first the base class of symbol, then the base class of the base class etc. + * Any contributors that can not be found in the hierarchy are appended + * to the set. + * + * @param symbol of which these are the members + * @param borrowedMembers set of borrowed members to determine the contributors for + * @return sorted array of contributors + */ +function groupByContributors(symbol, aBorrowedMembers) { + + var MAX_ORDER = 1000, // a sufficiently large number + mContributors = {}, + aSortedContributors = [], + i,order; + + aBorrowedMembers.forEach(function($) { + $ = lookup($.inherits); + if ($ && mContributors[$.memberof] == null) { + mContributors[$.memberof] = { order : MAX_ORDER, items : [$] }; + } else { + mContributors[$.memberof].items.push($); + } + }); + + // order contributors according to their distance in the inheritance hierarchy + order = 0; + (function handleAugments(oSymbol) { + var i,oTarget,aParentsToVisit; + if ( oSymbol.augments ) { + aParentsToVisit = []; + // first assign an order + for (i = 0; i < oSymbol.augments.length; i++) { + if ( mContributors[oSymbol.augments[i]] != null && mContributors[oSymbol.augments[i]].order === MAX_ORDER ) { + mContributors[oSymbol.augments[i]].order = ++order; + aParentsToVisit.push(oSymbol.augments[i]); + } + } + // only then dive into parents (breadth first search) + for (i = 0; i < aParentsToVisit.length; i++) { + oTarget = lookup(aParentsToVisit); + if ( oTarget ) { + handleAugments(oTarget); + } + } + } + }(symbol)); + + // convert to an array and sort by order + for (i in mContributors) { + aSortedContributors.push(mContributors[i]); + } + aSortedContributors.sort(function (a,b) { return a.order - b.order; }); + + return aSortedContributors; + +} + +function makeLinkList(aSymbols) { + return aSymbols + .sort(makeSortby("name")) + .map(function($) { return new Link().toSymbol($.longname).withText($.name); }) + .join(", "); +} + +// ---- type parsing --------------------------------------------------------------------------------------------- + +function TypeParser(defaultBuilder) { + + /* TODO + * - function(this:) // type of this + * - function(new:) // constructor + */ + var rLexer = /\s*(Array\.?<|Object\.?<|Set\.?<|Promise\.?<|function\(|\{|:|\(|\||\}|>|\)|,|\[\]|\*|\?|!|\.\.\.)|\s*(\w+(?:[.#~]\w+)*)|./g; + + var input, + builder, + token, + tokenStr; + + function next(expected) { + if ( expected !== undefined && token !== expected ) { + throw new SyntaxError("TypeParser: expected '" + expected + "', but found '" + tokenStr + "' (pos: " + rLexer.lastIndex + ", input='" + input + "')"); + } + var match = rLexer.exec(input); + if ( match ) { + tokenStr = match[1] || match[2]; + token = match[1] || (match[2] && 'symbol'); + if ( !token ) { + throw new SyntaxError("TypeParser: unexpected '" + tokenStr + "' (pos: " + match.index + ", input='" + input + "')"); + } + } else { + tokenStr = token = null; + } + } + + function parseType() { + var nullable = false; + var mandatory = false; + if ( token === '?' ) { + next(); + nullable = true; + } else if ( token === '!' ) { + next(); + mandatory = true; + } + + var type; + + if ( token === 'Array.<' || token === 'Array<' ) { + next(); + var componentType = parseType(); + next('>'); + type = builder.array(componentType); + } else if ( token === 'Object.<' || token === 'Object<' ) { + next(); + var keyType; + var valueType = parseType(); + if ( token === ',' ) { + next(); + keyType = valueType; + valueType = parseType(); + } else { + keyType = builder.synthetic(builder.simpleType('string')); + } + next('>'); + type = builder.object(keyType, valueType); + } else if ( token === 'Set.<' || token === 'Set<' ) { + next(); + var elementType = parseType(); + next('>'); + type = builder.set(elementType); + } else if ( token === 'Promise.<' || token === 'Promise<' ) { + next(); + var elementType = parseType(); + next('>'); + type = builder.promise(elementType); + } else if ( token === 'function(' ) { + next(); + var thisType, constructorType, paramTypes = [], returnType; + if ( tokenStr === 'this' ) { + next(); + next(':'); + thisType = parseType(); + if ( token === ',' ) { + next(); + } + } else if ( tokenStr === 'new' ) { + next(); + next(':'); + constructorType = parseType(); + if ( token === ',' ) { + next(); + } + } + while ( token === 'symbol' || token === '...' ) { + var repeatable = token === '...'; + if ( repeatable) { + next(); + } + var paramType = parseType(); + if ( repeatable ) { + paramType = builder.repeatable(paramType); + } + paramTypes.push(paramType); + if ( token === ',' ) { + if ( repeatable ) { + throw new SyntaxError("TypeParser: only the last parameter of a function can be repeatable (pos: " + rLexer.lastIndex + ", input='" + input + "')"); + } + next(); + } + } + next(')'); + if ( token === ':' ) { + next(':'); + returnType = parseType(); + } + type = builder.function(paramTypes, returnType, thisType, constructorType); + } else if ( token === '{' ) { + var structure = Object.create(null); + var propName,propType; + next(); + do { + propName = tokenStr; + if ( !/^\w+$/.test(propName) ) { + throw new SyntaxError("TypeParser: structure field must have a simple name (pos: " + rLexer.lastIndex + ", input='" + input + "', field:'" + propName + "')"); + } + next('symbol'); + if ( token === ':' ) { + next(); + propType = parseType(); + } else { + propType = builder.synthetic(builder.simpleType('any')); + } + structure[propName] = propType; + if ( token === '}' ) { + break; + } + next(','); + } while (token); + next('}'); + type = builder.structure(structure); + } else if ( token === '(' ) { + next(); + type = parseTypes(); + next(')'); + } else if ( token === '*' ) { + next(); + type = builder.simpleType('*'); + } else { + type = builder.simpleType(tokenStr); + next('symbol'); + while ( token === '[]' ) { + next(); + type = builder.array(type); + } + } + if ( nullable ) { + type = builder.nullable(type); + } + if ( mandatory ) { + type = builder.mandatory(type); + } + return type; + } + + function parseTypes() { + var types = []; + do { + types.push(parseType()); + if ( token !== '|' ) { + break; + } + next(); + } while (token); + return types.length === 1 ? types[0] : builder.union(types); + } + + this.parse = function(typeStr, tempBuilder) { + builder = tempBuilder || defaultBuilder || TypeParser.ASTBuilder; + input = String(typeStr); + rLexer.lastIndex = 0; + next(); + var type = parseTypes(); + next(null); + return type; + } + +} + +TypeParser.ASTBuilder = { + simpleType: function(type) { + return { + type: 'simpleType', + name: type + }; + }, + array: function(componentType) { + return { + type: 'array', + component: componentType + }; + }, + object: function(keyType, valueType) { + return { + type: 'object', + key: keyType, + value: valueType + }; + }, + set: function(elementType) { + return { + type: 'set', + element: elementType + }; + }, + promise: function(fulfillmentType) { + return { + type: 'promise', + fulfill: fulfillmentType + }; + }, + function: function(paramTypes, returnType, thisType, constructorType) { + return { + type: 'function', + params: paramTypes, + return: returnType, + this: thisType, + constructor: constructorType + }; + }, + structure: function(structure) { + return { + type: 'structure', + fields: structure + }; + }, + union: function(types) { + return { + type: 'union', + types: types + }; + }, + synthetic: function(type) { + type.synthetic = true; + return type; + }, + nullable: function(type) { + type.nullable = true; + return type; + }, + mandatory: function(type) { + type.mandatory = true; + return type; + }, + repeatable: function(type) { + type.repeatable = true; + return type; + } +}; + +TypeParser.LinkBuilder = function(style, encoded) { + this.linkStyle = style; + this.lt = encoded ? "<" : "<"; + this.gt = encoded ? ">" : ">"; +}; +TypeParser.LinkBuilder.prototype = { + safe: function(type) { + return type.needsParenthesis ? "(" + type.str + ")" : type.str; + }, + simpleType: function(type) { + if ( this.linkStyle === 'text' ) { + return { + str: type + }; + } + var link = new Link().toSymbol(type); + if ( this.linkStyle === 'short' ) { + link.withText(simpleNameOf(type)).withTooltip(type); + } + return { + str: link.toString() + }; + }, + array: function(componentType) { + if ( componentType.needsParenthesis ) { + return { + str: "Array.<" + componentType.str + ">" + }; + } + return { + str: componentType.str + "[]" + }; + }, + object: function(keyType, valueType) { + if ( keyType.synthetic ) { + return { + str: "Object." + this.lt + valueType.str + this.gt + }; + } + return { + str: "Object." + this.lt + keyType.str + "," + valueType.str + this.gt + }; + }, + set: function(elementType) { + return { + str: 'Set.' + this.lt + elementType.str + this.gt + }; + }, + promise: function(fulfillmentType) { + return { + str: 'Promise.' + this.lt + fulfillmentType.str + this.gt + }; + }, + function: function(paramTypes, returnType) { + return { + str: "function(" + paramTypes.map(function(type) { return type.str; }).join(',') + ")" + ( returnType ? " : " + this.safe(returnType) : "") + }; + }, + structure: function(structure) { + var r = []; + for ( var fieldName in structure ) { + if ( structure[fieldName].synthetic ) { + r.push(fieldName); + } else { + r.push(fieldName + ":" + structure[fieldName].str); + } + } + return { + str: "{" + r.join(",") + "}" + }; + }, + union: function(types) { + return { + needsParenthesis: true, + str: types.map( this.safe.bind(this) ).join('|') + }; + }, + synthetic: function(type) { + type.synthetic = true; + return type; + }, + nullable: function(type) { + type.str = "?" + type.str; + return type; + }, + mandatory: function(type) { + type.str = "!" + type.str; + return type; + }, + repeatable: function(type) { + type.str = "..." + type.str; + return type; + } +}; + +var typeParser = new TypeParser(); +var _SHORT_BUILDER = new TypeParser.LinkBuilder('short', true); +var _LONG_BUILDER = new TypeParser.LinkBuilder('long', true); +var _TEXT_BUILDER = new TypeParser.LinkBuilder('text', false); +var _TEXT_BUILDER_ENCODED = new TypeParser.LinkBuilder('text', true); + +/* +function testTypeParser(type) { + console.log("Type: '" + type + "' gives AST"); + try { + console.log(typeParser.parse(type)); + } catch (e) { + console.log("**** throws: " + e); + } +} + +testTypeParser("Array."); +testTypeParser("Array"); +testTypeParser("Object."); +testTypeParser("Object"); +testTypeParser("function(...string):Set"); +testTypeParser("{a:int,b,c:float,d,e}"); +*/ + +function _processTypeString(type, builder) { + if ( type && Array.isArray(type.names) ) { + type = type.names.join('|'); + } + if ( type ) { + try { + return typeParser.parse( type, builder ).str; + } catch (e) { + error("failed to parse type string '" + type + "': " + e); + return type; + } + } +} + +function listTypes(type, encoded) { + return _processTypeString(type, encoded ? _TEXT_BUILDER_ENCODED : _TEXT_BUILDER); +} + +function linkTypes(type, short) { + return _processTypeString(type, short ? _SHORT_BUILDER : _LONG_BUILDER ); +} + +/** + * Reduces the given text to a summary and removes all tags links etc. and escapes double quotes. + * The result therefore should be suitable as content for an HTML tag attribute (e.g. title). + * @param sText + * @return summarized, plain attribute + */ +function asPlainSummary(sText) { + return sText ? summarize(sText).replace(/<.*?>/g, '').replace(/\{\@link\s*(.*?)\}/g, '$1').replace(/"/g,""") : ''; +} + +function getNSClass(item) { + if (item.kind === 'interface') { + return " interface"; + } else if (item.kind === 'namespace') { + return " namespace"; + } else if (item.kind === 'typedef' ) { + return " typedef"; + } else if (item.kind === 'member' && item.isEnum ) { + return " enum"; + } else { + return ""; + } +} + +/* + * regexp to recognize important places in the text + * + * Capturing groups of the RegExp: + * group 1: begin of a pre block + * group 2: end of a pre block + * group 3: an empty line + surrounding whitespace (implicitly starts a new paragraph) + * group 4: an isolated line feed + surrounding whitespace + * + * [-------

 block -------] [---- an empty line and surrounding whitespace ----] [---- new line or whitespaces ----] */
+var rNormalizeText = /(]*)?>)|(<\/pre>)|([ \t]*(?:\r\n|\r|\n)[ \t]*(?:\r\n|\r|\n)[ \t\r\n]*)|([ \t]*(?:\r\n|\r|\n)[ \t]*|[ \t]+)/gi;
+
+function normalizeWS(text) {
+	if ( text == null ) {
+		return text;
+	}
+
+	var inpre = false;
+	return String(text).replace(rNormalizeText, function(match, pre, endpre, emptyline, ws) {
+		if ( pre ) {
+			inpre = true;
+			return pre;
+		} else if ( endpre ) {
+			inpre = false;
+			return endpre;
+		} else if ( emptyline ) {
+			return inpre ? emptyline : '\n\n';
+		} else if ( ws ) {
+			return inpre ? ws : ' ';
+		}
+		return match;
+	});
+
+}
+
+//---- add on: API JSON -----------------------------------------------------------------
+
+function createAPIJSON(symbols, filename) {
+
+	var api = {
+		"$schema-ref": "http://schemas.sap.com/sapui5/designtime/api.json/1.0"
+	}
+
+	if ( templateConf.version ) {
+		api.version = templateConf.version.replace(/-SNAPSHOT$/,"");
+	}
+	if ( templateConf.uilib ) {
+		api.library = templateConf.uilib;
+	}
+
+	api.symbols = [];
+	// sort only a copy(!) of the symbols, otherwise the SymbolSet lookup is broken
+	symbols.slice(0).sort(sortByAlias).forEach(function(symbol) {
+		if ( isaClass(symbol) && !symbol.synthetic ) { // dump a symbol if it as a class symbol and if it is not a synthetic symbol
+			api.symbols.push(createAPIJSON4Symbol(symbol, false));
+		}
+	});
+
+	postProcessAPIJSON(api);
+
+	fs.mkPath(path.dirname(filename));
+	fs.writeFileSync(filename, JSON.stringify(api), 'utf8');
+	info("  apiJson saved as " + filename);
+}
+
+function createAPIJSON4Symbol(symbol, omitDefaults) {
+
+	var obj = [];
+	var curr = obj;
+	var attribForKind = 'kind';
+	var stack = [];
+
+	function isEmpty(obj) {
+		if ( !obj ) {
+			return true;
+		}
+		for (var n in obj) {
+			if ( obj.hasOwnProperty(n) ) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	function tag(name, value, omitEmpty) {
+
+		if ( omitEmpty && !value ) {
+			return;
+		}
+		if ( arguments.length === 1 ) { // opening tag
+			stack.push(curr);
+			stack.push(attribForKind);
+			var obj = {};
+			if ( Array.isArray(curr) ) {
+				if ( attribForKind != null ) {
+					obj[attribForKind] = name;
+				}
+				curr.push(obj);
+			} else {
+				curr[name] = obj;
+			}
+			curr = obj;
+			attribForKind = null;
+			return;
+		}
+		if ( value == null ) {
+			curr[name] = true;
+		} else {
+			curr[name] = String(value);
+		}
+	}
+
+	function attrib(name, value, defaultValue, raw) {
+		var emptyTag = arguments.length === 1;
+		if ( omitDefaults && arguments.length >= 3 && value === defaultValue ) {
+			return;
+		}
+		curr[name] = emptyTag ? true : (raw ? value : String(value));
+	}
+
+	function closeTag(name, noIndent) {
+		attribForKind = stack.pop();
+		curr  = stack.pop();
+	}
+
+	function collection(name, attribForKind) {
+		stack.push(curr);
+		stack.push(attribForKind);
+		// TODO only supported if this.curr was an object check or fully implement
+		curr = curr[name] = [];
+		attribForKind = attribForKind || null;
+	}
+
+	function endCollection(name) {
+		attribForKind = stack.pop();
+		curr  = stack.pop();
+	}
+
+	function tagWithSince(name, value) {
+
+		if ( !value ) {
+			return;
+		}
+
+		var info = extractSince(value);
+
+		tag(name);
+		if ( info.since ) {
+			attrib("since", info.since);
+		}
+		if ( info.value ) {
+			curr["text"] = normalizeWS(info.value);
+		}
+		closeTag(name, true);
+
+	}
+
+	function examples(symbol) {
+		var j, example;
+
+		if ( symbol.examples && symbol.examples.length ) {
+			collection("examples");
+			for ( j = 0; j < symbol.examples.length; j++) {
+				example = makeExample(symbol.examples[j]);
+				tag("example");
+				if ( example.caption ) {
+					attrib("caption", example.caption);
+				}
+				attrib("text", example.example);
+				closeTag("example");
+			}
+			endCollection("examples");
+		}
+	}
+
+	function referencesList(symbol) {
+		if ( symbol.see && symbol.see.length ) {
+			curr["references"] = symbol.see.slice();
+		}
+	}
+
+	function visibility($) {
+		if ( $.access === 'protected' ) {
+			return "protected";
+		} else if ( $.access === 'restricted' ) {
+			return "restricted";
+		} else if ( $.access === 'private' ) {
+			return "private";
+		} else {
+			return "public";
+		}
+	}
+
+	function exceptions(symbol) {
+		var array = symbol.exceptions,
+			j, exception;
+		
+		if ( Array.isArray(array) ) {
+			array = array.filter( function (ex) {
+				return (ex.type && listTypes(ex.type)) || (ex.description && ex.description.trim());
+			});
+		} 
+		if ( array == null || array.length === 0 ) {
+			return;
+		}
+		
+		collection("throws");
+		for (j = 0; j < array.length; j++) {
+			exception = array[j];
+			tag("exception");
+			if ( exception.type !== undefined ) {
+				attrib("type", listTypes(exception.type));
+			}
+			tag("description", normalizeWS(exception.description), true);
+			closeTag("exception");
+		}
+		endCollection("throws");
+	}
+
+	function methodList(tagname, methods) {
+		methods = methods && Object.keys(methods).map(function(key) { return methods[key]; });
+		if ( methods != null && methods.length > 0 ) {
+			curr[tagname] = methods;
+		}
+	}
+
+	function interfaceList(tagname, interfaces) {
+		if ( interfaces != null && interfaces.length > 0 ) {
+			curr[tagname] = interfaces.slice();
+		}
+	}
+
+	function hasSettings($, visited) {
+
+		visited = visited || {};
+
+		if ( $.augments && $.augments.length > 0 ) {
+			var baseSymbol = $.augments[0];
+			if ( visited.hasOwnProperty(baseSymbol) ) {
+				error("detected cyclic inheritance when looking at " + $.longname + ": " + JSON.stringify(visited));
+				return false;
+			}
+			visited[baseSymbol] = true;
+			baseSymbol = lookup(baseSymbol) ;
+			if ( hasSettings(baseSymbol, visited) ) {
+				return true;
+			}
+		}
+
+		var metadata = $.__ui5.metadata;
+		return metadata &&
+			(
+				!isEmpty(metadata.specialSettings)
+				|| !isEmpty(metadata.properties)
+				|| !isEmpty(metadata.aggregations)
+				|| !isEmpty(metadata.associations)
+				|| !isEmpty(metadata.annotations)
+				|| !isEmpty(metadata.events)
+			);
+	}
+
+	function writeMetadata($) {
+
+		var metadata = $.__ui5.metadata;
+		if ( !metadata ) {
+			return;
+		}
+
+		var n;
+
+		if ( metadata.specialSettings && Object.keys(metadata.specialSettings).length > 0 ) {
+			collection("specialSettings");
+			for ( n in metadata.specialSettings ) {
+				var special = metadata.specialSettings[n];
+				tag("specialSetting");
+				attrib("name", special.name);
+				attrib("type", special.type);
+				attrib("visibility", special.visibility, 'public');
+				if ( special.since ) {
+					attrib("since", extractVersion(special.since));
+				}
+				tag("description", normalizeWS(special.doc), true);
+				tagWithSince("experimental", special.experimental);
+				tagWithSince("deprecated", special.deprecation);
+				methodList("method", special.methods);
+				closeTag("specialSetting");
+			}
+			endCollection("specialSettings");
+		}
+
+		if ( metadata.properties && Object.keys(metadata.properties).length > 0 ) {
+			collection("properties");
+			for ( n in metadata.properties ) {
+				var prop = metadata.properties[n];
+				tag("property");
+				attrib("name", prop.name);
+				attrib("type", prop.type, 'string');
+				attrib("defaultValue", prop.defaultValue, null, /* raw = */true);
+				attrib("group", prop.group, 'Misc');
+				attrib("visibility", prop.visibility, 'public');
+				if ( prop.since ) {
+					attrib("since", extractVersion(prop.since));
+				}
+				if ( prop.bindable ) {
+					attrib("bindable", prop.bindable, false, /* raw = */true);
+				}
+				tag("description", normalizeWS(prop.doc), true);
+				tagWithSince("experimental", prop.experimental);
+				tagWithSince("deprecated", prop.deprecation);
+				methodList("methods", prop.methods);
+				closeTag("property");
+			}
+			endCollection("properties");
+		}
+
+		if ( metadata.defaultProperty ) {
+			tag("defaultProperty", metadata.defaultProperty);
+		}
+
+		if ( metadata.dnd ) {
+			curr.dnd = metadata.dnd;
+		}
+
+		if ( metadata.aggregations && Object.keys(metadata.aggregations).length > 0 ) {
+			collection("aggregations");
+			for ( n in metadata.aggregations ) {
+				var aggr = metadata.aggregations[n];
+				tag("aggregation");
+				attrib("name", aggr.name);
+				attrib("singularName", aggr.singularName); // TODO omit default?
+				attrib("type", aggr.type, 'sap.ui.core.Control');
+				if ( aggr.altTypes ) {
+					curr.altTypes = aggr.altTypes.slice();
+				}
+				attrib("cardinality", aggr.cardinality, '0..n');
+				attrib("visibility", aggr.visibility, 'public');
+				if ( aggr.since ) {
+					attrib("since", extractVersion(aggr.since));
+				}
+				if ( aggr.bindable ) {
+					attrib("bindable", aggr.bindable, false, /* raw = */true);
+				}
+				if ( aggr.dnd ) {
+					curr.dnd = aggr.dnd;
+				}
+				tag("description", normalizeWS(aggr.doc), true);
+				tagWithSince("experimental", aggr.experimental);
+				tagWithSince("deprecated", aggr.deprecation);
+				methodList("methods", aggr.methods);
+				closeTag("aggregation");
+			}
+			endCollection("aggregations");
+		}
+
+		if ( metadata.defaultAggregation ) {
+			tag("defaultAggregation", metadata.defaultAggregation);
+		}
+
+		if ( metadata.associations && Object.keys(metadata.associations).length > 0 ) {
+			collection("associations");
+			for ( n in metadata.associations ) {
+				var assoc = metadata.associations[n];
+				tag("association");
+				attrib("name", assoc.name);
+				attrib("singularName", assoc.singularName); // TODO omit default?
+				attrib("type", assoc.type, 'sap.ui.core.Control');
+				attrib("cardinality", assoc.cardinality, '0..1');
+				attrib("visibility", assoc.visibility, 'public');
+				if ( assoc.since ) {
+					attrib("since", extractVersion(assoc.since));
+				}
+				tag("description", normalizeWS(assoc.doc), true);
+				tagWithSince("experimental", assoc.experimental);
+				tagWithSince("deprecated", assoc.deprecation);
+				methodList("methods", assoc.methods);
+				closeTag("association");
+			}
+			endCollection("associations");
+		}
+
+		if ( metadata.events && Object.keys(metadata.events).length > 0 ) {
+			collection("events");
+			for ( n in metadata.events ) {
+				var event = metadata.events[n];
+				tag("event");
+				attrib("name", event.name);
+				attrib("visibility", event.visibility, 'public');
+				if ( event.since ) {
+					attrib("since", extractVersion(event.since));
+				}
+				tag("description", normalizeWS(event.doc), true);
+				tagWithSince("experimental", event.experimental);
+				tagWithSince("deprecated", event.deprecation);
+				if ( event.parameters && Object.keys(event.parameters).length > 0 ) {
+					tag("parameters");
+					for ( var pn in event.parameters ) {
+						if ( event.parameters.hasOwnProperty(pn) ) {
+							var param = event.parameters[pn];
+							tag(pn);
+							attrib("name", pn);
+							attrib("type", param.type);
+							if ( param.since ) {
+								attrib("since", extractVersion(param.since));
+							}
+							tag("description", normalizeWS(param.doc), true);
+							tagWithSince("experimental", param.experimental);
+							tagWithSince("deprecated", param.deprecation);
+							closeTag(pn);
+						}
+					}
+					closeTag("parameters");
+				}
+				methodList("methods", event.methods, true);
+				closeTag("event");
+			}
+			endCollection("events");
+		}
+
+		if ( metadata.annotations && Object.keys(metadata.annotations).length > 0 ) {
+			collection("annotations");
+			for ( n in metadata.annotations ) {
+				var anno = metadata.annotations[n];
+				tag("annotation");
+				attrib("name", anno.name);
+				attrib("namespace", anno.namespace);
+				if ( anno.target && anno.target.length > 0 ) {
+					curr.target = anno.target.slice();
+				}
+				attrib("annotation", anno.annotation);
+				attrib("defaultValue", anno.defaultValue);
+				if ( anno.appliesTo && anno.appliesTo.length > 0 ) {
+					curr.appliesTo = anno.appliesTo.slice();
+				}
+				if ( anno.since ) {
+					attrib("since", extractVersion(anno.since));
+				}
+				tag("description", normalizeWS(anno.doc), true);
+				tagWithSince("deprecated", anno.deprecation);
+				closeTag("annotation");
+			}
+			endCollection("annotations");
+		}
+		
+		if ( metadata.designtime ) { // don't write falsy values
+			tag("designtime", metadata.designtime);
+		}
+
+	}
+
+	function writeParameterProperties(paramName, params) {
+		var prefix = paramName + '.',
+			count = 0,
+			i;
+
+		for ( i = 0; i < params.length; i++ ) {
+
+			var name = params[i].name;
+			if ( name.lastIndexOf(prefix, 0) !== 0 ) { // startsWith
+				continue;
+			}
+			name = name.slice(prefix.length);
+			if ( name.indexOf('.') >= 0 ) {
+				continue;
+			}
+
+			if ( count === 0 ) {
+				tag("parameterProperties");
+			}
+
+			count++;
+
+			tag(name);
+			attrib("name", name);
+			attrib("type", listTypes(params[i].type));
+			attrib("optional", !!params[i].optional, false, /* raw = */true);
+			if ( params[i].defaultvalue !== undefined ) {
+				attrib("defaultValue", params[i].defaultvalue, undefined, /* raw = */true);
+			}
+			if ( params[i].since ) {
+				attrib("since", extractVersion(params[i].since));
+			}
+
+			writeParameterProperties(params[i].name, params);
+
+			tag("description", normalizeWS(params[i].description), true);
+			tagWithSince("experimental", params[i].experimental);
+			tagWithSince("deprecated", params[i].deprecated);
+
+			closeTag(name);
+		}
+
+		if ( count > 0 ) {
+			closeTag("parameterProperties");
+		}
+	}
+
+	/*
+	var rSplitSecTag = /^\s*\{([^\}]*)\}/;
+
+	function secTags($) {
+		if ( true ) {
+			return;
+		}
+		var aTags = $.tags;
+		if ( !aTags ) {
+			return;
+		}
+		for (var iTag = 0; iTag < A_SECURITY_TAGS.length; iTag++  ) {
+			var oTagDef = A_SECURITY_TAGS[iTag];
+			for (var j = 0; j < aTags.length; j++ ) {
+				if ( aTags[j].title.toLowerCase() === oTagDef.name.toLowerCase() ) {
+					tag(oTagDef.name);
+					var m = rSplitSecTag.exec(aTags[j].text);
+					if ( m && m[1].trim() ) {
+						var aParams = m[1].trim().split(/\s*\|\s* /); <-- remember to remove the space!
+						for (var iParam = 0; iParam < aParams.length; iParam++ ) {
+							tag(oTagDef.params[iParam], aParams[iParam]);
+						}
+					}
+					var sDesc = aTags[j].description;
+					tag("description", sDesc, true);
+					closeTag(oTagDef.name);
+				}
+			}
+		}
+	}
+	*/
+
+	var kind = (symbol.kind === 'member' && symbol.isEnum) ? "enum" : symbol.kind; // handle pseudo-kind 'enum'
+
+	tag(kind);
+
+	attrib("name", symbol.longname);
+	attrib("basename", symbol.name);
+	if ( symbol.__ui5.resource ) {
+		attrib("resource", symbol.__ui5.resource);
+	}
+	if ( symbol.__ui5.module ) {
+		attrib("module", symbol.__ui5.module);
+		attrib("export", undefined, '', true);
+	}
+	if ( symbol.virtual ) {
+		attrib("abstract", true, false, /* raw = */true);
+	}
+	if ( symbol.final_ ) {
+		attrib("final", true, false, /* raw = */true);
+	}
+	if ( symbol.scope === 'static' ) {
+		attrib("static", true, false, /* raw = */true);
+	}
+	attrib("visibility", visibility(symbol), 'public');
+	if ( symbol.since ) {
+		attrib("since", extractVersion(symbol.since));
+	}
+	if ( symbol.augments && symbol.augments.length ) {
+		tag("extends", symbol.augments.sort().join(",")); // TODO what about multiple inheritance?
+	}
+	interfaceList("implements", symbol.implements);
+	tag("description", normalizeWS(symbol.classdesc || (symbol.kind === 'class' ? '' : symbol.description)), true);
+	tagWithSince("experimental", symbol.experimental);
+	tagWithSince("deprecated", symbol.deprecated);
+	if ( symbol.tags && symbol.tags.some(function(tag) { return tag.title === 'ui5-metamodel'; }) ) {
+		attrib('ui5-metamodel', true, false, /* raw = */true);
+	}
+
+	var i, j, member, param;
+
+	if ( kind === 'class' ) {
+
+		if ( symbol.__ui5.stereotype || hasSettings(symbol) ) {
+
+			tag("ui5-metadata");
+
+			if ( symbol.__ui5.stereotype ) {
+				attrib("stereotype", symbol.__ui5.stereotype);
+			}
+
+			writeMetadata(symbol);
+
+			closeTag("ui5-metadata");
+		}
+
+
+		// IF @hideconstructor tag is present we omit the whole constructor
+		if ( !symbol.hideconstructor ) {
+
+			tag("constructor");
+			attrib("visibility", visibility(symbol));
+			if (symbol.params && symbol.params.length > 0) {
+				collection("parameters");
+				for (j = 0; j < symbol.params.length; j++) {
+					param = symbol.params[j];
+					if (param.name.indexOf('.') >= 0) {
+						continue;
+					}
+					tag("parameter");
+					attrib("name", param.name);
+					attrib("type", listTypes(param.type));
+					attrib("optional", !!param.optional, false, /* raw = */true);
+					if (param.defaultvalue !== undefined) {
+						attrib("defaultValue", param.defaultvalue, undefined, /* raw = */true);
+					}
+					if (param.since) {
+						attrib("since", extractVersion(param.since));
+					}
+
+					writeParameterProperties(param.name, symbol.params);
+					tag("description", normalizeWS(param.description), true);
+					tagWithSince("experimental", param.experimental);
+					tagWithSince("deprecated", param.deprecated);
+					closeTag("parameter");
+				}
+				endCollection("parameters");
+			}
+			exceptions(symbol);
+			tag("description", normalizeWS(symbol.description), true);
+			// tagWithSince("experimental", symbol.experimental); // TODO repeat from class?
+			// tagWithSince("deprecated", symbol.deprecated); // TODO repeat from class?
+			examples(symbol); // TODO here or for class?
+			referencesList(symbol); // TODO here or for class?
+			// secTags(symbol); // TODO repeat from class?
+			closeTag("constructor");
+
+		}
+	} else if ( kind === 'namespace' ) {
+		if ( symbol.__ui5.stereotype || symbol.__ui5.metadata ) {
+			tag("ui5-metadata");
+
+			if ( symbol.__ui5.stereotype ) {
+				attrib("stereotype", symbol.__ui5.stereotype);
+			}
+
+			if ( symbol.__ui5.metadata && symbol.__ui5.metadata.basetype ) {
+				attrib("basetype", symbol.__ui5.metadata.basetype);
+			}
+
+			if ( symbol.__ui5.metadata && symbol.__ui5.metadata.pattern ) {
+				attrib("pattern", symbol.__ui5.metadata.pattern);
+			}
+
+			if ( symbol.__ui5.metadata && symbol.__ui5.metadata.range ) {
+				attrib("range", symbol.__ui5.metadata.range, null, /* raw = */ true);
+			}
+
+			closeTag("ui5-metadata");
+		}
+	}
+
+	var ownProperties = childrenOfKind(symbol, "property").own.sort(sortByAlias);
+	if ( ownProperties.length > 0 ) {
+		collection("properties");
+		for ( i = 0; i < ownProperties.length; i++ ) {
+			member = ownProperties[i];
+			tag("property");
+			attrib("name", member.name);
+			if ( member.__ui5.module && member.__ui5.module !== symbol.__ui5.module ) {
+				attrib("module", member.__ui5.module);
+				attrib("export", undefined, '', true);
+			}
+			attrib("visibility", visibility(member), 'public');
+			if ( member.scope === 'static' ) {
+				attrib("static", true, false, /* raw = */true);
+			}
+			if ( member.since ) {
+				attrib("since", extractVersion(member.since));
+			}
+			attrib("type", listTypes(member.type));
+			tag("description", normalizeWS(member.description), true);
+			tagWithSince("experimental", member.experimental);
+			tagWithSince("deprecated", member.deprecated);
+			examples(member);
+			referencesList(member);
+			if ( member.__ui5.resource && member.__ui5.resource !== symbol.__ui5.resource ) {
+				attrib("resource", member.__ui5.resource);
+			}
+			closeTag("property");
+		}
+		endCollection("properties");
+	}
+
+	var ownEvents = childrenOfKind(symbol, 'event').own.sort(sortByAlias);
+	if ( ownEvents.length > 0 ) {
+		collection("events");
+		for (i = 0; i < ownEvents.length; i++ ) {
+			member = ownEvents[i];
+			tag("event");
+			attrib("name", member.name);
+			if ( member.__ui5.module && member.__ui5.module !== symbol.__ui5.module ) {
+				attrib("module", member.__ui5.module);
+				attrib("export", undefined, '', true);
+			}
+			attrib("visibility", visibility(member), 'public');
+			if ( member.scope === 'static' ) {
+				attrib("static", true, false, /* raw = */true);
+			}
+			if ( member.since ) {
+				attrib("since", extractVersion(member.since));
+			}
+
+			if ( member.params && member.params.length > 0 ) {
+				collection("parameters");
+				for (j = 0; j < member.params.length; j++) {
+					param = member.params[j];
+					if ( param.name.indexOf('.') >= 0 ) {
+						continue;
+					}
+
+					tag("parameter");
+					attrib("name", param.name);
+					attrib("type", listTypes(param.type));
+					if ( param.since ) {
+						attrib("since", extractVersion(param.since));
+					}
+					writeParameterProperties(param.name, member.params);
+					tag("description", normalizeWS(param.description), true);
+					tagWithSince("experimental", param.experimental);
+					tagWithSince("deprecated", param.deprecated);
+					closeTag("parameter");
+				}
+				endCollection("parameters");
+			}
+			tag("description", normalizeWS(member.description), true);
+			tagWithSince("deprecated", member.deprecated);
+			tagWithSince("experimental", member.experimental);
+			examples(member);
+			referencesList(member);
+			//secTags(member);
+			if ( member.__ui5.resource && member.__ui5.resource !== symbol.__ui5.resource ) {
+				attrib("resource", member.__ui5.resource);
+			}
+			closeTag("event");
+		}
+		endCollection("events");
+	}
+
+	var ownMethods = childrenOfKind(symbol, 'method').own.sort(sortByAlias);
+	if ( ownMethods.length > 0 ) {
+		collection("methods");
+		for ( i = 0; i < ownMethods.length; i++ ) {
+			member = ownMethods[i];
+			tag("method");
+			attrib("name", member.name);
+			if ( member.__ui5.module && member.__ui5.module !== symbol.__ui5.module ) {
+				attrib("module", member.__ui5.module);
+				attrib("export", undefined, '', true);
+			}
+			attrib("visibility", visibility(member), 'public');
+			if ( member.scope === 'static' ) {
+				attrib("static", true, false, /* raw = */true);
+			}
+			if ( member.tags && member.tags.some(function(tag) { return tag.title === 'ui5-metamodel'; }) ) {
+				attrib('ui5-metamodel', true, false, /* raw = */true);
+			}
+
+			var returns = member.returns && member.returns.length && member.returns[0];
+			var type = member.type || (returns && returns.type);
+			type = listTypes(type);
+			//if ( type && type !== 'void' ) {
+			//	attrib("type", type, 'void');
+			//}
+			if ( type && type !== 'void' || returns && returns.description ) {
+				tag("returnValue");
+				if ( type && type !== 'void' ) {
+					attrib("type", type);
+				}
+				if ( returns && returns.description ) {
+					attrib("description", normalizeWS(returns.description));
+				}
+				closeTag("returnValue");
+			}
+			if ( member.since ) {
+				attrib("since", extractVersion(member.since));
+			}
+
+			if ( member.params && member.params.length > 0 ) {
+				collection("parameters");
+				for ( j = 0; j < member.params.length; j++) {
+					param = member.params[j];
+					if ( param.name.indexOf('.') >= 0 ) {
+						continue;
+					}
+					tag("parameter");
+					attrib("name", param.name);
+					attrib("type", listTypes(param.type));
+					attrib("optional", !!param.optional, false, /* raw = */true);
+					if ( param.defaultvalue !== undefined ) {
+						attrib("defaultValue", param.defaultvalue, undefined, /* raw = */true);
+					}
+					if ( param.since ) {
+						attrib("since", extractVersion(param.since));
+					}
+					writeParameterProperties(param.name, member.params);
+					tag("description", normalizeWS(param.description), true);
+					tagWithSince("experimental", param.experimental);
+					tagWithSince("deprecated", param.deprecated);
+					closeTag("parameter");
+				}
+				endCollection("parameters");
+			}
+			exceptions(member);
+			tag("description", normalizeWS(member.description), true);
+			tagWithSince("experimental", member.experimental);
+			tagWithSince("deprecated", member.deprecated);
+			examples(member);
+			referencesList(member);
+			//secTags(member);
+			if ( member.__ui5.resource && member.__ui5.resource !== symbol.__ui5.resource ) {
+				attrib("resource", member.__ui5.resource);
+			}
+			closeTag("method");
+		}
+		endCollection("methods");
+	}
+
+//	if ( roots && symbol.__ui5.children && symbol.__ui5.children.length ) {
+//		collection("children", "kind");
+//		symbol.__ui5.children.forEach(writeSymbol);
+//		endCollection("children");
+//	}
+
+	closeTag(kind);
+
+	return obj[0];
+}
+
+function postProcessAPIJSON(api) {
+	var modules = {};
+	var symbols = api.symbols;
+	var i,j,n,symbol,defaultExport;
+	
+	// collect modules and the symbols that refer to them 
+	for ( i = 0; i < symbols.length; i++) {
+		symbol = symbols[i];
+		if ( symbol.module ) {
+			modules[symbol.module] = modules[symbol.module] || [];
+			modules[symbol.module].push({
+				name: symbol.name,
+				symbol: symbol
+			});
+		}
+		if ( symbol.properties ) {
+			for ( j = 0; j < symbol.properties.length; j++ ) {
+				if ( symbol.properties[j].static && symbol.properties[j].module ) {
+					modules[symbol.properties[j].module] = modules[symbol.properties[j].module] || [];
+					modules[symbol.properties[j].module].push({
+						name: symbol.name + "." + symbol.properties[j].name,
+						symbol: symbol.properties[j]
+					});
+				}
+			}
+		}
+		if ( symbol.methods ) {
+			for ( j = 0; j < symbol.methods.length; j++ ) {
+				if ( symbol.methods[j].static && symbol.methods[j].module ) {
+					modules[symbol.methods[j].module] = modules[symbol.methods[j].module] || [];
+					modules[symbol.methods[j].module].push({
+						name: symbol.name + "." + symbol.methods[j].name,
+						symbol: symbol.methods[j]
+					});
+				}
+			}
+		}
+	}
+	
+	function guessExport(defaultExport, symbol) {
+		if ( symbol.name === defaultExport ) {
+			// default export equals the symbol name
+			symbol.symbol.export = ""; 
+			//console.log("    (default):" + defaultExport);
+		} else if ( symbol.name.lastIndexOf(defaultExport + ".", 0) === 0 ) {
+			// default export is a prefix of the symbol name
+			symbol.symbol.export = symbol.name.slice(defaultExport.length + 1); 
+			//console.log("    " + symbol.name.slice(defaultExport.length + 1) + ":" + symbol.name);
+		} else {
+			// default export is not a prefix of the symbol name -> no way to access it in AMD 
+			symbol.symbol.export = undefined;
+			console.log("    **** could not identify module export for API " + symbol.name);
+		}
+	}
+	
+	for ( n in modules ) {
+		
+		symbols = modules[n].sort(function(a,b) {
+			if ( a.name === b.name ) {
+				return 0;
+			}
+			return a.name < b.name ? -1 : 1;
+		});
+		
+		// console.log('  resolved exports of ' + n + ": " + symbols.map(function(symbol) { return symbol.name; } ));
+		if ( /^jquery\.sap\./.test(n) ) {
+			// the jquery.sap.* modules all export 'jQuery'.
+			// any API from those modules is reachable via 'jQuery.*'
+			defaultExport = 'jQuery';
+			symbols.forEach(
+				guessExport.bind(this, defaultExport)
+			);
+		} else if ( /\/library$/.test(n) ) {
+			// library.js modules export the library namespace
+			defaultExport = n.replace(/\/library$/, "").replace(/\//g, ".");
+			if ( symbols.some(function(symbol) { return symbol.name === defaultExport; }) ) {
+				// if there is a symbol for the namespace, then all other symbols from the module should be sub-exports of that symbol
+				symbols.forEach(
+					guessExport.bind(this, defaultExport)
+				);
+			} else {
+				// otherwise, we don't know how to map it to an export
+				symbols.forEach(function(symbol) {
+					symbol.symbol.export = symbol.name;
+					console.log("    **** unresolved " + symbol.name + " in library.js (no export that matches module name)");
+				});
+			}
+		} else {
+			// for all other modules, the assumed default export is identical to the name of the module (converted to a 'dot' name)
+			defaultExport = n.replace(/\//g, ".");
+			if ( symbols.some(function(symbol) { return symbol.name === defaultExport; }) ) {
+				symbols.forEach(
+					guessExport.bind(this, defaultExport)
+				);
+			//} else if ( symbols.length === 1 && (symbols[0].symbol.kind === 'class' || symbols[0].symbol.kind === 'namespace') ) {
+				// if there is only one symbol and if that symbol is of type class or namespace, assume it is the default export
+				// TODO is that assumption safe? Was only done because of IBarPageEnabler (which maybe better should be fixed in the JSDoc)
+				//symbols[0].symbol.export = '';
+			} else {
+				symbols.forEach(function(symbol) {
+					symbol.symbol.export = undefined;
+					console.log("    **** unresolved " + symbol.name + " (no export that matches module name)");
+				});
+			}
+		}
+	}
+}
+
+//---- add on: API XML -----------------------------------------------------------------
+
+function createAPIXML(symbols, filename, options) {
+
+	options = options || {};
+	var roots = options.roots || null;
+	var legacyContent = !!options.legacyContent;
+	var omitDefaults = !!options.omitDefaults;
+	var addRedundancy = !!options.resolveInheritance;
+
+	var indent = 0;
+	var output = [];
+	var sIndent = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+	var tags = [];
+	var ENUM = legacyContent ? "namespace" : "enum" ;
+	var BASETYPE = legacyContent ? "baseType" : "extends";
+	var PROPERTY = legacyContent ? "parameter" : "property";
+	var unclosedStartTag = false;
+
+	function getAPIJSON(name) {
+
+		var symbol = lookup(name);
+		if ( symbol && !symbol.synthetic ) {
+			return createAPIJSON4Symbol(symbol, false);
+		}
+		if ( addRedundancy && externalSymbols[name] ) {
+			debug("  using " + name + " from external dependency");
+			return externalSymbols[name];
+		}
+		return symbol;
+	}
+
+	function encode(s) {
+		return s ? s.replace(/&/g, "&").replace(/ 0 )
+			output.push(sIndent.slice(0,indent));
+		if ( arguments.length ) {
+			for (var i = 0; i < arguments.length; i++)
+				output.push(arguments[i]);
+		}
+		output.push("\n");
+	}
+
+	function rootTag(name) {
+		tags = [];
+		unclosedStartTag = false;
+		tag(name);
+	}
+
+	function closeRootTag(name) {
+		closeTag(name);
+	}
+
+	function namespace(alias, namespace) {
+		attrib(alias, namespace);
+	}
+
+	function tag(name, value, omitEmpty) {
+
+		if ( omitEmpty && !value ) {
+			return;
+		}
+		if ( unclosedStartTag ) {
+			unclosedStartTag = false;
+			write('>\n');
+		}
+		if ( arguments.length === 1 ) { // opening tag
+			if ( indent > 0 ) {
+				output.push(sIndent.slice(0,indent));
+			}
+			write("<", name);
+			unclosedStartTag = true;
+			if ( legacyContent ) {
+				unclosedStartTag = false;
+				write(">\n");
+			}
+			tags.push(name);
+			indent++;
+			return;
+		}
+		if ( value == null ) {
+			writeln("<", name, "/>");
+		} else {
+			writeln("<", name, ">", encode(String(value)), "");
+		}
+	}
+
+	function attrib(name, value, defaultValue) {
+		var emptyTag = arguments.length === 1;
+		if ( omitDefaults && arguments.length === 3 && value === defaultValue ) {
+			return;
+		}
+
+		if ( !legacyContent ) {
+			write(" " + name + "=\"");
+			write(emptyTag ? "true" : encode(String(value)).replace(/"/g, """));
+			write("\"");
+		} else {
+			if ( emptyTag ) {
+				writeln("<", name, "/>");
+			} else {
+				writeln("<", name, ">", encode(String(value)), "");
+			}
+		}
+	}
+
+	function closeTag(name, noIndent) {
+
+		indent--;
+		var top = tags.pop();
+		if ( top != name ) {
+			// ERROR?
+		}
+
+		if ( unclosedStartTag ) {
+			unclosedStartTag = false;
+			write("/>\n");
+		} else if ( noIndent ) {
+			write("\n");
+		} else {
+			writeln("");
+		}
+	}
+
+	function textContent(text) {
+		if ( unclosedStartTag ) {
+			unclosedStartTag = false;
+			write('>');
+		}
+		write(encode(text));
+	}
+
+	function tagWithSince(tagName, prop) {
+		if ( prop ) {
+			tag(tagName);
+			if ( prop.since ) {
+				attrib("since", prop.since);
+			}
+			if ( prop.text && prop.text.trim() ) {
+				textContent(prop.text);
+			}
+			closeTag(tagName, true);
+		}
+	}
+
+	function getAsString() {
+		return output.join("");
+	}
+
+	function writeMetadata(symbolAPI, inherited) {
+
+		var ui5Metadata = symbolAPI["ui5-metadata"];
+		if ( !ui5Metadata ) {
+			return;
+		}
+
+		if ( addRedundancy && symbolAPI["extends"] ) {
+			var baseSymbolAPI = getAPIJSON(symbolAPI["extends"]);
+			if ( baseSymbolAPI ) {
+				writeMetadata(baseSymbolAPI, true);
+			}
+		}
+
+		if ( ui5Metadata.specialSettings ) {
+			ui5Metadata.specialSettings.forEach(function(special) {
+				tag("specialSetting");
+				attrib("name", special.name);
+				attrib("type", special.type);
+				attrib("visibility", special.visibility, 'public');
+				if ( special.since ) {
+					attrib("since", special.since);
+				}
+				if ( inherited ) {
+					attrib("origin", symbolAPI.name);
+				}
+				tag("description", special.description, true);
+				tagWithSince("experimental", special.experimental);
+				tagWithSince("deprecated", special.deprecated);
+				tag("methods", special.methods);
+				closeTag("specialSetting");
+			});
+		}
+
+		if ( ui5Metadata.properties ) {
+			ui5Metadata.properties.forEach(function(prop) {
+				tag("property");
+				attrib("name", prop.name);
+				attrib("type", prop.type, 'string');
+				if ( prop.defaultValue !== null ) {
+					attrib("defaultValue", prop.defaultValue, null);
+				}
+				attrib("visibility", prop.visibility, 'public');
+				if ( prop.since ) {
+					attrib("since", prop.since);
+				}
+				if ( prop.bindable ) {
+					attrib("bindable", prop.bindable);
+				}
+				if ( inherited ) {
+					attrib("origin", symbolAPI.name);
+				}
+				tag("description", prop.description, true);
+				tagWithSince("experimental", prop.experimental);
+				tagWithSince("deprecated", prop.deprecated);
+				tag("methods", prop.methods);
+				closeTag("property");
+			});
+		}
+
+		if ( ui5Metadata.defaultProperty ) {
+			tag("defaultProperty", ui5Metadata.defaultProperty);
+		}
+
+		if ( ui5Metadata.aggregations ) {
+			ui5Metadata.aggregations.forEach(function(aggr) {
+				tag("aggregation");
+				attrib("name", aggr.name);
+				attrib("singularName", aggr.singularName); // TODO omit default?
+				attrib("type", aggr.type, 'sap.ui.core.Control');
+				if ( aggr.altTypes ) {
+					attrib("altTypes", aggr.altTypes.join(","));
+				}
+				attrib("cardinality", aggr.cardinality, '0..n');
+				attrib("visibility", aggr.visibility, 'public');
+				if ( aggr.since ) {
+					attrib("since", aggr.since);
+				}
+				if ( aggr.bindable ) {
+					attrib("bindable", aggr.bindable);
+				}
+				if ( inherited ) {
+					attrib("origin", symbolAPI.name);
+				}
+				tag("description", aggr.description, true);
+				tagWithSince("experimental", aggr.experimental);
+				tagWithSince("deprecated", aggr.deprecated);
+				tag("methods", aggr.methods);
+				closeTag("aggregation");
+			});
+		}
+
+		if ( ui5Metadata.defaultAggregation ) {
+			tag("defaultAggregation", ui5Metadata.defaultAggregation);
+		}
+
+		if ( ui5Metadata.associations ) {
+			ui5Metadata.associations.forEach(function(assoc) {
+				tag("association");
+				attrib("name", assoc.name);
+				attrib("singularName", assoc.singularName); // TODO omit default?
+				attrib("type", assoc.type, 'sap.ui.core.Control');
+				attrib("cardinality", assoc.cardinality, '0..1');
+				attrib("visibility", assoc.visibility, 'public');
+				if ( assoc.since ) {
+					attrib("since", assoc.since);
+				}
+				if ( inherited ) {
+					attrib("origin", symbolAPI.name);
+				}
+				tag("description", assoc.description, true);
+				tagWithSince("experimental", assoc.experimental);
+				tagWithSince("deprecated", assoc.deprecated);
+				tag("methods", assoc.methods);
+				closeTag("association");
+			});
+		}
+
+		if ( ui5Metadata.events ) {
+			ui5Metadata.events.forEach(function(event) {
+				tag("event");
+				attrib("name", event.name);
+				attrib("visibility", event.visibility, 'public');
+				if ( event.since ) {
+					attrib("since", event.since);
+				}
+				if ( inherited ) {
+					attrib("origin", symbolAPI.name);
+				}
+				tag("description", event.description, true);
+				tagWithSince("experimental", event.experimental);
+				tagWithSince("deprecated", event.deprecated);
+				if ( event.parameters ) {
+					tag("parameters");
+					for ( var pn in event.parameters ) {
+						if ( event.parameters.hasOwnProperty(pn) ) {
+							var param = event.parameters[pn];
+
+							tag("parameter");
+							attrib("name", param.name);
+							attrib("type", param.type);
+							if ( param.since ) {
+								attrib("since", param.since);
+							}
+							tag("description", param.description, true);
+							tagWithSince("experimental", param.experimental);
+							tagWithSince("deprecated", param.deprecated);
+							closeTag("parameter");
+						}
+					}
+					closeTag("parameters");
+				}
+				tag("methods", event.methods, true);
+				closeTag("event");
+			});
+		}
+
+		if ( ui5Metadata.annotations ) {
+			ui5Metadata.annotations.forEach(function(anno) {
+				tag("annotation");
+				attrib("name", anno.name);
+				attrib("namespace", anno.namespace); // TODO omit default?
+				attrib("target", anno.target);
+				attrib("annotation", anno.annotation);
+				attrib("appliesTo", anno.appliesTo);
+				if ( anno.since ) {
+					attrib("since", anno.since);
+				}
+				tag("description", anno.description, true);
+				tagWithSince("deprecated", anno.deprecated);
+				closeTag("annotation");
+			});
+		}
+
+	}
+
+	function writeParameterPropertiesForMSettings(symbolAPI, inherited) {
+
+		var ui5Metadata = symbolAPI["ui5-metadata"];
+		if ( !ui5Metadata ) {
+			return;
+		}
+
+		if ( symbolAPI["extends"] ) {
+			var baseSymbolAPI = getAPIJSON(symbolAPI["extends"]);
+			writeParameterPropertiesForMSettings(baseSymbolAPI, true);
+		}
+
+		if ( ui5Metadata.specialSettings ) {
+			ui5Metadata.specialSettings.forEach(function(special) {
+				if ( special.visibility !== 'hidden' ) {
+					tag("property");
+					attrib("name", special.name);
+					attrib("type", special.type);
+					attrib("optional");
+					if ( inherited ) {
+						attrib("origin", symbolAPI.name);
+					}
+					tag("description", special.description, true);
+					closeTag("property");
+				}
+			});
+		}
+
+		if ( ui5Metadata.properties ) {
+			ui5Metadata.properties.forEach(function(prop) {
+				tag("property");
+				attrib("name", prop.name);
+				attrib("type", prop.type);
+				attrib("group", prop.group, 'Misc');
+				if ( prop.defaultValue !== null ) {
+					attrib("defaultValue", typeof prop.defaultValue === 'string' ? "\"" + prop.defaultValue + "\"" : prop.defaultValue);
+				}
+				attrib("optional");
+				if ( inherited ) {
+					attrib("origin", symbolAPI.name);
+				}
+				tag("description", prop.description, true);
+				closeTag("property");
+			});
+		}
+
+		if ( ui5Metadata.aggregations ) {
+			ui5Metadata.aggregations.forEach(function(aggr) {
+				if ( aggr.visibility !== "hidden" ) {
+					tag("property");
+					attrib("name", aggr.name);
+					attrib("type", aggr.type + (aggr.cardinality === '0..1' ? "" : "[]"));
+					if ( aggr.altTypes ) {
+						attrib("altTypes", aggr.altTypes.join(","));
+					}
+					attrib("optional");
+					if ( inherited ) {
+						attrib("origin", symbolAPI.name);
+					}
+					tag("description", aggr.description, true);
+					closeTag("property");
+				}
+			});
+		}
+
+		if ( ui5Metadata.associations ) {
+			ui5Metadata.associations.forEach(function(assoc) {
+				if ( assoc.visibility !== "hidden" ) {
+					tag("property");
+					attrib("name", assoc.name);
+					attrib("type", "(" + assoc.type + "|" + "string)" + (assoc.cardinality === '0..1' ? "" : "[]"));
+					attrib("optional");
+					if ( inherited ) {
+						attrib("origin", symbolAPI.name);
+					}
+					tag("description", assoc.description, true);
+					closeTag("property");
+				}
+			});
+		}
+
+		if ( ui5Metadata.events ) {
+			ui5Metadata.events.forEach(function(event) {
+				tag("property");
+				attrib("name", event.name);
+				attrib("type", "function|array");
+				attrib("optional");
+				if ( inherited ) {
+					attrib("origin", symbolAPI.name);
+				}
+				tag("description", event.description, true);
+				closeTag("property");
+			});
+		}
+
+	}
+
+	function writeParameterProperties(param, paramName) {
+		var props = param.parameterProperties,
+			prefix = paramName + '.',
+			count = 0;
+
+		if ( props ) {
+			for (var n in props ) {
+				if ( props.hasOwnProperty(n) ) {
+
+					param = props[n];
+
+					if ( !legacyContent && count === 0 ) {
+						tag("parameterProperties");
+					}
+
+					count++;
+
+					tag(PROPERTY);
+					attrib("name", legacyContent ? prefix + n : n);
+					attrib("type", param.type);
+					if ( param.since ) {
+						attrib("since", param.since);
+					}
+					if ( param.optional ) {
+						attrib("optional", param.optional);
+					}
+
+					if ( !legacyContent ) {
+						writeParameterProperties(param, prefix + n);
+					}
+
+					tag("description", param.description, true);
+					tagWithSince("experimental", param.experimental);
+					tagWithSince("deprecated", param.deprecated);
+
+					closeTag(PROPERTY);
+
+					if ( legacyContent ) {
+						writeParameterProperties(param, prefix + n);
+					}
+				}
+			}
+		}
+
+		if ( !legacyContent && count > 0 ) {
+			closeTag("parameterProperties");
+		}
+	}
+
+	/*
+	var rSplitSecTag = /^\s*\{([^\}]*)\}/;
+
+	function secTags($) {
+		if ( !legacyContent ) {
+			return;
+		}
+		var aTags = $.tags;
+		if ( !aTags ) {
+			return;
+		}
+		for (var iTag = 0; iTag < A_SECURITY_TAGS.length; iTag++  ) {
+			var oTagDef = A_SECURITY_TAGS[iTag];
+			for (var j = 0; j < aTags.length; j++ ) {
+				if ( aTags[j].title.toLowerCase() === oTagDef.name.toLowerCase() ) {
+					tag(oTagDef.name);
+					var m = rSplitSecTag.exec(aTags[j].text);
+					if ( m && m[1].trim() ) {
+						var aParams = m[1].trim().split(/\s*\|\s* /); <-- remove the blank!
+						for (var iParam = 0; iParam < aParams.length; iParam++ ) {
+							tag(oTagDef.params[iParam], aParams[iParam]);
+						}
+					}
+					var sDesc = aTags[j].description;
+					tag("description", sDesc, true);
+					closeTag(oTagDef.name);
+				}
+			}
+		}
+	}
+	*/
+
+	function writeSymbol(symbol) {
+
+		var kind;
+
+		if ( isaClass(symbol) && (roots || !symbol.synthetic) ) { // dump a symbol if it as a class symbol and if either hierarchies are dumped or if it is not a synthetic symbol
+
+			// for the hierarchy we use only the local information
+			var symbolAPI = createAPIJSON4Symbol(symbol);
+
+			kind = symbolAPI.kind === 'enum' ? ENUM : symbolAPI.kind;
+
+			tag(kind);
+
+			attrib("name", symbolAPI.name);
+			attrib("basename", symbolAPI.basename);
+//			if ( symbolAPI["resource"] ) {
+//				attrib("resource");
+//			}
+			if ( symbolAPI["module"] ) {
+				attrib("module", symbolAPI["module"]);
+			}
+			if ( symbolAPI["abstract"] ) {
+				attrib("abstract");
+			}
+			if ( symbolAPI["final"] ) {
+				attrib("final");
+			}
+			if ( symbolAPI["static"] ) {
+				attrib("static");
+			}
+			attrib("visibility", symbolAPI.visibility, 'public');
+			if ( symbolAPI.since ) {
+				attrib("since", symbolAPI.since);
+			}
+			if ( symbolAPI["extends"] ) {
+				tag(BASETYPE, symbolAPI["extends"]); // TODO what about multiple inheritance?
+			}
+			tag("description", symbolAPI.description, true);
+			tagWithSince("experimental", symbolAPI.experimental);
+			tagWithSince("deprecated", symbolAPI.deprecated);
+
+			if ( kind === 'class' ) {
+
+				var hasSettings = symbolAPI["ui5-metadata"];
+
+				if ( !legacyContent && symbolAPI["ui5-metadata"] ) {
+
+					tag("ui5-metadata");
+
+					if ( symbolAPI["ui5-metadata"].stereotype ) {
+						attrib("stereotype", symbolAPI["ui5-metadata"].stereotype);
+					}
+
+					writeMetadata(symbolAPI);
+
+					closeTag("ui5-metadata");
+
+				}
+
+				tag("constructor");
+				if ( legacyContent ) {
+					attrib("name", symbolAPI.basename);
+				}
+				attrib("visibility", symbolAPI.visibility, 'public');
+				if ( symbolAPI.constructor.parameters ) {
+					symbolAPI.constructor.parameters.forEach(function(param, j) {
+
+						tag("parameter");
+						attrib("name", param.name);
+						attrib("type", param.type);
+						attrib("optional", param.optional, false);
+						if ( param.defaultValue !== undefined ) {
+							attrib("defaultValue", param.defaultValue);
+						}
+						if ( param.since ) {
+							attrib("since", param.since);
+						}
+
+						if ( !legacyContent ) {
+							if ( hasSettings && j == 1 && /setting/i.test(param.name) && /object/i.test(param.type) ) {
+								if ( addRedundancy ) {
+									tag("parameterProperties");
+									writeParameterPropertiesForMSettings(symbolAPI);
+									closeTag("parameterProperties");
+								}
+							} else {
+								writeParameterProperties(param, param.name);
+							}
+						}
+						tag("description", param.description, true);
+						tagWithSince("experimental", param.experimental);
+						tagWithSince("deprecated", param.deprecated);
+						closeTag("parameter");
+						if ( legacyContent ) {
+							writeParameterProperties(param, param.name);
+						}
+					});
+				}
+
+				tag("description", getConstructorDescription(symbol), true);
+				// tagWithSince("experimental", symbol.experimental); // TODO repeat from class?
+				// tagWithSince("deprecated", symbol.deprecated); // TODO repeat from class?
+				// secTags(symbol); // TODO repeat from class?
+				closeTag("constructor");
+			}
+
+			/* TODO MIGRATE or remove, if not needed
+			var ownSubspaces = ( symbol.__ui5.children || [] ).filter(function($) { return $.kind === 'namespace' }).sort(sortByAlias);
+			for (var i=0; i");
+	rootTag("api");
+	if ( !legacyContent ) {
+		namespace("xmlns", "http://www.sap.com/sap.ui.library.api.xsd");
+		attrib("_version", "1.0.0");
+		if ( templateConf.version ) {
+			attrib("version", templateConf.version.replace(/-SNAPSHOT$/,""));
+		}
+		if ( templateConf.uilib ) {
+			attrib("library", templateConf.uilib);
+		}
+	}
+
+	if ( roots ) {
+		roots.forEach(writeSymbol);
+	} else {
+		// sort only a copy(!) of the symbols, otherwise the SymbolSet lookup is broken
+		symbols.slice(0).sort(sortByAlias).forEach(writeSymbol);
+	}
+
+	closeRootTag("api");
+
+	fs.mkPath(path.dirname(filename));
+	fs.writeFileSync(filename, getAsString(), 'utf8');
+}
+
+//---- add on: API JS -----------------------------------------------------------------
+
+function createAPIJS(symbols, filename) {
+
+	var output = [];
+
+	var rkeywords = /^(?:abstract|as|boolean|break|byte|case|catch|char|class|continue|const|debugger|default|delete|do|double|else|enum|export|extends|false|final|finally|float|for|function|goto|if|implements|import|in|instanceof|int|interface|is|long|namespace|native|new|null|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|use|var|void|volatile|while|with)$/;
+
+	function isNoKeyword($) { return !rkeywords.test($.name); }
+
+	function isAPI($) { return $.access === 'public' || $.access === 'protected' || !$.access }
+
+	function writeln(args) {
+		if ( arguments.length ) {
+			for (var i = 0; i < arguments.length; i++)
+				output.push(arguments[i]);
+		}
+		output.push("\n");
+	}
+
+	function unwrap(docletSrc) {
+		if (!docletSrc) { return ''; }
+
+		// note: keep trailing whitespace for @examples
+		// extra opening/closing stars are ignored
+		// left margin is considered a star and a space
+		// use the /m flag on regex to avoid having to guess what this platform's newline is
+		docletSrc =
+			docletSrc.replace(/^\/\*\*+/, '') // remove opening slash+stars
+			.replace(/\**\*\/$/, "\\Z")       // replace closing star slash with end-marker
+			.replace(/^\s*(\* ?|\\Z)/gm, '')  // remove left margin like: spaces+star or spaces+end-marker
+			.replace(/\s*\\Z$/g, '');         // remove end-marker
+
+		return docletSrc;
+	}
+
+	function comment($, sMetaType) {
+
+		var s = unwrap($.comment.toString());
+
+		// remove the @desc tag
+		s = s.replace(/(\r\n|\r|\n)/gm, "\n");
+		s = s.replace(/^\s*@desc\s*/gm, "");
+		s = s.replace(/^\s*@alias[^\r\n]*(\r\n|\r|\n)?/gm, "");
+		s = s.replace(/^\s*@name[^\r\n]*(\r\n|\r|\n)?/gm, "");
+		s = s.replace(/^\s*@function[^\r\n]*(\r\n|\r|\n)?/gm, "");
+		s = s.replace(/^\s*@author[^\r\n]*(\r\n|\r|\n)?/gm, "");
+		s = s.replace(/^\s*@synthetic[^\r\n]*(\r\n|\r|\n)?/gm, "");
+		s = s.replace(/^\s*<\/p>

\s*(\r\n|\r|\n)?/gm, "\n"); + // skip empty documentation + if ( !s ) return; + + // for namespaces, enforce the @.memberof tag + if ( sMetaType === "namespace" && $.memberof && s.indexOf("@memberof") < 0 ) { + s = s + "\n@memberof " + $.memberof; + } + + writeln("/**\n * " + s.replace(/\n/g, "\n * ") + "\n */"); + + /* + writeln("/**"); + writeln(s.split(/\r\n|\r|\n/g).map(function($) { return " * " + $;}).join("\r\n")); + writeln(" * /"); + */ + + } + + function signature($) { + var p = $.params, + r = [], + i; + if ( p ) { + for (i = 0; i < p.length; i++) { + // ignore @param tags for 'virtual' params that are used to document members of config-like params + // (e.g. like "@param param1.key ...") + if (p[i].name && p[i].name.indexOf('.') < 0) { + r.push(p[i].name); + } + } + } + return r.join(','); + } + + function qname(member,parent) { + var r = member.memberof; + if ( member.scope !== 'static' ) { + r += ".prototype"; + } + return (r ? r + "." : "") + member.name; + } + + var mValues = { + "boolean" : "false", + "int" : "0", + "float" : "0.0", + "number" : "0.0", + "string" : "\"\"", + "object" : "new Object()", + "function" : "function() {}" + }; + + function valueForType(type) { + if ( type && type.names && type.names[0] ) { + type = type.names[0]; + if ( REGEXP_ARRAY_TYPE.test(type) || type.indexOf("[]") > 0 ) { + return "new Array()"; + } else if ( mValues[type] ) { + return mValues[type]; + } else if ( type.indexOf(".") > 0 ) { + return "new " + type + "()"; + } else { + // return "/* unsupported type: " + member.type + " */ null"; + return "null"; + } + } + } + + function value(member) { + return valueForType(member.type); + } + + function retvalue(member) { + //console.log(member); + var r = valueForType(member.type || (member.returns && member.returns.length && member.returns[0] && member.returns[0].type && member.returns[0].type)); + if ( r ) { + return "return " + r + ";"; + } + return ""; + } + + var sortedSymbols = symbols.slice(0).filter(function($) { return isaClass($) && isAPI($) && !$.synthetic; }).sort(sortByAlias); // sort only a copy(!) of the symbols, otherwise the SymbolSet lookup is broken + sortedSymbols.forEach(function(symbol) { + + var sMetaType = (symbol.kind === 'member' && symbol.isEnum) ? 'enum' : symbol.kind; + if ( sMetaType ) { + + writeln(""); + writeln("// ---- " + symbol.longname + " --------------------------------------------------------------------------"); + writeln(""); + + var memberId, member; + + var ownProperties = childrenOfKind(symbol, 'property').own.filter(isNoKeyword).sort(sortByAlias); + if ( sMetaType === "class" ) { + comment(symbol, sMetaType); + writeln(symbol.longname + " = function(" + signature(symbol) + ") {};"); + for ( memberId in ownProperties ) { + member = ownProperties[memberId]; + comment(member, sMetaType); + writeln(qname(member, symbol) + " = " + value(member)); + writeln(""); + } + } else if ( sMetaType === 'namespace' || sMetaType === 'enum' ) { + //console.log("found namespace " + symbol.longname); + //console.log(ownProperties); + if ( ownProperties.length ) { + writeln("// dummy function to make Eclipse aware of namespace"); + writeln(symbol.longname + ".toString = function() { return \"\"; };"); + } + } + + var ownEvents = childrenOfKind(symbol, 'event').own.filter(isNoKeyword).sort(sortByAlias); + if ( ownEvents.length ) { + for ( memberId in ownEvents ) { + member = ownEvents[memberId]; + comment(member, sMetaType); + writeln(qname(member, symbol) + " = function(" + signature(member) + ") { " + retvalue(member) + " };"); + writeln(""); + } + } + + var ownMethods = childrenOfKind(symbol, 'method').own.filter(isNoKeyword).sort(sortByAlias); + if ( ownMethods.length ) { + for ( memberId in ownMethods ) { + member = ownMethods[memberId]; + comment(member, sMetaType); + writeln(qname(member, symbol) + " = function(" + signature(member) + ") { " + retvalue(member) + " };"); + writeln(""); + } + } + + } + }); + + writeln("// ---- static fields of namespaces ---------------------------------------------------------------------"); + + sortedSymbols.forEach(function(symbol) { + + var sMetaType = (symbol.kind === 'member' && symbol.isEnum) ? 'enum' : symbol.kind; + + if ( sMetaType === 'namespace' || sMetaType === 'enum' ) { + + var ownProperties = childrenOfKind(symbol, 'property').own.filter(isNoKeyword).sort(sortByAlias); + if ( ownProperties.length ) { + writeln(""); + writeln("// ---- " + symbol.longname + " --------------------------------------------------------------------------"); + writeln(""); + + for (var memberId in ownProperties ) { + var member = ownProperties[memberId]; + comment(member, sMetaType); + writeln(qname(member, symbol) + " = " + value(member) + ";"); + writeln(""); + } + } + } + + }); + + fs.mkPath(path.dirname(filename)); + fs.writeFileSync(filename, output.join(""), 'utf8'); + info(" saved as " + filename); +} + +// Description + Settings + +function getConstructorDescription(symbol) { + var description = symbol.description; + var tags = symbol.tags; + if ( tags ) { + for (var i = 0; i < tags.length; i++) { + if ( tags[i].title === "ui5-settings" && tags[i].text) { + description += "\n

\n" + tags[i].text; + break; + } + } + } + return description; +} + + +// Example + +function makeExample(example) { + var result = { + caption: null, + example: example + }, + match = /^\s*([\s\S]+?)<\/caption>(?:[ \t]*[\n\r]*)([\s\S]+)$/i.exec(example); + + if ( match ) { + result.caption = match[1]; + result.example = match[2]; + } + + return result; +} + +/* ---- exports ---- */ + +exports.publish = publish; + diff --git a/lib/tasks/createJSDoc.js b/lib/tasks/createJSDoc.js new file mode 100644 index 000000000..f7e4d9c69 --- /dev/null +++ b/lib/tasks/createJSDoc.js @@ -0,0 +1,29 @@ +const runJSDoc = require("../processors/jsdoc/jsdoc"); + +/** + * Task to create dbg files. + * + * @module builder/tasks/createDebugFiles + * @param {Object} parameters Parameters + * @param {DuplexCollection} parameters.workspace DuplexCollection to read and write files + * @param {Object} [parameters.options] Options + * @param {string} [parameters.options.pattern] Pattern to locate the files to be processed + * @returns {Promise} Promise resolving with undefined once data has been written + */ +module.exports = async function({workspace, options}) { + let allResources; + if (workspace.byGlobSource) { // API only available on duplex collections + allResources = await workspace.byGlobSource(options.pattern); + } else { + allResources = await workspace.byGlob(options.pattern); + } + return runJSDoc({ + resources: allResources, + options + }).then((createdResources) => { + console.log(createdResources); + return Promise.all(createdResources.map((resource) => { + return workspace.write(resource); + })); + }); +}; diff --git a/lib/types/library/LibraryBuilder.js b/lib/types/library/LibraryBuilder.js index 72e703fd9..7a5f4bf1c 100644 --- a/lib/types/library/LibraryBuilder.js +++ b/lib/types/library/LibraryBuilder.js @@ -8,6 +8,7 @@ const tasks = { // can't require index.js due to circular dependency generateStandaloneAppBundle: require("../../tasks/bundlers/generateStandaloneAppBundle"), buildThemes: require("../../tasks/buildThemes"), createDebugFiles: require("../../tasks/createDebugFiles"), + createJSDoc: require("../../tasks/createJSDoc"), generateVersionInfo: require("../../tasks/generateVersionInfo"), replaceCopyright: require("../../tasks/replaceCopyright"), replaceVersion: require("../../tasks/replaceVersion"), @@ -22,6 +23,7 @@ class LibraryBuilder extends AbstractBuilder { this.availableTasks = [ "replaceCopyright", "replaceVersion", + "createJSDoc", "generateComponentPreload", "generateBundle", "generateLibraryPreload", @@ -52,6 +54,20 @@ class LibraryBuilder extends AbstractBuilder { }); }); + this.addTask("createJSDoc", () => { + const createJSDoc = tasks.createJSDoc; + return createJSDoc({ + workspace: resourceCollections.workspace, + options: { + libraryName: project.metadata.name, + version: project.version, + pattern: "/resources/**/*.js" + } + }).then(() => { + console.log("createJSDOC done"); + }); + }); + const componentPreload = project.builder && project.builder.componentPreload; if (componentPreload) { const generateComponentPreload = tasks.generateComponentPreload; @@ -77,6 +93,9 @@ class LibraryBuilder extends AbstractBuilder { options: { projectName: project.metadata.name } + }).catch((err) => { + console.log("generateLibraryPreload failed:", err); + throw err; }); }); diff --git a/package-lock.json b/package-lock.json index 8d5c4ae62..0f73aef86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,18 +16,18 @@ "integrity": "sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "^6.8.0", - "babel-plugin-syntax-trailing-function-commas": "^6.20.0", - "babel-plugin-transform-async-to-generator": "^6.16.0", - "babel-plugin-transform-es2015-destructuring": "^6.19.0", - "babel-plugin-transform-es2015-function-name": "^6.9.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.18.0", - "babel-plugin-transform-es2015-parameters": "^6.21.0", - "babel-plugin-transform-es2015-spread": "^6.8.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.8.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.11.0", - "babel-plugin-transform-exponentiation-operator": "^6.8.0", - "package-hash": "^1.2.0" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "package-hash": "1.2.0" }, "dependencies": { "md5-hex": { @@ -36,7 +36,7 @@ "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", "dev": true, "requires": { - "md5-o-matic": "^0.1.1" + "md5-o-matic": "0.1.1" } }, "package-hash": { @@ -45,7 +45,7 @@ "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=", "dev": true, "requires": { - "md5-hex": "^1.3.0" + "md5-hex": "1.3.0" } } } @@ -56,8 +56,8 @@ "integrity": "sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=", "dev": true, "requires": { - "@ava/babel-plugin-throws-helper": "^2.0.0", - "babel-plugin-espower": "^2.3.2" + "@ava/babel-plugin-throws-helper": "2.0.0", + "babel-plugin-espower": "2.4.0" } }, "@ava/write-file-atomic": { @@ -66,9 +66,9 @@ "integrity": "sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" } }, "@concordance/react": { @@ -77,7 +77,7 @@ "integrity": "sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ==", "dev": true, "requires": { - "arrify": "^1.0.1" + "arrify": "1.0.1" } }, "@ladjs/time-require": { @@ -86,10 +86,10 @@ "integrity": "sha512-weIbJqTMfQ4r1YX85u54DKfjLZs2jwn1XZ6tIOP/pFgMwhIN5BAtaCp/1wn9DzyLsDR9tW0R2NIePcVJ45ivQQ==", "dev": true, "requires": { - "chalk": "^0.4.0", - "date-time": "^0.1.1", - "pretty-ms": "^0.2.1", - "text-table": "^0.2.0" + "chalk": "0.4.0", + "date-time": "0.1.1", + "pretty-ms": "0.2.2", + "text-table": "0.2.0" }, "dependencies": { "ansi-styles": { @@ -104,9 +104,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, "pretty-ms": { @@ -115,7 +115,7 @@ "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", "dev": true, "requires": { - "parse-ms": "^0.1.0" + "parse-ms": "0.1.2" } }, "strip-ansi": { @@ -131,16 +131,16 @@ "resolved": "https://registry.npmjs.org/@ui5/fs/-/fs-0.1.0.tgz", "integrity": "sha512-S4FK6YjPdVHBpzi1bSnqVCWbH/C6aSR8efZASkAuBl9r84VcRNS+yCuGO+MzD7HRLW9oJWmDFNS/+flaRTGtfQ==", "requires": { - "@ui5/logger": "^0.1.0", - "clone": "^2.1.0", - "defaults": "^1.0.3", - "globby": "^7.1.1", - "graceful-fs": "^4.1.11", - "make-dir": "^1.1.0", - "micromatch": "^3.1.4", - "minimatch": "^3.0.3", - "pretty-hrtime": "^1.0.3", - "random-int": "^1.0.0" + "@ui5/logger": "0.1.0", + "clone": "2.1.1", + "defaults": "1.0.3", + "globby": "7.1.1", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "micromatch": "3.1.10", + "minimatch": "3.0.4", + "pretty-hrtime": "1.0.3", + "random-int": "1.0.0" } }, "@ui5/logger": { @@ -148,7 +148,7 @@ "resolved": "https://registry.npmjs.org/@ui5/logger/-/logger-0.1.0.tgz", "integrity": "sha512-IlRE/cr9ky45nSw0z5yJSwJGglauego0naCR9BBtSvy2JqYZAdvVRhrBFED05UY/ZmRTScyg2qrsTlokJYYYKw==", "requires": { - "npmlog": "^4.1.2" + "npmlog": "4.1.2" } }, "acorn": { @@ -163,7 +163,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "^3.0.4" + "acorn": "3.3.0" }, "dependencies": { "acorn": { @@ -185,10 +185,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { @@ -208,7 +208,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "^2.0.0" + "string-width": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -229,8 +229,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -239,7 +239,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -261,7 +261,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.1" } }, "anymatch": { @@ -270,8 +270,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" }, "dependencies": { "arr-diff": { @@ -280,7 +280,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -295,9 +295,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -306,7 +306,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -315,7 +315,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -324,7 +324,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -333,19 +333,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -360,14 +360,14 @@ "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": "1.3.0", + "async": "2.6.1", + "buffer-crc32": "0.2.13", + "glob": "7.1.2", + "lodash": "4.17.10", + "readable-stream": "2.3.6", + "tar-stream": "1.6.1", + "zip-stream": "1.2.0" } }, "archiver-utils": { @@ -375,12 +375,12 @@ "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" + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lazystream": "1.0.0", + "lodash": "4.17.10", + "normalize-path": "2.1.1", + "readable-stream": "2.3.6" } }, "are-we-there-yet": { @@ -388,8 +388,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "argparse": { @@ -398,7 +398,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "arr-diff": { @@ -434,8 +434,8 @@ "integrity": "sha1-/0KsU+ZvSF1viDI0wyJSvCKGEw4=", "dev": true, "requires": { - "async-arrays": "*", - "extended-emitter": "*" + "async-arrays": "1.0.1", + "extended-emitter": "1.0.2" } }, "array-find-index": { @@ -449,7 +449,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "^1.0.1" + "array-uniq": "1.0.3" } }, "array-uniq": { @@ -493,7 +493,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "requires": { - "lodash": "^4.17.10" + "lodash": "4.17.10" } }, "async-arrays": { @@ -502,7 +502,7 @@ "integrity": "sha1-NHrytw8qeldnotVnnMQrvxwiD9k=", "dev": true, "requires": { - "sift": "*" + "sift": "5.1.0" } }, "async-each": { @@ -533,89 +533,89 @@ "integrity": "sha512-4lGNJCf6xL8SvsKVEKxEE46se7JAUIAZoKHw9itTQuwcsydhpAMkBs5gOOiWiwt0JKNIuXWc2/r4r8ZdcNrBEw==", "dev": true, "requires": { - "@ava/babel-preset-stage-4": "^1.1.0", - "@ava/babel-preset-transform-test-files": "^3.0.0", - "@ava/write-file-atomic": "^2.2.0", - "@concordance/react": "^1.0.0", - "@ladjs/time-require": "^0.1.4", - "ansi-escapes": "^3.0.0", - "ansi-styles": "^3.1.0", - "arr-flatten": "^1.0.1", - "array-union": "^1.0.1", - "array-uniq": "^1.0.2", - "arrify": "^1.0.0", - "auto-bind": "^1.1.0", - "ava-init": "^0.2.0", - "babel-core": "^6.17.0", - "babel-generator": "^6.26.0", - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "bluebird": "^3.0.0", - "caching-transform": "^1.0.0", - "chalk": "^2.0.1", - "chokidar": "^1.4.2", - "clean-stack": "^1.1.1", - "clean-yaml-object": "^0.1.0", - "cli-cursor": "^2.1.0", - "cli-spinners": "^1.0.0", - "cli-truncate": "^1.0.0", - "co-with-promise": "^4.6.0", - "code-excerpt": "^2.1.1", - "common-path-prefix": "^1.0.0", - "concordance": "^3.0.0", - "convert-source-map": "^1.5.1", - "core-assert": "^0.2.0", - "currently-unhandled": "^0.4.1", - "debug": "^3.0.1", - "dot-prop": "^4.1.0", - "empower-core": "^0.6.1", - "equal-length": "^1.0.0", - "figures": "^2.0.0", - "find-cache-dir": "^1.0.0", - "fn-name": "^2.0.0", - "get-port": "^3.0.0", - "globby": "^6.0.0", - "has-flag": "^2.0.0", - "hullabaloo-config-manager": "^1.1.0", - "ignore-by-default": "^1.0.0", - "import-local": "^0.1.1", - "indent-string": "^3.0.0", - "is-ci": "^1.0.7", - "is-generator-fn": "^1.0.0", - "is-obj": "^1.0.0", - "is-observable": "^1.0.0", - "is-promise": "^2.1.0", - "last-line-stream": "^1.0.0", - "lodash.clonedeepwith": "^4.5.0", - "lodash.debounce": "^4.0.3", - "lodash.difference": "^4.3.0", - "lodash.flatten": "^4.2.0", - "loud-rejection": "^1.2.0", - "make-dir": "^1.0.0", - "matcher": "^1.0.0", - "md5-hex": "^2.0.0", - "meow": "^3.7.0", - "ms": "^2.0.0", - "multimatch": "^2.1.0", - "observable-to-promise": "^0.5.0", - "option-chain": "^1.0.0", - "package-hash": "^2.0.0", - "pkg-conf": "^2.0.0", - "plur": "^2.0.0", - "pretty-ms": "^3.0.0", - "require-precompiled": "^0.1.0", - "resolve-cwd": "^2.0.0", - "safe-buffer": "^5.1.1", - "semver": "^5.4.1", - "slash": "^1.0.0", - "source-map-support": "^0.5.0", - "stack-utils": "^1.0.1", - "strip-ansi": "^4.0.0", - "strip-bom-buf": "^1.0.0", - "supertap": "^1.0.0", - "supports-color": "^5.0.0", - "trim-off-newlines": "^1.0.1", - "unique-temp-dir": "^1.0.0", - "update-notifier": "^2.3.0" + "@ava/babel-preset-stage-4": "1.1.0", + "@ava/babel-preset-transform-test-files": "3.0.0", + "@ava/write-file-atomic": "2.2.0", + "@concordance/react": "1.0.0", + "@ladjs/time-require": "0.1.4", + "ansi-escapes": "3.1.0", + "ansi-styles": "3.2.1", + "arr-flatten": "1.1.0", + "array-union": "1.0.2", + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "auto-bind": "1.2.0", + "ava-init": "0.2.1", + "babel-core": "6.26.3", + "babel-generator": "6.26.1", + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "bluebird": "3.5.1", + "caching-transform": "1.0.1", + "chalk": "2.4.1", + "chokidar": "1.7.0", + "clean-stack": "1.3.0", + "clean-yaml-object": "0.1.0", + "cli-cursor": "2.1.0", + "cli-spinners": "1.3.1", + "cli-truncate": "1.1.0", + "co-with-promise": "4.6.0", + "code-excerpt": "2.1.1", + "common-path-prefix": "1.0.0", + "concordance": "3.0.0", + "convert-source-map": "1.5.1", + "core-assert": "0.2.1", + "currently-unhandled": "0.4.1", + "debug": "3.1.0", + "dot-prop": "4.2.0", + "empower-core": "0.6.2", + "equal-length": "1.0.1", + "figures": "2.0.0", + "find-cache-dir": "1.0.0", + "fn-name": "2.0.1", + "get-port": "3.2.0", + "globby": "6.1.0", + "has-flag": "2.0.0", + "hullabaloo-config-manager": "1.1.1", + "ignore-by-default": "1.0.1", + "import-local": "0.1.1", + "indent-string": "3.2.0", + "is-ci": "1.1.0", + "is-generator-fn": "1.0.0", + "is-obj": "1.0.1", + "is-observable": "1.1.0", + "is-promise": "2.1.0", + "last-line-stream": "1.0.0", + "lodash.clonedeepwith": "4.5.0", + "lodash.debounce": "4.0.8", + "lodash.difference": "4.5.0", + "lodash.flatten": "4.4.0", + "loud-rejection": "1.6.0", + "make-dir": "1.3.0", + "matcher": "1.1.1", + "md5-hex": "2.0.0", + "meow": "3.7.0", + "ms": "2.0.0", + "multimatch": "2.1.0", + "observable-to-promise": "0.5.0", + "option-chain": "1.0.0", + "package-hash": "2.0.0", + "pkg-conf": "2.1.0", + "plur": "2.1.2", + "pretty-ms": "3.2.0", + "require-precompiled": "0.1.0", + "resolve-cwd": "2.0.0", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "slash": "1.0.0", + "source-map-support": "0.5.6", + "stack-utils": "1.0.1", + "strip-ansi": "4.0.0", + "strip-bom-buf": "1.0.0", + "supertap": "1.0.0", + "supports-color": "5.4.0", + "trim-off-newlines": "1.0.1", + "unique-temp-dir": "1.0.0", + "update-notifier": "2.5.0" }, "dependencies": { "ansi-regex": { @@ -639,11 +639,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pify": { @@ -664,7 +664,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "strip-ansi": { @@ -673,7 +673,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -684,11 +684,11 @@ "integrity": "sha512-lXwK5LM+2g1euDRqW1mcSX/tqzY1QU7EjKpqayFPPtNRmbSYZ8RzPO5tqluTToijmtjp2M+pNpVdbcHssC4glg==", "dev": true, "requires": { - "arr-exclude": "^1.0.0", - "execa": "^0.7.0", - "has-yarn": "^1.0.0", - "read-pkg-up": "^2.0.0", - "write-pkg": "^3.1.0" + "arr-exclude": "1.0.0", + "execa": "0.7.0", + "has-yarn": "1.0.0", + "read-pkg-up": "2.0.0", + "write-pkg": "3.1.0" } }, "aws-sign2": { @@ -707,9 +707,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" }, "dependencies": { "ansi-styles": { @@ -724,11 +724,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "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" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "supports-color": { @@ -745,25 +745,25 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" } }, "babel-generator": { @@ -772,14 +772,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "jsesc": { @@ -796,9 +796,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-call-delegate": { @@ -807,10 +807,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-explode-assignable-expression": { @@ -819,9 +819,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -830,11 +830,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -843,8 +843,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -853,8 +853,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { @@ -863,9 +863,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-helper-remap-async-to-generator": { @@ -874,11 +874,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -887,8 +887,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-messages": { @@ -897,7 +897,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-check-es2015-constants": { @@ -906,7 +906,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-espower": { @@ -915,13 +915,13 @@ "integrity": "sha512-/+SRpy7pKgTI28oEHfn1wkuM5QFAdRq8WNsOOih1dVrdV6A/WbNbRZyl0eX5eyDgtb0lOE27PeDFuCX2j8OxVg==", "dev": true, "requires": { - "babel-generator": "^6.1.0", - "babylon": "^6.1.0", - "call-matcher": "^1.0.0", - "core-js": "^2.0.0", - "espower-location-detector": "^1.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.1.1" + "babel-generator": "6.26.1", + "babylon": "6.18.0", + "call-matcher": "1.0.1", + "core-js": "2.5.7", + "espower-location-detector": "1.0.0", + "espurify": "1.8.0", + "estraverse": "4.2.0" } }, "babel-plugin-syntax-async-functions": { @@ -954,9 +954,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -965,7 +965,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -974,9 +974,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -985,10 +985,10 @@ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -997,12 +997,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -1011,7 +1011,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -1020,9 +1020,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -1031,9 +1031,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -1042,9 +1042,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-strict-mode": { @@ -1053,8 +1053,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-register": { @@ -1063,13 +1063,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" }, "dependencies": { "mkdirp": { @@ -1087,7 +1087,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" } } } @@ -1098,8 +1098,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" } }, "babel-template": { @@ -1108,11 +1108,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" } }, "babel-traverse": { @@ -1121,15 +1121,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { @@ -1138,10 +1138,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -1160,13 +1160,13 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -1174,7 +1174,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -1182,7 +1182,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1190,7 +1190,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1198,9 +1198,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -1211,7 +1211,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "binary-extensions": { @@ -1226,7 +1226,7 @@ "integrity": "sha512-UGtq08LSiazxL4zVmBzrhdCWnT4RWx3JhhD/3crhfv8xxjnVHxf/WoVjEstjSUaZeZRP7kZrWNqup1VvUClCaQ==", "dev": true, "requires": { - "array-events": "^0.2.0" + "array-events": "0.2.0" } }, "bl": { @@ -1234,8 +1234,8 @@ "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" + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" } }, "bluebird": { @@ -1250,13 +1250,13 @@ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" }, "dependencies": { "ansi-regex": { @@ -1283,8 +1283,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -1293,7 +1293,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -1303,7 +1303,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1312,16 +1312,16 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -1329,7 +1329,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1345,8 +1345,8 @@ "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": "1.1.0", + "buffer-fill": "1.0.0" } }, "buffer-alloc-unsafe": { @@ -1381,15 +1381,15 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" } }, "caching-transform": { @@ -1398,9 +1398,9 @@ "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", "dev": true, "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" }, "dependencies": { "md5-hex": { @@ -1409,7 +1409,7 @@ "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", "dev": true, "requires": { - "md5-o-matic": "^0.1.1" + "md5-o-matic": "0.1.1" } }, "mkdirp": { @@ -1427,9 +1427,9 @@ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" } } } @@ -1440,10 +1440,10 @@ "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", "dev": true, "requires": { - "core-js": "^2.0.0", - "deep-equal": "^1.0.0", - "espurify": "^1.6.0", - "estraverse": "^4.0.0" + "core-js": "2.5.7", + "deep-equal": "1.0.1", + "espurify": "1.8.0", + "estraverse": "4.2.0" } }, "call-me-maybe": { @@ -1464,7 +1464,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "^0.2.0" + "callsites": "0.2.0" } }, "callsites": { @@ -1485,8 +1485,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "2.1.1", + "map-obj": "1.0.1" } }, "capture-stack-trace": { @@ -1506,7 +1506,7 @@ "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", "dev": true, "requires": { - "underscore-contrib": "~0.3.0" + "underscore-contrib": "0.3.0" } }, "chai": { @@ -1515,12 +1515,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, "chai-fs": { @@ -1529,8 +1529,8 @@ "integrity": "sha1-Na4Dn7uwcQ9RIqrhf6uh6PQRB8Y=", "dev": true, "requires": { - "bit-mask": "^1.0.1", - "readdir-enhanced": "^1.4.0" + "bit-mask": "1.0.2", + "readdir-enhanced": "1.5.2" } }, "chalk": { @@ -1539,9 +1539,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "chardet": { @@ -1562,15 +1562,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.2.4", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" } }, "ci-info": { @@ -1590,10 +1590,10 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -1601,7 +1601,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -1612,7 +1612,7 @@ "integrity": "sha1-6TfN/cxXgaAIF67EB56Fs+wVeiA=", "optional": true, "requires": { - "commander": "2.0.x" + "commander": "2.0.0" } }, "clean-stack": { @@ -1639,7 +1639,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "2.0.0" } }, "cli-spinners": { @@ -1654,8 +1654,8 @@ "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", "dev": true, "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" + "slice-ansi": "1.0.0", + "string-width": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -1676,8 +1676,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -1686,7 +1686,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -1713,7 +1713,7 @@ "integrity": "sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=", "dev": true, "requires": { - "pinkie-promise": "^1.0.0" + "pinkie-promise": "1.0.0" } }, "code-excerpt": { @@ -1722,7 +1722,7 @@ "integrity": "sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw==", "dev": true, "requires": { - "convert-to-spaces": "^1.0.1" + "convert-to-spaces": "1.0.2" } }, "code-point-at": { @@ -1735,8 +1735,8 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color-convert": { @@ -1745,7 +1745,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -1759,7 +1759,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -1790,10 +1790,10 @@ "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" + "buffer-crc32": "0.2.13", + "crc32-stream": "2.0.0", + "normalize-path": "2.1.1", + "readable-stream": "2.3.6" } }, "concat-map": { @@ -1807,10 +1807,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" } }, "concordance": { @@ -1819,17 +1819,17 @@ "integrity": "sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ==", "dev": true, "requires": { - "date-time": "^2.1.0", - "esutils": "^2.0.2", - "fast-diff": "^1.1.1", - "function-name-support": "^0.2.0", - "js-string-escape": "^1.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.flattendeep": "^4.4.0", - "lodash.merge": "^4.6.0", - "md5-hex": "^2.0.0", - "semver": "^5.3.0", - "well-known-symbols": "^1.0.0" + "date-time": "2.1.0", + "esutils": "2.0.2", + "fast-diff": "1.1.2", + "function-name-support": "0.2.0", + "js-string-escape": "1.0.1", + "lodash.clonedeep": "4.5.0", + "lodash.flattendeep": "4.4.0", + "lodash.merge": "4.6.1", + "md5-hex": "2.0.0", + "semver": "5.5.0", + "well-known-symbols": "1.0.0" }, "dependencies": { "date-time": { @@ -1838,7 +1838,7 @@ "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", "dev": true, "requires": { - "time-zone": "^1.0.0" + "time-zone": "1.0.0" } } } @@ -1849,12 +1849,12 @@ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" } }, "console-control-strings": { @@ -1885,8 +1885,8 @@ "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=", "dev": true, "requires": { - "buf-compare": "^1.0.0", - "is-error": "^2.2.0" + "buf-compare": "1.0.1", + "is-error": "2.2.1" } }, "core-js": { @@ -1906,11 +1906,11 @@ "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", "dev": true, "requires": { - "js-yaml": "^3.6.1", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", - "minimist": "^1.2.0", - "request": "^2.79.0" + "js-yaml": "3.12.0", + "lcov-parse": "0.0.10", + "log-driver": "1.2.7", + "minimist": "1.2.0", + "request": "2.87.0" }, "dependencies": { "minimist": { @@ -1931,8 +1931,8 @@ "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" + "crc": "3.5.0", + "readable-stream": "2.3.6" } }, "create-error-class": { @@ -1941,7 +1941,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "^1.0.0" + "capture-stack-trace": "1.0.0" } }, "cross-env": { @@ -1950,19 +1950,18 @@ "integrity": "sha512-VWTDq+G4v383SzgRS7jsAVWqEWF0aKZpDz1GVjhONvPRgHB1LnxP2sXUVFKbykHkPSnfRKS8YdiDevWFwZmQ9g==", "dev": true, "requires": { - "cross-spawn": "^5.1.0", - "is-windows": "^1.0.0" + "cross-spawn": "5.1.0", + "is-windows": "1.0.2" } }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "crypto-random-string": { @@ -1976,10 +1975,10 @@ "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "requires": { - "inherits": "^2.0.1", - "source-map": "^0.1.38", - "source-map-resolve": "^0.5.1", - "urix": "^0.1.0" + "inherits": "2.0.3", + "source-map": "0.1.43", + "source-map-resolve": "0.5.2", + "urix": "0.1.0" }, "dependencies": { "source-map": { @@ -1987,7 +1986,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -1998,7 +1997,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "array-find-index": "1.0.2" } }, "d": { @@ -2006,7 +2005,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "0.10.45" } }, "dashdash": { @@ -2014,7 +2013,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "date-time": { @@ -2048,7 +2047,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "type-detect": "4.0.8" } }, "deep-equal": { @@ -2074,7 +2073,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "requires": { - "clone": "^1.0.2" + "clone": "1.0.4" }, "dependencies": { "clone": { @@ -2089,8 +2088,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2098,7 +2097,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2106,7 +2105,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2114,9 +2113,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -2127,13 +2126,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" }, "dependencies": { "globby": { @@ -2142,12 +2141,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pify": { @@ -2168,7 +2167,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } } } @@ -2189,7 +2188,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "dir-glob": { @@ -2197,8 +2196,8 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "arrify": "1.0.1", + "path-type": "3.0.0" } }, "docdash": { @@ -2213,7 +2212,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2" + "esutils": "2.0.2" } }, "dot-prop": { @@ -2222,7 +2221,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "duplexer2": { @@ -2231,7 +2230,7 @@ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "readable-stream": "2.3.6" } }, "duplexer3": { @@ -2246,7 +2245,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "empower-core": { @@ -2256,7 +2255,7 @@ "dev": true, "requires": { "call-signature": "0.0.2", - "core-js": "^2.0.0" + "core-js": "2.5.7" } }, "end-of-stream": { @@ -2264,7 +2263,7 @@ "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" + "once": "1.4.0" } }, "equal-length": { @@ -2279,7 +2278,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es5-ext": { @@ -2287,9 +2286,9 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-error": { @@ -2303,9 +2302,9 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-symbol": "3.1.1" } }, "es6-map": { @@ -2313,12 +2312,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-promise": { @@ -2332,11 +2331,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" } }, "es6-symbol": { @@ -2344,8 +2343,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.45" } }, "es6-weak-map": { @@ -2353,10 +2352,10 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "escape-string-regexp": { @@ -2369,10 +2368,10 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint": { @@ -2381,44 +2380,44 @@ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.5.0", + "ignore": "3.3.8", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "regexpp": "1.1.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", "table": "4.0.2", - "text-table": "~0.2.0" + "text-table": "0.2.0" }, "dependencies": { "ansi-regex": { @@ -2457,7 +2456,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -2474,8 +2473,8 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint-visitor-keys": { @@ -2490,10 +2489,10 @@ "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", "dev": true, "requires": { - "is-url": "^1.2.1", - "path-is-absolute": "^1.0.0", - "source-map": "^0.5.0", - "xtend": "^4.0.0" + "is-url": "1.2.4", + "path-is-absolute": "1.0.1", + "source-map": "0.5.7", + "xtend": "4.0.1" } }, "espree": { @@ -2502,8 +2501,8 @@ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "5.6.2", + "acorn-jsx": "3.0.1" } }, "esprima": { @@ -2517,7 +2516,7 @@ "integrity": "sha512-jdkJG9jswjKCCDmEridNUuIQei9algr+o66ZZ19610ZoBsiWLRsQGNYS4HGez3Z/DsR0lhANGAqiwBUclPuNag==", "dev": true, "requires": { - "core-js": "^2.0.0" + "core-js": "2.5.7" } }, "esquery": { @@ -2526,7 +2525,7 @@ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "4.2.0" } }, "esrecurse": { @@ -2534,7 +2533,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "^4.1.0" + "estraverse": "4.2.0" } }, "estraverse": { @@ -2553,8 +2552,8 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.45" } }, "events-to-array": { @@ -2569,13 +2568,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "expand-brackets": { @@ -2583,13 +2582,13 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2597,7 +2596,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -2605,7 +2604,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2616,7 +2615,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.4" }, "dependencies": { "fill-range": { @@ -2625,11 +2624,11 @@ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.0.0", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" } }, "is-number": { @@ -2638,7 +2637,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "isobject": { @@ -2656,7 +2655,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2671,8 +2670,8 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -2680,7 +2679,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -2691,8 +2690,8 @@ "integrity": "sha1-olIauT87G2mjX/OjXamIk4Wpm6A=", "dev": true, "requires": { - "sift": "*", - "wolfy87-eventemitter": "*" + "sift": "5.1.0", + "wolfy87-eventemitter": "5.2.4" } }, "external-editor": { @@ -2701,9 +2700,20 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "chardet": "0.4.2", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + } } }, "extglob": { @@ -2711,14 +2721,14 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2726,7 +2736,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -2734,7 +2744,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -2742,7 +2752,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2750,7 +2760,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2758,9 +2768,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -2798,7 +2808,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "1.0.5" } }, "file-entry-cache": { @@ -2807,8 +2817,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, "file-type": { @@ -2828,10 +2838,10 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -2839,7 +2849,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2850,9 +2860,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" } }, "find-up": { @@ -2861,7 +2871,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "flat-cache": { @@ -2870,10 +2880,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" } }, "fn-name": { @@ -2893,7 +2903,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "forever-agent": { @@ -2906,9 +2916,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.18" } }, "fragment-cache": { @@ -2916,7 +2926,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fs-constants": { @@ -2936,8 +2946,8 @@ "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" }, "dependencies": { "abbrev": { @@ -2963,8 +2973,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "balanced-match": { @@ -2977,7 +2987,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -3041,7 +3051,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "fs.realpath": { @@ -3056,14 +3066,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" } }, "glob": { @@ -3072,12 +3082,12 @@ "dev": true, "optional": true, "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "has-unicode": { @@ -3092,7 +3102,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": "2.1.2" } }, "ignore-walk": { @@ -3101,7 +3111,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "inflight": { @@ -3110,8 +3120,8 @@ "dev": true, "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -3130,7 +3140,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "isarray": { @@ -3144,7 +3154,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -3157,8 +3167,8 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "minizlib": { @@ -3167,7 +3177,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "mkdirp": { @@ -3190,9 +3200,9 @@ "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" } }, "node-pre-gyp": { @@ -3201,16 +3211,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -3219,8 +3229,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "npm-bundled": { @@ -3235,8 +3245,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { @@ -3245,10 +3255,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -3267,7 +3277,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -3288,8 +3298,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -3310,10 +3320,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -3330,13 +3340,13 @@ "dev": true, "optional": true, "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" + "core-util-is": "1.0.2", + "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.2" } }, "rimraf": { @@ -3345,7 +3355,7 @@ "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -3388,9 +3398,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -3399,7 +3409,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } }, "strip-ansi": { @@ -3407,7 +3417,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -3422,13 +3432,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "util-deprecate": { @@ -3443,7 +3453,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } }, "wrappy": { @@ -3475,14 +3485,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" } }, "get-func-name": { @@ -3519,7 +3529,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -3527,12 +3537,12 @@ "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-base": { @@ -3541,8 +3551,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" } }, "glob-parent": { @@ -3551,7 +3561,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" } }, "glob-to-regexp": { @@ -3566,7 +3576,7 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "^1.3.4" + "ini": "1.3.5" } }, "globals": { @@ -3580,12 +3590,12 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" } }, "got": { @@ -3594,17 +3604,17 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" } }, "graceful-fs": { @@ -3622,8 +3632,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-ansi": { @@ -3632,7 +3642,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-color": { @@ -3657,9 +3667,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -3667,8 +3677,8 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -3676,7 +3686,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3693,8 +3703,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "hosted-git-info": { @@ -3708,9 +3718,9 @@ "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" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "hullabaloo-config-manager": { @@ -3719,20 +3729,20 @@ "integrity": "sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==", "dev": true, "requires": { - "dot-prop": "^4.1.0", - "es6-error": "^4.0.2", - "graceful-fs": "^4.1.11", - "indent-string": "^3.1.0", - "json5": "^0.5.1", - "lodash.clonedeep": "^4.5.0", - "lodash.clonedeepwith": "^4.5.0", - "lodash.isequal": "^4.5.0", - "lodash.merge": "^4.6.0", - "md5-hex": "^2.0.0", - "package-hash": "^2.0.0", - "pkg-dir": "^2.0.0", - "resolve-from": "^3.0.0", - "safe-buffer": "^5.0.1" + "dot-prop": "4.2.0", + "es6-error": "4.1.1", + "graceful-fs": "4.1.11", + "indent-string": "3.2.0", + "json5": "0.5.1", + "lodash.clonedeep": "4.5.0", + "lodash.clonedeepwith": "4.5.0", + "lodash.isequal": "4.5.0", + "lodash.merge": "4.6.1", + "md5-hex": "2.0.0", + "package-hash": "2.0.0", + "pkg-dir": "2.0.0", + "resolve-from": "3.0.0", + "safe-buffer": "5.1.2" } }, "iconv-lite": { @@ -3741,7 +3751,7 @@ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "ignore": { @@ -3767,8 +3777,8 @@ "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", "dev": true, "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" } }, "imurmurhash": { @@ -3788,8 +3798,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -3809,20 +3819,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" }, "dependencies": { "ansi-regex": { @@ -3843,8 +3853,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -3853,7 +3863,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -3864,7 +3874,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "irregular-plurals": { @@ -3878,7 +3888,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -3886,7 +3896,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3903,7 +3913,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.11.0" } }, "is-buffer": { @@ -3917,7 +3927,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-ci": { @@ -3926,7 +3936,7 @@ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { - "ci-info": "^1.0.0" + "ci-info": "1.1.3" } }, "is-data-descriptor": { @@ -3934,7 +3944,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -3942,7 +3952,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3952,9 +3962,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -3976,7 +3986,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-error": { @@ -4002,7 +4012,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { @@ -4010,7 +4020,7 @@ "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" + "number-is-nan": "1.0.1" } }, "is-generator-fn": { @@ -4025,7 +4035,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "is-installed-globally": { @@ -4034,8 +4044,8 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" } }, "is-npm": { @@ -4049,7 +4059,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4057,7 +4067,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4074,7 +4084,7 @@ "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, "requires": { - "symbol-observable": "^1.1.0" + "symbol-observable": "1.2.0" } }, "is-odd": { @@ -4082,7 +4092,7 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -4104,7 +4114,7 @@ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "1.0.1" } }, "is-path-inside": { @@ -4113,7 +4123,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "path-is-inside": "1.0.2" } }, "is-plain-obj": { @@ -4127,7 +4137,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "is-posix-bracket": { @@ -4202,8 +4212,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -4233,8 +4242,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.0" }, "dependencies": { "esprima": { @@ -4251,7 +4260,7 @@ "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", "dev": true, "requires": { - "xmlcreate": "^1.0.1" + "xmlcreate": "1.0.2" } }, "jsbn": { @@ -4267,17 +4276,17 @@ "dev": true, "requires": { "babylon": "7.0.0-beta.19", - "bluebird": "~3.5.0", - "catharsis": "~0.8.9", - "escape-string-regexp": "~1.0.5", - "js2xmlparser": "~3.0.0", - "klaw": "~2.0.0", - "marked": "~0.3.6", - "mkdirp": "~0.5.1", - "requizzle": "~0.2.1", - "strip-json-comments": "~2.0.1", + "bluebird": "3.5.1", + "catharsis": "0.8.9", + "escape-string-regexp": "1.0.5", + "js2xmlparser": "3.0.0", + "klaw": "2.0.0", + "marked": "0.3.19", + "mkdirp": "0.5.1", + "requizzle": "0.2.1", + "strip-json-comments": "2.0.1", "taffydb": "2.6.2", - "underscore": "~1.8.3" + "underscore": "1.8.3" }, "dependencies": { "babylon": { @@ -4358,7 +4367,7 @@ "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", "dev": true, "requires": { - "graceful-fs": "^4.1.9" + "graceful-fs": "4.1.11" } }, "last-line-stream": { @@ -4367,7 +4376,7 @@ "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=", "dev": true, "requires": { - "through2": "^2.0.0" + "through2": "2.0.3" } }, "latest-version": { @@ -4376,7 +4385,7 @@ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "package-json": "^4.0.0" + "package-json": "4.0.1" } }, "lazystream": { @@ -4384,7 +4393,7 @@ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "requires": { - "readable-stream": "^2.0.5" + "readable-stream": "2.3.6" } }, "lcov-parse": { @@ -4398,11 +4407,11 @@ "resolved": "https://registry.npmjs.org/less/-/less-1.6.3.tgz", "integrity": "sha1-cc6J7DC3dLNWfyVMZ5WPLywZO94=", "requires": { - "clean-css": "2.0.x", - "mime": "1.2.x", - "mkdirp": "~0.3.5", - "request": ">=2.12.0", - "source-map": "0.1.x" + "clean-css": "2.0.8", + "mime": "1.2.11", + "mkdirp": "0.3.5", + "request": "2.87.0", + "source-map": "0.1.43" }, "dependencies": { "source-map": { @@ -4411,7 +4420,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "optional": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -4421,10 +4430,10 @@ "resolved": "https://registry.npmjs.org/less-openui5/-/less-openui5-0.5.3.tgz", "integrity": "sha512-e6k/ZXS2ZIDm+5/mp5bkm8Nnt/fpMAzbe1JG9sw3ax54MKq57597nHA3yBGE+LjMe64OtEjXO/kI25Kyi6HIRw==", "requires": { - "clone": "^2.1.0", - "css": "^2.2.1", + "clone": "2.1.1", + "css": "2.2.3", "less": "1.6.3", - "object-assign": "^4.0.1" + "object-assign": "4.1.1" } }, "levn": { @@ -4433,8 +4442,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "load-json-file": { @@ -4443,10 +4452,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" }, "dependencies": { "pify": { @@ -4463,8 +4472,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -4532,7 +4541,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "loud-rejection": { @@ -4541,8 +4550,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" } }, "lowercase-keys": { @@ -4555,10 +4564,9 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "make-dir": { @@ -4566,7 +4574,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "map-cache": { @@ -4585,7 +4593,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "marked": { @@ -4600,7 +4608,7 @@ "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.4" + "escape-string-regexp": "1.0.5" } }, "math-random": { @@ -4615,7 +4623,7 @@ "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", "dev": true, "requires": { - "md5-o-matic": "^0.1.1" + "md5-o-matic": "0.1.1" } }, "md5-o-matic": { @@ -4630,16 +4638,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" }, "dependencies": { "find-up": { @@ -4648,8 +4656,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "load-json-file": { @@ -4658,11 +4666,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "minimist": { @@ -4677,7 +4685,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "path-type": { @@ -4686,9 +4694,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pify": { @@ -4709,7 +4717,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "read-pkg": { @@ -4718,9 +4726,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -4729,8 +4737,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" } }, "strip-bom": { @@ -4739,7 +4747,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } } } @@ -4749,19 +4757,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "mime": { @@ -4780,7 +4788,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "mimic-fn": { @@ -4794,7 +4802,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -4808,8 +4816,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -4817,7 +4825,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -4839,10 +4847,10 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" } }, "mute-stream": { @@ -4863,18 +4871,18 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "natural-compare": { @@ -4894,10 +4902,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { @@ -4905,7 +4913,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "npm-run-path": { @@ -4914,7 +4922,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "npmlog": { @@ -4922,10 +4930,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -4939,33 +4947,33 @@ "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", "dev": true, "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.5.1", - "debug-log": "^1.0.1", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^2.1.0", - "foreground-child": "^1.5.3", - "glob": "^7.0.6", - "istanbul-lib-coverage": "^1.1.2", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^1.10.0", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.3", - "istanbul-reports": "^1.4.0", - "md5-hex": "^1.2.0", - "merge-source-map": "^1.1.0", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.1", - "spawn-wrap": "^1.4.2", - "test-exclude": "^4.2.0", + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.1", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.3", + "istanbul-lib-source-maps": "1.2.3", + "istanbul-reports": "1.4.0", + "md5-hex": "1.3.0", + "merge-source-map": "1.1.0", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "spawn-wrap": "1.4.2", + "test-exclude": "4.2.1", "yargs": "11.1.0", - "yargs-parser": "^8.0.0" + "yargs-parser": "8.1.0" }, "dependencies": { "align-text": { @@ -4973,9 +4981,9 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" } }, "amdefine": { @@ -4998,7 +5006,7 @@ "bundled": true, "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "1.0.0" } }, "archy": { @@ -5051,9 +5059,9 @@ "bundled": true, "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" } }, "babel-generator": { @@ -5061,14 +5069,14 @@ "bundled": true, "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" } }, "babel-messages": { @@ -5076,7 +5084,7 @@ "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-runtime": { @@ -5084,8 +5092,8 @@ "bundled": true, "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "core-js": "2.5.6", + "regenerator-runtime": "0.11.1" } }, "babel-template": { @@ -5093,11 +5101,11 @@ "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" } }, "babel-traverse": { @@ -5105,15 +5113,15 @@ "bundled": true, "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { @@ -5121,10 +5129,10 @@ "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -5142,13 +5150,13 @@ "bundled": true, "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -5156,7 +5164,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -5164,7 +5172,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -5172,7 +5180,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -5180,9 +5188,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -5202,7 +5210,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -5211,16 +5219,16 @@ "bundled": true, "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -5228,7 +5236,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -5243,15 +5251,15 @@ "bundled": true, "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" }, "dependencies": { "isobject": { @@ -5266,9 +5274,9 @@ "bundled": true, "dev": true, "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" } }, "camelcase": { @@ -5283,8 +5291,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chalk": { @@ -5292,11 +5300,11 @@ "bundled": true, "dev": true, "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" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "class-utils": { @@ -5304,10 +5312,10 @@ "bundled": true, "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -5315,7 +5323,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "isobject": { @@ -5331,8 +5339,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" }, "dependencies": { @@ -5354,8 +5362,8 @@ "bundled": true, "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "commondir": { @@ -5393,8 +5401,8 @@ "bundled": true, "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "which": "1.3.0" } }, "debug": { @@ -5425,7 +5433,7 @@ "bundled": true, "dev": true, "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "2.0.0" } }, "define-property": { @@ -5433,8 +5441,8 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -5442,7 +5450,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -5450,7 +5458,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -5458,9 +5466,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -5480,7 +5488,7 @@ "bundled": true, "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "error-ex": { @@ -5488,7 +5496,7 @@ "bundled": true, "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "escape-string-regexp": { @@ -5506,13 +5514,13 @@ "bundled": true, "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" }, "dependencies": { "cross-spawn": { @@ -5520,9 +5528,9 @@ "bundled": true, "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.0" } } } @@ -5532,13 +5540,13 @@ "bundled": true, "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -5546,7 +5554,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -5554,7 +5562,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -5564,8 +5572,8 @@ "bundled": true, "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -5573,7 +5581,7 @@ "bundled": true, "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -5583,14 +5591,14 @@ "bundled": true, "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -5598,7 +5606,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -5606,7 +5614,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -5614,7 +5622,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -5622,7 +5630,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -5630,9 +5638,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -5647,10 +5655,10 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -5658,7 +5666,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -5668,9 +5676,9 @@ "bundled": true, "dev": true, "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" } }, "find-up": { @@ -5678,7 +5686,7 @@ "bundled": true, "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "for-in": { @@ -5691,8 +5699,8 @@ "bundled": true, "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" } }, "fragment-cache": { @@ -5700,7 +5708,7 @@ "bundled": true, "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fs.realpath": { @@ -5728,12 +5736,12 @@ "bundled": true, "dev": true, "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "globals": { @@ -5751,10 +5759,10 @@ "bundled": true, "dev": true, "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" }, "dependencies": { "source-map": { @@ -5762,7 +5770,7 @@ "bundled": true, "dev": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -5772,7 +5780,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-flag": { @@ -5785,9 +5793,9 @@ "bundled": true, "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -5802,8 +5810,8 @@ "bundled": true, "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "is-number": { @@ -5811,7 +5819,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -5819,7 +5827,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5829,7 +5837,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5849,8 +5857,8 @@ "bundled": true, "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -5863,7 +5871,7 @@ "bundled": true, "dev": true, "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "invert-kv": { @@ -5876,7 +5884,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-arrayish": { @@ -5894,7 +5902,7 @@ "bundled": true, "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-data-descriptor": { @@ -5902,7 +5910,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-descriptor": { @@ -5910,9 +5918,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -5932,7 +5940,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { @@ -5945,7 +5953,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-odd": { @@ -5953,7 +5961,7 @@ "bundled": true, "dev": true, "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -5968,7 +5976,7 @@ "bundled": true, "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -6018,7 +6026,7 @@ "bundled": true, "dev": true, "requires": { - "append-transform": "^0.4.0" + "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { @@ -6026,13 +6034,13 @@ "bundled": true, "dev": true, "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" } }, "istanbul-lib-report": { @@ -6040,10 +6048,10 @@ "bundled": true, "dev": true, "requires": { - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" }, "dependencies": { "supports-color": { @@ -6051,7 +6059,7 @@ "bundled": true, "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -6061,11 +6069,11 @@ "bundled": true, "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" }, "dependencies": { "debug": { @@ -6083,7 +6091,7 @@ "bundled": true, "dev": true, "requires": { - "handlebars": "^4.0.3" + "handlebars": "4.0.11" } }, "js-tokens": { @@ -6101,7 +6109,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -6115,7 +6123,7 @@ "bundled": true, "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "load-json-file": { @@ -6123,11 +6131,11 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "locate-path": { @@ -6135,8 +6143,8 @@ "bundled": true, "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" }, "dependencies": { "path-exists": { @@ -6161,7 +6169,7 @@ "bundled": true, "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "lru-cache": { @@ -6169,8 +6177,8 @@ "bundled": true, "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "map-cache": { @@ -6183,7 +6191,7 @@ "bundled": true, "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "md5-hex": { @@ -6191,7 +6199,7 @@ "bundled": true, "dev": true, "requires": { - "md5-o-matic": "^0.1.1" + "md5-o-matic": "0.1.1" } }, "md5-o-matic": { @@ -6204,7 +6212,7 @@ "bundled": true, "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "merge-source-map": { @@ -6212,7 +6220,7 @@ "bundled": true, "dev": true, "requires": { - "source-map": "^0.6.1" + "source-map": "0.6.1" }, "dependencies": { "source-map": { @@ -6227,19 +6235,19 @@ "bundled": true, "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "kind-of": { @@ -6259,7 +6267,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -6272,8 +6280,8 @@ "bundled": true, "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -6281,7 +6289,7 @@ "bundled": true, "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -6304,18 +6312,18 @@ "bundled": true, "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "arr-diff": { @@ -6340,10 +6348,10 @@ "bundled": true, "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "npm-run-path": { @@ -6351,7 +6359,7 @@ "bundled": true, "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "number-is-nan": { @@ -6369,9 +6377,9 @@ "bundled": true, "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -6379,7 +6387,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -6389,7 +6397,7 @@ "bundled": true, "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -6404,7 +6412,7 @@ "bundled": true, "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -6419,7 +6427,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "optimist": { @@ -6427,8 +6435,8 @@ "bundled": true, "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.8", + "wordwrap": "0.0.3" } }, "os-homedir": { @@ -6441,9 +6449,9 @@ "bundled": true, "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "p-finally": { @@ -6456,7 +6464,7 @@ "bundled": true, "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -6464,7 +6472,7 @@ "bundled": true, "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" } }, "p-try": { @@ -6477,7 +6485,7 @@ "bundled": true, "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.1" } }, "pascalcase": { @@ -6490,7 +6498,7 @@ "bundled": true, "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "path-is-absolute": { @@ -6513,9 +6521,9 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pify": { @@ -6533,7 +6541,7 @@ "bundled": true, "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -6541,7 +6549,7 @@ "bundled": true, "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" }, "dependencies": { "find-up": { @@ -6549,8 +6557,8 @@ "bundled": true, "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } } } @@ -6570,9 +6578,9 @@ "bundled": true, "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -6580,8 +6588,8 @@ "bundled": true, "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { "find-up": { @@ -6589,8 +6597,8 @@ "bundled": true, "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } } } @@ -6605,8 +6613,8 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "repeat-element": { @@ -6624,7 +6632,7 @@ "bundled": true, "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" } }, "require-directory": { @@ -6658,7 +6666,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, "rimraf": { @@ -6666,7 +6674,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-regex": { @@ -6674,7 +6682,7 @@ "bundled": true, "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "semver": { @@ -6692,10 +6700,10 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -6703,7 +6711,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -6713,7 +6721,7 @@ "bundled": true, "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -6736,14 +6744,14 @@ "bundled": true, "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" }, "dependencies": { "define-property": { @@ -6751,7 +6759,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -6759,7 +6767,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -6769,9 +6777,9 @@ "bundled": true, "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -6779,7 +6787,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -6787,7 +6795,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -6795,7 +6803,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -6803,9 +6811,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -6825,7 +6833,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" } }, "source-map": { @@ -6838,11 +6846,11 @@ "bundled": true, "dev": true, "requires": { - "atob": "^2.0.0", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-url": { @@ -6855,12 +6863,12 @@ "bundled": true, "dev": true, "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "which": "1.3.0" } }, "spdx-correct": { @@ -6868,8 +6876,8 @@ "bundled": true, "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -6882,8 +6890,8 @@ "bundled": true, "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -6896,7 +6904,7 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "static-extend": { @@ -6904,8 +6912,8 @@ "bundled": true, "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -6913,7 +6921,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -6923,8 +6931,8 @@ "bundled": true, "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -6937,7 +6945,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -6947,7 +6955,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -6955,7 +6963,7 @@ "bundled": true, "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, "strip-eof": { @@ -6973,11 +6981,11 @@ "bundled": true, "dev": true, "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" }, "dependencies": { "arr-diff": { @@ -6995,16 +7003,16 @@ "bundled": true, "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -7012,7 +7020,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7022,13 +7030,13 @@ "bundled": true, "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -7036,7 +7044,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -7044,7 +7052,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -7052,7 +7060,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -7060,7 +7068,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -7070,7 +7078,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -7078,7 +7086,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -7088,9 +7096,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" } }, "kind-of": { @@ -7105,14 +7113,14 @@ "bundled": true, "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -7120,7 +7128,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -7128,7 +7136,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7138,10 +7146,10 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -7149,7 +7157,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7159,7 +7167,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -7167,7 +7175,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -7175,9 +7183,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "is-number": { @@ -7185,7 +7193,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -7193,7 +7201,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -7213,19 +7221,19 @@ "bundled": true, "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } } } @@ -7240,7 +7248,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "to-regex": { @@ -7248,10 +7256,10 @@ "bundled": true, "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -7259,8 +7267,8 @@ "bundled": true, "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" }, "dependencies": { "is-number": { @@ -7268,7 +7276,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } } } @@ -7284,9 +7292,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "yargs": { @@ -7295,9 +7303,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -7314,10 +7322,10 @@ "bundled": true, "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -7325,7 +7333,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -7333,10 +7341,10 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -7346,8 +7354,8 @@ "bundled": true, "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -7355,9 +7363,9 @@ "bundled": true, "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -7392,7 +7400,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" }, "dependencies": { "kind-of": { @@ -7407,8 +7415,8 @@ "bundled": true, "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "which": { @@ -7416,7 +7424,7 @@ "bundled": true, "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -7440,8 +7448,8 @@ "bundled": true, "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -7449,7 +7457,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -7457,9 +7465,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -7474,9 +7482,9 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" } }, "y18n": { @@ -7494,18 +7502,18 @@ "bundled": true, "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.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", - "yargs-parser": "^9.0.2" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" }, "dependencies": { "ansi-regex": { @@ -7523,9 +7531,9 @@ "bundled": true, "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" } }, "strip-ansi": { @@ -7533,7 +7541,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "yargs-parser": { @@ -7541,7 +7549,7 @@ "bundled": true, "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -7551,7 +7559,7 @@ "bundled": true, "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": { @@ -7578,9 +7586,9 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -7588,7 +7596,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "kind-of": { @@ -7596,7 +7604,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -7606,7 +7614,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.omit": { @@ -7615,8 +7623,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "object.pick": { @@ -7624,7 +7632,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "observable-to-promise": { @@ -7633,8 +7641,8 @@ "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=", "dev": true, "requires": { - "is-observable": "^0.2.0", - "symbol-observable": "^1.0.4" + "is-observable": "0.2.0", + "symbol-observable": "1.2.0" }, "dependencies": { "is-observable": { @@ -7643,7 +7651,7 @@ "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", "dev": true, "requires": { - "symbol-observable": "^0.2.2" + "symbol-observable": "0.2.4" }, "dependencies": { "symbol-observable": { @@ -7661,7 +7669,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "onetime": { @@ -7670,7 +7678,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "opn": { @@ -7679,8 +7687,8 @@ "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", "dev": true, "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" }, "dependencies": { "pinkie": { @@ -7695,7 +7703,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } } } @@ -7706,11 +7714,11 @@ "integrity": "sha1-+BmubK4LQRvQFJuFYP5siK2tIPg=", "dev": true, "requires": { - "file-type": "^3.6.0", - "get-stdin": "^5.0.1", - "meow": "^3.7.0", - "opn": "^4.0.0", - "temp-write": "^2.1.0" + "file-type": "3.9.0", + "get-stdin": "5.0.1", + "meow": "3.7.0", + "opn": "4.0.2", + "temp-write": "2.1.0" }, "dependencies": { "get-stdin": { @@ -7733,12 +7741,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" } }, "os-homedir": { @@ -7750,8 +7758,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { "version": "1.0.0", @@ -7765,7 +7772,7 @@ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -7774,7 +7781,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" } }, "p-try": { @@ -7789,10 +7796,10 @@ "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "lodash.flattendeep": "^4.4.0", - "md5-hex": "^2.0.0", - "release-zalgo": "^1.0.0" + "graceful-fs": "4.1.11", + "lodash.flattendeep": "4.4.0", + "md5-hex": "2.0.0", + "release-zalgo": "1.0.0" } }, "package-json": { @@ -7801,10 +7808,10 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" } }, "parse-glob": { @@ -7813,10 +7820,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "parse-json": { @@ -7825,7 +7832,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.1" } }, "parse-ms": { @@ -7867,7 +7874,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "pathval": { @@ -7898,7 +7905,7 @@ "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", "dev": true, "requires": { - "pinkie": "^1.0.0" + "pinkie": "1.0.0" } }, "pkg-conf": { @@ -7907,8 +7914,8 @@ "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", "dev": true, "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" + "find-up": "2.1.0", + "load-json-file": "4.0.0" }, "dependencies": { "load-json-file": { @@ -7917,10 +7924,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" } }, "parse-json": { @@ -7929,8 +7936,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" } } } @@ -7941,7 +7948,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "2.1.0" } }, "plur": { @@ -7950,7 +7957,7 @@ "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", "dev": true, "requires": { - "irregular-plurals": "^1.0.0" + "irregular-plurals": "1.4.0" } }, "pluralize": { @@ -7998,7 +8005,7 @@ "integrity": "sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q==", "dev": true, "requires": { - "parse-ms": "^1.0.0" + "parse-ms": "1.0.1" }, "dependencies": { "parse-ms": { @@ -8029,8 +8036,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "punycode": { "version": "1.4.1", @@ -8053,9 +8059,9 @@ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { "is-number": { @@ -8072,10 +8078,10 @@ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -8092,9 +8098,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" }, "dependencies": { "path-type": { @@ -8103,7 +8109,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" } }, "pify": { @@ -8120,8 +8126,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "readable-stream": { @@ -8129,13 +8135,13 @@ "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" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "readdir-enhanced": { @@ -8144,9 +8150,9 @@ "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=", "dev": true, "requires": { - "call-me-maybe": "^1.0.1", - "es6-promise": "^4.1.0", - "glob-to-regexp": "^0.3.0" + "call-me-maybe": "1.0.1", + "es6-promise": "4.2.4", + "glob-to-regexp": "0.3.0" } }, "readdirp": { @@ -8155,10 +8161,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" } }, "recursive-readdir": { @@ -8176,8 +8182,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "indent-string": "2.1.0", + "strip-indent": "1.0.1" }, "dependencies": { "indent-string": { @@ -8186,7 +8192,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } } } @@ -8209,7 +8215,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regex-not": { @@ -8217,8 +8223,8 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexpp": { @@ -8233,9 +8239,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "registry-auth-token": { @@ -8244,8 +8250,8 @@ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "1.2.8", + "safe-buffer": "5.1.2" } }, "registry-url": { @@ -8254,7 +8260,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "^1.0.1" + "rc": "1.2.8" } }, "regjsgen": { @@ -8269,7 +8275,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" } }, "release-zalgo": { @@ -8278,7 +8284,7 @@ "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { - "es6-error": "^4.0.1" + "es6-error": "4.1.1" } }, "remove-trailing-separator": { @@ -8302,7 +8308,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" } }, "replacestream": { @@ -8310,9 +8316,9 @@ "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", "requires": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1", + "readable-stream": "2.3.6" } }, "request": { @@ -8320,26 +8326,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" } }, "require-precompiled": { @@ -8354,8 +8360,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" }, "dependencies": { "resolve-from": { @@ -8372,7 +8378,7 @@ "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", "dev": true, "requires": { - "underscore": "~1.6.0" + "underscore": "1.6.0" }, "dependencies": { "underscore": { @@ -8389,7 +8395,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "3.0.0" } }, "resolve-from": { @@ -8409,8 +8415,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, "ret": { @@ -8424,7 +8430,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "run-async": { @@ -8433,7 +8439,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "^2.1.0" + "is-promise": "2.1.0" } }, "rx-lite": { @@ -8448,7 +8454,7 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "*" + "rx-lite": "4.0.8" } }, "safe-buffer": { @@ -8461,7 +8467,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -8486,7 +8492,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "^5.0.3" + "semver": "5.5.0" } }, "serialize-error": { @@ -8511,10 +8517,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -8522,7 +8528,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -8531,16 +8537,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "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=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "sift": { "version": "5.1.0", @@ -8564,7 +8568,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0" + "is-fullwidth-code-point": "2.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -8586,14 +8590,14 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" }, "dependencies": { "define-property": { @@ -8601,7 +8605,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -8609,7 +8613,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -8619,9 +8623,9 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -8629,7 +8633,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -8637,7 +8641,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -8645,7 +8649,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -8653,9 +8657,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -8665,7 +8669,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -8673,7 +8677,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -8684,7 +8688,7 @@ "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dev": true, "requires": { - "is-plain-obj": "^1.0.0" + "is-plain-obj": "1.1.0" } }, "source-map": { @@ -8697,11 +8701,11 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-support": { @@ -8710,8 +8714,8 @@ "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "buffer-from": "1.1.0", + "source-map": "0.6.1" }, "dependencies": { "source-map": { @@ -8733,8 +8737,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -8749,8 +8753,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -8764,7 +8768,7 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "sprintf-js": { @@ -8778,15 +8782,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "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" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "stack-utils": { @@ -8800,8 +8804,8 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -8809,7 +8813,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -8819,9 +8823,9 @@ "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" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -8829,7 +8833,7 @@ "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" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -8837,7 +8841,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -8852,7 +8856,7 @@ "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", "dev": true, "requires": { - "is-utf8": "^0.2.1" + "is-utf8": "0.2.1" } }, "strip-eof": { @@ -8867,7 +8871,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "get-stdin": "4.0.1" } }, "strip-json-comments": { @@ -8882,11 +8886,11 @@ "integrity": "sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA==", "dev": true, "requires": { - "arrify": "^1.0.1", - "indent-string": "^3.2.0", - "js-yaml": "^3.10.0", - "serialize-error": "^2.1.0", - "strip-ansi": "^4.0.0" + "arrify": "1.0.1", + "indent-string": "3.2.0", + "js-yaml": "3.12.0", + "serialize-error": "2.1.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -8901,7 +8905,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -8912,7 +8916,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" }, "dependencies": { "has-flag": { @@ -8935,12 +8939,12 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.4.1", + "lodash": "4.17.10", "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "string-width": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -8961,8 +8965,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -8971,7 +8975,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -8988,10 +8992,10 @@ "integrity": "sha1-K40TofnKUcGzraDGzNsRd9IGW7A=", "dev": true, "requires": { - "chalk": "^1.1.3", - "duplexer2": "^0.1.4", - "supports-color": "^3.1.2", - "tap-parser": "^3.0.3" + "chalk": "1.1.3", + "duplexer2": "0.1.4", + "supports-color": "3.2.3", + "tap-parser": "3.0.5" }, "dependencies": { "ansi-styles": { @@ -9006,11 +9010,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "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" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" }, "dependencies": { "supports-color": { @@ -9033,7 +9037,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -9044,9 +9048,9 @@ "integrity": "sha1-uUf2ngs+U9S5IBH2zFUuFtrcfsk=", "dev": true, "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "readable-stream": "^2" + "events-to-array": "1.1.2", + "js-yaml": "3.12.0", + "readable-stream": "2.3.6" } }, "tar-stream": { @@ -9054,13 +9058,13 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.1.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.0", - "xtend": "^4.0.0" + "bl": "1.2.2", + "buffer-alloc": "1.2.0", + "end-of-stream": "1.4.1", + "fs-constants": "1.0.0", + "readable-stream": "2.3.6", + "to-buffer": "1.1.1", + "xtend": "4.0.1" } }, "temp-write": { @@ -9069,12 +9073,12 @@ "integrity": "sha1-WYkJGODvCdVIqqNC9L00CdhATpY=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "os-tmpdir": "^1.0.0", - "pify": "^2.2.0", - "pinkie-promise": "^2.0.0", - "uuid": "^2.0.1" + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "os-tmpdir": "1.0.2", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "uuid": "2.0.3" }, "dependencies": { "mkdirp": { @@ -9104,7 +9108,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "uuid": { @@ -9121,7 +9125,7 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "^0.7.0" + "execa": "0.7.0" } }, "text-table": { @@ -9142,8 +9146,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" } }, "time-zone": { @@ -9159,12 +9163,11 @@ "dev": true }, "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", "requires": { - "os-tmpdir": "~1.0.2" + "os-tmpdir": "1.0.2" } }, "to-buffer": { @@ -9183,7 +9186,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -9191,7 +9194,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -9201,10 +9204,10 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -9212,8 +9215,8 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "tough-cookie": { @@ -9221,7 +9224,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" } }, "trim-newlines": { @@ -9247,7 +9250,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -9262,7 +9265,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "1.1.2" } }, "type-detect": { @@ -9282,8 +9285,8 @@ "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" + "commander": "2.13.0", + "source-map": "0.6.1" }, "dependencies": { "commander": { @@ -9332,10 +9335,10 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -9343,7 +9346,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -9351,10 +9354,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -9365,7 +9368,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "1.0.0" } }, "unique-temp-dir": { @@ -9374,8 +9377,8 @@ "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", "dev": true, "requires": { - "mkdirp": "^0.5.1", - "os-tmpdir": "^1.0.1", + "mkdirp": "0.5.1", + "os-tmpdir": "1.0.2", "uid2": "0.0.3" }, "dependencies": { @@ -9395,8 +9398,8 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -9404,9 +9407,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -9438,16 +9441,16 @@ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" } }, "urix": { @@ -9461,7 +9464,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" } }, "use": { @@ -9469,7 +9472,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" } }, "util-deprecate": { @@ -9488,8 +9491,8 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "verror": { @@ -9497,9 +9500,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "well-known-symbols": { @@ -9512,9 +9515,8 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "wide-align": { @@ -9522,7 +9524,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "1.0.2" } }, "widest-line": { @@ -9531,7 +9533,7 @@ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "dev": true, "requires": { - "string-width": "^2.1.1" + "string-width": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -9552,8 +9554,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -9562,7 +9564,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -9590,7 +9592,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "^0.5.1" + "mkdirp": "0.5.1" }, "dependencies": { "mkdirp": { @@ -9610,9 +9612,9 @@ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, "write-json-file": { @@ -9621,12 +9623,12 @@ "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", "dev": true, "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" + "detect-indent": "5.0.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "pify": "3.0.0", + "sort-keys": "2.0.0", + "write-file-atomic": "2.3.0" }, "dependencies": { "detect-indent": { @@ -9643,8 +9645,8 @@ "integrity": "sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk=", "dev": true, "requires": { - "sort-keys": "^2.0.0", - "write-json-file": "^2.2.0" + "sort-keys": "2.0.0", + "write-json-file": "2.3.0" } }, "xdg-basedir": { @@ -9658,8 +9660,8 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "sax": "1.2.4", + "xmlbuilder": "9.0.7" } }, "xmlbuilder": { @@ -9681,18 +9683,17 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "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" + "archiver-utils": "1.3.0", + "compress-commons": "1.2.2", + "lodash": "4.17.10", + "readable-stream": "2.3.6" } } } diff --git a/package.json b/package.json index e6770ca0e..532fa9af3 100644 --- a/package.json +++ b/package.json @@ -101,15 +101,18 @@ "@ui5/fs": "^0.1.0", "@ui5/logger": "^0.1.0", "archiver": "^2.1.0", + "cross-spawn": "^5.1.0", "escope": "^3.6.0", "esprima": "^2.7.2", "estraverse": "^4.2.0", "globby": "^7.1.1", "graceful-fs": "^4.1.11", "less-openui5": "^0.5.3", + "jsdoc": "^3.5.5", "pretty-data": "^0.40.0", "pretty-hrtime": "^1.0.3", "replacestream": "^4.0.3", + "tmp": "0.0.31", "uglify-es": "^3.2.2", "xml2js": "^0.4.17" }, @@ -123,7 +126,6 @@ "docdash": "^0.4.0", "eslint": "^4.13.1", "eslint-config-google": "^0.9.1", - "jsdoc": "^3.5.5", "nyc": "^11.8.0", "opn-cli": "^3.1.0", "recursive-readdir": "^2.1.1",