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.
Files changed (70) hide show
  1. package/README.md +2 -2
  2. package/lib/cmd/build.js +18 -36
  3. package/lib/cmd/build.js.map +1 -1
  4. package/lib/cmd/docs.js +1 -0
  5. package/lib/cmd/docs.js.map +1 -1
  6. package/lib/cmd/index.js +3 -5
  7. package/lib/cmd/index.js.map +1 -1
  8. package/lib/cmd/lint.js +28 -17
  9. package/lib/cmd/lint.js.map +1 -1
  10. package/lib/cmd/run.js +19 -23
  11. package/lib/cmd/run.js.map +1 -1
  12. package/lib/cmd/sign.js +80 -47
  13. package/lib/cmd/sign.js.map +1 -1
  14. package/lib/config.js +18 -29
  15. package/lib/config.js.map +1 -1
  16. package/lib/errors.js +8 -18
  17. package/lib/errors.js.map +1 -1
  18. package/lib/extension-runners/base.js +2 -0
  19. package/lib/extension-runners/base.js.map +1 -1
  20. package/lib/extension-runners/chromium.js +36 -62
  21. package/lib/extension-runners/chromium.js.map +1 -1
  22. package/lib/extension-runners/firefox-android.js +65 -102
  23. package/lib/extension-runners/firefox-android.js.map +1 -1
  24. package/lib/extension-runners/firefox-desktop.js +30 -42
  25. package/lib/extension-runners/firefox-desktop.js.map +1 -1
  26. package/lib/extension-runners/index.js +33 -46
  27. package/lib/extension-runners/index.js.map +1 -1
  28. package/lib/firefox/index.js +75 -47
  29. package/lib/firefox/index.js.map +1 -1
  30. package/lib/firefox/package-identifiers.js +2 -0
  31. package/lib/firefox/package-identifiers.js.map +1 -1
  32. package/lib/firefox/preferences.js +14 -15
  33. package/lib/firefox/preferences.js.map +1 -1
  34. package/lib/firefox/rdp-client.js +16 -64
  35. package/lib/firefox/rdp-client.js.map +1 -1
  36. package/lib/firefox/remote.js +15 -30
  37. package/lib/firefox/remote.js.map +1 -1
  38. package/lib/main.js +4 -2
  39. package/lib/main.js.map +1 -1
  40. package/lib/program.js +75 -77
  41. package/lib/program.js.map +1 -1
  42. package/lib/util/adb.js +33 -63
  43. package/lib/util/adb.js.map +1 -1
  44. package/lib/util/artifacts.js +3 -5
  45. package/lib/util/artifacts.js.map +1 -1
  46. package/lib/util/desktop-notifier.js +1 -0
  47. package/lib/util/desktop-notifier.js.map +1 -1
  48. package/lib/util/file-exists.js +1 -2
  49. package/lib/util/file-exists.js.map +1 -1
  50. package/lib/util/file-filter.js +17 -19
  51. package/lib/util/file-filter.js.map +1 -1
  52. package/lib/util/is-directory.js +2 -1
  53. package/lib/util/is-directory.js.map +1 -1
  54. package/lib/util/logger.js +7 -12
  55. package/lib/util/logger.js.map +1 -1
  56. package/lib/util/manifest.js +6 -13
  57. package/lib/util/manifest.js.map +1 -1
  58. package/lib/util/promisify.js +7 -3
  59. package/lib/util/promisify.js.map +1 -1
  60. package/lib/util/stdin.js +2 -0
  61. package/lib/util/stdin.js.map +1 -1
  62. package/lib/util/submit-addon.js +288 -0
  63. package/lib/util/submit-addon.js.map +1 -0
  64. package/lib/util/temp-dir.js +8 -18
  65. package/lib/util/temp-dir.js.map +1 -1
  66. package/lib/util/updates.js +1 -1
  67. package/lib/util/updates.js.map +1 -1
  68. package/lib/watcher.js +14 -9
  69. package/lib/watcher.js.map +1 -1
  70. 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
- } // Method exported from the IExtensionRunner interface.
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 = []; // Create a promise for every extension runner managed by this instance,
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
- } // Wait for all the created promises to be resolved or rejected
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
- } // Private helper methods.
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
- } // defaultWatcherCreator types and implementation.
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
- } // defaultReloadStrategy types and implementation.
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)'; // NOTE: this `Promise.resolve().then(...)` is basically used to spawn a "co-routine"
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'); // Prepare to resume.
277
+ kill(process.pid, 'SIGTSTP');
278
+
279
+ // Prepare to resume.
293
280
 
294
- log.info(`\nweb-ext has been resumed. ${keypressUsageInfo}`); // Switch the raw mode on on resume.
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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"}