From 78d0fc0bfe24fa1144c3f51cd472c57f1a0e71b8 Mon Sep 17 00:00:00 2001 From: Antranig Basman Date: Thu, 21 Dec 2017 07:41:34 +0000 Subject: [PATCH 01/19] FLUID-6234: Implemented Tarjan connected components, beginning improved commenting --- src/framework/core/js/DataBinding.js | 81 ++++++++- .../core/js/DataBindingTests.js | 168 ++++++++++++++++++ 2 files changed, 242 insertions(+), 7 deletions(-) diff --git a/src/framework/core/js/DataBinding.js b/src/framework/core/js/DataBinding.js index c6cbb2c810..70c4313296 100644 --- a/src/framework/core/js/DataBinding.js +++ b/src/framework/core/js/DataBinding.js @@ -275,6 +275,62 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; strategies: [fluid.model.defaultFetchStrategy, fluid.model.defaultCreatorStrategy] }; + /** CONNECTED COMPONENTS AND TOPOLOGICAL SORTING **/ + + // Following "tarjan" at https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + + /** Compute the strongly connected components of a graph, specified as a list of vertices and an accessor function. + * Returns an array of arrays of strongly connected vertices, with each component in topologically sorted order + * @param vertices {Array of Vertex} The vertices of the graph to be processed. Each vertex object will be polluted + * with three extra fields: tarjanIndex, lowIndex and onStack + * @param accessor {Function: Vertex -> Array of Vertex} + * @return Array of Array of Vertex + */ + fluid.stronglyConnected = function (vertices, accessor) { + var that = { + stack: [], + accessor: accessor, + components: [], + index: 0 + }; + vertices.forEach(function (vertex) { + if (vertex.tarjanIndex === undefined) { + fluid.stronglyConnectedOne(vertex, that); + } + }); + return that.components; + }; + + // Perform one round of the Tarjan search algorithm using the state structure generated in fluid.stronglyConnected + fluid.stronglyConnectedOne = function (vertex, that) { + vertex.tarjanIndex = that.index; + vertex.lowIndex = that.index; + ++that.index; + that.stack.push(vertex); + vertex.onStack = true; + var outEdges = that.accessor(vertex); + outEdges.forEach(function (outVertex) { + if (outVertex.tarjanIndex === undefined) { + // Successor has not yet been visited; recurse on it + fluid.stronglyConnectedOne(outVertex, that); + vertex.lowIndex = Math.min(vertex.lowIndex, outVertex.lowIndex); + } else if (outVertex.onStack) { + // Successor is on the stack and hence in the current component + vertex.lowIndex = Math.min(vertex.lowIndex, outVertex.tarjanIndex); + } + }); + // If vertex is a root node, pop the stack back as far as it and generate a component + if (vertex.lowIndex === vertex.tarjanIndex) { + var component = [], outVertex; + do { + outVertex = that.stack.pop(); + outVertex.onStack = false; + component.push(outVertex); + } while (outVertex !== vertex); + that.components.push(component); + } + }; + /** MODEL COMPONENT HIERARCHY AND RELAY SYSTEM **/ fluid.initRelayModel = function (that) { @@ -541,9 +597,19 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; // required within the "overall" transaction whilst genuine (external) changes continue to arrive. // TODO: Vast overcomplication and generation of closure garbage. SURELY we should be able to convert this into an externalised, arg-ist form + /** Registers a model relay listener connecting the source and target + * @param target {Component} The target component at the end of the relay. + * @param targetSegs {Array of String} The path in the target where outgoing changes are to be fired + * @param source {Component|Null} The source component from where changes will be listened to. May be null if the change source is a relay document. + * @param sourceSegs {Array of String} The path in the source component's model at which changes will be listened to + * @param linkId {String} The unique id of this relay arc. This will be used as a key within the active transaction record to look up dynamic information about + * activation of the link within that transaction (currently just an activation count) + * @param transducer {Function|Null} A function which will be invoked when a change is to be relayed. This is one of the adapters constructed in "makeTransformPackage" + * and is set when + */ fluid.registerDirectChangeRelay = function (target, targetSegs, source, sourceSegs, linkId, transducer, options, npOptions) { - var targetApplier = options.targetApplier || target.applier; // implies the target is a relay document - var sourceApplier = options.sourceApplier || source.applier; // implies the source is a relay document - listener will be transactional + var targetApplier = options.targetApplier || target.applier; // first branch implies the target is a relay document + var sourceApplier = options.sourceApplier || source.applier; // first branch implies the source is a relay document - listener will be transactional var applierId = targetApplier.applierId; targetSegs = fluid.makeArray(targetSegs); sourceSegs = sourceSegs ? fluid.makeArray(sourceSegs) : sourceSegs; // take copies since originals will be trashed @@ -571,7 +637,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; // the "forwardAdapter" transducer(existing.transaction, options.sourceApplier ? undefined : newValue, sourceSegs, targetSegs, changeRequest); } else { - if (!options.noRelayDeletesDirect && changeRequest && changeRequest.type === "DELETE") { + if (changeRequest && changeRequest.type === "DELETE") { existing.transaction.fireChangeRequest({type: "DELETE", segs: targetSegs}); } if (newValue !== undefined) { @@ -603,7 +669,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }; // When called during parsing a contextualised model relay document, these arguments are reversed - "source" refers to the - // current component, and "target" refers successively to the various "source" components. + // component holding the relay document, and "target" refers successively to the various "source" components referred to within + // the document - changes in any of these models will be listened to and relayed onto the document's applier (? surely backwards) // "options" will be transformPackage fluid.connectModelRelay = function (source, sourceSegs, target, targetSegs, options) { var linkId = fluid.allocateGuid(); @@ -710,6 +777,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; } fluid.model.guardedAdapter(transaction, forwardCond, that.forwardAdapterImpl, arguments); }; + that.forwardAdapter.cond = forwardCond; // Used when parsing graph in init transaction // fired from fluid.model.updateRelays via invalidator event that.runTransform = function (trans) { trans.commit(); // this will reach the special "half-transactional listener" registered in fluid.connectModelRelay, @@ -725,6 +793,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; that.backwardAdapter = function (transaction) { fluid.model.guardedAdapter(transaction, backwardCond, that.backwardAdapterImpl, arguments); }; + that.backwardAdapter.cond = backwardCond; } that.update = that.invalidator.fire; // necessary so that both routes to fluid.connectModelRelay from here hit the first branch var implicitOptions = { @@ -794,13 +863,11 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; var forwardCond = fluid.model.parseRelayCondition(mrrec.forward), backwardCond = fluid.model.parseRelayCondition(mrrec.backward); var transformPackage = fluid.makeTransformPackage(that, transform, parsedSource.path, parsedTarget.path, forwardCond, backwardCond, namespace, mrrec.priority); - var noRelayDeletes = {noRelayDeletesDirect : true}; // DELETE relay is handled in the transducer itself if (transformPackage.refCount === 0) { // There were no implicit relay elements found in the relay document - it can be relayed directly // This first call binds changes emitted from the relay ends to each other, synchronously fluid.connectModelRelay(parsedSource.that || that, parsedSource.modelSegs, parsedTarget.that, parsedTarget.modelSegs, // Primarily, here, we want to get rid of "update" which is what signals to connectModelRelay that this is a invalidatable relay - fluid.filterKeys(transformPackage, ["forwardAdapter", "backwardAdapter", "namespace", "priority"]) - , noRelayDeletes); + fluid.filterKeys(transformPackage, ["forwardAdapter", "backwardAdapter", "namespace", "priority"])); } else { if (parsedSource.modelSegs) { fluid.fail("Error in model relay definition: If a relay transform has a model dependency, you can not specify a \"source\" entry - please instead enter this as \"input\" in the transform specification. Definition was ", mrrec, " for component ", that); diff --git a/tests/framework-tests/core/js/DataBindingTests.js b/tests/framework-tests/core/js/DataBindingTests.js index 570e376129..7ac5c4a714 100644 --- a/tests/framework-tests/core/js/DataBindingTests.js +++ b/tests/framework-tests/core/js/DataBindingTests.js @@ -56,6 +56,120 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt } }); }; + + fluid.tarzanTests = [{ + v: 1, + e: [], + expected: [[0]] + }, { + v: 2, + e: [], + expected: [[0], [1]] + }, { + v: 2, + e: ["01"], + expected: [[1], [0]] + }, { + v: 2, + e: ["01", "10"], + expected: [[1, 0]] + }, { + v: 3, + e: [], + expected: [[0], [1], [2]] + }, { + v: 3, + e: ["01"], + expected: [[1], [0], [2]] + }, { + v: 3, + e: ["01", "10"], + expected: [[1, 0], [2]] + }, { + v: 3, + e: ["01", "02"], + expected: [[1], [2], [0]] + }, { + v: 3, + e: ["01", "10", "02"], + expected: [[2], [1, 0]] + }, { + v: 3, + e: ["01", "10", "20"], + expected: [[1, 0], [2]] + }, { + v: 3, + e: ["01", "10", "02", "20"], + expected: [[2, 1, 0]] + }, { + v: 3, + e: ["01", "12", "20"], + expected: [[2, 1, 0]] + }, { + v: 3, + e: ["01", "10", "12", "21", "20", "02"], + expected: [[2, 1, 0]] + }, { + v: 4, + e: ["01", "10", "12", "21", "20", "02"], + expected: [[2, 1, 0], [3]] + }, { + v: 4, + e: ["01", "10", "23", "32"], + expected: [[1, 0], [3, 2]] + }, { + v: 4, + e: ["01", "21", "13"], + expected: [[3], [1], [0], [2]] + }, { + v: 4, + e: ["01", "10", "12", "30"], + expected: [[2], [1, 0], [3]] + }, { + v: 4, + e: ["01", "12", "20", "30"], + expected: [[2, 1, 0], [3]] + }, { + v: 4, + e: ["01", "12", "20", "03"], + expected: [[3], [2, 1, 0]] + }, { + v: 4, + e: ["01", "12", "23", "30"], + expected: [[3, 2, 1, 0]] + }]; + + fluid.tests.testOneTarzan = function (test, index) { + var vertices = fluid.generate(test.v, function (i) { + return { + index: i + }; + }, true); + var outEdges = fluid.generate(test.v, function () { + return []; + }, true); + fluid.each(test.e, function (oneEdge) { + var start = +oneEdge.charAt(0), end = +oneEdge.charAt(1); + outEdges[start].push(vertices[end]); + }); + var accessor = function (vertex) { + return outEdges[vertex.index]; + }; + var components = fluid.stronglyConnected(vertices, accessor); + var flattened = fluid.transform(components, function (component) { + return fluid.transform(component, function (vertex) { + return vertex.index; + }); + }); + jqUnit.assertDeepEq("Strongly connected components for " + test.v + " vertices with edgelist " + + JSON.stringify(test.e) + " at index " + index + " should be " + + JSON.stringify(test.expected), test.expected, flattened); + }; + + jqUnit.test("Strongly Connected Components Algorithm", function () { + fluid.tarzanTests.forEach(fluid.tests.testOneTarzan); + }); + // Unpacks a string encoded in triples into an array of objects, where the first digit encodes whether // _primary is true or false, and the following two encode the values of properties "a" and "b" fluid.tests.generateRepeatableThing = function (gens) { @@ -576,6 +690,60 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt jqUnit.assertDeepEq("No change propagated outwards from destroyed component", {outerModel: "exterior thing 2"}, that.model); }); + /** FLUID-6234: Infer init transaction application order from relay specifications **/ + + fluid.defaults("fluid.tests.fluid6234head", { + gradeNames: "fluid.modelComponent", + model: { + loop: false + }, + invokers: { + // These definitions force children to be created during the same init transaction as parent + playChild: "{that}.child.play()", + playOtherChild: "{that}.otherChild.play()" + }, + components: { + child: { + type: "fluid.tests.fluid6234relayingChild" + }, + otherChild: { + type: "fluid.tests.fluid6234relayingChild" + } + } + }); + + fluid.defaults("fluid.tests.fluid6234relayingChild", { + gradeNames: "fluid.modelComponent", + model: { + loop: true + }, + invokers: { + play: "fluid.identity" + }, + modelRelay: { + source: "{fluid6234head}.model", + target: "{that}.model", + backward: { + excludeSource: "init" + }, + singleTransform: { + type: "fluid.transforms.identity" + } + } + }); + + jqUnit.test("FLUID-6234 init transaction application order", function () { + var that = fluid.tests.fluid6234head(); + var paths = ["model.loop", "child.model.loop", "otherChild.model.loop"]; + var expected = [false, false, false]; + var values = fluid.transform(paths, function (path) { + return fluid.get(that, path); + }); + jqUnit.assertDeepEq("Model skeleton has settled to expected values", expected, values); + }); + + /** FLUID-5024: Bidirectional transforming relay together with floating point slop **/ + fluid.defaults("fluid.tests.allChangeRecorder", { gradeNames: "fluid.tests.changeRecorder", modelListeners: { From 55e6f6aceec4eafcc692f4096c066e9434478702 Mon Sep 17 00:00:00 2001 From: Antranig Basman Date: Sat, 6 Jan 2018 11:40:32 +0000 Subject: [PATCH 02/19] FLUID-6234: Work on improved commenting --- src/framework/core/js/DataBinding.js | 95 +++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 16 deletions(-) diff --git a/src/framework/core/js/DataBinding.js b/src/framework/core/js/DataBinding.js index 70c4313296..c8f5f51a74 100644 --- a/src/framework/core/js/DataBinding.js +++ b/src/framework/core/js/DataBinding.js @@ -597,7 +597,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; // required within the "overall" transaction whilst genuine (external) changes continue to arrive. // TODO: Vast overcomplication and generation of closure garbage. SURELY we should be able to convert this into an externalised, arg-ist form - /** Registers a model relay listener connecting the source and target + /** Registers a listener operating one leg of a model relay relation, connecting the source and target. Called once or twice from `fluid.connectModelRelay` - + * see the comment there for the three cases involved. * @param target {Component} The target component at the end of the relay. * @param targetSegs {Array of String} The path in the target where outgoing changes are to be fired * @param source {Component|Null} The source component from where changes will be listened to. May be null if the change source is a relay document. @@ -605,7 +606,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * @param linkId {String} The unique id of this relay arc. This will be used as a key within the active transaction record to look up dynamic information about * activation of the link within that transaction (currently just an activation count) * @param transducer {Function|Null} A function which will be invoked when a change is to be relayed. This is one of the adapters constructed in "makeTransformPackage" - * and is set when + * and is set when + * @param options {Object} + * transactional {Boolean} `true` in case iii) - although this only represents `half-transactions`, `false` in others since these are resolved immediately with no granularity */ fluid.registerDirectChangeRelay = function (target, targetSegs, source, sourceSegs, linkId, transducer, options, npOptions) { var targetApplier = options.targetApplier || target.applier; // first branch implies the target is a relay document @@ -672,6 +675,37 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; // component holding the relay document, and "target" refers successively to the various "source" components referred to within // the document - changes in any of these models will be listened to and relayed onto the document's applier (? surely backwards) // "options" will be transformPackage + /** Connect a model relay relation between model material. This is called in three scenarios: + * i) from `fluid.parseModelRelay` when parsing an uncontextualised model relay (one with a static transform document), to + * directly connect the source and target of the relay + * ii) from `fluid.parseModelRelay` when parsing a contextualised model relay (one whose transform document depends on other model + * material), to connect updates emitted from the transform document's applier onto the relay ends (both source and target) + * iii) from `fluid.parseImplicitRelay` when parsing model references found within contextualised model relay to bind changes emitted + * from the target of the reference onto the transform document's applier. These may apply directly to another component's model (in its case + * A) or apply to a relay document (in its case B) + * + * This function will make one or two calls to `fluid.registerDirectChangeRelay` in order to set up each leg of any required relay. + * Note that in case iii)B) the component referred to in `target` is actually the "source" of the changes, and so the call to + * `fluid.registerDirectChangeRelay` will have `source` and `target` reversed + * @param source {Component} The component holding the material giving rise to the relay, or the one referred to by the `source` member + * of the configuration in case ii), if there is one + * @param sourceSegs {Array of String|Null} The parsed segments of the `source` relay reference in case i), or the offset into the transform + * document of the reference component in case iii), otherwise `null` + * @param target {Component} The component holding the model relay `target` in cases i) and ii), or the component at the other end of + * the model reference in case iii) (in this case in fact a "source" for the changes. + * @param targetSegs {Array of String} The parsed segments of the `target` reference in cases i) and ii), or of the model reference in + * case iii) + * @param options {Object} A structure describing the relay, allowing discrimination of the various cases above. This is derived from the return + * `fluid.makeTransformPackage` but will have some members filtered in different cases. This contains members: + * update {Function} A function to be called at the end of a "half-transaction" when all pending updates have been applied to the document's applier. + * This discriminates case iii) + * targetApplier {ChangeApplier} The ChangeApplier for the relay document, in case iii)B) + * forwardApplier (ChangeApplier} The ChangeApplier for the relay document, in cases ii) and iii)B) (only used in latter case) + * forwardAdapter {Adapter} A function accepting (transaction, newValue) to pass through the forward leg of the relay. Contains a member `cond` holding the parsed relay condition. + * backwardAdapter {Adapter} A function accepting (transaction, newValue) to pass through the backward leg of the relay. Contains a member `cond` holding the parsed relay condition. + * namespace {String} Namespace for any relay definition + * priority {String} Priority for any relay definition or synthetic "first" for iii)A) + */ fluid.connectModelRelay = function (source, sourceSegs, target, targetSegs, options) { var linkId = fluid.allocateGuid(); function enlistComponent(component) { @@ -685,24 +719,24 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; } } enlistComponent(target); - enlistComponent(source); // role of "source" and "target" may have been swapped in a modelRelay document + enlistComponent(source); // role of "source" and "target" are swapped in case iii)B) var npOptions = fluid.filterKeys(options, ["namespace", "priority"]); - if (options.update) { // it is a call via parseImplicitRelay for a relay document - if (options.targetApplier) { - // register changes from the model onto changes to the model relay document + if (options.update) { // it is a call for a relay document - ii) or iii)B) + if (options.targetApplier) { // case iii)B) + // We are in the middle of parsing a contextualised relay, and this call has arrived via its parseImplicitRelay. + // register changes from the target model onto changes to the model relay document fluid.registerDirectChangeRelay(source, sourceSegs, target, targetSegs, linkId, null, { transactional: false, targetApplier: options.targetApplier, update: options.update }, npOptions); - } else { - // We are in the middle of parsing a contextualised relay, and this call has arrived via its parseImplicitRelay. + } else { // case ii), contextualised relay overall output // Rather than bind source-source, instead register the "half-transactional" listener which binds changes - // from the relay itself onto the target + // from the relay document itself onto the target fluid.registerDirectChangeRelay(target, targetSegs, source, [], linkId + "-transform", options.forwardAdapter, {transactional: true, sourceApplier: options.forwardApplier}, npOptions); } - } else { // more efficient branch where relay is uncontextualised + } else { // case i) or iii)A): more efficient, old-fashioned branch where relay is uncontextualised fluid.registerDirectChangeRelay(target, targetSegs, source, sourceSegs, linkId, options.forwardAdapter, {transactional: false}, npOptions); if (sourceSegs) { fluid.registerDirectChangeRelay(source, sourceSegs, target, targetSegs, linkId, options.backwardAdapter, {transactional: false}, npOptions); @@ -789,6 +823,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; that.forwardApplier.isRelayApplier = true; // special annotation so these can be discovered in the transaction record that.invalidator = fluid.makeEventFirer({name: "Invalidator for model relay with applier " + that.forwardApplier.applierId}); if (sourcePath !== null) { + // TODO: backwardApplier is unused that.backwardApplier = fluid.makeHolderChangeApplier(that.backwardHolder); that.backwardAdapter = function (transaction) { fluid.model.guardedAdapter(transaction, backwardCond, that.backwardAdapterImpl, arguments); @@ -850,6 +885,13 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; return fluid.parseSourceExclusionSpec({}, exclusionRec); }; + /** Parse a single model relay record as appearing nested within the `modelRelay` block in a model component's + * options. By various calls to `fluid.connectModelRelay` this will set up the structure operating the live + * relay during the component#s lifetime. + * @param that {Component} The component holding the record, currently instantiating + * @param mrrec {Object} The model relay record. This must contain either a member `singleTransform` or `transform` and may also contain + * members `namespace`, `path`, `priority`, `forward` and `backward` + */ fluid.parseModelRelay = function (that, mrrec, key) { var parsedSource = mrrec.source !== undefined ? fluid.parseValidModelReference(that, "modelRelay record member \"source\"", mrrec.source) : {path: null, modelSegs: null}; @@ -864,7 +906,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; var transformPackage = fluid.makeTransformPackage(that, transform, parsedSource.path, parsedTarget.path, forwardCond, backwardCond, namespace, mrrec.priority); if (transformPackage.refCount === 0) { // There were no implicit relay elements found in the relay document - it can be relayed directly - // This first call binds changes emitted from the relay ends to each other, synchronously + // Case i): Bind changes emitted from the relay ends to each other, synchronously fluid.connectModelRelay(parsedSource.that || that, parsedSource.modelSegs, parsedTarget.that, parsedTarget.modelSegs, // Primarily, here, we want to get rid of "update" which is what signals to connectModelRelay that this is a invalidatable relay fluid.filterKeys(transformPackage, ["forwardAdapter", "backwardAdapter", "namespace", "priority"])); @@ -872,11 +914,32 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; if (parsedSource.modelSegs) { fluid.fail("Error in model relay definition: If a relay transform has a model dependency, you can not specify a \"source\" entry - please instead enter this as \"input\" in the transform specification. Definition was ", mrrec, " for component ", that); } - // This second call binds changes emitted from the relay document itself onto the relay ends (using the "half-transactional system") - fluid.connectModelRelay(parsedSource.that || that, parsedSource.modelSegs, parsedTarget.that, parsedTarget.modelSegs, transformPackage); - } - }; - + // Case ii): Binds changes emitted from the relay document itself onto the relay ends (using the "half-transactional system") + fluid.connectModelRelay(that, null, parsedTarget.that, parsedTarget.modelSegs, transformPackage); + } + }; + + /** Traverses a model document written within a component's options, parsing any IoC references looking for + * i) references to general material, which will be fetched and interpolated now, and ii) "implicit relay" references to the + * model areas of other components, which will be used to set up live synchronisation between the area in this component where + * they appear and their target, as well as setting up initial synchronisation to compute the initial contents. + * This is called in two situations: A) parsing the `model` configuration option for a model component, and B) parsing the + * `transform` member (perhaps derived from `singleTransform`) of a `modelRelay` block for a model component. It calls itself + * recursively as it progresses through the model document material with updated `segs` + * @param that {Component} The component holding the model document + * @param modelRec {Any} The model document specification to be parsed + * @param segs {Array of String} The array of path segments from the root of the entire model document to the point of current parsing + * @param options {Object} Configuration options (mutable) governing this parse. This is primarily used to hand as the 5th argument to + * `fluid.connectModelRelay` for any model references found, and contains members + * refCount {Integer} An count incremented for every call to `fluid.connectModelRelay` setting up a synchronizing relay for every + * reference to model material encountered + * priority {String} The unparsed priority member attached to this record, or `first` for a parse of `model` (case A) + * namespace {String} [optional] A namespace attached to this transform, if we are parsing a transform + * targetApplier {ChangeApplier} [optional] The ChangeApplier for this transform document, if it is a transform, empty otherwise + * update {Function} [optional] A function to be called on conclusion of a "half-transaction" where all currently pending updates have been applied + * to this transform document. This function will update/regenerate the relay transform functions used to relay changes between the transform + * ends based on the updated document. + */ fluid.parseImplicitRelay = function (that, modelRec, segs, options) { var value; if (fluid.isIoCReference(modelRec)) { From b0d03dd00bab27d03801bbd0e68ccc3f5fe5f121 Mon Sep 17 00:00:00 2001 From: Antranig Basman Date: Tue, 9 Jan 2018 19:54:46 +0000 Subject: [PATCH 03/19] FLUID-6234: Working implementation with topological sort applied to init transaction --- src/framework/core/js/DataBinding.js | 194 ++++++++++++++++++++------- 1 file changed, 143 insertions(+), 51 deletions(-) diff --git a/src/framework/core/js/DataBinding.js b/src/framework/core/js/DataBinding.js index c8f5f51a74..b034705072 100644 --- a/src/framework/core/js/DataBinding.js +++ b/src/framework/core/js/DataBinding.js @@ -282,7 +282,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** Compute the strongly connected components of a graph, specified as a list of vertices and an accessor function. * Returns an array of arrays of strongly connected vertices, with each component in topologically sorted order * @param vertices {Array of Vertex} The vertices of the graph to be processed. Each vertex object will be polluted - * with three extra fields: tarjanIndex, lowIndex and onStack + * with three extra fields: `tarjanIndex`, `lowIndex` and `onStack` * @param accessor {Function: Vertex -> Array of Vertex} * @return Array of Array of Vertex */ @@ -385,11 +385,47 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }); }; + /** Compute relay dependency out arcs for a group of initialising components. + * @param transacs {Object} Hash of component id to local ChangeApplier transaction + * @param mrec {Object} Hash of component id to enlisted component record + * @return Object Hash of component id to list of enlisted component record + */ + fluid.computeInitialOutArcs = function (transacs, mrec) { + return fluid.transform(mrec, function (recel, id) { + var oneOutArcs = {}; + var listeners = recel.that.applier.listeners.sortedListeners; + fluid.each(listeners, function (listener) { + console.log("oIT got listener ", listener); + if (listener.isRelay && !fluid.isExcludedChangeSource(transacs[id], listener.cond)) { + var targetId = listener.targetId; + if (targetId !== id) { + oneOutArcs[targetId] = true; + } + console.log("Unexcluded arc to ", targetId, " with record ", mrec[targetId]); + } + }); + var oneOutArcList = Object.keys(oneOutArcs); + var togo = oneOutArcList.map(function (id) { + return mrec[id]; + }); + // No edge if the component is not enlisted - it will sort to the end via "completeOnInit" + fluid.remove_if(togo, function (rec) { + return rec === undefined; + }); + return togo; + }); + }; + fluid.sortCompleteLast = function (reca, recb) { return (reca.completeOnInit ? 1 : 0) - (recb.completeOnInit ? 1 : 0); }; - // Operate all coordinated transactions by bringing models to their respective initial values, and then commit them all + + /** Operate all coordinated transactions by bringing models to their respective initial values, and then commit them all + * @param that {Component} A representative component of the collection for which the initial transaction is to be operated + * @param mrec {Object} The global model transaction record for the init transaction. This is a hash indexed by component id + * to a model transaction record, as registered in `fluid.enlistModelComponent`. This has members `that`, `applier`, `complete`. + */ fluid.operateInitialTransaction = function (that, mrec) { var transId = fluid.allocateGuid(); var transRec = fluid.getModelTransactionRec(that, transId); @@ -401,8 +437,29 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }); // TODO: This sort has very little effect in any current test (can be replaced by no-op - see FLUID-5339) - but // at least can't be performed in reverse order ("FLUID-3674 event coordination test" will fail) - need more cases - var recs = fluid.values(mrec).sort(fluid.sortCompleteLast); - fluid.each(recs, function (recel) { + + // Compute the graph of init transaction relays for FLUID-6234 - one day we will have to do better than this, since there + // may be finer structure than per-component - it may be that each piece of model area participates in this relation + // differently. But this will require even more ambitious work such as fragmenting all the initial model values along + // these boundaries. + var outArcs = fluid.computeInitialOutArcs(transacs, mrec); + console.log("Got outArcs of ", outArcs); + var arcAccessor = function (mrec) { + return outArcs[mrec.that.id]; + }; + var recs = fluid.values(mrec); + var components = fluid.stronglyConnected(recs, arcAccessor); + var priorityIndex = 0; + components.forEach(function (component) { + component.forEach(function (recel) { + recel.initPriority = recel.completeOnInit ? Math.Infinity : priorityIndex++; + }); + }); + + recs.sort(function (reca, recb) { + return reca.initPriority - recb.initPriority; + }); + recs.forEach(function (recel) { var that = recel.that; var transac = transacs[that.id]; if (recel.completeOnInit) { @@ -568,6 +625,21 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; fluid.recordListener(applier.modelChanged, sourceListener, shadow, listenerId); }; + /** Called when a relay listener registered using `fluid.registerDirectChangeRelay` enlists in a transaction. Opens a local + * representative of this transaction on `targetApplier`, creates and stores a "transaction element" within the global transaction + * record keyed by the target applier's id. The transaction element is also pushed onto the `relays` member of the global transaction record - they + * will be sorted by priority here when changes are fired. + * @param transRec {TransactionRecord} The global record for the current ChangeApplier transaction as retrieved from `fluid.getModelTransactionRec` + * @param targetApplier {ChangeApplier} The ChangeApplier to which outgoing changes will be applied. A local representative of the transaction will be opened on this applier and returned. + * @param transId {String} The global id of this transaction + * @param options {Object} The `options` argument supplied to `fluid.registerDirectChangeRelay`. This will be stored in the returned transaction element + * - note that only the member `update` is ever used in `fluid.model.updateRelays` - TODO: We should thin this out + * @return {Object} A "transaction element" holding information relevant to this relay's enlistment in the current transaction. This includes fields: + * transaction {Transaction} The local representative of this transaction created on `targetApplier` + * relayCount {Integer} The number of times this relay has been activated in this transaction + * namespace {String} [optional] Namespace for this relay definition + * priority {Priority} The parsed priority definition for this relay + */ fluid.registerRelayTransaction = function (transRec, targetApplier, transId, options, npOptions) { var newTrans = targetApplier.initiate("relay", null, transId); // non-top-level transaction will defeat postCommit var transEl = transRec[targetApplier.applierId] = {transaction: newTrans, relayCount: 0, namespace: npOptions.namespace, priority: npOptions.priority, options: options}; @@ -597,25 +669,33 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; // required within the "overall" transaction whilst genuine (external) changes continue to arrive. // TODO: Vast overcomplication and generation of closure garbage. SURELY we should be able to convert this into an externalised, arg-ist form - /** Registers a listener operating one leg of a model relay relation, connecting the source and target. Called once or twice from `fluid.connectModelRelay` - - * see the comment there for the three cases involved. - * @param target {Component} The target component at the end of the relay. - * @param targetSegs {Array of String} The path in the target where outgoing changes are to be fired - * @param source {Component|Null} The source component from where changes will be listened to. May be null if the change source is a relay document. - * @param sourceSegs {Array of String} The path in the source component's model at which changes will be listened to - * @param linkId {String} The unique id of this relay arc. This will be used as a key within the active transaction record to look up dynamic information about - * activation of the link within that transaction (currently just an activation count) - * @param transducer {Function|Null} A function which will be invoked when a change is to be relayed. This is one of the adapters constructed in "makeTransformPackage" - * and is set when - * @param options {Object} - * transactional {Boolean} `true` in case iii) - although this only represents `half-transactions`, `false` in others since these are resolved immediately with no granularity - */ + /** Registers a listener operating one leg of a model relay relation, connecting the source and target. Called once or twice from `fluid.connectModelRelay` - + * see the comment there for the three cases involved. Note that in its case iii)B) the applier to bind to is not the one attached to `target` but is instead + * held in `options.targetApplier`. + * @param target {Component} The target component at the end of the relay. + * @param targetSegs {Array of String} The path in the target where outgoing changes are to be fired + * @param source {Component|Null} The source component from where changes will be listened to. May be null if the change source is a relay document. + * @param sourceSegs {Array of String} The path in the source component's model at which changes will be listened to + * @param linkId {String} The unique id of this relay arc. This will be used as a key within the active transaction record to look up dynamic information about + * activation of the link within that transaction (currently just an activation count) + * @param transducer {Function|Null} A function which will be invoked when a change is to be relayed. This is one of the adapters constructed in "makeTransformPackage" + * and is set in all cases other than iii)B) (collecting changes to contextualised relay). Note that this will have a member `cond` as returned from + * `fluid.model.parseRelayCondition` encoding the condition whereby changes should be excluded from the transaction. The rule encoded by the condition + * will be applied by the function within `transducer`. + * @param options {Object} + * transactional {Boolean} `true` in case iii) - although this only represents `half-transactions`, `false` in others since these are resolved immediately with no granularity + * targetApplier {ChangeApplier} [optional] in case iii)B) holds the applier for the contextualised relay document which outgoing changes should be applied to + * sourceApplier {ChangeApplier} [optional] in case ii) holds the applier for the contextualised relay document on which we listen for outgoing changes + * @param npOptions {Object} Namespace and priority options + * namespace {String} [optional] The namespace attached to this relay definition + * priority {String} [optional] The (unparsed) priority attached to this relay definition + */ fluid.registerDirectChangeRelay = function (target, targetSegs, source, sourceSegs, linkId, transducer, options, npOptions) { var targetApplier = options.targetApplier || target.applier; // first branch implies the target is a relay document var sourceApplier = options.sourceApplier || source.applier; // first branch implies the source is a relay document - listener will be transactional var applierId = targetApplier.applierId; targetSegs = fluid.makeArray(targetSegs); - sourceSegs = sourceSegs ? fluid.makeArray(sourceSegs) : sourceSegs; // take copies since originals will be trashed + sourceSegs = fluid.makeArray(sourceSegs); // take copies since originals will be trashed var sourceListener = function (newValue, oldValue, path, changeRequest, trans, applier) { var transId = trans.id; var transRec = fluid.getModelTransactionRec(target, transId); @@ -649,17 +729,17 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; } } }; - var spec; - if (sourceSegs) { - spec = sourceApplier.modelChanged.addListener({ - isRelay: true, - segs: sourceSegs, - transactional: options.transactional - }, sourceListener); - if (fluid.passLogLevel(fluid.logLevel.TRACE)) { - fluid.log(fluid.logLevel.TRACE, "Adding relay listener with listenerId " + spec.listenerId + " to source applier with id " + - sourceApplier.applierId + " from target applier with id " + applierId + " for target component with id " + target.id); - } + var spec = sourceApplier.modelChanged.addListener({ + isRelay: true, + cond: transducer && transducer.cond, + targetId: target.id, // these two fields for debuggability + targetApplierId: targetApplier.id, + segs: sourceSegs, + transactional: options.transactional + }, sourceListener); + if (fluid.passLogLevel(fluid.logLevel.TRACE)) { + fluid.log(fluid.logLevel.TRACE, "Adding relay listener with listenerId " + spec.listenerId + " to source applier with id " + + sourceApplier.applierId + " from target applier with id " + applierId + " for target component with id " + target.id); } if (source) { // TODO - we actually may require to register on THREE sources in the case modelRelay is attached to a // component which is neither source nor target. Note there will be problems if source, say, is destroyed and recreated, @@ -671,10 +751,6 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; } }; - // When called during parsing a contextualised model relay document, these arguments are reversed - "source" refers to the - // component holding the relay document, and "target" refers successively to the various "source" components referred to within - // the document - changes in any of these models will be listened to and relayed onto the document's applier (? surely backwards) - // "options" will be transformPackage /** Connect a model relay relation between model material. This is called in three scenarios: * i) from `fluid.parseModelRelay` when parsing an uncontextualised model relay (one with a static transform document), to * directly connect the source and target of the relay @@ -683,19 +759,21 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * iii) from `fluid.parseImplicitRelay` when parsing model references found within contextualised model relay to bind changes emitted * from the target of the reference onto the transform document's applier. These may apply directly to another component's model (in its case * A) or apply to a relay document (in its case B) - * + * * This function will make one or two calls to `fluid.registerDirectChangeRelay` in order to set up each leg of any required relay. - * Note that in case iii)B) the component referred to in `target` is actually the "source" of the changes, and so the call to - * `fluid.registerDirectChangeRelay` will have `source` and `target` reversed + * Note that in case iii)B) the component referred to as our argument `target` is actually the "source" of the changes (that is, the one encountered + * while traversing the transform document), and our argument `source` is the component holding the transform, and so + * the call to `fluid.registerDirectChangeRelay` will have `source` and `target` reversed (`fluid.registerDirectChangeRelay` will bind to the `targetApplier` + * in the options rather than source's applier). * @param source {Component} The component holding the material giving rise to the relay, or the one referred to by the `source` member * of the configuration in case ii), if there is one * @param sourceSegs {Array of String|Null} The parsed segments of the `source` relay reference in case i), or the offset into the transform - * document of the reference component in case iii), otherwise `null` - * @param target {Component} The component holding the model relay `target` in cases i) and ii), or the component at the other end of + * document of the reference component in case iii), otherwise `null` (case ii)) + * @param target {Component} The component holding the model relay `target` in cases i) and ii), or the component at the other end of * the model reference in case iii) (in this case in fact a "source" for the changes. * @param targetSegs {Array of String} The parsed segments of the `target` reference in cases i) and ii), or of the model reference in * case iii) - * @param options {Object} A structure describing the relay, allowing discrimination of the various cases above. This is derived from the return + * @param options {Object} A structure describing the relay, allowing discrimination of the various cases above. This is derived from the return from * `fluid.makeTransformPackage` but will have some members filtered in different cases. This contains members: * update {Function} A function to be called at the end of a "half-transaction" when all pending updates have been applied to the document's applier. * This discriminates case iii) @@ -738,9 +816,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; } } else { // case i) or iii)A): more efficient, old-fashioned branch where relay is uncontextualised fluid.registerDirectChangeRelay(target, targetSegs, source, sourceSegs, linkId, options.forwardAdapter, {transactional: false}, npOptions); - if (sourceSegs) { - fluid.registerDirectChangeRelay(source, sourceSegs, target, targetSegs, linkId, options.backwardAdapter, {transactional: false}, npOptions); - } + fluid.registerDirectChangeRelay(source, sourceSegs, target, targetSegs, linkId, options.backwardAdapter, {transactional: false}, npOptions); } }; @@ -750,6 +826,12 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; return targetSpec; }; + /** Determines whether the supplied transaction should have changes not propagated into it as a result of being excluded by a + * condition specification. + * @param transaction {Transaction} A local ChangeApplier transaction, with member `fullSources` holding all currently active sources + * @param spec {ConditionSpec} A parsed relay condition specification, as returned from `fluid.model.parseRelayCondition`. + * @return {Boolean} `true` if changes should be excluded from the supplied transaction according to the supplied specification + */ fluid.isExcludedChangeSource = function (transaction, spec) { if (!spec || !spec.excludeSource) { // mergeModelListeners initModelEvent fabricates a fake spec that bypasses processing return false; @@ -865,11 +947,18 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; always: {} }; + /** Parse a relay condition specification, e.g. of the form `{includeSource: "init"}` or `never` into a hash representation + * suitable for rapid querying. + * @param condition {String|Object} A relay condition specification, appearing in the section `forward` or `backward` of a + * relay definition + * @return {RelayCondition} The parsed condition, holding members `includeSource` and `excludeSource` each with a hash to `true` + * of referenced sources + */ fluid.model.parseRelayCondition = function (condition) { if (condition === "initOnly") { fluid.log(fluid.logLevel.WARN, "The relay condition \"initOnly\" is deprecated: Please use the form 'includeSource: \"init\"' instead"); } else if (condition === "liveOnly") { - fluid.log(fluid.logLevel.WARN, "The relay condition \"initOnly\" is deprecated: Please use the form 'excludeSource: \"init\"' instead"); + fluid.log(fluid.logLevel.WARN, "The relay condition \"liveOnly\" is deprecated: Please use the form 'excludeSource: \"init\"' instead"); } var exclusionRec; if (!condition) { @@ -923,7 +1012,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * i) references to general material, which will be fetched and interpolated now, and ii) "implicit relay" references to the * model areas of other components, which will be used to set up live synchronisation between the area in this component where * they appear and their target, as well as setting up initial synchronisation to compute the initial contents. - * This is called in two situations: A) parsing the `model` configuration option for a model component, and B) parsing the + * This is called in two situations: A) parsing the `model` configuration option for a model component, and B) parsing the * `transform` member (perhaps derived from `singleTransform`) of a `modelRelay` block for a model component. It calls itself * recursively as it progresses through the model document material with updated `segs` * @param that {Component} The component holding the model document @@ -938,7 +1027,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * targetApplier {ChangeApplier} [optional] The ChangeApplier for this transform document, if it is a transform, empty otherwise * update {Function} [optional] A function to be called on conclusion of a "half-transaction" where all currently pending updates have been applied * to this transform document. This function will update/regenerate the relay transform functions used to relay changes between the transform - * ends based on the updated document. + * ends based on the updated document. */ fluid.parseImplicitRelay = function (that, modelRec, segs, options) { var value; @@ -1569,12 +1658,15 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; spec.segsArray = [spec.segs]; } } - fluid.parseSourceExclusionSpec(spec, spec); - spec.wildcard = fluid.accumulate(fluid.transform(spec.segsArray, function (segs) { - return fluid.contains(segs, "*"); - }), fluid.add, 0); - if (spec.wildcard && spec.segsArray.length > 1) { - fluid.fail("Error in model listener specification ", spec, " - you may not supply a wildcard pattern as one of a set of multiple paths to be matched"); + if (!spec.isRelay) { + // This acts for listeners registered externally. For relays, the exclusion spec is stored in "cond" + fluid.parseSourceExclusionSpec(spec, spec); + spec.wildcard = fluid.accumulate(fluid.transform(spec.segsArray, function (segs) { + return fluid.contains(segs, "*"); + }), fluid.add, 0); + if (spec.wildcard && spec.segsArray.length > 1) { + fluid.fail("Error in model listener specification ", spec, " - you may not supply a wildcard pattern as one of a set of multiple paths to be matched"); + } } var firer = that[spec.transactional ? "transListeners" : "listeners"]; firer.addListener(spec); From 9f01fce3d71845ee6b1ce723ea1fd2e9dcc211af Mon Sep 17 00:00:00 2001 From: Antranig Basman Date: Mon, 22 Jan 2018 12:59:09 +0000 Subject: [PATCH 04/19] FLUID-6234: Removed stray logging definitions --- src/framework/core/js/DataBinding.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/framework/core/js/DataBinding.js b/src/framework/core/js/DataBinding.js index b034705072..4b6e749060 100644 --- a/src/framework/core/js/DataBinding.js +++ b/src/framework/core/js/DataBinding.js @@ -395,13 +395,11 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; var oneOutArcs = {}; var listeners = recel.that.applier.listeners.sortedListeners; fluid.each(listeners, function (listener) { - console.log("oIT got listener ", listener); if (listener.isRelay && !fluid.isExcludedChangeSource(transacs[id], listener.cond)) { var targetId = listener.targetId; if (targetId !== id) { oneOutArcs[targetId] = true; } - console.log("Unexcluded arc to ", targetId, " with record ", mrec[targetId]); } }); var oneOutArcList = Object.keys(oneOutArcs); @@ -443,7 +441,6 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; // differently. But this will require even more ambitious work such as fragmenting all the initial model values along // these boundaries. var outArcs = fluid.computeInitialOutArcs(transacs, mrec); - console.log("Got outArcs of ", outArcs); var arcAccessor = function (mrec) { return outArcs[mrec.that.id]; }; From f62d781490fb5853c71409bdddfa9cf1121a2044 Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Mon, 22 Jan 2018 14:45:09 +0100 Subject: [PATCH 05/19] FLUID-6623: Add support for EL paths to `fluid.stringTemplate`. --- src/framework/core/js/Fluid.js | 77 +++++++++++++++++-- tests/framework-tests/core/js/FluidJSTests.js | 70 +++++++++++++++++ 2 files changed, 139 insertions(+), 8 deletions(-) diff --git a/src/framework/core/js/Fluid.js b/src/framework/core/js/Fluid.js index 1f08ac2ccc..89bf1e8a90 100644 --- a/src/framework/core/js/Fluid.js +++ b/src/framework/core/js/Fluid.js @@ -2862,21 +2862,82 @@ var fluid = fluid || fluid_3_0_0; }; /** - * Simple string template system. - * Takes a template string containing tokens in the form of "%value". - * Returns a new string with the tokens replaced by the specified values. - * Keys and values can be of any data type that can be coerced into a string. * - * @param {String} template a string (can be HTML) that contains tokens embedded into it - * @param {object} values a collection of token keys and values + * Take an original object and represent it using top-level sub-elements whose keys are EL Paths. For example, + * `originalObject` might look like: + * + * ``` + * { + * deep: { + * path: { + * value: "foo", + * emptyObject: {}, + * array: [ "peas", "porridge", "hot"] + * } + * } + * } + * ``` + * + * Calling `fluid.flattenObjectKeys` on this would result in a new object that looks like: + * + * ``` + * { + * "deep": "[object Object]", + * "deep.path": "[object Object]", + * "deep.path.value": "foo", + * "deep.path.array": "peas,porridge,hot", + * "deep.path.array.0": "peas", + * "deep.path.array.1": "porridge", + * "deep.path.array.2": "hot" + * } + * ``` + * + * This function preserves the previous functionality of displaying an entire object using its `toString` function, + * which is why many of the paths above resolve to "[object Object]". + * + * This function is an unsupported non-API function that is used in by `fluid.stringTemplate` (see below). + * + * @param `originalObject` `{Object}` - An object. + * @returns `{Object}` - A representation of the original object that only contains top-level sub-elements whose keys are EL Paths. + * + */ + // unsupported, non-API function + fluid.flattenObjectPaths = function (originalObject) { + var flattenedObject = {}; + fluid.each(originalObject, function (value, key) { + if (typeof value === "object") { + var flattenedSubObject = fluid.flattenObjectPaths(value); + fluid.each(flattenedSubObject, function (subValue, subKey) { + flattenedObject[key + "." + subKey] = subValue; + }); + if (typeof fluid.get(value, "toString") === "function") { + flattenedObject[key] = value.toString(); + } + } + else { + flattenedObject[key] = value; + } + }); + return flattenedObject; + }; + + /** + * Simple string template system. Takes a template string containing tokens in the form of "%value" or + * "%deep.path.to.value". Returns a new string with the tokens replaced by the specified values. Keys and values + * can be of any data type that can be coerced into a string. + * + * @param `{String}` `template` - A string (can be HTML) that contains tokens embedded into it. + * @param `{Object}` `values` - A collection of token keys and values. + * @returns `{String}` - A string whose tokens have been replaced with values. */ fluid.stringTemplate = function (template, values) { - var keys = fluid.keys(values); + var flattenedValues = fluid.flattenObjectPaths(values); + var keys = fluid.keys(flattenedValues); keys = keys.sort(fluid.compareStringLength()); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; var re = fluid.stringToRegExp("%" + key, "g"); - template = template.replace(re, values[key]); + template = template.replace(re, flattenedValues[key]); } return template; }; diff --git a/tests/framework-tests/core/js/FluidJSTests.js b/tests/framework-tests/core/js/FluidJSTests.js index f84eef421f..2ee3e51c8d 100644 --- a/tests/framework-tests/core/js/FluidJSTests.js +++ b/tests/framework-tests/core/js/FluidJSTests.js @@ -391,6 +391,61 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt jqUnit.assertDeepEq("Array copy", array, copy); }); + jqUnit.test("flattenObjectPaths: deep values", function () { + var originalObject = { + path: { + to: { + value: "foo" + } + }, + otherPath: { + to: { + otherValue: "bar" + } + } + }; + var output = fluid.flattenObjectPaths(originalObject); + var expectedValue = { + "path": "[object Object]", + "path.to": "[object Object]", + "path.to.value": "foo", + "otherPath": "[object Object]", + "otherPath.to": "[object Object]", + "otherPath.to.otherValue": "bar" + }; + jqUnit.assertDeepEq("Deep values should be flattened correctly.", expectedValue, output); + }); + + jqUnit.test("flattenObjectPaths: reflattening", function () { + var originalObject = { "deep.path.to.value": "foo"}; + var output = fluid.flattenObjectPaths(originalObject); + jqUnit.assertDeepEq("A preflattened object should remain unchanged when flattened again.", originalObject, output); + }); + + jqUnit.test("flattenObjectPaths: top-level array", function () { + var originalObject = ["monkey", "fighting", "snakes"]; + var output = fluid.flattenObjectPaths(originalObject); + jqUnit.assertDeepEq("A top-level array should be flattened correctly.", { 0: "monkey", 1: "fighting", 2: "snakes"}, output); + }); + + jqUnit.test("flattenObjectPaths: deep array", function () { + var originalObject = { "plane": ["monday", "to", "friday"]}; + var output = fluid.flattenObjectPaths(originalObject); + jqUnit.assertDeepEq("A deep array should be flattened correctly.", { "plane": "monday,to,friday", "plane.0": "monday", "plane.1": "to", "plane.2": "friday"}, output); + }); + + jqUnit.test("flattenObjectPaths: deep empty objects", function () { + var originalObject = { deeply: { empty: {}, nonEmpty: true }}; + var output = fluid.flattenObjectPaths(originalObject); + jqUnit.assertDeepEq("A deep empty object should be handled appropriately.", { "deeply": "[object Object]", "deeply.empty": "[object Object]", "deeply.nonEmpty": true }, output); + }); + + jqUnit.test("flattenObjectPaths: empty object", function () { + var originalObject = {}; + var output = fluid.flattenObjectPaths(originalObject); + jqUnit.assertDeepEq("A top-level empty object should be handled correctly.", {}, output); + }); + jqUnit.test("stringTemplate: greedy", function () { var template = "%tenant/%tenantname", tenant = "../tenant", @@ -548,6 +603,21 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt jqUnit.assertEquals("The template strings should match.", expected, result); }); + jqUnit.test("stringTemplate: EL paths (FLUID-6237)", function () { + var template = "Deep EL paths %deep.path.to.value."; + var data = { + deep: { + path: { + to: { + value: "are working" + } + } + } + }; + var expected = "Deep EL paths are working."; + var result = fluid.stringTemplate(template, data); + jqUnit.assertEquals("The templat strings should match.", expected, result); + }); var testDefaults = { gradeNames: "fluid.component", From 254aa583267ed3e899ddb997c9bc5792d2707206 Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Mon, 22 Jan 2018 15:11:07 +0100 Subject: [PATCH 06/19] FLUID-6223: Migrated from using regexps to using `indexOf` and `slice` in `fluid.stringTemplate`. --- src/framework/core/js/Fluid.js | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/framework/core/js/Fluid.js b/src/framework/core/js/Fluid.js index 89bf1e8a90..0a64ca6c77 100644 --- a/src/framework/core/js/Fluid.js +++ b/src/framework/core/js/Fluid.js @@ -2851,16 +2851,6 @@ var fluid = fluid || fluid_3_0_0; // Message resolution and templating - /** - * Converts a string to a regexp with the specified flags given in parameters - * @param {String} a string that has to be turned into a regular expression - * @param {String} the flags to provide to the reg exp - */ - // TODO: this is an abominably inefficient technique for something that could simply be done by means of indexOf and slice - fluid.stringToRegExp = function (str, flags) { - return new RegExp(str.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"), flags); - }; - /** * * Take an original object and represent it using top-level sub-elements whose keys are EL Paths. For example, @@ -2936,8 +2926,13 @@ var fluid = fluid || fluid_3_0_0; keys = keys.sort(fluid.compareStringLength()); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; - var re = fluid.stringToRegExp("%" + key, "g"); - template = template.replace(re, flattenedValues[key]); + var templatePlaceholder = "%" + key; + var replacementValue = flattenedValues[key]; + + var indexOfPlaceHolder = -1; + while ((indexOfPlaceHolder = template.indexOf(templatePlaceholder)) !== -1) { + template = template.slice(0, indexOfPlaceHolder) + replacementValue + template.slice(indexOfPlaceHolder + templatePlaceholder.length); + } } return template; }; From c0b6768548a73549f413713a43be2e4804153c28 Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Tue, 23 Jan 2018 13:11:50 +0100 Subject: [PATCH 07/19] FLUID-6242: Moved "message resolver" out of Renderer.js and into its own file. Added JSDocs. --- src/framework/core/js/MessageResolver.js | 138 ++++++++++++++++++ src/framework/renderer/js/fluidRenderer.js | 77 ---------- .../inlineEdit/html/InlineEdit-test.html | 1 + .../html/OverviewPanel-test.html | 1 + .../pager/html/PagedTable-test.html | 1 + .../pager/html/Pager-test.html | 1 + .../reorderer/html/AriaLabeller-test.html | 1 + .../reorderer/html/ImageReorderer-test.html | 1 + .../reorderer/html/LayoutReorderer-test.html | 1 + .../reorderer/html/NestedReorderer-test.html | 1 + .../reorderer/html/ReorderList-test.html | 1 + .../reorderer/html/Scheduler-test.html | 1 + .../slidingPanel/html/SlidingPanel-test.html | 3 + .../html/TableOfContents-test.html | 2 + .../textfieldControl/html/Textfield-test.html | 1 + .../html/TextfieldSlider-test.html | 1 + .../html/TextfieldStepper-test.html | 1 + .../uiOptions/html/UIOptions-test.html | 1 + .../core/html/ResourceLoader-test.html | 1 + .../preferences/html/AuxBuilder-test.html | 1 + .../preferences/html/Builder-test.html | 1 + .../preferences/html/Enactors-test.html | 1 + .../html/FullNoPreviewPrefsEditor-test.html | 1 + .../html/FullPreviewPrefsEditor-test.html | 1 + .../preferences/html/PageEnhancer-test.html | 1 + .../preferences/html/Panels-test.html | 1 + .../preferences/html/PrefsEditor-test.html | 1 + .../preferences/html/PrimaryBuilder-test.html | 1 + .../html/SelfVoicingEnactor-test.html | 1 + .../html/SelfVoicingPanel-test.html | 1 + .../html/SeparatedPanelPrefsEditor-test.html | 1 + ...aratedPanelPrefsEditorResponsive-test.html | 1 + .../preferences/html/UIEnhancer-test.html | 1 + .../renderer/html/Renderer-test.html | 2 + .../renderer/html/RendererUtilities-test.html | 2 + .../components/inlineEdit/rich/index.html | 1 + .../components/reorderer/dynamic/index.html | 1 + .../core/multipleVersions/index.html | 1 + .../preferences/assortedContent/index.html | 1 + .../preferences/fullPage-schema/index.html | 1 + .../framework/preferences/fullPage/index.html | 1 + .../testTests/html/IoCTestingView-test.html | 1 + .../test-core/testTests/html/jqUnit-test.html | 1 + 43 files changed, 184 insertions(+), 77 deletions(-) create mode 100644 src/framework/core/js/MessageResolver.js diff --git a/src/framework/core/js/MessageResolver.js b/src/framework/core/js/MessageResolver.js new file mode 100644 index 0000000000..bf1a5fc317 --- /dev/null +++ b/src/framework/core/js/MessageResolver.js @@ -0,0 +1,138 @@ +/* +Copyright 2011-2016 OCAD University +Copyright 2011 Lucendo Development Ltd. + +Licensed under the Educational Community License (ECL), Version 2.0 or the New +BSD license. You may not use this file except in compliance with one these +Licenses. + +You may obtain a copy of the ECL 2.0 License and BSD License at +https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt +*/ + +var fluid_3_0_0 = fluid_3_0_0 || {}; + +(function ($, fluid) { + "use strict"; + + fluid.defaults("fluid.messageResolver", { + gradeNames: ["fluid.component"], + mergePolicy: { + messageBase: "nomerge", + parents: "nomerge" + }, + resolveFunc: fluid.stringTemplate, + parseFunc: fluid.identity, + messageBase: {}, + members: { + messageBase: "@expand:{that}.options.parseFunc({that}.options.messageBase)" + }, + invokers: { + lookup: "fluid.messageResolver.lookup({that}, {arguments}.0)", // messagecodes + resolve: "fluid.messageResolver.resolve({that}, {arguments}.0, {arguments}.1)" // messagecodes, args + }, + parents: [] + }); + + /** + * + * Look up the first matching message template, starting with the current grade and working up through its parents. + * Returns both the template for the message and the function used to resolve the localised value. By default + * the resolve function is `fluid.stringTemplate`, and the template returned uses its syntax. + * + * @param `that` `{Object}` - The component itself. + * @param `messagecodes` `{Array}` - One or more message codes to look up templates for. + * @returns `{Object}` - An object that contains`template` and `resolveFunc` members (see above). + * + */ + fluid.messageResolver.lookup = function (that, messagecodes) { + var resolved = fluid.messageResolver.resolveOne(that.messageBase, messagecodes); + if (resolved === undefined) { + return fluid.find(that.options.parents, function (parent) { + return parent ? parent.lookup(messagecodes) : undefined; + }); + } else { + return {template: resolved, resolveFunc: that.options.resolveFunc}; + } + }; + + /** + * + * Look up the first message that corresponds to a message code found in `messageCodes`. Then, resolve its + * localised value. By default, supports variable substitutions using `fluid.stringTemplate`. + * + * @param `that` `{Object}` - The component itself. + * @param `messagecodes` `{Array}` - A list of message codes to look for. + * @param `args` `{Object}` - A map of variables that may potentially be used as part of the final output. + * @returns {String} - The final message, localised, with any variables found in `args`. + * + */ + fluid.messageResolver.resolve = function (that, messagecodes, args) { + if (!messagecodes) { + return "[No messagecodes provided]"; + } + messagecodes = fluid.makeArray(messagecodes); + var looked = that.lookup(messagecodes); + return looked ? looked.resolveFunc(looked.template, args) : + "[Message string for key " + messagecodes[0] + " not found]"; + }; + + + // unsupported, NON-API function + fluid.messageResolver.resolveOne = function (messageBase, messagecodes) { + for (var i = 0; i < messagecodes.length; ++i) { + var code = messagecodes[i]; + var message = messageBase[code]; + if (message !== undefined) { + return message; + } + } + }; + + /** + * + * Converts a data structure consisting of a mapping of keys to message strings, into a "messageLocator" function + * which maps an array of message codes, to be tried in sequence until a key is found, and an array of substitution + * arguments, into a substituted message string. + * + * @param `messageBase` - A body of messages to wrap in a resolver function. + * @param `resolveFunc` (Optional) - A "resolver" function to use instead of the default `fluid.stringTemplate`. + * @returns `{Function}` - A "messageLocator" function (see above). + * + */ + fluid.messageLocator = function (messageBase, resolveFunc) { + var resolver = fluid.messageResolver({messageBase: messageBase, resolveFunc: resolveFunc}); + return function (messagecodes, args) { + return resolver.resolve(messagecodes, args); + }; + }; + + /** + * + * Resolve a "message source", which is either itself a resolver, or an object representing a bundle of messages + * and the associated resolution function. + * + * When passing a "data" object, it is expected to have a `type` element that is set to `data`, and to have a + * `messages` array and a `resolveFunc` function that can be used to resolve messages. + * + * A "resolver" is expected to be an object with a `type` element that is set to `resolver` that exposes a `resolve` + * function. + * + * @param `messageSource` `{Object}` - See above. + * @returns `{Function|String}` - A resolve function or a `String` representing the final resolved output. + * + */ + fluid.resolveMessageSource = function (messageSource) { + if (messageSource.type === "data") { + if (messageSource.url === undefined) { + return fluid.messageLocator(messageSource.messages, messageSource.resolveFunc); + } + else { + // TODO: fetch via AJAX, and convert format if necessary + } + } + else if (messageSource.type === "resolver") { + return messageSource.resolver.resolve; + } + }; +})(jQuery, fluid_3_0_0); diff --git a/src/framework/renderer/js/fluidRenderer.js b/src/framework/renderer/js/fluidRenderer.js index ed13d368f3..d94a4e17de 100644 --- a/src/framework/renderer/js/fluidRenderer.js +++ b/src/framework/renderer/js/fluidRenderer.js @@ -20,69 +20,6 @@ fluid_3_0_0 = fluid_3_0_0 || {}; "use strict"; - fluid.defaults("fluid.messageResolver", { - gradeNames: ["fluid.component"], - mergePolicy: { - messageBase: "nomerge", - parents: "nomerge" - }, - resolveFunc: fluid.stringTemplate, - parseFunc: fluid.identity, - messageBase: {}, - members: { - messageBase: "@expand:{that}.options.parseFunc({that}.options.messageBase)" - }, - invokers: { - lookup: "fluid.messageResolver.lookup({that}, {arguments}.0)", // messagecodes - resolve: "fluid.messageResolver.resolve({that}, {arguments}.0, {arguments}.1)" // messagecodes, args - }, - parents: [] - }); - - fluid.messageResolver.lookup = function (that, messagecodes) { - var resolved = fluid.messageResolver.resolveOne(that.messageBase, messagecodes); - if (resolved === undefined) { - return fluid.find(that.options.parents, function (parent) { - return parent ? parent.lookup(messagecodes) : undefined; - }); - } else { - return {template: resolved, resolveFunc: that.options.resolveFunc}; - } - }; - - fluid.messageResolver.resolve = function (that, messagecodes, args) { - if (!messagecodes) { - return "[No messagecodes provided]"; - } - messagecodes = fluid.makeArray(messagecodes); - var looked = that.lookup(messagecodes); - return looked ? looked.resolveFunc(looked.template, args) : - "[Message string for key " + messagecodes[0] + " not found]"; - }; - - - // unsupported, NON-API function - fluid.messageResolver.resolveOne = function (messageBase, messagecodes) { - for (var i = 0; i < messagecodes.length; ++i) { - var code = messagecodes[i]; - var message = messageBase[code]; - if (message !== undefined) { - return message; - } - } - }; - - /** Converts a data structure consisting of a mapping of keys to message strings, - * into a "messageLocator" function which maps an array of message codes, to be - * tried in sequence until a key is found, and an array of substitution arguments, - * into a substituted message string. - */ - fluid.messageLocator = function (messageBase, resolveFunc) { - var resolver = fluid.messageResolver({messageBase: messageBase, resolveFunc: resolveFunc}); - return function (messagecodes, args) { - return resolver.resolve(messagecodes, args); - }; - }; function debugPosition(component) { return "as child of " + (component.parent.fullID ? "component with full ID " + component.parent.fullID : "root"); @@ -1518,20 +1455,6 @@ fluid_3_0_0 = fluid_3_0_0 || {}; }); }; - fluid.resolveMessageSource = function (messageSource) { - if (messageSource.type === "data") { - if (messageSource.url === undefined) { - return fluid.messageLocator(messageSource.messages, messageSource.resolveFunc); - } - else { - // TODO: fetch via AJAX, and convert format if necessary - } - } - else if (messageSource.type === "resolver") { - return messageSource.resolver.resolve; - } - }; - fluid.renderTemplates = function (templates, tree, options, fossilsIn) { var renderer = fluid.renderer(templates, tree, options, fossilsIn); var rendered = renderer.renderTemplates(); diff --git a/tests/component-tests/inlineEdit/html/InlineEdit-test.html b/tests/component-tests/inlineEdit/html/InlineEdit-test.html index ba3ed57227..53d6fc7698 100644 --- a/tests/component-tests/inlineEdit/html/InlineEdit-test.html +++ b/tests/component-tests/inlineEdit/html/InlineEdit-test.html @@ -25,6 +25,7 @@ + diff --git a/tests/component-tests/overviewPanel/html/OverviewPanel-test.html b/tests/component-tests/overviewPanel/html/OverviewPanel-test.html index 70e9c22e9d..ff6b4dc0a7 100644 --- a/tests/component-tests/overviewPanel/html/OverviewPanel-test.html +++ b/tests/component-tests/overviewPanel/html/OverviewPanel-test.html @@ -19,6 +19,7 @@ + diff --git a/tests/component-tests/pager/html/PagedTable-test.html b/tests/component-tests/pager/html/PagedTable-test.html index 0de1e81799..0f5626022b 100644 --- a/tests/component-tests/pager/html/PagedTable-test.html +++ b/tests/component-tests/pager/html/PagedTable-test.html @@ -21,6 +21,7 @@ + diff --git a/tests/component-tests/pager/html/Pager-test.html b/tests/component-tests/pager/html/Pager-test.html index 3e604ec1e1..c15a2a256c 100644 --- a/tests/component-tests/pager/html/Pager-test.html +++ b/tests/component-tests/pager/html/Pager-test.html @@ -19,6 +19,7 @@ + diff --git a/tests/component-tests/reorderer/html/AriaLabeller-test.html b/tests/component-tests/reorderer/html/AriaLabeller-test.html index 5288bccbe5..8db9522097 100644 --- a/tests/component-tests/reorderer/html/AriaLabeller-test.html +++ b/tests/component-tests/reorderer/html/AriaLabeller-test.html @@ -18,6 +18,7 @@ + diff --git a/tests/component-tests/reorderer/html/ImageReorderer-test.html b/tests/component-tests/reorderer/html/ImageReorderer-test.html index 188821aff5..776cc6b780 100644 --- a/tests/component-tests/reorderer/html/ImageReorderer-test.html +++ b/tests/component-tests/reorderer/html/ImageReorderer-test.html @@ -23,6 +23,7 @@ + diff --git a/tests/component-tests/reorderer/html/LayoutReorderer-test.html b/tests/component-tests/reorderer/html/LayoutReorderer-test.html index a1d06fa7e0..0fd3b12e65 100644 --- a/tests/component-tests/reorderer/html/LayoutReorderer-test.html +++ b/tests/component-tests/reorderer/html/LayoutReorderer-test.html @@ -15,6 +15,7 @@ + diff --git a/tests/component-tests/reorderer/html/NestedReorderer-test.html b/tests/component-tests/reorderer/html/NestedReorderer-test.html index c4df6d695e..b770c5600a 100644 --- a/tests/component-tests/reorderer/html/NestedReorderer-test.html +++ b/tests/component-tests/reorderer/html/NestedReorderer-test.html @@ -16,6 +16,7 @@ + diff --git a/tests/component-tests/reorderer/html/ReorderList-test.html b/tests/component-tests/reorderer/html/ReorderList-test.html index ad0d08535e..9e224298e5 100644 --- a/tests/component-tests/reorderer/html/ReorderList-test.html +++ b/tests/component-tests/reorderer/html/ReorderList-test.html @@ -17,6 +17,7 @@ + diff --git a/tests/component-tests/reorderer/html/Scheduler-test.html b/tests/component-tests/reorderer/html/Scheduler-test.html index 1a70e62a25..b1e2a3ab4b 100644 --- a/tests/component-tests/reorderer/html/Scheduler-test.html +++ b/tests/component-tests/reorderer/html/Scheduler-test.html @@ -15,6 +15,7 @@ + diff --git a/tests/component-tests/slidingPanel/html/SlidingPanel-test.html b/tests/component-tests/slidingPanel/html/SlidingPanel-test.html index d24c026318..e00099de98 100644 --- a/tests/component-tests/slidingPanel/html/SlidingPanel-test.html +++ b/tests/component-tests/slidingPanel/html/SlidingPanel-test.html @@ -12,11 +12,14 @@ + + + diff --git a/tests/component-tests/tableOfContents/html/TableOfContents-test.html b/tests/component-tests/tableOfContents/html/TableOfContents-test.html index 502ec5723c..fdd5f58086 100644 --- a/tests/component-tests/tableOfContents/html/TableOfContents-test.html +++ b/tests/component-tests/tableOfContents/html/TableOfContents-test.html @@ -16,7 +16,9 @@ + + diff --git a/tests/component-tests/textfieldControl/html/Textfield-test.html b/tests/component-tests/textfieldControl/html/Textfield-test.html index c2b10b91d3..f3688508cb 100644 --- a/tests/component-tests/textfieldControl/html/Textfield-test.html +++ b/tests/component-tests/textfieldControl/html/Textfield-test.html @@ -18,6 +18,7 @@ + diff --git a/tests/component-tests/textfieldControl/html/TextfieldSlider-test.html b/tests/component-tests/textfieldControl/html/TextfieldSlider-test.html index dcd0310d00..48086f8a3c 100644 --- a/tests/component-tests/textfieldControl/html/TextfieldSlider-test.html +++ b/tests/component-tests/textfieldControl/html/TextfieldSlider-test.html @@ -18,6 +18,7 @@ + diff --git a/tests/component-tests/textfieldControl/html/TextfieldStepper-test.html b/tests/component-tests/textfieldControl/html/TextfieldStepper-test.html index 7c67da384f..bc5aa88831 100644 --- a/tests/component-tests/textfieldControl/html/TextfieldStepper-test.html +++ b/tests/component-tests/textfieldControl/html/TextfieldStepper-test.html @@ -21,6 +21,7 @@ + diff --git a/tests/component-tests/uiOptions/html/UIOptions-test.html b/tests/component-tests/uiOptions/html/UIOptions-test.html index b5d726f4e2..b792ba6a9a 100644 --- a/tests/component-tests/uiOptions/html/UIOptions-test.html +++ b/tests/component-tests/uiOptions/html/UIOptions-test.html @@ -23,6 +23,7 @@ + diff --git a/tests/framework-tests/core/html/ResourceLoader-test.html b/tests/framework-tests/core/html/ResourceLoader-test.html index cc93e68691..f59450e46c 100644 --- a/tests/framework-tests/core/html/ResourceLoader-test.html +++ b/tests/framework-tests/core/html/ResourceLoader-test.html @@ -20,6 +20,7 @@ + diff --git a/tests/framework-tests/preferences/html/AuxBuilder-test.html b/tests/framework-tests/preferences/html/AuxBuilder-test.html index b41faa9a69..6b8f305e89 100644 --- a/tests/framework-tests/preferences/html/AuxBuilder-test.html +++ b/tests/framework-tests/preferences/html/AuxBuilder-test.html @@ -17,6 +17,7 @@ + diff --git a/tests/framework-tests/preferences/html/Builder-test.html b/tests/framework-tests/preferences/html/Builder-test.html index 10217a1310..4ea9749276 100644 --- a/tests/framework-tests/preferences/html/Builder-test.html +++ b/tests/framework-tests/preferences/html/Builder-test.html @@ -19,6 +19,7 @@ + diff --git a/tests/framework-tests/preferences/html/Enactors-test.html b/tests/framework-tests/preferences/html/Enactors-test.html index 5f8f413cd0..dea38016e3 100644 --- a/tests/framework-tests/preferences/html/Enactors-test.html +++ b/tests/framework-tests/preferences/html/Enactors-test.html @@ -17,6 +17,7 @@ + diff --git a/tests/framework-tests/preferences/html/FullNoPreviewPrefsEditor-test.html b/tests/framework-tests/preferences/html/FullNoPreviewPrefsEditor-test.html index c154749a60..9d9cd2e8c3 100644 --- a/tests/framework-tests/preferences/html/FullNoPreviewPrefsEditor-test.html +++ b/tests/framework-tests/preferences/html/FullNoPreviewPrefsEditor-test.html @@ -22,6 +22,7 @@ + diff --git a/tests/framework-tests/preferences/html/FullPreviewPrefsEditor-test.html b/tests/framework-tests/preferences/html/FullPreviewPrefsEditor-test.html index b9e559493c..a61f1fa01e 100644 --- a/tests/framework-tests/preferences/html/FullPreviewPrefsEditor-test.html +++ b/tests/framework-tests/preferences/html/FullPreviewPrefsEditor-test.html @@ -22,6 +22,7 @@ + diff --git a/tests/framework-tests/preferences/html/PageEnhancer-test.html b/tests/framework-tests/preferences/html/PageEnhancer-test.html index 50eb46d731..80e269f9ee 100644 --- a/tests/framework-tests/preferences/html/PageEnhancer-test.html +++ b/tests/framework-tests/preferences/html/PageEnhancer-test.html @@ -18,6 +18,7 @@ + diff --git a/tests/framework-tests/preferences/html/Panels-test.html b/tests/framework-tests/preferences/html/Panels-test.html index 30cae64818..95198a4cdf 100644 --- a/tests/framework-tests/preferences/html/Panels-test.html +++ b/tests/framework-tests/preferences/html/Panels-test.html @@ -24,6 +24,7 @@ + diff --git a/tests/framework-tests/preferences/html/PrefsEditor-test.html b/tests/framework-tests/preferences/html/PrefsEditor-test.html index 844957cbc0..115104f46e 100644 --- a/tests/framework-tests/preferences/html/PrefsEditor-test.html +++ b/tests/framework-tests/preferences/html/PrefsEditor-test.html @@ -23,6 +23,7 @@ + diff --git a/tests/framework-tests/preferences/html/PrimaryBuilder-test.html b/tests/framework-tests/preferences/html/PrimaryBuilder-test.html index 48b56b9a6b..dfcf1ddc55 100644 --- a/tests/framework-tests/preferences/html/PrimaryBuilder-test.html +++ b/tests/framework-tests/preferences/html/PrimaryBuilder-test.html @@ -17,6 +17,7 @@ + diff --git a/tests/framework-tests/preferences/html/SelfVoicingEnactor-test.html b/tests/framework-tests/preferences/html/SelfVoicingEnactor-test.html index 685292bbaa..59aedd1169 100644 --- a/tests/framework-tests/preferences/html/SelfVoicingEnactor-test.html +++ b/tests/framework-tests/preferences/html/SelfVoicingEnactor-test.html @@ -18,6 +18,7 @@ + diff --git a/tests/framework-tests/preferences/html/SelfVoicingPanel-test.html b/tests/framework-tests/preferences/html/SelfVoicingPanel-test.html index 72bd340487..3896b3e2e9 100644 --- a/tests/framework-tests/preferences/html/SelfVoicingPanel-test.html +++ b/tests/framework-tests/preferences/html/SelfVoicingPanel-test.html @@ -24,6 +24,7 @@ + diff --git a/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditor-test.html b/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditor-test.html index b03a4e8c5b..133bebe0cc 100644 --- a/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditor-test.html +++ b/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditor-test.html @@ -24,6 +24,7 @@ + diff --git a/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditorResponsive-test.html b/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditorResponsive-test.html index cc80ccbf96..7692a4a3ec 100644 --- a/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditorResponsive-test.html +++ b/tests/framework-tests/preferences/html/SeparatedPanelPrefsEditorResponsive-test.html @@ -24,6 +24,7 @@ + diff --git a/tests/framework-tests/preferences/html/UIEnhancer-test.html b/tests/framework-tests/preferences/html/UIEnhancer-test.html index 9ac7ba3f62..cd65ce0d2f 100644 --- a/tests/framework-tests/preferences/html/UIEnhancer-test.html +++ b/tests/framework-tests/preferences/html/UIEnhancer-test.html @@ -18,6 +18,7 @@ + diff --git a/tests/framework-tests/renderer/html/Renderer-test.html b/tests/framework-tests/renderer/html/Renderer-test.html index 6f790c1030..8142aad926 100644 --- a/tests/framework-tests/renderer/html/Renderer-test.html +++ b/tests/framework-tests/renderer/html/Renderer-test.html @@ -17,9 +17,11 @@ + + diff --git a/tests/framework-tests/renderer/html/RendererUtilities-test.html b/tests/framework-tests/renderer/html/RendererUtilities-test.html index 2e5703e914..0d6c058f96 100644 --- a/tests/framework-tests/renderer/html/RendererUtilities-test.html +++ b/tests/framework-tests/renderer/html/RendererUtilities-test.html @@ -14,9 +14,11 @@ + + diff --git a/tests/manual-tests/components/inlineEdit/rich/index.html b/tests/manual-tests/components/inlineEdit/rich/index.html index 68c1d5748b..ee080d8e67 100644 --- a/tests/manual-tests/components/inlineEdit/rich/index.html +++ b/tests/manual-tests/components/inlineEdit/rich/index.html @@ -33,6 +33,7 @@ + diff --git a/tests/manual-tests/components/reorderer/dynamic/index.html b/tests/manual-tests/components/reorderer/dynamic/index.html index 569d04e01b..4f3456e9c6 100644 --- a/tests/manual-tests/components/reorderer/dynamic/index.html +++ b/tests/manual-tests/components/reorderer/dynamic/index.html @@ -20,6 +20,7 @@ + diff --git a/tests/manual-tests/framework/core/multipleVersions/index.html b/tests/manual-tests/framework/core/multipleVersions/index.html index 1bcd03ac1f..af0e0502a7 100644 --- a/tests/manual-tests/framework/core/multipleVersions/index.html +++ b/tests/manual-tests/framework/core/multipleVersions/index.html @@ -23,6 +23,7 @@ + diff --git a/tests/manual-tests/framework/preferences/assortedContent/index.html b/tests/manual-tests/framework/preferences/assortedContent/index.html index a7e133066e..6d4be8fc89 100644 --- a/tests/manual-tests/framework/preferences/assortedContent/index.html +++ b/tests/manual-tests/framework/preferences/assortedContent/index.html @@ -40,6 +40,7 @@ + diff --git a/tests/manual-tests/framework/preferences/fullPage-schema/index.html b/tests/manual-tests/framework/preferences/fullPage-schema/index.html index dadbef02a5..b1e8b355fa 100644 --- a/tests/manual-tests/framework/preferences/fullPage-schema/index.html +++ b/tests/manual-tests/framework/preferences/fullPage-schema/index.html @@ -41,6 +41,7 @@ + diff --git a/tests/manual-tests/framework/preferences/fullPage/index.html b/tests/manual-tests/framework/preferences/fullPage/index.html index f709a09e24..54754a0e58 100644 --- a/tests/manual-tests/framework/preferences/fullPage/index.html +++ b/tests/manual-tests/framework/preferences/fullPage/index.html @@ -41,6 +41,7 @@ + diff --git a/tests/test-core/testTests/html/IoCTestingView-test.html b/tests/test-core/testTests/html/IoCTestingView-test.html index 6351832d6b..cdd64eeaf4 100644 --- a/tests/test-core/testTests/html/IoCTestingView-test.html +++ b/tests/test-core/testTests/html/IoCTestingView-test.html @@ -21,6 +21,7 @@ + diff --git a/tests/test-core/testTests/html/jqUnit-test.html b/tests/test-core/testTests/html/jqUnit-test.html index 7e34510f10..6ed04aeb47 100644 --- a/tests/test-core/testTests/html/jqUnit-test.html +++ b/tests/test-core/testTests/html/jqUnit-test.html @@ -20,6 +20,7 @@ + From a09b2d4cb8e69510025129db32dc64327542e4da Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Tue, 30 Jan 2018 13:56:45 +0100 Subject: [PATCH 08/19] FLUID-6223: Standardised JSDocs on several fronts. --- src/framework/core/js/Fluid.js | 18 ++++++++++-------- src/framework/core/js/MessageResolver.js | 24 ++++++++++++------------ 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/framework/core/js/Fluid.js b/src/framework/core/js/Fluid.js index 0a64ca6c77..612afd6cbe 100644 --- a/src/framework/core/js/Fluid.js +++ b/src/framework/core/js/Fluid.js @@ -2657,8 +2657,8 @@ var fluid = fluid || fluid_3_0_0; * This method is a convenience for creating small objects that have options but don't require full * View-like features such as the DOM Binder or events * - * @param {Object} name the name of the little component to create - * @param {Object} options user-supplied options to merge with the defaults + * @param name {Object} The name of the little component to create + * @param options {Object} User-supplied options to merge with the defaults */ // NOTE: the 3rd argument localOptions is NOT to be advertised as part of the stable API, it is present // just to allow backward compatibility whilst grade specifications are not mandatory - similarly for 4th arg "receiver" @@ -2887,8 +2887,8 @@ var fluid = fluid || fluid_3_0_0; * * This function is an unsupported non-API function that is used in by `fluid.stringTemplate` (see below). * - * @param `originalObject` `{Object}` - An object. - * @returns `{Object}` - A representation of the original object that only contains top-level sub-elements whose keys are EL Paths. + * @param originalObject {Object} An object. + * @return {Object} A representation of the original object that only contains top-level sub-elements whose keys are EL Paths. * */ // unsupported, non-API function @@ -2912,13 +2912,15 @@ var fluid = fluid || fluid_3_0_0; }; /** + * * Simple string template system. Takes a template string containing tokens in the form of "%value" or * "%deep.path.to.value". Returns a new string with the tokens replaced by the specified values. Keys and values * can be of any data type that can be coerced into a string. * - * @param `{String}` `template` - A string (can be HTML) that contains tokens embedded into it. - * @param `{Object}` `values` - A collection of token keys and values. - * @returns `{String}` - A string whose tokens have been replaced with values. + * @param template {String} A string (can be HTML) that contains tokens embedded into it. + * @param values {Object} A collection of token keys and values. + * @return {String} A string whose tokens have been replaced with values. + * */ fluid.stringTemplate = function (template, values) { var flattenedValues = fluid.flattenObjectPaths(values); @@ -2930,7 +2932,7 @@ var fluid = fluid || fluid_3_0_0; var replacementValue = flattenedValues[key]; var indexOfPlaceHolder = -1; - while ((indexOfPlaceHolder = template.indexOf(templatePlaceholder)) !== -1) { + while ((indexOfPlaceHolder = template.indexOf(templatePlaceholder)) !== -1) { template = template.slice(0, indexOfPlaceHolder) + replacementValue + template.slice(indexOfPlaceHolder + templatePlaceholder.length); } } diff --git a/src/framework/core/js/MessageResolver.js b/src/framework/core/js/MessageResolver.js index bf1a5fc317..78b420cf02 100644 --- a/src/framework/core/js/MessageResolver.js +++ b/src/framework/core/js/MessageResolver.js @@ -40,9 +40,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Returns both the template for the message and the function used to resolve the localised value. By default * the resolve function is `fluid.stringTemplate`, and the template returned uses its syntax. * - * @param `that` `{Object}` - The component itself. - * @param `messagecodes` `{Array}` - One or more message codes to look up templates for. - * @returns `{Object}` - An object that contains`template` and `resolveFunc` members (see above). + * @param that {Object} - The component itself. + * @param messagecodes {Array} - One or more message codes to look up templates for. + * @return {Object} - An object that contains`template` and `resolveFunc` members (see above). * */ fluid.messageResolver.lookup = function (that, messagecodes) { @@ -61,10 +61,10 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Look up the first message that corresponds to a message code found in `messageCodes`. Then, resolve its * localised value. By default, supports variable substitutions using `fluid.stringTemplate`. * - * @param `that` `{Object}` - The component itself. - * @param `messagecodes` `{Array}` - A list of message codes to look for. - * @param `args` `{Object}` - A map of variables that may potentially be used as part of the final output. - * @returns {String} - The final message, localised, with any variables found in `args`. + * @param that {Object} - The component itself. + * @param messagecodes {Array} - A list of message codes to look for. + * @param args {Object} - A map of variables that may potentially be used as part of the final output. + * @return {String} - The final message, localised, with any variables found in `args`. * */ fluid.messageResolver.resolve = function (that, messagecodes, args) { @@ -95,9 +95,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * which maps an array of message codes, to be tried in sequence until a key is found, and an array of substitution * arguments, into a substituted message string. * - * @param `messageBase` - A body of messages to wrap in a resolver function. - * @param `resolveFunc` (Optional) - A "resolver" function to use instead of the default `fluid.stringTemplate`. - * @returns `{Function}` - A "messageLocator" function (see above). + * @param messageBase - A body of messages to wrap in a resolver function. + * @param resolveFunc (Optional) - A "resolver" function to use instead of the default `fluid.stringTemplate`. + * @return {Function} - A "messageLocator" function (see above). * */ fluid.messageLocator = function (messageBase, resolveFunc) { @@ -118,8 +118,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * A "resolver" is expected to be an object with a `type` element that is set to `resolver` that exposes a `resolve` * function. * - * @param `messageSource` `{Object}` - See above. - * @returns `{Function|String}` - A resolve function or a `String` representing the final resolved output. + * @param messageSource {Object} - See above. + * @return {Function|String} - A resolve function or a `String` representing the final resolved output. * */ fluid.resolveMessageSource = function (messageSource) { From a67da21822e98f703b7bdf8c9734f934433a850e Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Tue, 30 Jan 2018 13:57:09 +0100 Subject: [PATCH 09/19] NOJIRA: Committed initial package-lock.json. --- package-lock.json | 7384 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 7384 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..9c41c60ec6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7384 @@ +{ + "name": "infusion", + "version": "3.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSV": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", + "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + } + }, + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", + "dev": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "dev": true, + "requires": { + "archiver-utils": "1.3.0", + "async": "2.6.0", + "buffer-crc32": "0.2.13", + "glob": "7.1.2", + "lodash": "4.17.4", + "readable-stream": "2.3.3", + "tar-stream": "1.5.5", + "walkdir": "0.0.11", + "zip-stream": "1.2.0" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "requires": { + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lazystream": "1.0.0", + "lodash": "4.17.4", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "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" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "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-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "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" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "dev": true + }, + "backbone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", + "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=", + "dev": true, + "requires": { + "underscore": "1.8.3" + }, + "dependencies": { + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + } + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.3" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "charm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", + "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true, + "optional": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "coffee-script": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", + "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "crc32-stream": "2.0.0", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "3.5.1" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "dev": true, + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=", + "dev": true + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "3.4.4", + "readable-stream": "2.3.3" + } + }, + "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.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "optional": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.38" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "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.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-libc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-0.2.0.tgz", + "integrity": "sha1-R/31ZzSKF+wl/L8LnkRjSKdvn7U=", + "dev": true, + "optional": true + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "engine.io": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.0.tgz", + "integrity": "sha1-PutfJky3XbvsG6rqJtYfWk6s4qo=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "0.1.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "ws": "1.1.1" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + } + } + }, + "engine.io-client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.0.tgz", + "integrity": "sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.1", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + } + } + }, + "engine.io-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.1.tgz", + "integrity": "sha1-lVTxrjMQfW+9FwylRm0vgz9qB88=", + "dev": true, + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.6", + "wtf-8": "1.0.0" + }, + "dependencies": { + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.38", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", + "integrity": "sha1-+n1A1lu8m7imfh0/nMZWoAUw7tM=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-config-fluid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-fluid/-/eslint-config-fluid-1.2.0.tgz", + "integrity": "sha1-V+UrApkA+AxGLhBUTwG8mglk0AU=", + "dev": true + }, + "espree": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.1.4.tgz", + "integrity": "sha1-BybXrIOvl6fISY2ps2OjYJ0qaKE=", + "dev": true, + "requires": { + "acorn": "3.3.0", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "dev": true + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.0.tgz", + "integrity": "sha1-4J77qXe/mPnuDtJavQxpLgKuw/w=", + "dev": true, + "optional": true + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "express-session": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", + "integrity": "sha1-R7QWDIj0KrcP6KUI4xy/92dXqwo=", + "dev": true, + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "crc": "3.4.4", + "debug": "2.6.9", + "depd": "1.1.2", + "on-headers": "1.0.1", + "parseurl": "1.3.2", + "uid-safe": "2.1.5", + "utils-merge": "1.0.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true, + "optional": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true, + "optional": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", + "dev": true + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "5.0.15" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "fireworm": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/fireworm/-/fireworm-0.7.1.tgz", + "integrity": "sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g=", + "dev": true, + "requires": { + "async": "0.2.10", + "is-type": "0.0.1", + "lodash.debounce": "3.1.1", + "lodash.flatten": "3.0.2", + "minimatch": "3.0.4" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "fluid-eslint": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/fluid-eslint/-/fluid-eslint-2.10.2.tgz", + "integrity": "sha1-/naYSwotFMZQ/dDRMow8y5ET+ew=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "es6-map": "0.1.5", + "escope": "3.6.0", + "espree": "3.1.4", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "1.3.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.17.1", + "is-resolvable": "1.1.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "optionator": "0.8.2", + "path-is-absolute": "1.0.1", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.6.1", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + } + }, + "fluid-grunt-eslint": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/fluid-grunt-eslint/-/fluid-grunt-eslint-18.1.2.tgz", + "integrity": "sha1-//pkXUaKQyCQRY7QVd1Ia7lDf2w=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "fluid-eslint": "2.10.2" + } + }, + "fluid-resolve": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fluid-resolve/-/fluid-resolve-1.3.0.tgz", + "integrity": "sha1-ODAp6xphlpgCvYVoTI4obm0sDf0=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "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" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "requires": { + "globule": "1.2.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "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": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "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" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "minimatch": "3.0.4" + } + }, + "gpii-express": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/gpii-express/-/gpii-express-1.0.12.tgz", + "integrity": "sha1-UgcfZyS/7QcgQdlgFk2oDTwWymI=", + "dev": true, + "requires": { + "body-parser": "1.18.2", + "cookie-parser": "1.4.3", + "express": "4.16.2", + "express-session": "1.15.6", + "infusion": "3.0.0-dev.20171117T095227Z.67ff934" + }, + "dependencies": { + "infusion": { + "version": "3.0.0-dev.20171117T095227Z.67ff934", + "resolved": "https://registry.npmjs.org/infusion/-/infusion-3.0.0-dev.20171117T095227Z.67ff934.tgz", + "integrity": "sha1-0Ng2s0OqbbiMDez+rnHmJ11BQg4=", + "dev": true, + "requires": { + "fluid-resolve": "1.3.0" + } + } + } + }, + "gpii-launcher": { + "version": "1.0.0-dev.20171221T122035Z.edade23", + "resolved": "https://registry.npmjs.org/gpii-launcher/-/gpii-launcher-1.0.0-dev.20171221T122035Z.edade23.tgz", + "integrity": "sha1-s5n0F6AszEJlV1/Y1IZN1Pe8Ihc=", + "dev": true, + "requires": { + "infusion": "3.0.0-dev.20170724T165035Z.eee50c1", + "kettle": "1.7.0", + "yargs": "9.0.1" + } + }, + "gpii-testem": { + "version": "2.0.0-dev.20180110T125546Z.2aa56e8", + "resolved": "https://registry.npmjs.org/gpii-testem/-/gpii-testem-2.0.0-dev.20180110T125546Z.2aa56e8.tgz", + "integrity": "sha1-OVHud0FfXtTfA/EnwT0hj1Szqc0=", + "dev": true, + "requires": { + "gpii-express": "1.0.12", + "gpii-launcher": "1.0.0-dev.20171221T122035Z.edade23", + "infusion": "3.0.0-dev.20170724T165035Z.eee50c1", + "istanbul": "git://github.com/the-t-in-rtf/istanbul.git#828eb930add7bd663ca20649a917f3f3829e48c5", + "istanbul-lib-instrument": "1.9.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "node-jqunit": "1.1.8", + "nyc": "11.3.0", + "rimraf": "2.6.2", + "testem": "1.18.4" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "grunt": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz", + "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=", + "dev": true, + "requires": { + "coffee-script": "1.10.0", + "dateformat": "1.0.12", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.3.0", + "glob": "7.0.6", + "grunt-cli": "1.2.0", + "grunt-known-options": "1.1.0", + "grunt-legacy-log": "1.0.0", + "grunt-legacy-util": "1.0.0", + "iconv-lite": "0.4.19", + "js-yaml": "3.5.5", + "minimatch": "3.0.4", + "nopt": "3.0.6", + "path-is-absolute": "1.0.1", + "rimraf": "2.2.8" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "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" + } + }, + "grunt-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "dev": true, + "requires": { + "findup-sync": "0.3.0", + "grunt-known-options": "1.1.0", + "nopt": "3.0.6", + "resolve": "1.1.7" + } + }, + "js-yaml": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", + "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } + } + }, + "grunt-contrib-clean": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", + "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", + "dev": true, + "requires": { + "async": "1.5.2", + "rimraf": "2.6.2" + } + }, + "grunt-contrib-compress": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.4.3.tgz", + "integrity": "sha1-Ac7/ucY39S5wgfRjdQmD0KOw+nM=", + "dev": true, + "requires": { + "archiver": "1.3.0", + "chalk": "1.1.3", + "iltorb": "1.3.10", + "lodash": "4.17.4", + "pretty-bytes": "4.0.2", + "stream-buffers": "2.2.0" + } + }, + "grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "file-sync-cmp": "0.1.1" + } + }, + "grunt-contrib-stylus": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-stylus/-/grunt-contrib-stylus-1.2.0.tgz", + "integrity": "sha1-R9RG7wVESW7/naQY0A9XdFQ0crs=", + "dev": true, + "requires": { + "async": "1.5.2", + "chalk": "1.1.3", + "lodash": "4.17.4", + "nib": "1.1.2", + "stylus": "0.54.5" + } + }, + "grunt-contrib-uglify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-3.1.0.tgz", + "integrity": "sha1-ENHkhJIQ7JK/CwgkfiQYY1TV6e4=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "maxmin": "1.1.0", + "uglify-js": "3.0.28", + "uri-path": "1.0.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.28.tgz", + "integrity": "sha1-lrhJXwJylEeHtYQ6FnmqMmZA1fc=", + "dev": true, + "requires": { + "commander": "2.11.0", + "source-map": "0.5.7" + } + } + } + }, + "grunt-contrib-watch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", + "integrity": "sha1-hKGnodar0m7VaEE0lscxM+mQAY8=", + "dev": true, + "requires": { + "async": "1.5.2", + "gaze": "1.1.2", + "lodash": "3.10.1", + "tiny-lr": "0.2.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "grunt-jsonlint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-jsonlint/-/grunt-jsonlint-1.1.0.tgz", + "integrity": "sha1-ox7pckCu4/NDyiY8Rb1TIGMSfbI=", + "dev": true, + "requires": { + "jsonlint": "1.6.2", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "grunt-known-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", + "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "dev": true + }, + "grunt-legacy-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", + "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", + "dev": true, + "requires": { + "colors": "1.1.2", + "grunt-legacy-log-utils": "1.0.0", + "hooker": "0.2.3", + "lodash": "3.10.1", + "underscore.string": "3.2.3" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "grunt-legacy-log-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", + "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "lodash": "4.3.0" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", + "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "4.3.0", + "underscore.string": "3.2.3", + "which": "1.2.14" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + } + } + }, + "grunt-modulefiles": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/grunt-modulefiles/-/grunt-modulefiles-0.3.1.tgz", + "integrity": "sha1-hYjIVCWWc2a5ZxIOe7iE5oAPp3g=", + "dev": true, + "requires": { + "lodash": "4.13.1" + }, + "dependencies": { + "lodash": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=", + "dev": true + } + } + }, + "grunt-shell": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-2.1.0.tgz", + "integrity": "sha1-Q595FZ7RHmSmUaacyKPQK+v17MI=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "npm-run-path": "2.0.2" + } + }, + "gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", + "dev": true, + "requires": { + "browserify-zlib": "0.1.4", + "concat-stream": "1.6.0" + } + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "optional": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", + "dev": true, + "optional": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha1-ctnQdU9/4lyi0BrY+PmpRJqJUm0=", + "dev": true + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", + "dev": true + }, + "iltorb": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-1.3.10.tgz", + "integrity": "sha1-oNnk59Ur9RB0FEIjbL4MxCMPyfg=", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "0.2.0", + "nan": "2.8.0", + "node-gyp": "3.6.2", + "prebuild-install": "2.4.1" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "infusion": { + "version": "3.0.0-dev.20170724T165035Z.eee50c1", + "resolved": "https://registry.npmjs.org/infusion/-/infusion-3.0.0-dev.20170724T165035Z.eee50c1.tgz", + "integrity": "sha1-tF5RlzLPUF/xUE7QH1JCe1citEc=", + "dev": true, + "requires": { + "fluid-resolve": "1.3.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true, + "optional": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-my-json-valid": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", + "integrity": "sha1-PamJFKcKIvCoVj7xURokbG/FVHE=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-type": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/is-type/-/is-type-0.0.1.tgz", + "integrity": "sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w=", + "dev": true, + "requires": { + "core-util-is": "1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "istanbul": { + "version": "git://github.com/the-t-in-rtf/istanbul.git#828eb930add7bd663ca20649a917f3f3829e48c5", + "integrity": "sha1-dRpAwk/i8RCnDARfvlT3jWkKUz0=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.11", + "js-yaml": "3.10.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha1-JQsws1MeXTJRKZ/dZLCyydtrVY4=", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.5.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonlint": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz", + "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=", + "dev": true, + "requires": { + "JSV": "4.0.2", + "nomnom": "1.8.1" + } + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kettle": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/kettle/-/kettle-1.7.0.tgz", + "integrity": "sha1-Yb40SG6rp2LOV/MKR1cCR8ZIyvI=", + "dev": true, + "requires": { + "body-parser": "1.17.2", + "cookie-parser": "1.4.3", + "express": "4.15.4", + "express-session": "1.15.5", + "fluid-resolve": "1.3.0", + "infusion": "3.0.0-dev.20170830T182157Z.392b2f8", + "json5": "0.5.1", + "jsonlint": "1.6.2", + "path-to-regexp": "1.7.0", + "serve-static": "1.12.3", + "ws": "3.1.0" + }, + "dependencies": { + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "dev": true, + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.4", + "debug": "2.6.7", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.15", + "on-finished": "2.3.0", + "qs": "6.4.0", + "raw-body": "2.2.0", + "type-is": "1.6.15" + } + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "dev": true + }, + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "express": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", + "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.8", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.0.6", + "fresh": "0.5.0", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.5", + "qs": "6.5.0", + "range-parser": "1.2.0", + "send": "0.15.4", + "serve-static": "1.12.4", + "setprototypeof": "1.0.3", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vary": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha1-jQSVTTZN7z78VbWgeT4eLIsebkk=", + "dev": true + }, + "serve-static": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", + "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.4" + } + } + } + }, + "express-session": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.5.tgz", + "integrity": "sha1-9JoYInJjsxb2+FRNpf7iWlQCWew=", + "dev": true, + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "crc": "3.4.4", + "debug": "2.6.8", + "depd": "1.1.2", + "on-headers": "1.0.1", + "parseurl": "1.3.2", + "uid-safe": "2.1.5", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "dev": true + }, + "infusion": { + "version": "3.0.0-dev.20170830T182157Z.392b2f8", + "resolved": "https://registry.npmjs.org/infusion/-/infusion-3.0.0-dev.20170830T182157Z.392b2f8.tgz", + "integrity": "sha1-9OuvAM/uGpxX0FbuYMXi7vFTLok=", + "dev": true, + "requires": { + "fluid-resolve": "1.3.0" + } + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.4.0" + } + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.15", + "unpipe": "1.0.0" + } + }, + "send": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", + "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", + "dev": true, + "requires": { + "debug": "2.6.8", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.0", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "serve-static": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.3" + }, + "dependencies": { + "send": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", + "dev": true, + "requires": { + "debug": "2.6.7", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.0", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + } + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "livereload-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", + "integrity": "sha1-w6si6Kr1vzUF2A0JjLrWdyZUjJo=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._baseflatten": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", + "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", + "dev": true, + "requires": { + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", + "integrity": "sha1-gSIRw3ipTMKdWqTjNGzwv846ffU=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1" + } + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", + "dev": true + }, + "lodash.flatten": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-3.0.2.tgz", + "integrity": "sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w=", + "dev": true, + "requires": { + "lodash._baseflatten": "3.1.4", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "figures": "1.7.0", + "gzip-size": "1.0.0", + "pretty-bytes": "1.0.4" + }, + "dependencies": { + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "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": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "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": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mustache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", + "dev": true + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "nib": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz", + "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=", + "dev": true, + "requires": { + "stylus": "0.54.5" + } + }, + "node-abi": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.1.2.tgz", + "integrity": "sha1-TabKzrZoX80x590ZlO9rt9CpwLI=", + "dev": true, + "optional": true, + "requires": { + "semver": "5.5.0" + } + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.4", + "request": "2.83.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + } + } + }, + "node-jqunit": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/node-jqunit/-/node-jqunit-1.1.8.tgz", + "integrity": "sha1-Wq1LJ5hHVMoPZ1AmNPEwAt6+GNM=", + "dev": true, + "requires": { + "infusion": "3.0.0-dev.20171117T095227Z.67ff934" + }, + "dependencies": { + "infusion": { + "version": "3.0.0-dev.20171117T095227Z.67ff934", + "resolved": "https://registry.npmjs.org/infusion/-/infusion-3.0.0-dev.20171117T095227Z.67ff934.tgz", + "integrity": "sha1-0Ng2s0OqbbiMDez+rnHmJ11BQg4=", + "dev": true, + "requires": { + "fluid-resolve": "1.3.0" + } + } + } + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha1-+jE90I9VF9sOJQLldY1mSsafneo=", + "dev": true, + "requires": { + "growly": "1.3.0", + "semver": "5.5.0", + "shellwords": "0.1.1", + "which": "1.3.0" + } + }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "underscore": "1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "dev": true, + "optional": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "dev": true, + "requires": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.3.0.tgz", + "integrity": "sha1-pCvBezz6QfexXrYCvJiyYz3ddvA=", + "dev": true, + "requires": { + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.0", + "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.1.1", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-report": "1.1.2", + "istanbul-lib-source-maps": "1.2.2", + "istanbul-reports": "1.1.3", + "md5-hex": "1.3.0", + "merge-source-map": "1.0.4", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "spawn-wrap": "1.3.8", + "test-exclude": "4.1.1", + "yargs": "10.0.3", + "yargs-parser": "8.0.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "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": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "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-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "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" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "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": { + "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.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "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": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "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": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "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" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.3.8.tgz", + "integrity": "sha512-Yfkd7Yiwz4RcBPrDWzvhnTzQINBHNqOEhUzOdWZ67Y9b4wzs3Gz6ymuptQmRBpzlpOzroM7jwzmBdRec7JJ0UA==", + "dev": true, + "requires": { + "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": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz", + "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", + "dev": true, + "requires": { + "cliui": "3.2.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": "8.0.0" + }, + "dependencies": { + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + }, + "yargs-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz", + "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "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" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "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, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "optional": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prebuild-install": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.4.1.tgz", + "integrity": "sha1-wouh0e7cF/vWsyKaZX/8D7pHm0k=", + "dev": true, + "optional": true, + "requires": { + "expand-template": "1.1.0", + "github-from-package": "0.0.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "node-abi": "2.1.2", + "noop-logger": "0.1.1", + "npmlog": "4.1.2", + "os-homedir": "1.0.2", + "pump": "1.0.3", + "rc": "1.2.4", + "simple-get": "1.4.3", + "tar-fs": "1.16.0", + "tunnel-agent": "0.6.0", + "xtend": "4.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "printf": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/printf/-/printf-0.2.5.tgz", + "integrity": "sha1-xDjKLKM+OSdnHbSracDlL5NqTw8=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha1-Xf6DEcM7v2/BgmH580cCxHwIqVQ=", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "dev": true + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.4.tgz", + "integrity": "sha1-oPYGyq4qO4YrvQ74VILAElsxX6M=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", + "dev": true, + "optional": true, + "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", + "hawk": "6.0.2", + "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", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "dev": true + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "dev": true + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha1-TFfVNASnYdjy58HooYpH2/J4pxk=", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + }, + "shebang-command": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-get": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", + "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "unzip-response": "1.0.2", + "xtend": "4.0.1" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + }, + "socket.io": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.6.0.tgz", + "integrity": "sha1-PkDZMmN+a9kjmBslyvfFPoO24uE=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.0", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.6.0", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.6.0.tgz", + "integrity": "sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.0", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "spawn-args": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/spawn-args/-/spawn-args-0.2.0.tgz", + "integrity": "sha1-+30L0dcP1DFr2ePew4nmX51jYbs=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "optional": true, + "requires": { + "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", + "tweetnacl": "0.14.5" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", + "dev": true + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "styled_string": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/styled_string/-/styled_string-0.0.1.tgz", + "integrity": "sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko=", + "dev": true + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.0", + "debug": "2.6.9", + "glob": "7.0.6", + "mkdirp": "0.5.1", + "sax": "0.5.8", + "source-map": "0.1.43" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "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" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "tap-parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", + "integrity": "sha1-aQfolyXXt/pq5B7ixGTD20MYiuw=", + "dev": true, + "requires": { + "events-to-array": "1.1.2", + "js-yaml": "3.10.0", + "readable-stream": "2.3.3" + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-fs": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.0.tgz", + "integrity": "sha1-6HeiWsvMUdjHkNocV8nPQ5gXuJY=", + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "mkdirp": "0.5.1", + "pump": "1.0.3", + "tar-stream": "1.5.5" + } + }, + "tar-stream": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", + "integrity": "sha1-XK2Ed59FyDsfJQjZawnYjHIYr1U=", + "dev": true, + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.1", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "testem": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/testem/-/testem-1.18.4.tgz", + "integrity": "sha1-5F/tkivsL1SmFsQ/EZIlmKyX60E=", + "dev": true, + "requires": { + "backbone": "1.3.3", + "bluebird": "3.5.1", + "charm": "1.0.2", + "commander": "2.13.0", + "consolidate": "0.14.5", + "cross-spawn": "5.1.0", + "express": "4.16.2", + "fireworm": "0.7.1", + "glob": "7.1.2", + "http-proxy": "1.16.2", + "js-yaml": "3.10.0", + "lodash.assignin": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.find": "4.6.0", + "lodash.uniqby": "4.7.0", + "mkdirp": "0.5.1", + "mustache": "2.3.0", + "node-notifier": "5.2.1", + "npmlog": "4.1.2", + "printf": "0.2.5", + "rimraf": "2.6.2", + "socket.io": "1.6.0", + "spawn-args": "0.2.0", + "styled_string": "0.0.1", + "tap-parser": "5.4.0", + "xmldom": "0.1.27" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tiny-lr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", + "dev": true, + "requires": { + "body-parser": "1.14.2", + "debug": "2.2.0", + "faye-websocket": "0.10.0", + "livereload-js": "2.3.0", + "parseurl": "1.3.2", + "qs": "5.1.0" + }, + "dependencies": { + "body-parser": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", + "dev": true, + "requires": { + "bytes": "2.2.0", + "content-type": "1.0.4", + "debug": "2.2.0", + "depd": "1.1.2", + "http-errors": "1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "2.3.0", + "qs": "5.2.0", + "raw-body": "2.1.7", + "type-is": "1.6.15" + }, + "dependencies": { + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "dev": true + } + } + }, + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "qs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", + "dev": true + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "dev": true + } + } + } + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha1-Kz1cckDo/C5Y+Komnl7knAhXvTo=", + "dev": true, + "requires": { + "random-bytes": "1.0.0" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=", + "dev": true + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "underscore.string": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", + "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true, + "optional": true + }, + "uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", + "dev": true + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.9", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "ws": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.1.0.tgz", + "integrity": "sha1-ivr+zeq0bVcuU5fuiAc5Nnqi9Bw=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.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": "7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "requires": { + "archiver-utils": "1.3.0", + "compress-commons": "1.2.2", + "lodash": "4.17.4", + "readable-stream": "2.3.3" + } + } + } +} From 58cb15040fa8b525d8c94cc486b92738cd2497e0 Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Tue, 30 Jan 2018 15:03:28 +0100 Subject: [PATCH 10/19] FLUID-6223: Fixed various instances of `@param {Type} variable`. --- src/components/inlineEdit/js/InlineEdit.js | 68 +++++++++---------- .../inlineEdit/js/InlineEditIntegrations.js | 8 +-- src/components/progress/js/Progress.js | 16 ++--- .../reorderer/js/GeometricManager.js | 6 +- src/components/reorderer/js/ImageReorderer.js | 7 +- src/components/reorderer/js/ModuleLayout.js | 6 +- .../reorderer/js/ReordererDOMUtilities.js | 4 +- .../textfieldControl/js/Textfield.js | 6 +- src/components/undo/js/Undo.js | 4 +- .../uploader/js/DemoUploadManager.js | 2 +- src/components/uploader/js/FileQueueView.js | 14 ++-- src/components/uploader/js/Uploader.js | 12 ++-- src/framework/core/js/Fluid.js | 45 ++++++------ src/framework/core/js/FluidDOMUtilities.js | 10 +-- src/framework/core/js/FluidDebugging.js | 2 +- src/framework/core/js/FluidView.js | 34 +++++----- src/framework/core/js/ModelTransformation.js | 6 +- src/framework/core/js/ResourceLoader.js | 3 +- src/framework/core/js/jquery.keyboard-a11y.js | 7 +- src/framework/preferences/js/AuxBuilder.js | 10 +-- src/framework/preferences/js/PrefsEditor.js | 10 +-- .../preferences/js/PrimaryBuilder.js | 12 ++-- .../js/SeparatedPanelPrefsEditor.js | 6 +- src/framework/preferences/js/StarterGrades.js | 5 +- src/framework/preferences/js/Store.js | 10 +-- src/framework/renderer/js/fluidRenderer.js | 4 +- 26 files changed, 156 insertions(+), 161 deletions(-) diff --git a/src/components/inlineEdit/js/InlineEdit.js b/src/components/inlineEdit/js/InlineEdit.js index f1f69ce106..2e5ebee32a 100644 --- a/src/components/inlineEdit/js/InlineEdit.js +++ b/src/components/inlineEdit/js/InlineEdit.js @@ -251,8 +251,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Set up and style the edit field. If an edit field is not provided, * default markup is created for the edit field * - * @param {string} editStyle The default styling for the edit field - * @param {Object} editField The edit field markup provided by the integrator + * @param editStyle {string} The default styling for the edit field + * @param editField {Object} The edit field markup provided by the integrator * * @return eField The styled edit field */ @@ -267,9 +267,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Set up the edit container and append the edit field to the container. If an edit container * is not provided, default markup is created. * - * @param {Object} displayContainer The display mode container - * @param {Object} editField The edit field that is to be appended to the edit container - * @param {Object} editContainer The edit container markup provided by the integrator + * @param displayContainer {Object} The display mode container + * @param editField {Object} The edit field that is to be appended to the edit container + * @param editContainer {Object} The edit container markup provided by the integrator * * @return eContainer The edit container containing the edit field */ @@ -308,7 +308,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** Configures the edit container and view, and uses the component's editModeRenderer to render * the edit container. - * @param {boolean} lazyEditView If true, will delay rendering of the edit container; Default is false + * @param lazyEditView {boolean} If true, will delay rendering of the edit container; Default is false */ fluid.inlineEdit.renderEditContainer = function (that, lazyEditView) { that.editContainer = that.locate("editContainer"); @@ -331,8 +331,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }; /** Set up the edit mode instruction with aria in edit mode - * @param {String} editModeInstructionStyle The default styling for the instruction - * @param {String} editModeInstructionText The default instruction text + * @param editModeInstructionStyle {String} The default styling for the instruction + * @param editModeInstructionText {String} The default instruction text * @return {jQuery} The displayed instruction in edit mode */ fluid.inlineEdit.setupEditModeInstruction = function (editModeInstructionStyle, editModeInstructionText, editModeInstructionMarkup) { @@ -346,9 +346,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Positions the edit mode instruction directly beneath the edit container * - * @param {Object} editModeInstruction The displayed instruction in edit mode - * @param {Object} editContainer The edit container in edit mode - * @param {Object} editField The edit field in edit mode + * @param editModeInstruction {Object} The displayed instruction in edit mode + * @param editContainer {Object} The edit container in edit mode + * @param editField {Object} The edit field in edit mode */ fluid.inlineEdit.positionEditModeInstruction = function (editModeInstruction, editContainer, editField) { editContainer.append(editModeInstruction); @@ -373,8 +373,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Set up and style the display mode container for the viewEl and the textEditButton * - * @param {Object} styles The default styling for the display mode container - * @param {Object} displayModeWrapper The markup used to generate the display mode container + * @param styles {Object} The default styling for the display mode container + * @param displayModeWrapper {Object} The markup used to generate the display mode container * * @return {jQuery} The styled display mode container */ @@ -434,9 +434,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Update the textEditButton text with the current value of the field. * - * @param {Object} textEditButton the textEditButton - * @param {String} model The current value of the inline editable text - * @param {Object} strings Text option for the textEditButton + * @param textEditButton {Object} the textEditButton + * @param model {String} The current value of the inline editable text + * @param strings {Object} Text option for the textEditButton */ fluid.inlineEdit.updateTextEditButton = function (textEditButton, value, stringTemplate) { var buttonText = fluid.stringTemplate(stringTemplate, { @@ -448,8 +448,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Bind mouse hover event handler to the display mode container. * - * @param {Object} displayModeRenderer The display mode container - * @param {String} invitationStyle The default styling for the display mode container on mouse hover + * @param displayModeRenderer {Object} The display mode container + * @param invitationStyle {String} The default styling for the display mode container on mouse hover */ fluid.inlineEdit.bindHoverHandlers = function (displayModeRenderer, invitationStyle) { var over = function () { @@ -466,9 +466,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * * Note: This function is an unsupported, NON-API function * - * @param {Object} element The element to which the event handlers are bound - * @param {Object} displayModeRenderer The display mode container - * @param {Ojbect} styles The default styling for the display mode container on mouse hover + * @param element {Object} The element to which the event handlers are bound + * @param displayModeRenderer {Object} The display mode container + * @param styles {Ojbect} The default styling for the display mode container on mouse hover */ fluid.inlineEdit.bindHighlightHandler = function (element, displayModeRenderer, styles, strings, model) { element = $(element); @@ -489,8 +489,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Bind mouse click handler to an element * - * @param {Object} element The element to which the event handler is bound - * @param {Object} edit Function to invoke the edit mode + * @param element {Object} The element to which the event handler is bound + * @param edit {Object} Function to invoke the edit mode * * @return {boolean} Returns false if entering edit mode */ @@ -507,8 +507,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Bind keyboard press handler to an element * - * @param {Object} element The element to which the event handler is bound - * @param {Object} edit Function to invoke the edit mode + * @param element {Object} The element to which the event handler is bound + * @param edit {Object} Function to invoke the edit mode * * @return {boolean} Returns false if entering edit mode */ @@ -526,8 +526,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Creates an event handler that will trigger the edit mode if caused by something other * than standard HTML controls. The event handler will return false if entering edit mode. * - * @param {Object} element The element to trigger the edit mode - * @param {Object} edit Function to invoke the edit mode + * @param element {Object} The element to trigger the edit mode + * @param edit {Object} Function to invoke the edit mode * * @return {function} The event handler function */ @@ -689,8 +689,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Instantiates a new Inline Edit component * - * @param {Object} componentContainer a selector, jQuery, or a DOM element representing the component's container - * @param {Object} options a collection of options settings + * @param componentContainer {Object} a selector, jQuery, or a DOM element representing the component's container + * @param options {Object} a collection of options settings */ fluid.defaults("fluid.inlineEdit", { @@ -751,7 +751,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }, /** Updates the state of the inline editor in the DOM, based on changes that may have * happened to the model. - * @param {Object} source An optional source object identifying the source of the change (see ChangeApplier documentation) + * @param source {Object} An optional source object identifying the source of the change (see ChangeApplier documentation) */ refreshView: { funcName: "fluid.inlineEdit.refreshView", @@ -759,8 +759,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }, /** Pushes external changes to the model into the inline editor, refreshing its * rendering in the DOM. The modelChanged event will fire. - * @param {String} newValue The bare value of the model, that is, the string being edited - * @param {Object} source An optional "source" (perhaps a DOM element) which triggered this event + * @param newValue {String} The bare value of the model, that is, the string being edited + * @param source {Object} An optional "source" (perhaps a DOM element) which triggered this event */ updateModelValue: { funcName: "fluid.inlineEdit.updateModelValue", @@ -768,8 +768,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }, /** Pushes external changes to the model into the inline editor, refreshing its * rendering in the DOM. The modelChanged event will fire. This honours the "fluid.undoable" contract - * @param {Object} newValue The full value of the new model, that is, a model object which contains the editable value as the element named "value" - * @param {Object} source An optional "source" (perhaps a DOM element) which triggered this event + * @param newValue {Object} The full value of the new model, that is, a model object which contains the editable value as the element named "value" + * @param source {Object} An optional "source" (perhaps a DOM element) which triggered this event */ updateModel: { funcName: "fluid.inlineEdit.updateModelValue", diff --git a/src/components/inlineEdit/js/InlineEditIntegrations.js b/src/components/inlineEdit/js/InlineEditIntegrations.js index 20244d1a46..eec15b47f1 100644 --- a/src/components/inlineEdit/js/InlineEditIntegrations.js +++ b/src/components/inlineEdit/js/InlineEditIntegrations.js @@ -219,8 +219,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Instantiate a rich-text InlineEdit component that uses an instance of TinyMCE. * - * @param {Object} componentContainer the element containing the inline editors - * @param {Object} options configuration options for the components + * @param componentContainer {Object} the element containing the inline editors + * @param options {Object} configuration options for the components */ fluid.defaults("fluid.inlineEdit.tinyMCE", { @@ -398,8 +398,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Instantiate a drop-down InlineEdit component * - * @param {Object} container - * @param {Object} options + * @param container {Object} + * @param options {Object} */ fluid.defaults("fluid.inlineEdit.dropdown", { diff --git a/src/components/progress/js/Progress.js b/src/components/progress/js/Progress.js index ebc65371dc..2e0a08ad0a 100644 --- a/src/components/progress/js/Progress.js +++ b/src/components/progress/js/Progress.js @@ -151,8 +151,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Instantiates a new Progress component. * - * @param {jQuery|Selector|Element} container the DOM element in which the Uploader lives - * @param {Object} options configuration options for the component. + * @param container {jQuery|Selector|Element} the DOM element in which the Uploader lives + * @param options {Object} configuration options for the component. */ fluid.defaults("fluid.progress", { @@ -191,7 +191,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; invokers: { /** * Shows the progress bar if is currently hidden. - * @param {Object} animation a custom animation used when showing the progress bar + * @param animation {Object} a custom animation used when showing the progress bar */ show: { funcName: "fluid.progress.showProgress", @@ -199,8 +199,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; }, /** * Hides the progress bar if it is visible. - * @param {Number} delay the amount of time to wait before hiding - * @param {Object} animation a custom animation used when hiding the progress bar + * @param delay {Number} the amount of time to wait before hiding + * @param animation {Object} a custom animation used when hiding the progress bar */ hide: { funcName: "fluid.progress.hideProgress", @@ -210,9 +210,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Updates the state of the progress bar. * This will automatically show the progress bar if it is currently hidden. * Percentage is specified as a decimal value, but will be automatically converted if needed. - * @param {Number|String} percentage the current percentage, specified as a "float-ish" value - * @param {String} labelValue the value to set for the label; this can be an HTML string - * @param {Object} animationForShow the animation to use when showing the progress bar if it is hidden + * @param percentage {Number|String} the current percentage, specified as a "float-ish" value + * @param labelValue {String} the value to set for the label; this can be an HTML string + * @param animationForShow {Object} the animation to use when showing the progress bar if it is hidden */ update: { funcName: "fluid.progress.updateProgress", diff --git a/src/components/reorderer/js/GeometricManager.js b/src/components/reorderer/js/GeometricManager.js index f617f1c3e3..bf7d212546 100644 --- a/src/components/reorderer/js/GeometricManager.js +++ b/src/components/reorderer/js/GeometricManager.js @@ -570,9 +570,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** Determine the one amongst a set of rectangle targets which is the "best fit" * for an axial motion from a "base rectangle" (commonly arising from the case * of cursor key navigation). - * @param {Rectangle} baserect The base rectangl from which the motion is to be referred - * @param {fluid.direction} direction The direction of motion - * @param {Array of Rectangle holders} targets An array of objects "cache elements" + * @param baserect {Rectangle} The base rectangl from which the motion is to be referred + * @param direction {fluid.direction} The direction of motion + * @param targets {Array of Rectangle holders} An array of objects "cache elements" * for which the member rect is the holder of the rectangle to be tested. * @param disableWrap which is used to enable or disable wrapping of elements * @return The cache element which is the most appropriate for the requested motion. diff --git a/src/components/reorderer/js/ImageReorderer.js b/src/components/reorderer/js/ImageReorderer.js index 095a942256..03de7a0bce 100644 --- a/src/components/reorderer/js/ImageReorderer.js +++ b/src/components/reorderer/js/ImageReorderer.js @@ -89,7 +89,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * represent the order for each image. This default listener submits the form's default * action via AJAX. * - * @param {jQueryable} container the Image Reorderer's container element + * @param container {jQueryable} the Image Reorderer's container element */ fluid.reorderImages.createIDAfterMoveListener = function (container) { var reorderform = fluid.reorderImages.seekForm(container); @@ -117,10 +117,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Creates a new Lightbox instance from the specified parameters, providing full control over how * the Lightbox is configured. * - * @param {Object} container - * @param {Object} options + * @param container {Object} + * @param options {Object} */ - fluid.defaults("fluid.reorderImages", { gradeNames: ["fluid.reorderer"], layoutHandler: "fluid.gridLayoutHandler", diff --git a/src/components/reorderer/js/ModuleLayout.js b/src/components/reorderer/js/ModuleLayout.js index 077504a027..690779803b 100644 --- a/src/components/reorderer/js/ModuleLayout.js +++ b/src/components/reorderer/js/ModuleLayout.js @@ -69,9 +69,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Builds a layout object from a set of columns and modules. - * @param {jQuery} container - * @param {jQuery} columns - * @param {jQuery} portlets + * @param container {jQuery} + * @param columns {jQuery} + * @param portlets {jQuery} */ fluid.moduleLayout.layoutFromFlat = function (container, columns, portlets) { var layout = {}; diff --git a/src/components/reorderer/js/ReordererDOMUtilities.js b/src/components/reorderer/js/ReordererDOMUtilities.js index 196363ea50..cfc2a453dc 100644 --- a/src/components/reorderer/js/ReordererDOMUtilities.js +++ b/src/components/reorderer/js/ReordererDOMUtilities.js @@ -50,8 +50,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Inserts newChild as the next sibling of refChild. - * @param {Object} newChild - * @param {Object} refChild + * @param newChild {Object} + * @param refChild {Object} */ fluid.dom.insertAfter = function (newChild, refChild) { var nextSib = refChild.nextSibling; diff --git a/src/components/textfieldControl/js/Textfield.js b/src/components/textfieldControl/js/Textfield.js index 2e8df025fc..4888c01949 100644 --- a/src/components/textfieldControl/js/Textfield.js +++ b/src/components/textfieldControl/js/Textfield.js @@ -72,9 +72,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Sets the model value only if the new value is a valid number, and will reset the textfield to the current model * value otherwise. * - * @param {Object} that - the component - * @param {Number} value - the new numerical entry - * @param {String} path - the path into the model for which the value should be set + * @param that {Object} - the component + * @param value {Number} - the new numerical entry + * @param path {String} - the path into the model for which the value should be set */ fluid.textfield.setModelRestrictToNumbers = function (that, value, path) { var isNumber = !isNaN(Number(value)); diff --git a/src/components/undo/js/Undo.js b/src/components/undo/js/Undo.js index abdacbf9b2..c9c9dd9d09 100644 --- a/src/components/undo/js/Undo.js +++ b/src/components/undo/js/Undo.js @@ -96,8 +96,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Decorates a target component with the function of "undoability". This component is intended to be attached as a * subcomponent to the target component, which will bear a grade of "fluid.undoable" * - * @param {Object} component a "model-bearing" standard Fluid component to receive the "undo" functionality - * @param {Object} options a collection of options settings + * @param component {Object} a "model-bearing" standard Fluid component to receive the "undo" functionality + * @param options {Object} a collection of options settings */ fluid.defaults("fluid.undo", { diff --git a/src/components/uploader/js/DemoUploadManager.js b/src/components/uploader/js/DemoUploadManager.js index d800fde5f6..9ad3504b32 100644 --- a/src/components/uploader/js/DemoUploadManager.js +++ b/src/components/uploader/js/DemoUploadManager.js @@ -106,7 +106,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Invokes a function after a random delay by using setTimeout. - * @param {Function} fn the function to invoke + * @param fn {Function} the function to invoke */ fluid.invokeAfterRandomDelay = function (fn) { var delay = Math.floor(Math.random() * 200 + 100); diff --git a/src/components/uploader/js/FileQueueView.js b/src/components/uploader/js/FileQueueView.js index 1c66264e9c..d41ff75642 100644 --- a/src/components/uploader/js/FileQueueView.js +++ b/src/components/uploader/js/FileQueueView.js @@ -310,9 +310,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Creates a new File Queue view. * - * @param {jQuery|selector} container the file queue's container DOM element - * @param {fileQueue} queue a file queue model instance - * @param {Object} options configuration options for the view + * @param container {jQuery|selector} the file queue's container DOM element + * @param queue {fileQueue} a file queue model instance + * @param options {Object} configuration options for the view */ fluid.defaults("fluid.uploader.fileQueueView", { @@ -478,8 +478,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Simple component cover for the jQuery scrollTo plugin. Provides roughly equivalent * functionality to Uploader's old Scroller plugin. * - * @param {jQueryable} element the element to make scrollable - * @param {Object} options for the component + * @param element {jQueryable} the element to make scrollable + * @param options {Object} for the component * @return the scrollable component */ @@ -539,8 +539,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Wraps a table in order to make it scrollable with the jQuery.scrollTo plugin. * Container divs are injected to allow cross-browser support. * - * @param {jQueryable} table the table to make scrollable - * @param {Object} options configuration options + * @param table {jQueryable} the table to make scrollable + * @param options {Object} configuration options * @return the scrollable component */ diff --git a/src/components/uploader/js/Uploader.js b/src/components/uploader/js/Uploader.js index 732de0a470..479806d384 100644 --- a/src/components/uploader/js/Uploader.js +++ b/src/components/uploader/js/Uploader.js @@ -179,7 +179,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Pretty prints a file's size, converting from bytes to kilobytes or megabytes. * - * @param {Number} bytes the files size, specified as in number bytes. + * @param bytes {Number} the files size, specified as in number bytes. */ fluid.uploader.formatFileSize = function (bytes) { if (typeof (bytes) === "number") { @@ -336,8 +336,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Instantiates a new Uploader component. * - * @param {Object} container the DOM element in which the Uploader lives - * @param {Object} options configuration options for the component. + * @param container {Object} the DOM element in which the Uploader lives + * @param options {Object} configuration options for the component. */ fluid.defaults("fluid.uploader", { @@ -446,7 +446,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Removes the specified file from the upload queue. * - * @param {File} file the file to remove + * @param file {File} the file to remove */ removeFile: { funcName: "fluid.uploader.removeFile", @@ -781,8 +781,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * enhanceable Uploader, or call this directly if you only want a standard single file uploader. * But why would you want that? * - * @param {jQueryable} container the component's container - * @param {Object} options configuration options + * @param container {jQueryable} the component's container + * @param options {Object} configuration options */ fluid.defaults("fluid.uploader.singleFile", { diff --git a/src/framework/core/js/Fluid.js b/src/framework/core/js/Fluid.js index 612afd6cbe..057e8d4596 100644 --- a/src/framework/core/js/Fluid.js +++ b/src/framework/core/js/Fluid.js @@ -207,7 +207,7 @@ var fluid = fluid || fluid_3_0_0; * Signals an error to the framework. The default behaviour is to log a structured error message and throw an exception. This strategy may be configured using the legacy * API fluid.pushSoftFailure or else by adding and removing suitably namespaced listeners to the special event fluid.failureEvent * - * @param {String} message the error message to log + * @param message {String} the error message to log * @param ... Additional arguments, suitable for being sent to the native console.log function */ fluid.fail = function (/* message, ... */) { @@ -800,7 +800,7 @@ var fluid = fluid || fluid_3_0_0; /** * Clears an object or array of its contents. For objects, each property is deleted. * - * @param {Object|Array} target the target to be cleared + * @param target {Object|Array} the target to be cleared */ fluid.clear = function (target) { if (fluid.isArrayable(target)) { @@ -826,7 +826,7 @@ var fluid = fluid || fluid_3_0_0; /** * Returns the converted integer if the input string can be converted to an integer. Otherwise, return NaN. - * @param {String} a string to be returned in integer + * @param string {String} A string to be returned in integer form. */ fluid.parseInteger = function (string) { return isFinite(string) && ((string % 1) === 0) ? Number(string) : NaN; @@ -844,9 +844,9 @@ var fluid = fluid || fluid_3_0_0; * If the scale is invalid (i.e falsey, not a number, negative value), it is treated as 0. * If the scale is a floating point number, it is rounded to an integer. * - * @param {Number} num - the number to be rounded - * @param {Number} scale - the maximum number of decimal places to round to. - * @param {String} method - (optional) Request a rounding method to use ("round", "ceil", "floor"). + * @param num {Number} - the number to be rounded + * @param scale {Number} - the maximum number of decimal places to round to. + * @param method {String} - (optional) Request a rounding method to use ("round", "ceil", "floor"). * If nothing or an invalid method is provided, it will default to "round". * @return {Number} The num value rounded to the specified number of decimal places. */ @@ -868,9 +868,9 @@ var fluid = fluid || fluid_3_0_0; * Copied from Underscore.js 1.4.3 - see licence at head of this file * * Will execute the passed in function after the specified about of time since it was last executed. - * @param {Function} func - the function to execute - * @param {Number} wait - the number of milliseconds to wait before executing the function - * @param {Boolean} immediate - Whether to trigger the function at the start (true) or end (false) of + * @param func {Function} - the function to execute + * @param wait {Number} - the number of milliseconds to wait before executing the function + * @param immediate {Boolean} - Whether to trigger the function at the start (true) or end (false) of * the wait interval. */ fluid.debounce = function (func, wait, immediate) { @@ -975,7 +975,7 @@ var fluid = fluid || fluid_3_0_0; }; /** Parse an EL expression separated by periods (.) into its component segments. - * @param {String} EL The EL expression to be split + * @param EL {String} The EL expression to be split * @return {Array of String} the component path expressions. * TODO: This needs to be upgraded to handle (the same) escaping rules (as RSF), so that * path segments containing periods and backslashes etc. can be processed, and be harmonised @@ -1142,7 +1142,7 @@ var fluid = fluid || fluid_3_0_0; /** Evaluates an EL expression by fetching a dot-separated list of members * recursively from a provided root. * @param root The root data structure in which the EL expression is to be evaluated - * @param {string/array} EL The EL expression to be evaluated, or an array of path segments + * @param EL {string/array} The EL expression to be evaluated, or an array of path segments * @param config An optional configuration or environment structure which can customise the fetch operation * @return The fetched data value. */ @@ -1163,9 +1163,9 @@ var fluid = fluid || fluid_3_0_0; /** * Allows for the binding to a "this-ist" function - * @param {Object} obj, "this-ist" object to bind to - * @param {Object} fnName, the name of the function to call - * @param {Object} args, arguments to call the function with + * @param obj, {Object} "this-ist" object to bind to + * @param fnName, {Object} the name of the function to call + * @param args, {Object} arguments to call the function with */ fluid.bind = function (obj, fnName, args) { return obj[fnName].apply(obj, fluid.makeArray(args)); @@ -1173,9 +1173,9 @@ var fluid = fluid || fluid_3_0_0; /** * Allows for the calling of a function from an EL expression "functionPath", with the arguments "args", scoped to an framework version "environment". - * @param {Object} functionPath - An EL expression - * @param {Object} args - An array of arguments to be applied to the function, specified in functionPath - * @param {Object} environment - (optional) The object to scope the functionPath to (typically the framework root for version control) + * @param functionPath {Object} - An EL expression + * @param args {Object} - An array of arguments to be applied to the function, specified in functionPath + * @param environment {Object} - (optional) The object to scope the functionPath to (typically the framework root for version control) */ fluid.invokeGlobalFunction = function (functionPath, args, environment) { var func = fluid.getGlobalValue(functionPath, environment); @@ -1441,7 +1441,7 @@ var fluid = fluid || fluid_3_0_0; * listeners, to which "events" can be fired. These events consist of an arbitrary * function signature. General documentation on the Fluid events system is at * http://docs.fluidproject.org/infusion/development/InfusionEventSystem.html . - * @param {Object} options - A structure to configure this event firer. Supported fields: + * @param options {Object} - A structure to configure this event firer. Supported fields: * {String} name - a readable name for this firer to be used in diagnostics and debugging * {Boolean} preventable - If true the return value of each handler will * be checked for false in which case further listeners will be shortcircuited, and this @@ -1722,8 +1722,7 @@ var fluid = fluid || fluid_3_0_0; /** * Configure the behaviour of fluid.fail by pushing or popping a disposition record onto a stack. - * @param {Number|Function} condition - & Supply either a function, which will be called with two arguments, args (the complete arguments to + * @param condition {Number|Function} - Supply either a function, which will be called with two arguments, args (the complete arguments to * fluid.fail) and activity, an array of strings describing the current framework invocation state. * Or, the argument may be the number -1 indicating that the previously supplied disposition should * be popped off the stack @@ -2399,11 +2398,11 @@ var fluid = fluid || fluid_3_0_0; * Merges the component's declared defaults, as obtained from fluid.defaults(), * with the user's specified overrides. * - * @param {Object} that the instance to attach the options to - * @param {String} componentName the unique "name" of the component, which will be used + * @param that {Object} the instance to attach the options to + * @param componentName {String} the unique "name" of the component, which will be used * to fetch the default options from store. By recommendation, this should be the global * name of the component's creator function. - * @param {Object} userOptions the user-specified configuration options for this component + * @param userOptions {Object} the user-specified configuration options for this component */ // unsupported, NON-API function fluid.mergeComponentOptions = function (that, componentName, userOptions, localOptions) { diff --git a/src/framework/core/js/FluidDOMUtilities.js b/src/framework/core/js/FluidDOMUtilities.js index d53ae73557..eeb1183b77 100644 --- a/src/framework/core/js/FluidDOMUtilities.js +++ b/src/framework/core/js/FluidDOMUtilities.js @@ -47,9 +47,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Reorderer component. General clients of the framework should use this method with caution if at all, and * the performance issues should be reassessed when we have time. * - * @param {Element} node the node to start walking from - * @param {Function} acceptor the function to invoke with each DOM element - * @param {Boolean} allnodes Use true to call acceptor on all nodes, + * @param node {Element} the node to start walking from + * @param acceptor {Function} the function to invoke with each DOM element + * @param allnodes {Boolean} Use true to call acceptor on all nodes, * rather than just element nodes (type 1) */ fluid.dom.iterateDom = function (node, acceptor, allNodes) { @@ -82,8 +82,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Checks if the specified container is actually the parent of containee. * - * @param {Element} container the potential parent - * @param {Element} containee the child in question + * @param container {Element} the potential parent + * @param containee {Element} the child in question */ fluid.dom.isContainer = function (container, containee) { for (; containee; containee = containee.parentNode) { diff --git a/src/framework/core/js/FluidDebugging.js b/src/framework/core/js/FluidDebugging.js index d0b20dd477..b176afdda1 100644 --- a/src/framework/core/js/FluidDebugging.js +++ b/src/framework/core/js/FluidDebugging.js @@ -261,7 +261,7 @@ var fluid = fluid || fluid_3_0_0; * Dumps a DOM element into a readily recognisable form for debugging - produces a * "semi-selector" summarising its tag name, class and id, whichever are set. * - * @param {jQueryable} element The element to be dumped + * @param element {jQueryable} The element to be dumped * @return A string representing the element. */ fluid.dumpEl = function (element) { diff --git a/src/framework/core/js/FluidView.js b/src/framework/core/js/FluidView.js index d6edf9860e..17380f3b1a 100644 --- a/src/framework/core/js/FluidView.js +++ b/src/framework/core/js/FluidView.js @@ -76,8 +76,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * it ensures to wrap a null or otherwise falsy argument to itself, rather than the * often unhelpful jQuery default of returning the overall document node. * - * @param {Object} obj the object to wrap in a jQuery - * @param {jQuery} userJQuery the jQuery object to use for the wrapping, optional - use the current jQuery if absent + * @param obj {Object} the object to wrap in a jQuery + * @param userJQuery {jQuery} the jQuery object to use for the wrapping, optional - use the current jQuery if absent */ fluid.wrap = function (obj, userJQuery) { userJQuery = userJQuery || $; @@ -87,7 +87,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * If obj is a jQuery, this function will return the first DOM element within it. Otherwise, the object will be returned unchanged. * - * @param {jQuery} obj the jQuery instance to unwrap into a pure DOM element + * @param obj {jQuery} the jQuery instance to unwrap into a pure DOM element */ fluid.unwrap = function (obj) { return obj && obj.jquery ? obj[0] : obj; @@ -96,8 +96,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Fetches a single container element and returns it as a jQuery. * - * @param {String||jQuery||element} containerSpec an id string, a single-element jQuery, or a DOM element specifying a unique container - * @param {Boolean} fallible true if an empty container is to be reported as a valid condition + * @param containerSpec {String||jQuery||element} an id string, a single-element jQuery, or a DOM element specifying a unique container + * @param fallible {Boolean} true if an empty container is to be reported as a valid condition * @return a single-element jQuery of container */ fluid.container = function (containerSpec, fallible, userJQuery) { @@ -137,8 +137,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Creates a new DOM Binder instance, used to locate elements in the DOM by name. * - * @param {Object} container the root element in which to locate named elements - * @param {Object} selectors a collection of named jQuery selectors + * @param container {Object} the root element in which to locate named elements + * @param selectors {Object} a collection of named jQuery selectors */ fluid.createDomBinder = function (container, selectors) { // don't put on a typename to avoid confusing primitive visitComponentChildren @@ -233,12 +233,12 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * component. This function automatically merges user options with defaults, * attaches a DOM Binder to the instance, and configures events. * - * @param {String} componentName The unique "name" of the component, which will be used + * @param componentName {String} The unique "name" of the component, which will be used * to fetch the default options from store. By recommendation, this should be the global * name of the component's creator function. - * @param {jQueryable} container A specifier for the single root "container node" in the + * @param container {jQueryable} A specifier for the single root "container node" in the * DOM which will house all the markup for this component. - * @param {Object} userOptions The configuration options for this component. + * @param userOptions {Object} The configuration options for this component. */ // 4th argument is NOT SUPPORTED, see comments for initLittleComponent fluid.initView = function (componentName, containerSpec, userOptions, localOptions) { @@ -270,7 +270,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Creates a new DOM Binder instance for the specified component and mixes it in. * - * @param {Object} that the component instance to attach the new DOM Binder to + * @param that {Object} the component instance to attach the new DOM Binder to */ fluid.initDomBinder = function (that, selectors) { if (!that.container) { @@ -287,8 +287,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Finds the nearest ancestor of the element that matches a predicate - * @param {Element} element DOM element - * @param {Function} test A function (predicate) accepting a DOM element, returning a truthy value representing a match + * @param element {Element} DOM element + * @param test {Function} A function (predicate) accepting a DOM element, returning a truthy value representing a match * @return The first element parent for which the predicate returns truthy - or undefined if no parent matches */ fluid.findAncestor = function (element, test) { @@ -443,8 +443,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Returns an DOM element quickly, given an id * - * @param {Object} id the id of the DOM node to find - * @param {Document} dokkument the document in which it is to be found (if left empty, use the current document) + * @param id {Object} the id of the DOM node to find + * @param dokkument {Document} the document in which it is to be found (if left empty, use the current document) * @return The DOM element with this id, or null, if none exists in the document. */ fluid.byId = function (id, dokkument) { @@ -466,7 +466,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Returns the id attribute from a jQuery or pure DOM element. * - * @param {jQuery||Element} element the element to return the id attribute for + * @param element {jQuery||Element} the element to return the id attribute for */ fluid.getId = function (element) { return fluid.unwrap(element).id; @@ -493,7 +493,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Returns the document to which an element belongs, or the element itself if it is already a document * - * @param {jQuery||Element} element The element to return the document for + * @param element {jQuery||Element} The element to return the document for * @return {Document} dokkument The document in which it is to be found */ fluid.getDocument = function (element) { diff --git a/src/framework/core/js/ModelTransformation.js b/src/framework/core/js/ModelTransformation.js index e61c967530..5b00c0d3a0 100644 --- a/src/framework/core/js/ModelTransformation.js +++ b/src/framework/core/js/ModelTransformation.js @@ -610,9 +610,9 @@ var fluid = fluid || fluid_3_0_0; * } * } * - * @param {Object} source the model to transform - * @param {Object} rules a rules object containing instructions on how to transform the model - * @param {Object} options a set of rules governing the transformations. At present this may contain + * @param source {Object} the model to transform + * @param rules {Object} a rules object containing instructions on how to transform the model + * @param options {Object} a set of rules governing the transformations. At present this may contain * the values isomorphic: true indicating that the output model is to be governed by the * same schema found in the input model, or flatSchema holding a flat schema object which * consists of a hash of EL path specifications with wildcards, to the values "array"/"object" defining diff --git a/src/framework/core/js/ResourceLoader.js b/src/framework/core/js/ResourceLoader.js index 1e41e063cd..7ff5ac3ef3 100644 --- a/src/framework/core/js/ResourceLoader.js +++ b/src/framework/core/js/ResourceLoader.js @@ -22,9 +22,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * resources are loaded, the event `onResourceLoaded` will be fired, which can be used * to time the creation of components dependent on the resources. * - * @param {Object} options + * @param options {Object} */ - fluid.defaults("fluid.resourceLoader", { gradeNames: ["fluid.component"], listeners: { diff --git a/src/framework/core/js/jquery.keyboard-a11y.js b/src/framework/core/js/jquery.keyboard-a11y.js index 60baabf7a0..e88127a55e 100644 --- a/src/framework/core/js/jquery.keyboard-a11y.js +++ b/src/framework/core/js/jquery.keyboard-a11y.js @@ -34,9 +34,8 @@ var fluid = fluid || fluid_3_0_0; * permitting chaining to occur. However, as a courtesy, the particular "this" returned * will be augmented with a function that() which will allow the original return * value to be retrieved if desired. - * @param {String} name The name under which the "plugin space" is to be injected into - * JQuery - * @param {Object} peer The root of the namespace corresponding to the peer object. + * @param name {String} The name under which the "plugin space" is to be injected into JQuery + * @param peer {Object} The root of the namespace corresponding to the peer object. */ fluid.thatistBridge = function (name, peer) { @@ -112,7 +111,7 @@ var fluid = fluid || fluid_3_0_0; * Gets the value of the tabindex attribute for the first item, or sets the tabindex value of all elements * if toIndex is specified. * - * @param {String|Number} toIndex + * @param toIndex {String|Number} */ fluid.tabindex = function (target, toIndex) { target = $(target); diff --git a/src/framework/preferences/js/AuxBuilder.js b/src/framework/preferences/js/AuxBuilder.js index 96647d59ab..29a89580b2 100644 --- a/src/framework/preferences/js/AuxBuilder.js +++ b/src/framework/preferences/js/AuxBuilder.js @@ -33,8 +33,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Takes a template string containing tokens in the form of "@source-path-to-value". * Returns a value (any type) or undefined if the path is not found. * - * @param {object} root an object to retrieve the returned value from - * @param {String} pathRef a string that the path to the requested value is embedded into + * @param root {object} an object to retrieve the returned value from + * @param pathRef {String} a string that the path to the requested value is embedded into * * Example: * 1. Parameters: @@ -195,9 +195,9 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * Expands a all "@" path references from an auxiliary schema. * Note that you cannot chain "@" paths. * - * @param {object} schemaToExpand the shcema which will be expanded - * @param {object} altSource an alternative look up object. This is primarily used for the internal recursive call. - * @return {object} an expaneded version of the schema. + * @param schemaToExpand {object} the schema which will be expanded + * @param altSource {object} an alternative look up object. This is primarily used for the internal recursive call. + * @return {object} an expanded version of the schema. */ fluid.prefs.expandSchemaImpl = function (schemaToExpand, altSource) { var expandedSchema = fluid.copy(schemaToExpand); diff --git a/src/framework/preferences/js/PrefsEditor.js b/src/framework/preferences/js/PrefsEditor.js index 03b9d6b7d5..8f6450dd8d 100644 --- a/src/framework/preferences/js/PrefsEditor.js +++ b/src/framework/preferences/js/PrefsEditor.js @@ -26,7 +26,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * An Preferences Editor top-level component that reflects the collaboration between prefsEditor, templateLoader and messageLoader. * This component is the only Preferences Editor component that is intended to be called by the outside world. * - * @param {Object} options + * @param options {Object} */ fluid.defaults("fluid.prefs.prefsEditorLoader", { gradeNames: ["fluid.prefs.settingsGetter", "fluid.prefs.initialModel", "fluid.viewComponent"], @@ -214,8 +214,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * interface for setting and saving personal preferences, and the UI Enhancer component carries out the * work of applying those preferences to the user interface. * - * @param {Object} container - * @param {Object} options + * @param container {Object} + * @param options {Object} */ fluid.defaults("fluid.prefs.prefsEditor", { gradeNames: ["fluid.prefs.settingsGetter", "fluid.prefs.settingsSetter", "fluid.prefs.initialModel", "fluid.viewComponent"], @@ -223,8 +223,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Updates the change applier and fires modelChanged on subcomponent fluid.prefs.controls * - * @param {Object} newModel - * @param {Object} source + * @param newModel {Object} + * @param source {Object} */ fetch: { funcName: "fluid.prefs.prefsEditor.fetch", diff --git a/src/framework/preferences/js/PrimaryBuilder.js b/src/framework/preferences/js/PrimaryBuilder.js index ab9fc9b50d..89c499d112 100644 --- a/src/framework/preferences/js/PrimaryBuilder.js +++ b/src/framework/preferences/js/PrimaryBuilder.js @@ -20,8 +20,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * A custom merge policy that merges primary schema blocks and * places them in the right location (consistent with the JSON schema * format). - * @param {JSON} target A base for merging the options. - * @param {JSON} source Options being merged. + * @param target {JSON} A base for merging the options. + * @param source {JSON} Options being merged. * @return {JSON} Updated target. */ fluid.prefs.schemas.merge = function (target, source) { @@ -75,11 +75,11 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * An invoker method that builds a list of grades that comprise a final * version of the primary schema. - * @param {JSON} schemaIndex A global index of all schema grades + * @param schemaIndex {JSON} A global index of all schema grades * registered with the framework. - * @param {Array} typeFilter A list of all necessarry top level + * @param typeFilter {Array} A list of all necessarry top level * preference names. - * @param {JSON} primarySchema Primary schema provided as an option to + * @param primarySchema {JSON} Primary schema provided as an option to * the primary builder. * @return {Array} A list of schema grades. */ @@ -107,7 +107,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * An index function that indexes all shcema grades based on their * preference name. - * @param {JSON} defaults Registered defaults for a schema grade. + * @param defaults {JSON} Registered defaults for a schema grade. * @return {String} A preference name. */ fluid.prefs.primaryBuilder.defaultSchemaIndexer = function (defaults) { diff --git a/src/framework/preferences/js/SeparatedPanelPrefsEditor.js b/src/framework/preferences/js/SeparatedPanelPrefsEditor.js index 8dcf6be133..e1a757b394 100644 --- a/src/framework/preferences/js/SeparatedPanelPrefsEditor.js +++ b/src/framework/preferences/js/SeparatedPanelPrefsEditor.js @@ -416,10 +416,10 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; * allowing for pre-loading of a subset of resources. This is required for the lazyLoading workflow * for the "fluid.prefs.separatedPanel.lazyLoad". * - * @param {Object} that - the component - * @param {Object} resource - all of the resourceSpecs to load, including preload and others. + * @param that {Object} - the component + * @param resource {Object} - all of the resourceSpecs to load, including preload and others. * see: fluid.fetchResources - * @param {Array/String} toPreload - a String or an Array of Strings corresponding to the names + * @param toPreload {Array/String} - a String or an Array of Strings corresponding to the names * of the resources, supplied in the resource argument, that * should be loaded. Only these resources will be loaded. */ diff --git a/src/framework/preferences/js/StarterGrades.js b/src/framework/preferences/js/StarterGrades.js index f2ff6d193e..ab94e7e300 100644 --- a/src/framework/preferences/js/StarterGrades.js +++ b/src/framework/preferences/js/StarterGrades.js @@ -291,7 +291,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * A template loader component that expands the resources blocks for loading resources used by starterPanels * - * @param {Object} options + * @param options {Object} */ fluid.defaults("fluid.prefs.starterTemplateLoader", { @@ -334,9 +334,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * A message loader component that expands the resources blocks for loading messages for starter panels * - * @param {Object} options + * @param options {Object} */ - fluid.defaults("fluid.prefs.starterMessageLoader", { gradeNames: ["fluid.resourceLoader"], resources: { diff --git a/src/framework/preferences/js/Store.js b/src/framework/preferences/js/Store.js index 526169e106..a9c8929921 100644 --- a/src/framework/preferences/js/Store.js +++ b/src/framework/preferences/js/Store.js @@ -44,7 +44,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * SettingsStore Subcomponent that uses a cookie for persistence. - * @param {Object} options + * @param options {Object} */ fluid.defaults("fluid.prefs.cookieStore", { gradeNames: ["fluid.prefs.dataSource"], @@ -98,7 +98,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Assembles the cookie string - * @param {Object} cookie settings + * @param cookie {Object} settings */ fluid.prefs.cookieStore.assembleCookie = function (cookieOptions) { var cookieStr = cookieOptions.name + "=" + cookieOptions.data; @@ -116,8 +116,8 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * Saves the settings into a cookie - * @param {Object} settings - * @param {Object} cookieOptions + * @param settings {Object} + * @param cookieOptions {Object} */ fluid.prefs.cookieStore.set = function (settings, cookieOptions) { cookieOptions.data = encodeURIComponent(JSON.stringify(settings)); @@ -131,7 +131,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; /** * SettingsStore mock that doesn't do persistence. - * @param {Object} options + * @param options {Object} */ fluid.defaults("fluid.prefs.tempStore", { gradeNames: ["fluid.prefs.dataSource", "fluid.modelComponent"], diff --git a/src/framework/renderer/js/fluidRenderer.js b/src/framework/renderer/js/fluidRenderer.js index d94a4e17de..e3d767d348 100644 --- a/src/framework/renderer/js/fluidRenderer.js +++ b/src/framework/renderer/js/fluidRenderer.js @@ -1435,8 +1435,8 @@ fluid_3_0_0 = fluid_3_0_0 || {}; /** * A common utility function to make a simple view of rows, where each row has a selection control and a label - * @param {Object} optionlist An array of the values of the options in the select - * @param {Object} opts An object with this structure: { + * @param optionlist {Object} An array of the values of the options in the select + * @param opts {Object} An object with this structure: { selectID: "", rowID: "", inputID: "", From 048916ef12cc4d1c4ec398e15b5ca220647ff871 Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Wed, 31 Jan 2018 10:44:36 +0100 Subject: [PATCH 11/19] FLUID-6223: Euthanised the previous word salad masquerading as proper JSDocs for fluid.reorderLayout. --- src/components/reorderer/js/LayoutReorderer.js | 11 ++++++----- src/framework/core/js/Fluid.js | 5 ++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/reorderer/js/LayoutReorderer.js b/src/components/reorderer/js/LayoutReorderer.js index 0894ea244a..b01c8dc49a 100644 --- a/src/components/reorderer/js/LayoutReorderer.js +++ b/src/components/reorderer/js/LayoutReorderer.js @@ -16,11 +16,12 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; "use strict"; /** - * Simple way to create a layout reorderer. - * @param {selector} a jQueryable (selector, element, jQuery) for the layout container - * @param {Object} a map of selectors for columns and modules within the layout - * @param {Function} a function to be called when the order changes - * @param {Object} additional configuration options + * A convenience function for applying the Reorderer to portlets, content blocks, or other chunks of layout with + * minimal effort. + * + * @param container {String|Object} A CSS-based selector, single-element jQuery object, or DOM element that identifies the DOM element containing the layout. + * @param userOptions {Object} An optional collection of key/value pairs that can be used to further configure the Layout Reorderer. See: https://wiki.fluidproject.org/display/docs/Layout+Reorderer+API + * @return {Object} A newly constructed reorderer component. */ fluid.reorderLayout = function (container, userOptions) { var assembleOptions = { diff --git a/src/framework/core/js/Fluid.js b/src/framework/core/js/Fluid.js index 057e8d4596..f56a8e631a 100644 --- a/src/framework/core/js/Fluid.js +++ b/src/framework/core/js/Fluid.js @@ -1954,10 +1954,9 @@ var fluid = fluid || fluid_3_0_0; /** * Retrieves and stores a grade's configuration centrally. - * @param {String} gradeName the name of the grade whose options are to be read or written - * @param {Object} (optional) an object containing the options to be set + * @param gradeName {String} The name of the grade whose options are to be read or written + * @param options {Object} An (optional) object containing the options to be set */ - fluid.defaults = function (componentName, options) { if (options === undefined) { return fluid.getMergedDefaults(componentName); From 6734a2b03727e1d0982bb107d596a7929a8b7a33 Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Thu, 8 Feb 2018 12:21:57 +0100 Subject: [PATCH 12/19] FLUID-6223: Added tests and guards for `null` values when flattening objects using `fluid.flattenObjectPaths`. --- src/framework/core/js/Fluid.js | 2 +- tests/framework-tests/core/js/FluidJSTests.js | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/framework/core/js/Fluid.js b/src/framework/core/js/Fluid.js index f56a8e631a..407efc754d 100644 --- a/src/framework/core/js/Fluid.js +++ b/src/framework/core/js/Fluid.js @@ -2893,7 +2893,7 @@ var fluid = fluid || fluid_3_0_0; fluid.flattenObjectPaths = function (originalObject) { var flattenedObject = {}; fluid.each(originalObject, function (value, key) { - if (typeof value === "object") { + if (value !== null && typeof value === "object") { var flattenedSubObject = fluid.flattenObjectPaths(value); fluid.each(flattenedSubObject, function (subValue, subKey) { flattenedObject[key + "." + subKey] = subValue; diff --git a/tests/framework-tests/core/js/FluidJSTests.js b/tests/framework-tests/core/js/FluidJSTests.js index 2ee3e51c8d..13963e2b7b 100644 --- a/tests/framework-tests/core/js/FluidJSTests.js +++ b/tests/framework-tests/core/js/FluidJSTests.js @@ -404,7 +404,7 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt } } }; - var output = fluid.flattenObjectPaths(originalObject); + var output = fluid.flattenObjectPaths(originalObject); var expectedValue = { "path": "[object Object]", "path.to": "[object Object]", @@ -423,29 +423,35 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt }); jqUnit.test("flattenObjectPaths: top-level array", function () { - var originalObject = ["monkey", "fighting", "snakes"]; - var output = fluid.flattenObjectPaths(originalObject); + var output = fluid.flattenObjectPaths(["monkey", "fighting", "snakes"]); jqUnit.assertDeepEq("A top-level array should be flattened correctly.", { 0: "monkey", 1: "fighting", 2: "snakes"}, output); }); jqUnit.test("flattenObjectPaths: deep array", function () { - var originalObject = { "plane": ["monday", "to", "friday"]}; - var output = fluid.flattenObjectPaths(originalObject); + var output = fluid.flattenObjectPaths({ "plane": ["monday", "to", "friday"]}); jqUnit.assertDeepEq("A deep array should be flattened correctly.", { "plane": "monday,to,friday", "plane.0": "monday", "plane.1": "to", "plane.2": "friday"}, output); }); jqUnit.test("flattenObjectPaths: deep empty objects", function () { - var originalObject = { deeply: { empty: {}, nonEmpty: true }}; - var output = fluid.flattenObjectPaths(originalObject); + var output = fluid.flattenObjectPaths({ deeply: { empty: {}, nonEmpty: true }}); jqUnit.assertDeepEq("A deep empty object should be handled appropriately.", { "deeply": "[object Object]", "deeply.empty": "[object Object]", "deeply.nonEmpty": true }, output); }); jqUnit.test("flattenObjectPaths: empty object", function () { - var originalObject = {}; - var output = fluid.flattenObjectPaths(originalObject); + var output = fluid.flattenObjectPaths({}); jqUnit.assertDeepEq("A top-level empty object should be handled correctly.", {}, output); }); + jqUnit.test("flattenObjectPaths: root value is null", function () { + var output = fluid.flattenObjectPaths(null); + jqUnit.assertDeepEq("A top-level null value should be handled correctly.", {}, output); + }); + + jqUnit.test("flattenObjectPaths: deep value is null", function () { + var output = fluid.flattenObjectPaths({ deep: { value: null} }); + jqUnit.assertDeepEq("A top-level null value should be handled correctly.", { "deep.value": null, "deep": "[object Object]" }, output); + }); + jqUnit.test("stringTemplate: greedy", function () { var template = "%tenant/%tenantname", tenant = "../tenant", From 29647030abc59299270e4619a593366310fc82d2 Mon Sep 17 00:00:00 2001 From: Tony Atkins Date: Thu, 8 Feb 2018 12:42:06 +0100 Subject: [PATCH 13/19] FLUID-6223: Added new `MessageResolver.js` file to Node.js includes. --- src/module/includes.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/module/includes.json b/src/module/includes.json index 1265dfd75c..c58d1ea364 100644 --- a/src/module/includes.json +++ b/src/module/includes.json @@ -7,6 +7,7 @@ "../framework/core/js/FluidRequests.js", "../framework/core/js/DataBinding.js", "../framework/core/js/JavaProperties.js", + "../framework/core/js/MessageResolver.js", "../framework/enhancement/js/ContextAwareness.js", "../framework/core/js/ModelTransformation.js", "../framework/core/js/ModelTransformationTransforms.js", From cdc5cc19fa3eb430f6dcb8579ed503137e81a6bd Mon Sep 17 00:00:00 2001 From: Justin Obara Date: Mon, 12 Feb 2018 15:04:16 -0500 Subject: [PATCH 14/19] FLUID-6246: Adding in the missing MessageResolver.js dependency. --- demos/inlineEdit/index.html | 1 + demos/keyboard-a11y/index.html | 1 + demos/overviewPanel/index.html | 1 + demos/pager/index.html | 1 + demos/prefsFramework/index.html | 1 + demos/progress/index.html | 1 + demos/renderer/index.html | 1 + demos/reorderer/gridReorderer/index.html | 1 + demos/reorderer/imageReorderer/index.html | 1 + demos/reorderer/layoutReorderer/index.html | 1 + demos/reorderer/listReorderer/index.html | 1 + demos/switch/index.html | 1 + demos/tableOfContents/index.html | 1 + demos/textfieldControl/index.html | 1 + demos/uiOptions/index.html | 1 + demos/uploader/index.html | 1 + examples/components/pager/annotateSortedColumn/index.html | 1 + examples/components/pager/initialPageIndex/index.html | 1 + examples/components/reorderer/tableRow/index.html | 1 + .../preferences/conditionalAdjusters-singlePanel/index.html | 1 + examples/framework/preferences/conditionalAdjusters/index.html | 1 + examples/framework/preferences/fullPagePanelStyle/index.html | 1 + examples/framework/preferences/minimalEditor/index.html | 1 + examples/framework/preferences/minimalFootprint/fullPage.html | 1 + examples/framework/preferences/minimalFootprint/index.html | 1 + examples/framework/preferences/usingGrades/index.html | 1 + 26 files changed, 26 insertions(+) diff --git a/demos/inlineEdit/index.html b/demos/inlineEdit/index.html index ea4306f169..8ce110d647 100644 --- a/demos/inlineEdit/index.html +++ b/demos/inlineEdit/index.html @@ -28,6 +28,7 @@ + diff --git a/demos/keyboard-a11y/index.html b/demos/keyboard-a11y/index.html index 3028fe5992..6ad3c7e78f 100644 --- a/demos/keyboard-a11y/index.html +++ b/demos/keyboard-a11y/index.html @@ -25,6 +25,7 @@ + diff --git a/demos/overviewPanel/index.html b/demos/overviewPanel/index.html index 36e30e2f94..d9dd447add 100644 --- a/demos/overviewPanel/index.html +++ b/demos/overviewPanel/index.html @@ -18,6 +18,7 @@ + diff --git a/demos/pager/index.html b/demos/pager/index.html index 78176b2b8c..3301fb1e3a 100644 --- a/demos/pager/index.html +++ b/demos/pager/index.html @@ -31,6 +31,7 @@ + diff --git a/demos/prefsFramework/index.html b/demos/prefsFramework/index.html index c5d7bc2527..9ce43e151d 100644 --- a/demos/prefsFramework/index.html +++ b/demos/prefsFramework/index.html @@ -38,6 +38,7 @@ + diff --git a/demos/progress/index.html b/demos/progress/index.html index 0300b21739..d7d759a526 100644 --- a/demos/progress/index.html +++ b/demos/progress/index.html @@ -23,6 +23,7 @@ + diff --git a/demos/renderer/index.html b/demos/renderer/index.html index da94c2d859..c20b1a2c12 100644 --- a/demos/renderer/index.html +++ b/demos/renderer/index.html @@ -19,6 +19,7 @@ + diff --git a/demos/reorderer/gridReorderer/index.html b/demos/reorderer/gridReorderer/index.html index 60e5e54f9b..4fb2b9263a 100644 --- a/demos/reorderer/gridReorderer/index.html +++ b/demos/reorderer/gridReorderer/index.html @@ -29,6 +29,7 @@ + diff --git a/demos/reorderer/imageReorderer/index.html b/demos/reorderer/imageReorderer/index.html index b84da2f270..bc2fcda0ab 100644 --- a/demos/reorderer/imageReorderer/index.html +++ b/demos/reorderer/imageReorderer/index.html @@ -33,6 +33,7 @@ + diff --git a/demos/reorderer/layoutReorderer/index.html b/demos/reorderer/layoutReorderer/index.html index a979df8590..03c317c1b9 100644 --- a/demos/reorderer/layoutReorderer/index.html +++ b/demos/reorderer/layoutReorderer/index.html @@ -33,6 +33,7 @@ + diff --git a/demos/reorderer/listReorderer/index.html b/demos/reorderer/listReorderer/index.html index fdb40a26ec..b996687ade 100644 --- a/demos/reorderer/listReorderer/index.html +++ b/demos/reorderer/listReorderer/index.html @@ -29,6 +29,7 @@ + diff --git a/demos/switch/index.html b/demos/switch/index.html index c3bbb38903..525b3f19bd 100644 --- a/demos/switch/index.html +++ b/demos/switch/index.html @@ -25,6 +25,7 @@ + diff --git a/demos/tableOfContents/index.html b/demos/tableOfContents/index.html index 21815674ff..3ca915abc1 100644 --- a/demos/tableOfContents/index.html +++ b/demos/tableOfContents/index.html @@ -22,6 +22,7 @@ + diff --git a/demos/textfieldControl/index.html b/demos/textfieldControl/index.html index fca55e7c05..8be0c357a2 100644 --- a/demos/textfieldControl/index.html +++ b/demos/textfieldControl/index.html @@ -29,6 +29,7 @@ + diff --git a/demos/uiOptions/index.html b/demos/uiOptions/index.html index 3ebcd10e04..6497520baf 100644 --- a/demos/uiOptions/index.html +++ b/demos/uiOptions/index.html @@ -31,6 +31,7 @@ + diff --git a/demos/uploader/index.html b/demos/uploader/index.html index e08e03780d..88dcd38f66 100644 --- a/demos/uploader/index.html +++ b/demos/uploader/index.html @@ -31,6 +31,7 @@ + diff --git a/examples/components/pager/annotateSortedColumn/index.html b/examples/components/pager/annotateSortedColumn/index.html index 91b4c64003..ae72e78d68 100644 --- a/examples/components/pager/annotateSortedColumn/index.html +++ b/examples/components/pager/annotateSortedColumn/index.html @@ -29,6 +29,7 @@ + diff --git a/examples/components/pager/initialPageIndex/index.html b/examples/components/pager/initialPageIndex/index.html index e544304dea..e8d5d15f82 100644 --- a/examples/components/pager/initialPageIndex/index.html +++ b/examples/components/pager/initialPageIndex/index.html @@ -29,6 +29,7 @@ + diff --git a/examples/components/reorderer/tableRow/index.html b/examples/components/reorderer/tableRow/index.html index 6b11b44eb5..b22ca231af 100644 --- a/examples/components/reorderer/tableRow/index.html +++ b/examples/components/reorderer/tableRow/index.html @@ -17,6 +17,7 @@ + diff --git a/examples/framework/preferences/conditionalAdjusters-singlePanel/index.html b/examples/framework/preferences/conditionalAdjusters-singlePanel/index.html index ad0e4a4a3e..a7223cb197 100644 --- a/examples/framework/preferences/conditionalAdjusters-singlePanel/index.html +++ b/examples/framework/preferences/conditionalAdjusters-singlePanel/index.html @@ -30,6 +30,7 @@ + diff --git a/examples/framework/preferences/conditionalAdjusters/index.html b/examples/framework/preferences/conditionalAdjusters/index.html index 6f7f363681..347575f7dd 100644 --- a/examples/framework/preferences/conditionalAdjusters/index.html +++ b/examples/framework/preferences/conditionalAdjusters/index.html @@ -30,6 +30,7 @@ + diff --git a/examples/framework/preferences/fullPagePanelStyle/index.html b/examples/framework/preferences/fullPagePanelStyle/index.html index 4158a54672..6e4dcfcf4c 100644 --- a/examples/framework/preferences/fullPagePanelStyle/index.html +++ b/examples/framework/preferences/fullPagePanelStyle/index.html @@ -29,6 +29,7 @@ + diff --git a/examples/framework/preferences/minimalEditor/index.html b/examples/framework/preferences/minimalEditor/index.html index 6ae1ae7b93..fe1107b02c 100644 --- a/examples/framework/preferences/minimalEditor/index.html +++ b/examples/framework/preferences/minimalEditor/index.html @@ -20,6 +20,7 @@ + diff --git a/examples/framework/preferences/minimalFootprint/fullPage.html b/examples/framework/preferences/minimalFootprint/fullPage.html index f5e4da40a0..d811da5c9d 100644 --- a/examples/framework/preferences/minimalFootprint/fullPage.html +++ b/examples/framework/preferences/minimalFootprint/fullPage.html @@ -47,6 +47,7 @@ + diff --git a/examples/framework/preferences/minimalFootprint/index.html b/examples/framework/preferences/minimalFootprint/index.html index 6609df469a..4401af520a 100644 --- a/examples/framework/preferences/minimalFootprint/index.html +++ b/examples/framework/preferences/minimalFootprint/index.html @@ -49,6 +49,7 @@ "../../../../src/framework/core/js/FluidView.js", "../../../../src/lib/fastXmlPull/js/fastXmlPull.js", "../../../../src/framework/renderer/js/fluidParser.js", + "../../../../src/framework/core/js/MessageResolver.js", "../../../../src/framework/renderer/js/fluidRenderer.js", "../../../../src/framework/renderer/js/RendererUtilities.js", "../../../../src/framework/preferences/js/Store.js", diff --git a/examples/framework/preferences/usingGrades/index.html b/examples/framework/preferences/usingGrades/index.html index f03d76ac88..2aec29d74b 100644 --- a/examples/framework/preferences/usingGrades/index.html +++ b/examples/framework/preferences/usingGrades/index.html @@ -38,6 +38,7 @@ + From afccd4b4f6e836962d7570de64aae93aa8c8d4f2 Mon Sep 17 00:00:00 2001 From: Kasper Markus Date: Wed, 14 Feb 2018 21:16:32 +0100 Subject: [PATCH 15/19] FLUID-6248: Fix and test for issue with Valuemapper not collecting paths from defaultInput directive --- .../core/js/ModelTransformationTransforms.js | 2 +- .../core/js/ModelTransformationTests.js | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/framework/core/js/ModelTransformationTransforms.js b/src/framework/core/js/ModelTransformationTransforms.js index eb8f1d6c13..0f28c2502a 100644 --- a/src/framework/core/js/ModelTransformationTransforms.js +++ b/src/framework/core/js/ModelTransformationTransforms.js @@ -337,7 +337,7 @@ var fluid = fluid || fluid_2_0_0; fluid.transforms.valueMapper.collect = function (transformSpec, transformer) { var togo = []; - fluid.model.transform.accumulateInputPath(transformSpec.defaultInputPath, transformer, togo); + fluid.model.transform.accumulateStandardInputPath("defaultInput", transformSpec, transformer, togo) fluid.each(transformSpec.match, function (option) { fluid.model.transform.accumulateInputPath(option.inputPath, transformer, togo); }); diff --git a/tests/framework-tests/core/js/ModelTransformationTests.js b/tests/framework-tests/core/js/ModelTransformationTests.js index df1b5411eb..2d0358d714 100644 --- a/tests/framework-tests/core/js/ModelTransformationTests.js +++ b/tests/framework-tests/core/js/ModelTransformationTests.js @@ -2362,6 +2362,36 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt expected: { flashing: false } + }, + "FLUID-6248: Valuemapper collects paths from defaultInput": { + message: "Valuemapper with nested arrayToSetMembership as input", + transform: { + "type": "fluid.transforms.valueMapper", + "match": [{ + "inputValue": { + "dictionaryEnabled": true + }, + "outputValue": true + }], + "noMatch": { + "outputValue": false + }, + "defaultInput": { + "transform": { + "type": "fluid.transforms.arrayToSetMembership", + "inputPath": "http://registry\\.gpii\\.net/common/supportTool", + "options": { + "dictionary": "dictionaryEnabled" + } + } + } + }, + expectedInputPaths: [ "http://registry\\.gpii\\.net/common/supportTool" ], + model: { + "http://registry.gpii.net/common/supportTool": ["dictionary"] + }, + expected: true, + weaklyInvertible: false } }; From 28f532337e8dfc2a86a01a4ddc3ca3fdc50898dd Mon Sep 17 00:00:00 2001 From: Kasper Markus Date: Wed, 14 Feb 2018 21:32:50 +0100 Subject: [PATCH 16/19] FLUID-6248: now with linting --- src/framework/core/js/ModelTransformationTransforms.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/framework/core/js/ModelTransformationTransforms.js b/src/framework/core/js/ModelTransformationTransforms.js index 0f28c2502a..8a6f6bcc7e 100644 --- a/src/framework/core/js/ModelTransformationTransforms.js +++ b/src/framework/core/js/ModelTransformationTransforms.js @@ -337,7 +337,7 @@ var fluid = fluid || fluid_2_0_0; fluid.transforms.valueMapper.collect = function (transformSpec, transformer) { var togo = []; - fluid.model.transform.accumulateStandardInputPath("defaultInput", transformSpec, transformer, togo) + fluid.model.transform.accumulateStandardInputPath("defaultInput", transformSpec, transformer, togo); fluid.each(transformSpec.match, function (option) { fluid.model.transform.accumulateInputPath(option.inputPath, transformer, togo); }); From 7a9ffddda5ad654ae60244ba5d8e8cce622b0a70 Mon Sep 17 00:00:00 2001 From: Antranig Basman Date: Tue, 20 Feb 2018 19:21:14 +0000 Subject: [PATCH 17/19] FLUID-5633: Fix and test case for failure to deregister IoC Testing framework listener that was registered via IoCSS --- .../test-core/testTests/js/IoCTestingTests.js | 38 +++++++--- tests/test-core/utils/js/IoCTestUtils.js | 72 +++++++++++++++---- 2 files changed, 87 insertions(+), 23 deletions(-) diff --git a/tests/test-core/testTests/js/IoCTestingTests.js b/tests/test-core/testTests/js/IoCTestingTests.js index 6bdd345c1d..25ea35b308 100644 --- a/tests/test-core/testTests/js/IoCTestingTests.js +++ b/tests/test-core/testTests/js/IoCTestingTests.js @@ -290,6 +290,16 @@ fluid.defaults("fluid.tests.onTestCaseStart.tree", { components: { targetTree: { type: "fluid.component", + options: { + events: { + "hearIt": null + }, + listeners: { + "onCreate.hearIt": { + listener: "{that}.events.hearIt.fire" + } + } + }, createOnEvent: "{testCases}.events.onTestCaseStart" }, testCases: { @@ -307,14 +317,20 @@ fluid.defaults("fluid.tests.fluid5559Tree", { name: "FLUID-5559 Double firing of onTestCaseStart", tests: [{ name: "FLUID-5559 sequence", - expect: 2, - sequence: [ { + expect: 3, + sequence: [{ // Must use IoCSS here - see discussion on FLUID-4929 - must avoid triggering construction - event: "{fluid5559Tree targetTree}.events.onCreate", - listener: "fluid.tests.onTestCaseStart.assertOnce" + event: "{fluid5559Tree targetTree}.events.hearIt", + listener: "fluid.tests.onTestCaseStart.assertValue" }, { - func: "fluid.tests.onTestCaseStart.assertOnce", + func: "fluid.tests.onTestCaseStart.assertValue", args: "{targetTree}" + }, { // Try firing the event again in order to test FLUID-5633 + func: "{fluid5559Tree}.targetTree.events.hearIt.fire", + args: 5 + }, { + event: "{fluid5559Tree targetTree}.events.hearIt", + listener: "fluid.tests.onTestCaseStart.assertValue" }] }] }] @@ -323,7 +339,7 @@ fluid.defaults("fluid.tests.fluid5559Tree", { } }); -fluid.tests.onTestCaseStart.assertOnce = function (arg) { +fluid.tests.onTestCaseStart.assertValue = function (arg) { jqUnit.assertValue("Received value", arg); }; @@ -353,7 +369,7 @@ fluid.defaults("fluid.tests.fluid5575Tree", { triggerable: null // used in "activePassive" case }, listeners: { - onCreate: "fluid.tests.onTestCaseStart.assertOnce" + onCreate: "fluid.tests.onTestCaseStart.assertValue" } } }, @@ -371,7 +387,7 @@ fluid.defaults("fluid.tests.fluid5575Tree", { fluid.tests.onTestCaseStart.singleActive = { expect: 2, sequence: [{ - func: "fluid.tests.onTestCaseStart.assertOnce", + func: "fluid.tests.onTestCaseStart.assertValue", args: "{targetTree}" }] }; @@ -384,10 +400,10 @@ fluid.defaults("fluid.tests.fluid5575Tree.singleActive", { fluid.tests.onTestCaseStart.doubleActive = { expect: 3, sequence: [{ - func: "fluid.tests.onTestCaseStart.assertOnce", + func: "fluid.tests.onTestCaseStart.assertValue", args: "{targetTree}" }, { - func: "fluid.tests.onTestCaseStart.assertOnce", + func: "fluid.tests.onTestCaseStart.assertValue", args: "{targetTree}" }] }; @@ -406,7 +422,7 @@ fluid.tests.onTestCaseStart.activePassive = { args: "{targetTree}" }, { event: "{targetTree}.events.triggerable", - listener: "fluid.tests.onTestCaseStart.assertOnce" + listener: "fluid.tests.onTestCaseStart.assertValue" }] }; diff --git a/tests/test-core/utils/js/IoCTestUtils.js b/tests/test-core/utils/js/IoCTestUtils.js index 4c812bc6dd..1b8bb2bec0 100644 --- a/tests/test-core/utils/js/IoCTestUtils.js +++ b/tests/test-core/utils/js/IoCTestUtils.js @@ -325,6 +325,21 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; return that; }; + // Queries for the tail section of an IoCSS selector which has previously been sent to fluid.extractSelectorHead. + // Note that for this purpose, the selector head needs to be *completely* removed since the head matching has now been + // achieved. TODO: We need to integrate this utility with fluid.queryIoCSelector once FLUID-5556 is resolved + fluid.test.queryPartialSelector = function (root, selector) { + var togo = []; + var parsed = fluid.copy(selector); + parsed.shift(); + fluid.visitComponentsForMatching(root, {}, function (that, thatStack, contextHashes, memberNames, i) { + if (fluid.matchIoCSelector(parsed, thatStack, contextHashes, memberNames, i)) { + togo.push(that); + } + }); + return togo; + }; + // TODO: This will eventually go into the core framework for "Luke Skywalker Event Binding" fluid.analyseTarget = function (testCaseState, material, expectedPrefix) { if (fluid.isIoCReference(material)) { @@ -341,12 +356,26 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; if (segs.length < 2 || segs[0] !== expectedPrefix) { fluid.fail("Error in test case selector ", material, " must start with path " + expectedPrefix); } - return {selector: selector, head: head, path: segs.slice(1)}; + var query = function () { + return fluid.test.queryPartialSelector(head, selector); + }; + return {selector: selector, head: head, query: query, path: segs.slice(1)}; } } return {resolved: testCaseState.expand(material)}; }; + // Because of listener instance removal code driven by fluid.event.resolveListenerRecord, the id assigned + // on registration of a listener via IoC may not agree with its raw id - this is so that the same listener + // handle can be distributed to the same function via multiple declarative blocks. Therefore here we need to + // search for the assigned id since we mean to do something untypical - programmatically remove a listener + // which was registered declaratively. + fluid.test.findListenerId = function (event, listener) { + return fluid.find(event.byId, function (lisRec, key) { + return lisRec.listener === listener ? key : undefined; + }, fluid.event.identifyListener(listener)); + }; + fluid.test.decoders.event = function (testCaseState, fixture) { var analysed = fluid.analyseTarget(testCaseState, fixture.event, "events"); var listener = fluid.test.decodeListener(testCaseState, fixture); @@ -365,19 +394,38 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; var id; bind = function (wrapped) { - var options = {}; - fluid.set(options, ["listeners"].concat(analysed.path), { - listener: wrapped, - args: fixture.args, - namespace: fixture.namespace, - priority: fixture.priority - }); - id = fluid.pushDistributions(analysed.head, analysed.selector, fixture.event, - [{options: options, recordType: "distribution", priority: fluid.mergeRecordTypes.distribution}] - ); + var existent = analysed.query(); + if (existent.length === 0) { + // If it be not now, yet it will come + var options = {}; + fluid.event.identifyListener(wrapped); + fluid.set(options, ["listeners"].concat(analysed.path), { + listener: wrapped, + args: fixture.args, + namespace: fixture.namespace, + priority: fixture.priority + }); + id = fluid.pushDistributions(analysed.head, analysed.selector, fixture.event, + [{options: options, recordType: "distribution", priority: fluid.mergeRecordTypes.distribution}] + ); + } else if (existent.length === 1) { + // If it be now, 'tis not to come + var event = fluid.getForComponent(existent[0], ["events"].concat(analysed.path)); + event.addListener(wrapped, fixture.namespace, priority); + } else { + fluid.fail("Error in listening fixture ", fixture, " selector " + fixture.event + " matched more than one component during bind: ", existent); + } }; - unbind = function () { + unbind = function (wrapped) { fluid.clearDistribution(analysed.head, id); + var existent = analysed.query(); + if (existent.length === 1) { + var event = fluid.getForComponent(existent[0], ["events"].concat(analysed.path)); + var identified = fluid.test.findListenerId(event, wrapped); + event.removeListener(identified); + } else if (existent.length > 1) { + fluid.fail("Error in listening fixture ", fixture, " selector " + fixture.event + " matched more than one component during unbind: ", existent); + } }; } else { fluid.fail("Error decoding event fixture ", fixture, ": must be able to look up member \"event\" to one or more events"); From 64eb4cc66824d7da8ca9cf2033d0bd73d62e8ab8 Mon Sep 17 00:00:00 2001 From: Antranig Basman Date: Tue, 20 Feb 2018 21:56:59 +0000 Subject: [PATCH 18/19] FLUID-5633: Fixes and improvements following review --- tests/test-core/testTests/js/IoCTestingTests.js | 15 ++++++++++++--- tests/test-core/utils/js/IoCTestUtils.js | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/test-core/testTests/js/IoCTestingTests.js b/tests/test-core/testTests/js/IoCTestingTests.js index 25ea35b308..e44f52b527 100644 --- a/tests/test-core/testTests/js/IoCTestingTests.js +++ b/tests/test-core/testTests/js/IoCTestingTests.js @@ -314,13 +314,14 @@ fluid.defaults("fluid.tests.fluid5559Tree", { testCases: { options: { modules: [ { - name: "FLUID-5559 Double firing of onTestCaseStart", + name: "FLUID-5559 Double firing of onTestCaseStart and FLUID-5633 listener deregistration", tests: [{ name: "FLUID-5559 sequence", - expect: 3, + expect: 4, sequence: [{ // Must use IoCSS here - see discussion on FLUID-4929 - must avoid triggering construction event: "{fluid5559Tree targetTree}.events.hearIt", + // Use a bare listener this first time to test one variant of fluid.test.findListenerId listener: "fluid.tests.onTestCaseStart.assertValue" }, { func: "fluid.tests.onTestCaseStart.assertValue", @@ -330,7 +331,15 @@ fluid.defaults("fluid.tests.fluid5559Tree", { args: 5 }, { event: "{fluid5559Tree targetTree}.events.hearIt", - listener: "fluid.tests.onTestCaseStart.assertValue" + listener: "jqUnit.assertEquals", + args: ["Resolved value from 2nd firing", 5, "{arguments}.0"] + }, { // Try firing the event again in order to test FLUID-5633 further + func: "{fluid5559Tree}.targetTree.events.hearIt.fire", + args: true + }, { + event: "{fluid5559Tree targetTree}.events.hearIt", + listener: "jqUnit.assertEquals", + args: ["Resolved value from 3rd firing", true, "{arguments}.0"] }] }] }] diff --git a/tests/test-core/utils/js/IoCTestUtils.js b/tests/test-core/utils/js/IoCTestUtils.js index 1b8bb2bec0..613fd7fda7 100644 --- a/tests/test-core/utils/js/IoCTestUtils.js +++ b/tests/test-core/utils/js/IoCTestUtils.js @@ -372,7 +372,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; // which was registered declaratively. fluid.test.findListenerId = function (event, listener) { return fluid.find(event.byId, function (lisRec, key) { - return lisRec.listener === listener ? key : undefined; + return lisRec.listener.$$fluid_guid === listener.$$fluid_guid ? key : undefined; }, fluid.event.identifyListener(listener)); }; From 95649464cb2ed7612d58c011222927cefd552128 Mon Sep 17 00:00:00 2001 From: Antranig Basman Date: Thu, 22 Feb 2018 15:38:49 +0000 Subject: [PATCH 19/19] FLUID-5633: Further fixes for more cases of IoCSS listener registration --- .../test-core/testTests/js/IoCTestingTests.js | 49 +++++++++++++++++++ tests/test-core/utils/js/IoCTestUtils.js | 41 +++++++++------- 2 files changed, 71 insertions(+), 19 deletions(-) diff --git a/tests/test-core/testTests/js/IoCTestingTests.js b/tests/test-core/testTests/js/IoCTestingTests.js index e44f52b527..52d4cbc829 100644 --- a/tests/test-core/testTests/js/IoCTestingTests.js +++ b/tests/test-core/testTests/js/IoCTestingTests.js @@ -352,6 +352,54 @@ fluid.tests.onTestCaseStart.assertValue = function (arg) { jqUnit.assertValue("Received value", arg); }; +fluid.defaults("fluid.tests.fluid5633Tree", { + gradeNames: ["fluid.test.testEnvironment", "fluid.test.testCaseHolder"], + events: { + createIt: null + }, + components: { + dynamic: { + type: "fluid.component", + createOnEvent: "createIt", + options: { + value: "{arguments}.0" + } + } + }, + modules: [{ + name: "FLUID-5633 Deregistration of IoCSS listeners", + tests: [{ + name: "FLUID-5633 sequence", + expect: 3, + sequence: [{ + func: "{fluid5633Tree}.events.createIt.fire", + args: 1 + }, { + event: "{fluid5633Tree dynamic}.events.onCreate", + listener: "fluid.tests.onTestCaseStart.assertValue" + }, { + func: "{fluid5633Tree}.events.createIt.fire", + args: 2 + }, { + event: "{fluid5633Tree dynamic}.events.onCreate", + // Use a different listener handle here to test for accumulation + listener: "fluid.tests.fluid5633Tree.assertValue2" + }, { + func: "{fluid5633Tree}.events.createIt.fire", + args: 2 + }, { + event: "{fluid5633Tree dynamic}.events.onCreate", + listener: "jqUnit.assertEquals", + args: ["Resolved value from 3rd firing", 2, "{arguments}.0.options.value"] + }] + }] + }] +}); + +fluid.tests.fluid5633Tree.assertValue2 = function (that) { + jqUnit.assertEquals("Received argument from 2nd event firing", 2, that.options.value); +}; + // FLUID-5575 late firing of onTestCaseStart // In this variant, we attach the onCreate listener directly, and refer to the @@ -617,6 +665,7 @@ fluid.tests.IoCTestingTests = function () { "fluid.tests.listenerArg", "fluid.tests.modelTestTree", "fluid.tests.fluid5559Tree", + "fluid.tests.fluid5633Tree", "fluid.tests.fluid5575Tree.singleActive", "fluid.tests.fluid5575Tree.doubleActive", "fluid.tests.fluid5575Tree.activePassive", diff --git a/tests/test-core/utils/js/IoCTestUtils.js b/tests/test-core/utils/js/IoCTestUtils.js index 613fd7fda7..52d8bbb864 100644 --- a/tests/test-core/utils/js/IoCTestUtils.js +++ b/tests/test-core/utils/js/IoCTestUtils.js @@ -198,7 +198,7 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; var togo; if (fixture.args !== undefined) { togo = function () { - var expandedArgs = testCaseState.expand(fixture.args, {"arguments": arguments}, fixture.contextThat); + var expandedArgs = testCaseState.expand(fixture.args, {"arguments": fluid.makeArray(arguments)}, fixture.contextThat); return listener.apply(null, fluid.makeArray(expandedArgs)); }; } else { @@ -392,35 +392,38 @@ var fluid_3_0_0 = fluid_3_0_0 || {}; } else if (analysed.path) { var id; - bind = function (wrapped) { + // Push the distribution whether the component exists or not - since a further one may be created at this + // path via a createOnEvent annotation + var options = {}; + fluid.event.identifyListener(wrapped); + fluid.set(options, ["listeners"].concat(analysed.path), { + listener: wrapped, + // Don't supply "args" here because we decode them ourselves in decodeListener + namespace: fixture.namespace, + priority: fixture.priority + }); + id = fluid.pushDistributions(analysed.head, analysed.selector, fixture.event, + [{options: options, recordType: "distribution", priority: fluid.mergeRecordTypes.distribution}] + ); var existent = analysed.query(); - if (existent.length === 0) { - // If it be not now, yet it will come - var options = {}; - fluid.event.identifyListener(wrapped); - fluid.set(options, ["listeners"].concat(analysed.path), { - listener: wrapped, - args: fixture.args, - namespace: fixture.namespace, - priority: fixture.priority - }); - id = fluid.pushDistributions(analysed.head, analysed.selector, fixture.event, - [{options: options, recordType: "distribution", priority: fluid.mergeRecordTypes.distribution}] - ); - } else if (existent.length === 1) { - // If it be now, 'tis not to come + if (existent.length === 1) { + // In addition, directly register the listener on any currently existing component var event = fluid.getForComponent(existent[0], ["events"].concat(analysed.path)); event.addListener(wrapped, fixture.namespace, priority); - } else { + } else if (existent.length > 1) { fluid.fail("Error in listening fixture ", fixture, " selector " + fixture.event + " matched more than one component during bind: ", existent); } }; unbind = function (wrapped) { - fluid.clearDistribution(analysed.head, id); + fluid.clearDistribution(analysed.head.id, id); var existent = analysed.query(); if (existent.length === 1) { var event = fluid.getForComponent(existent[0], ["events"].concat(analysed.path)); + // TODO: Note that this is overgenerous - will still fail in the (unlikely) case the implementation has manually + // registered a listener whose handle is the same as the declaratively registered one. We need to track + // listeners by attaching their parent distribution id to them. Note that the id allocated by + // fluid.event.resolveListenerRecord is not declaratively recoverable. var identified = fluid.test.findListenerId(event, wrapped); event.removeListener(identified); } else if (existent.length > 1) {