UNPKG

7.72 kBJavaScriptView Raw
1#!/usr/bin/env node
2;
3var arg, args, chromix, commandArgs, commandName, filterTabs, fn, fn1, focusWindow, getMatchingTabs, getQueryFlags, i, j, len, len1, optimist, ref, url, utils,
4 slice = [].slice;
5
6utils = require("./utils");
7
8utils.extend(global, utils);
9
10optimist = require("optimist");
11
12args = optimist.usage("Usage: $0 [--sock=PATH]").alias("h", "help")["default"]("sock", config.sock).argv;
13
14if (args.help) {
15 optimist.showHelp();
16 process.exit(0);
17}
18
19chromix = require("./chromix-too")(args.sock).chromix;
20
21ref = 2 < process.argv.length ? [process.argv[2], process.argv.slice(3)] : ["ping", []], commandName = ref[0], commandArgs = ref[1];
22
23getQueryFlags = function(commandArgs) {
24 var arg, flag, i, len, queryFlags, ref1, validQueryFlags;
25 validQueryFlags = {};
26 ref1 = "active pinned audible muted highlighted discarded autoDiscardable currentWindow lastFocusedWindow".split(" ");
27 for (i = 0, len = ref1.length; i < len; i++) {
28 flag = ref1[i];
29 validQueryFlags[flag] = true;
30 }
31 queryFlags = {};
32 commandArgs = (function() {
33 var j, len1, ref2, ref3, results;
34 results = [];
35 for (j = 0, len1 = commandArgs.length; j < len1; j++) {
36 arg = commandArgs[j];
37 if (arg in validQueryFlags) {
38 queryFlags[arg] = true;
39 continue;
40 } else if (((ref2 = arg[0]) === "-" || ref2 === "!") && arg.slice(1) in validQueryFlags) {
41 queryFlags[arg.slice(1)] = false;
42 continue;
43 } else if (((ref3 = arg[0]) === "+") && arg.slice(1) in validQueryFlags) {
44 queryFlags[arg.slice(1)] = true;
45 continue;
46 } else {
47 results.push(arg);
48 }
49 }
50 return results;
51 })();
52 return [commandArgs, queryFlags];
53};
54
55filterTabs = (function() {
56 var integerRegex;
57 integerRegex = /^\d+$/;
58 return function(commandArgs, tabs) {
59 var i, len, results, tab;
60 results = [];
61 for (i = 0, len = tabs.length; i < len; i++) {
62 tab = tabs[i];
63 if (!(function() {
64 var arg, j, len1;
65 for (j = 0, len1 = commandArgs.length; j < len1; j++) {
66 arg = commandArgs[j];
67 if (integerRegex.test(arg) && tab.id === parseInt(arg)) {
68 continue;
69 } else if (integerRegex.test(arg)) {
70 return false;
71 } else if (tab.url.indexOf(arg) === -1 && tab.title.indexOf(arg) === -1) {
72 return false;
73 }
74 }
75 return true;
76 })()) {
77 continue;
78 }
79 results.push(tab);
80 }
81 return results;
82 };
83})();
84
85getMatchingTabs = function(commandArgs, callback) {
86 var queryFlags, ref1;
87 ref1 = getQueryFlags(commandArgs), commandArgs = ref1[0], queryFlags = ref1[1];
88 return chromix("chrome.tabs.query", {}, queryFlags, function(tabs) {
89 tabs = filterTabs(commandArgs, tabs);
90 if (tabs.length === 0) {
91 process.exit(1);
92 }
93 return callback(tabs);
94 });
95};
96
97focusWindow = function(windowId) {
98 return chromix("chrome.windows.update", {}, windowId, {
99 focused: true
100 }, function() {});
101};
102
103switch (commandName) {
104 case "ls":
105 case "list":
106 case "tabs":
107 getMatchingTabs(commandArgs, function(tabs) {
108 var i, len, results, tab;
109 results = [];
110 for (i = 0, len = tabs.length; i < len; i++) {
111 tab = tabs[i];
112 results.push(console.log(tab.id + " " + tab.url + " " + tab.title));
113 }
114 return results;
115 });
116 break;
117 case "tid":
118 getMatchingTabs(commandArgs, function(tabs) {
119 var i, len, results, tab;
120 results = [];
121 for (i = 0, len = tabs.length; i < len; i++) {
122 tab = tabs[i];
123 results.push(console.log("" + tab.id));
124 }
125 return results;
126 });
127 break;
128 case "focus":
129 case "activate":
130 getMatchingTabs(commandArgs, function(tabs) {
131 var i, len, results, tab;
132 results = [];
133 for (i = 0, len = tabs.length; i < len; i++) {
134 tab = tabs[i];
135 chromix("chrome.tabs.update", {}, tab.id, {
136 selected: true
137 });
138 results.push(focusWindow(tab.windowId));
139 }
140 return results;
141 });
142 break;
143 case "select":
144 getMatchingTabs(commandArgs, function(tabs) {
145 var i, len, results, tab;
146 results = [];
147 for (i = 0, len = tabs.length; i < len; i++) {
148 tab = tabs[i];
149 results.push(chromix("chrome.tabs.update", {}, tab.id, {
150 selected: true
151 }));
152 }
153 return results;
154 });
155 break;
156 case "reload":
157 getMatchingTabs(commandArgs, function(tabs) {
158 var i, len, results, tab;
159 results = [];
160 for (i = 0, len = tabs.length; i < len; i++) {
161 tab = tabs[i];
162 results.push(chromix("chrome.tabs.reload", {}, tab.id, {}));
163 }
164 return results;
165 });
166 break;
167 case "rm":
168 case "remove":
169 case "close":
170 getMatchingTabs(commandArgs, function(tabs) {
171 var i, len, results, tab;
172 results = [];
173 for (i = 0, len = tabs.length; i < len; i++) {
174 tab = tabs[i];
175 results.push(chromix("chrome.tabs.remove", {}, tab.id));
176 }
177 return results;
178 });
179 break;
180 case "open":
181 case "create":
182 fn = function(arg) {
183 return chromix("chrome.tabs.create", {}, {
184 url: arg
185 }, function(tab) {
186 focusWindow(tab.windowId);
187 return console.log(tab.id + " " + tab.url);
188 });
189 };
190 for (i = 0, len = commandArgs.length; i < len; i++) {
191 arg = commandArgs[i];
192 fn(arg);
193 }
194 break;
195 case "ping":
196 chromix("ping", {}, function(response) {
197 if (response === "ok") {
198 return process.exit(0);
199 } else {
200 return process.exit(1);
201 }
202 });
203 break;
204 case "file":
205 fn1 = function(url) {
206 return getMatchingTabs([], function(tabs) {
207 var k, len2, results, t, tab;
208 tabs = (function() {
209 var k, len2, results;
210 results = [];
211 for (k = 0, len2 = tabs.length; k < len2; k++) {
212 t = tabs[k];
213 if (t.url.indexOf(url) === 0) {
214 results.push(t);
215 }
216 }
217 return results;
218 })();
219 if (tabs.length === 0) {
220 return chromix("chrome.tabs.create", {}, {
221 url: url
222 }, function(tab) {
223 focusWindow(tab.windowId);
224 return console.log(tab.id + " " + tab.url);
225 });
226 } else {
227 results = [];
228 for (k = 0, len2 = tabs.length; k < len2; k++) {
229 tab = tabs[k];
230 results.push((function(tab) {
231 return chromix("chrome.tabs.update", {}, tab.id, {
232 selected: true
233 }, function() {
234 return chromix("chrome.tabs.reload", {}, tab.id, {}, function() {
235 return focusWindow(tab.windowId);
236 });
237 });
238 })(tab));
239 }
240 return results;
241 }
242 });
243 };
244 for (j = 0, len1 = commandArgs.length; j < len1; j++) {
245 arg = commandArgs[j];
246 url = arg.indexOf("file://") === 0 ? arg : "file://" + (require("path").resolve(arg));
247 fn1(url);
248 }
249 break;
250 case "raw":
251 case "josn":
252 args = (function() {
253 var k, len2, ref1, results;
254 ref1 = commandArgs.slice(1);
255 results = [];
256 for (k = 0, len2 = ref1.length; k < len2; k++) {
257 arg = ref1[k];
258 try {
259 results.push(JSON.parse(arg));
260 } catch (_error) {
261 results.push(arg);
262 }
263 }
264 return results;
265 })();
266 chromix.apply(null, [commandArgs[0], {}].concat(slice.call(args), [function(response) {
267 return console.log(JSON.stringify(response));
268 }]));
269 break;
270 default:
271 console.error("error: unknown command: " + commandName);
272 process.exit(2);
273}