commit 918b3c8ebe629d55ebc2bacea16d51c77b7107c3 Author: kts of kettek (nyaa) Date: Thu Jul 27 08:45:41 2017 -0700 Add initial pre-alpha codebase for Cat This provides some basic structure and functionality for Cat, albeit with a messy and somewhat incoherent structure. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/Cat.js b/Cat.js new file mode 100644 index 0000000..a483a13 --- /dev/null +++ b/Cat.js @@ -0,0 +1,257 @@ +const {remote} = require('electron'); +const {dialog,Menu,MenuItem} = remote; +const ipcRenderer = require('electron').ipcRenderer; +const settings = require('electron').remote.require('electron-settings'); +const CatProject = require('./classes/CatProject'); + +const Cat = { }; +Cat.loadedProjects = []; +Cat.focusedProject = null; +Cat.listeners = {}; +Cat.on = function(name, cb) { + if (!Cat.listeners[name]) Cat.listeners[name] = []; + for (var i = 0; i < Cat.listeners[name].length; i++) { + if (Cat.listeners[name][i] === cb) return false; // already exists + } + Cat.listeners[name].push(cb); + return true; +} +Cat.removeListener = function(name, cb) { + if (!Cat.listeners[name]) return; + for (var i = 0; i < Cat.listeners[name].length; i++) { + if (Cat.listeners[name][i] === cb) { + Cat.listeners[name].splice(i, 1); + return true; + } + } + return false; +} +Cat.emit = function(name, data) { + if (!Cat.listeners[name]) return; + for (var i = 0; i < Cat.listeners[name].length; i++) { + if (!Cat.listeners[name][i](data)) return false; // exit early if false is returned + } + return true; +} +Cat.addProject = function() { + let treeView = document.querySelector('cat-tree'); + let tabview = document.querySelector('cat-tabview'); + let tab = document.createElement('cat-tab'); + tab.setAttribute('label', ''); + let view = document.createElement('cat-projectview'); + view.className = 'project-view'; + view.addEventListener('click', function(e) { + //console.log(e); + }); + tab.appendChild(view); + let proj = new CatProject(); + proj.view = view; + proj.tab = tab; + tab.project = proj; + tabview.appendChild(tab); + Cat.loadedProjects.push(proj); + proj.init(); + // FIXME: this is so messy. + view.addEventListener('loaded', evt => { + console.log('setting our title to: ' + proj.getTitle()); + proj.tab.setAttribute('label', proj.getTitle()); + tab.setAttribute('label', proj.getTitle()); + this.focusProject(proj); + Cat.emit('project-loaded', {detail: { proj: proj }}); + }); + tabview.selectTab(tab); + return proj; +} +Cat.openProject = function() { + dialog.showOpenDialog({ + title: "Open Project", + properties: ["openFile", "promptToCreate", "createDirectory"], + filters: [ + {name: 'HTML', extensions: ['html', 'htm']} + ] + }, function(filenames) { + if (filenames.length == 0) return; + Cat.loadProject(filenames[0]); + ipcRenderer.send('open-file', filenames[0]); + }); +} +Cat.loadProject = function(filename) { + let proj = this.addProject(); + try { + proj.load(filename, () => { + //let tabView = document.querySelector('cat-tabview'); + //tabView.selectTab(proj.tab.control); + //console.log('setting our title to: ' + proj.getTitle()); + //proj.tab.setAttribute('label', proj.getTitle()); + }); + } catch (e) { + console.log(e); + alert('Failed to load ' + filename + ' as a project'); + } +} +Cat.saveProject = function(proj=Cat.focusedProject, cb) { + if (!proj) return; + console.dir(proj); + proj.save(proj.path, err => { + if (err) { + alert("Failed to save file"); + } + if (cb) cb(err); + }); +} +Cat.saveProjectAs = function(proj=Cat.focusedProject, cb) { + if (!proj) return; + dialog.showSaveDialog({}, filename => { + if (!filename) return; + console.dir(proj); + proj.save(filename, err => { + if (err) { + alert("Failed to save file :S"); + } + if (cb) cb(err); + }); + }); +} +Cat.closeProject = function(proj=Cat.focusedProject, force=false) { + if (!proj) return; + if (proj.hasChanges && !force) { + dialog.showMessageBox({ + type: "question", + title: "Unsaved changes for Project", + message: "Project has unsaved changes!", + buttons: ["Save", "Save As", "Cancel", "OK"] + }, index => { + const SAVE = 0, SAVE_AS = 1, CANCEL = 2, OK = 3; + if (index == CANCEL) { // cancel + } else if (index == OK) { // ok + this.closeProject(proj, true); + return true; + } else if (index == SAVE && proj.path != '') { // save + this.saveProject(proj, err => { + if (err) return; + this.closeProject(proj); + }); + return false; + } else if (index == SAVE_AS || proj.path == '') { // save as + this.saveProjectAs(proj, err => { + if (err) return; + this.closeProject(proj); + }); + return false; + } + }); + } else { + // TODO: augh, rework this stuff + this.loadedProjects.splice(this.loadedProjects.indexOf(proj), 1); + document.querySelector('#element-selector').clear(false); + document.querySelector('cat-tabview').removeTab(proj.tab.control, true); + return true; + } +} +Cat.focusProject = function(proj, cb) { + if (!proj) { + return; + } + Cat.focusedProject = proj; + Cat.emit('project-focused', proj); +} + +Cat.getProjectFromTab = function(tab) { + for (var i = 0; i < this.loadedProjects.length; i++) { + if (this.loadedProjects[i].tab === tab) { + return this.loadedProjects[i]; + } + } + return null; +} + +Cat.init = function() { + let tabView = document.querySelector('cat-tabview'); + Cat.loadModule('elements-view'); + tabView.addEventListener('close-tab', evt => { + let proj = this.getProjectFromTab(evt.detail.content); + if (!proj) { + alert('Target tab does not have an associated project! Closing.'); + return; + } + if (this.closeProject(proj)) { + evt.preventDefault(); + return false; + } + return true; + }); + tabView.addEventListener('select-tab', evt => { + this.focusProject(this.getProjectFromTab(evt.detail)); + }); + tabView.addEventListener('remove-tab', evt => { + var proj = this.getProjectFromTab(evt.detail); + if (!proj) return; + //this.loadedProjects + }); + tabView.addEventListener('loaded', evt => { + var proj = this.getProjectFromTab(evt.detail); + if (!proj) return; + console.log('fuuu'); + }); + Cat.setupControlHooks(); + /* set up ipc */ + ipcRenderer.on('menu', function(event, item) { + if (item.type == 'new') { + console.log('new'); + Cat.addProject(); + } else if (item.type == 'open') { + console.log('open'); + Cat.openProject(); + } else if (item.type == 'save') { + console.log('save'); + Cat.saveProject(); + } else if (item.type == 'save-as') { + console.log('save-as'); + Cat.saveProjectAs(); + } else if (item.type == 'close') { + console.log('close'); + Cat.closeProject(); + } + }); + /* load our settings */ + settings.has('openProjects') ? settings.get('openProjects').forEach(item => { + }):''; +} +Cat.setupControlHooks = function() { + document.querySelector('cat-ctl-2dtransform').addEventListener('value-change', e => { + console.log(e.detail.type + ': ' + e.detail.value); + }); +} +Cat.setSelectorAllAttribute = function(which, attr, value) { + var items = document.querySelectorAll(which); + for (var i = 0; i < items.length; i++) { + items[i].setAttribute(attr, value); + } +} + +Cat.modules = []; +Cat.loadModule = function(name) { + if (Cat.modules[name]) return; // already loaded, return + console.log('loading Module: ' + name); + try { + if (Cat.emit('loading-module', {name: name}) === false) return; + Cat.modules[name] = require('./modules/'+name)(Cat); + for (var i in Cat.modules[name].on) { + console.log('adding hook: ' + i); + Cat.on(i, Cat.modules[name].on[i]); + } + if (Cat.modules[name].init) Cat.modules[name].init(document); + Cat.emit('loaded-module', {name: name, module: Cat.modules[name]}); + } catch (e) { + alert('Unhandled module loading error: ' + e); + } +} +Cat.unloadModule = function(name) { + if (!Cat.modules[name]) return; // not loaded, return + for (var i in Cat.modules[name].on) { + Cat.removeListener(i, Cat.modules[name].on[i]); + } + // TODO: remove module from require cache +} + +module.exports = Cat; diff --git a/classes/CatProject.js b/classes/CatProject.js new file mode 100644 index 0000000..aea2224 --- /dev/null +++ b/classes/CatProject.js @@ -0,0 +1,53 @@ +var fs = require('fs'); +var os = require('os'); + +function CatProject() { + this.path = ''; + this.title = ''; + this.tab = null; + this.view = null; + this.frameTime = 0; + this.originalHTML = ''; + this.hasChanges = false; +} +CatProject.prototype.init = function() { + if (this.view) { + this.view.addEventListener('loaded', evt => { + this.setTitle(this.view.getTitle()); + console.log('our title is now: ' + this.getTitle()); + }); + } +} +CatProject.prototype.save = function(path, cb) { + //fs.writeFile(path, (new XMLSerializer().serializeToString(this.iframe.contentDocument))+this.iframe.contentDocument.outerHTML, 'utf-8', (err) => { + fs.writeFile(path, this.view.getContents(), 'utf-8', (err) => { + if (err) throw err; + this.path = path; + cb(err); + }); +} +CatProject.prototype.load = function(path, cb) { + if (!path) path = this.path; + this.path = path; + fs.readFile(path, 'utf-8', (err, data) => { + if (err) throw err; + this.originalHTML = data; + this.view.setContents(data); + cb(err); + }); +} +CatProject.prototype.setTitle = function(title) { + this.title = title; +} +CatProject.prototype.getTitle = function() { + let title = this.title; + if (title == '') { + title = this.path.split(os.platform() == 'win32' ? '\\' : '/'); + title = title[title.length-1]; + console.log(title); + } + if (title == '') title = 'New Project'; + return title; +} + +module.exports = CatProject; diff --git a/elements/cat-basic.html b/elements/cat-basic.html new file mode 100644 index 0000000..8fd8ae9 --- /dev/null +++ b/elements/cat-basic.html @@ -0,0 +1,16 @@ + + MY CONTENT. + + diff --git a/elements/cat-button.html b/elements/cat-button.html new file mode 100644 index 0000000..8fd8ae9 --- /dev/null +++ b/elements/cat-button.html @@ -0,0 +1,16 @@ + + MY CONTENT. + + diff --git a/elements/cat-caption.js b/elements/cat-caption.js new file mode 100644 index 0000000..e51be6a --- /dev/null +++ b/elements/cat-caption.js @@ -0,0 +1,35 @@ +class CatCaption extends HTMLElement { + static get observedAttributes() { return ['label']; } + + attributeChangedCallback(attr, oldValue, newValue) { + if (attr == 'label') { + this.changeText(newValue); + } + } + + connectedCallback() { + //while (this.firstChild) this.insertBefore(this.firstChild, this.firstChild); + //this.appendChild(this.span); + } + + constructor() { + super(); + if (this.hasAttribute('label')) { + this.changeText(this.getAttribute('label')); + } + } + changeText(value) { + var match = false; + for (var i = 0; i < this.childNodes.length; i++) { + if (this.childNodes[i].nodeType == 3) { + this.childNodes[i].nodeValue = value; + match = true; + break; + } + } + if (!match) { + this.appendChild(document.createTextNode(value)); + } + } +} +customElements.define('cat-caption', CatCaption); diff --git a/elements/cat-checkbox.js b/elements/cat-checkbox.js new file mode 100644 index 0000000..011e7a4 --- /dev/null +++ b/elements/cat-checkbox.js @@ -0,0 +1,13 @@ +class Checkbox extends HTMLElement { + static get observedAttributes() { return ['checked']; } + + attributeChangedCallback(attr, oldValue, newValue) { + if (attr == 'checked') { + } + } + + constructor() { + super(); + } +} +customElements.define('cat-checkbox', Checkbox); diff --git a/elements/cat-control-group.html b/elements/cat-control-group.html new file mode 100644 index 0000000..5a49646 --- /dev/null +++ b/elements/cat-control-group.html @@ -0,0 +1,26 @@ + + + + + + + diff --git a/elements/cat-control-group.js b/elements/cat-control-group.js new file mode 100644 index 0000000..664fbee --- /dev/null +++ b/elements/cat-control-group.js @@ -0,0 +1,48 @@ +customElements.define('cat-control-group', class extends HTMLElement { + static get observedAttributes() { return ['label', 'closed']; } + + attributeChangedCallback(attr, oldValue, newValue) { + if (attr == 'label') { + this.label = newValue; + } else if (attr == 'closed') { + this.closed = newValue === null ? true : false; + } + } + set label(val) { this.caption.setAttribute('label', val); } + get label() { return this.caption.getAttribute('label'); } + set closed(val) { if (val) this.showContent(); else this.hideContent(); } + get closed() { return this.box.style.display === 'none' ? true : false } + + connectedCallback() { + while (this.firstChild) this.box.appendChild(this.firstChild); + + this.appendChild(this.caption); + this.appendChild(this.box); + } + + constructor() { + super(); + + this.box = document.createElement('cat-box'); + + this.caption = document.createElement('cat-caption'); + this.checkbox = document.createElement('cat-checkbox'); + this.caption.appendChild(this.checkbox); + this.caption.addEventListener('click', e => { + if (this.hasAttribute('closed')) { + this.removeAttribute('closed'); + } else { + this.setAttribute('closed', ''); + } + }); + } + + hideContent() { + this.box.style.display = 'none'; + this.checkbox.setAttribute('checked', true); + } + showContent() { + this.box.style.display = ''; + this.checkbox.setAttribute('checked', false); + } +}); diff --git a/elements/cat-control-section.html b/elements/cat-control-section.html new file mode 100644 index 0000000..06dc8ad --- /dev/null +++ b/elements/cat-control-section.html @@ -0,0 +1,29 @@ + + + + + + + diff --git a/elements/cat-ctl-2dtransform.html b/elements/cat-ctl-2dtransform.html new file mode 100644 index 0000000..93b7dd8 --- /dev/null +++ b/elements/cat-ctl-2dtransform.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/cat-ctl-animation.html b/elements/cat-ctl-animation.html new file mode 100644 index 0000000..8f9e989 --- /dev/null +++ b/elements/cat-ctl-animation.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/cat-input.html b/elements/cat-input.html new file mode 100644 index 0000000..953793d --- /dev/null +++ b/elements/cat-input.html @@ -0,0 +1,75 @@ + + + + diff --git a/elements/cat-projectview.html b/elements/cat-projectview.html new file mode 100644 index 0000000..046514b --- /dev/null +++ b/elements/cat-projectview.html @@ -0,0 +1,63 @@ + + + + diff --git a/elements/cat-tab.html b/elements/cat-tab.html new file mode 100644 index 0000000..e74d484 --- /dev/null +++ b/elements/cat-tab.html @@ -0,0 +1,40 @@ + + + + diff --git a/elements/cat-tabview-select.html b/elements/cat-tabview-select.html new file mode 100644 index 0000000..0ae6ee9 --- /dev/null +++ b/elements/cat-tabview-select.html @@ -0,0 +1,56 @@ + + + + diff --git a/elements/cat-tabview.html b/elements/cat-tabview.html new file mode 100644 index 0000000..270b04e --- /dev/null +++ b/elements/cat-tabview.html @@ -0,0 +1,103 @@ + + + + + diff --git a/elements/cat-template.html b/elements/cat-template.html new file mode 100644 index 0000000..4fe5bb7 --- /dev/null +++ b/elements/cat-template.html @@ -0,0 +1,50 @@ + + + diff --git a/elements/cat-template.js b/elements/cat-template.js new file mode 100644 index 0000000..9f212a5 --- /dev/null +++ b/elements/cat-template.js @@ -0,0 +1,53 @@ +customElements.define('cat-template', class extends HTMLElement { + constructor() { + super(); + } + cloneTo(target) { + if (target.hasTemplated) return; + target.hasTemplated = true; + const dom = this.cloneNode(true); + // oh boy, weird value inheritance code. + var inherits = dom.getElementsByTagName('cat-inherits'); + while (inherits.length > 0) { + var item = inherits[0]; + var parent = item.parentNode; + if (!parent) continue; + for (var j = 0; j < item.attributes.length; j++) { + var prop = item.attributes[j]; + (function(target, descriptor, parent, name, value) { + Object.defineProperty(target, value, { + configurable: true, + set: function(val) { + if (descriptor && descriptor.set) descriptor.set(val); + if (name === 'content') { + parent.innerHTML = val; + } else { + if (val === null) { + parent.removeAttribute(name); + } else { + parent.setAttribute(name, val); + } + } + } + }) + })(target, Object.getOwnPropertyDescriptor(target, prop.value), parent, prop.name, prop.value); + } + inherits[0].remove(); + } + // end the gross stuff + // begin other weird stuff of moving childs + var childrenNode = dom.getElementsByTagName('cat-children')[0]; + if (childrenNode) { + while (target.firstChild) childrenNode.parentNode.appendChild(target.firstChild); + childrenNode.parentNode.removeChild(childrenNode); + } + // copy our template clone to our target + while (dom.firstChild) target.appendChild(dom.firstChild); + // finally copy our template's attributes over + for (var i = 0; i < dom.attributes.length; i++) { + target.setAttribute(dom.attributes[i].name, dom.attributes[i].value); + } + // + if (target.templatedCallback) target.templatedCallback(); + } +}); diff --git a/elements/cat-test.html b/elements/cat-test.html new file mode 100644 index 0000000..871011c --- /dev/null +++ b/elements/cat-test.html @@ -0,0 +1,16 @@ + + + + + + diff --git a/elements/cat-timeline.html b/elements/cat-timeline.html new file mode 100644 index 0000000..8fd8ae9 --- /dev/null +++ b/elements/cat-timeline.html @@ -0,0 +1,16 @@ + + MY CONTENT. + + diff --git a/elements/cat-tree.html b/elements/cat-tree.html new file mode 100644 index 0000000..3a01ed3 --- /dev/null +++ b/elements/cat-tree.html @@ -0,0 +1,290 @@ + + + + + diff --git a/elements/cat-vbox.html b/elements/cat-vbox.html new file mode 100644 index 0000000..494715e --- /dev/null +++ b/elements/cat-vbox.html @@ -0,0 +1,12 @@ + diff --git a/fonts/HammersmithOne/HammersmithOne-Regular.ttf b/fonts/HammersmithOne/HammersmithOne-Regular.ttf new file mode 100644 index 0000000..23a366b Binary files /dev/null and b/fonts/HammersmithOne/HammersmithOne-Regular.ttf differ diff --git a/fonts/HammersmithOne/OFL.txt b/fonts/HammersmithOne/OFL.txt new file mode 100644 index 0000000..88514bb --- /dev/null +++ b/fonts/HammersmithOne/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2011 by Sorkin Type Co (www.sorkintype.com), +with Reserved Font Name "Hammersmith". +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/Nunito_Sans/NunitoSans-Black.ttf b/fonts/Nunito_Sans/NunitoSans-Black.ttf new file mode 100644 index 0000000..093fbf9 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-Black.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-BlackItalic.ttf b/fonts/Nunito_Sans/NunitoSans-BlackItalic.ttf new file mode 100644 index 0000000..00db009 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-BlackItalic.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-Bold.ttf b/fonts/Nunito_Sans/NunitoSans-Bold.ttf new file mode 100644 index 0000000..a3ca4b6 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-Bold.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-BoldItalic.ttf b/fonts/Nunito_Sans/NunitoSans-BoldItalic.ttf new file mode 100644 index 0000000..1bccb97 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-BoldItalic.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-ExtraBold.ttf b/fonts/Nunito_Sans/NunitoSans-ExtraBold.ttf new file mode 100644 index 0000000..a732425 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-ExtraBold.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-ExtraBoldItalic.ttf b/fonts/Nunito_Sans/NunitoSans-ExtraBoldItalic.ttf new file mode 100644 index 0000000..05e26d6 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-ExtraBoldItalic.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-ExtraLight.ttf b/fonts/Nunito_Sans/NunitoSans-ExtraLight.ttf new file mode 100644 index 0000000..2ad4ac0 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-ExtraLight.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-ExtraLightItalic.ttf b/fonts/Nunito_Sans/NunitoSans-ExtraLightItalic.ttf new file mode 100644 index 0000000..b73b0fa Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-ExtraLightItalic.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-Italic.ttf b/fonts/Nunito_Sans/NunitoSans-Italic.ttf new file mode 100644 index 0000000..85269a1 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-Italic.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-Light.ttf b/fonts/Nunito_Sans/NunitoSans-Light.ttf new file mode 100644 index 0000000..2f5d049 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-Light.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-LightItalic.ttf b/fonts/Nunito_Sans/NunitoSans-LightItalic.ttf new file mode 100644 index 0000000..bac17d0 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-LightItalic.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-Regular.ttf b/fonts/Nunito_Sans/NunitoSans-Regular.ttf new file mode 100644 index 0000000..9abe932 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-Regular.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-SemiBold.ttf b/fonts/Nunito_Sans/NunitoSans-SemiBold.ttf new file mode 100644 index 0000000..c27eaf4 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-SemiBold.ttf differ diff --git a/fonts/Nunito_Sans/NunitoSans-SemiBoldItalic.ttf b/fonts/Nunito_Sans/NunitoSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..59b6402 Binary files /dev/null and b/fonts/Nunito_Sans/NunitoSans-SemiBoldItalic.ttf differ diff --git a/fonts/Nunito_Sans/OFL.txt b/fonts/Nunito_Sans/OFL.txt new file mode 100644 index 0000000..a6a7659 --- /dev/null +++ b/fonts/Nunito_Sans/OFL.txt @@ -0,0 +1,92 @@ +Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com), +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/images/icon_arrows.png b/images/icon_arrows.png new file mode 100644 index 0000000..009267b Binary files /dev/null and b/images/icon_arrows.png differ diff --git a/images/icon_buttons.png b/images/icon_buttons.png new file mode 100644 index 0000000..cc6ab81 Binary files /dev/null and b/images/icon_buttons.png differ diff --git a/main.css b/main.css new file mode 100644 index 0000000..0f962d8 --- /dev/null +++ b/main.css @@ -0,0 +1,314 @@ +@font-face { + font-family: Nunito Sans; + src: url('fonts/Nunito_Sans/NunitoSans-Regular.ttf'); +} +@font-face { + font-family: Nunito Sans; + src: url('fonts/Nunito_Sans/NunitoSans-Bold.ttf'); + font-weight: bold; +} +@font-face { + font-family: Hammersmith One; + src: url('fonts/HammersmithOne/HammersmithOne-Regular.ttf'); +} + +:root { + --main-font-size: 16px; + --display-font-family: Hammersmith One; + --text-font-family: Nunito Sans; + --main-background: #444; + --main-color: #dcdcdc; + --caption-font-size: 75%; + --sub-background: #333; + --sub-color: #ccc; + --section-font-size: 80%; + --section-color: #bbb; + --section-background: linear-gradient(to bottom, #1c1c1c 75%, #2c2c2c 100%); + --section-border-bottom: 1px solid #4c4c4c; + --section-border-top: 1px solid #0c0c0c; + --section-border-left: 1px solid #2c2c2c; + --section-border-right: 1px solid #3c3c3c; + --input-background: #111; + --input-color: #aaa; + --input-placeholder-color: #666; + --input-font-size: 75%; + --input-border: 1px solid #000; + --input-border-radius: 2px; + --button-background: #444; + --button-color: #ccc; + --button-border-left: 1px solid #4c4c4c; + --button-border-right: 1px solid #0c0c0c; + --button-border-bottom: 1px solid #2c2c2c; + --button-border-top: 1px solid #3c3c3c; + --selected-background: #8AD; + --selected-color: #153; + --default-transition: 0.1s all; +} + +*::-webkit-scrollbar { + width: 6px; +} +*::-webkit-scrollbar-track { + background: #111; + border-radius: 2px; + box-shadow: inset 0 0 1px 1px #000; +} +*::-webkit-scrollbar-thumb { + background: #333; + border-radius: 2px; + box-shadow: inset 1px 1px 1px 0 #444; +} + +html, body { + width: 100%; height: 100%; + margin: 0; padding: 0; + font-family: var(--text-font-family); + font-size: var(--main-font-size); + background: var(--main-background); + color: var(--main-color); +} + +* { + box-sizing: border-box; +} +/* When any element has a display set, the hidden flag doesn't apply unless the following is provided. */ +*[hidden] { + display: none; +} + +.cursor-col-resize, .cursor-col-resize * { cursor: col-resize !important; } + +body { + display: flex; + align-items: stretch; + align-content: stretch; +} + +cat-vbox, cat-hbox { + position: relative; + display: flex; + align-items: stretch; + align-content: stretch; + flex: 1; +} +cat-vbox { + flex-direction: column; +} +cat-hbox { + flex-direction: row; +} + +cat-splitter { + position: absolute; + top: 0; + width: 8px; + border: 2px solid green; +} +cat-vbox > cat-splitter { + top: 50%; + right: 0; +} +cat-hbox > cat-splitter { + top: 50%; + right: 0; +} + +cat-gripper { + position: relative; + display: block; + padding: 0; margin: 0; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAFklEQVQImWNgYGD4r6Oj85+BGIBdJQDN6AUFzuZQgQAAAABJRU5ErkJggg==) repeat; +} + +cat-caption { + width: 100%; + display: block; + font-family: var(--display-font-family); + font-size: var(--caption-font-size); + vertical-align: middle; + padding: 0.25em; + user-select: none; +} + +cat-checkbox { + display: inline-block; + background-image: url('images/icon_arrows.png'); + background-position: -16px 0; + background-repeat: no-repeat; + background-color: transparent; + width: 16px; height: 16px; + border: 0; padding: 0; margin:0; + margin-right: 0.25em; +} + +cat-checkbox[checked] { + background-position: 0 0; +} + +cat-control-group > cat-caption { + display: flex; + cursor: pointer; + background: linear-gradient(to bottom, #4c4c4c 75%, #3c3c3c 100%); + border-top: 1px solid #6c6c6c; + border-bottom: 1px solid #1c1c1c; +} + +cat-control-group { + background: var(--sub-background); + color: var(--sub-color); +} +cat-control-group > cat-box { + display: flex; + padding: 0.25em 0.5em 0.5em 0.5em; +} + +cat-control-section { +} +cat-control-section label { + font-size: 75%; + margin: 0.25em 0.5em 0.25em 1.0em; + display: flex; + align-items: center; + position: relative; +} +cat-control-section input { + background: var(--input-background); + color: var(--input-color); + font-size: var(--input-font-size); + border: var(--input-border); + border-radius: var(--input-border-radius); + margin: 0.25em; + padding: 0.25em 0.5em; + flex: 1 0 4em; + width: 100%; + min-width: 5em; /* yo ho, this be required to prevent too much shrinkage! */ + transition: var(--default-transition); +} +cat-control-section input[type=number] { +} +/* */ +.section-heading { + font-size: var(--section-font-size); + background: var(--section-background); + color: var(--section-color); + border-left: var(--section-border-left); + border-right: var(--section-border-right); + border-top: var(--section-border-top); + border-bottom: var(--section-border-bottom); + padding: 0.25em; +} + +cat-tabview { + display: flex; + flex: 1; + flex-direction: column; +} +cat-tabview-selects { + display: flex; + flex-direction: row; + height: 1.5em; +} +cat-tabview-select { + display: flex; + flex: 0 1 6em; + background: linear-gradient(to bottom, #3c3c3c 75%, #2c2c2c 100%); + border-top: 1px solid #6c6c6c; + border-bottom: 1px solid #1c1c1c; + overflow: hidden; +} +cat-tabview-select:hover { + cursor: pointer; +} +cat-tabview-tabs { + display: flex; + flex: 1; +} +cat-tab { + display: flex; + flex: 1; +} +cat-tab > iframe { + flex: 1; +} +cat-tabview-select.selected cat-caption { + background: #555; +} + +/* */ +button { + min-width: 1em; + min-height: 1em; + border-left: var(--button-border-left); + border-right: var(--button-border-right); + border-top: var(--button-border-top); + border-bottom: var(--button-border-bottom); + color: var(--button-color); + background: var(--button-background); +} +button:hover { + cursor: pointer; +} +button.close { + content: 'x'; +} + +/* */ +#view { + background-color: black; +} +#view > cat-tabs { + padding: 1em; + background: var(--main-background); +} + +.project-view { + flex: 1; +} + +cat-projectview { + display: flex; +} + +cat-projectview iframe { + flex: 1; +} +/* */ +cat-input { + flex: 1; +} + +/* */ +cat-tree { + display: table; + width: 100%; +} +cat-tree-head { + display: table-row; +} +cat-tree-row { + display: table-row; + transition: var(--default-transition); +} +cat-tree-row[selected] { + background: var(--selected-background); + color: var(--selected-color); +} +cat-tree-cell { + display: table-cell; +} + +cat-tree-row[depth="1"] cat-tree-cell:first-child { + padding-left: 0.5em; +} +cat-tree-row[depth="2"] cat-tree-cell:first-child { + padding-left: 1em; +} +cat-tree-row[depth="3"] cat-tree-cell:first-child { + padding-left: 1.5em; +} +cat-tree-row[depth="4"] cat-tree-cell:first-child { + padding-left: 2em; +} +cat-tree-row[depth="5"] cat-tree-cell:first-child { + padding-left: 2.5em; +} diff --git a/main.html b/main.html new file mode 100644 index 0000000..a74ab18 --- /dev/null +++ b/main.html @@ -0,0 +1,93 @@ + + + + + Cat X + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..057b424 --- /dev/null +++ b/main.js @@ -0,0 +1,184 @@ +const electron = require('electron') +const ipcMain = require('electron').ipcMain; +const settings = require('electron-settings'); +// Module to control application life. +const app = electron.app +const Menu = electron.Menu +// Module to create native browser window. +const BrowserWindow = electron.BrowserWindow + +const path = require('path') +const url = require('url') + +// 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 + +function createWindow () { + // Create the main menu. + createMenu() + // Create the browser window. + mainWindow = new BrowserWindow({backgroundColor: '#2e2c29', title: 'Cat', width: 800, height: 600}) + + // and load the index.html of the app. + mainWindow.loadURL(url.format({ + pathname: path.join(__dirname, 'main.html'), + protocol: 'file:', + slashes: true + })) + + // Open the DevTools. + // mainWindow.webContents.openDevTools() + + // Emitted when the window is closed. + mainWindow.on('closed', function () { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null + }) +} + +// 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. + +// Here begins the menu stuff +function createMenu() { + const template = [ + { + label: 'File', + submenu: [ + {label: 'New', accelerator: 'CmdOrCtrl+N', click() { + mainWindow.webContents.send('menu', {type: 'new'}); + }}, + {label: 'Open', accelerator: 'CmdOrCtrl+O', click() { + mainWindow.webContents.send('menu', {type: 'open'}); + }}, + {label: 'Open Recent', submenu: [ + {label: 'A file'} + ]}, + {type: 'separator'}, + {label: 'Save', accelerator: 'CmdOrCtrl+S', click() { + mainWindow.webContents.send('menu', {type: 'save'}); + }}, + {label: 'Save As', accelerator: 'Shift+CmdOrCtrl+S', click() { + mainWindow.webContents.send('menu', {type: 'save-as'}); + }}, + {type: 'separator'}, + {role: 'quit'} + ] + }, + { + label: 'Edit', + submenu: [ + {role: 'undo'}, + {role: 'redo'}, + {type: 'separator'}, + {role: 'cut'}, + {role: 'copy'}, + {role: 'paste'}, + {role: 'pasteandmatchstyle'}, + {role: 'delete'}, + {role: 'selectall'} + ] + }, + { + label: 'View', + submenu: [ + {role: 'reload'}, + {role: 'forcereload'}, + {role: 'toggledevtools'}, + {type: 'separator'}, + {role: 'resetzoom'}, + {role: 'zoomin'}, + {role: 'zoomout'}, + {type: 'separator'}, + {role: 'togglefullscreen'} + ] + }, + { + role: 'window', + submenu: [ + {role: 'minimize'}, + {label: 'Close', accelerator: 'CmdOrCtrl+W', click() { + mainWindow.webContents.send('menu', {type: 'close'}); + }} + ] + }, + { + role: 'help', + submenu: [ + { + label: 'Learn More', + click () { require('electron').shell.openExternal('https://electron.atom.io') } + } + ] + } + ] + + if (process.platform === 'darwin') { + template.unshift({ + label: app.getName(), + submenu: [ + {role: 'about'}, + {type: 'separator'}, + {role: 'services', submenu: []}, + {type: 'separator'}, + {role: 'hide'}, + {role: 'hideothers'}, + {role: 'unhide'}, + {type: 'separator'}, + {role: 'quit'} + ] + }) + + // Edit menu + template[1].submenu.push( + {type: 'separator'}, + { + label: 'Speech', + submenu: [ + {role: 'startspeaking'}, + {role: 'stopspeaking'} + ] + } + ) + + // Window menu + template[3].submenu = [ + {role: 'close'}, + {role: 'minimize'}, + {role: 'zoom'}, + {type: 'separator'}, + {role: 'front'} + ] + } + + const menu = Menu.buildFromTemplate(template) + Menu.setApplicationMenu(menu) + + ipcMain.on('open-file', (evt, arg) => { + }); +} diff --git a/modules/animations-view.js b/modules/animations-view.js new file mode 100644 index 0000000..e0b4397 --- /dev/null +++ b/modules/animations-view.js @@ -0,0 +1,31 @@ +const {remote} = require('electron'); +const {dialog,Menu,MenuItem} = remote; + +module.exports = function(Cat) { + return { + init: function(dom) { + let animationsTree = document.querySelector('#animations-tree'); + animationsTree.addEventListener('click-row', evt => { + // TODO: select animation to edit/view ??? + }); + // Add a right-click handler to the parent node which *should* be a vbox + animationsTree.parentNode.addEventListener('contextmenu', evt => { + const treeMenu = new Menu(); + treeMenu.append(new MenuItem({type: 'separator'})); + treeMenu.append(new MenuItem({label: 'Delete', enabled: (target ? true : false), click() { + treeView.removeRow(target); + }})); + treeMenu.popup({async: true}); + }); + // Add a remove-row handler for obvious reasons. + animationsTree.addEventListener('remove-row', evt => { + }); + }, + on: { + // Add hook for when a project is focused, we rebuild the animations tree to correspond to the target DOM. In the future we could cache this DOM tree. + 'project-focused': e => { + let animationsTree = document.querySelector('#animations-tree'); + } + } + } +}; diff --git a/modules/elements-view.js b/modules/elements-view.js new file mode 100644 index 0000000..285b8f0 --- /dev/null +++ b/modules/elements-view.js @@ -0,0 +1,60 @@ +const {remote} = require('electron'); +const {dialog,Menu,MenuItem} = remote; + +module.exports = function(Cat) { + return { + init: function(dom) { + let treeView = document.querySelector('#element-selector'); + treeView.addEventListener('click-row', evt => { + if (!evt.detail.targetNode) return; + Cat.focusedProject.view.focusedElement = evt.detail.targetNode; + }); + treeView.parentNode.addEventListener('contextmenu', evt => { + var target = evt.target; + if (target.tagName === 'CAT-TREE-CELL') { + target = target.parentNode; + } + const treeMenu = new Menu(); + if (target !== null && target !== undefined && target === treeView.selectedRow) { + treeMenu.append(new MenuItem({label: 'Insert Element Before', enabled: (Cat.focusedProject ? true : false), click() { + }})); + treeMenu.append(new MenuItem({label: 'Insert Element Into', enabled: (Cat.focusedProject ? true : false), click() { + }})); + treeMenu.append(new MenuItem({label: 'Insert Element After', enabled: (Cat.focusedProject ? true : false), click() { + }})); + } else { + treeMenu.append(new MenuItem({label: 'Insert Element', enabled: (Cat.focusedProject ? true : false), click() { + }})); + } + if (target.tagName !== 'CAT-TREE-ROW') { + target = treeView.selectedRow; + } + + treeMenu.append(new MenuItem({type: 'separator'})); + treeMenu.append(new MenuItem({label: 'Delete', enabled: (target ? true : false), click() { + treeView.removeRow(target); + }})); + treeMenu.popup({async: true}); + }); + treeView.addEventListener('remove-row', evt => { + console.log(evt.detail.row); + if (evt.detail.row.targetNode && evt.detail.row.targetNode.parentNode) evt.detail.row.targetNode.parentNode.removeChild(evt.detail.row.targetNode); + }); + + }, + on: { + // Add hook for when an element is selected on the project view, we select the given row in our elements tree + 'project-loaded': e => { + e.detail.proj.view.addEventListener('selected-element', evt => { + var el = this.elementsView.getMatchingRow(evt.detail); + if (el) this.elementsView.selectedRow = el; + }); + }, + // Add hook for when a project is focused, we rebuild the elements tree to correspond to the target DOM + 'project-focused': e => { + this.elementsView = document.querySelector('#element-selector'); + this.elementsView.cloneDomToRows(Cat.focusedProject.view.querySelector('iframe').contentDocument.querySelector('body'), ["tagName", "class", "id"]); + } + } + } +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2124969 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1329 @@ +{ + "name": "cat", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "7.0.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.34.tgz", + "integrity": "sha512-99ujivDq9tqw3b88xrWqUcHfY3XT+moVhAlMqlN+OdavTxfCRW2X1bRBFcloILRJiIoir+gG3I65jzrpNgF/3g==", + "dev": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "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.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "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 + }, + "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" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "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 + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + }, + "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 + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + }, + "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.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "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 + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "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 + }, + "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": "1.6.11", + "resolved": "https://registry.npmjs.org/electron/-/electron-1.6.11.tgz", + "integrity": "sha1-vnnA69zv7bW/KBF0CYAPpTus7/o=", + "dev": true, + "requires": { + "@types/node": "7.0.34", + "electron-download": "3.3.0", + "extract-zip": "1.6.5" + } + }, + "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.8", + "fs-extra": "0.30.0", + "home-path": "1.0.5", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "2.1.0", + "rc": "1.2.1", + "semver": "5.3.0", + "sumchecker": "1.3.1" + } + }, + "electron-settings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/electron-settings/-/electron-settings-3.1.1.tgz", + "integrity": "sha512-FL3YpGOxRT4urfVlXo5WohAif3vWNjhZkmlow74oeXg0mIwBndBaFgccOvtCHBsxzOniJRCGNnAJ2/GmWWtI+w==", + "requires": { + "clone": "2.1.1", + "jsonfile": "3.0.1" + }, + "dependencies": { + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "requires": { + "graceful-fs": "4.1.11" + } + } + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", + "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extract-zip": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.5.tgz", + "integrity": "sha1-maBnNbbqIOqbcF13ms/8yHz/BEA=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "debug": "2.2.0", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "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" + } + }, + "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.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "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.1" + } + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-path": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.5.tgz", + "integrity": "sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.1" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.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-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 + }, + "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-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "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" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "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" + } + }, + "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" + } + }, + "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.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "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 + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + } + }, + "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.8", + "minimist": "1.2.0", + "pretty-bytes": "1.0.4", + "progress-stream": "1.2.0", + "request": "2.81.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" + } + }, + "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": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "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": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress-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.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "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.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.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.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "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" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "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 + }, + "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" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "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.8", + "es6-promise": "4.1.1" + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "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" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "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.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "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 new file mode 100644 index 0000000..1fb0545 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "cat", + "version": "0.0.0", + "description": "CSS3 Animation Tool", + "main": "main.js", + "scripts": { + "start": "electron ." + }, + "repository": "", + "keywords": [], + "author": "kts of kettek", + "license": "", + "devDependencies": { + "electron": "~1.6.11" + }, + "dependencies": { + "electron-settings": "^3.1.1" + } +} diff --git a/renderer.js b/renderer.js new file mode 100644 index 0000000..a25e007 --- /dev/null +++ b/renderer.js @@ -0,0 +1,10 @@ +// This file is required by the index.html file and will +// be executed in the renderer process for that window. +// All of the Node.js APIs are available in this process. +if (process.platform === 'darwin') { + window.globalMouse = require('osx-mouse')(); +} else if (process.platform === 'win') { + window.globalMouse = require('win-mouse')(); +} + +var Cat = require('./Cat');