diff --git a/.gitignore b/.gitignore index f4ddd1f..1a0264b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,9 @@ lib-cov # Coverage directory used by tools like istanbul coverage +# Vscode settings +.vscode/ + # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt @@ -31,6 +34,9 @@ build/Release # Dependency directory node_modules +# Updater +electron-builder.yml + # Optional npm cache directory .npm @@ -85,3 +91,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk + +dist/ diff --git a/README.md b/README.md index 4b926ec..d4a7899 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,31 @@ Dialogue editor created for "Night in the Woods" (and other projects) by @NoelFB and @infinite_ammo with contributions from @seiyria and @beeglebug. It is heavily inspired by and based on the amazing Twine software: http://twinery.org/ -![Screenshot](http://infiniteammo.com/Yarn/screenshot.jpg) +This is a port to electron, made possible by Todor Imreorov. It adds a number of new features, such as: +- Integration of bondage.js (yarnspinner port in javascript) inside Yarn - this allows testing yarn stories directly inside yarn. +- Helper menu to create node links - with a search filter +- Helper menu to test yarn story from a specific node - with a search filter (via bondage.js) +- Support for multiple app instances and file drag and drop +- Automatic creation of nodes with correct name and path when writing any new story threads that have no node created yet +- Story tester tool that supports rendering of bbcode- enabling rich text (font colors, styles,images and even links) with typing animation. The tester is written in a very reusable way (as a class with methods)- so it is easy to integrate in html5 games! + +![yarn-testerbbcode](https://user-images.githubusercontent.com/6495061/41685950-2b8b3580-74da-11e8-89ea-c7d23dea19da.gif) # Builds -Win64: http://infiniteammo.com/Yarn/Yarn-2016-08-15-win.zip +Win64: https://github.com/blurymind/Yarn/releases/tag/untagged-1933231011a749959b56 + +MacOS: in Progress + +# To compile and run from source: +Make sure you have nodejs and electron installed. Then -MacOS: http://infiniteammo.com/Yarn/Yarn-2016-08-15-mac.zip +npm install + +npm start + +# To build a yarn executable yourself: +npm run-script build # Examples @@ -40,6 +58,9 @@ Node connections work similar to Twine. ![Screenshot](http://infiniteammo.com/Yarn/node-connections.jpg) +With the difference that there is now a helper menu to create links: +![yarn-linkmaking](https://user-images.githubusercontent.com/6495061/41685764-7bf48d1a-74d9-11e8-89bc-b7bae39470f6.gif) + # Shortcut Options Shortcut options are a new method of creating dialogue branches that does not require creating new nodes. @@ -62,17 +83,6 @@ You can find a more advanced Yarn interpreter here: https://github.com/thesecretlab/YarnSpinner -# How to Run the Yarn Source as an App - -Download http://nwjs.io/ for your platform and extract the contents. - -Win64: Download the latest nwjs for Windows 64bit. Extract the content to wherever you like. Drag the yarn folder into nw.exe and it should run yarn! (if not ensure that the yarn folder has package.json in it). Alternatively run nw.exe and navigate to C:/path_to_yarn/Yarn/app/index.html - -MacOS: Place source code in a new folder named "app.nw" inside the extracted nwjs.app's "Contents/Resources/" folder. -(to explore an app's folder structure, right click and select "Show Package Contents") - -Linux: Download latest nwjs for linux. Extract the content to wherver you like. In that folder make a new folder named "package.nw". Clone yarn into the package.nw folder so that readme, licence and most imporatantly package.json are in the package.nw folder. Now open terminal, navigate to the folder where you extracted nwjs and run the "nw" executable. - # Yarn Icon Yarn logo/icon created by @Mr_Alistair. diff --git a/app/css/style.css b/app/css/style.css index 3efaf39..f134e13 100644 --- a/app/css/style.css +++ b/app/css/style.css @@ -149,7 +149,7 @@ a:hover { color: #000;} { transition: max-height 0.5s; max-height: 0px; - overflow: hidden; + overflow: auto; float: left; } @@ -174,6 +174,15 @@ a:hover { color: #000;} color: #555; } +.app-menu .dropdown .search-field +{ + box-sizing: border-box; + float: left; + display: block; + width: 100%; + padding: 10px; +} + .app-menu .menu:hover .dropdown { max-height: 400px; diff --git a/app/index.html b/app/index.html index d44a838..0db3eb3 100644 --- a/app/index.html +++ b/app/index.html @@ -7,7 +7,8 @@ - + + @@ -25,7 +26,18 @@ - + +
 
@@ -35,6 +47,7 @@ + + + + -
+ node.titleColorValues[node.colorID()]}">
@@ -121,10 +138,22 @@
-
+ + + +
+ +
+ +
-
@@ -189,8 +217,12 @@ diff --git a/app/js/classes/app.js b/app/js/classes/app.js index 67cc6dc..60a035b 100644 --- a/app/js/classes/app.js +++ b/app/js/classes/app.js @@ -1,1301 +1,1398 @@ -var App = function(name, version) -{ - var self = this; - - // self - this.instance = this; - this.name = ko.observable(name); - this.version = ko.observable(version); - this.editing = ko.observable(null); - this.deleting = ko.observable(null); - this.nodes = ko.observableArray([]); - this.cachedScale = 1; - this.canvas; - this.context; - this.nodeHistory = []; - this.nodeFuture = []; - this.editingHistory = []; - //this.appleCmdKey = false; - this.editingSaveHistoryTimeout = null; - this.dirty = false; - this.focusedNodeIdx = -1; - this.zoomSpeed = .005; - this.zoomLimitMin = .05; - this.zoomLimitMax = 1; - this.transformOrigin = [ - 0, - 0 - ]; - this.shifted = false; +const electron = require("electron"); +const remote = electron.remote; + +var App = function(name, version) { + // console.log(remote.getCurrentWindow()); ///// replace nw.gui + var self = this; + + // self + this.instance = this; + this.name = ko.observable(name); + this.version = ko.observable(version); + this.editing = ko.observable(null); + this.deleting = ko.observable(null); + this.nodes = ko.observableArray([]); + this.cachedScale = 1; + this.canvas; + this.context; + this.nodeHistory = []; + this.nodeFuture = []; + this.editingHistory = []; + //this.appleCmdKey = false; + this.editingSaveHistoryTimeout = null; + this.dirty = false; + this.focusedNodeIdx = -1; + this.zoomSpeed = 0.005; + this.zoomLimitMin = 0.05; + this.zoomLimitMax = 1; + this.transformOrigin = [0, 0]; + this.shifted = false; this.isNwjs = false; - - this.UPDATE_ARROWS_THROTTLE_MS = 25; - //this.editingPath = ko.observable(null); + this.UPDATE_ARROWS_THROTTLE_MS = 25; - this.nodeSelection = []; + //this.editingPath = ko.observable(null); - this.$searchField = $(".search-field"); + this.nodeSelection = []; - // node-webkit - if (typeof(require) == "function") - { - this.gui = require('nw.gui'); - this.fs = require('fs'); - this.isNwjs = true; - } - - this.run = function() - { - //TODO(Al): - // delete mutliple nodes at the same time - - var osName = "Unknown OS"; - if (navigator.platform.indexOf("Win")!=-1) osName="Windows"; - if (navigator.platform.indexOf("Mac")!=-1) osName="MacOS"; - if (navigator.platform.indexOf("X11")!=-1) osName="UNIX"; - if (navigator.platform.indexOf("Linux")!=-1) osName="Linux"; - - if (osName == "Windows") - self.zoomSpeed = .1; - - $("#app").show(); - ko.applyBindings(self, $("#app")[0]); - - self.canvas = $(".arrows")[0]; - self.context = self.canvas.getContext('2d'); - self.newNode().title("Start"); - - if (osName != "Windows" && osName != "Linux" && self.gui != undefined) - { - var win = self.gui.Window.get(); - var nativeMenuBar = new self.gui.Menu({ type: "menubar" }); - if(nativeMenuBar.createMacBuiltin) { - nativeMenuBar.createMacBuiltin("Yarn"); - } - win.menu = nativeMenuBar; - } + this.$searchField = $(".search-field"); - // search field enter - self.$searchField.on("keydown", function (e) - { - // enter - if (e.keyCode == 13) - self.searchWarp(); - - // escape - if (e.keyCode == 27) - self.clearSearch(); - }); - - // prevent click bubbling - ko.bindingHandlers.preventBubble = - { - init: function(element, valueAccessor) - { - var eventName = ko.utils.unwrapObservable(valueAccessor()); - ko.utils.registerEventHandler(element, eventName, function(event) - { - event.cancelBubble = true; - if (event.stopPropagation) - event.stopPropagation(); - }); - } - }; - - ko.bindingHandlers.mousedown = - { - init: function(element, valueAccessor, allBindings, viewModel, bindingContext) - { - var value = ko.unwrap(valueAccessor()); - $(element).mousedown(function() - { - value(); - }); - } - }; - - // updateArrows - // setInterval(function() { self.updateArrows(); }, 16); - - // drag node holder around - (function() - { - var dragging = false; - var offset = { x: 0, y: 0 }; - var MarqueeOn = false; - var MarqueeSelection = []; - var MarqRect = {x1:0,y1:0,x2:0,y2:0}; - var MarqueeOffset = [0, 0]; - - $(".nodes").on("mousedown", function(e) - { - $("#marquee").css({x:0, y:0, width:0, height:0}); - dragging = true; - offset.x = e.pageX; - offset.y = e.pageY; - MarqueeSelection = []; - MarqRect = {x1:0,y1:0,x2:0,y2:0}; - - var scale = self.cachedScale; - - MarqueeOffset[0] = 0; - MarqueeOffset[1] = 0; - - if (!e.altKey && !e.shiftKey) - self.deselectAllNodes(); - }); - - $(".nodes").on("mousemove", function(e) - { - - if (dragging) - { - //if(e.ctrlKey) - if (e.altKey || e.button === 1) - { - //prevents jumping straight back to standard dragging - if(MarqueeOn) - { - MarqueeSelection = []; - MarqRect = {x1:0,y1:0,x2:0,y2:0}; - $("#marquee").css({x:0, y:0, width:0, height:0}); - } - else - { - self.transformOrigin[0] += e.pageX - offset.x; - self.transformOrigin[1] += e.pageY - offset.y; - - self.translate(); - - offset.x = e.pageX; - offset.y = e.pageY; - - /* - var nodes = self.nodes(); - for (var i in nodes) - { - nodes[i].x(nodes[i].x() + (e.pageX - offset.x) / self.cachedScale); - nodes[i].y(nodes[i].y() + (e.pageY - offset.y) / self.cachedScale); - } - offset.x = e.pageX; - offset.y = e.pageY; - */ - } - } - else - { - MarqueeOn = true; - - var scale = self.cachedScale; - - if(e.pageX > offset.x && e.pageY < offset.y) - { - MarqRect.x1 = offset.x; - MarqRect.y1 = e.pageY; - MarqRect.x2 = e.pageX; - MarqRect.y2 = offset.y; - } - else if(e.pageX > offset.x && e.pageY > offset.y) - { - MarqRect.x1 = offset.x; - MarqRect.y1 = offset.y; - MarqRect.x2 = e.pageX; - MarqRect.y2 = e.pageY; - } - else if(e.pageX < offset.x && e.pageY < offset.y) - { - MarqRect.x1 = e.pageX; - MarqRect.y1 = e.pageY; - MarqRect.x2 = offset.x; - MarqRect.y2 = offset.y; - } - else - { - MarqRect.x1 = e.pageX; - MarqRect.y1 = offset.y; - MarqRect.x2 = offset.x; - MarqRect.y2 = e.pageY; - } - - $("#marquee").css({ x:MarqRect.x1, - y:MarqRect.y1, - width:Math.abs(MarqRect.x1-MarqRect.x2), - height:Math.abs(MarqRect.y1-MarqRect.y2)}); - - //Select nodes which are within the marquee - // MarqueeSelection is used to prevent it from deselecting already - // selected nodes and deselecting onces which have been selected - // by the marquee - var nodes = self.nodes(); - for(var i in nodes) - { - var index = MarqueeSelection.indexOf(nodes[i]); - var inMarqueeSelection = (index >= 0); - - //test the Marque scaled to the nodes x,y values - - var holder = $(".nodes-holder").offset(); - var marqueeOverNode = (MarqRect.x2 - holder.left) / scale > nodes[i].x() - && (MarqRect.x1 - holder.left) / scale < nodes[i].x() + nodes[i].tempWidth - && (MarqRect.y2 - holder.top) / scale > nodes[i].y() - && (MarqRect.y1 - holder.top) / scale < nodes[i].y() + nodes[i].tempHeight; - - if(marqueeOverNode) - { - if(!inMarqueeSelection) - { - self.addNodeSelected(nodes[i]); - MarqueeSelection.push(nodes[i]); - } - } - else - { - if(inMarqueeSelection) - { - self.removeNodeSelection(nodes[i]); - MarqueeSelection.splice(index, 1); - } - - } - } - } - - } - - }); - - $(".nodes").on("mouseup", function(e) - { - console.log("finished dragging"); - dragging = false; - - if(MarqueeOn && MarqueeSelection.length == 0) - { - self.deselectAllNodes(); - } - - MarqueeSelection = []; - MarqRect = {x1:0,y1:0,x2:0,y2:0}; - $("#marquee").css({x:0, y:0, width:0, height:0}); - MarqueeOn = false; - - }); - })(); - - // search field - self.$searchField.on('input', self.updateSearch); - $(".search-title input").click(self.updateSearch); - $(".search-body input").click(self.updateSearch); - $(".search-tags input").click(self.updateSearch); - - // using the event helper - $('.nodes').mousewheel(function(event) { - // https://github.com/InfiniteAmmoInc/Yarn/issues/40 - if (event.altKey) { - return; - } else { - event.preventDefault(); - } - - var lastZoom = self.cachedScale, - scaleChange = event.deltaY * self.zoomSpeed * self.cachedScale; - - if (self.cachedScale + scaleChange > self.zoomLimitMax) { - self.cachedScale = self.zoomLimitMax; - } else if (self.cachedScale + scaleChange < self.zoomLimitMin) { - self.cachedScale = self.zoomLimitMin; - } else { - self.cachedScale += scaleChange; - }; - - var mouseX = event.pageX - self.transformOrigin[0], - mouseY = event.pageY - self.transformOrigin[1], - newX = mouseX * (self.cachedScale / lastZoom), - newY = mouseY * (self.cachedScale / lastZoom), - deltaX = (mouseX - newX), - deltaY = (mouseY - newY); - - self.transformOrigin[0] += deltaX; - self.transformOrigin[1] += deltaY; - - self.translate(); - }); - - $(document).on('keyup keydown', function(e) { self.shifted = e.shiftKey; } ); - - $(document).contextmenu( function(e){ - var isAllowedEl = ( - $(e.target).hasClass('nodes') || - $(e.target).parents('.nodes').length - ); - - if( e.button == 2 && isAllowedEl ) - { - var x = self.transformOrigin[0] * -1 / self.cachedScale, - y = self.transformOrigin[1] * -1 / self.cachedScale; - - x += event.pageX / self.cachedScale; - y += event.pageY / self.cachedScale; - - self.newNodeAt(x, y); - } - - return !isAllowedEl; - }); - - $(document).on('keydown', function(e){ - //global ctrl+z - if((e.metaKey || e.ctrlKey) && !self.editing()) - { - switch(e.keyCode) - { - case 90: self.historyDirection("undo"); - break; - case 89: self.historyDirection("redo"); - break; - case 68: self.deselectAllNodes(); - } - } - }); - - $(document).on('keydown', function(e) { - if (self.isNwjs === false) { return; } - - if (e.ctrlKey || e.metaKey) { - if (e.shiftKey) { - switch(e.keyCode) - { - case 83: - data.trySave(FILETYPE.JSON); - self.fileKeyPressed = true; - break; - case 65: - data.tryAppend(); - self.fileKeyPressed = true; - break; - } - } else if(e.altKey) { - switch(e.keyCode) - { - case 83: - data.trySave(FILETYPE.YARNTEXT); - self.fileKeyPressed = true; - break; - } - } else { - switch(e.keyCode) - { - case 83: - if (data.editingPath() != null) { - data.trySaveCurrent(); - } else { - data.trySave(FILETYPE.JSON); - } - self.fileKeyPressed = true; - break; - case 79: - data.tryOpenFile(); - self.fileKeyPressed = true; - break; - } - } - } + // node-webkit + if (typeof require == "function") { + // this.gui = require('nw.gui'); + this.gui = remote.getCurrentWindow(); + this.fs = remote.require("fs"); + this.isNwjs = true; + } + + this.run = function() { + //TODO(Al): + + var osName = "Unknown OS"; + if (navigator.platform.indexOf("Win") != -1) osName = "Windows"; + if (navigator.platform.indexOf("Mac") != -1) osName = "MacOS"; + if (navigator.platform.indexOf("X11") != -1) osName = "UNIX"; + if (navigator.platform.indexOf("Linux") != -1) osName = "Linux"; + + if (osName == "Windows") self.zoomSpeed = 0.1; + + $("#app").show(); + ko.applyBindings(self, $("#app")[0]); + + self.canvas = $(".arrows")[0]; + self.context = self.canvas.getContext("2d"); + self.newNode().title("Start"); + + if (osName != "Windows" && osName != "Linux" && self.gui != undefined) { + var win = self.gui.Window.get(); + var nativeMenuBar = new self.gui.Menu({ type: "menubar" }); + if (nativeMenuBar.createMacBuiltin) { + nativeMenuBar.createMacBuiltin("Yarn"); + } + win.menu = nativeMenuBar; + } + + // search field enter + self.$searchField.on("keydown", function(e) { + // enter + if (e.keyCode == 13) self.searchWarp(); + // escape + if (e.keyCode == 27) self.clearSearch(); + }); + + // prevent click bubbling + ko.bindingHandlers.preventBubble = { + init: function(element, valueAccessor) { + var eventName = ko.utils.unwrapObservable(valueAccessor()); + ko.utils.registerEventHandler(element, eventName, function(event) { + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); }); - - $(document).on('keydown', function(e) { - if (self.editing() || self.$searchField.is(':focus') || e.ctrlKey || e.metaKey) return; - var scale = self.cachedScale || 1, - movement = scale * 500; - - if(e.shiftKey) { - movement = scale * 100; - } - - if (e.keyCode === 65 || e.keyCode === 37) { // a or left arrow - self.transformOrigin[0] += movement; - } else if (e.keyCode === 68 || e.keyCode === 39) { // d or right arrow - self.transformOrigin[0] -= movement; - } else if (e.keyCode === 87 || e.keyCode === 38) { // w or up arrow - self.transformOrigin[1] += movement; - } else if (e.keyCode === 83 || e.keyCode === 40) { // w or down arrow - self.transformOrigin[1] -= movement; - } else if (e.keyCode === 32) { - var selectedNodes = self.getSelectedNodes(); - var nodes = selectedNodes.length > 0 - ? selectedNodes - : self.nodes(); - var isNodeSelected = selectedNodes.length > 0; - if (self.focusedNodeIdx > -1 && nodes.length > self.focusedNodeIdx - && (self.transformOrigin[0] != -nodes[self.focusedNodeIdx].x() + $(window).width() / 2 - $(nodes[self.focusedNodeIdx].element).width() / 2 - || self.transformOrigin[1] != -nodes[self.focusedNodeIdx].y() + $(window).height() / 2 - $(nodes[self.focusedNodeIdx].element).height() / 2)) - { - self.focusedNodeIdx = -1; - } - - if (++self.focusedNodeIdx >= nodes.length) { - self.focusedNodeIdx = 0; - } - self.cachedScale = 1; - if (isNodeSelected) - { - self.warpToSelectedNodeIdx(self.focusedNodeIdx); - } - else - { - self.warpToNodeIdx(self.focusedNodeIdx); - } - } - - self.translate(100); - } ); - - $(window).on('resize', self.updateArrowsThrottled); - - $(document).on('keyup keydown mousedown mouseup', function(e) { - if(self.editing() != null) - { - self.updateEditorStats(); - } - }); - // apple command key - //$(window).on('keydown', function(e) { if (e.keyCode == 91 || e.keyCode == 93) { self.appleCmdKey = true; } }); - //$(window).on('keyup', function(e) { if (e.keyCode == 91 || e.keyCode == 93) { self.appleCmdKey = false; } }); - } - - this.getNodesConnectedTo = function(toNode) - { - var connectedNodes = []; - var nodes = self.nodes(); - for (var i in nodes) - { - if (nodes[i] != toNode && nodes[i].isConnectedTo(toNode, true)) - { - var hasNode = false; - for (var j in connectedNodes) - { - if (connectedNodes[j] == nodes[i]) - { - hasNode = true; - break; - } - } - if (!hasNode) - connectedNodes.push(nodes[i]); - } - } - return connectedNodes; - } - - this.mouseUpOnNodeNotMoved = function() - { - self.deselectAllNodes(); - } - - this.matchConnectedColorID = function(fromNode) - { - var nodes = self.getNodesConnectedTo(fromNode); - for (var i in nodes) - nodes[i].colorID(fromNode.colorID()); - } - - this.quit = function() - { - if (self.gui != undefined) - { - self.gui.App.quit(); - } - } - - this.refreshWindowTitle = function(editingPath) - { - var gui = require('nw.gui'); - - if (!gui) return; - - // Get the current window - var win = gui.Window.get(); - - win.title = "Yarn - [" + editingPath + "] ";// + (self.dirty?"*":""); - } - - this.recordNodeAction = function(action, node) - { - //we can't go forward in 'time' when - //new actions have been made - if(self.nodeFuture.length > 0) - { - for (var i = 0; i < self.nodeFuture.length; i++) { - var future = self.nodeFuture.pop(); - delete future.node; - }; - - delete self.nodeFuture; - self.nodeFuture = []; - } - - var historyItem = {action: action, node: node, lastX: node.x(), lastY: node.y()}; - - if(action == "removed") - { - historyItem.lastY+=80; - } - - self.nodeHistory.push(historyItem); - } - - this.historyDirection = function(direction) - { - function removeNode(node){ - var index = self.nodes.indexOf(node); - if (index >= 0) - { - self.nodes.splice(index, 1); - } - self.updateNodeLinks(); - } - - var historyItem = null; - - if(direction == "undo") - historyItem = self.nodeHistory.pop(); - else - historyItem = self.nodeFuture.pop(); - - if(!historyItem) return; - - var action = historyItem.action; - var node = historyItem.node; - - - if(direction == "undo") //undo actions - { - if(action == "created") - { - historyItem.lastX = node.x(); - historyItem.lastY = node.y(); - removeNode(node); - } - else if(action == "removed") - { - self.recreateNode(node, historyItem.lastX, historyItem.lastY); - } - - self.nodeFuture.push(historyItem); - } - else //redo undone actions - { - if(action == "created") - { - self.recreateNode(node, historyItem.lastX, historyItem.lastY); - } - else if(action == "removed") - { - removeNode(node); - } - - self.nodeHistory.push(historyItem); - } - } - - this.recreateNode = function(node, x, y) - { - self.nodes.push(node); - node.moveTo(x, y); - self.updateNodeLinks(); - } - - this.setSelectedColors = function(node) - { - var nodes = self.getSelectedNodes(); - nodes.splice(nodes.indexOf(node), 1); - - for(var i in nodes) - nodes[i].colorID(node.colorID()); - } - - this.getSelectedNodes = function() - { - var selectedNode = []; - - for(var i in self.nodeSelection) - { - selectedNode.push(self.nodeSelection[i]); - } - - return selectedNode; - } - - this.deselectAllNodes = function() - { - var nodes = self.nodes(); - for (var i in nodes) - { - self.removeNodeSelection(nodes[i]); - } - } - - this.addNodeSelected = function(node) - { - var index = self.nodeSelection.indexOf(node); - if(index < 0) - { - self.nodeSelection.push(node); - node.setSelected(true); - } - } - - this.removeNodeSelection = function(node) - { - var index = self.nodeSelection.indexOf(node); - if (index >= 0) - { - self.nodeSelection.splice(index, 1); - node.setSelected(false); - } - } - - this.deleteSelectedNodes = function() - { - var nodes = self.getSelectedNodes(); - for(var i in nodes) - { - self.removeNodeSelection(nodes[i]); - nodes[i].remove(); - } - } - - this.newNode = function(updateArrows) - { - var node = new Node(); - self.nodes.push(node); - if (updateArrows == undefined || updateArrows == true) - self.updateNodeLinks(); - - self.recordNodeAction("created", node); - - return node; - } - - this.newNodeAt = function(x, y) - { - var node = new Node(); - - self.nodes.push(node); - - node.x(x-100); - node.y(y-100); - self.updateNodeLinks(); - self.recordNodeAction("created", node); - - return node; - } - - this.removeNode = function(node) - { - if(node.selected) - { + } + }; + + ko.bindingHandlers.mousedown = { + init: function( + element, + valueAccessor, + allBindings, + viewModel, + bindingContext + ) { + var value = ko.unwrap(valueAccessor()); + $(element).mousedown(function() { + value(); + }); + } + }; + + // updateArrows + // setInterval(function() { self.updateArrows(); }, 16); + + // drag node holder around + (function() { + var dragging = false; + var offset = { x: 0, y: 0 }; + var MarqueeOn = false; + var MarqueeSelection = []; + var MarqRect = { x1: 0, y1: 0, x2: 0, y2: 0 }; + var MarqueeOffset = [0, 0]; + var midClickHeld = false; + + $(".nodes").on("mousedown", function(e) { + if (e.button == 1) { + midClickHeld = true; + } + $("#marquee").css({ x: 0, y: 0, width: 0, height: 0 }); + dragging = true; + offset.x = e.pageX; + offset.y = e.pageY; + MarqueeSelection = []; + MarqRect = { x1: 0, y1: 0, x2: 0, y2: 0 }; + + var scale = self.cachedScale; + + MarqueeOffset[0] = 0; + MarqueeOffset[1] = 0; + + if (!e.altKey && !e.shiftKey) self.deselectAllNodes(); + }); + + $(".nodes").on("mousemove", function(e) { + if (dragging) { + if (e.altKey || midClickHeld) { + //prevents jumping straight back to standard dragging + if (MarqueeOn) { + MarqueeSelection = []; + MarqRect = { x1: 0, y1: 0, x2: 0, y2: 0 }; + $("#marquee").css({ x: 0, y: 0, width: 0, height: 0 }); + } else { + // self.transformOrigin[0] += e.pageX - offset.x; + // self.transformOrigin[1] += e.pageY - offset.y; + + // self.translate(); + + // offset.x = e.pageX; + // offset.y = e.pageY; + + var nodes = self.nodes(); + for (var i in nodes) { + nodes[i].x( + nodes[i].x() + (e.pageX - offset.x) / self.cachedScale + ); + nodes[i].y( + nodes[i].y() + (e.pageY - offset.y) / self.cachedScale + ); + } + offset.x = e.pageX; + offset.y = e.pageY; + } + } else { + MarqueeOn = true; + + var scale = self.cachedScale; + + if (e.pageX > offset.x && e.pageY < offset.y) { + MarqRect.x1 = offset.x; + MarqRect.y1 = e.pageY; + MarqRect.x2 = e.pageX; + MarqRect.y2 = e.pageY; + } else if (e.pageX > offset.x && e.pageY > offset.y) { + MarqRect.x1 = offset.x; + MarqRect.y1 = offset.y; + MarqRect.x2 = e.pageX; + MarqRect.y2 = e.pageY; + } else if (e.pageX < offset.x && e.pageY < offset.y) { + MarqRect.x1 = e.pageX; + MarqRect.y1 = e.pageY; + MarqRect.x2 = offset.x; + MarqRect.y2 = offset.y; + } else { + MarqRect.x1 = e.pageX; + MarqRect.y1 = offset.y; + MarqRect.x2 = offset.x; + MarqRect.y2 = e.pageY; + } + + $("#marquee").css({ + x: MarqRect.x1, + y: MarqRect.y1, + width: Math.abs(MarqRect.x1 - MarqRect.x2), + height: Math.abs(MarqRect.y1 - MarqRect.y2) + }); + + //Select nodes which are within the marquee + // MarqueeSelection is used to prevent it from deselecting already + // selected nodes and deselecting onces which have been selected + // by the marquee + var nodes = self.nodes(); + for (var i in nodes) { + var index = MarqueeSelection.indexOf(nodes[i]); + var inMarqueeSelection = index >= 0; + + //test the Marque scaled to the nodes x,y values + + var holder = $(".nodes-holder").offset(); + var marqueeOverNode = + (MarqRect.x2 - holder.left) / scale > nodes[i].x() && + (MarqRect.x1 - holder.left) / scale < + nodes[i].x() + nodes[i].tempWidth && + (MarqRect.y2 - holder.top) / scale > nodes[i].y() && + (MarqRect.y1 - holder.top) / scale < + nodes[i].y() + nodes[i].tempHeight; + + if (marqueeOverNode) { + if (!inMarqueeSelection) { + self.addNodeSelected(nodes[i]); + MarqueeSelection.push(nodes[i]); + } + } else { + if (inMarqueeSelection) { + self.removeNodeSelection(nodes[i]); + MarqueeSelection.splice(index, 1); + } + } + } + } + } + }); + + $(".nodes").on("mouseup", function(e) { + // console.log("finished dragging"); + if (e.button == 1) { + midClickHeld = false; + } + dragging = false; + + if (MarqueeOn && MarqueeSelection.length == 0) { + self.deselectAllNodes(); + } + + MarqueeSelection = []; + MarqRect = { x1: 0, y1: 0, x2: 0, y2: 0 }; + $("#marquee").css({ x: 0, y: 0, width: 0, height: 0 }); + MarqueeOn = false; + }); + })(); + + // search field + self.$searchField.on("input", self.updateSearch); + $(".search-title input").click(self.updateSearch); + $(".search-body input").click(self.updateSearch); + $(".search-tags input").click(self.updateSearch); + + // using the event helper + $(".nodes").mousewheel(function(event) { + // https://github.com/InfiniteAmmoInc/Yarn/issues/40 + if (event.altKey) { + return; + } else { + event.preventDefault(); + } + + var lastZoom = self.cachedScale, + scaleChange = event.deltaY * self.zoomSpeed * self.cachedScale; + + if (self.cachedScale + scaleChange > self.zoomLimitMax) { + self.cachedScale = self.zoomLimitMax; + } else if (self.cachedScale + scaleChange < self.zoomLimitMin) { + self.cachedScale = self.zoomLimitMin; + } else { + self.cachedScale += scaleChange; + } + + var mouseX = event.pageX - self.transformOrigin[0], + mouseY = event.pageY - self.transformOrigin[1], + newX = mouseX * (self.cachedScale / lastZoom), + newY = mouseY * (self.cachedScale / lastZoom), + deltaX = mouseX - newX, + deltaY = mouseY - newY; + + self.transformOrigin[0] += deltaX; + self.transformOrigin[1] += deltaY; + + self.translate(); + }); + + $(document).on("keyup keydown", function(e) { + self.shifted = e.shiftKey; + }); + + $(document).contextmenu(function(e) { + var isAllowedEl = $(e.target).hasClass("nodes") || $(e.target).parents(".nodes").length; + + if (e.button == 2 && isAllowedEl) { + var x = (self.transformOrigin[0] * -1) / self.cachedScale, + y = (self.transformOrigin[1] * -1) / self.cachedScale; + + x += event.pageX / self.cachedScale; + y += event.pageY / self.cachedScale; + + self.newNodeAt(x, y); + } + + return !isAllowedEl; + }); + + $(document).on("keydown", function(e) { + //global ctrl+z + if ((e.metaKey || e.ctrlKey) && !self.editing()) { + switch (e.keyCode) { + case 90: + self.historyDirection("undo"); + break; + case 89: + self.historyDirection("redo"); + break; + case 68: + self.deselectAllNodes(); + } + } + }); + + $(document).on("keydown", function(e) { + if (self.isNwjs === false) { + return; + } + + if (e.ctrlKey || e.metaKey) { + if (e.shiftKey) { + switch (e.keyCode) { + case 83: + data.trySave(FILETYPE.JSON); + self.fileKeyPressed = true; + break; + case 65: + data.tryAppend(); + self.fileKeyPressed = true; + break; + } + } else if (e.altKey) { + switch (e.keyCode) { + case 83: + data.trySave(FILETYPE.YARNTEXT); + self.fileKeyPressed = true; + break; + } + } else { + switch (e.keyCode) { + case 83: + if (data.editingPath() != null) { + data.trySaveCurrent(); + } else { + data.trySave(FILETYPE.JSON); + } + self.fileKeyPressed = true; + break; + case 79: + data.tryOpenFile(); + self.fileKeyPressed = true; + break; + } + } + } + }); + + $(document).on("keydown", function(e) { + if ( + self.editing() || + self.$searchField.is(":focus") || + e.ctrlKey || + e.metaKey + ) + return; + var scale = self.cachedScale || 1, + movement = scale * 500; + + if (e.shiftKey) { + movement = scale * 100; + } + + if (e.keyCode === 65 || e.keyCode === 37) { + // a or left arrow + self.transformOrigin[0] += movement; + } else if (e.keyCode === 68 || e.keyCode === 39) { + // d or right arrow + self.transformOrigin[0] -= movement; + } else if (e.keyCode === 87 || e.keyCode === 38) { + // w or up arrow + self.transformOrigin[1] += movement; + } else if (e.keyCode === 83 || e.keyCode === 40) { + // w or down arrow + self.transformOrigin[1] -= movement; + } + + self.translate(100); + }); + + $(document).on("keyup", function(e) { + // console.log(e.keyCode+"-"+e.key) + if (e.keyCode === 46 || e.key === "Delete") { + // Delete selected + if (self.editing() === null){ self.deleteSelectedNodes(); } - var index = self.nodes.indexOf(node); - if (index >= 0) - { - self.recordNodeAction("removed", node); - self.nodes.splice(index, 1); - } - self.updateNodeLinks(); - } - - this.editNode = function(node) - { - if (node.active()) - { - self.editing(node); - - $(".node-editor").css({ opacity: 0 }).transition({ opacity: 1 }, 250); - $(".node-editor .form").css({ y: "-100" }).transition({ y: "0" }, 250); - - //enable_spellcheck(); - contents_modified = true; - //spell_check(); - - self.updateEditorStats(); - } - } - - this.trim = function(x) - { - return x.replace(/^\s+|\s+$/gm,''); - } - - this.saveNode = function() - { - if (self.editing() != null) - { - self.updateNodeLinks(); - - self.editing().title(self.trim(self.editing().title())); - - $(".node-editor").transition({ opacity: 0 }, 250); - $(".node-editor .form").transition({ y: "-100" }, 250, function() - { - self.editing(null); - }); - - setTimeout(self.updateSearch, 100); - } - } - - this.updateSearch = function() - { - var search = self.$searchField.val().toLowerCase(); - var title = $(".search-title input").is(':checked'); - var body = $(".search-body input").is(':checked'); - var tags = $(".search-tags input").is(':checked'); - - var on = 1; - var off = 0.25; - - for (var i = 0; i < app.nodes().length; i ++) - { - var node = app.nodes()[i]; - var element = $(node.element); - - if (search.length > 0 && (title || body || tags)) - { - var matchTitle = (title && node.title().toLowerCase().indexOf(search) >= 0); - var matchBody = (body && node.body().toLowerCase().indexOf(search) >= 0); - var matchTags = (tags && node.tags().toLowerCase().indexOf(search) >= 0); - - if (matchTitle || matchBody || matchTags) - { - node.active(true); - element.clearQueue(); - element.transition({opacity: on}, 500); - } - else - { - node.active(false); - element.clearQueue(); - element.transition({opacity: off}, 500); - } - } - else - { - node.active(true); - element.clearQueue(); - element.transition({opacity: on}, 500); - } - } - } - - this.updateNodeLinks = function() - { - for (var i in self.nodes()) - self.nodes()[i].updateLinks(); - } - - this.updateArrows = function() - { - self.canvas.width = $(window).width(); - self.canvas.height = $(window).height(); - - var scale = self.cachedScale; - var offset = $(".nodes-holder").offset(); - - self.context.clearRect(0, 0, $(window).width(), $(window).height()); - self.context.lineWidth = 4 * scale; - - var nodes = self.nodes(); - - for(var i in nodes) - { - var node = nodes[i]; - nodes[i].tempWidth = $(node.element).width(); - nodes[i].tempHeight = $(node.element).height(); - nodes[i].tempOpacity = $(node.element).css("opacity"); - } - - for(var index in nodes) - { - var node = nodes[index]; - if (node.linkedTo().length > 0) - { - for(var link in node.linkedTo()) - { - var linked = node.linkedTo()[link]; - - // get origins - var fromX = (node.x() + node.tempWidth/2) * scale + offset.left; - var fromY = (node.y() + node.tempHeight/2) * scale + offset.top; - var toX = (linked.x() + linked.tempWidth/2) * scale + offset.left; - var toY = (linked.y() + linked.tempHeight/2) * scale + offset.top; - - // get the normal - var distance = Math.sqrt((fromX - toX) * (fromX - toX) + (fromY - toY) * (fromY - toY)); - var normal = { x: (toX - fromX) / distance, y: (toY - fromY) / distance }; - - var dist = 110 + 160 * (1 - Math.max(Math.abs(normal.x), Math.abs(normal.y))); - - // get from / to - var from = { x: fromX + normal.x * dist * scale, y: fromY + normal.y * dist * scale }; - var to = { x: toX - normal.x * dist * scale, y: toY - normal.y * dist * scale }; - - self.context.strokeStyle = "rgba(0, 0, 0, " + (node.tempOpacity * 0.6) + ")"; - self.context.fillStyle = "rgba(0, 0, 0, " + (node.tempOpacity * 0.6) + ")"; - - // draw line - self.context.beginPath(); - self.context.moveTo(from.x, from.y); - self.context.lineTo(to.x, to.y); - self.context.stroke(); - - // draw arrow - self.context.beginPath(); - self.context.moveTo(to.x + normal.x * 4, to.y + normal.y * 4); - self.context.lineTo(to.x - normal.x * 16 * scale - normal.y * 12 * scale, to.y - normal.y * 16 * scale + normal.x * 12 * scale); - self.context.lineTo(to.x - normal.x * 16 * scale + normal.y * 12 * scale, to.y - normal.y * 16 * scale - normal.x * 12 * scale); - self.context.fill(); - } - } - } - } - - this.updateArrowsThrottled = Utils.throttle(this.updateArrows, this.UPDATE_ARROWS_THROTTLE_MS); - - this.getHighlightedText = function(text) - { - text = text.replace(/\/g, '>'); - text = text.replace(/\<\<(.*?)\>\>/g, '

<<

$1

>>

'); - text = text.replace(/\[\[([^\|]*?)\]\]/g, '

[[

$1

]]

'); - text = text.replace(/\[\[([^\[\]]*?)\|([^\[\]]*?)\]\]/g, '

[[

$1

|

$2

]]

'); - text = text.replace(/\/\/(.*)?($|\n)/g, '//$1\n'); - text = text.replace(/\/\*((.|[\r\n])*)?\*\//gm, '/*$1*/'); - text = text.replace(/\/\%((.|[\r\n])*)?\%\//gm, '/%$1%/'); - - // create a temporary document and remove all styles inside comments - var div = $("
"); - div[0].innerHTML = text; - div.find(".comment").each(function() - { - $(this).find("p").each(function() - { - $(this).removeClass(); - }) - }) - - // unhighlight links that don't exist - div.find(".linkname").each(function() - { - var name = $(this).text(); - var found = false; - for (var i in self.nodes()) - { - if (self.nodes()[i].title().toLowerCase() == name.toLowerCase()) - { - found = true; - break; - } - } - if (!found) - $(this).removeClass("linkname"); - }); - - text = div[0].innerHTML; - return text; - } - - this.updateLineNumbers = function(text) - { - // update line numbers - var lines = text.split("\n"); - var lineNumbers = ""; - for (var i = 0; i < Math.max(1, lines.length); i ++) - { - if (i == 0 || i < lines.length - 1 || lines[i].length > 0) - lineNumbers += (i + 1) + "
"; - } - $(".editor-container .lines").html(lineNumbers); - } - - this.updateHighlights = function(e) - { - if (e.keyCode == 17 || (e.keyCode >= 37 && e.keyCode <= 40)) - return; - - // get the text - var editor = $(".editor"); - var text = editor[0].innerText; - var startOffset, endOffset; - - // ctrl + z - if ((e.metaKey || e.ctrlKey) && e.keyCode == 90) - { - if (self.editingHistory.length > 0) - { - var last = self.editingHistory.pop(); - text = last.text; - startOffset = last.start; - endOffset = last.end; - } - else - { - return; - } - } - else - { - // get the current start offset - var range = window.getSelection().getRangeAt(0); - var preCaretStartRange = range.cloneRange(); - preCaretStartRange.selectNodeContents(editor[0]); - preCaretStartRange.setEnd(range.startContainer, range.startOffset); - startOffset = preCaretStartRange.toString().length; - - // get the current end offset - var preCaretEndRange = range.cloneRange(); - preCaretEndRange.selectNodeContents(editor[0]); - preCaretEndRange.setEnd(range.endContainer, range.endOffset); - endOffset = preCaretEndRange.toString().length; - - // ctrl + c - if ((e.metaKey || e.ctrlKey) && e.keyCode == 67) - { - if (self.gui != undefined) - { - var clipboard = self.gui.Clipboard.get(); - clipboard.set(text.substr(startOffset, (endOffset - startOffset)), 'text'); - } - } - else - { - // ctrl + v - if ((e.metaKey || e.ctrlKey) && e.keyCode == 86) - { - var clipboard = self.gui.Clipboard.get(); - console.log(clipboard); - text = text.substr(0, startOffset) + clipboard.get('text') + text.substr(endOffset); - startOffset = endOffset = (startOffset + clipboard.get('text').length); - } - // ctrl + x - else if ((e.metaKey || e.ctrlKey) && e.keyCode == 88) - { - if (self.gui != undefined) - { - var clipboard = self.gui.Clipboard.get(); - clipboard.set(text.substr(startOffset, (endOffset - startOffset)), 'text'); - text = text.substr(0, startOffset) + text.substr(endOffset); - endOffset = startOffset; - } - } - // increment if we just hit enter - else if (e.keyCode == 13) - { - startOffset ++; - endOffset ++; - if (startOffset > text.length) - startOffset = text.length; - if (endOffset > text.length) - endOffset = text.length; - } - // take into account tab character - else if (e.keyCode == 9) - { - text = text.substr(0, startOffset) + "\t" + text.substr(endOffset); - startOffset ++; - endOffset = startOffset; - e.preventDefault(); - } - - // save history (in chunks) - if ((self.editingHistory.length == 0 || text != self.editingHistory[self.editingHistory.length - 1].text)) - { - if (self.editingSaveHistoryTimeout == null) - self.editingHistory.push({ text: text, start: startOffset, end: endOffset }); - clearTimeout(self.editingSaveHistoryTimeout); - self.editingSaveHistoryTimeout = setTimeout(function() { self.editingSaveHistoryTimeout = null; }, 500); - } - } - } - - // update text - //editor[0].innerHTML = self.getHighlightedText(text); - - self.updateLineNumbers(text); - - // reset offsets - if (document.createRange && window.getSelection) - { - function getTextNodesIn(node) - { - var textNodes = []; - if (node.nodeType == 3) - textNodes.push(node); - else - { - var children = node.childNodes; - for (var i = 0, len = children.length; i < len; ++i) - textNodes.push.apply(textNodes, getTextNodesIn(children[i])); - } - return textNodes; - } - - var range = document.createRange(); - range.selectNodeContents(editor[0]); - var textNodes = getTextNodesIn(editor[0]); - var charCount = 0, endCharCount; - var foundStart = false; - var foundEnd = false; - - for (var i = 0, textNode; textNode = textNodes[i++]; ) - { - endCharCount = charCount + textNode.length; - if (!foundStart && startOffset >= charCount && (startOffset <= endCharCount || (startOffset == endCharCount && i < textNodes.length))) - { - range.setStart(textNode, startOffset - charCount); - foundStart = true; - } - if (!foundEnd && endOffset >= charCount && (endOffset <= endCharCount || (endOffset == endCharCount && i < textNodes.length))) - { - range.setEnd(textNode, endOffset - charCount); - foundEnd = true; - } - if (foundStart && foundEnd) - break; - charCount = endCharCount; - } - - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - } - } - - this.zoom = function(zoomLevel) - { - switch (zoomLevel) - { - case 1: - self.cachedScale = 0.25; - break; - case 2: - self.cachedScale = 0.5; - break; - case 3: - self.cachedScale = 0.75; - break; - case 4: - self.cachedScale = 1; - break; - } - - self.translate(200); - } - - this.translate = function(speed) - { - var updateArrowsInterval = setInterval(self.updateArrowsThrottled, 16); - - $(".nodes-holder").transition( - { - transform: ( - "matrix(" + - self.cachedScale + ",0,0," + - self.cachedScale + "," + - self.transformOrigin[0] +"," + - self.transformOrigin[1] + - ")" - ) - }, - speed || 0, - "easeInQuad", - function() { - clearInterval(updateArrowsInterval); - self.updateArrowsThrottled(); - } - ); - } - - /** - * Align selected nodes relative to a node with the lowest x-value - */ - this.arrangeX = function() - { - var SPACING = 250; - - var selectedNodes = self.nodes().filter(function(el) { - return el.selected; - }) - .sort(function(a, b) { - if (a.x() > b.x()) return 1; - if (a.x() < b.x()) return -1; - return 0; - }), - referenceNode = selectedNodes.shift(); - - if (!selectedNodes.length) { - alert('Select nodes to align'); - return; - } - - selectedNodes.forEach(function(node, i) { - var x = referenceNode.x() + (SPACING * (i + 1)); - node.moveTo(x, referenceNode.y()); - }); - } - - /** - * Align selected nodes relative to a node with the lowest y-value - */ - this.arrangeY = function() - { - var SPACING = 250; - - var selectedNodes = self.nodes().filter(function(el) { - return el.selected; - }) - .sort(function(a, b) { - if (a.y() > b.y()) return 1; - if (a.y() < b.y()) return -1; - return 0; - }), - referenceNode = selectedNodes.shift(); - - if (!selectedNodes.length) { - alert('Select nodes to align'); - return; - } - - selectedNodes.forEach(function(node, i) { - var y = referenceNode.y() + (SPACING * (i + 1)); - node.moveTo(referenceNode.x(), y); - }); - } - - this.arrangeSpiral = function() - { - for (var i in self.nodes()) - { - var node = self.nodes()[i]; - var y = Math.sin(i * .5) * (600 + i * 30); - var x = Math.cos(i * .5) * (600 + i * 30); - node.moveTo(x, y); - } - } - - this.sortAlphabetical = function() - { - console.log(self.nodes.sort); - self.nodes.sort(function(a, b) { return a.title().localeCompare(b.title()); }); - } - - this.moveNodes = function(offX, offY) - { - for (var i in self.nodes()) - { - var node = self.nodes()[i]; - node.moveTo(node.x() + offX, node.y() + offY); - } - } - - this.warpToNodeIdx = function(idx) - { - if (self.nodes().length > idx) - { - var node = self.nodes()[idx]; - var nodeXScaled = -( node.x() * self.cachedScale ), - nodeYScaled = -( node.y() * self.cachedScale ), - winXCenter = $(window).width() / 2, - winYCenter = $(window).height() / 2, - nodeWidthShift = node.tempWidth * self.cachedScale / 2, - nodeHeightShift = node.tempHeight * self.cachedScale / 2; - - self.transformOrigin[0] = nodeXScaled + winXCenter - nodeWidthShift; - self.transformOrigin[1] = nodeYScaled + winYCenter - nodeHeightShift; - self.translate(100); - self.focusedNodeIdx = idx; - } - } - - this.warpToSelectedNodeIdx = function(idx) - { - if (self.getSelectedNodes().length > idx) - { - var node = self.getSelectedNodes()[idx]; - var nodeXScaled = -( node.x() * self.cachedScale ), - nodeYScaled = -( node.y() * self.cachedScale ), - winXCenter = $(window).width() / 2, - winYCenter = $(window).height() / 2, - nodeWidthShift = node.tempWidth * self.cachedScale / 2, - nodeHeightShift = node.tempHeight * self.cachedScale / 2; - - self.transformOrigin[0] = nodeXScaled + winXCenter - nodeWidthShift; - self.transformOrigin[1] = nodeYScaled + winYCenter - nodeHeightShift; - self.translate(100); - self.focusedNodeIdx = idx; - } - } - - this.warpToNodeXY = function(x, y) - { - //alert("warp to x, y: " + x + ", " + y); - const nodeWidth = 100, nodeHeight = 100; - var nodeXScaled = -( x * self.cachedScale ), - nodeYScaled = -( y * self.cachedScale ), - winXCenter = $(window).width() / 2, - winYCenter = $(window).height() / 2, - nodeWidthShift = nodeWidth * self.cachedScale / 2, - nodeHeightShift = nodeHeight * self.cachedScale / 2; - - self.transformOrigin[0] = nodeXScaled + winXCenter - nodeWidthShift; - self.transformOrigin[1] = nodeYScaled + winYCenter - nodeHeightShift; - - //alert("self.transformOrigin[0]: " + self.transformOrigin[0]); - self.translate(100); - } - - this.searchWarp = function() - { - // if search field is empty - if (self.$searchField.val() == "") - { - // warp to the first node - self.warpToNodeIdx(0); - } - else - { - var search = self.$searchField.val().toLowerCase(); - for (var i in self.nodes()) - { - var node = self.nodes()[i]; - if (node.title().toLowerCase() == search) - { - self.warpToNodeIdx(i); - return; - } - } - } - } - - this.clearSearch = function() - { - self.$searchField.val(""); - self.updateSearch(); - } - - - this.updateEditorStats = function() - { - var editor = ace.edit('editor'); - var text = editor.getSession().getValue(); - var cursor = editor.getCursorPosition(); - - var lines = text.split("\n"); - - $(".editor-footer .character-count").html(text.length); - $(".editor-footer .line-count").html(lines.length); - $(".editor-footer .row-index").html(cursor.row); - $(".editor-footer .column-index").html(cursor.column); - } -} + } + if (e.keyCode === 31 || e.key === "Enter") { + // Open active node, if already active, close it + + if (self.editing() === null) { + var activeNode = self.nodes()[self.focusedNodeIdx]; + if (activeNode !== undefined) { + self.editNode(activeNode); + } else { + self.editNode(self.nodes()[0]); + } + } else if (e.ctrlKey) { + //ctrl+ enter closes an open node + self.saveNode(); + } + } + // Spacebar toggle between nodes + if (e.keyCode === 32) { + if (self.editing() !== null && !e.ctrlKey) { + return; // Ctrl+spacebar to toggle between open nodes + } + var selectedNodes = self.getSelectedNodes(); + var nodes = selectedNodes.length > 0 ? selectedNodes : self.nodes(); + var isNodeSelected = selectedNodes.length > 0; + if ( + self.focusedNodeIdx > -1 && + nodes.length > self.focusedNodeIdx && + (self.transformOrigin[0] != + -nodes[self.focusedNodeIdx].x() + + $(window).width() / 2 - + $(nodes[self.focusedNodeIdx].element).width() / 2 || + self.transformOrigin[1] != + -nodes[self.focusedNodeIdx].y() + + $(window).height() / 2 - + $(nodes[self.focusedNodeIdx].element).height() / 2) + ) { + self.focusedNodeIdx = -1; + } + + if (++self.focusedNodeIdx >= nodes.length) { + self.focusedNodeIdx = 0; + } + self.cachedScale = 1; + if (isNodeSelected) { + self.warpToSelectedNodeIdx(self.focusedNodeIdx); + } else { + self.warpToNodeIdx(self.focusedNodeIdx); + } + + if (self.editing() !== null) { + self.editNode(self.nodes()[self.focusedNodeIdx]); + } + } + }); + + $(window).on("resize", self.updateArrowsThrottled); + + $(document).on("keyup keydown mousedown mouseup", function(e) { + if (self.editing() != null) { + self.updateEditorStats(); + } + }); + + // apple command key + //$(window).on('keydown', function(e) { if (e.keyCode == 91 || e.keyCode == 93) { self.appleCmdKey = true; } }); + //$(window).on('keyup', function(e) { if (e.keyCode == 91 || e.keyCode == 93) { self.appleCmdKey = false; } }); + + // Handle file dropping + document.ondragover = document.ondrop = e => { + e.preventDefault(); + }; + document.body.ondrop = e => { + e.preventDefault(); + data.openFile($("#open-file"), e.dataTransfer.files[0].path); + for (i = 1; i < e.dataTransfer.files.length; i++) { + data.appendFile(e, e.dataTransfer.files[i].path, false); + } + }; + }; + + this.getNodesConnectedTo = function(toNode) { + var connectedNodes = []; + var nodes = self.nodes(); + for (var i in nodes) { + if (nodes[i] != toNode && nodes[i].isConnectedTo(toNode, true)) { + var hasNode = false; + for (var j in connectedNodes) { + if (connectedNodes[j] == nodes[i]) { + hasNode = true; + break; + } + } + if (!hasNode) connectedNodes.push(nodes[i]); + } + } + return connectedNodes; + }; + + this.mouseUpOnNodeNotMoved = function() { + self.deselectAllNodes(); + }; + + this.matchConnectedColorID = function(fromNode) { + var nodes = self.getNodesConnectedTo(fromNode); + for (var i in nodes) nodes[i].colorID(fromNode.colorID()); + }; + + this.quit = function() { + if (self.gui != undefined) { + self.gui.App.quit(); + } + }; + + this.refreshWindowTitle = function(editingPath) { + // var gui = require('nw.gui'); + var gui = remote.getCurrentWindow(); + if (!gui) return; + + // Get the current window + // var win = gui.Window.get(); //Borked + var win = remote.getCurrentWindow(); + + win.title = "Yarn - [" + editingPath + "] "; // + (self.dirty?"*":""); + }; + + this.recordNodeAction = function(action, node) { + //we can't go forward in 'time' when + //new actions have been made + if (self.nodeFuture.length > 0) { + for (var i = 0; i < self.nodeFuture.length; i++) { + var future = self.nodeFuture.pop(); + delete future.node; + } + + delete self.nodeFuture; + self.nodeFuture = []; + } + + var historyItem = { + action: action, + node: node, + lastX: node.x(), + lastY: node.y() + }; + + if (action == "removed") { + historyItem.lastY += 80; + } + + self.nodeHistory.push(historyItem); + }; + + this.historyDirection = function(direction) { + function removeNode(node) { + var index = self.nodes.indexOf(node); + if (index >= 0) { + self.nodes.splice(index, 1); + } + self.updateNodeLinks(); + } + + var historyItem = null; + + if (direction == "undo") historyItem = self.nodeHistory.pop(); + else historyItem = self.nodeFuture.pop(); + + if (!historyItem) return; + + var action = historyItem.action; + var node = historyItem.node; + + if (direction == "undo") { + //undo actions + if (action == "created") { + historyItem.lastX = node.x(); + historyItem.lastY = node.y(); + removeNode(node); + } else if (action == "removed") { + self.recreateNode(node, historyItem.lastX, historyItem.lastY); + } + + self.nodeFuture.push(historyItem); + } //redo undone actions + else { + if (action == "created") { + self.recreateNode(node, historyItem.lastX, historyItem.lastY); + } else if (action == "removed") { + removeNode(node); + } + + self.nodeHistory.push(historyItem); + } + }; + + this.recreateNode = function(node, x, y) { + self.nodes.push(node); + node.moveTo(x, y); + self.updateNodeLinks(); + }; + + this.setSelectedColors = function(node) { + var nodes = self.getSelectedNodes(); + nodes.splice(nodes.indexOf(node), 1); + + for (var i in nodes) nodes[i].colorID(node.colorID()); + }; + + this.getSelectedNodes = function() { + var selectedNode = []; + + for (var i in self.nodeSelection) { + selectedNode.push(self.nodeSelection[i]); + } + + return selectedNode; + }; + + this.deselectAllNodes = function() { + var nodes = self.nodes(); + for (var i in nodes) { + self.removeNodeSelection(nodes[i]); + } + }; + + this.addNodeSelected = function(node) { + var index = self.nodeSelection.indexOf(node); + if (index < 0) { + self.nodeSelection.push(node); + node.setSelected(true); + } + }; + + this.removeNodeSelection = function(node) { + var index = self.nodeSelection.indexOf(node); + if (index >= 0) { + self.nodeSelection.splice(index, 1); + node.setSelected(false); + } + }; + + this.deleteSelectedNodes = function() { + var nodes = self.getSelectedNodes(); + for (var i in nodes) { + self.removeNodeSelection(nodes[i]); + nodes[i].remove(); + } + }; + + this.newNode = function(updateArrows) { + var node = new Node(); + self.nodes.push(node); + if (updateArrows == undefined || updateArrows == true) + self.updateNodeLinks(); + + self.recordNodeAction("created", node); + + return node; + }; + + this.newNodeAt = function(x, y) { + var node = new Node(); + + self.nodes.push(node); + + node.x(x - 100); + node.y(y - 100); + self.updateNodeLinks(); + self.recordNodeAction("created", node); + + return node; + }; + + this.removeNode = function(node) { + if (node.selected) { + self.deleteSelectedNodes(); + } + var index = self.nodes.indexOf(node); + if (index >= 0) { + self.recordNodeAction("removed", node); + self.nodes.splice(index, 1); + } + self.updateNodeLinks(); + }; + + this.editNode = function(node) { + if (node.active()) { + self.editing(node); + + $(".node-editor") + .css({ opacity: 0 }) + .transition({ opacity: 1 }, 250); + $(".node-editor .form") + .css({ y: "-100" }) + .transition({ y: "0" }, 250); + + //enable_spellcheck(); + contents_modified = true; + //spell_check(); + + self.updateEditorStats(); + } + }; + + this.trim = function(x) { + return x.replace(/^\s+|\s+$/gm, ""); + }; + + this.appendText = function(textToAppend) { + self + .editing() + .body( + self.editing().body() + + " [[Answer:" + + textToAppend + + "|" + + textToAppend + + "]]" + ); + }; + + this.testRunFrom = function(startTestNode) { + ipc.send( + "testYarnStoryFrom", + JSON.parse(data.getSaveData(FILETYPE.JSON)), + startTestNode + ); + }; + + this.openNodeListMenu = function(action) { + var helperLinkSearch = document.getElementById(action + "HelperMenuFilter") + .value; + var rootMenu = document.getElementById(action + "HelperMenu"); + for (let i = rootMenu.childNodes.length - 1; i > 1; i--) { + rootMenu.removeChild(rootMenu.childNodes[i]); + } + app.nodes().forEach((node, i) => { + if ( + node + .title() + .toLowerCase() + .indexOf(helperLinkSearch) >= 0 || + helperLinkSearch.length == 0 + ) { + var p = document.createElement("span"); + p.innerHTML = node.title(); + p.setAttribute("class", "item"); + var pColor = node.titleColorValues[app.nodes()[i].colorID()]; + p.setAttribute("style", "background:" + pColor + ";"); + + if (action == "link") { + if (node.title() !== self.editing().title()) { + p.setAttribute("onclick", "app.appendText('" + node.title() + "')"); + rootMenu.appendChild(p); + } + } else if (action == "run") { + if ( + node + .title() + .toLowerCase() + .indexOf(helperLinkSearch) >= 0 || + helperLinkSearch.length == 0 + ) { + p.setAttribute( + "onclick", + "app.testRunFrom('" + node.title() + "')" + ); + rootMenu.appendChild(p); + } + } + } + }); + }; + + this.saveNode = function() { + if (self.editing() != null) { + self.makeNewNodesFromLinks();// + self.updateNodeLinks(); + self.editing().title(self.trim(self.editing().title())); + + $(".node-editor").transition({ opacity: 0 }, 250); + $(".node-editor .form").transition({ y: "-100" }, 250, function() { + self.editing(null); + }); + + setTimeout(self.updateSearch, 100); + } + }; + + this.updateSearch = function() { + var search = self.$searchField.val().toLowerCase(); + var title = $(".search-title input").is(":checked"); + var body = $(".search-body input").is(":checked"); + var tags = $(".search-tags input").is(":checked"); + + var on = 1; + var off = 0.25; + + for (var i = 0; i < app.nodes().length; i++) { + var node = app.nodes()[i]; + var element = $(node.element); + + if (search.length > 0 && (title || body || tags)) { + var matchTitle = + title && + node + .title() + .toLowerCase() + .indexOf(search) >= 0; + var matchBody = + body && + node + .body() + .toLowerCase() + .indexOf(search) >= 0; + var matchTags = + tags && + node + .tags() + .toLowerCase() + .indexOf(search) >= 0; + + if (matchTitle || matchBody || matchTags) { + node.active(true); + element.clearQueue(); + element.transition({ opacity: on }, 500); + } else { + node.active(false); + element.clearQueue(); + element.transition({ opacity: off }, 500); + } + } else { + node.active(true); + element.clearQueue(); + element.transition({ opacity: on }, 500); + } + } + }; + + this.updateNodeLinks = function() { + for (var i in self.nodes()) self.nodes()[i].updateLinks(); + }; + + this.makeNewNodesFromLinks = function(){ + var otherNodeTitles = []; + app.nodes().forEach((node) => { + otherNodeTitles.push(node.title()); + }); + + var nodeLinks = self.editing().getLinksInNode(); + if (nodeLinks == undefined){return} + for (var i = 0; i < nodeLinks.length; i ++) + { + // Create new Nodes from Node Links + if (!otherNodeTitles.includes(nodeLinks[i])){ + var newNodeOffset = 220 * (i+1); + self.newNodeAt(self.editing().x() + newNodeOffset, self.editing().y() - 120).title(nodeLinks[i]); + } + } + } + + this.updateArrows = function() { + self.canvas.width = $(window).width(); + self.canvas.height = $(window).height(); + + var scale = self.cachedScale; + var offset = $(".nodes-holder").offset(); + + self.context.clearRect(0, 0, $(window).width(), $(window).height()); + self.context.lineWidth = 4 * scale; + + var nodes = self.nodes(); + + for (var i in nodes) { + var node = nodes[i]; + nodes[i].tempWidth = $(node.element).width(); + nodes[i].tempHeight = $(node.element).height(); + nodes[i].tempOpacity = $(node.element).css("opacity"); + } + + for (var index in nodes) { + var node = nodes[index]; + if (node.linkedTo().length > 0) { + for (var link in node.linkedTo()) { + var linked = node.linkedTo()[link]; + + // get origins + var fromX = (node.x() + node.tempWidth / 2) * scale + offset.left; + var fromY = (node.y() + node.tempHeight / 2) * scale + offset.top; + var toX = (linked.x() + linked.tempWidth / 2) * scale + offset.left; + var toY = (linked.y() + linked.tempHeight / 2) * scale + offset.top; + + // get the normal + var distance = Math.sqrt( + (fromX - toX) * (fromX - toX) + (fromY - toY) * (fromY - toY) + ); + var normal = { + x: (toX - fromX) / distance, + y: (toY - fromY) / distance + }; + + var dist = + 110 + 160 * (1 - Math.max(Math.abs(normal.x), Math.abs(normal.y))); + + // get from / to + var from = { + x: fromX + normal.x * dist * scale, + y: fromY + normal.y * dist * scale + }; + var to = { + x: toX - normal.x * dist * scale, + y: toY - normal.y * dist * scale + }; + + self.context.strokeStyle = + "rgba(0, 0, 0, " + node.tempOpacity * 0.6 + ")"; + self.context.fillStyle = + "rgba(0, 0, 0, " + node.tempOpacity * 0.6 + ")"; + + // draw line + self.context.beginPath(); + self.context.moveTo(from.x, from.y); + self.context.lineTo(to.x, to.y); + self.context.stroke(); + + // draw arrow + self.context.beginPath(); + self.context.moveTo(to.x + normal.x * 4, to.y + normal.y * 4); + self.context.lineTo( + to.x - normal.x * 16 * scale - normal.y * 12 * scale, + to.y - normal.y * 16 * scale + normal.x * 12 * scale + ); + self.context.lineTo( + to.x - normal.x * 16 * scale + normal.y * 12 * scale, + to.y - normal.y * 16 * scale - normal.x * 12 * scale + ); + self.context.fill(); + } + } + } + }; + + this.updateArrowsThrottled = Utils.throttle( + this.updateArrows, + this.UPDATE_ARROWS_THROTTLE_MS + ); + + this.getHighlightedText = function(text) { + text = text.replace(/\/g, ">"); + text = text.replace( + /\<\<(.*?)\>\>/g, + '

<<

$1

>>

' + ); + text = text.replace( + /\[\[([^\|]*?)\]\]/g, + '

[[

$1

]]

' + ); + text = text.replace( + /\[\[([^\[\]]*?)\|([^\[\]]*?)\]\]/g, + '

[[

$1

|

$2

]]

' + ); + text = text.replace( + /\/\/(.*)?($|\n)/g, + '//$1\n' + ); + text = text.replace( + /\/\*((.|[\r\n])*)?\*\//gm, + '/*$1*/' + ); + text = text.replace( + /\/\%((.|[\r\n])*)?\%\//gm, + '/%$1%/' + ); + + // create a temporary document and remove all styles inside comments + var div = $("
"); + div[0].innerHTML = text; + div.find(".comment").each(function() { + $(this) + .find("p") + .each(function() { + $(this).removeClass(); + }); + }); + + // unhighlight links that don't exist + div.find(".linkname").each(function() { + var name = $(this).text(); + var found = false; + for (var i in self.nodes()) { + if ( + self + .nodes() + [i].title() + .toLowerCase() == name.toLowerCase() + ) { + found = true; + break; + } + } + if (!found) $(this).removeClass("linkname"); + }); + + text = div[0].innerHTML; + return text; + }; + + this.updateLineNumbers = function(text) { + // update line numbers + var lines = text.split("\n"); + var lineNumbers = ""; + for (var i = 0; i < Math.max(1, lines.length); i++) { + if (i == 0 || i < lines.length - 1 || lines[i].length > 0) + lineNumbers += i + 1 + "
"; + } + $(".editor-container .lines").html(lineNumbers); + }; + + this.updateHighlights = function(e) { + if (e.keyCode == 17 || (e.keyCode >= 37 && e.keyCode <= 40)) return; + + // get the text + var editor = $(".editor"); + var text = editor[0].innerText; + var startOffset, endOffset; + + // ctrl + z + if ((e.metaKey || e.ctrlKey) && e.keyCode == 90) { + if (self.editingHistory.length > 0) { + var last = self.editingHistory.pop(); + text = last.text; + startOffset = last.start; + endOffset = last.end; + } else { + return; + } + } else { + // get the current start offset + var range = window.getSelection().getRangeAt(0); + var preCaretStartRange = range.cloneRange(); + preCaretStartRange.selectNodeContents(editor[0]); + preCaretStartRange.setEnd(range.startContainer, range.startOffset); + startOffset = preCaretStartRange.toString().length; + + // get the current end offset + var preCaretEndRange = range.cloneRange(); + preCaretEndRange.selectNodeContents(editor[0]); + preCaretEndRange.setEnd(range.endContainer, range.endOffset); + endOffset = preCaretEndRange.toString().length; + + // ctrl + c + if ((e.metaKey || e.ctrlKey) && e.keyCode == 67) { + if (self.gui != undefined) { + var clipboard = self.gui.Clipboard.get(); + clipboard.set( + text.substr(startOffset, endOffset - startOffset), + "text" + ); + } + } else { + // ctrl + v + if ((e.metaKey || e.ctrlKey) && e.keyCode == 86) { + var clipboard = self.gui.Clipboard.get(); + console.log(clipboard); + text = + text.substr(0, startOffset) + + clipboard.get("text") + + text.substr(endOffset); + startOffset = endOffset = startOffset + clipboard.get("text").length; + } + // ctrl + x + else if ((e.metaKey || e.ctrlKey) && e.keyCode == 88) { + if (self.gui != undefined) { + var clipboard = self.gui.Clipboard.get(); + clipboard.set( + text.substr(startOffset, endOffset - startOffset), + "text" + ); + text = text.substr(0, startOffset) + text.substr(endOffset); + endOffset = startOffset; + } + } + // increment if we just hit enter + else if (e.keyCode == 13) { + startOffset++; + endOffset++; + if (startOffset > text.length) startOffset = text.length; + if (endOffset > text.length) endOffset = text.length; + } + // take into account tab character + else if (e.keyCode == 9) { + text = text.substr(0, startOffset) + "\t" + text.substr(endOffset); + startOffset++; + endOffset = startOffset; + e.preventDefault(); + } + + // save history (in chunks) + if ( + self.editingHistory.length == 0 || + text != self.editingHistory[self.editingHistory.length - 1].text + ) { + if (self.editingSaveHistoryTimeout == null) + self.editingHistory.push({ + text: text, + start: startOffset, + end: endOffset + }); + clearTimeout(self.editingSaveHistoryTimeout); + self.editingSaveHistoryTimeout = setTimeout(function() { + self.editingSaveHistoryTimeout = null; + }, 500); + } + } + } + + // update text + //editor[0].innerHTML = self.getHighlightedText(text); + + self.updateLineNumbers(text); + + // reset offsets + if (document.createRange && window.getSelection) { + function getTextNodesIn(node) { + var textNodes = []; + if (node.nodeType == 3) textNodes.push(node); + else { + var children = node.childNodes; + for (var i = 0, len = children.length; i < len; ++i) + textNodes.push.apply(textNodes, getTextNodesIn(children[i])); + } + return textNodes; + } + + var range = document.createRange(); + range.selectNodeContents(editor[0]); + var textNodes = getTextNodesIn(editor[0]); + var charCount = 0, + endCharCount; + var foundStart = false; + var foundEnd = false; + + for (var i = 0, textNode; (textNode = textNodes[i++]); ) { + endCharCount = charCount + textNode.length; + if ( + !foundStart && + startOffset >= charCount && + (startOffset <= endCharCount || + (startOffset == endCharCount && i < textNodes.length)) + ) { + range.setStart(textNode, startOffset - charCount); + foundStart = true; + } + if ( + !foundEnd && + endOffset >= charCount && + (endOffset <= endCharCount || + (endOffset == endCharCount && i < textNodes.length)) + ) { + range.setEnd(textNode, endOffset - charCount); + foundEnd = true; + } + if (foundStart && foundEnd) break; + charCount = endCharCount; + } + + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + } + }; + + this.zoom = function(zoomLevel) { + switch (zoomLevel) { + case 1: + self.cachedScale = 0.25; + break; + case 2: + self.cachedScale = 0.5; + break; + case 3: + self.cachedScale = 0.75; + break; + case 4: + self.cachedScale = 1; + break; + } + + self.translate(200); + }; + + this.translate = function(speed) { + var updateArrowsInterval = setInterval(self.updateArrowsThrottled, 16); + + $(".nodes-holder").transition( + { + transform: + "matrix(" + + self.cachedScale + + ",0,0," + + self.cachedScale + + "," + + self.transformOrigin[0] + + "," + + self.transformOrigin[1] + + ")" + }, + speed || 0, + "easeInQuad", + function() { + clearInterval(updateArrowsInterval); + self.updateArrowsThrottled(); + } + ); + }; + + /** + * Align selected nodes relative to a node with the lowest x-value + */ + this.arrangeX = function() { + var SPACING = 250; + + var selectedNodes = self + .nodes() + .filter(function(el) { + return el.selected; + }) + .sort(function(a, b) { + if (a.x() > b.x()) return 1; + if (a.x() < b.x()) return -1; + return 0; + }), + referenceNode = selectedNodes.shift(); + + if (!selectedNodes.length) { + alert("Select nodes to align"); + return; + } + + selectedNodes.forEach(function(node, i) { + var x = referenceNode.x() + SPACING * (i + 1); + node.moveTo(x, referenceNode.y()); + }); + }; + + /** + * Align selected nodes relative to a node with the lowest y-value + */ + this.arrangeY = function() { + var SPACING = 250; + + var selectedNodes = self + .nodes() + .filter(function(el) { + return el.selected; + }) + .sort(function(a, b) { + if (a.y() > b.y()) return 1; + if (a.y() < b.y()) return -1; + return 0; + }), + referenceNode = selectedNodes.shift(); + + if (!selectedNodes.length) { + alert("Select nodes to align"); + return; + } + + selectedNodes.forEach(function(node, i) { + var y = referenceNode.y() + SPACING * (i + 1); + node.moveTo(referenceNode.x(), y); + }); + }; + + this.arrangeSpiral = function() { + for (var i in self.nodes()) { + var node = self.nodes()[i]; + var y = Math.sin(i * 0.5) * (600 + i * 30); + var x = Math.cos(i * 0.5) * (600 + i * 30); + node.moveTo(x, y); + } + }; + + this.sortAlphabetical = function() { + console.log(self.nodes.sort); + self.nodes.sort(function(a, b) { + return a.title().localeCompare(b.title()); + }); + }; + + this.moveNodes = function(offX, offY) { + for (var i in self.nodes()) { + var node = self.nodes()[i]; + node.moveTo(node.x() + offX, node.y() + offY); + } + }; + + this.warpToNodeIdx = function(idx) { + if (self.nodes().length > idx) { + var node = self.nodes()[idx]; + var nodeXScaled = -(node.x() * self.cachedScale), + nodeYScaled = -(node.y() * self.cachedScale), + winXCenter = $(window).width() / 2, + winYCenter = $(window).height() / 2, + nodeWidthShift = (node.tempWidth * self.cachedScale) / 2, + nodeHeightShift = (node.tempHeight * self.cachedScale) / 2; + + self.transformOrigin[0] = nodeXScaled + winXCenter - nodeWidthShift; + self.transformOrigin[1] = nodeYScaled + winYCenter - nodeHeightShift; + self.translate(100); + self.focusedNodeIdx = idx; + } + }; + + this.warpToSelectedNodeIdx = function(idx) { + if (self.getSelectedNodes().length > idx) { + var node = self.getSelectedNodes()[idx]; + var nodeXScaled = -(node.x() * self.cachedScale), + nodeYScaled = -(node.y() * self.cachedScale), + winXCenter = $(window).width() / 2, + winYCenter = $(window).height() / 2, + nodeWidthShift = (node.tempWidth * self.cachedScale) / 2, + nodeHeightShift = (node.tempHeight * self.cachedScale) / 2; + + self.transformOrigin[0] = nodeXScaled + winXCenter - nodeWidthShift; + self.transformOrigin[1] = nodeYScaled + winYCenter - nodeHeightShift; + self.translate(100); + self.focusedNodeIdx = idx; + } + }; + + this.warpToNodeXY = function(x, y) { + //alert("warp to x, y: " + x + ", " + y); + const nodeWidth = 100, + nodeHeight = 100; + var nodeXScaled = -(x * self.cachedScale), + nodeYScaled = -(y * self.cachedScale), + winXCenter = $(window).width() / 2, + winYCenter = $(window).height() / 2, + nodeWidthShift = (nodeWidth * self.cachedScale) / 2, + nodeHeightShift = (nodeHeight * self.cachedScale) / 2; + + self.transformOrigin[0] = nodeXScaled + winXCenter - nodeWidthShift; + self.transformOrigin[1] = nodeYScaled + winYCenter - nodeHeightShift; + + //alert("self.transformOrigin[0]: " + self.transformOrigin[0]); + self.translate(100); + }; + + this.searchWarp = function() { + // if search field is empty + if (self.$searchField.val() == "") { + // warp to the first node + self.warpToNodeIdx(0); + } else { + var search = self.$searchField.val().toLowerCase(); + for (var i in self.nodes()) { + var node = self.nodes()[i]; + if (node.title().toLowerCase() == search) { + self.warpToNodeIdx(i); + return; + } + } + } + }; + + this.clearSearch = function() { + self.$searchField.val(""); + self.updateSearch(); + }; + + this.updateEditorStats = function() { + var editor = ace.edit("editor"); + var text = editor.getSession().getValue(); + var cursor = editor.getCursorPosition(); + + var lines = text.split("\n"); + + $(".editor-footer .character-count").html(text.length); + $(".editor-footer .line-count").html(lines.length); + $(".editor-footer .row-index").html(cursor.row); + $(".editor-footer .column-index").html(cursor.column); + }; +}; diff --git a/app/js/classes/data.js b/app/js/classes/data.js index e872999..f04d1f6 100644 --- a/app/js/classes/data.js +++ b/app/js/classes/data.js @@ -1,40 +1,58 @@ -var FILETYPE = { JSON: "json", XML: "xml", TWEE: "twee", TWEE2: "tw2", UNKNOWN: "none", YARNTEXT: "yarn.txt" }; - -var data = -{ - editingPath: ko.observable(null), - editingType: ko.observable(""), - editingFolder: ko.observable(null), - - readFile: function(e, filename, clearNodes) - { - if (app.fs != undefined) - { - if (app.fs.readFile(filename, "utf-8", function(error, contents) - { - if (error) - { - - } - else - { - var type = data.getFileType(filename); - if (type == FILETYPE.UNKNOWN) - alert("Unknown filetype!"); - else - { - data.editingPath(filename); - data.editingType(type); - data.loadData(contents, type, clearNodes); - } - } - })); - } - else - { - alert("Unable to load file from your browser"); - } - /* +var FILETYPE = { + JSON: "json", + XML: "xml", + TWEE: "twee", + TWEE2: "tw2", + UNKNOWN: "none", + YARNTEXT: "yarn.txt" +}; + +const ipc = require("electron").ipcRenderer; + +ipc.on("selected-file", function(event, path, operation) { + if (operation == "tryOpenFile") { + data.openFile($("#open-file"), path); + } else if (operation == "tryAppend") { + data.openFileDialog($("#open-file"), path); + } +}); + +ipc.on("saved-file", function(event, path, type, content) { + data.editingType(type); + data.saveTo(path, content); + app.refreshWindowTitle(path); +}); + +ipc.on("loadYarnDataObject", function(event, yarnData) { + console.log("Loading YARN data From Game engine..."); + data.loadData(JSON.stringify(yarnData), FILETYPE.JSON, true); +}); + +var data = { + editingPath: ko.observable(null), + editingType: ko.observable(""), + editingFolder: ko.observable(null), + + readFile: function(e, filename, clearNodes) { + if (app.fs != undefined) { + if ( + app.fs.readFile(filename, "utf-8", function(error, contents) { + if (error) { + } else { + var type = data.getFileType(filename); + if (type == FILETYPE.UNKNOWN) alert("Unknown filetype!"); + else { + data.editingPath(filename); + data.editingType(type); + data.loadData(contents, type, clearNodes); + } + } + }) + ); + } else { + alert("Unable to load file from your browser"); + } + /* else if (window.File && window.FileReader && window.FileList && window.Blob && e.target && e.target.files && e.target.files.length > 0) { var reader = new FileReader(); @@ -54,42 +72,35 @@ var data = reader.readAsText(e.target.files[0], "UTF-8"); } */ - }, - - openFile: function(e, filename) - { - data.readFile(e, filename, true); - - app.refreshWindowTitle(filename); - }, - - openFolder: function(e, foldername) - { - editingFolder = foldername; - alert("openFolder not yet implemented e: " + e + " foldername: " + foldername); - }, - - appendFile: function(e, filename) - { - data.readFile(e, filename, false); - }, - - getFileType: function(filename) - { - var clone = filename; - - if (filename.toLowerCase().indexOf(".json") > -1) - return FILETYPE.JSON; - else if (filename.toLowerCase().indexOf(".yarn.txt") > -1) - return FILETYPE.YARNTEXT; - else if (filename.toLowerCase().indexOf(".xml") > -1) - return FILETYPE.XML; - else if (filename.toLowerCase().indexOf(".txt") > -1) - return FILETYPE.TWEE; - else if (filename.toLowerCase().indexOf(".tw2") > -1) - return FILETYPE.TWEE2; - return FILETYPE.UNKNOWN; - /* + }, + + openFile: function(e, filename) { + data.readFile(e, filename, true); + app.refreshWindowTitle(filename); + }, + + openFolder: function(e, foldername) { + editingFolder = foldername; + alert( + "openFolder not yet implemented e: " + e + " foldername: " + foldername + ); + }, + + appendFile: function(e, filename) { + data.readFile(e, filename, false); + }, + + getFileType: function(filename) { + var clone = filename; + + if (filename.toLowerCase().indexOf(".json") > -1) return FILETYPE.JSON; + else if (filename.toLowerCase().indexOf(".yarn.txt") > -1) + return FILETYPE.YARNTEXT; + else if (filename.toLowerCase().indexOf(".xml") > -1) return FILETYPE.XML; + else if (filename.toLowerCase().indexOf(".txt") > -1) return FILETYPE.TWEE; + else if (filename.toLowerCase().indexOf(".tw2") > -1) return FILETYPE.TWEE2; + return FILETYPE.UNKNOWN; + /* // is json? if (/^[\],:{}\s]*$/.test(clone.replace(/\\["\\\/bfnrtu]/g, '@'). replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). @@ -109,379 +120,340 @@ var data = return FILETYPE.TWEE; return FILETYPE.UNKNOWN; */ - }, - - loadData: function(content, type, clearNodes) - { - // clear all content - if (clearNodes) - app.nodes.removeAll(); - - var objects = []; - var i = 0; - if (type == FILETYPE.JSON) - { - content = JSON.parse(content); - for (i = 0; i < content.length; i ++) - objects.push(content[i]); - } - else if (type == FILETYPE.YARNTEXT) - { - var lines = content.split("\n"); - var obj = null; - var index = 0; - var readingBody = false; - for (var i = 0; i < lines.length; i ++) - { - - if (lines[i].trim() == "===") - { - readingBody = false; - if (obj != null) - { - objects.push(obj); - obj = null; - } - } - else if (readingBody) - { - obj.body += lines[i] + "\n"; - } - else - { - if (lines[i].indexOf("title:") > -1) - { - if (obj == null) - obj = {}; - obj.title = lines[i].substr(7, lines[i].length-7); - } - else if (lines[i].indexOf("position:") > -1) - { - if (obj == null) - obj = {} - var xy = lines[i].substr(9, lines[i].length-9).split(','); - obj.position = { x: Number(xy[0].trim()), y: Number(xy[1].trim()) } - } - else if (lines[i].indexOf("colorID:") > -1) - { - if (obj == null) - obj = {} - obj.colorID = Number(lines[i].substr(9, lines[i].length-9).trim()); - } - else if (lines[i].indexOf("tags:") > -1) - { - if (obj == null) - obj = {} - obj.tags = lines[i].substr(6, lines[i].length-6); - } - else if (lines[i].trim() == "---") - { - readingBody = true; - obj.body = ""; - } - } - } - if (obj != null) - { - objects.push(obj); - } - } - else if (type == FILETYPE.TWEE || type == FILETYPE.TWEE2) - { - var lines = content.split("\n"); - var obj = null; - var index = 0; - for (var i = 0; i < lines.length; i ++) - { - lines[i] = lines[i].trim(); - if (lines[i].substr(0, 2) == "::") - { - if (obj != null) - objects.push(obj); - - obj = {}; - index ++; - - var title = ""; - var tags = ""; - var position = {x: index * 80, y: index * 80}; - - // check if there are tags - var openBracket = lines[i].indexOf("["); - var closeBracket = lines[i].indexOf("]"); - if (openBracket > 0 && closeBracket > 0) - { - tags = lines[i].substr(openBracket + 1, closeBracket - openBracket - 1); - } - - // check if there are positions (Twee2) - var openPosition = lines[i].indexOf("<"); - var closePosition = lines[i].indexOf(">"); - - if (openPosition > 0 && closePosition > 0) - { - var coordinates = lines[i].substr(openPosition + 1, closePosition - openPosition - 1).split(','); - position.x = parseInt(coordinates[0]); - position.y = parseInt(coordinates[1]); - } - - var metaStart = 0; - if (openBracket > 0) { - metaStart = openBracket; - } else if (openPosition > 0) { - // Twee2 dictates that tags must come before position, so we'll only care about this if we don't - // have any tags for this Passage - metaStart = openPosition - } - - console.log(openBracket, openPosition, metaStart); - - if (metaStart) { - title = lines[i].substr(3, metaStart - 3); - } else { - title = lines[i].substr(3); - } - - obj.title = title; - obj.tags = tags; - obj.body = ""; - obj.position = position; - } - else if (obj != null) - { - if (obj.body.length > 0) - lines[i] += '\n'; - obj.body += lines[i]; - } - } - - if (obj != null) - objects.push(obj); - } - else if (type == FILETYPE.XML) - { - var oParser = new DOMParser(); - var xml = oParser.parseFromString(content, "text/xml"); - content = Utils.xmlToObject(xml); - - if (content != undefined) - for (i = 0; i < content.length; i ++) - objects.push(content[i]); - } - - var avgX = 0, avgY = 0; - var numAvg = 0; - for (var i = 0; i < objects.length; i ++) - { - var node = new Node(); - app.nodes.push(node); - - var object = objects[i] - if (object.title != undefined) - node.title(object.title); - if (object.body != undefined) - node.body(object.body); - if (object.tags != undefined) - node.tags(object.tags); - if (object.position != undefined && object.position.x != undefined) - { - node.x(object.position.x); - avgX += object.position.x; - numAvg ++; - } - if (object.position != undefined && object.position.y != undefined) - { - node.y(object.position.y); - avgY += object.position.y; - } - if (object.colorID != undefined) - node.colorID(object.colorID); - } - - if (numAvg > 0) - { - app.warpToNodeXY(avgX/numAvg, avgY/numAvg); - } - - $(".arrows").css({ opacity: 0 }).transition({ opacity: 1 }, 500); - app.updateNodeLinks(); - }, - - getSaveData: function(type) - { - var output = ""; - var content = []; - var nodes = app.nodes(); - - for (var i = 0; i < nodes.length; i ++) - { - content.push({ - "title": nodes[i].title(), - "tags": nodes[i].tags(), - "body": nodes[i].body(), - "position": { "x": nodes[i].x(), "y": nodes[i].y() }, - "colorID": nodes[i].colorID() - }); - } - - if (type == FILETYPE.JSON) - { - output = JSON.stringify(content, null, "\t"); - } - else if (type == FILETYPE.YARNTEXT) - { - for (i = 0; i < content.length; i++) - { - output += "title: " + content[i].title + "\n"; - output += "tags: " + content[i].tags + "\n"; - output += "colorID: " + content[i].colorID + "\n"; - output += "position: " + content[i].position.x + "," + content[i].position.y + "\n"; - output += "---\n"; - output += content[i].body; - var body = content[i].body - if (!(body.length > 0 && body[body.length-1] == '\n')) - { - output += "\n"; - } - output += "===\n"; - } - } - else if (type == FILETYPE.TWEE) - { - for (i = 0; i < content.length; i ++) - { - var tags = ""; - if (content[i].tags.length > 0) - tags = " [" + content[i].tags + "]" - output += ":: " + content[i].title + tags + "\n"; - output += content[i].body + "\n\n"; - } - } - else if (type == FILETYPE.TWEE2) - { - for (i = 0; i < content.length; i ++) - { - var tags = ""; - if (content[i].tags.length > 0) - tags = " [" + content[i].tags + "]" - var position = " <" + content[i].position.x + "," + content[i].position.y + ">"; - output += ":: " + content[i].title + tags + position + "\n"; - output += content[i].body + "\n\n"; - } + }, + + loadData: function(content, type, clearNodes) { + // clear all content + if (clearNodes) app.nodes.removeAll(); + + var objects = []; + var i = 0; + if (type == FILETYPE.JSON) { + content = JSON.parse(content); + if (!content) { + return; + } + for (i = 0; i < content.length; i++) objects.push(content[i]); + } else if (type == FILETYPE.YARNTEXT) { + var lines = content.split("\n"); + var obj = null; + var index = 0; + var readingBody = false; + for (var i = 0; i < lines.length; i++) { + if (lines[i].trim() == "===") { + readingBody = false; + if (obj != null) { + objects.push(obj); + obj = null; + } + } else if (readingBody) { + obj.body += lines[i] + "\n"; + } else { + if (lines[i].indexOf("title:") > -1) { + if (obj == null) obj = {}; + obj.title = lines[i].substr(7, lines[i].length - 7); + } else if (lines[i].indexOf("position:") > -1) { + if (obj == null) obj = {}; + var xy = lines[i].substr(9, lines[i].length - 9).split(","); + obj.position = { x: Number(xy[0].trim()), y: Number(xy[1].trim()) }; + } else if (lines[i].indexOf("colorID:") > -1) { + if (obj == null) obj = {}; + obj.colorID = Number( + lines[i].substr(9, lines[i].length - 9).trim() + ); + } else if (lines[i].indexOf("tags:") > -1) { + if (obj == null) obj = {}; + obj.tags = lines[i].substr(6, lines[i].length - 6); + } else if (lines[i].trim() == "---") { + readingBody = true; + obj.body = ""; + } } - else if (type == FILETYPE.XML) - { - output += '\n'; - for (i = 0; i < content.length; i ++) - { - output += "\t\n"; - output += "\t\t" + content[i].title + "\n"; - output += "\t\t" + content[i].tags + "\n"; - output += "\t\t" + content[i].body + "\n"; - output += '\t\t\n'; - output += '\t\t' + content[i].colorID + '\n'; - output += "\t\n"; - } - output += '\n'; - } - - return output; - }, - - saveTo: function(path, content) - { - if (app.fs != undefined) - { - app.fs.writeFile(path, content, {encoding: 'utf-8'}, function(err) - { - data.editingPath(path); - if(err) - alert("Error Saving Data to " + path + ": " + err); - }); - } - }, - - openFileDialog: function(dialog, callback) - { - dialog.bind("change", function(e) - { - // make callback - callback(e, dialog.val()); - - // replace input field with a new identical one, with the value cleared - // (html can't edit file field values) - var saveas = ''; - var accept = ''; - if (dialog.attr("nwsaveas") != undefined) - saveas = 'nwsaveas="' + dialog.attr("nwsaveas") + '"' - if (dialog.attr("accept") != undefined) - saveas = 'accept="' + dialog.attr("accept") + '"' - - dialog.parent().append(''); - dialog.unbind("change"); - dialog.remove(); - }); - - dialog.trigger("click"); - }, - - saveFileDialog: function(dialog, type, content) - { - var file = 'file.' + type; - - if (app.fs) - { - dialog.attr("nwsaveas", file); - data.openFileDialog(dialog, function(e, path) - { - data.saveTo(path, content); - app.refreshWindowTitle(path); - }); - } - else - { - switch(type) { - case 'json': - content = "data:text/json," + content; - break; - case 'xml': - content = "data:text/xml," + content; - break; - default: - content = "data:text/plain," + content; - break; - } - window.open(content, "_blank"); - } - }, - - tryOpenFile: function() - { - data.openFileDialog($('#open-file'), data.openFile); - }, - - tryOpenFolder: function() - { - data.openFileDialog($('#open-folder'), data.openFolder); - }, - - tryAppend: function() - { - data.openFileDialog($('#open-file'), data.appendFile); - }, - - trySave: function(type) - { - data.editingType(type); - data.saveFileDialog($('#save-file'), type, data.getSaveData(type)); - }, - - trySaveCurrent: function() - { - if (data.editingPath().length > 0 && data.editingType().length > 0) - { - data.saveTo(data.editingPath(), data.getSaveData(data.editingType())); - } - } - -} + } + if (obj != null) { + objects.push(obj); + } + } else if (type == FILETYPE.TWEE || type == FILETYPE.TWEE2) { + var lines = content.split("\n"); + var obj = null; + var index = 0; + for (var i = 0; i < lines.length; i++) { + lines[i] = lines[i].trim(); + if (lines[i].substr(0, 2) == "::") { + if (obj != null) objects.push(obj); + + obj = {}; + index++; + + var title = ""; + var tags = ""; + var position = { x: index * 80, y: index * 80 }; + + // check if there are tags + var openBracket = lines[i].indexOf("["); + var closeBracket = lines[i].indexOf("]"); + if (openBracket > 0 && closeBracket > 0) { + tags = lines[i].substr( + openBracket + 1, + closeBracket - openBracket - 1 + ); + } + + // check if there are positions (Twee2) + var openPosition = lines[i].indexOf("<"); + var closePosition = lines[i].indexOf(">"); + + if (openPosition > 0 && closePosition > 0) { + var coordinates = lines[i] + .substr(openPosition + 1, closePosition - openPosition - 1) + .split(","); + position.x = parseInt(coordinates[0]); + position.y = parseInt(coordinates[1]); + } + + var metaStart = 0; + if (openBracket > 0) { + metaStart = openBracket; + } else if (openPosition > 0) { + // Twee2 dictates that tags must come before position, so we'll only care about this if we don't + // have any tags for this Passage + metaStart = openPosition; + } + + console.log(openBracket, openPosition, metaStart); + + if (metaStart) { + title = lines[i].substr(3, metaStart - 3); + } else { + title = lines[i].substr(3); + } + + obj.title = title; + obj.tags = tags; + obj.body = ""; + obj.position = position; + } else if (obj != null) { + if (obj.body.length > 0) lines[i] += "\n"; + obj.body += lines[i]; + } + } + + if (obj != null) objects.push(obj); + } else if (type == FILETYPE.XML) { + var oParser = new DOMParser(); + var xml = oParser.parseFromString(content, "text/xml"); + content = Utils.xmlToObject(xml); + + if (content != undefined) + for (i = 0; i < content.length; i++) objects.push(content[i]); + } + + var avgX = 0, + avgY = 0; + var numAvg = 0; + for (var i = 0; i < objects.length; i++) { + var node = new Node(); + app.nodes.push(node); + + var object = objects[i]; + if (object.title != undefined) node.title(object.title); + if (object.body != undefined) node.body(object.body); + if (object.tags != undefined) node.tags(object.tags); + if (object.position != undefined && object.position.x != undefined) { + node.x(object.position.x); + avgX += object.position.x; + numAvg++; + } + if (object.position != undefined && object.position.y != undefined) { + node.y(object.position.y); + avgY += object.position.y; + } + if (object.colorID != undefined) node.colorID(object.colorID); + } + + if (numAvg > 0) { + app.warpToNodeXY(avgX / numAvg, avgY / numAvg); + } + + $(".arrows") + .css({ opacity: 0 }) + .transition({ opacity: 1 }, 500); + app.updateNodeLinks(); + }, + + getSaveData: function(type) { + var output = ""; + var content = []; + var nodes = app.nodes(); + + for (var i = 0; i < nodes.length; i++) { + content.push({ + title: nodes[i].title(), + tags: nodes[i].tags(), + body: nodes[i].body(), + position: { x: nodes[i].x(), y: nodes[i].y() }, + colorID: nodes[i].colorID() + }); + } + + if (type == FILETYPE.JSON) { + output = JSON.stringify(content, null, "\t"); + } else if (type == FILETYPE.YARNTEXT) { + for (i = 0; i < content.length; i++) { + output += "title: " + content[i].title + "\n"; + output += "tags: " + content[i].tags + "\n"; + output += "colorID: " + content[i].colorID + "\n"; + output += + "position: " + + content[i].position.x + + "," + + content[i].position.y + + "\n"; + output += "---\n"; + output += content[i].body; + var body = content[i].body; + if (!(body.length > 0 && body[body.length - 1] == "\n")) { + output += "\n"; + } + output += "===\n"; + } + } else if (type == FILETYPE.TWEE) { + for (i = 0; i < content.length; i++) { + var tags = ""; + if (content[i].tags.length > 0) tags = " [" + content[i].tags + "]"; + output += ":: " + content[i].title + tags + "\n"; + output += content[i].body + "\n\n"; + } + } else if (type == FILETYPE.TWEE2) { + for (i = 0; i < content.length; i++) { + var tags = ""; + if (content[i].tags.length > 0) tags = " [" + content[i].tags + "]"; + var position = + " <" + content[i].position.x + "," + content[i].position.y + ">"; + output += ":: " + content[i].title + tags + position + "\n"; + output += content[i].body + "\n\n"; + } + } else if (type == FILETYPE.XML) { + output += "\n"; + for (i = 0; i < content.length; i++) { + output += "\t\n"; + output += "\t\t" + content[i].title + "\n"; + output += "\t\t" + content[i].tags + "\n"; + output += "\t\t" + content[i].body + "\n"; + output += + '\t\t\n'; + output += "\t\t" + content[i].colorID + "\n"; + output += "\t\n"; + } + output += "\n"; + } + + return output; + }, + + saveTo: function(path, content) { + if (app.fs != undefined) { + app.fs.writeFile(path, content, { encoding: "utf-8" }, function(err) { + data.editingPath(path); + if (err) alert("Error Saving Data to " + path + ": " + err); + }); + } + }, + + openFileDialog: function(dialog, callback) { + dialog.bind("change", function(e) { + // make callback + callback(e, dialog.val()); + + // replace input field with a new identical one, with the value cleared + // (html can't edit file field values) + var saveas = ""; + var accept = ""; + if (dialog.attr("nwsaveas") != undefined) + saveas = 'nwsaveas="' + dialog.attr("nwsaveas") + '"'; + if (dialog.attr("accept") != undefined) + saveas = 'accept="' + dialog.attr("accept") + '"'; + + dialog + .parent() + .append( + '" + ); + dialog.unbind("change"); + dialog.remove(); + }); + + dialog.trigger("click"); + }, + + saveFileDialog: function(dialog, type, content) { + if (ipc) { + var file = "file." + type; + ipc.send("saveFileYarn", type, content); + return; + } + if (app.fs) { + dialog.attr("nwsaveas", file); + data.openFileDialog(dialog, function(e, path) { + data.saveTo(path, content); + app.refreshWindowTitle(path); + }); + } else { + switch (type) { + case "json": + content = "data:text/json," + content; + break; + case "xml": + content = "data:text/xml," + content; + break; + default: + content = "data:text/plain," + content; + break; + } + window.open(content, "_blank"); + } + }, + + tryOpenFile: function() /// Refactor to send signal to the main process + { + ipc.send("openFileYarn", "tryOpenFile"); + // data.openFileDialog($('#open-file'), data.openFile); + }, + + tryOpenFolder: function() { + data.openFileDialog($("#open-folder"), data.openFolder); + }, + + tryAppend: function() { + ipc.send("openFileYarn", "tryAppend"); + // data.openFileDialog($('#open-file'), data.appendFile); + }, + + trySave: function(type) { + data.editingType(type); + data.saveFileDialog($("#save-file"), type, data.getSaveData(type)); + }, + + trySaveCurrent: function() { + if (data.editingPath().length > 0 && data.editingType().length > 0) { + data.saveTo(data.editingPath(), data.getSaveData(data.editingType())); + } + }, + + sendToExternalApp: function() { + ipc.send( + "sendYarnDataToObject", + JSON.parse(data.getSaveData(FILETYPE.JSON)) + ); + } +}; diff --git a/app/js/classes/node.js b/app/js/classes/node.js index bffd02d..2803c0e 100644 --- a/app/js/classes/node.js +++ b/app/js/classes/node.js @@ -6,7 +6,7 @@ const ClipNodeTextLength = 1024; var Node = function() { var self = this; - + this.titleColorValues = ['#eee','#6EA5E0','#9EDE74','#FFE374','#F7A666','#C47862','#97E1E9']; // primary values this.index = ko.observable(globalNodeIndex++); this.title = ko.observable("Node" + this.index()); @@ -325,38 +325,56 @@ var Node = function() return false; } - this.updateLinks = function() - { - self.resetDoubleClick(); - // clear existing links - self.linkedTo.removeAll(); - + this.getLinksInNode = function(){ // find all the links var links = self.body().match(/\[\[(.*?)\]\]/g); + if (links != undefined) { var exists = {}; for (var i = links.length - 1; i >= 0; i --) { - links[i] = links[i].substr(2, links[i].length - 4).toLowerCase(); - + links[i] = links[i].substr(2, links[i].length - 4)//.toLowerCase(); + if (links[i].indexOf("|") >= 0) + { links[i] = links[i].split("|")[1]; + } if (exists[links[i]] != undefined) + { links.splice(i, 1); - + } exists[links[i]] = true; } + return links + } + else{return undefined} + } + + this.updateLinks = function() + { + self.resetDoubleClick(); + // clear existing links + self.linkedTo.removeAll(); + // find all the links + var links = self.getLinksInNode(); + if (links != undefined) + { // update links for (var index in app.nodes()) { var other = app.nodes()[index]; for (var i = 0; i < links.length; i ++) - if (other != self && other.title().toLowerCase() == links[i]) + { + // if (other != self && other.title().toLowerCase() == links[i]) + if (other != self && other.title() == links[i]) + { self.linkedTo.push(other); - } + } + } + } } } diff --git a/app/js/classes/renderer.js b/app/js/classes/renderer.js new file mode 100644 index 0000000..6b3f010 --- /dev/null +++ b/app/js/classes/renderer.js @@ -0,0 +1,137 @@ +const bondage = require('bondage'); +const bbcode = require('bbcode'); +const yarnRunner = new bondage.Runner(); +const EventEmitter = require('events').EventEmitter + +var yarnRender = function() { + this.self = this; + this.vnChoiceSelectionCursor = ">"; + this.startTimeWait; + this.vnSelectedChoice = -1; + this.vnTextScrollInterval; + this.finished = false; + this.commandsPassedLog = []; + this.commandPassed = ""; + this.emiter = new EventEmitter(); + + var vnChoices, vnTextResult, vnResult ,VNtext ,vnTextScroll ,htmIDtoAttachYarnTo,vnTextScrollIdx = 0; + this.vnUpdateChoice = function(direction=0){ //dir: -1 or 1 + if (this.vnSelectedChoice < 0){return}; + var attemptChoice = this.vnSelectedChoice + direction; + if (attemptChoice > vnResult.options.length-1){ + attemptChoice = 0; + } + else if (attemptChoice < 0){console.log("last"); + attemptChoice = vnResult.options.length-1}; + this.vnSelectedChoice = attemptChoice; + vnChoices = ""; + vnResult.options.forEach((choice,i) => { + vnChoices += "\n " ; + if(i==this.vnSelectedChoice){ vnChoices += this.vnChoiceSelectionCursor } + else{vnChoices += " "}; + vnChoices += " ["+choice+"] "; + }) + self.updateVNHud(); + } + + this.vnSelectChoice = function(){ + var endTimeWait = new Date().getTime(); + if (endTimeWait - this.startTimeWait < 1000){return}; // we need to wait for user to see the questions + vnResult.select(this.vnSelectedChoice); + vnResult = VNtext.next().value ; + vnChoices = ""; + this.vnSelectedChoice = -1; + this.changeTextScrollSpeed(111); + } + + this.changeTextScrollSpeed = function(interval=0){ /// this function is triggered on key press/release + if (vnResult == undefined){ + // this.terminate(); + this.finished = true; + return + }; + if (interval == this.vnTextScrollInterval){return};/// use this to stop it from triggering on every frame + this.vnTextScrollInterval = interval; + clearInterval(vnTextScroll);//this resets the scroll timer + + // if (vnResult.constructor.name == "CommandResult" ){ + // this.commandsPassedLog.push(vnResult.value) ; + // this.commandsPassed = vnResult.value; + // this.emiter.emit("command",vnResult.value); + // vnTextScrollIdx = 0; + // vnResult = VNtext.next().value; + // this.changeTextScrollSpeed(200); + // return; + // } + + if (vnResult.constructor.name == "OptionsResult"){ /// Add choices to text + if (this.vnSelectedChoice === -1){ /// we need to set it to -1 after choice is made + this.vnSelectedChoice = 0; + this.vnUpdateChoice(); + this.startTimeWait = new Date().getTime(); + } + return + } + + if(vnTextScrollIdx >= vnResult.text.length){ /// Scrolled to end of text, move on + vnTextScrollIdx = 0; + vnResult = VNtext.next().value + this.changeTextScrollSpeed(200); + return; + }; + if( interval == 0){return}; + vnTextScroll = setInterval(self.scrollUpdateText, interval); + } + + self.scrollUpdateText = function(){ + vnTextResult = vnResult.text.substring(0,vnTextScrollIdx); + self.updateVNHud(); + } + + self.updateVNHud = function (){ /// trigger this only on text update + vnTextScrollIdx += 1; + var bbcodeHtml = vnTextResult; + if (vnResult.constructor.name === "TextResult"){ + if (vnResult.text.includes("[")) { + while(vnTextResult.lastIndexOf("[") > vnTextResult.lastIndexOf("]")){ + vnTextScrollIdx += 1; + vnTextResult = vnResult.text.substring(0,vnTextScrollIdx); + }; + bbcodeHtml =bbcode.parse(vnTextResult); + } + }; + + var RenderHtml = "
" + RenderHtml += bbcodeHtml + "
" + if(vnChoices !== undefined){ + RenderHtml += "

"+ vnChoices + "

" ///TODO: Render bbcode to html + } + RenderHtml += "
"; + document.getElementById(htmIDtoAttachYarnTo).innerHTML=RenderHtml; + } + + this.terminate = function(){ + document.getElementById(htmIDtoAttachYarnTo).innerHTML=""; + VNtext = null; + vnResult = null; + } + + this.initYarn = function(yarnDataObject,startChapter,htmlIdToAttachTo){ + htmIDtoAttachYarnTo =htmlIdToAttachTo + this.yarnDataObject= yarnDataObject + this.startChapter = startChapter + yarnRunner.load(yarnDataObject); + this.loadYarnChapter(startChapter); + } + + //todo- rename to startChapter + this.loadYarnChapter = function(storyChapter){ + this.finished = false; + console.log("LOADING YARN DATA... chapter: "+storyChapter); + VNtext = yarnRunner.run(storyChapter); + console.log("YARN::") + console.log(VNtext); + vnResult = VNtext.next().value + this.changeTextScrollSpeed(100) + } +} \ No newline at end of file diff --git a/app/renderer.html b/app/renderer.html new file mode 100644 index 0000000..af616c8 --- /dev/null +++ b/app/renderer.html @@ -0,0 +1,77 @@ + + + + + + Bondage.js Testing Yarn Story + + + + + + + + +
 
+

+ Press "Z" to advance... + + + \ No newline at end of file diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000..d53b3d1 Binary files /dev/null and b/build/icon.png differ diff --git a/main.js b/main.js new file mode 100644 index 0000000..651887b --- /dev/null +++ b/main.js @@ -0,0 +1,147 @@ +const electron = require("electron"); +const ipcMain = electron.ipcMain; +const { dialog } = electron; +const { autoUpdater } = require("electron-updater"); +const isDev = require('electron-is').dev(); +// Module to control application life. +const app = electron.app; +// Module to create native browser window. +const BrowserWindow = electron.BrowserWindow; + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let mainWindow; +let yarnRunnerWindow; +let yarnVersion = "0.3.2"; + +function createWindow() { + // Create the browser window. + // screen.height; + // screen.width; + let { width, height } = require("electron").screen.getPrimaryDisplay().size; + mainWindow = new BrowserWindow({ + defaultWidth: 1000, + defaultHeight: 800, + maximize: false, + show: false, + autoHideMenuBar: true + }); + mainWindow.setMenu(null); + // and load the index.html of the app. + mainWindow.loadURL(`file://${__dirname}/app/index.html`); + + if (isDev) { + mainWindow.webContents.openDevTools(); + } + + mainWindow.on("close", function(event) { + event.preventDefault(); + if (yarnRunnerWindow) { + yarnRunnerWindow.destroy(); + } + mainWindow.destroy(); + mainWindow = null; + }); + + mainWindow.webContents.on('dom-ready', () => { // in case you want to send data to yarn window on init + // mainWindow.webContents.send('loadYarnDataObject', yarnData); + mainWindow.webContents.send('setVersionNumber', yarnVersion); + mainWindow.show(); + mainWindow.maximize(); + }); + + ipcMain.on("openFileYarn", (event, operation) => { + dialog.showOpenDialog( + { + properties: ["openFile"] + }, + function(files) { + if (files) + mainWindow.webContents.send("selected-file", files[0], operation); + } + ); + }); + + ipcMain.on("saveFileYarn", (event, type, content) => { + dialog.showSaveDialog( + mainWindow, + { filters: [{ name: "story", extensions: [type] }] }, + function(filepath) { + mainWindow.webContents.send("saved-file", filepath, type, content); + } + ); + }); + + ipcMain.on("sendYarnDataToObject", (event, content, startTestNode) => { + // in case you wannt to export yarn object to another embedded app + // otherApp.webContents.send('yarnSavedStory',content); + // mainWindow.close(); + }); + + ipcMain.on("testYarnStoryFrom", (event, content, startTestNode) => { + createYarnTesterWindow(content, startTestNode); + }); + + // when the update has been downloaded and is ready to be installed, notify the BrowserWindow + autoUpdater.on("update-downloaded", info => { + mainWindow.webContents.send("updateReady"); + }); + + // when receiving a quitAndInstall signal, quit and install the new version ;) + ipcMain.on("quitAndInstall", (event, arg) => { + autoUpdater.quitAndInstall(); + }); +} + +function createYarnTesterWindow(content, startTestNode) { + // console.log("START RUN::"+startTestNode); + if (yarnRunnerWindow) { + yarnRunnerWindow.destroy(); + } + yarnRunnerWindow = new BrowserWindow({ + defaultWidth: 1400, + defaultHeight: 200, + maximize: false, + show: false, + autoHideMenuBar: true + }); + + yarnRunnerWindow.loadURL(`file://${__dirname}/app/renderer.html`); + if (isDev) { + yarnRunnerWindow.webContents.openDevTools() + }; + + yarnRunnerWindow.webContents.on("dom-ready", () => { + yarnRunnerWindow.webContents.send( + "loadYarnDataOnRunner", + content, + startTestNode + ); + yarnRunnerWindow.show(); + }); +} + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on("ready", createWindow); + +// Quit when all windows are closed. +app.on("window-all-closed", function() { + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== "darwin") { + app.quit(); + } +}); + +app.on("activate", function() { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) { + createWindow(); + } +}); + +// In this file you can include the rest of your app's specific main process +// code. You can also put them in separate files and require them here. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..92de877 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3152 @@ +{ + "name": "yarn", + "version": "0.3.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "7zip-bin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.0.2.tgz", + "integrity": "sha512-XtGk+IF57pr852UK1AhQJXqmm1WmSgS5uISL+LPs0z/iAxXouMvdlLJrHPeukP6gd7yR2rDTMSMkHNODgwIq7A==", + "dev": true + }, + "@types/node": { + "version": "8.10.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.19.tgz", + "integrity": "sha512-+PU57o6DtOSx0/algmxgCwWrmCiomwC/K+LPfXonT0tQMbNTjHEqVzwL9dFEhFoPmLFIiSWjRorLH6Z0hJMT+Q==", + "dev": true + }, + "JSONSelect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz", + "integrity": "sha1-oI7cxn6z/L6Z7WMIVTRKDPKCu40=" + }, + "JSV": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", + "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "optional": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.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": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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" + } + } + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + }, + "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": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "app-builder-bin": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.9.7.tgz", + "integrity": "sha512-CBwiiTeilkvsrSOPV7tFsqrd5yR+V8hKqwQa21DD8nZpwN7W7v3GwVgWbaJiX97Llo4S+fvRTHSP92F3FJxIwA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "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 + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": 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-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": 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 + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "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-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "dev": true + }, + "bbcode": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/bbcode/-/bbcode-0.1.5.tgz", + "integrity": "sha1-qFR4EEd1tvPh0i8kb1X6DyI4CTs=", + "requires": { + "underscore": "*" + } + }, + "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.3" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bluebird-lst": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", + "integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==", + "requires": { + "bluebird": "^3.5.1" + } + }, + "bondage": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bondage/-/bondage-1.0.4.tgz", + "integrity": "sha512-/UKwgPmv90X+StHOm4fvlqjPQakbN4QGLS9+HWSuSBr9muNKiMVaOlB9NCAYpnzJ8ZDzYxjc+Hmg62P9IR5yPw==", + "requires": { + "commander": "^2.9.0", + "inquirer": "^3.0.6", + "jison": "^0.4.17" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "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": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + }, + "builder-util": { + "version": "5.11.2", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.11.2.tgz", + "integrity": "sha512-Do6xVlXa6MBaxMdfCHajcfOzyzo8CBDuDVDr0PftVI0CcKpUQIe81kWwcA5w6Ossd7d52harHFuVO3NzxSwWUA==", + "dev": true, + "requires": { + "7zip-bin": "~4.0.2", + "app-builder-bin": "1.9.7", + "bluebird-lst": "^1.0.5", + "builder-util-runtime": "^4.2.1", + "chalk": "^2.4.1", + "debug": "^3.1.0", + "fs-extra-p": "^4.6.0", + "is-ci": "^1.1.0", + "js-yaml": "^3.11.0", + "lazy-val": "^1.0.3", + "semver": "^5.5.0", + "source-map-support": "^0.5.6", + "stat-mode": "^0.2.2", + "temp-file": "^3.1.2" + }, + "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" + } + } + } + }, + "builder-util-runtime": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.2.1.tgz", + "integrity": "sha512-6Ufp6ExT40RDYNXQgD4xG0fgtpUHyc8XIld6lptKr0re1DNnUrQP4sSV/lJOajpzyercMP/YIzO60/mNuAFiWg==", + "requires": { + "bluebird-lst": "^1.0.5", + "debug": "^3.1.0", + "fs-extra-p": "^4.6.0", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "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 + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "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.0.0", + "map-obj": "^1.0.0" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, + "cjson": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.3.0.tgz", + "integrity": "sha1-5kObkHA9MS/24iJAl76pLOPQKhQ=", + "requires": { + "jsonlint": "1.6.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.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": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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" + } + } + } + }, + "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 + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "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 + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "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 + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "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.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.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" + } + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "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 + }, + "dmg-builder": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-4.10.1.tgz", + "integrity": "sha512-+NqdmZb5uhPV1exzeH+hD+WLtr79qRjfA38S7DckOIMQW0C5Vykvp4dqCypnupfEnEOVZMcaNCCKK639h/uS/g==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.5", + "builder-util": "^5.11.0", + "electron-builder-lib": "~20.14.6", + "fs-extra-p": "^4.6.0", + "iconv-lite": "^0.4.23", + "js-yaml": "^3.11.0", + "parse-color": "^1.0.0", + "sanitize-filename": "^1.6.1" + }, + "dependencies": { + "app-builder-bin": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.9.5.tgz", + "integrity": "sha512-Uw8jhfww5gYcAvMVgeRZ9cdlXOv+Ivqy4LSbALPMrQrCHHTmfVXETthkhW3cQKdvDo9pRuYn+Q5egSSn04F+Wg==", + "dev": true + }, + "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" + } + }, + "electron-builder-lib": { + "version": "20.14.7", + "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.14.7.tgz", + "integrity": "sha512-sPlpRN5Nea9ZK+nwZcD5ZuGoK2uCj2muQ7enc+9BeXPAxnEu4yYmYanICAi4BQqUdusm4yjjnN9uPowlbvCNzA==", + "dev": true, + "requires": { + "7zip-bin": "~4.0.2", + "app-builder-bin": "1.9.5", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.5", + "builder-util": "5.11.1", + "builder-util-runtime": "4.2.1", + "chromium-pickle-js": "^0.2.0", + "debug": "^3.1.0", + "ejs": "^2.6.1", + "electron-osx-sign": "0.4.10", + "electron-publish": "20.14.6", + "fs-extra-p": "^4.6.0", + "hosted-git-info": "^2.6.0", + "is-ci": "^1.1.0", + "isbinaryfile": "^3.0.2", + "js-yaml": "^3.11.0", + "lazy-val": "^1.0.3", + "minimatch": "^3.0.4", + "normalize-package-data": "^2.4.0", + "plist": "^3.0.1", + "read-config-file": "3.0.1", + "sanitize-filename": "^1.6.1", + "semver": "^5.5.0", + "stream-json": "^0.6.1", + "temp-file": "^3.1.2" + }, + "dependencies": { + "builder-util": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.11.1.tgz", + "integrity": "sha512-fZu9j33B4VMeUJaeb1q2TubKWrk9tAg2Jwpgjstxk7Mu7sNw7v/XB87/EbpNBlE3RPMrXblG6f8asfCRC8IiNQ==", + "dev": true, + "requires": { + "7zip-bin": "~4.0.2", + "app-builder-bin": "1.9.5", + "bluebird-lst": "^1.0.5", + "builder-util-runtime": "^4.2.1", + "chalk": "^2.4.1", + "debug": "^3.1.0", + "fs-extra-p": "^4.6.0", + "is-ci": "^1.1.0", + "js-yaml": "^3.11.0", + "lazy-val": "^1.0.3", + "semver": "^5.5.0", + "source-map-support": "^0.5.6", + "stat-mode": "^0.2.2", + "temp-file": "^3.1.2" + } + } + } + } + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "dev": true + }, + "dotenv-expand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ebnf-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/ebnf-parser/-/ebnf-parser-0.1.10.tgz", + "integrity": "sha1-zR9rpHfFY4xAyX7ZtXLbW6tdgzE=" + }, + "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.0" + } + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "electron": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.2.tgz", + "integrity": "sha512-XmkGVoHLOqmjZ2nU/0zEzMl3TZEz452Q1fTJFKjylg4pLYaq7na7V2uxzydVQNQukZGbERoA7ayjxXzTsXbtdA==", + "dev": true, + "requires": { + "@types/node": "^8.0.24", + "electron-download": "^3.0.1", + "extract-zip": "^1.0.3" + } + }, + "electron-builder": { + "version": "20.15.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.15.1.tgz", + "integrity": "sha512-oH+yMWLNH3XhwmvrSC49voVrbsG8bnKMO10vE/OUQnH/hr3Er/KHv8XBEPCYnMk3tCxEvcEANQeLoTVgeMUfKQ==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.5", + "builder-util": "5.11.2", + "builder-util-runtime": "4.2.1", + "chalk": "^2.4.1", + "dmg-builder": "4.10.1", + "electron-builder-lib": "20.15.1", + "electron-download-tf": "4.3.4", + "fs-extra-p": "^4.6.0", + "is-ci": "^1.1.0", + "lazy-val": "^1.0.3", + "read-config-file": "3.0.1", + "sanitize-filename": "^1.6.1", + "update-notifier": "^2.5.0", + "yargs": "^11.0.0" + }, + "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" + } + }, + "electron-download-tf": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/electron-download-tf/-/electron-download-tf-4.3.4.tgz", + "integrity": "sha512-SQYDGMLpTgty1bx3NycuDb7dNPzktVSdK2sqPZjyRocauq/uN/V4S2lcpFVLupaHhKlD8zozm9fTpm5UdohvTg==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "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 + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "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" + } + } + } + } + } + }, + "electron-builder-lib": { + "version": "20.15.1", + "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.15.1.tgz", + "integrity": "sha512-7FuH8+WlvIZHCEFreWuiSkOrg+AnYUf2bxYUhddeETMlH8ojfW/ehVM0RbZsEXLdXlJ70wUmxEOBwL7mWiz1lw==", + "dev": true, + "requires": { + "7zip-bin": "~4.0.2", + "app-builder-bin": "1.9.7", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.5", + "builder-util": "5.11.2", + "builder-util-runtime": "4.2.1", + "chromium-pickle-js": "^0.2.0", + "debug": "^3.1.0", + "ejs": "^2.6.1", + "electron-osx-sign": "0.4.10", + "electron-publish": "20.15.0", + "fs-extra-p": "^4.6.0", + "hosted-git-info": "^2.6.0", + "is-ci": "^1.1.0", + "isbinaryfile": "^3.0.2", + "js-yaml": "^3.11.0", + "lazy-val": "^1.0.3", + "minimatch": "^3.0.4", + "normalize-package-data": "^2.4.0", + "plist": "^3.0.1", + "read-config-file": "3.0.1", + "sanitize-filename": "^1.6.1", + "semver": "^5.5.0", + "stream-json": "^0.6.1", + "temp-file": "^3.1.2" + }, + "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" + } + }, + "electron-publish": { + "version": "20.15.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.15.0.tgz", + "integrity": "sha512-0v1jXvbRDlPK5S+LzEZqcvuFHLCSWPKmMYmbDwVheeNRjbJjQLlZyQAINVlV+Ky+yhawChEaAF+dyGLvXEyONg==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.5", + "builder-util": "^5.11.2", + "builder-util-runtime": "^4.2.1", + "chalk": "^2.4.1", + "fs-extra-p": "^4.6.0", + "lazy-val": "^1.0.3", + "mime": "^2.3.1" + } + } + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "fs-extra": "^0.30.0", + "home-path": "^1.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.0", + "path-exists": "^2.1.0", + "rc": "^1.1.2", + "semver": "^5.3.0", + "sumchecker": "^1.2.0" + } + }, + "electron-is": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/electron-is/-/electron-is-2.4.1.tgz", + "integrity": "sha512-cWPJVsyfU1lTbUCwOyEhTChl+dU5OTPgQ/qffX72aBaWE2YcgmUriRrDioBn5gnlMok/LctTzcnJSVSTUJJMjg==", + "requires": { + "electron-is-dev": "^0.3.0", + "semver": "^5.3.0" + } + }, + "electron-is-dev": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4=" + }, + "electron-osx-sign": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz", + "integrity": "sha1-vk87ibKnWh3F8eckkIGrKSnKOiY=", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^2.1.0" + }, + "dependencies": { + "plist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "dev": true, + "requires": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.x" + } + } + } + }, + "electron-publish": { + "version": "20.14.6", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.14.6.tgz", + "integrity": "sha512-14u2eT8qTNKD1ek20UK5AbjDn6qmdhAOEiTcgmjmrMoRJFQIhGwV3emFmfaY1S6uFnFdY/4MyMcU92AXD1oRsw==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.5", + "builder-util": "^5.11.0", + "builder-util-runtime": "^4.2.1", + "chalk": "^2.4.1", + "fs-extra-p": "^4.6.0", + "lazy-val": "^1.0.3", + "mime": "^2.3.1" + } + }, + "electron-updater": { + "version": "2.21.10", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-2.21.10.tgz", + "integrity": "sha512-9QNUGHqwddLFIsFiAoFSxu0NdmvB1VGKrH2dGCn/b8nDwfWwHUyCnetMsnwcVSMjHA2Lz4tGfRSDSN3PtlVDKA==", + "requires": { + "bluebird-lst": "^1.0.5", + "builder-util-runtime": "~4.2.1", + "electron-is-dev": "^0.3.0", + "fs-extra-p": "^4.6.0", + "js-yaml": "^3.11.0", + "lazy-val": "^1.0.3", + "lodash.isequal": "^4.5.0", + "semver": "^5.5.0", + "source-map-support": "^0.5.5" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "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" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "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=" + }, + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "requires": { + "esprima": "~1.1.1", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.33" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" + }, + "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.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": 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 + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "fs-extra-p": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-4.6.0.tgz", + "integrity": "sha512-nSVqB5UfWZQdU6pzBwcFh+7lJpBynnTsVtNJTBhAnAppUQRut0W7WeM271iS0TqQ9FoCqDXqyL0+h+h8DQUCpg==", + "requires": { + "bluebird-lst": "^1.0.5", + "fs-extra": "^6.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "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-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 + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "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.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": 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, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "home-path": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", + "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "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.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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-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.0.0" + } + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "^1.0.0" + } + }, + "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.0" + } + }, + "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.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "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.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "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": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "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 + }, + "jison": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/jison/-/jison-0.4.18.tgz", + "integrity": "sha512-FKkCiJvozgC7VTHhMJ00a0/IApSxhlGsFIshLW6trWJ8ONX2TQJBBz6DlcO1Gffy4w9LT+uL+PA+CVnUSJMF7w==", + "requires": { + "JSONSelect": "0.4.0", + "cjson": "0.3.0", + "ebnf-parser": "0.1.10", + "escodegen": "1.3.x", + "esprima": "1.1.x", + "jison-lex": "0.3.x", + "lex-parser": "~0.1.3", + "nomnom": "1.5.2" + } + }, + "jison-lex": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/jison-lex/-/jison-lex-0.3.4.tgz", + "integrity": "sha1-gcoo2E+ESZ36jFlNzePYo/Jux6U=", + "requires": { + "lex-parser": "0.1.x", + "nomnom": "1.5.2" + } + }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": 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 + }, + "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 + }, + "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 + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonlint": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.0.tgz", + "integrity": "sha1-iKpGvCiaesk7tGyuLVihh6m7SUo=", + "requires": { + "JSV": ">= 4.0.x", + "nomnom": ">= 1.5.x" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-val": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz", + "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==" + }, + "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" + } + }, + "lex-parser": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/lex-parser/-/lex-parser-0.1.4.tgz", + "integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA=" + }, + "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.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "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.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "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.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "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.0.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.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "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.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nomnom": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.5.2.tgz", + "integrity": "sha1-9DRUSKhTz71cDSYyDyR3qwUm/i8=", + "requires": { + "colors": "0.5.x", + "underscore": "1.1.x" + } + }, + "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.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^1.1.2", + "throttleit": "0.0.2" + } + }, + "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 + }, + "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 + }, + "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-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "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" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "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" + } + }, + "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=" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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.1.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 + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "~0.5.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "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.2.0" + } + }, + "parser-toolkit": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parser-toolkit/-/parser-toolkit-0.0.5.tgz", + "integrity": "sha1-7EthcpyGMYtW6pcb+6azxnLWLAE=", + "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.0" + } + }, + "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-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.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": 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.0" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + }, + "dependencies": { + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "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.1.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "~0.1.2", + "through2": "~0.2.3" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-config-file": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.0.1.tgz", + "integrity": "sha512-xMKmxBYENBqcTMc7r/VteufWgqI9c7oASnOxFa6Crlk4d/nVTOTOJKDhAHJCiGpD8cWzUY9t7K1+M3d75w4f9A==", + "dev": true, + "requires": { + "ajv": "^6.4.0", + "ajv-keywords": "^3.2.0", + "bluebird-lst": "^1.0.5", + "dotenv": "^5.0.1", + "dotenv-expand": "^4.2.0", + "fs-extra-p": "^4.6.0", + "js-yaml": "^3.11.0", + "json5": "^1.0.1", + "lazy-val": "^1.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", + "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "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.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.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.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "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" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "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.0" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": 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", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "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 + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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.0.5" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize-filename": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz", + "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "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=" + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "^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=", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "stream-json": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-0.6.1.tgz", + "integrity": "sha512-Tmhl5yUVusgkgCiWnoHD1BA8/LqFX5/OlYj+YMCgUuUMjbacQvSWV8p1grbKvzP6s4EBS4nK5WNsMHX7kugzyg==", + "dev": true, + "requires": { + "parser-toolkit": ">=0.0.3" + } + }, + "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.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": 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.0.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.0" + } + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "es6-promise": "^4.0.5" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "temp-file": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.1.2.tgz", + "integrity": "sha512-s5JJnUbvV6QaKBxBJm6wDpKIVVvr/ssrb8Cdaz2iaXcjFMtWX+OGBwY+UTvARoWYI5HlKaoD7xFJSpo0jJUlbA==", + "dev": true, + "requires": { + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.5", + "fs-extra-p": "^4.6.0", + "lazy-val": "^1.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": 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 + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "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.0.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 + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "underscore": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz", + "integrity": "sha1-QLq4S60Z0jAJbo1u9ii/8FXYPbA=" + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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 + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "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": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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" + } + } + } + }, + "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.1", + "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": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + }, + "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": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "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 + }, + "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" + } + }, + "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": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "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 + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/package.json b/package.json index d1cbbd6..7b7adff 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,42 @@ { - "name": "Yarn", - "version": "0.2.1", - "main": "app/index.html", - "window": { - "toolbar": false, - "position": "center", - "width": 1280, - "height": 720, - "min_width": 800, - "min_height": 600, - "icon": "Yarn.png" - } + "name": "yarn", + "version": "0.3.2", + "main": "main.js", + "window": { + "toolbar": false, + "position": "center", + "width": 1280, + "height": 720, + "min_width": 800, + "min_height": 600, + "icon": "Yarn.png" + }, + "description": "Dialogue editor created for \"Night in the Woods\" (and other projects) by @NoelFB and @infinite_ammo with contributions from @seiyria and @beeglebug. It is heavily inspired by and based on the amazing Twine software: http://twinery.org/. This version has been ported over to Electron and extended with further functionality by Todor Imreorov", + "scripts": { + "start": "electron .", + "build": "build", + "ship": "build --win --linux", + "release": "build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/blurymind/Yarn.git" + }, + "author": " @infinite_ammo, @seiyria, @beeglebug ,Todor Imreorov", + "license": "MIT", + "bugs": { + "url": "https://github.com/blurymind/Yarn/issues" + }, + "homepage": "https://github.com/blurymind/Yarn#readme", + "devDependencies": { + "electron": "^2.0.2", + "electron-builder": "^20.15.1" + }, + "dependencies": { + "bbcode": "^0.1.5", + "bondage": "^1.0.4", + "electron-is": "^2.4.1", + "electron-updater": "^2.21.10", + "jquery": "^3.3.1" + } }