web-ext 6.8.0 → 7.0.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 (94) hide show
  1. package/README.md +17 -8
  2. package/bin/web-ext.js +13 -0
  3. package/index.js +12 -0
  4. package/lib/cmd/build.js +226 -0
  5. package/lib/cmd/build.js.map +1 -0
  6. package/lib/cmd/docs.js +16 -0
  7. package/lib/cmd/docs.js.map +1 -0
  8. package/lib/cmd/index.js +47 -0
  9. package/lib/cmd/index.js.map +1 -0
  10. package/lib/cmd/lint.js +50 -0
  11. package/lib/cmd/lint.js.map +1 -0
  12. package/lib/cmd/run.js +191 -0
  13. package/lib/cmd/run.js.map +1 -0
  14. package/lib/cmd/sign.js +140 -0
  15. package/lib/cmd/sign.js.map +1 -0
  16. package/lib/config.js +144 -0
  17. package/lib/config.js.map +1 -0
  18. package/{src → lib}/errors.js +26 -35
  19. package/lib/errors.js.map +1 -0
  20. package/lib/extension-runners/base.js +2 -0
  21. package/lib/extension-runners/base.js.map +1 -0
  22. package/{src → lib}/extension-runners/chromium.js +121 -178
  23. package/lib/extension-runners/chromium.js.map +1 -0
  24. package/{src → lib}/extension-runners/firefox-android.js +168 -326
  25. package/lib/extension-runners/firefox-android.js.map +1 -0
  26. package/{src → lib}/extension-runners/firefox-desktop.js +73 -114
  27. package/lib/extension-runners/firefox-desktop.js.map +1 -0
  28. package/lib/extension-runners/index.js +311 -0
  29. package/lib/extension-runners/index.js.map +1 -0
  30. package/lib/firefox/index.js +362 -0
  31. package/lib/firefox/index.js.map +1 -0
  32. package/lib/firefox/package-identifiers.js +5 -0
  33. package/lib/firefox/package-identifiers.js.map +1 -0
  34. package/{src → lib}/firefox/preferences.js +27 -70
  35. package/lib/firefox/preferences.js.map +1 -0
  36. package/{src → lib}/firefox/rdp-client.js +98 -105
  37. package/lib/firefox/rdp-client.js.map +1 -0
  38. package/{src → lib}/firefox/remote.js +55 -129
  39. package/lib/firefox/remote.js.map +1 -0
  40. package/lib/main.js +9 -0
  41. package/lib/main.js.map +1 -0
  42. package/lib/program.js +657 -0
  43. package/lib/program.js.map +1 -0
  44. package/lib/util/adb.js +322 -0
  45. package/lib/util/adb.js.map +1 -0
  46. package/lib/util/artifacts.js +52 -0
  47. package/lib/util/artifacts.js.map +1 -0
  48. package/lib/util/desktop-notifier.js +27 -0
  49. package/lib/util/desktop-notifier.js.map +1 -0
  50. package/{src → lib}/util/file-exists.js +7 -14
  51. package/lib/util/file-exists.js.map +1 -0
  52. package/{src → lib}/util/file-filter.js +31 -59
  53. package/lib/util/file-filter.js.map +1 -0
  54. package/lib/util/is-directory.js +20 -0
  55. package/lib/util/is-directory.js.map +1 -0
  56. package/lib/util/logger.js +79 -0
  57. package/lib/util/logger.js.map +1 -0
  58. package/{src → lib}/util/manifest.js +18 -50
  59. package/lib/util/manifest.js.map +1 -0
  60. package/{src → lib}/util/promisify.js +6 -9
  61. package/lib/util/promisify.js.map +1 -0
  62. package/{src → lib}/util/stdin.js +3 -7
  63. package/lib/util/stdin.js.map +1 -0
  64. package/{src → lib}/util/temp-dir.js +47 -52
  65. package/lib/util/temp-dir.js.map +1 -0
  66. package/lib/util/updates.js +16 -0
  67. package/lib/util/updates.js.map +1 -0
  68. package/lib/watcher.js +78 -0
  69. package/lib/watcher.js.map +1 -0
  70. package/package.json +50 -52
  71. package/CODE_OF_CONDUCT.md +0 -10
  72. package/bin/web-ext +0 -7
  73. package/dist/web-ext.js +0 -2
  74. package/index.mjs +0 -13
  75. package/src/cmd/build.js +0 -319
  76. package/src/cmd/docs.js +0 -33
  77. package/src/cmd/index.js +0 -57
  78. package/src/cmd/lint.js +0 -102
  79. package/src/cmd/run.js +0 -266
  80. package/src/cmd/sign.js +0 -198
  81. package/src/config.js +0 -187
  82. package/src/extension-runners/base.js +0 -40
  83. package/src/extension-runners/index.js +0 -381
  84. package/src/firefox/index.js +0 -541
  85. package/src/firefox/package-identifiers.js +0 -14
  86. package/src/main.js +0 -19
  87. package/src/program.js +0 -765
  88. package/src/util/adb.js +0 -433
  89. package/src/util/artifacts.js +0 -69
  90. package/src/util/desktop-notifier.js +0 -41
  91. package/src/util/is-directory.js +0 -23
  92. package/src/util/logger.js +0 -131
  93. package/src/util/updates.js +0 -21
  94. package/src/watcher.js +0 -115
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chromium.js","names":["path","fs","asyncMkdirp","Launcher","ChromeLauncher","launch","defaultChromiumLaunch","WebSocket","WebSocketServer","createLogger","TempDir","isDirectory","fileExists","log","import","meta","url","EXCLUDED_CHROME_FLAGS","DEFAULT_CHROME_FLAGS","defaultFlags","filter","flag","includes","ChromiumExtensionRunner","constructor","params","chromiumLaunch","cleanupCallbacks","Set","getName","run","_promiseSetupDone","setupInstance","isUserDataDir","dirPath","localStatePath","join","defaultPath","isProfileDir","securePreferencesPath","getProfilePaths","chromiumProfile","userDataDir","profileDirName","isProfileDirAndNotUserData","dir","base","parse","wss","Promise","resolve","server","port","host","clientTracking","on","socket","err","debug","reloadManagerExtension","createReloadManagerExtension","extensions","concat","map","sourceDir","chromiumBinary","chromeFlags","push","args","keepProfileChanges","Error","tmpDir","create","tmpDirPath","copy","startingUrl","startUrl","startingUrls","Array","isArray","shift","chromiumInstance","enableExtensions","chromePath","ignoreDefaultFlags","process","once","exiting","info","exit","wssBroadcast","data","clients","cleanWebExtReloadComplete","client","removeEventListener","webExtReloadComplete","delete","message","msg","JSON","type","call","readyState","OPEN","addEventListener","send","stringify","size","registerCleanup","remove","extPath","Date","now","writeFile","manifest_version","name","version","permissions","background","scripts","wssInfo","address","bgPage","reloadAllExtensions","runnerName","stdout","write","toTimeString","reloadExtensionBySourceDir","extensionSourceDir","fn","add","catch","kill","wssClient","terminate","close","error"],"sources":["../../src/extension-runners/chromium.js"],"sourcesContent":["/* @flow */\n\n/**\n * This module provide an ExtensionRunner subclass that manage an extension executed\n * in a Chromium-based browser instance.\n */\n\nimport path from 'path';\n\nimport fs from 'fs-extra';\nimport asyncMkdirp from 'mkdirp';\nimport {\n Launcher as ChromeLauncher,\n launch as defaultChromiumLaunch,\n} from 'chrome-launcher';\nimport WebSocket, {WebSocketServer} from 'ws';\n\nimport {createLogger} from '../util/logger.js';\nimport {TempDir} from '../util/temp-dir.js';\nimport type {\n ExtensionRunnerParams,\n ExtensionRunnerReloadResult,\n} from './base';\nimport isDirectory from '../util/is-directory.js';\nimport fileExists from '../util/file-exists.js';\n\ntype ChromiumSpecificRunnerParams = {|\n chromiumBinary?: string,\n chromiumProfile?: string,\n chromiumLaunch?: typeof defaultChromiumLaunch,\n|};\n\nexport type ChromiumExtensionRunnerParams = {|\n ...ExtensionRunnerParams,\n // Chromium desktop CLI params.\n ...ChromiumSpecificRunnerParams,\n|};\n\nconst log = createLogger(import.meta.url);\n\nconst EXCLUDED_CHROME_FLAGS = [\n '--disable-extensions',\n '--mute-audio',\n];\n\nexport const DEFAULT_CHROME_FLAGS: Array<string> = ChromeLauncher.defaultFlags()\n .filter((flag) => !EXCLUDED_CHROME_FLAGS.includes(flag));\n\n/**\n * Implements an IExtensionRunner which manages a Chromium instance.\n */\nexport class ChromiumExtensionRunner {\n cleanupCallbacks: Set<Function>;\n params: ChromiumExtensionRunnerParams;\n chromiumInstance: ?ChromeLauncher;\n chromiumLaunch: typeof defaultChromiumLaunch;\n reloadManagerExtension: string;\n wss: ?WebSocketServer;\n exiting: boolean;\n _promiseSetupDone: ?Promise<void>;\n\n constructor(params: ChromiumExtensionRunnerParams) {\n const {\n chromiumLaunch = defaultChromiumLaunch,\n } = params;\n this.params = params;\n this.chromiumLaunch = chromiumLaunch;\n this.cleanupCallbacks = new Set();\n }\n\n // Method exported from the IExtensionRunner interface.\n\n /**\n * Returns the runner name.\n */\n getName(): string {\n return 'Chromium';\n }\n\n async run(): Promise<void> {\n // Run should never be called more than once.\n this._promiseSetupDone = this.setupInstance();\n await this._promiseSetupDone;\n }\n\n static async isUserDataDir(dirPath: string): Promise<boolean> {\n const localStatePath = path.join(dirPath, 'Local State');\n const defaultPath = path.join(dirPath, 'Default');\n // Local State and Default are typical for the user-data-dir\n return (await fileExists(localStatePath))\n && (await isDirectory(defaultPath));\n }\n\n static async isProfileDir(dirPath: string): Promise<boolean> {\n const securePreferencesPath = path.join(\n dirPath, 'Secure Preferences');\n //Secure Preferences is typical for a profile dir inside a user data dir\n return await fileExists(securePreferencesPath);\n }\n\n static async getProfilePaths(chromiumProfile: ?string): Promise<{\n userDataDir: ?string,\n profileDirName: ?string\n }> {\n if (!chromiumProfile) {\n return {\n userDataDir: null,\n profileDirName: null,\n };\n }\n\n const isProfileDirAndNotUserData =\n (await ChromiumExtensionRunner.isProfileDir(chromiumProfile))\n && !(await ChromiumExtensionRunner.isUserDataDir(chromiumProfile));\n\n if (isProfileDirAndNotUserData) {\n const {dir: userDataDir, base: profileDirName} =\n path.parse(chromiumProfile);\n return {\n userDataDir,\n profileDirName,\n };\n }\n\n return {\n userDataDir: chromiumProfile,\n profileDirName: null,\n };\n\n }\n\n /**\n * Setup the Chromium Profile and run a Chromium instance.\n */\n async setupInstance(): Promise<void> {\n // Start a websocket server on a free localhost TCP port.\n this.wss = await new Promise((resolve) => {\n const server = new WebSocketServer(\n // Use a ipv4 host so we don't need to escape ipv6 address\n // https://github.com/mozilla/web-ext/issues/2331\n {port: 0, host: '127.0.0.1', clientTracking: true},\n // Wait the server to be listening (so that the extension\n // runner can successfully retrieve server address and port).\n () => resolve(server));\n });\n\n // Prevent unhandled socket error (e.g. when chrome\n // is exiting, See https://github.com/websockets/ws/issues/1256).\n this.wss.on('connection', function(socket) {\n socket.on('error', (err) => {\n log.debug(`websocket connection error: ${err}`);\n });\n });\n\n // Create the extension that will manage the addon reloads\n this.reloadManagerExtension = await this.createReloadManagerExtension();\n\n // Start chrome pointing it to a given profile dir\n const extensions = [this.reloadManagerExtension].concat(\n this.params.extensions.map(({sourceDir}) => sourceDir)\n ).join(',');\n\n const {chromiumBinary} = this.params;\n\n log.debug('Starting Chromium instance...');\n\n if (chromiumBinary) {\n log.debug(`(chromiumBinary: ${chromiumBinary})`);\n }\n\n const chromeFlags = [...DEFAULT_CHROME_FLAGS];\n\n chromeFlags.push(`--load-extension=${extensions}`);\n\n if (this.params.args) {\n chromeFlags.push(...this.params.args);\n }\n\n // eslint-disable-next-line prefer-const\n let {userDataDir, profileDirName} =\n await ChromiumExtensionRunner.getProfilePaths(\n this.params.chromiumProfile);\n\n if (userDataDir && this.params.keepProfileChanges) {\n if (profileDirName\n && !(await ChromiumExtensionRunner.isUserDataDir(userDataDir))) {\n throw new Error('The profile you provided is not in a ' +\n 'user-data-dir. The changes cannot be kept. Please either ' +\n 'remove --keep-profile-changes or use a profile in a ' +\n 'user-data-dir directory');\n }\n } else if (!this.params.keepProfileChanges) {\n // the user provided an existing profile directory but doesn't want\n // the changes to be kept. we copy this directory to a temporary\n // user data dir.\n const tmpDir = new TempDir();\n await tmpDir.create();\n const tmpDirPath = tmpDir.path();\n\n if (userDataDir && profileDirName) {\n // copy profile dir to this temp user data dir.\n await fs.copy(path.join(\n userDataDir,\n profileDirName), path.join(\n tmpDirPath,\n profileDirName),\n );\n } else if (userDataDir) {\n await fs.copy(userDataDir, tmpDirPath);\n }\n userDataDir = tmpDirPath;\n }\n\n if (profileDirName) {\n chromeFlags.push(`--profile-directory=${profileDirName}`);\n }\n\n let startingUrl;\n if (this.params.startUrl) {\n const startingUrls = Array.isArray(this.params.startUrl) ?\n this.params.startUrl : [this.params.startUrl];\n startingUrl = startingUrls.shift();\n chromeFlags.push(...startingUrls);\n }\n\n this.chromiumInstance = await this.chromiumLaunch({\n enableExtensions: true,\n chromePath: chromiumBinary,\n chromeFlags,\n startingUrl,\n userDataDir,\n // Ignore default flags to keep the extension enabled.\n ignoreDefaultFlags: true,\n });\n\n this.chromiumInstance.process.once('close', () => {\n this.chromiumInstance = null;\n\n if (!this.exiting) {\n log.info('Exiting on Chromium instance disconnected.');\n this.exit();\n }\n });\n }\n\n async wssBroadcast(data: Object): Promise<void> {\n return new Promise((resolve) => {\n const clients = this.wss ? new Set(this.wss.clients) : new Set();\n\n function cleanWebExtReloadComplete() {\n const client = this;\n client.removeEventListener('message', webExtReloadComplete);\n client.removeEventListener('close', cleanWebExtReloadComplete);\n clients.delete(client);\n }\n\n const webExtReloadComplete = async (message) => {\n const msg = JSON.parse(message.data);\n\n if (msg.type === 'webExtReloadExtensionComplete') {\n for (const client of clients) {\n cleanWebExtReloadComplete.call(client);\n }\n resolve();\n }\n };\n\n for (const client of clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.addEventListener('message', webExtReloadComplete);\n client.addEventListener('close', cleanWebExtReloadComplete);\n\n client.send(JSON.stringify(data));\n } else {\n clients.delete(client);\n }\n }\n\n if (clients.size === 0) {\n resolve();\n }\n });\n }\n\n async createReloadManagerExtension(): Promise<string> {\n const tmpDir = new TempDir();\n await tmpDir.create();\n this.registerCleanup(() => tmpDir.remove());\n\n const extPath = path.join(\n tmpDir.path(),\n `reload-manager-extension-${Date.now()}`\n );\n\n log.debug(`Creating reload-manager-extension in ${extPath}`);\n\n await asyncMkdirp(extPath);\n\n await fs.writeFile(\n path.join(extPath, 'manifest.json'),\n JSON.stringify({\n manifest_version: 2,\n name: 'web-ext Reload Manager Extension',\n version: '1.0',\n permissions: ['management', 'tabs'],\n background: {\n scripts: ['bg.js'],\n },\n })\n );\n\n // $FlowIgnore: this method is only called right after creating the server and so wss should be defined.\n const wssInfo = this.wss.address();\n\n const bgPage = `(function bgPage() {\n async function getAllDevExtensions() {\n const allExtensions = await new Promise(\n r => chrome.management.getAll(r));\n\n return allExtensions.filter((extension) => {\n return extension.enabled &&\n extension.installType === \"development\" &&\n extension.id !== chrome.runtime.id;\n });\n }\n\n const setEnabled = (extensionId, value) =>\n chrome.runtime.id == extensionId ?\n new Promise.resolve() :\n new Promise(r => chrome.management.setEnabled(extensionId, value, r));\n\n async function reloadExtension(extensionId) {\n await setEnabled(extensionId, false);\n await setEnabled(extensionId, true);\n }\n\n const ws = new window.WebSocket(\n \"ws://${wssInfo.address}:${wssInfo.port}\");\n\n ws.onmessage = async (evt) => {\n const msg = JSON.parse(evt.data);\n if (msg.type === 'webExtReloadAllExtensions') {\n const devExtensions = await getAllDevExtensions();\n await Promise.all(devExtensions.map(ext => reloadExtension(ext.id)));\n ws.send(JSON.stringify({ type: 'webExtReloadExtensionComplete' }));\n }\n };\n })()`;\n\n await fs.writeFile(path.join(extPath, 'bg.js'), bgPage);\n return extPath;\n }\n\n /**\n * Reloads all the extensions, collect any reload error and resolves to\n * an array composed by a single ExtensionRunnerReloadResult object.\n */\n async reloadAllExtensions(): Promise<Array<ExtensionRunnerReloadResult>> {\n const runnerName = this.getName();\n\n await this.wssBroadcast({\n type: 'webExtReloadAllExtensions',\n });\n\n process.stdout.write(\n `\\rLast extension reload: ${(new Date()).toTimeString()}`);\n log.debug('\\n');\n\n return [{runnerName}];\n }\n\n /**\n * Reloads a single extension, collect any reload error and resolves to\n * an array composed by a single ExtensionRunnerReloadResult object.\n */\n async reloadExtensionBySourceDir(\n extensionSourceDir: string // eslint-disable-line no-unused-vars\n ): Promise<Array<ExtensionRunnerReloadResult>> {\n // TODO(rpl): detect the extension ids assigned to the\n // target extensions and map it to the extensions source dir\n // (https://github.com/mozilla/web-ext/issues/1687).\n return this.reloadAllExtensions();\n }\n\n /**\n * Register a callback to be called when the runner has been exited\n * (e.g. the Chromium instance exits or the user has requested web-ext\n * to exit).\n */\n registerCleanup(fn: Function): void {\n this.cleanupCallbacks.add(fn);\n }\n\n /**\n * Exits the runner, by closing the managed Chromium instance.\n */\n async exit(): Promise<void> {\n this.exiting = true;\n\n // Wait for the setup to complete if the extension runner is already\n // being started.\n if (this._promiseSetupDone) {\n // Ignore initialization errors if any.\n await this._promiseSetupDone.catch((err) => {\n log.debug(`ignored setup error on chromium runner shutdown: ${err}`);\n });\n }\n\n if (this.chromiumInstance) {\n await this.chromiumInstance.kill();\n this.chromiumInstance = null;\n }\n\n if (this.wss) {\n // Close all websocket clients, closing the WebSocketServer\n // does not terminate the existing connection and it wouldn't\n // resolve until all of the existing connections are closed.\n for (const wssClient of this.wss?.clients || []) {\n if (wssClient.readyState === WebSocket.OPEN) {\n wssClient.terminate();\n }\n }\n await new Promise((resolve) =>\n this.wss ? this.wss.close(resolve) : resolve());\n this.wss = null;\n }\n\n // Call all the registered cleanup callbacks.\n for (const fn of this.cleanupCallbacks) {\n try {\n fn();\n } catch (error) {\n log.error(error);\n }\n }\n }\n}\n"],"mappings":"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"}