From ec84cebf3b25d802447280c1ced7c878fd932206 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Sun, 10 Jun 2018 20:13:54 +0100 Subject: [PATCH 01/16] Port to electron + add new features - Helper menu to make it easier to create node links - Run menu to test dialogue (via bondage.js and bbcode) --- app/index.html | 52 +- app/js/classes/app.js | 58 +- app/js/classes/data.js | 43 +- app/js/classes/node.js | 2 +- app/js/classes/renderer.js | 148 ++++ app/renderer.html | 46 ++ main.js | 124 +++ package-lock.json | 1607 ++++++++++++++++++++++++++++++++++++ package.json | 46 +- 9 files changed, 2084 insertions(+), 42 deletions(-) create mode 100644 app/js/classes/renderer.js create mode 100644 app/renderer.html create mode 100644 main.js create mode 100644 package-lock.json diff --git a/app/index.html b/app/index.html index d44a838..4845b19 100644 --- a/app/index.html +++ b/app/index.html @@ -7,7 +7,9 @@ - + + + @@ -75,39 +77,45 @@ + + + + + -
+ node.titleColorValues[node.colorID()]}">
@@ -121,10 +129,22 @@
-
+ + + +
+ +
+ +
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 ){ + console.log('make run node') + p.setAttribute('onclick', "app.testRunFrom('" + node.title() + "')"); + rootMenu.appendChild(p); + } + } + } + }) + } + this.saveNode = function() { + // console.log(self.editing().body()); if (self.editing() != null) { self.updateNodeLinks(); diff --git a/app/js/classes/data.js b/app/js/classes/data.js index e872999..788d054 100644 --- a/app/js/classes/data.js +++ b/app/js/classes/data.js @@ -1,5 +1,23 @@ 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), @@ -59,7 +77,6 @@ var data = openFile: function(e, filename) { data.readFile(e, filename, true); - app.refreshWindowTitle(filename); }, @@ -392,6 +409,7 @@ var data = { if (app.fs != undefined) { + console.log(app.fs); app.fs.writeFile(path, content, {encoding: 'utf-8'}, function(err) { data.editingPath(path); @@ -427,8 +445,11 @@ var data = saveFileDialog: function(dialog, type, content) { - var file = 'file.' + type; - + if (ipc) { + var file = 'file.' + type; + ipc.send('saveFileYarn',type,content); + return + } if (app.fs) { dialog.attr("nwsaveas", file); @@ -455,9 +476,11 @@ var data = } }, - tryOpenFile: function() + tryOpenFile: function() /// Refactor to send signal to the main process { - data.openFileDialog($('#open-file'), data.openFile); + console.log(ipc); + ipc.send('openFileYarn','tryOpenFile'); + // data.openFileDialog($('#open-file'), data.openFile); }, tryOpenFolder: function() @@ -467,7 +490,8 @@ var data = tryAppend: function() { - data.openFileDialog($('#open-file'), data.appendFile); + ipc.send('openFileYarn','tryAppend'); + // data.openFileDialog($('#open-file'), data.appendFile); }, trySave: function(type) @@ -482,6 +506,11 @@ var data = { 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..9cb224d 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()); diff --git a/app/js/classes/renderer.js b/app/js/classes/renderer.js new file mode 100644 index 0000000..e9d6908 --- /dev/null +++ b/app/js/classes/renderer.js @@ -0,0 +1,148 @@ +const bondage = require('bondage'); +const bbcode = require('bbcode'); +const yarnRunner = new bondage.Runner(); + +var vnTextResult, vnResult ,VNtext ,vnTextScroll ,htmIDtoAttachYarnTo,vnTextScrollIdx = 0; +var yarnRender = function() { + this.self = this; + this.yarnContent; + this.startTestNode; + this.vnChoiceSelectionCursor = ">"; + this.startTimeWait; + this.vnChoices = "" + this.vnSelectedChoice = -1; + this.vnTextWithoutChoices; + this.vnTextScrollInterval; + this.yarnDialogue; + + this.jsonCopy = function(src) { + return JSON.parse(JSON.stringify(src)); + } + + 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; + this.vnChoices = ""; ///move this stuff to updateVn() + vnResult.options.forEach((choice,i) => { + this.vnChoices += "\n " ; + if(i==this.vnSelectedChoice){ this.vnChoices += this.vnChoiceSelectionCursor } + else{this.vnChoices += " "}; + this.vnChoices += " ["+choice+"] "; + }) + this.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 ; + this.vnChoices = ""; + this.vnSelectedChoice = -1; + this.changeTextScrollSpeed(111); + } + + this.changeTextScrollSpeed = function(interval=0){ /// this function is triggered on key press/release + 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 == "TextResult"){ + // vnFullText = vnResult.text; + } + // else{vnTextScroll = null;} + + 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.vnTextWithoutChoices = this.jsonCopy(vnTextResult); + this.vnUpdateChoice(); + this.startTimeWait = new Date().getTime(); + } + return + } + + if (vnResult.constructor.name == "jsEvalResult" ){ + eval(vnResult.evalString); + vnTextScrollIdx = 0; + vnResult = VNtext.next().value; + this.changeTextScrollSpeed(200); + return; + } + + // if (!(vnResult.constructor.name !== "TextResult")){ /// This is not text, skip it + // console.log('not text, do somethings else'); + // this.vnTextScrollIdx = 0; + // vnResult = VNtext.next().value + // this.changeTextScrollSpeed(200); + // 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(scrollUpdateText, interval,this.updateVNHud); + } + + var scrollUpdateText = function(updateVNHud){ + vnTextResult = vnResult.text.substring(0,vnTextScrollIdx); + // yarnRender.this.testme("err"); + updateVNHud(); + } + this.testme = function(test){ + console.log(test) + console.log("whoa") + } + + this.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 + "
" ///TODO: Render bbcode to html + if(this.vnChoices !== undefined){ + RenderHtml += "

"+ this.vnChoices + "

" ///TODO: Render bbcode to html + } + RenderHtml += "
"; + document.getElementById(htmIDtoAttachYarnTo).innerHTML=RenderHtml; + // hudTexture.needsUpdate = true; + } + + //////////////// Yarn + this.initYarn = function(yarnDataObject,startChapter,htmlIdToAttachTo){ + htmIDtoAttachYarnTo =htmlIdToAttachTo + this.yarnDataObject= yarnDataObject + this.startChapter = startChapter + yarnRunner.load(yarnDataObject); + this.loadYarnChapter(startChapter); + } + + this.loadYarnChapter = function(storyChapter){ + 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..b6963a4 --- /dev/null +++ b/app/renderer.html @@ -0,0 +1,46 @@ + + +

+ diff --git a/main.js b/main.js new file mode 100644 index 0000000..473f15a --- /dev/null +++ b/main.js @@ -0,0 +1,124 @@ +const electron = require('electron') +const ipcMain = electron.ipcMain; +const {dialog} = require('electron') +// 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 + +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 + }); + mainWindow.maximize(); + // and load the index.html of the app. + mainWindow.loadURL(`file://${__dirname}/app/index.html`) + + // Open the DevTools. + mainWindow.webContents.openDevTools(); + + // mainWindow.on('close', function (event) { + // event.preventDefault(); + // mainWindow.webContents.send('closing'); ///save file meta + // }); + + // Emitted when the window is closed. + // mainWindow.on('closed', function () { + // 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.show(); + // mainWindow.maximize(); + // }); + + // ipcMain.on('Terminating', function (event) { + // mainWindow.destroy(); + // if(yarnRunnerWindow){yarnRunnerWindow.destroy();} + // }); + + ipcMain.on('openFileYarn', (event,operation) => { + console.log("Open file"); + 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: ['json'] }]}, + function(filepath) { + mainWindow.webContents.send('saved-file', filepath,type,content); + }); + }); + + ipcMain.on('sendYarnDataToObject', (event,content,startTestNode) => { // in case you wanna export yarn object to another embedded app + // otherApp.webContents.send('yarnSavedStory',content); + // mainWindow.close(); + }) + + ipcMain.on('testYarnStoryFrom' ,(event,content,startTestNode) => { + createYarnTesterWindow(content,startTestNode); + }) + +} + +function createYarnTesterWindow(content,startTestNode){ + // console.log("START RUN::"+startTestNode); + if(yarnRunnerWindow){yarnRunnerWindow.destroy()} + yarnRunnerWindow = new BrowserWindow({ + defaultWidth: 1400, + defaultHeight: 200, + maximize: false, + show:false + }); + + yarnRunnerWindow.loadURL(`file://${__dirname}/app/renderer.html`); + yarnRunnerWindow.webContents.openDevTools(); + + yarnRunnerWindow.webContents.on('dom-ready', () => { + yarnRunnerWindow.webContents.send('loadYarnDataOnRunner', content,startTestNode); + yarnRunnerWindow.show(); + // yarnRunnerWindow.maximize(); + }); +} + +// 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. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..88657c9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1607 @@ +{ + "name": "yarn", + "version": "0.2.5", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "optional": true + }, + "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.1" + } + }, + "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 + }, + "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 + }, + "bbcode": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/bbcode/-/bbcode-0.1.5.tgz", + "integrity": "sha1-qFR4EEd1tvPh0i8kb1X6DyI4CTs=", + "requires": { + "underscore": "1.1.7" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "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.15.1", + "inquirer": "3.3.0", + "jison": "0.4.18" + } + }, + "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==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "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.1.1", + "map-obj": "1.0.1" + } + }, + "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.4.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "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-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=" + }, + "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.3" + } + }, + "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==" + }, + "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.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "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.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "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.2" + } + } + } + }, + "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 + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "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 + }, + "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.1" + } + }, + "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.10.19", + "electron-download": "3.3.0", + "extract-zip": "1.6.7" + } + }, + "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.6.9", + "fs-extra": "0.30.0", + "home-path": "1.0.6", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "2.1.0", + "rc": "1.2.8", + "semver": "5.5.0", + "sumchecker": "1.3.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "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.1", + "esutils": "1.0.0", + "source-map": "0.1.43" + } + }, + "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=" + }, + "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.2", + "iconv-lite": "0.4.23", + "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.1.0", + "pinkie-promise": "2.0.1" + } + }, + "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.18" + } + }, + "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.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "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.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "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.5.2", + "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.4.1", + "sshpk": "1.14.2" + } + }, + "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" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "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.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "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" + } + } + } + }, + "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.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "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 + }, + "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.3", + "esprima": "1.1.1", + "jison-lex": "0.3.4", + "lex-parser": "0.1.4", + "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.4", + "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==" + }, + "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 + }, + "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.11" + } + }, + "jsonlint": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.0.tgz", + "integrity": "sha1-iKpGvCiaesk7tGyuLVihh6m7SUo=", + "requires": { + "JSV": "4.0.2", + "nomnom": "1.5.2" + } + }, + "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.11" + } + }, + "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.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "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.11" + } + }, + "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=", + "dev": true + }, + "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.1", + "underscore": "1.1.7" + } + }, + "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.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "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.6.9", + "minimist": "1.2.0", + "pretty-bytes": "1.0.4", + "progress-stream": "1.2.0", + "request": "2.87.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.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.2.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=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "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.4" + } + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "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.4", + "through2": "0.2.3" + } + }, + "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.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "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.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.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.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "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.1", + "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.1.2" + } + }, + "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": "4.0.8" + } + }, + "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==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "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.2" + } + }, + "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": "1.0.1" + } + }, + "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 + }, + "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.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "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.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-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.6.9", + "es6-promise": "4.2.4" + } + }, + "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" + } + }, + "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.14", + "xtend": "2.1.2" + } + }, + "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 + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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=" + }, + "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.3.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "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" + } + }, + "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..fdbc077 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,36 @@ { - "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.2.5", + "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 ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/blurymind/Yarn.git" + }, + "author": "Todor Imreorov", + "license": "MIT", + "bugs": { + "url": "https://github.com/blurymind/Yarn/issues" + }, + "homepage": "https://github.com/blurymind/Yarn#readme", + "devDependencies": { + "electron": "^2.0.2" + }, + "dependencies": { + "bbcode": "^0.1.5", + "bondage": "^1.0.4", + "jquery": "^3.3.1" + } } From 6701c0b46b4cce343ebfdad53351d667d1708dc2 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Sun, 10 Jun 2018 20:33:06 +0100 Subject: [PATCH 02/16] cleanup Terminate the story tester window if yarn is closed --- main.js | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/main.js b/main.js index 473f15a..2f37031 100644 --- a/main.js +++ b/main.js @@ -29,27 +29,19 @@ function createWindow () { // Open the DevTools. mainWindow.webContents.openDevTools(); - // mainWindow.on('close', function (event) { - // event.preventDefault(); - // mainWindow.webContents.send('closing'); ///save file meta - // }); + mainWindow.on('close', function (event) { + event.preventDefault(); + if(yarnRunnerWindow){yarnRunnerWindow.destroy();} + mainWindow.destroy(); + mainWindow = null; + }); - // Emitted when the window is closed. - // mainWindow.on('closed', function () { - // 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.show(); // mainWindow.maximize(); // }); - // ipcMain.on('Terminating', function (event) { - // mainWindow.destroy(); - // if(yarnRunnerWindow){yarnRunnerWindow.destroy();} - // }); - ipcMain.on('openFileYarn', (event,operation) => { console.log("Open file"); dialog.showOpenDialog({ From 49d4ff258fb73e6005d8dfcdc192783fb6e56581 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Sun, 10 Jun 2018 21:41:21 +0100 Subject: [PATCH 03/16] cleanup+add fancy background add fancy b --- app/js/classes/renderer.js | 5 ----- app/renderer.html | 15 ++++++++++++++- main.js | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/js/classes/renderer.js b/app/js/classes/renderer.js index e9d6908..dee506e 100644 --- a/app/js/classes/renderer.js +++ b/app/js/classes/renderer.js @@ -97,13 +97,8 @@ var yarnRender = function() { var scrollUpdateText = function(updateVNHud){ vnTextResult = vnResult.text.substring(0,vnTextScrollIdx); - // yarnRender.this.testme("err"); updateVNHud(); } - this.testme = function(test){ - console.log(test) - console.log("whoa") - } this.updateVNHud = function (){ /// trigger this only on text update vnTextScrollIdx += 1; diff --git a/app/renderer.html b/app/renderer.html index b6963a4..ba2a03f 100644 --- a/app/renderer.html +++ b/app/renderer.html @@ -1,6 +1,19 @@ + + + + + Bondage.js Testing Yarn Story + + + + -

+ +
 
+

+ + -
 

+ Press "Z" to advance... + }}); + }) + \ No newline at end of file From e70e7a7c2021991932aff03704cd83d726f5f184 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Fri, 15 Jun 2018 23:51:21 +0100 Subject: [PATCH 06/16] re-enable file commands re-enable previously stubbed file commands. Yarn-electron can now successfully do the rest of the open/save operations --- .vscode/tasks.json | 4 ++-- app/index.html | 16 +++++++--------- app/js/classes/app.js | 15 ++++++++------- app/js/classes/data.js | 2 +- app/js/classes/renderer.js | 15 ++++----------- app/renderer.html | 17 ++++++++++------- main.js | 2 +- 7 files changed, 33 insertions(+), 38 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 7d058e4..8825153 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,9 +2,9 @@ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "0.1.0", - "command": "npm", + "command": "..\\..\\..\\node\\npm", "isShellCommand": true, - "args": ["start"], + "args": ["start","--scripts-prepend-node-path"], "showOutput": "silent", //"problemMatcher": "$tsc" } \ No newline at end of file diff --git a/app/index.html b/app/index.html index 9d9f21c..fb65f44 100644 --- a/app/index.html +++ b/app/index.html @@ -7,7 +7,6 @@ - @@ -37,6 +36,7 @@ diff --git a/app/js/classes/app.js b/app/js/classes/app.js index 523ca96..f74fade 100644 --- a/app/js/classes/app.js +++ b/app/js/classes/app.js @@ -735,16 +735,18 @@ var App = function(name, version) return x.replace(/^\s+|\s+$/gm,''); } - this.appendText = function(textToAppend) { // [[First choice|Option1]] - self.editing().body(self.editing().body()+" [[changeMe|"+textToAppend+"]]"); + 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; + 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]); @@ -767,14 +769,13 @@ var App = function(name, version) p.setAttribute('onclick', "app.testRunFrom('" + node.title() + "')"); rootMenu.appendChild(p); } - } + } } }) } this.saveNode = function() { - // console.log(self.editing().body()); if (self.editing() != null) { self.updateNodeLinks(); @@ -797,7 +798,7 @@ var App = function(name, version) 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; diff --git a/app/js/classes/data.js b/app/js/classes/data.js index 788d054..cfc20fe 100644 --- a/app/js/classes/data.js +++ b/app/js/classes/data.js @@ -139,6 +139,7 @@ var data = if (type == FILETYPE.JSON) { content = JSON.parse(content); + if(!content){return}; for (i = 0; i < content.length; i ++) objects.push(content[i]); } @@ -478,7 +479,6 @@ var data = tryOpenFile: function() /// Refactor to send signal to the main process { - console.log(ipc); ipc.send('openFileYarn','tryOpenFile'); // data.openFileDialog($('#open-file'), data.openFile); }, diff --git a/app/js/classes/renderer.js b/app/js/classes/renderer.js index 039682f..842770a 100644 --- a/app/js/classes/renderer.js +++ b/app/js/classes/renderer.js @@ -2,7 +2,6 @@ const bondage = require('bondage'); const bbcode = require('bbcode'); const yarnRunner = new bondage.Runner(); const EventEmitter = require('events').EventEmitter - var yarnRender = function() { this.self = this; @@ -14,10 +13,6 @@ var yarnRender = function() { this.commandsPassedLog = []; this.commandPassed = ""; this.emiter = new EventEmitter(); - ////https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent - // this.commandRunEvent = new CustomEvent("commandRun", { - // command : null - // }); var vnChoices, vnTextResult, vnResult ,VNtext ,vnTextScroll ,htmIDtoAttachYarnTo,vnTextScrollIdx = 0; this.vnUpdateChoice = function(direction=0){ //dir: -1 or 1 @@ -60,9 +55,9 @@ var yarnRender = function() { clearInterval(vnTextScroll);//this resets the scroll timer if (vnResult.constructor.name == "CommandResult" ){ - this.commandsPassedLog.push(vnResult.text) ; - this.commandsPassed = vnResult.text; - this.emiter.emit("command",vnResult.text) + this.commandsPassedLog.push(vnResult.value) ; + this.commandsPassed = vnResult.value; + this.emiter.emit("command",vnResult.value) vnTextScrollIdx = 0; vnResult = VNtext.next().value; this.changeTextScrollSpeed(200); @@ -70,7 +65,7 @@ var yarnRender = function() { } if (vnResult.constructor.name == "OptionsResult"){ /// Add choices to text - if (this.vnSelectedChoice === -1){ ///we need to set it to -1 after choice is made + 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(); @@ -78,8 +73,6 @@ var yarnRender = function() { return } - - if(vnTextScrollIdx >= vnResult.text.length){ /// Scrolled to end of text, move on vnTextScrollIdx = 0; vnResult = VNtext.next().value diff --git a/app/renderer.html b/app/renderer.html index f76c991..0c63f2d 100644 --- a/app/renderer.html +++ b/app/renderer.html @@ -24,8 +24,17 @@ ipcRenderer.on('loadYarnDataOnRunner', (event,yarnContent,startTestNode) => { yarn.initYarn(yarnContent,startTestNode,"NVrichTextLabel"); + yarn.emiter.on("command",function(command){ document.getElementById("commandDebugLabel").innerHTML += "
" + command; + if (command.includes("(")){ // user is possibly calling a js function + try { + eval(command) + } + catch(err) { + alert(command + ":" + err) + } + }; }); document.addEventListener("keydown", event => { @@ -45,13 +54,7 @@ if(yarn.vnSelectedChoice != -1){ yarn.vnSelectChoice() }; - - if(yarn.commandPassed !== null){ - if (yarn.commandPassed.includes("(")){ - eval(yarn.commandPassed) - } - }; - + if (yarn.finished){remote.getCurrentWindow().close()} return } diff --git a/main.js b/main.js index 5b40291..2d9cd92 100644 --- a/main.js +++ b/main.js @@ -53,7 +53,7 @@ function createWindow () { ipcMain.on('saveFileYarn', (event,type,content) => { dialog.showSaveDialog( mainWindow, - {filters: [{ name: 'story', extensions: ['json'] }]}, + {filters: [{ name: 'story', extensions: [type] }]}, function(filepath) { mainWindow.webContents.send('saved-file', filepath,type,content); }); From bc0b89830e7f69fbacc278f650b8f2211127926c Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Wed, 20 Jun 2018 21:46:46 +0100 Subject: [PATCH 07/16] yarn build and update implementation --- .gitignore | 3 + app/index.html | 12 +- app/js/classes/renderer.js | 1 + app/renderer.html | 102 +-- main.js | 24 +- package-lock.json | 1550 +++++++++++++++++++++++++++++++++++- package.json | 10 +- 7 files changed, 1635 insertions(+), 67 deletions(-) diff --git a/.gitignore b/.gitignore index f4ddd1f..e2933b9 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,9 @@ build/Release # Dependency directory node_modules +# Updater +electron-builder.yml + # Optional npm cache directory .npm diff --git a/app/index.html b/app/index.html index fb65f44..e0eedfa 100644 --- a/app/index.html +++ b/app/index.html @@ -26,7 +26,17 @@ - + +
 
diff --git a/app/js/classes/renderer.js b/app/js/classes/renderer.js index 842770a..24d206d 100644 --- a/app/js/classes/renderer.js +++ b/app/js/classes/renderer.js @@ -124,6 +124,7 @@ var yarnRender = function() { this.loadYarnChapter(startChapter); } + //todo- rename to startChapter this.loadYarnChapter = function(storyChapter){ this.finished = false; console.log("LOADING YARN DATA... chapter: "+storyChapter); diff --git a/app/renderer.html b/app/renderer.html index 0c63f2d..af616c8 100644 --- a/app/renderer.html +++ b/app/renderer.html @@ -1,12 +1,14 @@ - - - Bondage.js Testing Yarn Story - - - - + + + + Bondage.js Testing Yarn Story + + + + + @@ -21,55 +23,55 @@ const remote = electron.remote let yarn = new yarnRender(); - ipcRenderer.on('loadYarnDataOnRunner', (event,yarnContent,startTestNode) => { - - yarn.initYarn(yarnContent,startTestNode,"NVrichTextLabel"); - - yarn.emiter.on("command",function(command){ - document.getElementById("commandDebugLabel").innerHTML += "
" + command; - if (command.includes("(")){ // user is possibly calling a js function - try { - eval(command) - } - catch(err) { - alert(command + ":" + err) - } - }; - }); + ipcRenderer.on('loadYarnDataOnRunner', (event, yarnContent, startTestNode) => { + + yarn.initYarn(yarnContent, startTestNode, "NVrichTextLabel"); + + // yarn.emiter.on("command",function(command){ + // document.getElementById("commandDebugLabel").innerHTML += "
" + command; + // if (command.includes("(")){ // user is possibly calling a js function + // }; + // }); document.addEventListener("keydown", event => { switch (event.key) { case "z": - { - yarn.changeTextScrollSpeed(20) - return - } - }}); + { + yarn.changeTextScrollSpeed(20) + return + } + } + }); document.addEventListener("keyup", event => { switch (event.key) { case "z": - { - yarn.changeTextScrollSpeed(200) - if(yarn.vnSelectedChoice != -1){ - yarn.vnSelectChoice() - }; - - if (yarn.finished){remote.getCurrentWindow().close()} - return - } - case "ArrowLeft": - { - if(yarn.vnSelectedChoice != -1){ - yarn.vnUpdateChoice(-1) - } - return - } - case "ArrowRight": - { - if(yarn.vnSelectedChoice != -1){yarn.vnUpdateChoice(1) } - return - } - }}); + { + yarn.changeTextScrollSpeed(200) + if (yarn.vnSelectedChoice != -1) { + yarn.vnSelectChoice() + }; + + if (yarn.finished) { + remote.getCurrentWindow().close() + } + return + } + case "ArrowLeft": + { + if (yarn.vnSelectedChoice != -1) { + yarn.vnUpdateChoice(-1) + } + return + } + case "ArrowRight": + { + if (yarn.vnSelectedChoice != -1) { + yarn.vnUpdateChoice(1) + } + return + } + } + }); }) - \ No newline at end of file + \ No newline at end of file diff --git a/main.js b/main.js index 2d9cd92..77f90fe 100644 --- a/main.js +++ b/main.js @@ -1,6 +1,7 @@ const electron = require('electron') const ipcMain = electron.ipcMain; -const {dialog} = require('electron') +const {dialog} = electron; +const {autoUpdater} = require("electron-updater"); // Module to control application life. const app = electron.app // Module to create native browser window. @@ -20,7 +21,8 @@ function createWindow () { defaultWidth: 1000, defaultHeight: 800, maximize: false, - show:false + show:false, + autoHideMenuBar:true, }); mainWindow.maximize(); // and load the index.html of the app. @@ -59,7 +61,7 @@ function createWindow () { }); }); - ipcMain.on('sendYarnDataToObject', (event,content,startTestNode) => { // in case you wanna export yarn object to another embedded app + 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(); }) @@ -68,6 +70,16 @@ function createWindow () { 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){ @@ -77,16 +89,16 @@ function createYarnTesterWindow(content,startTestNode){ defaultWidth: 1400, defaultHeight: 200, maximize: false, - show:false + show:false, + autoHideMenuBar:true, }); yarnRunnerWindow.loadURL(`file://${__dirname}/app/renderer.html`); - yarnRunnerWindow.webContents.openDevTools(); + // yarnRunnerWindow.webContents.openDevTools(); yarnRunnerWindow.webContents.on('dom-ready', () => { yarnRunnerWindow.webContents.send('loadYarnDataOnRunner', content,startTestNode); yarnRunnerWindow.show(); - // yarnRunnerWindow.maximize(); }); } diff --git a/package-lock.json b/package-lock.json index 88657c9..352b5d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,12 @@ "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", @@ -32,12 +38,60 @@ "json-schema-traverse": "0.3.1" } }, + "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.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" + } + } + } + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -57,6 +111,20 @@ "color-convert": "1.9.1" } }, + "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.3" + } + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -75,6 +143,12 @@ "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", @@ -99,6 +173,12 @@ "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", @@ -117,6 +197,19 @@ "tweetnacl": "0.14.5" } }, + "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", @@ -127,6 +220,60 @@ "jison": "0.4.18" } }, + "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.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "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", @@ -140,8 +287,61 @@ "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true + "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.12.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", @@ -165,6 +365,12 @@ "map-obj": "1.0.1" } }, + "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", @@ -186,6 +392,18 @@ "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", @@ -194,6 +412,12 @@ "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", @@ -207,6 +431,50 @@ "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.1.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", @@ -251,6 +519,12 @@ "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", @@ -301,12 +575,52 @@ } } }, + "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.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, "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.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "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", @@ -352,6 +666,123 @@ "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.2", + "electron-builder-lib": "20.14.7", + "fs-extra-p": "4.6.0", + "iconv-lite": "0.4.23", + "js-yaml": "3.12.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.12.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.12.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.1" + } + }, + "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", @@ -367,6 +798,12 @@ "jsbn": "0.1.1" } }, + "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", @@ -378,6 +815,161 @@ "extract-zip": "1.6.7" } }, + "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.1.0", + "env-paths": "1.0.0", + "fs-extra": "4.0.3", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "3.0.0", + "rc": "1.2.8", + "semver": "5.5.0", + "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.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "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.11" + } + }, + "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.6.9" + }, + "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.12.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", @@ -395,6 +987,75 @@ "sumchecker": "1.3.1" } }, + "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.1", + "compare-version": "0.1.2", + "debug": "2.6.9", + "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.27" + } + } + } + }, + "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.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-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.12.0", + "lazy-val": "1.0.3", + "lodash.isequal": "4.5.0", + "semver": "5.5.0", + "source-map-support": "0.5.6" + } + }, + "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", @@ -441,6 +1102,21 @@ "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.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -544,18 +1220,59 @@ "rimraf": "2.6.2" } }, + "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.1" + }, + "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.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + } + } + }, "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", @@ -579,11 +1296,38 @@ "path-is-absolute": "1.0.1" } }, + "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.5" + } + }, + "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.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "har-schema": { "version": "2.0.0", @@ -637,6 +1381,18 @@ "safer-buffer": "2.1.2" } }, + "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", @@ -718,6 +1474,12 @@ } } }, + "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", @@ -733,6 +1495,15 @@ "builtin-modules": "1.1.1" } }, + "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.1.3" + } + }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -751,11 +1522,60 @@ "number-is-nan": "1.0.1" } }, + "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.1", + "is-path-inside": "1.0.1" + } + }, + "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.2" + } + }, "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", @@ -774,6 +1594,18 @@ "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", @@ -809,6 +1641,22 @@ "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.10", + "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", @@ -834,6 +1682,15 @@ "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", @@ -873,6 +1730,29 @@ "graceful-fs": "4.1.11" } }, + "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.1" + } + }, + "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", @@ -891,11 +1771,34 @@ "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", @@ -906,12 +1809,54 @@ "signal-exit": "3.0.2" } }, + "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.2.0" + } + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -930,6 +1875,12 @@ "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", @@ -985,8 +1936,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mute-stream": { "version": "0.0.7", @@ -1014,6 +1964,15 @@ "validate-npm-package-license": "3.0.3" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, "nugget": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", @@ -1070,11 +2029,81 @@ "mimic-fn": "1.2.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.3.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.3.2", + "registry-url": "3.1.0", + "semver": "5.5.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.3" + }, + "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", @@ -1084,6 +2113,12 @@ "error-ex": "1.3.1" } }, + "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", @@ -1099,6 +2134,18 @@ "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", @@ -1143,6 +2190,37 @@ "pinkie": "2.0.4" } }, + "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.3.0", + "xmlbuilder": "9.0.7", + "xmldom": "0.1.27" + }, + "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", @@ -1169,6 +2247,12 @@ "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", @@ -1193,6 +2277,49 @@ "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.5.1", + "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.12.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.2" + } + }, + "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", @@ -1236,6 +2363,25 @@ "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.2.8", + "safe-buffer": "5.1.2" + } + }, + "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.2.8" + } + }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -1273,6 +2419,18 @@ "uuid": "3.2.1" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -1323,10 +2481,53 @@ "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.2" + } + }, + "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==", + "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.5.0" + } + }, + "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": { @@ -1352,6 +2553,22 @@ "amdefine": "1.0.1" } }, + "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.1.0", + "source-map": "0.6.1" + }, + "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", @@ -1390,6 +2607,11 @@ "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", @@ -1407,6 +2629,21 @@ "tweetnacl": "0.14.5" } }, + "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.5" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -1442,6 +2679,12 @@ "is-utf8": "0.2.1" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -1475,6 +2718,27 @@ "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", @@ -1496,6 +2760,12 @@ "xtend": "2.1.2" } }, + "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", @@ -1519,6 +2789,15 @@ "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.4" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -1546,6 +2825,76 @@ "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.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "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.1" + }, + "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.4" + } + }, + "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", @@ -1579,12 +2928,108 @@ "extsprintf": "1.3.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.2", + "strip-ansi": "3.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write-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", @@ -1594,6 +3039,97 @@ "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.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "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", diff --git a/package.json b/package.json index fdbc077..6ee6129 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yarn", - "version": "0.2.5", + "version": "0.2.9", "main": "main.js", "window": { "toolbar": false, @@ -13,7 +13,9 @@ }, "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 ." + "start": "electron .", + "build": "build --win", + "ship": "build --win -p always" }, "repository": { "type": "git", @@ -26,11 +28,13 @@ }, "homepage": "https://github.com/blurymind/Yarn#readme", "devDependencies": { - "electron": "^2.0.2" + "electron": "^2.0.2", + "electron-builder": "^20.15.1" }, "dependencies": { "bbcode": "^0.1.5", "bondage": "^1.0.4", + "electron-updater": "^2.21.10", "jquery": "^3.3.1" } } From 206f73239fb318c81fbb12295e4e4913f13274bf Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Wed, 20 Jun 2018 22:35:43 +0100 Subject: [PATCH 08/16] update to electron --- README.md | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4b926ec..e518b78 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,19 @@ 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 insode 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) +- Tester interface 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: http://infiniteammo.com/Yarn/Yarn-2016-08-15-mac.zip +MacOS: in Progress # Examples @@ -40,6 +46,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 +71,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. From 975547457c4daa97e7c166f682f421e001861d08 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Wed, 20 Jun 2018 22:36:54 +0100 Subject: [PATCH 09/16] electron release --- .gitignore | 2 ++ build/icon.png | Bin 0 -> 78322 bytes package.json | 7 ++++--- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 build/icon.png diff --git a/.gitignore b/.gitignore index e2933b9..279f909 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk + +dist/ diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d53b3d1be359618f7cd51e5477dcf6c76311d8c1 GIT binary patch literal 78322 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

mt4J`My{IL$gDUpNeX9Zte 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 Iido?Q1K}S&&j0`b literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 6ee6129..7cc526c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yarn", - "version": "0.2.9", + "version": "0.3.0", "main": "main.js", "window": { "toolbar": false, @@ -14,8 +14,9 @@ "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 --win", - "ship": "build --win -p always" + "build": "build", + "ship": "build --win -p always", + "release": "build" }, "repository": { "type": "git", From 125b77dca3b975febfc0f880c52c87382ce8a109 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Thu, 21 Jun 2018 19:39:48 +0100 Subject: [PATCH 10/16] pan fixes --- app/js/classes/app.js | 30 +++++++++++++++--------------- main.js | 3 ++- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app/js/classes/app.js b/app/js/classes/app.js index f74fade..1295b2b 100644 --- a/app/js/classes/app.js +++ b/app/js/classes/app.js @@ -31,7 +31,7 @@ var App = function(name, version) 0 ]; this.shifted = false; - this.isNwjs = false; + this.isNwjs = false; this.UPDATE_ARROWS_THROTTLE_MS = 25; @@ -133,9 +133,11 @@ var App = function(name, version) 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; @@ -154,11 +156,9 @@ var App = function(name, version) $(".nodes").on("mousemove", function(e) { - if (dragging) { - //if(e.ctrlKey) - if (e.altKey || e.button === 1) + if (e.altKey || midClickHeld) { //prevents jumping straight back to standard dragging if(MarqueeOn) @@ -169,15 +169,14 @@ var App = function(name, version) } else { - self.transformOrigin[0] += e.pageX - offset.x; - self.transformOrigin[1] += e.pageY - offset.y; + // self.transformOrigin[0] += e.pageX - offset.x; + // self.transformOrigin[1] += e.pageY - offset.y; - self.translate(); + // self.translate(); - offset.x = e.pageX; - offset.y = e.pageY; + // offset.x = e.pageX; + // offset.y = e.pageY; - /* var nodes = self.nodes(); for (var i in nodes) { @@ -186,7 +185,6 @@ var App = function(name, version) } offset.x = e.pageX; offset.y = e.pageY; - */ } } else @@ -200,7 +198,7 @@ var App = function(name, version) MarqRect.x1 = offset.x; MarqRect.y1 = e.pageY; MarqRect.x2 = e.pageX; - MarqRect.y2 = offset.y; + MarqRect.y2 = e.pageY; } else if(e.pageX > offset.x && e.pageY > offset.y) { @@ -273,7 +271,8 @@ var App = function(name, version) $(".nodes").on("mouseup", function(e) { - console.log("finished dragging"); + // console.log("finished dragging"); + if(e.button == 1){midClickHeld = false}; dragging = false; if(MarqueeOn && MarqueeSelection.length == 0) @@ -285,7 +284,6 @@ var App = function(name, version) MarqRect = {x1:0,y1:0,x2:0,y2:0}; $("#marquee").css({x:0, y:0, width:0, height:0}); MarqueeOn = false; - }); })(); @@ -363,8 +361,9 @@ var App = function(name, version) case 68: self.deselectAllNodes(); } } + }); - + $(document).on('keydown', function(e) { if (self.isNwjs === false) { return; } @@ -464,6 +463,7 @@ var App = function(name, version) 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; } }); diff --git a/main.js b/main.js index 77f90fe..4993146 100644 --- a/main.js +++ b/main.js @@ -25,11 +25,12 @@ function createWindow () { autoHideMenuBar:true, }); mainWindow.maximize(); + mainWindow.setMenu(null) // and load the index.html of the app. mainWindow.loadURL(`file://${__dirname}/app/index.html`) // Open the DevTools. - // mainWindow.webContents.openDevTools(); + mainWindow.webContents.openDevTools(); mainWindow.on('close', function (event) { event.preventDefault(); From c34c26d932d4badd0c0f128f8a3e2b412b760859 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Fri, 22 Jun 2018 20:30:25 +0100 Subject: [PATCH 11/16] file drag and drop+ new key bindings This adds: - file drag and drop (including support for dropping multiple files ) - Support for deleting multiple selected nodes (via the delete key) - Fix spacebar key (should be on key release- so it doesnt repeat while held) - new key binding- ctrl+space while editing a node will switch to edit the next node - new key binding- ctrl+enter while editing a node will save and close the node - run document format prettify --- app/index.html | 9 +- app/js/classes/app.js | 2720 ++++++++++++++++++++-------------------- app/js/classes/data.js | 885 ++++++------- main.js | 148 ++- package.json | 6 +- 5 files changed, 1882 insertions(+), 1886 deletions(-) diff --git a/app/index.html b/app/index.html index e0eedfa..0db3eb3 100644 --- a/app/index.html +++ b/app/index.html @@ -29,6 +29,7 @@ diff --git a/app/js/classes/app.js b/app/js/classes/app.js index 1295b2b..afe853a 100644 --- a/app/js/classes/app.js +++ b/app/js/classes/app.js @@ -1,1347 +1,1381 @@ -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 = .005; - this.zoomLimitMin = .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.nodeSelection = []; - - this.$searchField = $(".search-field"); - - // node-webkit - if (typeof(require) == "function") - { - // this.gui = require('nw.gui'); - this.gui = remote.getCurrentWindow(); - this.fs = remote.require('fs'); - console.log(this.fs); +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.nodeSelection = []; + + this.$searchField = $(".search-field"); + + // 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): - // 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; - } - - // 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]; - 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; - } - } - } + } + + 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'); - 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); - } - 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.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.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.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 * 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 cfc20fe..f04d1f6 100644 --- a/app/js/classes/data.js +++ b/app/js/classes/data.js @@ -1,58 +1,58 @@ -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);} +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("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); +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"); - } - /* +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(); @@ -72,41 +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, ']'). @@ -126,391 +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); - 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 = ""; - } - } - } - 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) - { - console.log(app.fs); - 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))); - }, - -} + } + 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/main.js b/main.js index 4993146..e416553 100644 --- a/main.js +++ b/main.js @@ -1,129 +1,143 @@ -const electron = require('electron') +const electron = require("electron"); const ipcMain = electron.ipcMain; -const {dialog} = electron; -const {autoUpdater} = require("electron-updater"); +const { dialog } = electron; +const { autoUpdater } = require("electron-updater"); // Module to control application life. -const app = electron.app +const app = electron.app; // Module to create native browser window. -const BrowserWindow = electron.BrowserWindow +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 mainWindow; +let yarnRunnerWindow; +let yarnVersion = "0.3.1"; -function createWindow () { +function createWindow() { // Create the browser window. // screen.height; // screen.width; - let {width, height} = require('electron').screen.getPrimaryDisplay().size; - mainWindow = new BrowserWindow({ + let { width, height } = require("electron").screen.getPrimaryDisplay().size; + mainWindow = new BrowserWindow({ defaultWidth: 1000, defaultHeight: 800, maximize: false, - show:false, - autoHideMenuBar:true, + show: false, + autoHideMenuBar: true }); - mainWindow.maximize(); - mainWindow.setMenu(null) + mainWindow.setMenu(null); // and load the index.html of the app. - mainWindow.loadURL(`file://${__dirname}/app/index.html`) + mainWindow.loadURL(`file://${__dirname}/app/index.html`); // Open the DevTools. mainWindow.webContents.openDevTools(); - mainWindow.on('close', function (event) { + mainWindow.on("close", function(event) { event.preventDefault(); - if(yarnRunnerWindow){yarnRunnerWindow.destroy();} + 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.show(); - // mainWindow.maximize(); - // }); - - ipcMain.on('openFileYarn', (event,operation) => { - console.log("Open file"); - 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] }]}, + 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); - }); + 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 + 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); - }) + 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') + 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){ +function createYarnTesterWindow(content, startTestNode) { // console.log("START RUN::"+startTestNode); - if(yarnRunnerWindow){yarnRunnerWindow.destroy()} + if (yarnRunnerWindow) { + yarnRunnerWindow.destroy(); + } yarnRunnerWindow = new BrowserWindow({ defaultWidth: 1400, defaultHeight: 200, maximize: false, - show:false, - autoHideMenuBar:true, - }); - - yarnRunnerWindow.loadURL(`file://${__dirname}/app/renderer.html`); - // yarnRunnerWindow.webContents.openDevTools(); - - yarnRunnerWindow.webContents.on('dom-ready', () => { - yarnRunnerWindow.webContents.send('loadYarnDataOnRunner', content,startTestNode); - yarnRunnerWindow.show(); - }); + show: false, + autoHideMenuBar: true + }); + + yarnRunnerWindow.loadURL(`file://${__dirname}/app/renderer.html`); + // 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) +app.on("ready", createWindow); // Quit when all windows are closed. -app.on('window-all-closed', function () { +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() + if (process.platform !== "darwin") { + app.quit(); } -}) +}); -app.on('activate', function () { +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. \ No newline at end of file +// code. You can also put them in separate files and require them here. diff --git a/package.json b/package.json index 7cc526c..8d31af9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yarn", - "version": "0.3.0", + "version": "0.3.1", "main": "main.js", "window": { "toolbar": false, @@ -15,14 +15,14 @@ "scripts": { "start": "electron .", "build": "build", - "ship": "build --win -p always", + "ship": "build -mwl -p always", "release": "build" }, "repository": { "type": "git", "url": "git+https://github.com/blurymind/Yarn.git" }, - "author": "Todor Imreorov", + "author": " @infinite_ammo, @seiyria, @beeglebug ,Todor Imreorov", "license": "MIT", "bugs": { "url": "https://github.com/blurymind/Yarn/issues" From f8a2141bc78242bff9f6a5e142c4393f715f7997 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Wed, 27 Jun 2018 18:10:54 +0100 Subject: [PATCH 12/16] Auto create New Nodes from [[new]] and [[new|choice]] ...if no nodes exist for them --- app/js/classes/app.js | 20 ++++++++++++++++++- app/js/classes/node.js | 40 +++++++++++++++++++++++++++----------- app/js/classes/renderer.js | 18 ++++++++--------- 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/app/js/classes/app.js b/app/js/classes/app.js index afe853a..8765ed7 100644 --- a/app/js/classes/app.js +++ b/app/js/classes/app.js @@ -788,8 +788,8 @@ var App = function(name, version) { 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); @@ -854,6 +854,24 @@ var App = function(name, version) { 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(); diff --git a/app/js/classes/node.js b/app/js/classes/node.js index 9cb224d..2803c0e 100644 --- a/app/js/classes/node.js +++ b/app/js/classes/node.js @@ -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 index 24d206d..6b3f010 100644 --- a/app/js/classes/renderer.js +++ b/app/js/classes/renderer.js @@ -54,15 +54,15 @@ var yarnRender = function() { 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 == "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 From a2db2cd59ca375f3938e9382d76f34baf01b5e92 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Wed, 27 Jun 2018 23:07:30 +0100 Subject: [PATCH 13/16] prep for new release --- app/js/classes/app.js | 5 +- main.js | 12 +- package-lock.json | 1031 +++++++++++++++++++++-------------------- package.json | 5 +- 4 files changed, 533 insertions(+), 520 deletions(-) diff --git a/app/js/classes/app.js b/app/js/classes/app.js index 8765ed7..60a035b 100644 --- a/app/js/classes/app.js +++ b/app/js/classes/app.js @@ -299,8 +299,7 @@ var App = function(name, version) { }); $(document).contextmenu(function(e) { - var isAllowedEl = - $(e.target).hasClass("nodes") || $(e.target).parents(".nodes").length; + var isAllowedEl = $(e.target).hasClass("nodes") || $(e.target).parents(".nodes").length; if (e.button == 2 && isAllowedEl) { var x = (self.transformOrigin[0] * -1) / self.cachedScale, @@ -440,7 +439,7 @@ var App = function(name, version) { if ( self.focusedNodeIdx > -1 && nodes.length > self.focusedNodeIdx && - (self.transformOrigin[0] != + (self.transformOrigin[0] != -nodes[self.focusedNodeIdx].x() + $(window).width() / 2 - $(nodes[self.focusedNodeIdx].element).width() / 2 || diff --git a/main.js b/main.js index e416553..651887b 100644 --- a/main.js +++ b/main.js @@ -2,6 +2,7 @@ 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. @@ -11,7 +12,7 @@ const BrowserWindow = electron.BrowserWindow; // be closed automatically when the JavaScript object is garbage collected. let mainWindow; let yarnRunnerWindow; -let yarnVersion = "0.3.1"; +let yarnVersion = "0.3.2"; function createWindow() { // Create the browser window. @@ -29,8 +30,9 @@ function createWindow() { // and load the index.html of the app. mainWindow.loadURL(`file://${__dirname}/app/index.html`); - // Open the DevTools. - mainWindow.webContents.openDevTools(); + if (isDev) { + mainWindow.webContents.openDevTools(); + } mainWindow.on("close", function(event) { event.preventDefault(); @@ -105,7 +107,9 @@ function createYarnTesterWindow(content, startTestNode) { }); yarnRunnerWindow.loadURL(`file://${__dirname}/app/renderer.html`); - // yarnRunnerWindow.webContents.openDevTools(); + if (isDev) { + yarnRunnerWindow.webContents.openDevTools() + }; yarnRunnerWindow.webContents.on("dom-ready", () => { yarnRunnerWindow.webContents.send( diff --git a/package-lock.json b/package-lock.json index 352b5d8..92de877 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "yarn", - "version": "0.2.5", + "version": "0.3.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -32,10 +32,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "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": { @@ -56,7 +56,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -77,8 +77,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -87,7 +87,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -108,7 +108,7 @@ "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.1" + "color-convert": "^1.9.0" } }, "app-builder-bin": { @@ -122,7 +122,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "array-find-index": { @@ -184,7 +184,7 @@ "resolved": "https://registry.npmjs.org/bbcode/-/bbcode-0.1.5.tgz", "integrity": "sha1-qFR4EEd1tvPh0i8kb1X6DyI4CTs=", "requires": { - "underscore": "1.1.7" + "underscore": "*" } }, "bcrypt-pbkdf": { @@ -194,7 +194,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "bluebird": { @@ -207,7 +207,7 @@ "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", "integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==", "requires": { - "bluebird": "3.5.1" + "bluebird": "^3.5.1" } }, "bondage": { @@ -215,9 +215,9 @@ "resolved": "https://registry.npmjs.org/bondage/-/bondage-1.0.4.tgz", "integrity": "sha512-/UKwgPmv90X+StHOm4fvlqjPQakbN4QGLS9+HWSuSBr9muNKiMVaOlB9NCAYpnzJ8ZDzYxjc+Hmg62P9IR5yPw==", "requires": { - "commander": "2.15.1", - "inquirer": "3.3.0", - "jison": "0.4.18" + "commander": "^2.9.0", + "inquirer": "^3.0.6", + "jison": "^0.4.17" } }, "boxen": { @@ -226,13 +226,13 @@ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.4.1", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "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": { @@ -259,8 +259,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -269,7 +269,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -280,7 +280,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -295,20 +295,20 @@ "integrity": "sha512-Do6xVlXa6MBaxMdfCHajcfOzyzo8CBDuDVDr0PftVI0CcKpUQIe81kWwcA5w6Ossd7d52harHFuVO3NzxSwWUA==", "dev": true, "requires": { - "7zip-bin": "4.0.2", + "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.12.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" + "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": { @@ -327,10 +327,10 @@ "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" + "bluebird-lst": "^1.0.5", + "debug": "^3.1.0", + "fs-extra-p": "^4.6.0", + "sax": "^1.2.4" }, "dependencies": { "debug": { @@ -361,8 +361,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "capture-stack-trace": { @@ -382,9 +382,9 @@ "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.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chardet": { @@ -423,7 +423,7 @@ "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" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -437,9 +437,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -460,8 +460,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -470,7 +470,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -492,7 +492,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -511,7 +511,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -537,10 +537,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { "isarray": { @@ -555,13 +555,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "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": { @@ -570,7 +570,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -581,12 +581,12 @@ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "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": { @@ -601,7 +601,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { @@ -610,9 +610,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-random-string": { @@ -627,7 +627,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "dashdash": { @@ -636,7 +636,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -672,14 +672,14 @@ "integrity": "sha512-+NqdmZb5uhPV1exzeH+hD+WLtr79qRjfA38S7DckOIMQW0C5Vykvp4dqCypnupfEnEOVZMcaNCCKK639h/uS/g==", "dev": true, "requires": { - "bluebird-lst": "1.0.5", - "builder-util": "5.11.2", - "electron-builder-lib": "20.14.7", - "fs-extra-p": "4.6.0", - "iconv-lite": "0.4.23", - "js-yaml": "3.12.0", - "parse-color": "1.0.0", - "sanitize-filename": "1.6.1" + "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": { @@ -703,31 +703,31 @@ "integrity": "sha512-sPlpRN5Nea9ZK+nwZcD5ZuGoK2uCj2muQ7enc+9BeXPAxnEu4yYmYanICAi4BQqUdusm4yjjnN9uPowlbvCNzA==", "dev": true, "requires": { - "7zip-bin": "4.0.2", + "7zip-bin": "~4.0.2", "app-builder-bin": "1.9.5", - "async-exit-hook": "2.0.1", - "bluebird-lst": "1.0.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", + "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.12.0", - "lazy-val": "1.0.3", - "minimatch": "3.0.4", - "normalize-package-data": "2.4.0", - "plist": "3.0.1", + "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" + "sanitize-filename": "^1.6.1", + "semver": "^5.5.0", + "stream-json": "^0.6.1", + "temp-file": "^3.1.2" }, "dependencies": { "builder-util": { @@ -736,20 +736,20 @@ "integrity": "sha512-fZu9j33B4VMeUJaeb1q2TubKWrk9tAg2Jwpgjstxk7Mu7sNw7v/XB87/EbpNBlE3RPMrXblG6f8asfCRC8IiNQ==", "dev": true, "requires": { - "7zip-bin": "4.0.2", + "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.12.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" + "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" } } } @@ -762,7 +762,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotenv": { @@ -795,7 +795,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ejs": { @@ -810,9 +810,9 @@ "integrity": "sha512-XmkGVoHLOqmjZ2nU/0zEzMl3TZEz452Q1fTJFKjylg4pLYaq7na7V2uxzydVQNQukZGbERoA7ayjxXzTsXbtdA==", "dev": true, "requires": { - "@types/node": "8.10.19", - "electron-download": "3.3.0", - "extract-zip": "1.6.7" + "@types/node": "^8.0.24", + "electron-download": "^3.0.1", + "extract-zip": "^1.0.3" } }, "electron-builder": { @@ -821,20 +821,20 @@ "integrity": "sha512-oH+yMWLNH3XhwmvrSC49voVrbsG8bnKMO10vE/OUQnH/hr3Er/KHv8XBEPCYnMk3tCxEvcEANQeLoTVgeMUfKQ==", "dev": true, "requires": { - "bluebird-lst": "1.0.5", + "bluebird-lst": "^1.0.5", "builder-util": "5.11.2", "builder-util-runtime": "4.2.1", - "chalk": "2.4.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", + "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" + "sanitize-filename": "^1.6.1", + "update-notifier": "^2.5.0", + "yargs": "^11.0.0" }, "dependencies": { "debug": { @@ -852,15 +852,15 @@ "integrity": "sha512-SQYDGMLpTgty1bx3NycuDb7dNPzktVSdK2sqPZjyRocauq/uN/V4S2lcpFVLupaHhKlD8zozm9fTpm5UdohvTg==", "dev": true, "requires": { - "debug": "3.1.0", - "env-paths": "1.0.0", - "fs-extra": "4.0.3", - "minimist": "1.2.0", - "nugget": "2.0.1", - "path-exists": "3.0.0", - "rc": "1.2.8", - "semver": "5.5.0", - "sumchecker": "2.0.2" + "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": { @@ -869,9 +869,9 @@ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "jsonfile": { @@ -880,7 +880,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "path-exists": { @@ -895,7 +895,7 @@ "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", "dev": true, "requires": { - "debug": "2.6.9" + "debug": "^2.2.0" }, "dependencies": { "debug": { @@ -917,31 +917,31 @@ "integrity": "sha512-7FuH8+WlvIZHCEFreWuiSkOrg+AnYUf2bxYUhddeETMlH8ojfW/ehVM0RbZsEXLdXlJ70wUmxEOBwL7mWiz1lw==", "dev": true, "requires": { - "7zip-bin": "4.0.2", + "7zip-bin": "~4.0.2", "app-builder-bin": "1.9.7", - "async-exit-hook": "2.0.1", - "bluebird-lst": "1.0.5", + "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", + "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.12.0", - "lazy-val": "1.0.3", - "minimatch": "3.0.4", - "normalize-package-data": "2.4.0", - "plist": "3.0.1", + "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" + "sanitize-filename": "^1.6.1", + "semver": "^5.5.0", + "stream-json": "^0.6.1", + "temp-file": "^3.1.2" }, "dependencies": { "debug": { @@ -959,13 +959,13 @@ "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" + "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" } } } @@ -976,15 +976,24 @@ "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", "dev": true, "requires": { - "debug": "2.6.9", - "fs-extra": "0.30.0", - "home-path": "1.0.6", - "minimist": "1.2.0", - "nugget": "2.0.1", - "path-exists": "2.1.0", - "rc": "1.2.8", - "semver": "5.5.0", - "sumchecker": "1.3.1" + "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": { @@ -998,12 +1007,12 @@ "integrity": "sha1-vk87ibKnWh3F8eckkIGrKSnKOiY=", "dev": true, "requires": { - "bluebird": "3.5.1", - "compare-version": "0.1.2", - "debug": "2.6.9", - "isbinaryfile": "3.0.2", - "minimist": "1.2.0", - "plist": "2.1.0" + "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": { @@ -1014,7 +1023,7 @@ "requires": { "base64-js": "1.2.0", "xmlbuilder": "8.2.2", - "xmldom": "0.1.27" + "xmldom": "0.1.x" } } } @@ -1025,13 +1034,13 @@ "integrity": "sha512-14u2eT8qTNKD1ek20UK5AbjDn6qmdhAOEiTcgmjmrMoRJFQIhGwV3emFmfaY1S6uFnFdY/4MyMcU92AXD1oRsw==", "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" + "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": { @@ -1039,15 +1048,15 @@ "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.12.0", - "lazy-val": "1.0.3", - "lodash.isequal": "4.5.0", - "semver": "5.5.0", - "source-map-support": "0.5.6" + "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": { @@ -1062,7 +1071,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es6-promise": { @@ -1081,10 +1090,10 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", "requires": { - "esprima": "1.1.1", - "estraverse": "1.5.1", - "esutils": "1.0.0", - "source-map": "0.1.43" + "esprima": "~1.1.1", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.33" } }, "esprima": { @@ -1108,13 +1117,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "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": { @@ -1128,9 +1137,9 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extract-zip": { @@ -1169,7 +1178,7 @@ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "dev": true, "requires": { - "pend": "1.2.0" + "pend": "~1.2.0" } }, "figures": { @@ -1177,7 +1186,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "find-up": { @@ -1186,8 +1195,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "forever-agent": { @@ -1202,9 +1211,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "fs-extra": { @@ -1213,11 +1222,11 @@ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "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": { @@ -1225,8 +1234,8 @@ "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.1" + "bluebird-lst": "^1.0.5", + "fs-extra": "^6.0.0" }, "dependencies": { "fs-extra": { @@ -1234,9 +1243,9 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "jsonfile": { @@ -1244,7 +1253,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } } } @@ -1279,7 +1288,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -1288,12 +1297,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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": { @@ -1302,7 +1311,7 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "got": { @@ -1311,17 +1320,17 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "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": { @@ -1341,8 +1350,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-flag": { @@ -1368,9 +1377,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -1378,7 +1387,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "import-lazy": { @@ -1399,7 +1408,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "inflight": { @@ -1408,8 +1417,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1429,20 +1438,20 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "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.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "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": { @@ -1460,8 +1469,8 @@ "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -1469,7 +1478,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -1492,7 +1501,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-ci": { @@ -1501,7 +1510,7 @@ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-finite": { @@ -1510,7 +1519,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -1519,7 +1528,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-installed-globally": { @@ -1528,8 +1537,8 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-npm": { @@ -1550,7 +1559,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-promise": { @@ -1620,10 +1629,10 @@ "JSONSelect": "0.4.0", "cjson": "0.3.0", "ebnf-parser": "0.1.10", - "escodegen": "1.3.3", - "esprima": "1.1.1", - "jison-lex": "0.3.4", - "lex-parser": "0.1.4", + "escodegen": "1.3.x", + "esprima": "1.1.x", + "jison-lex": "0.3.x", + "lex-parser": "~0.1.3", "nomnom": "1.5.2" } }, @@ -1632,7 +1641,7 @@ "resolved": "https://registry.npmjs.org/jison-lex/-/jison-lex-0.3.4.tgz", "integrity": "sha1-gcoo2E+ESZ36jFlNzePYo/Jux6U=", "requires": { - "lex-parser": "0.1.4", + "lex-parser": "0.1.x", "nomnom": "1.5.2" } }, @@ -1646,8 +1655,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "dependencies": { "esprima": { @@ -1688,7 +1697,7 @@ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" } }, "jsonfile": { @@ -1697,7 +1706,7 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonlint": { @@ -1705,8 +1714,8 @@ "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.0.tgz", "integrity": "sha1-iKpGvCiaesk7tGyuLVihh6m7SUo=", "requires": { - "JSV": "4.0.2", - "nomnom": "1.5.2" + "JSV": ">= 4.0.x", + "nomnom": ">= 1.5.x" } }, "jsprim": { @@ -1727,7 +1736,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "latest-version": { @@ -1736,7 +1745,7 @@ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-val": { @@ -1750,7 +1759,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "lex-parser": { @@ -1764,11 +1773,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "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": { @@ -1777,8 +1786,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -1805,8 +1814,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lowercase-keys": { @@ -1821,8 +1830,8 @@ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -1831,7 +1840,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -1854,7 +1863,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "meow": { @@ -1863,16 +1872,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "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": { @@ -1893,7 +1902,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -1907,7 +1916,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -1948,8 +1957,8 @@ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.5.2.tgz", "integrity": "sha1-9DRUSKhTz71cDSYyDyR3qwUm/i8=", "requires": { - "colors": "0.5.1", - "underscore": "1.1.7" + "colors": "0.5.x", + "underscore": "1.1.x" } }, "normalize-package-data": { @@ -1958,10 +1967,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "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": { @@ -1970,7 +1979,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "nugget": { @@ -1979,12 +1988,12 @@ "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", "dev": true, "requires": { - "debug": "2.6.9", - "minimist": "1.2.0", - "pretty-bytes": "1.0.4", - "progress-stream": "1.2.0", - "request": "2.87.0", - "single-line-log": "1.1.2", + "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" } }, @@ -2018,7 +2027,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -2026,7 +2035,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "os-locale": { @@ -2035,9 +2044,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -2057,7 +2066,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -2066,7 +2075,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.3.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -2081,10 +2090,10 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "parse-color": { @@ -2093,7 +2102,7 @@ "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", "dev": true, "requires": { - "color-convert": "0.5.3" + "color-convert": "~0.5.0" }, "dependencies": { "color-convert": { @@ -2110,7 +2119,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parser-toolkit": { @@ -2125,7 +2134,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -2152,9 +2161,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pend": { @@ -2187,7 +2196,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "plist": { @@ -2196,9 +2205,9 @@ "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", "dev": true, "requires": { - "base64-js": "1.3.0", - "xmlbuilder": "9.0.7", - "xmldom": "0.1.27" + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" }, "dependencies": { "base64-js": { @@ -2227,8 +2236,8 @@ "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.1.0" } }, "process-nextick-args": { @@ -2243,8 +2252,8 @@ "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", "dev": true, "requires": { - "speedometer": "0.1.4", - "through2": "0.2.3" + "speedometer": "~0.1.2", + "through2": "~0.2.3" } }, "pseudomap": { @@ -2271,10 +2280,10 @@ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, "read-config-file": { @@ -2283,15 +2292,15 @@ "integrity": "sha512-xMKmxBYENBqcTMc7r/VteufWgqI9c7oASnOxFa6Crlk4d/nVTOTOJKDhAHJCiGpD8cWzUY9t7K1+M3d75w4f9A==", "dev": true, "requires": { - "ajv": "6.5.1", - "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.12.0", - "json5": "1.0.1", - "lazy-val": "1.0.3" + "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": { @@ -2300,10 +2309,10 @@ "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.2" + "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": { @@ -2326,9 +2335,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -2337,8 +2346,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -2347,10 +2356,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "redent": { @@ -2359,8 +2368,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "registry-auth-token": { @@ -2369,8 +2378,8 @@ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "rc": "1.2.8", - "safe-buffer": "5.1.2" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -2379,7 +2388,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.8" + "rc": "^1.0.1" } }, "repeating": { @@ -2388,7 +2397,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -2397,26 +2406,26 @@ "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "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": { @@ -2436,8 +2445,8 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "rimraf": { @@ -2446,7 +2455,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "run-async": { @@ -2454,7 +2463,7 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -2467,7 +2476,7 @@ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { @@ -2487,7 +2496,7 @@ "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", "dev": true, "requires": { - "truncate-utf8-bytes": "1.0.2" + "truncate-utf8-bytes": "^1.0.0" } }, "sax": { @@ -2506,7 +2515,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "5.5.0" + "semver": "^5.0.3" } }, "set-blocking": { @@ -2521,7 +2530,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -2541,7 +2550,7 @@ "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } }, "source-map": { @@ -2550,7 +2559,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "optional": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "source-map-support": { @@ -2558,8 +2567,8 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "requires": { - "buffer-from": "1.1.0", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "source-map": { @@ -2575,8 +2584,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -2591,8 +2600,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -2618,15 +2627,15 @@ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "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": { @@ -2641,7 +2650,7 @@ "integrity": "sha512-Tmhl5yUVusgkgCiWnoHD1BA8/LqFX5/OlYj+YMCgUuUMjbacQvSWV8p1grbKvzP6s4EBS4nK5WNsMHX7kugzyg==", "dev": true, "requires": { - "parser-toolkit": "0.0.5" + "parser-toolkit": ">=0.0.3" } }, "string-width": { @@ -2650,9 +2659,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -2667,7 +2676,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -2676,7 +2685,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -2691,7 +2700,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -2706,8 +2715,8 @@ "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", "dev": true, "requires": { - "debug": "2.6.9", - "es6-promise": "4.2.4" + "debug": "^2.2.0", + "es6-promise": "^4.0.5" } }, "supports-color": { @@ -2715,7 +2724,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "temp-file": { @@ -2724,10 +2733,10 @@ "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" + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.5", + "fs-extra-p": "^4.6.0", + "lazy-val": "^1.0.3" } }, "term-size": { @@ -2736,7 +2745,7 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "throttleit": { @@ -2756,8 +2765,8 @@ "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", "dev": true, "requires": { - "readable-stream": "1.1.14", - "xtend": "2.1.2" + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" } }, "timed-out": { @@ -2771,7 +2780,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "tough-cookie": { @@ -2780,7 +2789,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "trim-newlines": { @@ -2795,7 +2804,7 @@ "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", "dev": true, "requires": { - "utf8-byte-length": "1.0.4" + "utf8-byte-length": "^1.0.1" } }, "tunnel-agent": { @@ -2804,7 +2813,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -2831,7 +2840,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universalify": { @@ -2851,16 +2860,16 @@ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { - "boxen": "1.3.0", - "chalk": "2.4.1", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "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": { @@ -2869,7 +2878,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -2886,7 +2895,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "utf8-byte-length": { @@ -2913,8 +2922,8 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "verror": { @@ -2923,9 +2932,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "which": { @@ -2934,7 +2943,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -2949,7 +2958,7 @@ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ansi-regex": { @@ -2970,8 +2979,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -2980,7 +2989,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -2991,8 +3000,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -3007,9 +3016,9 @@ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -3036,7 +3045,7 @@ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", "dev": true, "requires": { - "object-keys": "0.4.0" + "object-keys": "~0.4.0" } }, "y18n": { @@ -3057,18 +3066,18 @@ "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + "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": { @@ -3083,7 +3092,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -3098,8 +3107,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -3108,7 +3117,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -3119,7 +3128,7 @@ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -3136,7 +3145,7 @@ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", "dev": true, "requires": { - "fd-slicer": "1.0.1" + "fd-slicer": "~1.0.1" } } } diff --git a/package.json b/package.json index 8d31af9..7b7adff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yarn", - "version": "0.3.1", + "version": "0.3.2", "main": "main.js", "window": { "toolbar": false, @@ -15,7 +15,7 @@ "scripts": { "start": "electron .", "build": "build", - "ship": "build -mwl -p always", + "ship": "build --win --linux", "release": "build" }, "repository": { @@ -35,6 +35,7 @@ "dependencies": { "bbcode": "^0.1.5", "bondage": "^1.0.4", + "electron-is": "^2.4.1", "electron-updater": "^2.21.10", "jquery": "^3.3.1" } From d67c82a3ce72c5e1078300cff4cd2b92316bd5e4 Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Wed, 27 Jun 2018 23:08:01 +0100 Subject: [PATCH 14/16] add instructions to readme --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e518b78..893f881 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,12 @@ 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 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 insode yarn. +- 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) -- Tester interface 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! +- 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) @@ -16,6 +18,15 @@ Win64: https://github.com/blurymind/Yarn/releases/tag/untagged-1933231011a749959 MacOS: in Progress +# To compile and run from source: +Make sure you have nodejs and electron installed. Then + +npm install +npm start + +# To build a yarn executable yourself: +npm run-script build + # Examples Games built with Unity and Yarn. From 79db774341873f741dfa3b6f83ef45cb87b3a88c Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Wed, 27 Jun 2018 23:12:15 +0100 Subject: [PATCH 15/16] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 893f881..d4a7899 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ MacOS: in Progress Make sure you have nodejs and electron installed. Then npm install + npm start # To build a yarn executable yourself: From 0ee35e08d7dab83a5756a13ac0e76c3443629e7f Mon Sep 17 00:00:00 2001 From: Todor Imreorov Date: Mon, 2 Jul 2018 18:03:18 +0100 Subject: [PATCH 16/16] gitignore and remove vscode folder as requested --- .gitignore | 3 +++ .vscode/settings.json | 12 ------------ .vscode/tasks.json | 10 ---------- 3 files changed, 3 insertions(+), 22 deletions(-) delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json diff --git a/.gitignore b/.gitignore index 279f909..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 diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index d9ee572..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,12 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/.DS_Store": true, - "node_modules": false, - "dist": true, - "app/**/*.js*": false - } -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 8825153..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "0.1.0", - "command": "..\\..\\..\\node\\npm", - "isShellCommand": true, - "args": ["start","--scripts-prepend-node-path"], - "showOutput": "silent", - //"problemMatcher": "$tsc" -} \ No newline at end of file