├── .gitignore ├── chrome ├── .gitignore ├── icon-128.png ├── icon-16.png ├── icon-48.png ├── content-script │ ├── .babelrc │ ├── webpack.config.js │ ├── index.html │ ├── src │ │ ├── components │ │ │ ├── TabList.jsx │ │ │ ├── SearchBar.jsx │ │ │ ├── TabListItem.jsx │ │ │ └── App.jsx │ │ └── ChromeController.js │ ├── package.json │ ├── index.js │ ├── styles.css │ └── yarn-error.log ├── archive.sh ├── manifest.json └── event-page │ ├── index.js │ └── fuse.min.js ├── media ├── logo.png └── screenshot.gif └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | /chrome/content-script/bin 2 | -------------------------------------------------------------------------------- /chrome/.gitignore: -------------------------------------------------------------------------------- 1 | *.zip 2 | node_modules 3 | -------------------------------------------------------------------------------- /media/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndethore/swoop/HEAD/media/logo.png -------------------------------------------------------------------------------- /chrome/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndethore/swoop/HEAD/chrome/icon-128.png -------------------------------------------------------------------------------- /chrome/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndethore/swoop/HEAD/chrome/icon-16.png -------------------------------------------------------------------------------- /chrome/icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndethore/swoop/HEAD/chrome/icon-48.png -------------------------------------------------------------------------------- /media/screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndethore/swoop/HEAD/media/screenshot.gif -------------------------------------------------------------------------------- /chrome/content-script/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015"], 3 | "plugins": [ 4 | ["transform-react-jsx", { 5 | "pragma": "m" 6 | }], 7 | "transform-class-properties" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /chrome/content-script/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | module.exports = { 4 | entry: './index.js', 5 | output: { 6 | path: path.resolve(__dirname, './bin'), 7 | filename: 'app.js', 8 | }, 9 | module: { 10 | rules: [{ 11 | test: /\.(js|jsx)$/, 12 | exclude: /node_modules/, 13 | loader: 'babel-loader' 14 | }] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /chrome/archive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | mkdir temp 4 | cp manifest.json temp/ 5 | cp icon*.png temp/ 6 | 7 | mkdir -p temp/content-script/bin 8 | cp content-script/styles.css temp/content-script/ 9 | cp content-script/bin/app.js temp/content-script/bin/ 10 | 11 | mkdir temp/event-page 12 | # to update when setting up event-page build 13 | cp event-page/fuse.min.js temp/event-page/ 14 | cp event-page/index.js temp/event-page/ 15 | 16 | zip -r archive temp 17 | 18 | rm -rf temp 19 | -------------------------------------------------------------------------------- /chrome/content-script/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Swoop 11 | 12 | 13 | 14 |

Amazing Website!

15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /chrome/content-script/src/components/TabList.jsx: -------------------------------------------------------------------------------- 1 | var m = require("mithril"); 2 | 3 | import TabListItem from './TabListItem.jsx'; 4 | 5 | export default class TabList { 6 | constructor(vnode) { 7 | 8 | } 9 | 10 | view (vnode) { 11 | const tabs = vnode.attrs.tabs; 12 | const selectedIndex = vnode.attrs.selectedIndex; 13 | 14 | return ( 15 |
16 | { 17 | tabs.map(function(tab, index) { 18 | const highlighted = (index === selectedIndex); 19 | return 20 | }) 21 | } 22 |
23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /chrome/content-script/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swoop", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "Nicolas ", 6 | "license": "MIT", 7 | "dependencies": { 8 | "babel-core": "^6.26.0", 9 | "babel-loader": "^7.1.4", 10 | "babel-plugin-transform-react-jsx": "^6.24.1", 11 | "babel-preset-es2015": "^6.24.1", 12 | "mithril": "^1.1.6", 13 | "webpack": "^4.4.1" 14 | }, 15 | "scripts": { 16 | "start": "webpack -d --watch", 17 | "build": "webpack -p" 18 | }, 19 | "devDependencies": { 20 | "webpack-cli": "^2.0.13" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /chrome/content-script/index.js: -------------------------------------------------------------------------------- 1 | var m = require("mithril") 2 | import App from './src/components/App.jsx' 3 | import ChromeController from './src/ChromeController.js' 4 | 5 | var controller = new ChromeController(); 6 | // controller.init(); 7 | /* 8 | ** Render component in a placeholder div to avoid overriding 9 | ** existing DOM elements. 10 | */ 11 | var slot = document.getElementById("swoop-slot"); 12 | if (!slot) { 13 | slot = document.createElement("div"); 14 | slot.setAttribute("id", "swoop-slot"); 15 | document.body.appendChild(slot); 16 | } 17 | 18 | m.mount(slot, {view: function () {return m(App, {controller: controller})}}) 19 | -------------------------------------------------------------------------------- /chrome/content-script/src/components/SearchBar.jsx: -------------------------------------------------------------------------------- 1 | var m = require("mithril"); 2 | 3 | export default class SearchBar { 4 | onupdate() { 5 | document.querySelector("#swoop #search input").focus(); 6 | } 7 | 8 | view(vnode) { 9 | return ( 10 | 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /chrome/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Swoop! Beta", 3 | "version": "1.0.1", 4 | "version_name": "1.0 beta 2", 5 | "description": "Quickly search and navigate through your tabs.", 6 | "icons": { 7 | "16": "icon-16.png", 8 | "48": "icon-48.png", 9 | "128": "icon-128.png" 10 | }, 11 | "manifest_version": 2, 12 | "background": { 13 | "scripts": ["event-page/fuse.min.js", "event-page/index.js"], 14 | "persistent": true 15 | }, 16 | "content_scripts": [ 17 | { 18 | "matches": [""], 19 | "css": ["content-script/styles.css"], 20 | "js": ["content-script/bin/app.js"] 21 | } 22 | ], 23 | "permissions": ["tabs", ""], 24 | "browser_action": { 25 | "default_icon": "icon-128.png" 26 | }, 27 | "commands": { 28 | "toggle": { 29 | "suggested_key": { 30 | "default": "Ctrl+M", 31 | "mac": "Command+K" 32 | }, 33 | "description": "Toggle switcher UI" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /chrome/content-script/src/ChromeController.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | export default class ChromeController { 4 | constructor() { 5 | this.port = null; 6 | this.onShowCommand = null; 7 | this.onHideCommand = null; 8 | } 9 | 10 | search = (query) => { 11 | this.port.postMessage({command: "search", query: query}); 12 | } 13 | 14 | open = (id) => { 15 | this.port.postMessage({command: "open", tabId: id}); 16 | } 17 | 18 | onMessage = (message) => { 19 | console.log(`Command received from event page: ${message.command}`); 20 | switch (message.command) { 21 | case "show": { 22 | if (this.onShowCommand) this.onShowCommand(message.data); 23 | break; 24 | } 25 | case "hide": { 26 | if (this.onHideCommand) this.onHideCommand(); 27 | break; 28 | } 29 | default: break; 30 | 31 | } 32 | } 33 | 34 | onDisconnect = () => { 35 | console.log("Port disconnected."); 36 | console.log(`Last Error: ${chrome.runtime.lastError}`); 37 | this.port = null; 38 | } 39 | 40 | onConnect = (port) => { 41 | console.log("Connection established..."); 42 | this.port = port; 43 | this.port.onMessage.addListener(this.onMessage); 44 | this.port.onDisconnect.addListener(this.onDisconnect); 45 | } 46 | 47 | onHandshake = (message, sender, sendResponse) => { 48 | // Responding to probe from the extension to check if 49 | // a content script already exists on the page 50 | sendResponse("pong"); 51 | } 52 | 53 | init() { 54 | console.log("Initializing..."); 55 | chrome.runtime.onMessage.addListener(this.onHandshake); 56 | chrome.runtime.onConnect.addListener(this.onConnect); 57 | console.log("Ready!"); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /chrome/content-script/src/components/TabListItem.jsx: -------------------------------------------------------------------------------- 1 | var m = require("mithril"); 2 | 3 | export default class TabListItem { 4 | constructor() { 5 | 6 | } 7 | 8 | matchForKey(key, matches) { 9 | if (matches) { 10 | for (let match of matches) { 11 | if (match.key == key) return match; 12 | } 13 | } 14 | return null; 15 | } 16 | 17 | highlight(text, indices, opening, closing) { 18 | var chunks = []; 19 | 20 | for (let indice of indices) { 21 | const start = indice[0]; 22 | const end = indice[1]; 23 | 24 | chunks.push({text: text.substr(0, start), highlight: false}); 25 | chunks.push({text: text.substr(start, (end + 1) - start), highlight: true}); 26 | text = text.substr(end + 1); 27 | } 28 | chunks.push({text: text, highlight: false}); 29 | 30 | return ( 31 | 32 | { 33 | chunks.map(function(chunk) { 34 | if (chunk.highlight) return {chunk.text}; 35 | return {chunk.text}; 36 | }) 37 | } 38 | 39 | ); 40 | } 41 | 42 | view (vnode) { 43 | const ui = vnode.state; 44 | const tab = vnode.attrs.tab; 45 | const favicon = tab.item.favIconUrl; 46 | const selected = vnode.attrs.highlighted; 47 | let title = tab.item.title; 48 | let url = tab.item.url; 49 | let match; 50 | 51 | if ((match = ui.matchForKey("title", tab.matches))) { 52 | title = ui.highlight(title, match.indices, , ); 53 | } 54 | if ((match = ui.matchForKey("url", tab.matches))) { 55 | url = ui.highlight(url, match.indices, , ); 56 | } 57 | 58 | return ( 59 |
60 | 61 |
62 | {title} 63 | {url} 64 |
65 |
66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /chrome/content-script/styles.css: -------------------------------------------------------------------------------- 1 | .no-scroll { overflow: hidden; } 2 | 3 | #swoop { display: none; width: 100%; height: 100%; position: fixed; left: 0; top: 0; z-index: 9999; background-color: rgb(0, 0, 0, 0.3); } 4 | #swoop * { color:rgb(74, 74, 74); font-size: 14px; line-height: 1.5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; -webkit-font-smoothing: antialiased;} 5 | #swoop.visible { display: block; } 6 | 7 | #swoop #container { display: flex; flex-direction: column; max-width: 450px; height: 400px; margin: 64px auto; background-color: #f5f5f5; border-radius: 4px; border-width: 1px; border-color: #273741; -webkit-box-shadow: 0px 2px 8px 0px rgba(0,0,0,0.2); -moz-box-shadow: 0px 2px 8px 0px rgba(0,0,0,0.2); box-shadow: 0px 2px 8px 0px rgba(0,0,0,0.2);} 8 | 9 | #swoop .instructions { text-align: center; font-size: 0.8em; } 10 | 11 | #swoop #search { display: flex; flex-shrink: 0; /*flex-direction: row;*/ align-items: center; margin: 0px 22px 0;} 12 | #swoop #search .magnifier-icon { flex-grow: 1; flex-shrink: 0; width: 24px; height: 24px; } 13 | #swoop #search input { flex-grow: 2; font-size: 2em; border: none; outline: none; padding: 10px; margin: 0 auto; background-color: transparent;} 14 | 15 | #swoop #tab-list { margin: 0 12px; overflow-y: scroll; overflow-x: hidden;} 16 | #swoop #tab-list .tab { display: flex; flex-direction: row; align-items: center; padding: 10px 10px 10px ; text-align: left;} 17 | #swoop #tab-list .tab .favicon { flex-shrink: 0; width: 24px; height: 24px; background-image: none; } 18 | #swoop #tab-list .tab .details { display: flex; flex-direction: column; margin: 0 12px; min-width: 360px;} 19 | #swoop #tab-list .tab .details * { white-space: nowrap; overflow: hidden; text-overflow: ellipsis;} 20 | #swoop #tab-list .tab .details *.highlighted { background-color: rgb(255, 255, 0, 0.5); text-decoration: underline; text-decoration-color: #eccb2d;} 21 | #swoop #tab-list .tab .details .url { font-size: 0.8em; } 22 | #swoop #tab-list .tab.selected { background-color: lightgrey; } 23 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | The missing chrome extension for busy developers. Swoop brings modern code editor's quick open functionality to your browser. 4 | 5 | 6 | ## Install 7 | 8 | * [Chrome Extension](https://chrome.google.com/webstore/detail/swoop-beta/hnjjjkipglinhabedpmnbimjolifcihd) 9 | * Safari Extension (coming soon) 10 | 11 | 12 | ## How it works 13 | **Default Shortucts:** 14 | - Mac: Command ⌘ + K 15 | - Windows and Linux: Ctrl + M 16 | 17 | 18 | ## Customization 19 | 20 | We're happy to receive suggestions and contributions, but be aware this is a highly opinionated project. There's a very high bar for adding options. 21 | 22 | This doesn't necessarily limit you from manually disabling functionality that is not useful for you. You can clone the repository, make the adjustments you need, and [load the unpacked extension in Chrome](https://developer.chrome.com/extensions/getstarted#unpacked), rather than installing from the Chrome Store. 23 | 24 | ## Contribute 25 | 26 | Suggestions and pull requests are highly encouraged! 27 | 28 | The extension has two main components: 29 | - an event page that holds the state and most of the logic. 30 | - a content script injected into each tabs individually, that act as a UI. 31 | 32 | In order to make modifications to the extension you'd need to run it locally. 33 | 34 | Please follow the below steps: 35 | 36 | ``` 37 | git clone https://github.com/ndethore/swoop 38 | cd swoop/chrome/content-script 39 | npm install # Install dev dependencies 40 | npm run build # Build the extension code so it's ready for the browser 41 | npm run watch # Listen for file changes and automatically rebuild 42 | ``` 43 | 44 | Once built, load it in the browser of your choice: 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 60 | 63 | 64 |
ChromeSafari
53 |
    54 |
  1. Open chrome://extensions 55 |
  2. Check the Developer mode checkbox 56 |
  3. Click on the Load unpacked extension button 57 |
  4. Select the folder swoop/chrome 58 |
59 |
61 | Coming soon 62 |
65 | 66 | 67 | ## Maintainers 68 | 69 | * [Nicolas de Thore](https://github.com/ndethore) 70 | 71 | 72 | ## License 73 | 74 | [MIT](https://github.com/ndethore/swoop/blob/master/LICENSE) 75 | 76 | Copyright (c) 2018-present, Nicolas de Thoré. 77 | -------------------------------------------------------------------------------- /chrome/content-script/src/components/App.jsx: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var m = require("mithril"); 4 | import SearchBar from './SearchBar.jsx'; 5 | import TabList from './TabList.jsx'; 6 | 7 | export default class App { 8 | constructor(vnode) { 9 | console.log("Contructing app component..."); 10 | this.tabs = []; 11 | this.input = ""; 12 | this.visible = false; 13 | this.selectedIndex = -1; 14 | } 15 | 16 | /* 17 | ** Life Cycle Methods 18 | */ 19 | oninit(vnode) { 20 | console.log(`Component created with attrs: ${vnode.attrs}`); 21 | } 22 | 23 | oncreate(vnode) { 24 | console.log("Initialized with height of: ", vnode.dom.offsetHeight); 25 | this.controller = vnode.attrs.controller; 26 | this.controller.onShowCommand = this.show; 27 | this.controller.onHideCommand = this.hide; 28 | this.controller.init(); 29 | } 30 | 31 | 32 | /* 33 | ** Instance Methods 34 | */ 35 | hide = () => { 36 | this.unlockBodyScroll(); 37 | document.removeEventListener('keydown', this.onKeydown); 38 | 39 | this.visible = false; 40 | 41 | m.redraw(); 42 | } 43 | 44 | show = (data) => { 45 | this.lockBodyScroll(); 46 | document.addEventListener('keydown', this.onKeydown, false); 47 | 48 | const searching = this.input.length > 0; 49 | this.visible = true; 50 | this.tabs = JSON.parse(data); 51 | this.selectedIndex = searching? 0 : -1; 52 | 53 | m.redraw(); 54 | } 55 | 56 | selectPrevious = () => { 57 | this.selectedIndex = Math.max(this.selectedIndex - 1, 0); 58 | m.redraw(); 59 | } 60 | 61 | selectNext = () => { 62 | this.selectedIndex = Math.min(this.selectedIndex + 1, this.tabs.length - 1); 63 | m.redraw(); 64 | } 65 | 66 | lockBodyScroll() { 67 | document.body.classList.toggle("no-scroll", true); 68 | } 69 | 70 | unlockBodyScroll() { 71 | document.body.classList.toggle("no-scroll", false); 72 | } 73 | 74 | 75 | /* 76 | ** User Input Events 77 | */ 78 | onKeydown = (event) => { 79 | console.log("Keydown!"); 80 | /* 81 | ** Moved shortcut detection to browser level to avoid to avoid potential 82 | ** conflict with pre-existing web page's listeners. 83 | */ 84 | switch (event.key) { 85 | case "Escape": this.hide(); break; 86 | case "ArrowUp": this.selectPrevious(); break; 87 | case "ArrowDown": this.selectNext(); break; 88 | case "Enter": this.controller.open(this.tabs[this.selectedIndex].item.id); break; 89 | default: break; 90 | 91 | } 92 | } 93 | 94 | onInput = (event) => { 95 | console.log(`New Input: ${event.target.value}`); 96 | if (this.input !== event.target.value) { 97 | this.input = event.target.value; 98 | this.controller.search(this.input); 99 | } 100 | } 101 | 102 | /* 103 | ** View 104 | */ 105 | view(vnode) { 106 | const state = vnode.state; 107 | console.log("Rendering..."); 108 | console.log(`visible: ${state.visible}`); 109 | return ( 110 |
111 |
112 | 113 | 114 |
115 |
116 | ); 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /chrome/event-page/index.js: -------------------------------------------------------------------------------- 1 | var windowId = 0; 2 | var openTabs = []; 3 | var port = null; 4 | var options = { 5 | shouldSort: true, 6 | includeMatches: true, 7 | threshold: 0.6, 8 | location: 0, 9 | distance: 100, 10 | maxPatternLength: 32, 11 | minMatchCharLength: 1, 12 | keys: [ 13 | "title", 14 | "url" 15 | ] 16 | }; 17 | 18 | 19 | function loadTabs() { 20 | chrome.windows.getCurrent(function (window) { 21 | windowId = window.id; 22 | console.log(`Loading window #${windowId} tabs...`); 23 | chrome.tabs.query({'windowId': windowId}, function(tabs) { 24 | if (tabs.length > 0) { 25 | console.log(`Restored ${tabs.length} tabs!`); 26 | console.log(JSON.stringify(tabs)); 27 | } 28 | openTabs = tabs; 29 | }); 30 | }); 31 | } 32 | 33 | 34 | function onStartup() { 35 | console.log("Starting up..."); 36 | loadTabs(); 37 | } 38 | 39 | 40 | function onInstalled(details) { 41 | console.log(`Exentension installed. Reason: ${details.reason}`); 42 | loadTabs(); 43 | } 44 | 45 | 46 | function handleContentScriptMessage(msg) { 47 | console.log("New message received.") 48 | switch (msg.command) { 49 | 50 | case "open": 51 | chrome.tabs.update(msg.tabId, {active: true}) 52 | port.postMessage({command: "hide"}); 53 | break; 54 | case "search": 55 | if (msg.query.trim().length > 0) { 56 | var fuse = new Fuse(openTabs, options); 57 | var results = fuse.search(msg.query); 58 | port.postMessage({command: "show", "data": JSON.stringify(results)}); 59 | } 60 | else { 61 | port.postMessage({command: "show", "data": JSON.stringify(openTabs.map(function(tab){ return {item: tab}}))}); 62 | } 63 | break; 64 | 65 | default: break; 66 | } 67 | } 68 | 69 | 70 | function onTabCreated(tab) { 71 | console.log(`Tab ${tab.id} created.`); 72 | openTabs.push(tab); 73 | } 74 | 75 | 76 | function onTabAttached(tabId, attachInfo) { 77 | console.log(`Tab ${tabId} attached.`); 78 | if (attachInfo.windowId == windowId) { 79 | chrome.tabs.get(tabId, function(tab) { 80 | openTabs.splice(attachInfo.newPosition, 0, tab); 81 | }); 82 | } 83 | } 84 | 85 | 86 | function onTabMoved(tabId, moveInfo) { 87 | console.log(`Moving tab ${tabId} from ${moveInfo.fromIndex} to ${moveInfo.toIndex}.`); 88 | if (moveInfo.windowId == windowId) { 89 | var removed = openTabs.splice(moveInfo.fromIndex, 1); 90 | openTabs.splice(moveInfo.toIndex, 0, removed[0]); 91 | console.log(`Tab ${tabId} moved.`); 92 | } 93 | } 94 | 95 | 96 | function onTabUpdated(tabId, changeInfo, tab) { 97 | console.log(`Updating tab ${tabId} - windowId: ${tab.windowId}...`); 98 | if (tab.windowId == windowId) { 99 | openTabs[tab.index] = tab; 100 | console.log(`Tab ${tabId} updated.`); 101 | } 102 | } 103 | 104 | 105 | function onTabDetached(tabId, detachInfo) { 106 | console.log(`Tab ${tabId} detached.`); 107 | if (detachInfo.oldWindowId == windowId) { 108 | openTabs.splice(detachInfo.ldPosition, 1); 109 | } 110 | } 111 | 112 | 113 | function onTabRemoved(tabId, removeInfo) { 114 | console.log(`Tab ${tabId} removed.`); 115 | if (removeInfo.windowId == windowId) { 116 | chrome.tabs.get(tabId, function(tab) { 117 | let index = openTabs.indexOf(tab); 118 | if (index != -1) { 119 | openTabs.splice(index, 1); 120 | } 121 | }); 122 | } 123 | } 124 | 125 | 126 | function injectContentScriptFiles(tabID, callback) { 127 | chrome.tabs.executeScript(tabID, {file: "content-script/bin/app.js"}, function() { 128 | chrome.tabs.insertCSS(tabID, {file: "content-script/styles.css"}, function() { 129 | callback(tabID); 130 | }); 131 | }); 132 | } 133 | 134 | 135 | function connectToContentScript(tabID) { 136 | port = chrome.tabs.connect(tabID, {name: "swoop"}); 137 | port.onMessage.addListener(handleContentScriptMessage); 138 | port.onDisconnect.addListener(function() { 139 | console.log("Port disconnected."); 140 | port = null; 141 | }); 142 | 143 | /* 144 | ** Convert to common JSON format as fuzzy search results to keep 145 | ** content script's display logic simple. 146 | */ 147 | port.postMessage({command: "show", "data": JSON.stringify(openTabs.map(function(tab){ return {item: tab}}))}); 148 | } 149 | 150 | 151 | function onChromeCommand(command) { 152 | if (command == "toggle") { 153 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 154 | let activeTab = tabs[0]; 155 | 156 | /* 157 | ** Probing active tab for existing content script. 158 | */ 159 | // chrome.tabs.sendMessage(activeTab.id, "ping", function(response) { 160 | // if (response) { 161 | connectToContentScript(activeTab.id); 162 | // } else { 163 | // injectContentScriptFiles(activeTab.id, connectToContentScript); 164 | // } 165 | // }); 166 | 167 | }); 168 | } 169 | } 170 | 171 | 172 | if (chrome.runtime && chrome.runtime.onStartup) { 173 | chrome.runtime.onInstalled.addListener(onInstalled); 174 | chrome.runtime.onStartup.addListener(onStartup); 175 | chrome.runtime.onUpdateAvailable.addListener(function(details) { 176 | console.log(`New upate available: ${details.version}`); 177 | console.log(`Installing...`); 178 | chrome.runtime.reload(); 179 | }); 180 | 181 | chrome.tabs.onCreated.addListener(onTabCreated); 182 | chrome.tabs.onAttached.addListener(onTabAttached); 183 | chrome.tabs.onUpdated.addListener(onTabUpdated); 184 | chrome.tabs.onMoved.addListener(onTabMoved); 185 | chrome.tabs.onDetached.addListener(onTabDetached); 186 | chrome.tabs.onRemoved.addListener(onTabRemoved); 187 | 188 | chrome.commands.onCommand.addListener(onChromeCommand); 189 | } 190 | else { 191 | console.log("This extension requires Chrome 23 or above. Please update Chrome and retry."); 192 | } 193 | -------------------------------------------------------------------------------- /chrome/event-page/fuse.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Fuse.js v3.0.4 - Lightweight fuzzy-search (http://fusejs.io) 3 | * 4 | * Copyright (c) 2012-2017 Kirollos Risk (http://kiro.me) 5 | * All Rights Reserved. Apache Software License 2.0 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | */ 9 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Fuse",[],t):"object"==typeof exports?exports.Fuse=t():e.Fuse=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=8)}([function(e,t,n){"use strict";e.exports=function(e){return"[object Array]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var n=0;nn)return i(e,this.pattern,r);var o=this.options,a=o.location,c=o.distance,h=o.threshold,l=o.findAllMatches,u=o.minMatchCharLength;return s(e,this.pattern,this.patternAlphabet,{location:a,distance:c,threshold:h,findAllMatches:l,minMatchCharLength:u})}}]),e}();e.exports=c},function(e,t,n){"use strict";var r=n(0),o=function e(t,n,o){if(n){var i=n.indexOf("."),s=n,a=null;-1!==i&&(s=n.slice(0,i),a=n.slice(i+1));var c=t[s];if(null!==c&&void 0!==c)if(a||"string"!=typeof c&&"number"!=typeof c)if(r(c))for(var h=0,l=c.length;h0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=[],r=-1,o=-1,i=0,s=e.length;i=t&&n.push([r,o]),r=-1)}return e[i-1]&&i-r>=t&&n.push([r,i-1]),n}},function(e,t,n){"use strict";e.exports=function(e){for(var t={},n=e.length,r=0;r2&&void 0!==arguments[2]?arguments[2]:/ +/g,r=e.match(new RegExp(t.replace(n,"|"))),o=!!r,i=[];if(o)for(var s=0,a=r.length;s=j;T-=1){var E=T-1,K=n[e.charAt(E)];if(K&&(S[E]=1),I[T]=(I[T+1]<<1|1)&K,0!==F&&(I[T]|=(L[T+1]|L[T])<<1|1|L[T+1]),I[T]&A&&(w=r(t,{errors:F,currentLocation:E,expectedLocation:g,distance:h}))<=y){if(y=w,(k=E)<=g)break;j=Math.max(1,2*g-k)}}if(r(t,{errors:F+1,currentLocation:g,expectedLocation:g,distance:h})>y)break;L=I}return{isMatch:k>=0,score:0===w?.001:w,matchedIndices:o(S,p)}}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"",t=[];if(this.options.tokenize)for(var n=e.split(this.options.tokenSeparator),r=0,o=n.length;r0&&void 0!==arguments[0]?arguments[0]:[],t=arguments[1],n=this.list,r={},o=[];if("string"==typeof n[0]){for(var i=0,s=n.length;i1)throw new Error("Key weight has to be > 0 and <= 1");v=v.name}else a[v]={weight:1};this._analyze({key:v,value:this.options.getFn(l,v),record:l,index:c},{resultMap:r,results:o,tokenSearchers:e,fullSearcher:t})}return{weights:a,results:o}}},{key:"_analyze",value:function(e,t){var n=e.key,r=e.value,o=e.record,i=e.index,s=t.tokenSearchers,c=void 0===s?[]:s,h=t.fullSearcher,l=void 0===h?[]:h,u=t.resultMap,f=void 0===u?{}:u,v=t.results,d=void 0===v?[]:v;if(void 0!==r&&null!==r){var p=!1,g=-1,m=0;if("string"==typeof r){this._log("\nKey: "+(""===n?"-":n));var y=l.search(r);if(this._log('Full text: "'+r+'", score: '+y.score),this.options.tokenize){for(var k=r.split(this.options.tokenSeparator),x=[],S=0;S-1&&(O=(O+g)/2),this._log("Score average:",O);var P=!this.options.tokenize||!this.options.matchAllTokens||m>=c.length;if(this._log("\nCheck Matches: "+P),(p||y.isMatch)&&P){var j=f[i];j?j.output.push({key:n,score:O,matchedIndices:y.matchedIndices}):(f[i]={item:o,output:[{key:n,score:O,matchedIndices:y.matchedIndices}]},d.push(f[i]))}}else if(a(r))for(var z=0,I=r.length;z", 22 | "license": "MIT", 23 | "dependencies": { 24 | "babel-core": "^6.26.0", 25 | "babel-loader": "^7.1.4", 26 | "babel-plugin-transform-react-jsx": "^6.24.1", 27 | "babel-preset-es2015": "^6.24.1" 28 | }, 29 | "scripts": { 30 | "name": "my-project", 31 | "scripts": { 32 | "start": "webpack -d --watch", 33 | "build": "webpack -p", 34 | } 35 | } 36 | } 37 | 38 | yarn manifest: 39 | No manifest 40 | 41 | Lockfile: 42 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 43 | # yarn lockfile v1 44 | 45 | 46 | ansi-regex@^2.0.0: 47 | version "2.1.1" 48 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 49 | 50 | ansi-styles@^2.2.1: 51 | version "2.2.1" 52 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 53 | 54 | babel-code-frame@^6.26.0: 55 | version "6.26.0" 56 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 57 | dependencies: 58 | chalk "^1.1.3" 59 | esutils "^2.0.2" 60 | js-tokens "^3.0.2" 61 | 62 | babel-core@^6.26.0: 63 | version "6.26.0" 64 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" 65 | dependencies: 66 | babel-code-frame "^6.26.0" 67 | babel-generator "^6.26.0" 68 | babel-helpers "^6.24.1" 69 | babel-messages "^6.23.0" 70 | babel-register "^6.26.0" 71 | babel-runtime "^6.26.0" 72 | babel-template "^6.26.0" 73 | babel-traverse "^6.26.0" 74 | babel-types "^6.26.0" 75 | babylon "^6.18.0" 76 | convert-source-map "^1.5.0" 77 | debug "^2.6.8" 78 | json5 "^0.5.1" 79 | lodash "^4.17.4" 80 | minimatch "^3.0.4" 81 | path-is-absolute "^1.0.1" 82 | private "^0.1.7" 83 | slash "^1.0.0" 84 | source-map "^0.5.6" 85 | 86 | babel-generator@^6.26.0: 87 | version "6.26.1" 88 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" 89 | dependencies: 90 | babel-messages "^6.23.0" 91 | babel-runtime "^6.26.0" 92 | babel-types "^6.26.0" 93 | detect-indent "^4.0.0" 94 | jsesc "^1.3.0" 95 | lodash "^4.17.4" 96 | source-map "^0.5.7" 97 | trim-right "^1.0.1" 98 | 99 | babel-helper-builder-react-jsx@^6.24.1: 100 | version "6.26.0" 101 | resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" 102 | dependencies: 103 | babel-runtime "^6.26.0" 104 | babel-types "^6.26.0" 105 | esutils "^2.0.2" 106 | 107 | babel-helper-call-delegate@^6.24.1: 108 | version "6.24.1" 109 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 110 | dependencies: 111 | babel-helper-hoist-variables "^6.24.1" 112 | babel-runtime "^6.22.0" 113 | babel-traverse "^6.24.1" 114 | babel-types "^6.24.1" 115 | 116 | babel-helper-define-map@^6.24.1: 117 | version "6.26.0" 118 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" 119 | dependencies: 120 | babel-helper-function-name "^6.24.1" 121 | babel-runtime "^6.26.0" 122 | babel-types "^6.26.0" 123 | lodash "^4.17.4" 124 | 125 | babel-helper-function-name@^6.24.1: 126 | version "6.24.1" 127 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 128 | dependencies: 129 | babel-helper-get-function-arity "^6.24.1" 130 | babel-runtime "^6.22.0" 131 | babel-template "^6.24.1" 132 | babel-traverse "^6.24.1" 133 | babel-types "^6.24.1" 134 | 135 | babel-helper-get-function-arity@^6.24.1: 136 | version "6.24.1" 137 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 138 | dependencies: 139 | babel-runtime "^6.22.0" 140 | babel-types "^6.24.1" 141 | 142 | babel-helper-hoist-variables@^6.24.1: 143 | version "6.24.1" 144 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 145 | dependencies: 146 | babel-runtime "^6.22.0" 147 | babel-types "^6.24.1" 148 | 149 | babel-helper-optimise-call-expression@^6.24.1: 150 | version "6.24.1" 151 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 152 | dependencies: 153 | babel-runtime "^6.22.0" 154 | babel-types "^6.24.1" 155 | 156 | babel-helper-regex@^6.24.1: 157 | version "6.26.0" 158 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" 159 | dependencies: 160 | babel-runtime "^6.26.0" 161 | babel-types "^6.26.0" 162 | lodash "^4.17.4" 163 | 164 | babel-helper-replace-supers@^6.24.1: 165 | version "6.24.1" 166 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 167 | dependencies: 168 | babel-helper-optimise-call-expression "^6.24.1" 169 | babel-messages "^6.23.0" 170 | babel-runtime "^6.22.0" 171 | babel-template "^6.24.1" 172 | babel-traverse "^6.24.1" 173 | babel-types "^6.24.1" 174 | 175 | babel-helpers@^6.24.1: 176 | version "6.24.1" 177 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 178 | dependencies: 179 | babel-runtime "^6.22.0" 180 | babel-template "^6.24.1" 181 | 182 | babel-loader@^7.1.4: 183 | version "7.1.4" 184 | resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015" 185 | dependencies: 186 | find-cache-dir "^1.0.0" 187 | loader-utils "^1.0.2" 188 | mkdirp "^0.5.1" 189 | 190 | babel-messages@^6.23.0: 191 | version "6.23.0" 192 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 193 | dependencies: 194 | babel-runtime "^6.22.0" 195 | 196 | babel-plugin-check-es2015-constants@^6.22.0: 197 | version "6.22.0" 198 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 199 | dependencies: 200 | babel-runtime "^6.22.0" 201 | 202 | babel-plugin-syntax-jsx@^6.8.0: 203 | version "6.18.0" 204 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" 205 | 206 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 207 | version "6.22.0" 208 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 209 | dependencies: 210 | babel-runtime "^6.22.0" 211 | 212 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 213 | version "6.22.0" 214 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 215 | dependencies: 216 | babel-runtime "^6.22.0" 217 | 218 | babel-plugin-transform-es2015-block-scoping@^6.24.1: 219 | version "6.26.0" 220 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" 221 | dependencies: 222 | babel-runtime "^6.26.0" 223 | babel-template "^6.26.0" 224 | babel-traverse "^6.26.0" 225 | babel-types "^6.26.0" 226 | lodash "^4.17.4" 227 | 228 | babel-plugin-transform-es2015-classes@^6.24.1: 229 | version "6.24.1" 230 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 231 | dependencies: 232 | babel-helper-define-map "^6.24.1" 233 | babel-helper-function-name "^6.24.1" 234 | babel-helper-optimise-call-expression "^6.24.1" 235 | babel-helper-replace-supers "^6.24.1" 236 | babel-messages "^6.23.0" 237 | babel-runtime "^6.22.0" 238 | babel-template "^6.24.1" 239 | babel-traverse "^6.24.1" 240 | babel-types "^6.24.1" 241 | 242 | babel-plugin-transform-es2015-computed-properties@^6.24.1: 243 | version "6.24.1" 244 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 245 | dependencies: 246 | babel-runtime "^6.22.0" 247 | babel-template "^6.24.1" 248 | 249 | babel-plugin-transform-es2015-destructuring@^6.22.0: 250 | version "6.23.0" 251 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 252 | dependencies: 253 | babel-runtime "^6.22.0" 254 | 255 | babel-plugin-transform-es2015-duplicate-keys@^6.24.1: 256 | version "6.24.1" 257 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 258 | dependencies: 259 | babel-runtime "^6.22.0" 260 | babel-types "^6.24.1" 261 | 262 | babel-plugin-transform-es2015-for-of@^6.22.0: 263 | version "6.23.0" 264 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 265 | dependencies: 266 | babel-runtime "^6.22.0" 267 | 268 | babel-plugin-transform-es2015-function-name@^6.24.1: 269 | version "6.24.1" 270 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 271 | dependencies: 272 | babel-helper-function-name "^6.24.1" 273 | babel-runtime "^6.22.0" 274 | babel-types "^6.24.1" 275 | 276 | babel-plugin-transform-es2015-literals@^6.22.0: 277 | version "6.22.0" 278 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 279 | dependencies: 280 | babel-runtime "^6.22.0" 281 | 282 | babel-plugin-transform-es2015-modules-amd@^6.24.1: 283 | version "6.24.1" 284 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 285 | dependencies: 286 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 287 | babel-runtime "^6.22.0" 288 | babel-template "^6.24.1" 289 | 290 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 291 | version "6.26.0" 292 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" 293 | dependencies: 294 | babel-plugin-transform-strict-mode "^6.24.1" 295 | babel-runtime "^6.26.0" 296 | babel-template "^6.26.0" 297 | babel-types "^6.26.0" 298 | 299 | babel-plugin-transform-es2015-modules-systemjs@^6.24.1: 300 | version "6.24.1" 301 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 302 | dependencies: 303 | babel-helper-hoist-variables "^6.24.1" 304 | babel-runtime "^6.22.0" 305 | babel-template "^6.24.1" 306 | 307 | babel-plugin-transform-es2015-modules-umd@^6.24.1: 308 | version "6.24.1" 309 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 310 | dependencies: 311 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 312 | babel-runtime "^6.22.0" 313 | babel-template "^6.24.1" 314 | 315 | babel-plugin-transform-es2015-object-super@^6.24.1: 316 | version "6.24.1" 317 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 318 | dependencies: 319 | babel-helper-replace-supers "^6.24.1" 320 | babel-runtime "^6.22.0" 321 | 322 | babel-plugin-transform-es2015-parameters@^6.24.1: 323 | version "6.24.1" 324 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 325 | dependencies: 326 | babel-helper-call-delegate "^6.24.1" 327 | babel-helper-get-function-arity "^6.24.1" 328 | babel-runtime "^6.22.0" 329 | babel-template "^6.24.1" 330 | babel-traverse "^6.24.1" 331 | babel-types "^6.24.1" 332 | 333 | babel-plugin-transform-es2015-shorthand-properties@^6.24.1: 334 | version "6.24.1" 335 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 336 | dependencies: 337 | babel-runtime "^6.22.0" 338 | babel-types "^6.24.1" 339 | 340 | babel-plugin-transform-es2015-spread@^6.22.0: 341 | version "6.22.0" 342 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 343 | dependencies: 344 | babel-runtime "^6.22.0" 345 | 346 | babel-plugin-transform-es2015-sticky-regex@^6.24.1: 347 | version "6.24.1" 348 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 349 | dependencies: 350 | babel-helper-regex "^6.24.1" 351 | babel-runtime "^6.22.0" 352 | babel-types "^6.24.1" 353 | 354 | babel-plugin-transform-es2015-template-literals@^6.22.0: 355 | version "6.22.0" 356 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 357 | dependencies: 358 | babel-runtime "^6.22.0" 359 | 360 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0: 361 | version "6.23.0" 362 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 363 | dependencies: 364 | babel-runtime "^6.22.0" 365 | 366 | babel-plugin-transform-es2015-unicode-regex@^6.24.1: 367 | version "6.24.1" 368 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 369 | dependencies: 370 | babel-helper-regex "^6.24.1" 371 | babel-runtime "^6.22.0" 372 | regexpu-core "^2.0.0" 373 | 374 | babel-plugin-transform-react-jsx@^6.24.1: 375 | version "6.24.1" 376 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" 377 | dependencies: 378 | babel-helper-builder-react-jsx "^6.24.1" 379 | babel-plugin-syntax-jsx "^6.8.0" 380 | babel-runtime "^6.22.0" 381 | 382 | babel-plugin-transform-regenerator@^6.24.1: 383 | version "6.26.0" 384 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" 385 | dependencies: 386 | regenerator-transform "^0.10.0" 387 | 388 | babel-plugin-transform-strict-mode@^6.24.1: 389 | version "6.24.1" 390 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 391 | dependencies: 392 | babel-runtime "^6.22.0" 393 | babel-types "^6.24.1" 394 | 395 | babel-preset-es2015@^6.24.1: 396 | version "6.24.1" 397 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" 398 | dependencies: 399 | babel-plugin-check-es2015-constants "^6.22.0" 400 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 401 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 402 | babel-plugin-transform-es2015-block-scoping "^6.24.1" 403 | babel-plugin-transform-es2015-classes "^6.24.1" 404 | babel-plugin-transform-es2015-computed-properties "^6.24.1" 405 | babel-plugin-transform-es2015-destructuring "^6.22.0" 406 | babel-plugin-transform-es2015-duplicate-keys "^6.24.1" 407 | babel-plugin-transform-es2015-for-of "^6.22.0" 408 | babel-plugin-transform-es2015-function-name "^6.24.1" 409 | babel-plugin-transform-es2015-literals "^6.22.0" 410 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 411 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 412 | babel-plugin-transform-es2015-modules-systemjs "^6.24.1" 413 | babel-plugin-transform-es2015-modules-umd "^6.24.1" 414 | babel-plugin-transform-es2015-object-super "^6.24.1" 415 | babel-plugin-transform-es2015-parameters "^6.24.1" 416 | babel-plugin-transform-es2015-shorthand-properties "^6.24.1" 417 | babel-plugin-transform-es2015-spread "^6.22.0" 418 | babel-plugin-transform-es2015-sticky-regex "^6.24.1" 419 | babel-plugin-transform-es2015-template-literals "^6.22.0" 420 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0" 421 | babel-plugin-transform-es2015-unicode-regex "^6.24.1" 422 | babel-plugin-transform-regenerator "^6.24.1" 423 | 424 | babel-register@^6.26.0: 425 | version "6.26.0" 426 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 427 | dependencies: 428 | babel-core "^6.26.0" 429 | babel-runtime "^6.26.0" 430 | core-js "^2.5.0" 431 | home-or-tmp "^2.0.0" 432 | lodash "^4.17.4" 433 | mkdirp "^0.5.1" 434 | source-map-support "^0.4.15" 435 | 436 | babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: 437 | version "6.26.0" 438 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 439 | dependencies: 440 | core-js "^2.4.0" 441 | regenerator-runtime "^0.11.0" 442 | 443 | babel-template@^6.24.1, babel-template@^6.26.0: 444 | version "6.26.0" 445 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 446 | dependencies: 447 | babel-runtime "^6.26.0" 448 | babel-traverse "^6.26.0" 449 | babel-types "^6.26.0" 450 | babylon "^6.18.0" 451 | lodash "^4.17.4" 452 | 453 | babel-traverse@^6.24.1, babel-traverse@^6.26.0: 454 | version "6.26.0" 455 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 456 | dependencies: 457 | babel-code-frame "^6.26.0" 458 | babel-messages "^6.23.0" 459 | babel-runtime "^6.26.0" 460 | babel-types "^6.26.0" 461 | babylon "^6.18.0" 462 | debug "^2.6.8" 463 | globals "^9.18.0" 464 | invariant "^2.2.2" 465 | lodash "^4.17.4" 466 | 467 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: 468 | version "6.26.0" 469 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 470 | dependencies: 471 | babel-runtime "^6.26.0" 472 | esutils "^2.0.2" 473 | lodash "^4.17.4" 474 | to-fast-properties "^1.0.3" 475 | 476 | babylon@^6.18.0: 477 | version "6.18.0" 478 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 479 | 480 | balanced-match@^1.0.0: 481 | version "1.0.0" 482 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 483 | 484 | big.js@^3.1.3: 485 | version "3.2.0" 486 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" 487 | 488 | brace-expansion@^1.1.7: 489 | version "1.1.11" 490 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 491 | dependencies: 492 | balanced-match "^1.0.0" 493 | concat-map "0.0.1" 494 | 495 | chalk@^1.1.3: 496 | version "1.1.3" 497 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 498 | dependencies: 499 | ansi-styles "^2.2.1" 500 | escape-string-regexp "^1.0.2" 501 | has-ansi "^2.0.0" 502 | strip-ansi "^3.0.0" 503 | supports-color "^2.0.0" 504 | 505 | commondir@^1.0.1: 506 | version "1.0.1" 507 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 508 | 509 | concat-map@0.0.1: 510 | version "0.0.1" 511 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 512 | 513 | convert-source-map@^1.5.0: 514 | version "1.5.1" 515 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" 516 | 517 | core-js@^2.4.0, core-js@^2.5.0: 518 | version "2.5.4" 519 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.4.tgz#f2c8bf181f2a80b92f360121429ce63a2f0aeae0" 520 | 521 | debug@^2.6.8: 522 | version "2.6.9" 523 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 524 | dependencies: 525 | ms "2.0.0" 526 | 527 | detect-indent@^4.0.0: 528 | version "4.0.0" 529 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 530 | dependencies: 531 | repeating "^2.0.0" 532 | 533 | emojis-list@^2.0.0: 534 | version "2.1.0" 535 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 536 | 537 | escape-string-regexp@^1.0.2: 538 | version "1.0.5" 539 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 540 | 541 | esutils@^2.0.2: 542 | version "2.0.2" 543 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 544 | 545 | find-cache-dir@^1.0.0: 546 | version "1.0.0" 547 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" 548 | dependencies: 549 | commondir "^1.0.1" 550 | make-dir "^1.0.0" 551 | pkg-dir "^2.0.0" 552 | 553 | find-up@^2.1.0: 554 | version "2.1.0" 555 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 556 | dependencies: 557 | locate-path "^2.0.0" 558 | 559 | globals@^9.18.0: 560 | version "9.18.0" 561 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 562 | 563 | has-ansi@^2.0.0: 564 | version "2.0.0" 565 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 566 | dependencies: 567 | ansi-regex "^2.0.0" 568 | 569 | home-or-tmp@^2.0.0: 570 | version "2.0.0" 571 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 572 | dependencies: 573 | os-homedir "^1.0.0" 574 | os-tmpdir "^1.0.1" 575 | 576 | invariant@^2.2.2: 577 | version "2.2.4" 578 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 579 | dependencies: 580 | loose-envify "^1.0.0" 581 | 582 | is-finite@^1.0.0: 583 | version "1.0.2" 584 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 585 | dependencies: 586 | number-is-nan "^1.0.0" 587 | 588 | js-tokens@^3.0.0, js-tokens@^3.0.2: 589 | version "3.0.2" 590 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 591 | 592 | jsesc@^1.3.0: 593 | version "1.3.0" 594 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 595 | 596 | jsesc@~0.5.0: 597 | version "0.5.0" 598 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 599 | 600 | json5@^0.5.0, json5@^0.5.1: 601 | version "0.5.1" 602 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 603 | 604 | loader-utils@^1.0.2: 605 | version "1.1.0" 606 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 607 | dependencies: 608 | big.js "^3.1.3" 609 | emojis-list "^2.0.0" 610 | json5 "^0.5.0" 611 | 612 | locate-path@^2.0.0: 613 | version "2.0.0" 614 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 615 | dependencies: 616 | p-locate "^2.0.0" 617 | path-exists "^3.0.0" 618 | 619 | lodash@^4.17.4: 620 | version "4.17.5" 621 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" 622 | 623 | loose-envify@^1.0.0: 624 | version "1.3.1" 625 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 626 | dependencies: 627 | js-tokens "^3.0.0" 628 | 629 | make-dir@^1.0.0: 630 | version "1.2.0" 631 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" 632 | dependencies: 633 | pify "^3.0.0" 634 | 635 | minimatch@^3.0.4: 636 | version "3.0.4" 637 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 638 | dependencies: 639 | brace-expansion "^1.1.7" 640 | 641 | minimist@0.0.8: 642 | version "0.0.8" 643 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 644 | 645 | mkdirp@^0.5.1: 646 | version "0.5.1" 647 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 648 | dependencies: 649 | minimist "0.0.8" 650 | 651 | ms@2.0.0: 652 | version "2.0.0" 653 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 654 | 655 | number-is-nan@^1.0.0: 656 | version "1.0.1" 657 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 658 | 659 | os-homedir@^1.0.0: 660 | version "1.0.2" 661 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 662 | 663 | os-tmpdir@^1.0.1: 664 | version "1.0.2" 665 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 666 | 667 | p-limit@^1.1.0: 668 | version "1.2.0" 669 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" 670 | dependencies: 671 | p-try "^1.0.0" 672 | 673 | p-locate@^2.0.0: 674 | version "2.0.0" 675 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 676 | dependencies: 677 | p-limit "^1.1.0" 678 | 679 | p-try@^1.0.0: 680 | version "1.0.0" 681 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 682 | 683 | path-exists@^3.0.0: 684 | version "3.0.0" 685 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 686 | 687 | path-is-absolute@^1.0.1: 688 | version "1.0.1" 689 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 690 | 691 | pify@^3.0.0: 692 | version "3.0.0" 693 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 694 | 695 | pkg-dir@^2.0.0: 696 | version "2.0.0" 697 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 698 | dependencies: 699 | find-up "^2.1.0" 700 | 701 | private@^0.1.6, private@^0.1.7: 702 | version "0.1.8" 703 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 704 | 705 | regenerate@^1.2.1: 706 | version "1.3.3" 707 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" 708 | 709 | regenerator-runtime@^0.11.0: 710 | version "0.11.1" 711 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 712 | 713 | regenerator-transform@^0.10.0: 714 | version "0.10.1" 715 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" 716 | dependencies: 717 | babel-runtime "^6.18.0" 718 | babel-types "^6.19.0" 719 | private "^0.1.6" 720 | 721 | regexpu-core@^2.0.0: 722 | version "2.0.0" 723 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 724 | dependencies: 725 | regenerate "^1.2.1" 726 | regjsgen "^0.2.0" 727 | regjsparser "^0.1.4" 728 | 729 | regjsgen@^0.2.0: 730 | version "0.2.0" 731 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 732 | 733 | regjsparser@^0.1.4: 734 | version "0.1.5" 735 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 736 | dependencies: 737 | jsesc "~0.5.0" 738 | 739 | repeating@^2.0.0: 740 | version "2.0.1" 741 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 742 | dependencies: 743 | is-finite "^1.0.0" 744 | 745 | slash@^1.0.0: 746 | version "1.0.0" 747 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 748 | 749 | source-map-support@^0.4.15: 750 | version "0.4.18" 751 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 752 | dependencies: 753 | source-map "^0.5.6" 754 | 755 | source-map@^0.5.6, source-map@^0.5.7: 756 | version "0.5.7" 757 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 758 | 759 | strip-ansi@^3.0.0: 760 | version "3.0.1" 761 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 762 | dependencies: 763 | ansi-regex "^2.0.0" 764 | 765 | supports-color@^2.0.0: 766 | version "2.0.0" 767 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 768 | 769 | to-fast-properties@^1.0.3: 770 | version "1.0.3" 771 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 772 | 773 | trim-right@^1.0.1: 774 | version "1.0.1" 775 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 776 | 777 | Trace: 778 | SyntaxError: /Users/nicolas/Developer/swoop/package.json: Unexpected token } in JSON at position 440 779 | at JSON.parse () 780 | at /usr/local/lib/node_modules/yarn/lib/cli.js:797:57 781 | at Generator.next () 782 | at step (/usr/local/lib/node_modules/yarn/lib/cli.js:92:30) 783 | at /usr/local/lib/node_modules/yarn/lib/cli.js:103:13 784 | at 785 | --------------------------------------------------------------------------------