├── .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 |
11 |
12 |
13 |
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 | | Chrome |
49 | Safari |
50 |
51 |
52 |
53 |
54 | - Open
chrome://extensions
55 | - Check the Developer mode checkbox
56 |
- Click on the Load unpacked extension button
57 |
- Select the folder
swoop/chrome
58 |
59 | |
60 |
61 | Coming soon
62 | |
63 |
64 |
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 |
--------------------------------------------------------------------------------