web-ext 7.1.1 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/lib/cmd/build.js +18 -36
- package/lib/cmd/build.js.map +1 -1
- package/lib/cmd/docs.js +1 -0
- package/lib/cmd/docs.js.map +1 -1
- package/lib/cmd/index.js +3 -5
- package/lib/cmd/index.js.map +1 -1
- package/lib/cmd/lint.js +28 -17
- package/lib/cmd/lint.js.map +1 -1
- package/lib/cmd/run.js +19 -23
- package/lib/cmd/run.js.map +1 -1
- package/lib/cmd/sign.js +80 -47
- package/lib/cmd/sign.js.map +1 -1
- package/lib/config.js +18 -29
- package/lib/config.js.map +1 -1
- package/lib/errors.js +8 -18
- package/lib/errors.js.map +1 -1
- package/lib/extension-runners/base.js +2 -0
- package/lib/extension-runners/base.js.map +1 -1
- package/lib/extension-runners/chromium.js +36 -62
- package/lib/extension-runners/chromium.js.map +1 -1
- package/lib/extension-runners/firefox-android.js +65 -102
- package/lib/extension-runners/firefox-android.js.map +1 -1
- package/lib/extension-runners/firefox-desktop.js +30 -42
- package/lib/extension-runners/firefox-desktop.js.map +1 -1
- package/lib/extension-runners/index.js +33 -46
- package/lib/extension-runners/index.js.map +1 -1
- package/lib/firefox/index.js +75 -47
- package/lib/firefox/index.js.map +1 -1
- package/lib/firefox/package-identifiers.js +2 -0
- package/lib/firefox/package-identifiers.js.map +1 -1
- package/lib/firefox/preferences.js +14 -15
- package/lib/firefox/preferences.js.map +1 -1
- package/lib/firefox/rdp-client.js +16 -64
- package/lib/firefox/rdp-client.js.map +1 -1
- package/lib/firefox/remote.js +15 -30
- package/lib/firefox/remote.js.map +1 -1
- package/lib/main.js +4 -2
- package/lib/main.js.map +1 -1
- package/lib/program.js +75 -77
- package/lib/program.js.map +1 -1
- package/lib/util/adb.js +33 -63
- package/lib/util/adb.js.map +1 -1
- package/lib/util/artifacts.js +3 -5
- package/lib/util/artifacts.js.map +1 -1
- package/lib/util/desktop-notifier.js +1 -0
- package/lib/util/desktop-notifier.js.map +1 -1
- package/lib/util/file-exists.js +1 -2
- package/lib/util/file-exists.js.map +1 -1
- package/lib/util/file-filter.js +17 -19
- package/lib/util/file-filter.js.map +1 -1
- package/lib/util/is-directory.js +2 -1
- package/lib/util/is-directory.js.map +1 -1
- package/lib/util/logger.js +7 -12
- package/lib/util/logger.js.map +1 -1
- package/lib/util/manifest.js +6 -13
- package/lib/util/manifest.js.map +1 -1
- package/lib/util/promisify.js +7 -3
- package/lib/util/promisify.js.map +1 -1
- package/lib/util/stdin.js +2 -0
- package/lib/util/stdin.js.map +1 -1
- package/lib/util/submit-addon.js +288 -0
- package/lib/util/submit-addon.js.map +1 -0
- package/lib/util/temp-dir.js +8 -18
- package/lib/util/temp-dir.js.map +1 -1
- package/lib/util/updates.js +1 -1
- package/lib/util/updates.js.map +1 -1
- package/lib/watcher.js +14 -9
- package/lib/watcher.js.map +1 -1
- package/package.json +19 -18
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
import readline from 'readline';
|
|
2
4
|
import { WebExtError } from '../errors.js';
|
|
3
5
|
import { showDesktopNotification as defaultDesktopNotifications } from '../util/desktop-notifier.js';
|
|
@@ -15,7 +17,6 @@ export async function createExtensionRunner(config) {
|
|
|
15
17
|
} = await import('./firefox-desktop.js');
|
|
16
18
|
return new FirefoxDesktopExtensionRunner(config.params);
|
|
17
19
|
}
|
|
18
|
-
|
|
19
20
|
case 'firefox-android':
|
|
20
21
|
{
|
|
21
22
|
const {
|
|
@@ -23,7 +24,6 @@ export async function createExtensionRunner(config) {
|
|
|
23
24
|
} = await import('./firefox-android.js');
|
|
24
25
|
return new FirefoxAndroidExtensionRunner(config.params);
|
|
25
26
|
}
|
|
26
|
-
|
|
27
27
|
case 'chromium':
|
|
28
28
|
{
|
|
29
29
|
const {
|
|
@@ -31,46 +31,43 @@ export async function createExtensionRunner(config) {
|
|
|
31
31
|
} = await import('./chromium.js');
|
|
32
32
|
return new ChromiumExtensionRunner(config.params);
|
|
33
33
|
}
|
|
34
|
-
|
|
35
34
|
default:
|
|
36
35
|
throw new WebExtError(`Unknown target: "${config.target}"`);
|
|
37
36
|
}
|
|
38
37
|
}
|
|
38
|
+
|
|
39
39
|
/**
|
|
40
40
|
* Implements an IExtensionRunner which allow the caller to
|
|
41
41
|
* manage multiple extension runners at the same time (e.g. by running
|
|
42
42
|
* a Firefox Desktop instance alongside to a Firefox for Android instance).
|
|
43
43
|
*/
|
|
44
|
-
|
|
45
44
|
export class MultiExtensionRunner {
|
|
46
45
|
constructor(params) {
|
|
47
46
|
this.extensionRunners = params.runners;
|
|
48
47
|
this.desktopNotifications = params.desktopNotifications;
|
|
49
|
-
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Method exported from the IExtensionRunner interface.
|
|
50
51
|
|
|
51
52
|
/**
|
|
52
53
|
* Returns the runner name.
|
|
53
54
|
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
55
|
getName() {
|
|
57
56
|
return 'Multi Extension Runner';
|
|
58
57
|
}
|
|
58
|
+
|
|
59
59
|
/**
|
|
60
60
|
* Call the `run` method on all the managed extension runners,
|
|
61
61
|
* and awaits that all the runners has been successfully started.
|
|
62
62
|
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
63
|
async run() {
|
|
66
64
|
const promises = [];
|
|
67
|
-
|
|
68
65
|
for (const runner of this.extensionRunners) {
|
|
69
66
|
promises.push(runner.run());
|
|
70
67
|
}
|
|
71
|
-
|
|
72
68
|
await Promise.all(promises);
|
|
73
69
|
}
|
|
70
|
+
|
|
74
71
|
/**
|
|
75
72
|
* Reloads all the extensions on all the managed extension runners,
|
|
76
73
|
* collect any reload error, and resolves to an array composed by
|
|
@@ -79,12 +76,9 @@ export class MultiExtensionRunner {
|
|
|
79
76
|
* Any detected reload error is also logged on the terminal and shows as a
|
|
80
77
|
* desktop notification.
|
|
81
78
|
*/
|
|
82
|
-
|
|
83
|
-
|
|
84
79
|
async reloadAllExtensions() {
|
|
85
80
|
log.debug('Reloading all reloadable add-ons');
|
|
86
81
|
const promises = [];
|
|
87
|
-
|
|
88
82
|
for (const runner of this.extensionRunners) {
|
|
89
83
|
const reloadPromise = runner.reloadAllExtensions().then(() => {
|
|
90
84
|
return {
|
|
@@ -98,12 +92,12 @@ export class MultiExtensionRunner {
|
|
|
98
92
|
});
|
|
99
93
|
promises.push(reloadPromise);
|
|
100
94
|
}
|
|
101
|
-
|
|
102
95
|
return await Promise.all(promises).then(results => {
|
|
103
96
|
this.handleReloadResults(results);
|
|
104
97
|
return results;
|
|
105
98
|
});
|
|
106
99
|
}
|
|
100
|
+
|
|
107
101
|
/**
|
|
108
102
|
* Reloads a single extension on all the managed extension runners,
|
|
109
103
|
* collect any reload error and resolves to an array composed by
|
|
@@ -112,12 +106,9 @@ export class MultiExtensionRunner {
|
|
|
112
106
|
* Any detected reload error is also logged on the terminal and shows as a
|
|
113
107
|
* desktop notification.
|
|
114
108
|
*/
|
|
115
|
-
|
|
116
|
-
|
|
117
109
|
async reloadExtensionBySourceDir(sourceDir) {
|
|
118
110
|
log.debug(`Reloading add-on at ${sourceDir}`);
|
|
119
111
|
const promises = [];
|
|
120
|
-
|
|
121
112
|
for (const runner of this.extensionRunners) {
|
|
122
113
|
const reloadPromise = runner.reloadExtensionBySourceDir(sourceDir).then(() => {
|
|
123
114
|
return {
|
|
@@ -133,48 +124,45 @@ export class MultiExtensionRunner {
|
|
|
133
124
|
});
|
|
134
125
|
promises.push(reloadPromise);
|
|
135
126
|
}
|
|
136
|
-
|
|
137
127
|
return await Promise.all(promises).then(results => {
|
|
138
128
|
this.handleReloadResults(results);
|
|
139
129
|
return results;
|
|
140
130
|
});
|
|
141
131
|
}
|
|
132
|
+
|
|
142
133
|
/**
|
|
143
134
|
* Register a callback to be called when all the managed runners has been exited.
|
|
144
135
|
*/
|
|
145
|
-
|
|
146
|
-
|
|
147
136
|
registerCleanup(cleanupCallback) {
|
|
148
|
-
const promises = [];
|
|
137
|
+
const promises = [];
|
|
138
|
+
|
|
139
|
+
// Create a promise for every extension runner managed by this instance,
|
|
149
140
|
// the promise will be resolved when the particular runner calls its
|
|
150
141
|
// registered cleanup callbacks.
|
|
151
|
-
|
|
152
142
|
for (const runner of this.extensionRunners) {
|
|
153
143
|
promises.push(new Promise(resolve => {
|
|
154
144
|
runner.registerCleanup(resolve);
|
|
155
145
|
}));
|
|
156
|
-
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Wait for all the created promises to be resolved or rejected
|
|
157
149
|
// (once each one of the runners has cleaned up) and then call
|
|
158
150
|
// the cleanup callback registered to this runner.
|
|
159
|
-
|
|
160
|
-
|
|
161
151
|
Promise.all(promises).then(cleanupCallback, cleanupCallback);
|
|
162
152
|
}
|
|
153
|
+
|
|
163
154
|
/**
|
|
164
155
|
* Exits all the managed runner has been exited.
|
|
165
156
|
*/
|
|
166
|
-
|
|
167
|
-
|
|
168
157
|
async exit() {
|
|
169
158
|
const promises = [];
|
|
170
|
-
|
|
171
159
|
for (const runner of this.extensionRunners) {
|
|
172
160
|
promises.push(runner.exit());
|
|
173
161
|
}
|
|
174
|
-
|
|
175
162
|
await Promise.all(promises);
|
|
176
|
-
}
|
|
163
|
+
}
|
|
177
164
|
|
|
165
|
+
// Private helper methods.
|
|
178
166
|
|
|
179
167
|
handleReloadResults(results) {
|
|
180
168
|
for (const {
|
|
@@ -184,11 +172,9 @@ export class MultiExtensionRunner {
|
|
|
184
172
|
} of results) {
|
|
185
173
|
if (reloadError instanceof Error) {
|
|
186
174
|
let message = 'Error occurred while reloading';
|
|
187
|
-
|
|
188
175
|
if (sourceDir) {
|
|
189
176
|
message += ` "${sourceDir}" `;
|
|
190
177
|
}
|
|
191
|
-
|
|
192
178
|
message += `on "${runnerName}" - ${reloadError.message}`;
|
|
193
179
|
log.error(`\n${message}`);
|
|
194
180
|
log.debug(reloadError.stack);
|
|
@@ -199,8 +185,9 @@ export class MultiExtensionRunner {
|
|
|
199
185
|
}
|
|
200
186
|
}
|
|
201
187
|
}
|
|
188
|
+
}
|
|
202
189
|
|
|
203
|
-
|
|
190
|
+
// defaultWatcherCreator types and implementation.
|
|
204
191
|
|
|
205
192
|
export function defaultWatcherCreator({
|
|
206
193
|
reloadExtension,
|
|
@@ -225,7 +212,9 @@ export function defaultWatcherCreator({
|
|
|
225
212
|
onChange: () => reloadExtension(sourceDir),
|
|
226
213
|
shouldWatchFile: file => fileFilter.wantFile(file)
|
|
227
214
|
});
|
|
228
|
-
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// defaultReloadStrategy types and implementation.
|
|
229
218
|
|
|
230
219
|
export function defaultReloadStrategy({
|
|
231
220
|
artifactsDir,
|
|
@@ -242,11 +231,9 @@ export function defaultReloadStrategy({
|
|
|
242
231
|
kill = process.kill
|
|
243
232
|
} = {}) {
|
|
244
233
|
const allowInput = !noInput;
|
|
245
|
-
|
|
246
234
|
if (!allowInput) {
|
|
247
235
|
log.debug('Input has been disabled because of noInput==true');
|
|
248
236
|
}
|
|
249
|
-
|
|
250
237
|
const watcher = createWatcher({
|
|
251
238
|
reloadExtension: watchedSourceDir => {
|
|
252
239
|
extensionRunner.reloadExtensionBySourceDir(watchedSourceDir);
|
|
@@ -259,40 +246,41 @@ export function defaultReloadStrategy({
|
|
|
259
246
|
});
|
|
260
247
|
extensionRunner.registerCleanup(() => {
|
|
261
248
|
watcher.close();
|
|
262
|
-
|
|
263
249
|
if (allowInput) {
|
|
264
250
|
stdin.pause();
|
|
265
251
|
}
|
|
266
252
|
});
|
|
267
|
-
|
|
268
253
|
if (allowInput && isTTY(stdin)) {
|
|
269
254
|
readline.emitKeypressEvents(stdin);
|
|
270
255
|
setRawMode(stdin, true);
|
|
271
|
-
const keypressUsageInfo = 'Press R to reload (and Ctrl-C to quit)';
|
|
256
|
+
const keypressUsageInfo = 'Press R to reload (and Ctrl-C to quit)';
|
|
257
|
+
|
|
258
|
+
// NOTE: this `Promise.resolve().then(...)` is basically used to spawn a "co-routine"
|
|
272
259
|
// that is executed before the callback attached to the Promise returned by this function
|
|
273
260
|
// (and it allows the `run` function to not be stuck in the while loop).
|
|
274
|
-
|
|
275
261
|
Promise.resolve().then(async function () {
|
|
276
262
|
log.info(keypressUsageInfo);
|
|
277
263
|
let userExit = false;
|
|
278
|
-
|
|
279
264
|
while (!userExit) {
|
|
280
265
|
const keyPressed = await new Promise(resolve => {
|
|
281
266
|
stdin.once('keypress', (str, key) => resolve(key));
|
|
282
267
|
});
|
|
283
|
-
|
|
284
268
|
if (keyPressed.ctrl && keyPressed.name === 'c') {
|
|
285
269
|
userExit = true;
|
|
286
270
|
} else if (keyPressed.name === 'z') {
|
|
287
271
|
// Prepare to suspend.
|
|
272
|
+
|
|
288
273
|
// NOTE: Switch the raw mode off before suspending (needed to make the keypress event
|
|
289
274
|
// to work correctly when the nodejs process is resumed).
|
|
290
275
|
setRawMode(stdin, false);
|
|
291
276
|
log.info('\nweb-ext has been suspended on user request');
|
|
292
|
-
kill(process.pid, 'SIGTSTP');
|
|
277
|
+
kill(process.pid, 'SIGTSTP');
|
|
278
|
+
|
|
279
|
+
// Prepare to resume.
|
|
293
280
|
|
|
294
|
-
log.info(`\nweb-ext has been resumed. ${keypressUsageInfo}`);
|
|
281
|
+
log.info(`\nweb-ext has been resumed. ${keypressUsageInfo}`);
|
|
295
282
|
|
|
283
|
+
// Switch the raw mode on on resume.
|
|
296
284
|
setRawMode(stdin, true);
|
|
297
285
|
} else if (keyPressed.name === 'r') {
|
|
298
286
|
log.debug('Reloading installed extensions on user request');
|
|
@@ -302,7 +290,6 @@ export function defaultReloadStrategy({
|
|
|
302
290
|
});
|
|
303
291
|
}
|
|
304
292
|
}
|
|
305
|
-
|
|
306
293
|
log.info('\nExiting web-ext on user request');
|
|
307
294
|
extensionRunner.exit();
|
|
308
295
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["readline","WebExtError","showDesktopNotification","defaultDesktopNotifications","createLogger","createFileFilter","defaultFileFilterCreator","isTTY","setRawMode","defaultSourceWatcher","log","import","meta","url","createExtensionRunner","config","target","FirefoxDesktopExtensionRunner","params","FirefoxAndroidExtensionRunner","ChromiumExtensionRunner","MultiExtensionRunner","constructor","extensionRunners","runners","desktopNotifications","getName","run","promises","runner","push","Promise","all","reloadAllExtensions","debug","reloadPromise","then","runnerName","error","reloadError","results","handleReloadResults","reloadExtensionBySourceDir","sourceDir","registerCleanup","cleanupCallback","resolve","exit","Error","message","stack","title","defaultWatcherCreator","reloadExtension","watchFile","watchIgnored","artifactsDir","ignoreFiles","onSourceChange","fileFilter","onChange","shouldWatchFile","file","wantFile","defaultReloadStrategy","extensionRunner","noInput","createWatcher","stdin","process","kill","allowInput","watcher","watchedSourceDir","close","pause","emitKeypressEvents","keypressUsageInfo","info","userExit","keyPressed","once","str","key","ctrl","name","pid","catch","err","warn"],"sources":["../../src/extension-runners/index.js"],"sourcesContent":["/* @flow */\n\nimport readline from 'readline';\n\nimport type Watchpack from 'watchpack';\n\nimport type {\n IExtensionRunner, // eslint-disable-line import/named\n ExtensionRunnerReloadResult,\n} from './base';\nimport {WebExtError} from '../errors.js';\nimport {\n showDesktopNotification as defaultDesktopNotifications,\n} from '../util/desktop-notifier.js';\nimport type {FirefoxAndroidExtensionRunnerParams} from './firefox-android.js';\nimport type {FirefoxDesktopExtensionRunnerParams} from './firefox-desktop.js';\nimport type {ChromiumExtensionRunnerParams} from './chromium.js';\nimport {createLogger} from '../util/logger.js';\nimport type {FileFilterCreatorFn} from '../util/file-filter.js';\nimport {\n createFileFilter as defaultFileFilterCreator,\n} from '../util/file-filter.js';\nimport {\n isTTY, setRawMode,\n} from '../util/stdin.js';\nimport defaultSourceWatcher from '../watcher.js';\nimport type {OnSourceChangeFn} from '../watcher';\n\nconst log = createLogger(import.meta.url);\n\nexport type ExtensionRunnerConfig = {|\n target: 'firefox-desktop',\n params: FirefoxDesktopExtensionRunnerParams,\n|} | {|\n target: 'firefox-android',\n params: FirefoxAndroidExtensionRunnerParams,\n|} | {|\n target: 'chromium',\n params: ChromiumExtensionRunnerParams,\n|};\n\nexport type MultiExtensionRunnerParams = {|\n runners: Array<IExtensionRunner>,\n desktopNotifications: typeof defaultDesktopNotifications,\n|};\n\nexport async function createExtensionRunner(\n config: ExtensionRunnerConfig\n): Promise<IExtensionRunner> {\n switch (config.target) {\n case 'firefox-desktop': {\n const {\n FirefoxDesktopExtensionRunner,\n } = await import('./firefox-desktop.js');\n return new FirefoxDesktopExtensionRunner(config.params);\n }\n case 'firefox-android': {\n const {\n FirefoxAndroidExtensionRunner,\n } = await import('./firefox-android.js');\n return new FirefoxAndroidExtensionRunner(config.params);\n }\n case 'chromium': {\n const {ChromiumExtensionRunner} = await import('./chromium.js');\n return new ChromiumExtensionRunner(config.params);\n }\n default:\n throw new WebExtError(`Unknown target: \"${config.target}\"`);\n }\n}\n\n/**\n * Implements an IExtensionRunner which allow the caller to\n * manage multiple extension runners at the same time (e.g. by running\n * a Firefox Desktop instance alongside to a Firefox for Android instance).\n */\nexport class MultiExtensionRunner {\n extensionRunners: Array<IExtensionRunner>;\n desktopNotifications: typeof defaultDesktopNotifications;\n\n constructor(params: MultiExtensionRunnerParams) {\n this.extensionRunners = params.runners;\n this.desktopNotifications = params.desktopNotifications;\n }\n\n // Method exported from the IExtensionRunner interface.\n\n /**\n * Returns the runner name.\n */\n getName(): string {\n return 'Multi Extension Runner';\n }\n\n /**\n * Call the `run` method on all the managed extension runners,\n * and awaits that all the runners has been successfully started.\n */\n async run(): Promise<void> {\n const promises = [];\n for (const runner of this.extensionRunners) {\n promises.push(runner.run());\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Reloads all the extensions on all the managed extension runners,\n * collect any reload error, and resolves to an array composed by\n * a ExtensionRunnerReloadResult object per managed runner.\n *\n * Any detected reload error is also logged on the terminal and shows as a\n * desktop notification.\n */\n async reloadAllExtensions(): Promise<Array<ExtensionRunnerReloadResult>> {\n log.debug('Reloading all reloadable add-ons');\n\n const promises = [];\n for (const runner of this.extensionRunners) {\n const reloadPromise = runner.reloadAllExtensions().then(\n () => {\n return {runnerName: runner.getName()};\n },\n (error) => {\n return {\n runnerName: runner.getName(),\n reloadError: error,\n };\n }\n );\n\n promises.push(reloadPromise);\n }\n\n return await Promise.all(promises).then((results) => {\n this.handleReloadResults(results);\n return results;\n });\n }\n\n /**\n * Reloads a single extension on all the managed extension runners,\n * collect any reload error and resolves to an array composed by\n * a ExtensionRunnerReloadResult object per managed runner.\n *\n * Any detected reload error is also logged on the terminal and shows as a\n * desktop notification.\n */\n async reloadExtensionBySourceDir(\n sourceDir: string\n ): Promise<Array<ExtensionRunnerReloadResult>> {\n log.debug(`Reloading add-on at ${sourceDir}`);\n\n const promises: Array<Promise<ExtensionRunnerReloadResult>> = [];\n for (const runner of this.extensionRunners) {\n const reloadPromise = runner.reloadExtensionBySourceDir(sourceDir).then(\n () => {\n return {runnerName: runner.getName(), sourceDir};\n },\n (error) => {\n return {\n runnerName: runner.getName(),\n reloadError: error,\n sourceDir,\n };\n }\n );\n\n promises.push(reloadPromise);\n }\n\n return await Promise.all(promises).then((results) => {\n this.handleReloadResults(results);\n return results;\n });\n }\n\n /**\n * Register a callback to be called when all the managed runners has been exited.\n */\n registerCleanup(cleanupCallback: Function): void {\n const promises = [];\n\n // Create a promise for every extension runner managed by this instance,\n // the promise will be resolved when the particular runner calls its\n // registered cleanup callbacks.\n for (const runner of this.extensionRunners) {\n promises.push(new Promise((resolve) => {\n runner.registerCleanup(resolve);\n }));\n }\n\n // Wait for all the created promises to be resolved or rejected\n // (once each one of the runners has cleaned up) and then call\n // the cleanup callback registered to this runner.\n Promise.all(promises).then(cleanupCallback, cleanupCallback);\n }\n\n /**\n * Exits all the managed runner has been exited.\n */\n async exit(): Promise<void> {\n const promises = [];\n for (const runner of this.extensionRunners) {\n promises.push(runner.exit());\n }\n\n await Promise.all(promises);\n }\n\n // Private helper methods.\n\n handleReloadResults(results: Array<ExtensionRunnerReloadResult>): void {\n for (const {runnerName, reloadError, sourceDir} of results) {\n if (reloadError instanceof Error) {\n let message = 'Error occurred while reloading';\n if (sourceDir) {\n message += ` \"${sourceDir}\" `;\n }\n\n message += `on \"${runnerName}\" - ${reloadError.message}`;\n\n log.error(`\\n${message}`);\n log.debug(reloadError.stack);\n\n this.desktopNotifications({\n title: 'web-ext run: extension reload error',\n message,\n });\n }\n }\n }\n}\n\n// defaultWatcherCreator types and implementation.\n\nexport type WatcherCreatorParams = {|\n reloadExtension: (string) => void,\n sourceDir: string,\n watchFile?: Array<string>,\n watchIgnored?: Array<string>,\n artifactsDir: string,\n onSourceChange?: OnSourceChangeFn,\n ignoreFiles?: Array<string>,\n createFileFilter?: FileFilterCreatorFn,\n|};\n\nexport type WatcherCreatorFn = (params: WatcherCreatorParams) => Watchpack;\n\nexport function defaultWatcherCreator(\n {\n reloadExtension, sourceDir, watchFile,\n watchIgnored, artifactsDir, ignoreFiles,\n onSourceChange = defaultSourceWatcher,\n createFileFilter = defaultFileFilterCreator,\n }: WatcherCreatorParams\n): Watchpack {\n const fileFilter = createFileFilter(\n {sourceDir, artifactsDir, ignoreFiles}\n );\n return onSourceChange({\n sourceDir,\n watchFile,\n watchIgnored,\n artifactsDir,\n onChange: () => reloadExtension(sourceDir),\n shouldWatchFile: (file) => fileFilter.wantFile(file),\n });\n}\n\n\n// defaultReloadStrategy types and implementation.\n\nexport type ReloadStrategyParams = {|\n extensionRunner: IExtensionRunner,\n sourceDir: string,\n watchFile?: Array<string>,\n watchIgnored?: Array<string>,\n artifactsDir: string,\n ignoreFiles?: Array<string>,\n noInput?: boolean,\n|};\n\nexport type ReloadStrategyOptions = {\n createWatcher?: WatcherCreatorFn,\n stdin?: stream$Readable,\n kill?: (pid: number, signal?: string | number) => void,\n};\n\nexport function defaultReloadStrategy(\n {\n artifactsDir,\n extensionRunner,\n ignoreFiles,\n noInput = false,\n sourceDir,\n watchFile,\n watchIgnored,\n }: ReloadStrategyParams,\n {\n createWatcher = defaultWatcherCreator,\n stdin = process.stdin,\n // $FlowIgnore: ignore method-unbinding.\n kill = process.kill,\n }: ReloadStrategyOptions = {}\n): void {\n const allowInput = !noInput;\n if (!allowInput) {\n log.debug('Input has been disabled because of noInput==true');\n }\n\n const watcher: Watchpack = createWatcher({\n reloadExtension: (watchedSourceDir) => {\n extensionRunner.reloadExtensionBySourceDir(watchedSourceDir);\n },\n sourceDir,\n watchFile,\n watchIgnored,\n artifactsDir,\n ignoreFiles,\n });\n\n extensionRunner.registerCleanup(() => {\n watcher.close();\n if (allowInput) {\n stdin.pause();\n }\n });\n\n if (allowInput && isTTY(stdin)) {\n readline.emitKeypressEvents(stdin);\n setRawMode(stdin, true);\n\n const keypressUsageInfo = 'Press R to reload (and Ctrl-C to quit)';\n\n // NOTE: this `Promise.resolve().then(...)` is basically used to spawn a \"co-routine\"\n // that is executed before the callback attached to the Promise returned by this function\n // (and it allows the `run` function to not be stuck in the while loop).\n Promise.resolve().then(async function() {\n log.info(keypressUsageInfo);\n\n let userExit = false;\n\n while (!userExit) {\n const keyPressed = await new Promise((resolve) => {\n stdin.once('keypress', (str, key) => resolve(key));\n });\n\n if (keyPressed.ctrl && keyPressed.name === 'c') {\n userExit = true;\n } else if (keyPressed.name === 'z') {\n // Prepare to suspend.\n\n // NOTE: Switch the raw mode off before suspending (needed to make the keypress event\n // to work correctly when the nodejs process is resumed).\n setRawMode(stdin, false);\n\n log.info('\\nweb-ext has been suspended on user request');\n kill(process.pid, 'SIGTSTP');\n\n // Prepare to resume.\n\n log.info(`\\nweb-ext has been resumed. ${keypressUsageInfo}`);\n\n // Switch the raw mode on on resume.\n setRawMode(stdin, true);\n } else if (keyPressed.name === 'r') {\n log.debug('Reloading installed extensions on user request');\n await extensionRunner.reloadAllExtensions().catch((err) => {\n log.warn(`\\nError reloading extension: ${err}`);\n log.debug(`Reloading extension error stack: ${err.stack}`);\n });\n }\n }\n\n log.info('\\nExiting web-ext on user request');\n extensionRunner.exit();\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["readline","WebExtError","showDesktopNotification","defaultDesktopNotifications","createLogger","createFileFilter","defaultFileFilterCreator","isTTY","setRawMode","defaultSourceWatcher","log","import","meta","url","createExtensionRunner","config","target","FirefoxDesktopExtensionRunner","params","FirefoxAndroidExtensionRunner","ChromiumExtensionRunner","MultiExtensionRunner","constructor","extensionRunners","runners","desktopNotifications","getName","run","promises","runner","push","Promise","all","reloadAllExtensions","debug","reloadPromise","then","runnerName","error","reloadError","results","handleReloadResults","reloadExtensionBySourceDir","sourceDir","registerCleanup","cleanupCallback","resolve","exit","Error","message","stack","title","defaultWatcherCreator","reloadExtension","watchFile","watchIgnored","artifactsDir","ignoreFiles","onSourceChange","fileFilter","onChange","shouldWatchFile","file","wantFile","defaultReloadStrategy","extensionRunner","noInput","createWatcher","stdin","process","kill","allowInput","watcher","watchedSourceDir","close","pause","emitKeypressEvents","keypressUsageInfo","info","userExit","keyPressed","once","str","key","ctrl","name","pid","catch","err","warn"],"sources":["../../src/extension-runners/index.js"],"sourcesContent":["/* @flow */\n\nimport readline from 'readline';\n\nimport type Watchpack from 'watchpack';\n\nimport type {\n IExtensionRunner, // eslint-disable-line import/named\n ExtensionRunnerReloadResult,\n} from './base';\nimport {WebExtError} from '../errors.js';\nimport {\n showDesktopNotification as defaultDesktopNotifications,\n} from '../util/desktop-notifier.js';\nimport type {FirefoxAndroidExtensionRunnerParams} from './firefox-android.js';\nimport type {FirefoxDesktopExtensionRunnerParams} from './firefox-desktop.js';\nimport type {ChromiumExtensionRunnerParams} from './chromium.js';\nimport {createLogger} from '../util/logger.js';\nimport type {FileFilterCreatorFn} from '../util/file-filter.js';\nimport {\n createFileFilter as defaultFileFilterCreator,\n} from '../util/file-filter.js';\nimport {\n isTTY, setRawMode,\n} from '../util/stdin.js';\nimport defaultSourceWatcher from '../watcher.js';\nimport type {OnSourceChangeFn} from '../watcher';\n\nconst log = createLogger(import.meta.url);\n\nexport type ExtensionRunnerConfig = {|\n target: 'firefox-desktop',\n params: FirefoxDesktopExtensionRunnerParams,\n|} | {|\n target: 'firefox-android',\n params: FirefoxAndroidExtensionRunnerParams,\n|} | {|\n target: 'chromium',\n params: ChromiumExtensionRunnerParams,\n|};\n\nexport type MultiExtensionRunnerParams = {|\n runners: Array<IExtensionRunner>,\n desktopNotifications: typeof defaultDesktopNotifications,\n|};\n\nexport async function createExtensionRunner(\n config: ExtensionRunnerConfig\n): Promise<IExtensionRunner> {\n switch (config.target) {\n case 'firefox-desktop': {\n const {\n FirefoxDesktopExtensionRunner,\n } = await import('./firefox-desktop.js');\n return new FirefoxDesktopExtensionRunner(config.params);\n }\n case 'firefox-android': {\n const {\n FirefoxAndroidExtensionRunner,\n } = await import('./firefox-android.js');\n return new FirefoxAndroidExtensionRunner(config.params);\n }\n case 'chromium': {\n const {ChromiumExtensionRunner} = await import('./chromium.js');\n return new ChromiumExtensionRunner(config.params);\n }\n default:\n throw new WebExtError(`Unknown target: \"${config.target}\"`);\n }\n}\n\n/**\n * Implements an IExtensionRunner which allow the caller to\n * manage multiple extension runners at the same time (e.g. by running\n * a Firefox Desktop instance alongside to a Firefox for Android instance).\n */\nexport class MultiExtensionRunner {\n extensionRunners: Array<IExtensionRunner>;\n desktopNotifications: typeof defaultDesktopNotifications;\n\n constructor(params: MultiExtensionRunnerParams) {\n this.extensionRunners = params.runners;\n this.desktopNotifications = params.desktopNotifications;\n }\n\n // Method exported from the IExtensionRunner interface.\n\n /**\n * Returns the runner name.\n */\n getName(): string {\n return 'Multi Extension Runner';\n }\n\n /**\n * Call the `run` method on all the managed extension runners,\n * and awaits that all the runners has been successfully started.\n */\n async run(): Promise<void> {\n const promises = [];\n for (const runner of this.extensionRunners) {\n promises.push(runner.run());\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Reloads all the extensions on all the managed extension runners,\n * collect any reload error, and resolves to an array composed by\n * a ExtensionRunnerReloadResult object per managed runner.\n *\n * Any detected reload error is also logged on the terminal and shows as a\n * desktop notification.\n */\n async reloadAllExtensions(): Promise<Array<ExtensionRunnerReloadResult>> {\n log.debug('Reloading all reloadable add-ons');\n\n const promises = [];\n for (const runner of this.extensionRunners) {\n const reloadPromise = runner.reloadAllExtensions().then(\n () => {\n return {runnerName: runner.getName()};\n },\n (error) => {\n return {\n runnerName: runner.getName(),\n reloadError: error,\n };\n }\n );\n\n promises.push(reloadPromise);\n }\n\n return await Promise.all(promises).then((results) => {\n this.handleReloadResults(results);\n return results;\n });\n }\n\n /**\n * Reloads a single extension on all the managed extension runners,\n * collect any reload error and resolves to an array composed by\n * a ExtensionRunnerReloadResult object per managed runner.\n *\n * Any detected reload error is also logged on the terminal and shows as a\n * desktop notification.\n */\n async reloadExtensionBySourceDir(\n sourceDir: string\n ): Promise<Array<ExtensionRunnerReloadResult>> {\n log.debug(`Reloading add-on at ${sourceDir}`);\n\n const promises: Array<Promise<ExtensionRunnerReloadResult>> = [];\n for (const runner of this.extensionRunners) {\n const reloadPromise = runner.reloadExtensionBySourceDir(sourceDir).then(\n () => {\n return {runnerName: runner.getName(), sourceDir};\n },\n (error) => {\n return {\n runnerName: runner.getName(),\n reloadError: error,\n sourceDir,\n };\n }\n );\n\n promises.push(reloadPromise);\n }\n\n return await Promise.all(promises).then((results) => {\n this.handleReloadResults(results);\n return results;\n });\n }\n\n /**\n * Register a callback to be called when all the managed runners has been exited.\n */\n registerCleanup(cleanupCallback: Function): void {\n const promises = [];\n\n // Create a promise for every extension runner managed by this instance,\n // the promise will be resolved when the particular runner calls its\n // registered cleanup callbacks.\n for (const runner of this.extensionRunners) {\n promises.push(new Promise((resolve) => {\n runner.registerCleanup(resolve);\n }));\n }\n\n // Wait for all the created promises to be resolved or rejected\n // (once each one of the runners has cleaned up) and then call\n // the cleanup callback registered to this runner.\n Promise.all(promises).then(cleanupCallback, cleanupCallback);\n }\n\n /**\n * Exits all the managed runner has been exited.\n */\n async exit(): Promise<void> {\n const promises = [];\n for (const runner of this.extensionRunners) {\n promises.push(runner.exit());\n }\n\n await Promise.all(promises);\n }\n\n // Private helper methods.\n\n handleReloadResults(results: Array<ExtensionRunnerReloadResult>): void {\n for (const {runnerName, reloadError, sourceDir} of results) {\n if (reloadError instanceof Error) {\n let message = 'Error occurred while reloading';\n if (sourceDir) {\n message += ` \"${sourceDir}\" `;\n }\n\n message += `on \"${runnerName}\" - ${reloadError.message}`;\n\n log.error(`\\n${message}`);\n log.debug(reloadError.stack);\n\n this.desktopNotifications({\n title: 'web-ext run: extension reload error',\n message,\n });\n }\n }\n }\n}\n\n// defaultWatcherCreator types and implementation.\n\nexport type WatcherCreatorParams = {|\n reloadExtension: (string) => void,\n sourceDir: string,\n watchFile?: Array<string>,\n watchIgnored?: Array<string>,\n artifactsDir: string,\n onSourceChange?: OnSourceChangeFn,\n ignoreFiles?: Array<string>,\n createFileFilter?: FileFilterCreatorFn,\n|};\n\nexport type WatcherCreatorFn = (params: WatcherCreatorParams) => Watchpack;\n\nexport function defaultWatcherCreator(\n {\n reloadExtension, sourceDir, watchFile,\n watchIgnored, artifactsDir, ignoreFiles,\n onSourceChange = defaultSourceWatcher,\n createFileFilter = defaultFileFilterCreator,\n }: WatcherCreatorParams\n): Watchpack {\n const fileFilter = createFileFilter(\n {sourceDir, artifactsDir, ignoreFiles}\n );\n return onSourceChange({\n sourceDir,\n watchFile,\n watchIgnored,\n artifactsDir,\n onChange: () => reloadExtension(sourceDir),\n shouldWatchFile: (file) => fileFilter.wantFile(file),\n });\n}\n\n\n// defaultReloadStrategy types and implementation.\n\nexport type ReloadStrategyParams = {|\n extensionRunner: IExtensionRunner,\n sourceDir: string,\n watchFile?: Array<string>,\n watchIgnored?: Array<string>,\n artifactsDir: string,\n ignoreFiles?: Array<string>,\n noInput?: boolean,\n|};\n\nexport type ReloadStrategyOptions = {\n createWatcher?: WatcherCreatorFn,\n stdin?: stream$Readable,\n kill?: (pid: number, signal?: string | number) => void,\n};\n\nexport function defaultReloadStrategy(\n {\n artifactsDir,\n extensionRunner,\n ignoreFiles,\n noInput = false,\n sourceDir,\n watchFile,\n watchIgnored,\n }: ReloadStrategyParams,\n {\n createWatcher = defaultWatcherCreator,\n stdin = process.stdin,\n // $FlowIgnore: ignore method-unbinding.\n kill = process.kill,\n }: ReloadStrategyOptions = {}\n): void {\n const allowInput = !noInput;\n if (!allowInput) {\n log.debug('Input has been disabled because of noInput==true');\n }\n\n const watcher: Watchpack = createWatcher({\n reloadExtension: (watchedSourceDir) => {\n extensionRunner.reloadExtensionBySourceDir(watchedSourceDir);\n },\n sourceDir,\n watchFile,\n watchIgnored,\n artifactsDir,\n ignoreFiles,\n });\n\n extensionRunner.registerCleanup(() => {\n watcher.close();\n if (allowInput) {\n stdin.pause();\n }\n });\n\n if (allowInput && isTTY(stdin)) {\n readline.emitKeypressEvents(stdin);\n setRawMode(stdin, true);\n\n const keypressUsageInfo = 'Press R to reload (and Ctrl-C to quit)';\n\n // NOTE: this `Promise.resolve().then(...)` is basically used to spawn a \"co-routine\"\n // that is executed before the callback attached to the Promise returned by this function\n // (and it allows the `run` function to not be stuck in the while loop).\n Promise.resolve().then(async function() {\n log.info(keypressUsageInfo);\n\n let userExit = false;\n\n while (!userExit) {\n const keyPressed = await new Promise((resolve) => {\n stdin.once('keypress', (str, key) => resolve(key));\n });\n\n if (keyPressed.ctrl && keyPressed.name === 'c') {\n userExit = true;\n } else if (keyPressed.name === 'z') {\n // Prepare to suspend.\n\n // NOTE: Switch the raw mode off before suspending (needed to make the keypress event\n // to work correctly when the nodejs process is resumed).\n setRawMode(stdin, false);\n\n log.info('\\nweb-ext has been suspended on user request');\n kill(process.pid, 'SIGTSTP');\n\n // Prepare to resume.\n\n log.info(`\\nweb-ext has been resumed. ${keypressUsageInfo}`);\n\n // Switch the raw mode on on resume.\n setRawMode(stdin, true);\n } else if (keyPressed.name === 'r') {\n log.debug('Reloading installed extensions on user request');\n await extensionRunner.reloadAllExtensions().catch((err) => {\n log.warn(`\\nError reloading extension: ${err}`);\n log.debug(`Reloading extension error stack: ${err.stack}`);\n });\n }\n }\n\n log.info('\\nExiting web-ext on user request');\n extensionRunner.exit();\n });\n }\n}\n"],"mappings":"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"}
|