web-ext 7.11.0 → 8.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.
- package/README.md +6 -8
- package/bin/web-ext.js +1 -1
- package/lib/cmd/build.js +1 -3
- 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/dump-config.js +6 -0
- package/lib/cmd/dump-config.js.map +1 -0
- package/lib/cmd/index.js +16 -8
- package/lib/cmd/index.js.map +1 -1
- package/lib/cmd/lint.js +0 -8
- package/lib/cmd/lint.js.map +1 -1
- package/lib/cmd/run.js +0 -7
- package/lib/cmd/run.js.map +1 -1
- package/lib/cmd/sign.js +29 -85
- package/lib/cmd/sign.js.map +1 -1
- package/lib/config.js +53 -7
- package/lib/config.js.map +1 -1
- package/lib/errors.js.map +1 -1
- package/lib/extension-runners/chromium.js +11 -3
- package/lib/extension-runners/chromium.js.map +1 -1
- package/lib/extension-runners/firefox-android.js +15 -3
- package/lib/extension-runners/firefox-android.js.map +1 -1
- package/lib/extension-runners/firefox-desktop.js +7 -8
- package/lib/extension-runners/firefox-desktop.js.map +1 -1
- package/lib/extension-runners/index.js +2 -2
- package/lib/extension-runners/index.js.map +1 -1
- package/lib/firefox/index.js +1 -8
- package/lib/firefox/index.js.map +1 -1
- package/lib/firefox/package-identifiers.js +3 -1
- package/lib/firefox/package-identifiers.js.map +1 -1
- package/lib/firefox/preferences.js +0 -2
- package/lib/firefox/preferences.js.map +1 -1
- package/lib/firefox/rdp-client.js +10 -2
- package/lib/firefox/rdp-client.js.map +1 -1
- package/lib/firefox/remote.js +3 -2
- package/lib/firefox/remote.js.map +1 -1
- package/lib/main.js.map +1 -1
- package/lib/program.js +25 -48
- package/lib/program.js.map +1 -1
- package/lib/util/adb.js +26 -10
- package/lib/util/adb.js.map +1 -1
- package/lib/util/artifacts.js.map +1 -1
- package/lib/util/desktop-notifier.js.map +1 -1
- package/lib/util/file-exists.js +1 -0
- package/lib/util/file-exists.js.map +1 -1
- package/lib/util/file-filter.js +2 -0
- package/lib/util/file-filter.js.map +1 -1
- package/lib/util/is-directory.js.map +1 -1
- package/lib/util/logger.js +5 -5
- package/lib/util/logger.js.map +1 -1
- package/lib/util/manifest.js +1 -1
- package/lib/util/manifest.js.map +1 -1
- package/lib/util/promisify.js +0 -7
- package/lib/util/promisify.js.map +1 -1
- package/lib/util/stdin.js +0 -2
- package/lib/util/stdin.js.map +1 -1
- package/lib/util/submit-addon.js +214 -50
- package/lib/util/submit-addon.js.map +1 -1
- package/lib/util/temp-dir.js +2 -0
- package/lib/util/temp-dir.js.map +1 -1
- package/lib/util/updates.js.map +1 -1
- package/lib/watcher.js.map +1 -1
- package/package.json +38 -40
- package/lib/extension-runners/base.js +0 -2
- package/lib/extension-runners/base.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferences.js","names":["WebExtError","UsageError","createLogger","log","import","meta","url","nonOverridablePreferences","prefsCommon","prefsFennec","prefsFirefox","prefs","common","fennec","firefox","getPrefs","app","appPrefs","coerceCLICustomPreference","cliPrefs","customPrefs","pref","prefsAry","split","length","key","value","slice","join","test","parseInt","includes","warn"],"sources":["../../src/firefox/preferences.js"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"preferences.js","names":["WebExtError","UsageError","createLogger","log","import","meta","url","nonOverridablePreferences","prefsCommon","prefsFennec","prefsFirefox","prefs","common","fennec","firefox","getPrefs","app","appPrefs","coerceCLICustomPreference","cliPrefs","customPrefs","pref","prefsAry","split","length","key","value","slice","join","test","parseInt","includes","warn"],"sources":["../../src/firefox/preferences.js"],"sourcesContent":["import { WebExtError, UsageError } from '../errors.js';\nimport { createLogger } from '../util/logger.js';\n\nconst log = createLogger(import.meta.url);\n\nexport const nonOverridablePreferences = [\n 'devtools.debugger.remote-enabled',\n 'devtools.debugger.prompt-connection',\n 'xpinstall.signatures.required',\n];\n\n// Preferences Maps\n\nconst prefsCommon = {\n // Allow debug output via dump to be printed to the system console\n 'browser.dom.window.dump.enabled': true,\n\n // From:\n // https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/internals/preferences.html#data-choices-notification\n // This is the data submission master kill switch. If disabled, no policy is shown or upload takes place, ever.\n 'datareporting.policy.dataSubmissionEnabled': false,\n\n // Allow remote connections to the debugger.\n 'devtools.debugger.remote-enabled': true,\n // Disable the prompt for allowing connections.\n 'devtools.debugger.prompt-connection': false,\n // Allow extensions to log messages on browser's console.\n 'devtools.browserconsole.contentMessages': true,\n\n // Turn off platform logging because it is a lot of info.\n 'extensions.logging.enabled': false,\n\n // Disable extension updates and notifications.\n 'extensions.checkCompatibility.nightly': false,\n 'extensions.update.enabled': false,\n 'extensions.update.notifyUser': false,\n\n // From:\n // http://hg.mozilla.org/mozilla-central/file/1dd81c324ac7/build/automation.py.in//l372\n // Only load extensions from the application and user profile.\n // AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION\n 'extensions.enabledScopes': 5,\n // Disable metadata caching for installed add-ons by default.\n 'extensions.getAddons.cache.enabled': false,\n // Disable intalling any distribution add-ons.\n 'extensions.installDistroAddons': false,\n // Allow installing extensions dropped into the profile folder.\n 'extensions.autoDisableScopes': 10,\n\n // Disable app update.\n 'app.update.enabled': false,\n\n // Allow unsigned add-ons.\n 'xpinstall.signatures.required': false,\n\n // browser.link.open_newwindow is changed from 3 to 2 in:\n // https://github.com/saadtazi/firefox-profile-js/blob/cafc793d940a779d280103ae17d02a92de862efc/lib/firefox_profile.js#L32\n // Restore original value to avoid https://github.com/mozilla/web-ext/issues/1592\n 'browser.link.open_newwindow': 3,\n};\n\n// Prefs specific to Firefox for Android.\nconst prefsFennec = {\n 'browser.console.showInPanel': true,\n 'browser.firstrun.show.uidiscovery': false,\n 'devtools.remote.usb.enabled': true,\n};\n\n// Prefs specific to Firefox for desktop.\nconst prefsFirefox = {\n 'browser.startup.homepage': 'about:blank',\n 'startup.homepage_welcome_url': 'about:blank',\n 'startup.homepage_welcome_url.additional': '',\n 'devtools.errorconsole.enabled': true,\n 'devtools.chrome.enabled': true,\n\n // From:\n // http://hg.mozilla.org/mozilla-central/file/1dd81c324ac7/build/automation.py.in//l388\n // Make url-classifier updates so rare that they won't affect tests.\n 'urlclassifier.updateinterval': 172800,\n // Point the url-classifier to a nonexistent local URL for fast failures.\n 'browser.safebrowsing.provider.0.gethashURL':\n 'http://localhost/safebrowsing-dummy/gethash',\n 'browser.safebrowsing.provider.0.keyURL':\n 'http://localhost/safebrowsing-dummy/newkey',\n 'browser.safebrowsing.provider.0.updateURL':\n 'http://localhost/safebrowsing-dummy/update',\n\n // Disable self repair/SHIELD\n 'browser.selfsupport.url': 'https://localhost/selfrepair',\n // Disable Reader Mode UI tour\n 'browser.reader.detectedFirstArticle': true,\n\n // Set the policy firstURL to an empty string to prevent\n // the privacy info page to be opened on every \"web-ext run\".\n // (See #1114 for rationale)\n 'datareporting.policy.firstRunURL': '',\n};\n\nconst prefs = {\n common: prefsCommon,\n fennec: prefsFennec,\n firefox: prefsFirefox,\n};\n\n// Module exports\n\nexport function getPrefs(app = 'firefox') {\n const appPrefs = prefs[app];\n if (!appPrefs) {\n throw new WebExtError(`Unsupported application: ${app}`);\n }\n return {\n ...prefsCommon,\n ...appPrefs,\n };\n}\n\nexport function coerceCLICustomPreference(cliPrefs) {\n const customPrefs = {};\n\n for (const pref of cliPrefs) {\n const prefsAry = pref.split('=');\n\n if (prefsAry.length < 2) {\n throw new UsageError(\n `Incomplete custom preference: \"${pref}\". ` +\n 'Syntax expected: \"prefname=prefvalue\".',\n );\n }\n\n const key = prefsAry[0];\n let value = prefsAry.slice(1).join('=');\n\n if (/[^\\w{@}.-]/.test(key)) {\n throw new UsageError(`Invalid custom preference name: ${key}`);\n }\n\n if (value === `${parseInt(value)}`) {\n value = parseInt(value, 10);\n } else if (value === 'true' || value === 'false') {\n value = value === 'true';\n }\n\n if (nonOverridablePreferences.includes(key)) {\n log.warn(`'${key}' preference cannot be customized.`);\n continue;\n }\n customPrefs[`${key}`] = value;\n }\n\n return customPrefs;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -50,6 +50,14 @@ export function connectToFirefox(port) {
|
|
|
50
50
|
return client.connect(port).then(() => client);
|
|
51
51
|
}
|
|
52
52
|
export default class FirefoxRDPClient extends EventEmitter {
|
|
53
|
+
_incoming;
|
|
54
|
+
_pending;
|
|
55
|
+
_active;
|
|
56
|
+
_rdpConnection;
|
|
57
|
+
_onData;
|
|
58
|
+
_onError;
|
|
59
|
+
_onEnd;
|
|
60
|
+
_onTimeout;
|
|
53
61
|
constructor() {
|
|
54
62
|
super();
|
|
55
63
|
this._incoming = Buffer.alloc(0);
|
|
@@ -187,9 +195,9 @@ export default class FirefoxRDPClient extends EventEmitter {
|
|
|
187
195
|
const deferred = this._active.get(rdpData.from);
|
|
188
196
|
this._active.delete(rdpData.from);
|
|
189
197
|
if (rdpData.error) {
|
|
190
|
-
deferred === null || deferred === void 0
|
|
198
|
+
deferred === null || deferred === void 0 || deferred.reject(rdpData);
|
|
191
199
|
} else {
|
|
192
|
-
deferred === null || deferred === void 0
|
|
200
|
+
deferred === null || deferred === void 0 || deferred.resolve(rdpData);
|
|
193
201
|
}
|
|
194
202
|
this._flushPendingRequests();
|
|
195
203
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rdp-client.js","names":["net","EventEmitter","domain","DEFAULT_PORT","DEFAULT_HOST","UNSOLICITED_EVENTS","Set","parseRDPMessage","data","str","toString","sepIdx","indexOf","byteLen","parseInt","slice","isNaN","error","Error","fatal","length","msg","rdpMessage","JSON","parse","connectToFirefox","port","client","FirefoxRDPClient","connect","then","constructor","_incoming","Buffer","alloc","_pending","_active","Map","_onData","args","onData","_onError","onError","_onEnd","onEnd","_onTimeout","onTimeout","Promise","resolve","reject","d","create","once","run","conn","createConnection","host","_rdpConnection","on","_expectReply","disconnect","off","end","_rejectAllRequests","activeDeferred","values","clear","deferred","request","requestProps","to","type","push","_flushPendingRequests","filter","has","stringify","from","write","err","targetActor","set","_handleMessage","rdpData","emit","get","delete","_readMessage","String","concat"],"sources":["../../src/firefox/rdp-client.js"],"sourcesContent":["/* @flow */\nimport net from 'net';\nimport EventEmitter from 'events';\nimport domain from 'domain';\n\nexport type RDPRequest = {\n to: string,\n type: string,\n};\n\nexport type RDPResult = {\n from: string,\n type: string,\n};\n\nexport type Deferred = {|\n resolve: Function,\n reject: Function,\n|};\n\ntype ParseResult = {|\n data: Buffer,\n rdpMessage?: Object,\n error?: Error,\n fatal?: boolean,\n|};\n\nexport const DEFAULT_PORT = 6000;\nexport const DEFAULT_HOST = '127.0.0.1';\n\nconst UNSOLICITED_EVENTS = new Set([\n 'tabNavigated',\n 'styleApplied',\n 'propertyChange',\n 'networkEventUpdate',\n 'networkEvent',\n 'propertyChange',\n 'newMutations',\n 'frameUpdate',\n 'tabListChanged',\n]);\n\n// Parse RDP packets: BYTE_LENGTH + ':' + DATA.\nexport function parseRDPMessage(data: Buffer): ParseResult {\n const str = data.toString();\n const sepIdx = str.indexOf(':');\n if (sepIdx < 1) {\n return { data };\n }\n\n const byteLen = parseInt(str.slice(0, sepIdx));\n if (isNaN(byteLen)) {\n const error = new Error('Error parsing RDP message length');\n return { data, error, fatal: true };\n }\n\n if (data.length - (sepIdx + 1) < byteLen) {\n // Can't parse yet, will retry once more data has been received.\n return { data };\n }\n\n data = data.slice(sepIdx + 1);\n const msg = data.slice(0, byteLen);\n data = data.slice(byteLen);\n\n try {\n return { data, rdpMessage: JSON.parse(msg.toString()) };\n } catch (error) {\n return { data, error, fatal: false };\n }\n}\n\nexport function connectToFirefox(port: number): Promise<FirefoxRDPClient> {\n const client = new FirefoxRDPClient();\n return client.connect(port).then(() => client);\n}\n\nexport default class FirefoxRDPClient extends EventEmitter {\n _incoming: Buffer;\n _pending: Array<{| request: RDPRequest, deferred: Deferred |}>;\n _active: Map<string, Deferred>;\n _rdpConnection: net.Socket;\n _onData: Function;\n _onError: Function;\n _onEnd: Function;\n _onTimeout: Function;\n\n constructor() {\n super();\n this._incoming = Buffer.alloc(0);\n this._pending = [];\n this._active = new Map();\n\n this._onData = (...args) => this.onData(...args);\n this._onError = (...args) => this.onError(...args);\n this._onEnd = (...args) => this.onEnd(...args);\n this._onTimeout = (...args) => this.onTimeout(...args);\n }\n\n connect(port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n // Create a domain to wrap the errors that may be triggered\n // by creating the client connection (e.g. ECONNREFUSED)\n // so that we can reject the promise returned instead of\n // exiting the entire process.\n const d = domain.create();\n d.once('error', reject);\n d.run(() => {\n const conn = net.createConnection({\n port,\n host: DEFAULT_HOST,\n });\n\n this._rdpConnection = conn;\n conn.on('data', this._onData);\n conn.on('error', this._onError);\n conn.on('end', this._onEnd);\n conn.on('timeout', this._onTimeout);\n\n // Resolve once the expected initial root message\n // has been received.\n this._expectReply('root', { resolve, reject });\n });\n });\n }\n\n disconnect(): void {\n if (!this._rdpConnection) {\n return;\n }\n\n const conn = this._rdpConnection;\n conn.off('data', this._onData);\n conn.off('error', this._onError);\n conn.off('end', this._onEnd);\n conn.off('timeout', this._onTimeout);\n conn.end();\n\n this._rejectAllRequests(new Error('RDP connection closed'));\n }\n\n _rejectAllRequests(error: Error) {\n for (const activeDeferred of this._active.values()) {\n activeDeferred.reject(error);\n }\n this._active.clear();\n\n for (const { deferred } of this._pending) {\n deferred.reject(error);\n }\n this._pending = [];\n }\n\n async request(requestProps: string | RDPRequest): Promise<RDPResult> {\n let request: RDPRequest;\n\n if (typeof requestProps === 'string') {\n request = { to: 'root', type: requestProps };\n } else {\n request = requestProps;\n }\n\n if (request.to == null) {\n throw new Error(\n `Unexpected RDP request without target actor: ${request.type}`\n );\n }\n\n return new Promise((resolve, reject) => {\n const deferred = { resolve, reject };\n this._pending.push({ request, deferred });\n this._flushPendingRequests();\n });\n }\n\n _flushPendingRequests(): void {\n this._pending = this._pending.filter(({ request, deferred }) => {\n if (this._active.has(request.to)) {\n // Keep in the pending requests until there are no requests\n // active on the target RDP actor.\n return true;\n }\n\n const conn = this._rdpConnection;\n if (!conn) {\n throw new Error('RDP connection closed');\n }\n\n try {\n let str = JSON.stringify(request);\n str = `${Buffer.from(str).length}:${str}`;\n conn.write(str);\n this._expectReply(request.to, deferred);\n } catch (err) {\n deferred.reject(err);\n }\n\n // Remove the pending request from the queue.\n return false;\n });\n }\n\n _expectReply(targetActor: string, deferred: Deferred): void {\n if (this._active.has(targetActor)) {\n throw new Error(`${targetActor} does already have an active request`);\n }\n\n this._active.set(targetActor, deferred);\n }\n\n _handleMessage(rdpData: Object): void {\n if (rdpData.from == null) {\n if (rdpData.error) {\n this.emit('rdp-error', rdpData);\n return;\n }\n\n this.emit(\n 'error',\n new Error(\n `Received an RDP message without a sender actor: ${JSON.stringify(\n rdpData\n )}`\n )\n );\n return;\n }\n\n if (UNSOLICITED_EVENTS.has(rdpData.type)) {\n this.emit('unsolicited-event', rdpData);\n return;\n }\n\n if (this._active.has(rdpData.from)) {\n const deferred = this._active.get(rdpData.from);\n this._active.delete(rdpData.from);\n if (rdpData.error) {\n deferred?.reject(rdpData);\n } else {\n deferred?.resolve(rdpData);\n }\n this._flushPendingRequests();\n return;\n }\n\n this.emit(\n 'error',\n new Error(`Unexpected RDP message received: ${JSON.stringify(rdpData)}`)\n );\n }\n\n _readMessage(): boolean {\n const { data, rdpMessage, error, fatal } = parseRDPMessage(this._incoming);\n\n this._incoming = data;\n\n if (error) {\n this.emit(\n 'error',\n new Error(`Error parsing RDP packet: ${String(error)}`)\n );\n // Disconnect automatically on a fatal error.\n if (fatal) {\n this.disconnect();\n }\n // Caller can parse the next message if the error wasn't fatal\n // (e.g. the RDP packet that couldn't be parsed has been already\n // removed from the incoming data buffer).\n return !fatal;\n }\n\n if (!rdpMessage) {\n // Caller will need to wait more data to parse the next message.\n return false;\n }\n\n this._handleMessage(rdpMessage);\n // Caller can try to parse the next message from the remining data.\n return true;\n }\n\n onData(data: Buffer) {\n this._incoming = Buffer.concat([this._incoming, data]);\n while (this._readMessage()) {\n // Keep parsing and handling messages until readMessage\n // returns false.\n }\n }\n\n onError(error: Error) {\n this.emit('error', error);\n }\n\n onEnd() {\n this.emit('end');\n }\n\n onTimeout() {\n this.emit('timeout');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rdp-client.js","names":["net","EventEmitter","domain","DEFAULT_PORT","DEFAULT_HOST","UNSOLICITED_EVENTS","Set","parseRDPMessage","data","str","toString","sepIdx","indexOf","byteLen","parseInt","slice","isNaN","error","Error","fatal","length","msg","rdpMessage","JSON","parse","connectToFirefox","port","client","FirefoxRDPClient","connect","then","_incoming","_pending","_active","_rdpConnection","_onData","_onError","_onEnd","_onTimeout","constructor","Buffer","alloc","Map","args","onData","onError","onEnd","onTimeout","Promise","resolve","reject","d","create","once","run","conn","createConnection","host","on","_expectReply","disconnect","off","end","_rejectAllRequests","activeDeferred","values","clear","deferred","request","requestProps","to","type","push","_flushPendingRequests","filter","has","stringify","from","write","err","targetActor","set","_handleMessage","rdpData","emit","get","delete","_readMessage","String","concat"],"sources":["../../src/firefox/rdp-client.js"],"sourcesContent":["import net from 'net';\nimport EventEmitter from 'events';\nimport domain from 'domain';\n\nexport const DEFAULT_PORT = 6000;\nexport const DEFAULT_HOST = '127.0.0.1';\n\nconst UNSOLICITED_EVENTS = new Set([\n 'tabNavigated',\n 'styleApplied',\n 'propertyChange',\n 'networkEventUpdate',\n 'networkEvent',\n 'propertyChange',\n 'newMutations',\n 'frameUpdate',\n 'tabListChanged',\n]);\n\n// Parse RDP packets: BYTE_LENGTH + ':' + DATA.\nexport function parseRDPMessage(data) {\n const str = data.toString();\n const sepIdx = str.indexOf(':');\n if (sepIdx < 1) {\n return { data };\n }\n\n const byteLen = parseInt(str.slice(0, sepIdx));\n if (isNaN(byteLen)) {\n const error = new Error('Error parsing RDP message length');\n return { data, error, fatal: true };\n }\n\n if (data.length - (sepIdx + 1) < byteLen) {\n // Can't parse yet, will retry once more data has been received.\n return { data };\n }\n\n data = data.slice(sepIdx + 1);\n const msg = data.slice(0, byteLen);\n data = data.slice(byteLen);\n\n try {\n return { data, rdpMessage: JSON.parse(msg.toString()) };\n } catch (error) {\n return { data, error, fatal: false };\n }\n}\n\nexport function connectToFirefox(port) {\n const client = new FirefoxRDPClient();\n return client.connect(port).then(() => client);\n}\n\nexport default class FirefoxRDPClient extends EventEmitter {\n _incoming;\n _pending;\n _active;\n _rdpConnection;\n _onData;\n _onError;\n _onEnd;\n _onTimeout;\n\n constructor() {\n super();\n this._incoming = Buffer.alloc(0);\n this._pending = [];\n this._active = new Map();\n\n this._onData = (...args) => this.onData(...args);\n this._onError = (...args) => this.onError(...args);\n this._onEnd = (...args) => this.onEnd(...args);\n this._onTimeout = (...args) => this.onTimeout(...args);\n }\n\n connect(port) {\n return new Promise((resolve, reject) => {\n // Create a domain to wrap the errors that may be triggered\n // by creating the client connection (e.g. ECONNREFUSED)\n // so that we can reject the promise returned instead of\n // exiting the entire process.\n const d = domain.create();\n d.once('error', reject);\n d.run(() => {\n const conn = net.createConnection({\n port,\n host: DEFAULT_HOST,\n });\n\n this._rdpConnection = conn;\n conn.on('data', this._onData);\n conn.on('error', this._onError);\n conn.on('end', this._onEnd);\n conn.on('timeout', this._onTimeout);\n\n // Resolve once the expected initial root message\n // has been received.\n this._expectReply('root', { resolve, reject });\n });\n });\n }\n\n disconnect() {\n if (!this._rdpConnection) {\n return;\n }\n\n const conn = this._rdpConnection;\n conn.off('data', this._onData);\n conn.off('error', this._onError);\n conn.off('end', this._onEnd);\n conn.off('timeout', this._onTimeout);\n conn.end();\n\n this._rejectAllRequests(new Error('RDP connection closed'));\n }\n\n _rejectAllRequests(error) {\n for (const activeDeferred of this._active.values()) {\n activeDeferred.reject(error);\n }\n this._active.clear();\n\n for (const { deferred } of this._pending) {\n deferred.reject(error);\n }\n this._pending = [];\n }\n\n async request(requestProps) {\n let request;\n\n if (typeof requestProps === 'string') {\n request = { to: 'root', type: requestProps };\n } else {\n request = requestProps;\n }\n\n if (request.to == null) {\n throw new Error(\n `Unexpected RDP request without target actor: ${request.type}`,\n );\n }\n\n return new Promise((resolve, reject) => {\n const deferred = { resolve, reject };\n this._pending.push({ request, deferred });\n this._flushPendingRequests();\n });\n }\n\n _flushPendingRequests() {\n this._pending = this._pending.filter(({ request, deferred }) => {\n if (this._active.has(request.to)) {\n // Keep in the pending requests until there are no requests\n // active on the target RDP actor.\n return true;\n }\n\n const conn = this._rdpConnection;\n if (!conn) {\n throw new Error('RDP connection closed');\n }\n\n try {\n let str = JSON.stringify(request);\n str = `${Buffer.from(str).length}:${str}`;\n conn.write(str);\n this._expectReply(request.to, deferred);\n } catch (err) {\n deferred.reject(err);\n }\n\n // Remove the pending request from the queue.\n return false;\n });\n }\n\n _expectReply(targetActor, deferred) {\n if (this._active.has(targetActor)) {\n throw new Error(`${targetActor} does already have an active request`);\n }\n\n this._active.set(targetActor, deferred);\n }\n\n _handleMessage(rdpData) {\n if (rdpData.from == null) {\n if (rdpData.error) {\n this.emit('rdp-error', rdpData);\n return;\n }\n\n this.emit(\n 'error',\n new Error(\n `Received an RDP message without a sender actor: ${JSON.stringify(\n rdpData,\n )}`,\n ),\n );\n return;\n }\n\n if (UNSOLICITED_EVENTS.has(rdpData.type)) {\n this.emit('unsolicited-event', rdpData);\n return;\n }\n\n if (this._active.has(rdpData.from)) {\n const deferred = this._active.get(rdpData.from);\n this._active.delete(rdpData.from);\n if (rdpData.error) {\n deferred?.reject(rdpData);\n } else {\n deferred?.resolve(rdpData);\n }\n this._flushPendingRequests();\n return;\n }\n\n this.emit(\n 'error',\n new Error(`Unexpected RDP message received: ${JSON.stringify(rdpData)}`),\n );\n }\n\n _readMessage() {\n const { data, rdpMessage, error, fatal } = parseRDPMessage(this._incoming);\n\n this._incoming = data;\n\n if (error) {\n this.emit(\n 'error',\n new Error(`Error parsing RDP packet: ${String(error)}`),\n );\n // Disconnect automatically on a fatal error.\n if (fatal) {\n this.disconnect();\n }\n // Caller can parse the next message if the error wasn't fatal\n // (e.g. the RDP packet that couldn't be parsed has been already\n // removed from the incoming data buffer).\n return !fatal;\n }\n\n if (!rdpMessage) {\n // Caller will need to wait more data to parse the next message.\n return false;\n }\n\n this._handleMessage(rdpMessage);\n // Caller can try to parse the next message from the remining data.\n return true;\n }\n\n onData(data) {\n this._incoming = Buffer.concat([this._incoming, data]);\n while (this._readMessage()) {\n // Keep parsing and handling messages until readMessage\n // returns false.\n }\n }\n\n onError(error) {\n this.emit('error', error);\n }\n\n onEnd() {\n this.emit('end');\n }\n\n onTimeout() {\n this.emit('timeout');\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/firefox/remote.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import net from 'net';
|
|
2
|
-
import
|
|
2
|
+
import { connectToFirefox as defaultFirefoxConnector } from './rdp-client.js';
|
|
3
3
|
import { createLogger } from '../util/logger.js';
|
|
4
4
|
import { isErrorWithCode, RemoteTempInstallNotSupported, UsageError, WebExtError } from '../errors.js';
|
|
5
5
|
const log = createLogger(import.meta.url);
|
|
@@ -14,6 +14,8 @@ function requestErrorToMessage(err) {
|
|
|
14
14
|
return `${err.error}: ${err.message}`;
|
|
15
15
|
}
|
|
16
16
|
export class RemoteFirefox {
|
|
17
|
+
client;
|
|
18
|
+
checkedForAddonReloading;
|
|
17
19
|
constructor(client) {
|
|
18
20
|
this.client = client;
|
|
19
21
|
this.checkedForAddonReloading = false;
|
|
@@ -182,7 +184,6 @@ export async function connectWithMaxRetries(
|
|
|
182
184
|
export function findFreeTcpPort() {
|
|
183
185
|
return new Promise(resolve => {
|
|
184
186
|
const srv = net.createServer();
|
|
185
|
-
// $FlowFixMe: signature for listen() is missing - see https://github.com/facebook/flow/pull/8290
|
|
186
187
|
srv.listen(0, '127.0.0.1', () => {
|
|
187
188
|
const freeTcpPort = srv.address().port;
|
|
188
189
|
srv.close(() => resolve(freeTcpPort));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","names":["net","FirefoxRDPClient","connectToFirefox","defaultFirefoxConnector","createLogger","isErrorWithCode","RemoteTempInstallNotSupported","UsageError","WebExtError","log","import","meta","url","requestErrorToMessage","err","Error","String","error","message","RemoteFirefox","constructor","client","checkedForAddonReloading","on","debug","info","JSON","stringify","rdpError","disconnect","addonRequest","addon","request","response","to","actor","type","getAddonsActor","addonsActor","Promise","reject","installTemporaryAddon","addonPath","openDevTools","getInstalledAddon","addonId","addons","id","map","a","checkForAddonReloading","requestTypes","indexOf","supportedRequestTypes","reloadAddon","process","stdout","write","Date","toTimeString","connect","port","connectWithMaxRetries","maxRetries","retryInterval","establishConnection","lastError","retries","resolve","setTimeout","stack","findFreeTcpPort","srv","createServer","listen","freeTcpPort","address","close"],"sources":["../../src/firefox/remote.js"],"sourcesContent":["/* @flow */\nimport net from 'net';\n\nimport FirefoxRDPClient, {\n connectToFirefox as defaultFirefoxConnector,\n} from './rdp-client.js';\nimport { createLogger } from '../util/logger.js';\nimport {\n isErrorWithCode,\n RemoteTempInstallNotSupported,\n UsageError,\n WebExtError,\n} from '../errors.js';\n\nconst log = createLogger(import.meta.url);\n\nexport type FirefoxConnectorFn = (port: number) => Promise<FirefoxRDPClient>;\n\nexport type FirefoxRDPAddonActor = {|\n id: string,\n actor: string,\n|};\n\nexport type FirefoxRDPResponseError = {|\n error: string,\n message: string,\n|};\n\nexport type FirefoxRDPResponseAddon = {|\n addon: FirefoxRDPAddonActor,\n|};\n\nexport type FirefoxRDPResponseRequestTypes = {|\n requestTypes: Array<string>,\n|};\n\n// NOTE: this type aliases Object to catch any other possible response.\nexport type FirefoxRDPResponseAny = Object;\n\nexport type FirefoxRDPResponseMaybe =\n | FirefoxRDPResponseRequestTypes\n | FirefoxRDPResponseAny;\n\n// Convert a request rejection to a message string.\nfunction requestErrorToMessage(err: Error | FirefoxRDPResponseError) {\n if (err instanceof Error) {\n return String(err);\n }\n return `${err.error}: ${err.message}`;\n}\n\nexport class RemoteFirefox {\n client: Object;\n checkedForAddonReloading: boolean;\n\n constructor(client: FirefoxRDPClient) {\n this.client = client;\n this.checkedForAddonReloading = false;\n\n client.on('disconnect', () => {\n log.debug('Received \"disconnect\" from Firefox client');\n });\n client.on('end', () => {\n log.debug('Received \"end\" from Firefox client');\n });\n client.on('unsolicited-event', (info) => {\n log.debug(`Received message from client: ${JSON.stringify(info)}`);\n });\n client.on('rdp-error', (rdpError) => {\n log.debug(`Received error from client: ${JSON.stringify(rdpError)}`);\n });\n client.on('error', (error) => {\n log.debug(`Received error from client: ${String(error)}`);\n });\n }\n\n disconnect() {\n this.client.disconnect();\n }\n\n async addonRequest(\n addon: FirefoxRDPAddonActor,\n request: string\n ): Promise<FirefoxRDPResponseMaybe> {\n try {\n const response = await this.client.request({\n to: addon.actor,\n type: request,\n });\n return response;\n } catch (err) {\n log.debug(`Client responded to '${request}' request with error:`, err);\n const message = requestErrorToMessage(err);\n throw new WebExtError(`Remote Firefox: addonRequest() error: ${message}`);\n }\n }\n\n async getAddonsActor(): Promise<string> {\n try {\n // getRoot should work since Firefox 55 (bug 1352157).\n const response = await this.client.request('getRoot');\n if (response.addonsActor == null) {\n return Promise.reject(\n new RemoteTempInstallNotSupported(\n 'This version of Firefox does not provide an add-ons actor for ' +\n 'remote installation.'\n )\n );\n }\n return response.addonsActor;\n } catch (err) {\n // Fallback to listTabs otherwise, Firefox 49 - 77 (bug 1618691).\n log.debug('Falling back to listTabs because getRoot failed', err);\n }\n\n try {\n const response = await this.client.request('listTabs');\n // addonsActor was added to listTabs in Firefox 49 (bug 1273183).\n if (response.addonsActor == null) {\n log.debug(\n 'listTabs returned a falsey addonsActor: ' +\n `${JSON.stringify(response)}`\n );\n return Promise.reject(\n new RemoteTempInstallNotSupported(\n 'This is an older version of Firefox that does not provide an ' +\n 'add-ons actor for remote installation. Try Firefox 49 or ' +\n 'higher.'\n )\n );\n }\n return response.addonsActor;\n } catch (err) {\n log.debug('listTabs error', err);\n const message = requestErrorToMessage(err);\n throw new WebExtError(`Remote Firefox: listTabs() error: ${message}`);\n }\n }\n\n async installTemporaryAddon(\n addonPath: string,\n openDevTools?: boolean\n ): Promise<FirefoxRDPResponseAddon> {\n const addonsActor = await this.getAddonsActor();\n\n try {\n const response = await this.client.request({\n to: addonsActor,\n type: 'installTemporaryAddon',\n addonPath,\n openDevTools,\n });\n log.debug(`installTemporaryAddon: ${JSON.stringify(response)}`);\n log.info(`Installed ${addonPath} as a temporary add-on`);\n return response;\n } catch (err) {\n const message = requestErrorToMessage(err);\n throw new WebExtError(`installTemporaryAddon: Error: ${message}`);\n }\n }\n\n async getInstalledAddon(addonId: string): Promise<FirefoxRDPAddonActor> {\n try {\n const response = await this.client.request('listAddons');\n for (const addon of response.addons) {\n if (addon.id === addonId) {\n return addon;\n }\n }\n log.debug(\n `Remote Firefox has these addons: ${response.addons.map((a) => a.id)}`\n );\n return Promise.reject(\n new WebExtError(\n 'The remote Firefox does not have your extension installed'\n )\n );\n } catch (err) {\n const message = requestErrorToMessage(err);\n throw new WebExtError(`Remote Firefox: listAddons() error: ${message}`);\n }\n }\n\n async checkForAddonReloading(\n addon: FirefoxRDPAddonActor\n ): Promise<FirefoxRDPAddonActor> {\n if (this.checkedForAddonReloading) {\n // We only need to check once if reload() is supported.\n return addon;\n } else {\n const response = await this.addonRequest(addon, 'requestTypes');\n\n if (response.requestTypes.indexOf('reload') === -1) {\n const supportedRequestTypes = JSON.stringify(response.requestTypes);\n log.debug(`Remote Firefox only supports: ${supportedRequestTypes}`);\n throw new UsageError(\n 'This Firefox version does not support add-on reloading. ' +\n 'Re-run with --no-reload'\n );\n } else {\n this.checkedForAddonReloading = true;\n return addon;\n }\n }\n }\n\n async reloadAddon(addonId: string): Promise<void> {\n const addon = await this.getInstalledAddon(addonId);\n await this.checkForAddonReloading(addon);\n await this.addonRequest(addon, 'reload');\n process.stdout.write(\n `\\rLast extension reload: ${new Date().toTimeString()}`\n );\n log.debug('\\n');\n }\n}\n\n// Connect types and implementation\n\nexport type ConnectOptions = {\n connectToFirefox: FirefoxConnectorFn,\n};\n\nexport async function connect(\n port: number,\n { connectToFirefox = defaultFirefoxConnector }: ConnectOptions = {}\n): Promise<RemoteFirefox> {\n log.debug(`Connecting to Firefox on port ${port}`);\n const client = await connectToFirefox(port);\n log.debug(`Connected to the remote Firefox debugger on port ${port}`);\n return new RemoteFirefox(client);\n}\n\n// ConnectWithMaxRetries types and implementation\n\nexport type ConnectWithMaxRetriesParams = {|\n maxRetries?: number,\n retryInterval?: number,\n port: number,\n|};\n\nexport type ConnectWithMaxRetriesDeps = {\n connectToFirefox: typeof connect,\n};\n\nexport async function connectWithMaxRetries(\n // A max of 250 will try connecting for 30 seconds.\n { maxRetries = 250, retryInterval = 120, port }: ConnectWithMaxRetriesParams,\n { connectToFirefox = connect }: ConnectWithMaxRetriesDeps = {}\n): Promise<RemoteFirefox> {\n async function establishConnection() {\n var lastError;\n\n for (let retries = 0; retries <= maxRetries; retries++) {\n try {\n return await connectToFirefox(port);\n } catch (error) {\n if (isErrorWithCode('ECONNREFUSED', error)) {\n // Wait for `retryInterval` ms.\n await new Promise((resolve) => {\n setTimeout(resolve, retryInterval);\n });\n\n lastError = error;\n log.debug(\n `Retrying Firefox (${retries}); connection error: ${error}`\n );\n } else {\n log.error(error.stack);\n throw error;\n }\n }\n }\n\n log.debug('Connect to Firefox debugger: too many retries');\n throw lastError;\n }\n\n log.debug('Connecting to the remote Firefox debugger');\n return establishConnection();\n}\n\nexport function findFreeTcpPort(): Promise<number> {\n return new Promise((resolve) => {\n const srv = net.createServer();\n // $FlowFixMe: signature for listen() is missing - see https://github.com/facebook/flow/pull/8290\n srv.listen(0, '127.0.0.1', () => {\n const freeTcpPort = srv.address().port;\n srv.close(() => resolve(freeTcpPort));\n });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"remote.js","names":["net","connectToFirefox","defaultFirefoxConnector","createLogger","isErrorWithCode","RemoteTempInstallNotSupported","UsageError","WebExtError","log","import","meta","url","requestErrorToMessage","err","Error","String","error","message","RemoteFirefox","client","checkedForAddonReloading","constructor","on","debug","info","JSON","stringify","rdpError","disconnect","addonRequest","addon","request","response","to","actor","type","getAddonsActor","addonsActor","Promise","reject","installTemporaryAddon","addonPath","openDevTools","getInstalledAddon","addonId","addons","id","map","a","checkForAddonReloading","requestTypes","indexOf","supportedRequestTypes","reloadAddon","process","stdout","write","Date","toTimeString","connect","port","connectWithMaxRetries","maxRetries","retryInterval","establishConnection","lastError","retries","resolve","setTimeout","stack","findFreeTcpPort","srv","createServer","listen","freeTcpPort","address","close"],"sources":["../../src/firefox/remote.js"],"sourcesContent":["import net from 'net';\n\nimport { connectToFirefox as defaultFirefoxConnector } from './rdp-client.js';\nimport { createLogger } from '../util/logger.js';\nimport {\n isErrorWithCode,\n RemoteTempInstallNotSupported,\n UsageError,\n WebExtError,\n} from '../errors.js';\n\nconst log = createLogger(import.meta.url);\n\n// NOTE: this type aliases Object to catch any other possible response.\n\n// Convert a request rejection to a message string.\nfunction requestErrorToMessage(err) {\n if (err instanceof Error) {\n return String(err);\n }\n return `${err.error}: ${err.message}`;\n}\n\nexport class RemoteFirefox {\n client;\n checkedForAddonReloading;\n\n constructor(client) {\n this.client = client;\n this.checkedForAddonReloading = false;\n\n client.on('disconnect', () => {\n log.debug('Received \"disconnect\" from Firefox client');\n });\n client.on('end', () => {\n log.debug('Received \"end\" from Firefox client');\n });\n client.on('unsolicited-event', (info) => {\n log.debug(`Received message from client: ${JSON.stringify(info)}`);\n });\n client.on('rdp-error', (rdpError) => {\n log.debug(`Received error from client: ${JSON.stringify(rdpError)}`);\n });\n client.on('error', (error) => {\n log.debug(`Received error from client: ${String(error)}`);\n });\n }\n\n disconnect() {\n this.client.disconnect();\n }\n\n async addonRequest(addon, request) {\n try {\n const response = await this.client.request({\n to: addon.actor,\n type: request,\n });\n return response;\n } catch (err) {\n log.debug(`Client responded to '${request}' request with error:`, err);\n const message = requestErrorToMessage(err);\n throw new WebExtError(`Remote Firefox: addonRequest() error: ${message}`);\n }\n }\n\n async getAddonsActor() {\n try {\n // getRoot should work since Firefox 55 (bug 1352157).\n const response = await this.client.request('getRoot');\n if (response.addonsActor == null) {\n return Promise.reject(\n new RemoteTempInstallNotSupported(\n 'This version of Firefox does not provide an add-ons actor for ' +\n 'remote installation.',\n ),\n );\n }\n return response.addonsActor;\n } catch (err) {\n // Fallback to listTabs otherwise, Firefox 49 - 77 (bug 1618691).\n log.debug('Falling back to listTabs because getRoot failed', err);\n }\n\n try {\n const response = await this.client.request('listTabs');\n // addonsActor was added to listTabs in Firefox 49 (bug 1273183).\n if (response.addonsActor == null) {\n log.debug(\n 'listTabs returned a falsey addonsActor: ' +\n `${JSON.stringify(response)}`,\n );\n return Promise.reject(\n new RemoteTempInstallNotSupported(\n 'This is an older version of Firefox that does not provide an ' +\n 'add-ons actor for remote installation. Try Firefox 49 or ' +\n 'higher.',\n ),\n );\n }\n return response.addonsActor;\n } catch (err) {\n log.debug('listTabs error', err);\n const message = requestErrorToMessage(err);\n throw new WebExtError(`Remote Firefox: listTabs() error: ${message}`);\n }\n }\n\n async installTemporaryAddon(addonPath, openDevTools) {\n const addonsActor = await this.getAddonsActor();\n\n try {\n const response = await this.client.request({\n to: addonsActor,\n type: 'installTemporaryAddon',\n addonPath,\n openDevTools,\n });\n log.debug(`installTemporaryAddon: ${JSON.stringify(response)}`);\n log.info(`Installed ${addonPath} as a temporary add-on`);\n return response;\n } catch (err) {\n const message = requestErrorToMessage(err);\n throw new WebExtError(`installTemporaryAddon: Error: ${message}`);\n }\n }\n\n async getInstalledAddon(addonId) {\n try {\n const response = await this.client.request('listAddons');\n for (const addon of response.addons) {\n if (addon.id === addonId) {\n return addon;\n }\n }\n log.debug(\n `Remote Firefox has these addons: ${response.addons.map((a) => a.id)}`,\n );\n return Promise.reject(\n new WebExtError(\n 'The remote Firefox does not have your extension installed',\n ),\n );\n } catch (err) {\n const message = requestErrorToMessage(err);\n throw new WebExtError(`Remote Firefox: listAddons() error: ${message}`);\n }\n }\n\n async checkForAddonReloading(addon) {\n if (this.checkedForAddonReloading) {\n // We only need to check once if reload() is supported.\n return addon;\n } else {\n const response = await this.addonRequest(addon, 'requestTypes');\n\n if (response.requestTypes.indexOf('reload') === -1) {\n const supportedRequestTypes = JSON.stringify(response.requestTypes);\n log.debug(`Remote Firefox only supports: ${supportedRequestTypes}`);\n throw new UsageError(\n 'This Firefox version does not support add-on reloading. ' +\n 'Re-run with --no-reload',\n );\n } else {\n this.checkedForAddonReloading = true;\n return addon;\n }\n }\n }\n\n async reloadAddon(addonId) {\n const addon = await this.getInstalledAddon(addonId);\n await this.checkForAddonReloading(addon);\n await this.addonRequest(addon, 'reload');\n process.stdout.write(\n `\\rLast extension reload: ${new Date().toTimeString()}`,\n );\n log.debug('\\n');\n }\n}\n\n// Connect types and implementation\n\nexport async function connect(\n port,\n { connectToFirefox = defaultFirefoxConnector } = {},\n) {\n log.debug(`Connecting to Firefox on port ${port}`);\n const client = await connectToFirefox(port);\n log.debug(`Connected to the remote Firefox debugger on port ${port}`);\n return new RemoteFirefox(client);\n}\n\n// ConnectWithMaxRetries types and implementation\n\nexport async function connectWithMaxRetries(\n // A max of 250 will try connecting for 30 seconds.\n { maxRetries = 250, retryInterval = 120, port },\n { connectToFirefox = connect } = {},\n) {\n async function establishConnection() {\n var lastError;\n\n for (let retries = 0; retries <= maxRetries; retries++) {\n try {\n return await connectToFirefox(port);\n } catch (error) {\n if (isErrorWithCode('ECONNREFUSED', error)) {\n // Wait for `retryInterval` ms.\n await new Promise((resolve) => {\n setTimeout(resolve, retryInterval);\n });\n\n lastError = error;\n log.debug(\n `Retrying Firefox (${retries}); connection error: ${error}`,\n );\n } else {\n log.error(error.stack);\n throw error;\n }\n }\n }\n\n log.debug('Connect to Firefox debugger: too many retries');\n throw lastError;\n }\n\n log.debug('Connecting to the remote Firefox debugger');\n return establishConnection();\n}\n\nexport function findFreeTcpPort() {\n return new Promise((resolve) => {\n const srv = net.createServer();\n srv.listen(0, '127.0.0.1', () => {\n const freeTcpPort = srv.address().port;\n srv.close(() => resolve(freeTcpPort));\n });\n });\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","names":["main","cmd"],"sources":["../src/main.js"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"main.js","names":["main","cmd"],"sources":["../src/main.js"],"sourcesContent":["import { main } from './program.js';\nimport cmd from './cmd/index.js';\n\n// This only exposes main and cmd, while util/logger and util/adb are defined as\n// separate additional exports in the package.json.\nexport default { main, cmd };\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,cAAc;AACnC,OAAOC,GAAG,MAAM,gBAAgB;;AAEhC;AACA;AACA,eAAe;EAAED,IAAI;EAAEC;AAAI,CAAC","ignoreList":[]}
|
package/lib/program.js
CHANGED
|
@@ -16,15 +16,20 @@ const envPrefix = 'WEB_EXT';
|
|
|
16
16
|
// Default to "development" (the value actually assigned will be interpolated
|
|
17
17
|
// by babel-plugin-transform-inline-environment-variables).
|
|
18
18
|
const defaultGlobalEnv = "production" || 'development';
|
|
19
|
-
|
|
20
|
-
// TODO: add pipes to Flow type after https://github.com/facebook/flow/issues/2405 is fixed
|
|
21
|
-
|
|
22
19
|
export const AMO_BASE_URL = 'https://addons.mozilla.org/api/v5/';
|
|
23
20
|
|
|
24
21
|
/*
|
|
25
22
|
* The command line program.
|
|
26
23
|
*/
|
|
27
24
|
export class Program {
|
|
25
|
+
absolutePackageDir;
|
|
26
|
+
yargs;
|
|
27
|
+
commands;
|
|
28
|
+
shouldExitProgram;
|
|
29
|
+
verboseEnabled;
|
|
30
|
+
options;
|
|
31
|
+
programArgv;
|
|
32
|
+
demandedOptions;
|
|
28
33
|
constructor(argv, {
|
|
29
34
|
absolutePackageDir = process.cwd()
|
|
30
35
|
} = {}) {
|
|
@@ -163,9 +168,6 @@ export class Program {
|
|
|
163
168
|
if (argv.startUrl && !argv.startUrl.length) {
|
|
164
169
|
throw new UsageError('Not enough arguments following: start-url');
|
|
165
170
|
}
|
|
166
|
-
if (Array.isArray(argv.firefoxPreview) && !argv.firefoxPreview.length) {
|
|
167
|
-
argv.firefoxPreview = ['mv3'];
|
|
168
|
-
}
|
|
169
171
|
return argv;
|
|
170
172
|
}
|
|
171
173
|
|
|
@@ -248,10 +250,10 @@ export class Program {
|
|
|
248
250
|
}
|
|
249
251
|
if (configFiles.length) {
|
|
250
252
|
const niceFileList = configFiles.map(f => f.replace(process.cwd(), '.')).map(f => f.replace(os.homedir(), '~')).join(', ');
|
|
251
|
-
log.
|
|
253
|
+
log.debug('Applying config file' + `${configFiles.length !== 1 ? 's' : ''}: ` + `${niceFileList}`);
|
|
252
254
|
}
|
|
253
|
-
|
|
254
|
-
const configObject = loadJSConfigFile(configFileName);
|
|
255
|
+
for (const configFileName of configFiles) {
|
|
256
|
+
const configObject = await loadJSConfigFile(configFileName);
|
|
255
257
|
adjustedArgv = applyConfigToArgv({
|
|
256
258
|
argv: adjustedArgv,
|
|
257
259
|
argvFromCLI: argv,
|
|
@@ -259,7 +261,7 @@ export class Program {
|
|
|
259
261
|
configObject,
|
|
260
262
|
options: this.options
|
|
261
263
|
});
|
|
262
|
-
}
|
|
264
|
+
}
|
|
263
265
|
if (adjustedArgv.verbose) {
|
|
264
266
|
// Ensure that the verbose is enabled when specified in a config file.
|
|
265
267
|
this.enableVerboseMode(logStream, version);
|
|
@@ -306,9 +308,6 @@ export async function defaultVersionGetter(absolutePackageDir, {
|
|
|
306
308
|
return `${git.branch(absolutePackageDir)}-${git.long(absolutePackageDir)}`;
|
|
307
309
|
}
|
|
308
310
|
}
|
|
309
|
-
|
|
310
|
-
// TODO: add pipes to Flow type after https://github.com/facebook/flow/issues/2405 is fixed
|
|
311
|
-
|
|
312
311
|
export function throwUsageErrorIfArray(errorMessage) {
|
|
313
312
|
return value => {
|
|
314
313
|
if (Array.isArray(value)) {
|
|
@@ -328,14 +327,6 @@ export async function main(absolutePackageDir, {
|
|
|
328
327
|
});
|
|
329
328
|
const version = await getVersion(absolutePackageDir);
|
|
330
329
|
|
|
331
|
-
// This is an option shared by some commands but not all of them, hence why
|
|
332
|
-
// it isn't a global option.
|
|
333
|
-
const firefoxPreviewOption = {
|
|
334
|
-
describe: 'Turn on developer preview features in Firefox' + ' (defaults to "mv3")',
|
|
335
|
-
demandOption: false,
|
|
336
|
-
type: 'array'
|
|
337
|
-
};
|
|
338
|
-
|
|
339
330
|
// yargs uses magic camel case expansion to expose options on the
|
|
340
331
|
// final argv object. For example, the 'artifacts-dir' option is alternatively
|
|
341
332
|
// available as argv.artifactsDir.
|
|
@@ -428,9 +419,9 @@ Example: $0 --help run.
|
|
|
428
419
|
describe: 'Overwrite destination package if it exists.',
|
|
429
420
|
type: 'boolean'
|
|
430
421
|
}
|
|
431
|
-
}).command('sign', 'Sign the extension so it can be installed in Firefox', commands.sign, {
|
|
422
|
+
}).command('dump-config', 'Run config discovery and dump the resulting config data as JSON', commands.dumpConfig, {}).command('sign', 'Sign the extension so it can be installed in Firefox', commands.sign, {
|
|
432
423
|
'amo-base-url': {
|
|
433
|
-
describe: '
|
|
424
|
+
describe: 'Submission API URL prefix',
|
|
434
425
|
default: AMO_BASE_URL,
|
|
435
426
|
demandOption: true,
|
|
436
427
|
type: 'string'
|
|
@@ -445,42 +436,30 @@ Example: $0 --help run.
|
|
|
445
436
|
demandOption: true,
|
|
446
437
|
type: 'string'
|
|
447
438
|
},
|
|
448
|
-
'api-url-prefix': {
|
|
449
|
-
describe: 'Signing API URL prefix',
|
|
450
|
-
default: 'https://addons.mozilla.org/api/v4',
|
|
451
|
-
demandOption: true,
|
|
452
|
-
type: 'string'
|
|
453
|
-
},
|
|
454
439
|
'api-proxy': {
|
|
455
440
|
describe: 'Use a proxy to access the signing API. ' + 'Example: https://yourproxy:6000 ',
|
|
456
441
|
demandOption: false,
|
|
457
442
|
type: 'string'
|
|
458
443
|
},
|
|
459
|
-
'use-submission-api': {
|
|
460
|
-
describe: 'Sign using the addon submission API',
|
|
461
|
-
demandOption: false,
|
|
462
|
-
type: 'boolean'
|
|
463
|
-
},
|
|
464
|
-
id: {
|
|
465
|
-
describe: 'A custom ID for the extension. This has no effect if the ' + 'extension already declares an explicit ID in its manifest.',
|
|
466
|
-
demandOption: false,
|
|
467
|
-
type: 'string'
|
|
468
|
-
},
|
|
469
444
|
timeout: {
|
|
470
445
|
describe: 'Number of milliseconds to wait before giving up',
|
|
471
446
|
type: 'number'
|
|
472
447
|
},
|
|
473
|
-
'
|
|
474
|
-
describe: '
|
|
475
|
-
|
|
476
|
-
type: 'boolean'
|
|
448
|
+
'approval-timeout': {
|
|
449
|
+
describe: 'Number of milliseconds to wait for approval before giving up. ' + 'Set to 0 to disable waiting for approval. Fallback to `timeout` if not set.',
|
|
450
|
+
type: 'number'
|
|
477
451
|
},
|
|
478
452
|
channel: {
|
|
479
|
-
describe:
|
|
453
|
+
describe: "The channel for which to sign the addon. Either 'listed' or 'unlisted'.",
|
|
454
|
+
demandOption: true,
|
|
480
455
|
type: 'string'
|
|
481
456
|
},
|
|
482
457
|
'amo-metadata': {
|
|
483
|
-
describe: 'Path to a JSON file containing an object with metadata
|
|
458
|
+
describe: 'Path to a JSON file containing an object with metadata to be passed to the API. ' + 'See https://addons-server.readthedocs.io/en/latest/topics/api/addons.html for details.',
|
|
459
|
+
type: 'string'
|
|
460
|
+
},
|
|
461
|
+
'upload-source-code': {
|
|
462
|
+
describe: 'Path to an archive file containing human readable source code of this submission, ' + 'if the code in --source-dir has been processed to make it unreadable. ' + 'See https://extensionworkshop.com/documentation/publish/source-code-submission/ for ' + 'details.',
|
|
484
463
|
type: 'string'
|
|
485
464
|
}
|
|
486
465
|
}).command('run', 'Run the extension', commands.run, {
|
|
@@ -576,7 +555,6 @@ Example: $0 --help run.
|
|
|
576
555
|
demandOption: false,
|
|
577
556
|
type: 'array'
|
|
578
557
|
},
|
|
579
|
-
'firefox-preview': firefoxPreviewOption,
|
|
580
558
|
// Firefox for Android CLI options.
|
|
581
559
|
'adb-bin': {
|
|
582
560
|
describe: 'Specify a custom path to the adb binary',
|
|
@@ -664,8 +642,7 @@ Example: $0 --help run.
|
|
|
664
642
|
describe: 'Disables colorful shell output',
|
|
665
643
|
type: 'boolean',
|
|
666
644
|
default: false
|
|
667
|
-
}
|
|
668
|
-
'firefox-preview': firefoxPreviewOption
|
|
645
|
+
}
|
|
669
646
|
}).command('docs', 'Open the web-ext documentation in a browser', commands.docs, {});
|
|
670
647
|
return program.execute({
|
|
671
648
|
getVersion,
|