web-ext 7.12.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 +15 -9
- 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 +36 -38
- package/lib/extension-runners/base.js +0 -2
- package/lib/extension-runners/base.js.map +0 -1
package/lib/cmd/sign.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign.js","names":["path","fs","signAddon","defaultAddonSigner","defaultBuilder","isErrorWithCode","UsageError","WebExtError","prepareArtifactsDir","createLogger","getValidatedManifest","getManifestId","defaultSubmitAddonSigner","saveIdToFile","withTempDir","isTTY","log","import","meta","url","defaultAsyncFsReadFile","readFile","bind","extensionIdFile","sign","amoBaseUrl","apiKey","apiProxy","apiSecret","apiUrlPrefix","useSubmissionApi","artifactsDir","id","ignoreFiles","sourceDir","timeout","disableProgressBar","process","stdin","verbose","channel","amoMetadata","webextVersion","build","preValidatedManifest","submitAddon","asyncFsReadFile","warn","tmpDir","manifestData","savedIdPath","join","buildResult","idFromSourceDir","Promise","all","showReadyMessage","getIdFromFile","manifestId","debug","info","metaDataJson","metadataFileBuffer","JSON","parse","toString","err","userAgentString","signSubmitArgs","xpiPath","extensionPath","downloadDir","result","success","newId","downloadedFiles","version","apiRequestConfig","headers","Error","clientError","message","filePath","content","error","lines","split","filter","line","trim","startsWith"],"sources":["../../src/cmd/sign.js"],"sourcesContent":["/* @flow */\nimport path from 'path';\n\nimport { fs } from 'mz';\nimport { signAddon as defaultAddonSigner } from 'sign-addon';\n\nimport defaultBuilder from './build.js';\nimport { isErrorWithCode, UsageError, WebExtError } from '../errors.js';\nimport { prepareArtifactsDir } from '../util/artifacts.js';\nimport { createLogger } from '../util/logger.js';\nimport getValidatedManifest, { getManifestId } from '../util/manifest.js';\nimport type { ExtensionManifest } from '../util/manifest.js';\nimport {\n signAddon as defaultSubmitAddonSigner,\n saveIdToFile,\n} from '../util/submit-addon.js';\nimport type { SignResult } from '../util/submit-addon.js';\nimport { withTempDir } from '../util/temp-dir.js';\nimport { isTTY } from '../util/stdin.js';\n\nexport type { SignResult };\n\nconst log = createLogger(import.meta.url);\n\nconst defaultAsyncFsReadFile: (string) => Promise<Buffer> =\n fs.readFile.bind(fs);\n\nexport const extensionIdFile = '.web-extension-id';\n\n// Sign command types and implementation.\n\nexport type SignParams = {|\n amoBaseUrl: string,\n apiKey: string,\n apiProxy?: string,\n apiSecret: string,\n apiUrlPrefix: string,\n useSubmissionApi?: boolean,\n artifactsDir: string,\n id?: string,\n ignoreFiles?: Array<string>,\n sourceDir: string,\n timeout: number,\n disableProgressBar?: boolean,\n verbose?: boolean,\n channel?: string,\n amoMetadata?: string,\n webextVersion: string,\n|};\n\nexport type SignOptions = {\n build?: typeof defaultBuilder,\n signAddon?: typeof defaultAddonSigner,\n submitAddon?: typeof defaultSubmitAddonSigner,\n preValidatedManifest?: ExtensionManifest,\n shouldExitProgram?: boolean,\n asyncFsReadFile?: typeof defaultAsyncFsReadFile,\n};\n\nexport default function sign(\n {\n amoBaseUrl,\n apiKey,\n apiProxy,\n apiSecret,\n apiUrlPrefix,\n useSubmissionApi = false,\n artifactsDir,\n id,\n ignoreFiles = [],\n sourceDir,\n timeout,\n disableProgressBar = !isTTY(process.stdin),\n verbose,\n channel,\n amoMetadata,\n webextVersion,\n }: SignParams,\n {\n build = defaultBuilder,\n preValidatedManifest,\n signAddon = defaultAddonSigner,\n submitAddon = defaultSubmitAddonSigner,\n asyncFsReadFile = defaultAsyncFsReadFile,\n }: SignOptions = {}\n): Promise<SignResult> {\n if (!useSubmissionApi) {\n log.warn(\n 'IMPORTANT: web-ext v8 will introduce a new AMO submission API for signing and you might need to take actions when upgrading from v7 to v8. You can test this upcoming change now by specifying `--use-submission-api` to the `sign` command. If you want to keep using the API you are using now (via \"sign-addon\"), you must stay on v7.'\n );\n }\n\n return withTempDir(async function (tmpDir) {\n await prepareArtifactsDir(artifactsDir);\n\n let manifestData;\n const savedIdPath = path.join(sourceDir, extensionIdFile);\n\n if (preValidatedManifest) {\n manifestData = preValidatedManifest;\n } else {\n manifestData = await getValidatedManifest(sourceDir);\n }\n\n const [buildResult, idFromSourceDir] = await Promise.all([\n build(\n { sourceDir, ignoreFiles, artifactsDir: tmpDir.path() },\n { manifestData, showReadyMessage: false }\n ),\n getIdFromFile(savedIdPath),\n ]);\n\n const manifestId = getManifestId(manifestData);\n\n if (useSubmissionApi && id && !manifestId) {\n throw new UsageError(\n `Cannot set custom ID ${id} - addon submission API requires a ` +\n 'custom ID be specified in the manifest'\n );\n }\n if (useSubmissionApi && idFromSourceDir && !manifestId) {\n throw new UsageError(\n 'Cannot use previously auto-generated extension ID ' +\n `${idFromSourceDir} - addon submission API ` +\n 'requires a custom ID be specified in the manifest'\n );\n }\n if (id && manifestId) {\n throw new UsageError(\n `Cannot set custom ID ${id} because manifest.json ` +\n `declares ID ${manifestId}`\n );\n }\n if (id) {\n log.debug(`Using custom ID declared as --id=${id}`);\n }\n\n if (manifestId) {\n id = manifestId;\n }\n\n if (!id && idFromSourceDir) {\n log.info(\n `Using previously auto-generated extension ID: ${idFromSourceDir}`\n );\n id = idFromSourceDir;\n }\n\n if (!id) {\n log.warn('No extension ID specified (it will be auto-generated)');\n }\n\n if (useSubmissionApi && !channel) {\n throw new UsageError(\n 'channel is a required parameter for the addon submission API'\n );\n }\n\n if (useSubmissionApi && apiProxy) {\n // https://github.com/mozilla/web-ext/issues/2472\n throw new UsageError(\n \"apiProxy isn't yet supported for the addon submission API. \" +\n 'See https://github.com/mozilla/web-ext/issues/2472'\n );\n }\n\n let metaDataJson;\n if (amoMetadata) {\n const metadataFileBuffer = await asyncFsReadFile(amoMetadata);\n try {\n metaDataJson = JSON.parse(metadataFileBuffer.toString());\n } catch (err) {\n throw new UsageError('Invalid JSON in listing metadata');\n }\n }\n const userAgentString = `web-ext/${webextVersion}`;\n\n const signSubmitArgs = {\n apiKey,\n apiSecret,\n timeout,\n id,\n xpiPath: buildResult.extensionPath,\n downloadDir: artifactsDir,\n channel,\n };\n\n let result;\n try {\n if (useSubmissionApi) {\n result = await submitAddon({\n ...signSubmitArgs,\n amoBaseUrl,\n // $FlowIgnore: we verify 'channel' is set above\n channel,\n savedIdPath,\n metaDataJson,\n userAgentString,\n });\n } else {\n const {\n success,\n id: newId,\n downloadedFiles,\n } = await signAddon({\n ...signSubmitArgs,\n apiUrlPrefix,\n apiProxy,\n disableProgressBar,\n verbose,\n version: manifestData.version,\n apiRequestConfig: { headers: { 'User-Agent': userAgentString } },\n });\n if (!success) {\n throw new Error('The extension could not be signed');\n }\n result = { id: newId, downloadedFiles };\n // All information about the downloaded files would have already been\n // logged by signAddon(). submitAddon() calls saveIdToFile itself.\n await saveIdToFile(savedIdPath, newId);\n log.info(`Extension ID: ${newId}`);\n log.info('SUCCESS');\n }\n } catch (clientError) {\n log.info('FAIL');\n throw new WebExtError(clientError.message);\n }\n\n return result;\n });\n}\n\nexport async function getIdFromFile(\n filePath: string,\n asyncFsReadFile: typeof defaultAsyncFsReadFile = defaultAsyncFsReadFile\n): Promise<string | void> {\n let content;\n\n try {\n content = await asyncFsReadFile(filePath);\n } catch (error) {\n if (isErrorWithCode('ENOENT', error)) {\n log.debug(`No ID file found at: ${filePath}`);\n return;\n }\n throw error;\n }\n\n let lines = content.toString().split('\\n');\n lines = lines.filter((line) => {\n line = line.trim();\n if (line && !line.startsWith('#')) {\n return line;\n }\n });\n\n const id = lines[0];\n log.debug(`Found extension ID ${id} in ${filePath}`);\n\n if (!id) {\n throw new UsageError(`No ID found in extension ID file ${filePath}`);\n }\n\n return id;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sign.js","names":["path","defaultBuilder","isErrorWithCode","UsageError","WebExtError","prepareArtifactsDir","createLogger","getValidatedManifest","getManifestId","defaultAsyncFsReadFile","signAddon","defaultSubmitAddonSigner","withTempDir","log","import","meta","url","extensionIdFile","uploadUuidFile","sign","amoBaseUrl","apiKey","apiProxy","apiSecret","artifactsDir","ignoreFiles","sourceDir","timeout","approvalTimeout","channel","amoMetadata","uploadSourceCode","webextVersion","build","preValidatedManifest","submitAddon","asyncFsReadFile","tmpDir","manifestData","savedIdPath","join","savedUploadUuidPath","buildResult","idFromSourceDir","Promise","all","showReadyMessage","getIdFromFile","id","manifest_version","warn","metaDataJson","metadataFileBuffer","JSON","parse","toString","err","userAgentString","signSubmitArgs","xpiPath","extensionPath","downloadDir","result","validationCheckTimeout","approvalCheckTimeout","undefined","submissionSource","clientError","message","filePath","content","error","debug","lines","split","filter","line","trim","startsWith"],"sources":["../../src/cmd/sign.js"],"sourcesContent":["import path from 'path';\n\nimport defaultBuilder from './build.js';\nimport { isErrorWithCode, UsageError, WebExtError } from '../errors.js';\nimport { prepareArtifactsDir } from '../util/artifacts.js';\nimport { createLogger } from '../util/logger.js';\nimport getValidatedManifest, { getManifestId } from '../util/manifest.js';\nimport {\n defaultAsyncFsReadFile,\n signAddon as defaultSubmitAddonSigner,\n} from '../util/submit-addon.js';\nimport { withTempDir } from '../util/temp-dir.js';\n\nconst log = createLogger(import.meta.url);\n\nexport const extensionIdFile = '.web-extension-id';\nexport const uploadUuidFile = '.amo-upload-uuid';\n\n// Sign command types and implementation.\n\nexport default function sign(\n {\n amoBaseUrl,\n apiKey,\n apiProxy,\n apiSecret,\n artifactsDir,\n ignoreFiles = [],\n sourceDir,\n timeout,\n approvalTimeout,\n channel,\n amoMetadata,\n uploadSourceCode,\n webextVersion,\n },\n {\n build = defaultBuilder,\n preValidatedManifest,\n submitAddon = defaultSubmitAddonSigner,\n asyncFsReadFile = defaultAsyncFsReadFile,\n } = {},\n) {\n return withTempDir(async function (tmpDir) {\n await prepareArtifactsDir(artifactsDir);\n\n let manifestData;\n const savedIdPath = path.join(sourceDir, extensionIdFile);\n const savedUploadUuidPath = path.join(sourceDir, uploadUuidFile);\n\n if (preValidatedManifest) {\n manifestData = preValidatedManifest;\n } else {\n manifestData = await getValidatedManifest(sourceDir);\n }\n\n const [buildResult, idFromSourceDir] = await Promise.all([\n build(\n { sourceDir, ignoreFiles, artifactsDir: tmpDir.path() },\n { manifestData, showReadyMessage: false },\n ),\n getIdFromFile(savedIdPath),\n ]);\n\n const id = getManifestId(manifestData);\n if (idFromSourceDir && !id) {\n throw new UsageError(\n 'Cannot use previously auto-generated extension ID ' +\n `${idFromSourceDir} - This extension ID must be specified in the manifest.json file.`,\n );\n }\n\n if (!id) {\n // We only auto-generate add-on IDs for MV2 add-ons on AMO.\n if (manifestData.manifest_version !== 2) {\n throw new UsageError(\n 'An extension ID must be specified in the manifest.json file.',\n );\n }\n\n log.warn(\n 'No extension ID specified (it will be auto-generated the first time)',\n );\n }\n\n if (!channel) {\n throw new UsageError('You must specify a channel');\n }\n\n let metaDataJson;\n if (amoMetadata) {\n const metadataFileBuffer = await asyncFsReadFile(amoMetadata);\n try {\n metaDataJson = JSON.parse(metadataFileBuffer.toString());\n } catch (err) {\n throw new UsageError('Invalid JSON in listing metadata');\n }\n }\n const userAgentString = `web-ext/${webextVersion}`;\n\n const signSubmitArgs = {\n apiKey,\n apiSecret,\n apiProxy,\n id,\n xpiPath: buildResult.extensionPath,\n downloadDir: artifactsDir,\n channel,\n };\n\n try {\n const result = await submitAddon({\n ...signSubmitArgs,\n amoBaseUrl,\n channel,\n savedIdPath,\n savedUploadUuidPath,\n metaDataJson,\n userAgentString,\n validationCheckTimeout: timeout,\n approvalCheckTimeout:\n approvalTimeout !== undefined ? approvalTimeout : timeout,\n submissionSource: uploadSourceCode,\n });\n\n return result;\n } catch (clientError) {\n throw new WebExtError(clientError.message);\n }\n });\n}\n\nexport async function getIdFromFile(\n filePath,\n asyncFsReadFile = defaultAsyncFsReadFile,\n) {\n let content;\n\n try {\n content = await asyncFsReadFile(filePath);\n } catch (error) {\n if (isErrorWithCode('ENOENT', error)) {\n log.debug(`No ID file found at: ${filePath}`);\n return;\n }\n throw error;\n }\n\n let lines = content.toString().split('\\n');\n lines = lines.filter((line) => {\n line = line.trim();\n if (line && !line.startsWith('#')) {\n return line;\n }\n });\n\n const id = lines[0];\n log.debug(`Found extension ID ${id} in ${filePath}`);\n\n if (!id) {\n throw new UsageError(`No ID found in extension ID file ${filePath}`);\n }\n\n return id;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/config.js
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import os from 'os';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import importFresh from 'import-fresh';
|
|
4
3
|
import camelCase from 'camelcase';
|
|
5
4
|
import decamelize from 'decamelize';
|
|
5
|
+
import { fs } from 'mz';
|
|
6
|
+
import parseJSON from 'parse-json';
|
|
6
7
|
import fileExists from './util/file-exists.js';
|
|
7
8
|
import { createLogger } from './util/logger.js';
|
|
8
9
|
import { UsageError, WebExtError } from './errors.js';
|
|
9
10
|
const log = createLogger(import.meta.url);
|
|
11
|
+
|
|
12
|
+
// NOTE: this error message is used in an interpolated string (while the other two help
|
|
13
|
+
// messages are being logged as is).
|
|
14
|
+
export const WARN_LEGACY_JS_EXT = ['should be renamed to ".cjs" or ".mjs" file extension to ensure its format is not ambiguous.', 'Config files with the ".js" file extension are deprecated and will not be loaded anymore', 'in a future web-ext major version.'].join(' ');
|
|
15
|
+
export const HELP_ERR_MODULE_FROM_ESM = ['This config file belongs to a package.json file with "type" set to "module".', 'Change the file extension to ".cjs" or rewrite it as an ES module and use the ".mjs" file extension.'].join(' ');
|
|
16
|
+
export const HELP_ERR_IMPORTEXPORT_CJS = ['This config file is defined as an ES module, but it belongs to either a project directory', 'with a package.json file with "type" set to "commonjs" or one without any package.json file.', 'Change the file extension to ".mjs" to fix the config loading error.'].join(' ');
|
|
17
|
+
const ERR_IMPORT_FROM_CJS = 'Cannot use import statement outside a module';
|
|
18
|
+
const ERR_EXPORT_FROM_CJS = "Unexpected token 'export'";
|
|
19
|
+
const ERR_MODULE_FROM_ESM = 'module is not defined in ES module scope';
|
|
10
20
|
export function applyConfigToArgv({
|
|
11
21
|
argv,
|
|
12
22
|
argvFromCLI,
|
|
@@ -80,15 +90,49 @@ export function applyConfigToArgv({
|
|
|
80
90
|
}
|
|
81
91
|
return newArgv;
|
|
82
92
|
}
|
|
83
|
-
export function loadJSConfigFile(filePath) {
|
|
93
|
+
export async function loadJSConfigFile(filePath) {
|
|
84
94
|
const resolvedFilePath = path.resolve(filePath);
|
|
85
95
|
log.debug(`Loading JS config file: "${filePath}" ` + `(resolved to "${resolvedFilePath}")`);
|
|
96
|
+
if (filePath.endsWith('.js')) {
|
|
97
|
+
log.warn(`WARNING: config file ${filePath} ${WARN_LEGACY_JS_EXT}`);
|
|
98
|
+
}
|
|
86
99
|
let configObject;
|
|
87
100
|
try {
|
|
88
|
-
|
|
101
|
+
const nonce = `${Date.now()}-${Math.random()}`;
|
|
102
|
+
let configModule;
|
|
103
|
+
if (resolvedFilePath.endsWith('package.json')) {
|
|
104
|
+
configModule = parseJSON(await fs.readFile(resolvedFilePath, {
|
|
105
|
+
encoding: 'utf-8'
|
|
106
|
+
}));
|
|
107
|
+
} else {
|
|
108
|
+
configModule = await import(`file://${resolvedFilePath}?nonce=${nonce}`);
|
|
109
|
+
}
|
|
110
|
+
if (configModule.default) {
|
|
111
|
+
const {
|
|
112
|
+
default: configDefault,
|
|
113
|
+
...esmConfigMod
|
|
114
|
+
} = configModule;
|
|
115
|
+
// ES modules may expose both a default and named exports and so
|
|
116
|
+
// we merge the named exports on top of what may have been set in
|
|
117
|
+
// the default export.
|
|
118
|
+
configObject = {
|
|
119
|
+
...configDefault,
|
|
120
|
+
...esmConfigMod
|
|
121
|
+
};
|
|
122
|
+
} else {
|
|
123
|
+
configObject = {
|
|
124
|
+
...configModule
|
|
125
|
+
};
|
|
126
|
+
}
|
|
89
127
|
} catch (error) {
|
|
90
128
|
log.debug('Handling error:', error);
|
|
91
|
-
|
|
129
|
+
let errorMessage = error.message;
|
|
130
|
+
if (error.message.startsWith(ERR_MODULE_FROM_ESM)) {
|
|
131
|
+
errorMessage = HELP_ERR_MODULE_FROM_ESM;
|
|
132
|
+
} else if ([ERR_IMPORT_FROM_CJS, ERR_EXPORT_FROM_CJS].includes(error.message)) {
|
|
133
|
+
errorMessage = HELP_ERR_IMPORTEXPORT_CJS;
|
|
134
|
+
}
|
|
135
|
+
throw new UsageError(`Cannot read config file: ${resolvedFilePath}\n` + `Error: ${errorMessage}`);
|
|
92
136
|
}
|
|
93
137
|
if (filePath.endsWith('package.json')) {
|
|
94
138
|
log.debug('Looking for webExt key inside package.json file');
|
|
@@ -102,16 +146,18 @@ export function loadJSConfigFile(filePath) {
|
|
|
102
146
|
export async function discoverConfigFiles({
|
|
103
147
|
getHomeDir = os.homedir
|
|
104
148
|
} = {}) {
|
|
105
|
-
const magicConfigName = 'web-ext-config
|
|
149
|
+
const magicConfigName = 'web-ext-config';
|
|
106
150
|
|
|
107
151
|
// Config files will be loaded in this order.
|
|
108
152
|
const possibleConfigs = [
|
|
109
153
|
// Look for a magic hidden config (preceded by dot) in home dir.
|
|
110
|
-
path.join(getHomeDir(), `.${magicConfigName}`),
|
|
154
|
+
path.join(getHomeDir(), `.${magicConfigName}.mjs`), path.join(getHomeDir(), `.${magicConfigName}.cjs`), path.join(getHomeDir(), `.${magicConfigName}.js`),
|
|
111
155
|
// Look for webExt key inside package.json file
|
|
112
156
|
path.join(process.cwd(), 'package.json'),
|
|
113
157
|
// Look for a magic config in the current working directory.
|
|
114
|
-
path.join(process.cwd(), magicConfigName)
|
|
158
|
+
path.join(process.cwd(), `${magicConfigName}.mjs`), path.join(process.cwd(), `${magicConfigName}.cjs`), path.join(process.cwd(), `${magicConfigName}.js`),
|
|
159
|
+
// Look for a magic hidden config (preceded by dot) the current working directory.
|
|
160
|
+
path.join(process.cwd(), `.${magicConfigName}.mjs`), path.join(process.cwd(), `.${magicConfigName}.cjs`), path.join(process.cwd(), `.${magicConfigName}.js`)];
|
|
115
161
|
const configs = await Promise.all(possibleConfigs.map(async fileName => {
|
|
116
162
|
const resolvedFileName = path.resolve(fileName);
|
|
117
163
|
if (await fileExists(resolvedFileName)) {
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":["os","path","importFresh","camelCase","decamelize","fileExists","createLogger","UsageError","WebExtError","log","import","meta","url","applyConfigToArgv","argv","argvFromCLI","configObject","options","configFileName","newArgv","option","Object","keys","Array","isArray","decamelizedOptName","separator","type","undefined","expectedType","optionType","defaultValue","default","wasValueSetOnCLI","debug","coerce","loadJSConfigFile","filePath","resolvedFilePath","resolve","error","message","endsWith","webExt","length","discoverConfigFiles","getHomeDir","homedir","magicConfigName","possibleConfigs","join","process","cwd","configs","Promise","all","map","fileName","resolvedFileName","existingConfigs","forEach","f","push"],"sources":["../src/config.js"],"sourcesContent":["/* @flow */\nimport os from 'os';\nimport path from 'path';\n\nimport importFresh from 'import-fresh';\nimport camelCase from 'camelcase';\nimport decamelize from 'decamelize';\n\nimport fileExists from './util/file-exists.js';\nimport { createLogger } from './util/logger.js';\nimport { UsageError, WebExtError } from './errors.js';\n\nconst log = createLogger(import.meta.url);\n\ntype ApplyConfigToArgvParams = {|\n // This is the argv object which will get updated by each\n // config applied.\n argv: Object,\n // This is the argv that only has CLI values applied to it.\n argvFromCLI: Object,\n configObject: Object,\n options: Object,\n configFileName: string,\n|};\n\nexport function applyConfigToArgv({\n argv,\n argvFromCLI,\n configObject,\n options,\n configFileName,\n}: ApplyConfigToArgvParams): Object {\n let newArgv = { ...argv };\n\n for (const option of Object.keys(configObject)) {\n if (camelCase(option) !== option) {\n throw new UsageError(\n `The config option \"${option}\" must be ` +\n `specified in camel case: \"${camelCase(option)}\"`\n );\n }\n\n // A config option cannot be a sub-command config\n // object if it is an array.\n if (\n !Array.isArray(configObject[option]) &&\n typeof options[option] === 'object' &&\n typeof configObject[option] === 'object'\n ) {\n // Descend into the nested configuration for a sub-command.\n newArgv = applyConfigToArgv({\n argv: newArgv,\n argvFromCLI,\n configObject: configObject[option],\n options: options[option],\n configFileName,\n });\n continue;\n }\n\n const decamelizedOptName = decamelize(option, { separator: '-' });\n\n if (typeof options[decamelizedOptName] !== 'object') {\n throw new UsageError(\n `The config file at ${configFileName} specified ` +\n `an unknown option: \"${option}\"`\n );\n }\n if (options[decamelizedOptName].type === undefined) {\n // This means yargs option type wasn't not defined correctly\n throw new WebExtError(`Option: ${option} was defined without a type.`);\n }\n\n const expectedType =\n options[decamelizedOptName].type === 'count'\n ? 'number'\n : options[decamelizedOptName].type;\n\n const optionType = Array.isArray(configObject[option])\n ? 'array'\n : typeof configObject[option];\n\n if (optionType !== expectedType) {\n throw new UsageError(\n `The config file at ${configFileName} specified ` +\n `the type of \"${option}\" incorrectly as \"${optionType}\"` +\n ` (expected type \"${expectedType}\")`\n );\n }\n\n let defaultValue;\n if (options[decamelizedOptName]) {\n if (options[decamelizedOptName].default !== undefined) {\n defaultValue = options[decamelizedOptName].default;\n } else if (expectedType === 'boolean') {\n defaultValue = false;\n }\n }\n\n // This is our best effort (without patching yargs) to detect\n // if a value was set on the CLI instead of in the config.\n // It looks for a default value and if the argv value is\n // different, it assumes that the value was configured on the CLI.\n\n const wasValueSetOnCLI =\n typeof argvFromCLI[option] !== 'undefined' &&\n argvFromCLI[option] !== defaultValue;\n if (wasValueSetOnCLI) {\n log.debug(\n `Favoring CLI: ${option}=${argvFromCLI[option]} over ` +\n `configuration: ${option}=${configObject[option]}`\n );\n newArgv[option] = argvFromCLI[option];\n continue;\n }\n\n newArgv[option] = configObject[option];\n\n const coerce = options[decamelizedOptName].coerce;\n if (coerce) {\n log.debug(`Calling coerce() on configured value for ${option}`);\n newArgv[option] = coerce(newArgv[option]);\n }\n\n newArgv[decamelizedOptName] = newArgv[option];\n }\n return newArgv;\n}\n\nexport function loadJSConfigFile(filePath: string): Object {\n const resolvedFilePath = path.resolve(filePath);\n log.debug(\n `Loading JS config file: \"${filePath}\" ` +\n `(resolved to \"${resolvedFilePath}\")`\n );\n let configObject;\n try {\n configObject = importFresh(resolvedFilePath);\n } catch (error) {\n log.debug('Handling error:', error);\n throw new UsageError(\n `Cannot read config file: ${resolvedFilePath}\\n` +\n `Error: ${error.message}`\n );\n }\n if (filePath.endsWith('package.json')) {\n log.debug('Looking for webExt key inside package.json file');\n configObject = configObject.webExt || {};\n }\n if (Object.keys(configObject).length === 0) {\n log.debug(\n `Config file ${resolvedFilePath} did not define any options. ` +\n 'Did you set module.exports = {...}?'\n );\n }\n return configObject;\n}\n\ntype DiscoverConfigFilesParams = {\n getHomeDir: () => string,\n};\n\nexport async function discoverConfigFiles({\n getHomeDir = os.homedir,\n}: DiscoverConfigFilesParams = {}): Promise<Array<string>> {\n const magicConfigName = 'web-ext-config.js';\n\n // Config files will be loaded in this order.\n const possibleConfigs = [\n // Look for a magic hidden config (preceded by dot) in home dir.\n path.join(getHomeDir(), `.${magicConfigName}`),\n // Look for webExt key inside package.json file\n path.join(process.cwd(), 'package.json'),\n // Look for a magic config in the current working directory.\n path.join(process.cwd(), magicConfigName),\n ];\n\n const configs = await Promise.all(\n possibleConfigs.map(async (fileName) => {\n const resolvedFileName = path.resolve(fileName);\n if (await fileExists(resolvedFileName)) {\n return resolvedFileName;\n } else {\n log.debug(\n `Discovered config \"${resolvedFileName}\" does not ` +\n 'exist or is not readable'\n );\n return undefined;\n }\n })\n );\n\n const existingConfigs = [];\n configs.forEach((f) => {\n if (typeof f === 'string') {\n existingConfigs.push(f);\n }\n });\n return existingConfigs;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":["os","path","camelCase","decamelize","fs","parseJSON","fileExists","createLogger","UsageError","WebExtError","log","import","meta","url","WARN_LEGACY_JS_EXT","join","HELP_ERR_MODULE_FROM_ESM","HELP_ERR_IMPORTEXPORT_CJS","ERR_IMPORT_FROM_CJS","ERR_EXPORT_FROM_CJS","ERR_MODULE_FROM_ESM","applyConfigToArgv","argv","argvFromCLI","configObject","options","configFileName","newArgv","option","Object","keys","Array","isArray","decamelizedOptName","separator","type","undefined","expectedType","optionType","defaultValue","default","wasValueSetOnCLI","debug","coerce","loadJSConfigFile","filePath","resolvedFilePath","resolve","endsWith","warn","nonce","Date","now","Math","random","configModule","readFile","encoding","configDefault","esmConfigMod","error","errorMessage","message","startsWith","includes","webExt","length","discoverConfigFiles","getHomeDir","homedir","magicConfigName","possibleConfigs","process","cwd","configs","Promise","all","map","fileName","resolvedFileName","existingConfigs","forEach","f","push"],"sources":["../src/config.js"],"sourcesContent":["import os from 'os';\nimport path from 'path';\n\nimport camelCase from 'camelcase';\nimport decamelize from 'decamelize';\nimport { fs } from 'mz';\nimport parseJSON from 'parse-json';\n\nimport fileExists from './util/file-exists.js';\nimport { createLogger } from './util/logger.js';\nimport { UsageError, WebExtError } from './errors.js';\n\nconst log = createLogger(import.meta.url);\n\n// NOTE: this error message is used in an interpolated string (while the other two help\n// messages are being logged as is).\nexport const WARN_LEGACY_JS_EXT = [\n 'should be renamed to \".cjs\" or \".mjs\" file extension to ensure its format is not ambiguous.',\n 'Config files with the \".js\" file extension are deprecated and will not be loaded anymore',\n 'in a future web-ext major version.',\n].join(' ');\n\nexport const HELP_ERR_MODULE_FROM_ESM = [\n 'This config file belongs to a package.json file with \"type\" set to \"module\".',\n 'Change the file extension to \".cjs\" or rewrite it as an ES module and use the \".mjs\" file extension.',\n].join(' ');\n\nexport const HELP_ERR_IMPORTEXPORT_CJS = [\n 'This config file is defined as an ES module, but it belongs to either a project directory',\n 'with a package.json file with \"type\" set to \"commonjs\" or one without any package.json file.',\n 'Change the file extension to \".mjs\" to fix the config loading error.',\n].join(' ');\n\nconst ERR_IMPORT_FROM_CJS = 'Cannot use import statement outside a module';\nconst ERR_EXPORT_FROM_CJS = \"Unexpected token 'export'\";\nconst ERR_MODULE_FROM_ESM = 'module is not defined in ES module scope';\n\nexport function applyConfigToArgv({\n argv,\n argvFromCLI,\n configObject,\n options,\n configFileName,\n}) {\n let newArgv = { ...argv };\n\n for (const option of Object.keys(configObject)) {\n if (camelCase(option) !== option) {\n throw new UsageError(\n `The config option \"${option}\" must be ` +\n `specified in camel case: \"${camelCase(option)}\"`,\n );\n }\n\n // A config option cannot be a sub-command config\n // object if it is an array.\n if (\n !Array.isArray(configObject[option]) &&\n typeof options[option] === 'object' &&\n typeof configObject[option] === 'object'\n ) {\n // Descend into the nested configuration for a sub-command.\n newArgv = applyConfigToArgv({\n argv: newArgv,\n argvFromCLI,\n configObject: configObject[option],\n options: options[option],\n configFileName,\n });\n continue;\n }\n\n const decamelizedOptName = decamelize(option, { separator: '-' });\n\n if (typeof options[decamelizedOptName] !== 'object') {\n throw new UsageError(\n `The config file at ${configFileName} specified ` +\n `an unknown option: \"${option}\"`,\n );\n }\n if (options[decamelizedOptName].type === undefined) {\n // This means yargs option type wasn't not defined correctly\n throw new WebExtError(`Option: ${option} was defined without a type.`);\n }\n\n const expectedType =\n options[decamelizedOptName].type === 'count'\n ? 'number'\n : options[decamelizedOptName].type;\n\n const optionType = Array.isArray(configObject[option])\n ? 'array'\n : typeof configObject[option];\n\n if (optionType !== expectedType) {\n throw new UsageError(\n `The config file at ${configFileName} specified ` +\n `the type of \"${option}\" incorrectly as \"${optionType}\"` +\n ` (expected type \"${expectedType}\")`,\n );\n }\n\n let defaultValue;\n if (options[decamelizedOptName]) {\n if (options[decamelizedOptName].default !== undefined) {\n defaultValue = options[decamelizedOptName].default;\n } else if (expectedType === 'boolean') {\n defaultValue = false;\n }\n }\n\n // This is our best effort (without patching yargs) to detect\n // if a value was set on the CLI instead of in the config.\n // It looks for a default value and if the argv value is\n // different, it assumes that the value was configured on the CLI.\n\n const wasValueSetOnCLI =\n typeof argvFromCLI[option] !== 'undefined' &&\n argvFromCLI[option] !== defaultValue;\n if (wasValueSetOnCLI) {\n log.debug(\n `Favoring CLI: ${option}=${argvFromCLI[option]} over ` +\n `configuration: ${option}=${configObject[option]}`,\n );\n newArgv[option] = argvFromCLI[option];\n continue;\n }\n\n newArgv[option] = configObject[option];\n\n const coerce = options[decamelizedOptName].coerce;\n if (coerce) {\n log.debug(`Calling coerce() on configured value for ${option}`);\n newArgv[option] = coerce(newArgv[option]);\n }\n\n newArgv[decamelizedOptName] = newArgv[option];\n }\n return newArgv;\n}\n\nexport async function loadJSConfigFile(filePath) {\n const resolvedFilePath = path.resolve(filePath);\n log.debug(\n `Loading JS config file: \"${filePath}\" ` +\n `(resolved to \"${resolvedFilePath}\")`,\n );\n if (filePath.endsWith('.js')) {\n log.warn(`WARNING: config file ${filePath} ${WARN_LEGACY_JS_EXT}`);\n }\n let configObject;\n try {\n const nonce = `${Date.now()}-${Math.random()}`;\n let configModule;\n if (resolvedFilePath.endsWith('package.json')) {\n configModule = parseJSON(\n await fs.readFile(resolvedFilePath, { encoding: 'utf-8' }),\n );\n } else {\n configModule = await import(`file://${resolvedFilePath}?nonce=${nonce}`);\n }\n\n if (configModule.default) {\n const { default: configDefault, ...esmConfigMod } = configModule;\n // ES modules may expose both a default and named exports and so\n // we merge the named exports on top of what may have been set in\n // the default export.\n configObject = { ...configDefault, ...esmConfigMod };\n } else {\n configObject = { ...configModule };\n }\n } catch (error) {\n log.debug('Handling error:', error);\n let errorMessage = error.message;\n if (error.message.startsWith(ERR_MODULE_FROM_ESM)) {\n errorMessage = HELP_ERR_MODULE_FROM_ESM;\n } else if (\n [ERR_IMPORT_FROM_CJS, ERR_EXPORT_FROM_CJS].includes(error.message)\n ) {\n errorMessage = HELP_ERR_IMPORTEXPORT_CJS;\n }\n throw new UsageError(\n `Cannot read config file: ${resolvedFilePath}\\n` +\n `Error: ${errorMessage}`,\n );\n }\n if (filePath.endsWith('package.json')) {\n log.debug('Looking for webExt key inside package.json file');\n configObject = configObject.webExt || {};\n }\n if (Object.keys(configObject).length === 0) {\n log.debug(\n `Config file ${resolvedFilePath} did not define any options. ` +\n 'Did you set module.exports = {...}?',\n );\n }\n return configObject;\n}\n\nexport async function discoverConfigFiles({ getHomeDir = os.homedir } = {}) {\n const magicConfigName = 'web-ext-config';\n\n // Config files will be loaded in this order.\n const possibleConfigs = [\n // Look for a magic hidden config (preceded by dot) in home dir.\n path.join(getHomeDir(), `.${magicConfigName}.mjs`),\n path.join(getHomeDir(), `.${magicConfigName}.cjs`),\n path.join(getHomeDir(), `.${magicConfigName}.js`),\n // Look for webExt key inside package.json file\n path.join(process.cwd(), 'package.json'),\n // Look for a magic config in the current working directory.\n path.join(process.cwd(), `${magicConfigName}.mjs`),\n path.join(process.cwd(), `${magicConfigName}.cjs`),\n path.join(process.cwd(), `${magicConfigName}.js`),\n // Look for a magic hidden config (preceded by dot) the current working directory.\n path.join(process.cwd(), `.${magicConfigName}.mjs`),\n path.join(process.cwd(), `.${magicConfigName}.cjs`),\n path.join(process.cwd(), `.${magicConfigName}.js`),\n ];\n\n const configs = await Promise.all(\n possibleConfigs.map(async (fileName) => {\n const resolvedFileName = path.resolve(fileName);\n if (await fileExists(resolvedFileName)) {\n return resolvedFileName;\n } else {\n log.debug(\n `Discovered config \"${resolvedFileName}\" does not ` +\n 'exist or is not readable',\n );\n return undefined;\n }\n }),\n );\n\n const existingConfigs = [];\n configs.forEach((f) => {\n if (typeof f === 'string') {\n existingConfigs.push(f);\n }\n });\n return existingConfigs;\n}\n"],"mappings":"AAAA,OAAOA,EAAE,MAAM,IAAI;AACnB,OAAOC,IAAI,MAAM,MAAM;AAEvB,OAAOC,SAAS,MAAM,WAAW;AACjC,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,EAAE,QAAQ,IAAI;AACvB,OAAOC,SAAS,MAAM,YAAY;AAElC,OAAOC,UAAU,MAAM,uBAAuB;AAC9C,SAASC,YAAY,QAAQ,kBAAkB;AAC/C,SAASC,UAAU,EAAEC,WAAW,QAAQ,aAAa;AAErD,MAAMC,GAAG,GAAGH,YAAY,CAACI,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC;;AAEzC;AACA;AACA,OAAO,MAAMC,kBAAkB,GAAG,CAChC,6FAA6F,EAC7F,0FAA0F,EAC1F,oCAAoC,CACrC,CAACC,IAAI,CAAC,GAAG,CAAC;AAEX,OAAO,MAAMC,wBAAwB,GAAG,CACtC,8EAA8E,EAC9E,sGAAsG,CACvG,CAACD,IAAI,CAAC,GAAG,CAAC;AAEX,OAAO,MAAME,yBAAyB,GAAG,CACvC,2FAA2F,EAC3F,8FAA8F,EAC9F,sEAAsE,CACvE,CAACF,IAAI,CAAC,GAAG,CAAC;AAEX,MAAMG,mBAAmB,GAAG,8CAA8C;AAC1E,MAAMC,mBAAmB,GAAG,2BAA2B;AACvD,MAAMC,mBAAmB,GAAG,0CAA0C;AAEtE,OAAO,SAASC,iBAAiBA,CAAC;EAChCC,IAAI;EACJC,WAAW;EACXC,YAAY;EACZC,OAAO;EACPC;AACF,CAAC,EAAE;EACD,IAAIC,OAAO,GAAG;IAAE,GAAGL;EAAK,CAAC;EAEzB,KAAK,MAAMM,MAAM,IAAIC,MAAM,CAACC,IAAI,CAACN,YAAY,CAAC,EAAE;IAC9C,IAAItB,SAAS,CAAC0B,MAAM,CAAC,KAAKA,MAAM,EAAE;MAChC,MAAM,IAAIpB,UAAU,CAClB,sBAAsBoB,MAAM,YAAY,GACtC,6BAA6B1B,SAAS,CAAC0B,MAAM,CAAC,GAClD,CAAC;IACH;;IAEA;IACA;IACA,IACE,CAACG,KAAK,CAACC,OAAO,CAACR,YAAY,CAACI,MAAM,CAAC,CAAC,IACpC,OAAOH,OAAO,CAACG,MAAM,CAAC,KAAK,QAAQ,IACnC,OAAOJ,YAAY,CAACI,MAAM,CAAC,KAAK,QAAQ,EACxC;MACA;MACAD,OAAO,GAAGN,iBAAiB,CAAC;QAC1BC,IAAI,EAAEK,OAAO;QACbJ,WAAW;QACXC,YAAY,EAAEA,YAAY,CAACI,MAAM,CAAC;QAClCH,OAAO,EAAEA,OAAO,CAACG,MAAM,CAAC;QACxBF;MACF,CAAC,CAAC;MACF;IACF;IAEA,MAAMO,kBAAkB,GAAG9B,UAAU,CAACyB,MAAM,EAAE;MAAEM,SAAS,EAAE;IAAI,CAAC,CAAC;IAEjE,IAAI,OAAOT,OAAO,CAACQ,kBAAkB,CAAC,KAAK,QAAQ,EAAE;MACnD,MAAM,IAAIzB,UAAU,CAClB,sBAAsBkB,cAAc,aAAa,GAC/C,uBAAuBE,MAAM,GACjC,CAAC;IACH;IACA,IAAIH,OAAO,CAACQ,kBAAkB,CAAC,CAACE,IAAI,KAAKC,SAAS,EAAE;MAClD;MACA,MAAM,IAAI3B,WAAW,CAAC,WAAWmB,MAAM,8BAA8B,CAAC;IACxE;IAEA,MAAMS,YAAY,GAChBZ,OAAO,CAACQ,kBAAkB,CAAC,CAACE,IAAI,KAAK,OAAO,GACxC,QAAQ,GACRV,OAAO,CAACQ,kBAAkB,CAAC,CAACE,IAAI;IAEtC,MAAMG,UAAU,GAAGP,KAAK,CAACC,OAAO,CAACR,YAAY,CAACI,MAAM,CAAC,CAAC,GAClD,OAAO,GACP,OAAOJ,YAAY,CAACI,MAAM,CAAC;IAE/B,IAAIU,UAAU,KAAKD,YAAY,EAAE;MAC/B,MAAM,IAAI7B,UAAU,CAClB,sBAAsBkB,cAAc,aAAa,GAC/C,gBAAgBE,MAAM,qBAAqBU,UAAU,GAAG,GACxD,oBAAoBD,YAAY,IACpC,CAAC;IACH;IAEA,IAAIE,YAAY;IAChB,IAAId,OAAO,CAACQ,kBAAkB,CAAC,EAAE;MAC/B,IAAIR,OAAO,CAACQ,kBAAkB,CAAC,CAACO,OAAO,KAAKJ,SAAS,EAAE;QACrDG,YAAY,GAAGd,OAAO,CAACQ,kBAAkB,CAAC,CAACO,OAAO;MACpD,CAAC,MAAM,IAAIH,YAAY,KAAK,SAAS,EAAE;QACrCE,YAAY,GAAG,KAAK;MACtB;IACF;;IAEA;IACA;IACA;IACA;;IAEA,MAAME,gBAAgB,GACpB,OAAOlB,WAAW,CAACK,MAAM,CAAC,KAAK,WAAW,IAC1CL,WAAW,CAACK,MAAM,CAAC,KAAKW,YAAY;IACtC,IAAIE,gBAAgB,EAAE;MACpB/B,GAAG,CAACgC,KAAK,CACP,iBAAiBd,MAAM,IAAIL,WAAW,CAACK,MAAM,CAAC,QAAQ,GACpD,kBAAkBA,MAAM,IAAIJ,YAAY,CAACI,MAAM,CAAC,EACpD,CAAC;MACDD,OAAO,CAACC,MAAM,CAAC,GAAGL,WAAW,CAACK,MAAM,CAAC;MACrC;IACF;IAEAD,OAAO,CAACC,MAAM,CAAC,GAAGJ,YAAY,CAACI,MAAM,CAAC;IAEtC,MAAMe,MAAM,GAAGlB,OAAO,CAACQ,kBAAkB,CAAC,CAACU,MAAM;IACjD,IAAIA,MAAM,EAAE;MACVjC,GAAG,CAACgC,KAAK,CAAC,4CAA4Cd,MAAM,EAAE,CAAC;MAC/DD,OAAO,CAACC,MAAM,CAAC,GAAGe,MAAM,CAAChB,OAAO,CAACC,MAAM,CAAC,CAAC;IAC3C;IAEAD,OAAO,CAACM,kBAAkB,CAAC,GAAGN,OAAO,CAACC,MAAM,CAAC;EAC/C;EACA,OAAOD,OAAO;AAChB;AAEA,OAAO,eAAeiB,gBAAgBA,CAACC,QAAQ,EAAE;EAC/C,MAAMC,gBAAgB,GAAG7C,IAAI,CAAC8C,OAAO,CAACF,QAAQ,CAAC;EAC/CnC,GAAG,CAACgC,KAAK,CACP,4BAA4BG,QAAQ,IAAI,GACtC,iBAAiBC,gBAAgB,IACrC,CAAC;EACD,IAAID,QAAQ,CAACG,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC5BtC,GAAG,CAACuC,IAAI,CAAC,wBAAwBJ,QAAQ,IAAI/B,kBAAkB,EAAE,CAAC;EACpE;EACA,IAAIU,YAAY;EAChB,IAAI;IACF,MAAM0B,KAAK,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,IAAIC,IAAI,CAACC,MAAM,CAAC,CAAC,EAAE;IAC9C,IAAIC,YAAY;IAChB,IAAIT,gBAAgB,CAACE,QAAQ,CAAC,cAAc,CAAC,EAAE;MAC7CO,YAAY,GAAGlD,SAAS,CACtB,MAAMD,EAAE,CAACoD,QAAQ,CAACV,gBAAgB,EAAE;QAAEW,QAAQ,EAAE;MAAQ,CAAC,CAC3D,CAAC;IACH,CAAC,MAAM;MACLF,YAAY,GAAG,MAAM,MAAM,CAAC,UAAUT,gBAAgB,UAAUI,KAAK,EAAE,CAAC;IAC1E;IAEA,IAAIK,YAAY,CAACf,OAAO,EAAE;MACxB,MAAM;QAAEA,OAAO,EAAEkB,aAAa;QAAE,GAAGC;MAAa,CAAC,GAAGJ,YAAY;MAChE;MACA;MACA;MACA/B,YAAY,GAAG;QAAE,GAAGkC,aAAa;QAAE,GAAGC;MAAa,CAAC;IACtD,CAAC,MAAM;MACLnC,YAAY,GAAG;QAAE,GAAG+B;MAAa,CAAC;IACpC;EACF,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdlD,GAAG,CAACgC,KAAK,CAAC,iBAAiB,EAAEkB,KAAK,CAAC;IACnC,IAAIC,YAAY,GAAGD,KAAK,CAACE,OAAO;IAChC,IAAIF,KAAK,CAACE,OAAO,CAACC,UAAU,CAAC3C,mBAAmB,CAAC,EAAE;MACjDyC,YAAY,GAAG7C,wBAAwB;IACzC,CAAC,MAAM,IACL,CAACE,mBAAmB,EAAEC,mBAAmB,CAAC,CAAC6C,QAAQ,CAACJ,KAAK,CAACE,OAAO,CAAC,EAClE;MACAD,YAAY,GAAG5C,yBAAyB;IAC1C;IACA,MAAM,IAAIT,UAAU,CAClB,4BAA4BsC,gBAAgB,IAAI,GAC9C,UAAUe,YAAY,EAC1B,CAAC;EACH;EACA,IAAIhB,QAAQ,CAACG,QAAQ,CAAC,cAAc,CAAC,EAAE;IACrCtC,GAAG,CAACgC,KAAK,CAAC,iDAAiD,CAAC;IAC5DlB,YAAY,GAAGA,YAAY,CAACyC,MAAM,IAAI,CAAC,CAAC;EAC1C;EACA,IAAIpC,MAAM,CAACC,IAAI,CAACN,YAAY,CAAC,CAAC0C,MAAM,KAAK,CAAC,EAAE;IAC1CxD,GAAG,CAACgC,KAAK,CACP,eAAeI,gBAAgB,+BAA+B,GAC5D,qCACJ,CAAC;EACH;EACA,OAAOtB,YAAY;AACrB;AAEA,OAAO,eAAe2C,mBAAmBA,CAAC;EAAEC,UAAU,GAAGpE,EAAE,CAACqE;AAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;EAC1E,MAAMC,eAAe,GAAG,gBAAgB;;EAExC;EACA,MAAMC,eAAe,GAAG;EACtB;EACAtE,IAAI,CAACc,IAAI,CAACqD,UAAU,CAAC,CAAC,EAAE,IAAIE,eAAe,MAAM,CAAC,EAClDrE,IAAI,CAACc,IAAI,CAACqD,UAAU,CAAC,CAAC,EAAE,IAAIE,eAAe,MAAM,CAAC,EAClDrE,IAAI,CAACc,IAAI,CAACqD,UAAU,CAAC,CAAC,EAAE,IAAIE,eAAe,KAAK,CAAC;EACjD;EACArE,IAAI,CAACc,IAAI,CAACyD,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC;EACxC;EACAxE,IAAI,CAACc,IAAI,CAACyD,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGH,eAAe,MAAM,CAAC,EAClDrE,IAAI,CAACc,IAAI,CAACyD,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGH,eAAe,MAAM,CAAC,EAClDrE,IAAI,CAACc,IAAI,CAACyD,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGH,eAAe,KAAK,CAAC;EACjD;EACArE,IAAI,CAACc,IAAI,CAACyD,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,IAAIH,eAAe,MAAM,CAAC,EACnDrE,IAAI,CAACc,IAAI,CAACyD,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,IAAIH,eAAe,MAAM,CAAC,EACnDrE,IAAI,CAACc,IAAI,CAACyD,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,IAAIH,eAAe,KAAK,CAAC,CACnD;EAED,MAAMI,OAAO,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC/BL,eAAe,CAACM,GAAG,CAAC,MAAOC,QAAQ,IAAK;IACtC,MAAMC,gBAAgB,GAAG9E,IAAI,CAAC8C,OAAO,CAAC+B,QAAQ,CAAC;IAC/C,IAAI,MAAMxE,UAAU,CAACyE,gBAAgB,CAAC,EAAE;MACtC,OAAOA,gBAAgB;IACzB,CAAC,MAAM;MACLrE,GAAG,CAACgC,KAAK,CACP,sBAAsBqC,gBAAgB,aAAa,GACjD,0BACJ,CAAC;MACD,OAAO3C,SAAS;IAClB;EACF,CAAC,CACH,CAAC;EAED,MAAM4C,eAAe,GAAG,EAAE;EAC1BN,OAAO,CAACO,OAAO,CAAEC,CAAC,IAAK;IACrB,IAAI,OAAOA,CAAC,KAAK,QAAQ,EAAE;MACzBF,eAAe,CAACG,IAAI,CAACD,CAAC,CAAC;IACzB;EACF,CAAC,CAAC;EACF,OAAOF,eAAe;AACxB","ignoreList":[]}
|
package/lib/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":["ExtendableError","WebExtError","constructor","message","UsageError","InvalidManifest","RemoteTempInstallNotSupported","MultiExtensionsReloadError","errorsMap","errors","sourceDir","error","msg","String","errorsBySourceDir","onlyInstancesOf","predicate","errorHandler","onlyErrorsWithCode","codeWanted","throwError","Array","isArray","indexOf","code","errno","isErrorWithCode"],"sources":["../src/errors.js"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"errors.js","names":["ExtendableError","WebExtError","constructor","message","UsageError","InvalidManifest","RemoteTempInstallNotSupported","MultiExtensionsReloadError","errorsMap","errors","sourceDir","error","msg","String","errorsBySourceDir","onlyInstancesOf","predicate","errorHandler","onlyErrorsWithCode","codeWanted","throwError","Array","isArray","indexOf","code","errno","isErrorWithCode"],"sources":["../src/errors.js"],"sourcesContent":["import ExtendableError from 'es6-error';\n\n/*\n * Base error for all custom web-ext errors.\n */\nexport class WebExtError extends ExtendableError {\n constructor(message) {\n super(message);\n }\n}\n\n/*\n * The class for errors that can be fixed by the developer.\n */\nexport class UsageError extends WebExtError {\n constructor(message) {\n super(message);\n }\n}\n\n/*\n * The manifest for the extension is invalid (or missing).\n */\nexport class InvalidManifest extends UsageError {\n constructor(message) {\n super(message);\n }\n}\n\n/*\n * The remote Firefox does not support temporary add-on installation.\n */\nexport class RemoteTempInstallNotSupported extends WebExtError {\n constructor(message) {\n super(message);\n }\n}\n\n/*\n * The errors collected when reloading all extensions at once\n * (initialized from a map of errors by extensionSourceDir string).\n */\nexport class MultiExtensionsReloadError extends WebExtError {\n constructor(errorsMap) {\n let errors = '';\n for (const [sourceDir, error] of errorsMap) {\n const msg = String(error);\n errors += `\\nError on extension loaded from ${sourceDir}: ${msg}\\n`;\n }\n const message = `Reload errors: ${errors}`;\n\n super(message);\n this.errorsBySourceDir = errorsMap;\n }\n}\n\n/*\n * Sugar-y way to catch only instances of a certain error.\n *\n * Usage:\n *\n * Promise.reject(SyntaxError)\n * .catch(onlyInstancesOf(SyntaxError, (error) => {\n * // error is guaranteed to be an instance of SyntaxError\n * }))\n *\n * All other errors will be re-thrown.\n *\n */\nexport function onlyInstancesOf(predicate, errorHandler) {\n return (error) => {\n if (error instanceof predicate) {\n return errorHandler(error);\n } else {\n throw error;\n }\n };\n}\n\n/*\n * Sugar-y way to catch only errors having certain code(s).\n *\n * Usage:\n *\n * Promise.resolve()\n * .catch(onlyErrorsWithCode('ENOENT', (error) => {\n * // error.code is guaranteed to be ENOENT\n * }))\n *\n * or:\n *\n * Promise.resolve()\n * .catch(onlyErrorsWithCode(['ENOENT', 'ENOTDIR'], (error) => {\n * // ...\n * }))\n *\n * All other errors will be re-thrown.\n *\n */\nexport function onlyErrorsWithCode(codeWanted, errorHandler) {\n return (error) => {\n let throwError = true;\n\n if (Array.isArray(codeWanted)) {\n if (\n codeWanted.indexOf(error.code) !== -1 ||\n codeWanted.indexOf(error.errno) !== -1\n ) {\n throwError = false;\n }\n } else if (error.code === codeWanted || error.errno === codeWanted) {\n throwError = false;\n }\n\n if (throwError) {\n throw error;\n }\n\n return errorHandler(error);\n };\n}\n\nexport function isErrorWithCode(codeWanted, error) {\n if (Array.isArray(codeWanted) && codeWanted.indexOf(error.code) !== -1) {\n return true;\n } else if (error.code === codeWanted) {\n return true;\n }\n\n return false;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* This module provide an ExtensionRunner subclass that manage an extension executed
|
|
3
3
|
* in a Chromium-based browser instance.
|
|
4
4
|
*/
|
|
5
|
+
|
|
5
6
|
import path from 'path';
|
|
6
7
|
import fs from 'fs-extra';
|
|
7
8
|
import asyncMkdirp from 'mkdirp';
|
|
@@ -19,6 +20,14 @@ export const DEFAULT_CHROME_FLAGS = ChromeLauncher.defaultFlags().filter(flag =>
|
|
|
19
20
|
* Implements an IExtensionRunner which manages a Chromium instance.
|
|
20
21
|
*/
|
|
21
22
|
export class ChromiumExtensionRunner {
|
|
23
|
+
cleanupCallbacks;
|
|
24
|
+
params;
|
|
25
|
+
chromiumInstance;
|
|
26
|
+
chromiumLaunch;
|
|
27
|
+
reloadManagerExtension;
|
|
28
|
+
wss;
|
|
29
|
+
exiting;
|
|
30
|
+
_promiseSetupDone;
|
|
22
31
|
constructor(params) {
|
|
23
32
|
const {
|
|
24
33
|
chromiumLaunch = defaultChromiumLaunch
|
|
@@ -221,8 +230,6 @@ export class ChromiumExtensionRunner {
|
|
|
221
230
|
scripts: ['bg.js']
|
|
222
231
|
}
|
|
223
232
|
}));
|
|
224
|
-
|
|
225
|
-
// $FlowIgnore: this method is only called right after creating the server and so wss should be defined.
|
|
226
233
|
const wssInfo = this.wss.address();
|
|
227
234
|
const bgPage = `(function bgPage() {
|
|
228
235
|
async function getAllDevExtensions() {
|
|
@@ -282,7 +289,8 @@ export class ChromiumExtensionRunner {
|
|
|
282
289
|
* Reloads a single extension, collect any reload error and resolves to
|
|
283
290
|
* an array composed by a single ExtensionRunnerReloadResult object.
|
|
284
291
|
*/
|
|
285
|
-
async reloadExtensionBySourceDir(extensionSourceDir
|
|
292
|
+
async reloadExtensionBySourceDir(extensionSourceDir // eslint-disable-line no-unused-vars
|
|
293
|
+
) {
|
|
286
294
|
// TODO(rpl): detect the extension ids assigned to the
|
|
287
295
|
// target extensions and map it to the extensions source dir
|
|
288
296
|
// (https://github.com/mozilla/web-ext/issues/1687).
|
|
@@ -1 +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","_this$wss","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 = ['--disable-extensions', '--mute-audio'];\n\nexport const DEFAULT_CHROME_FLAGS: Array<string> =\n ChromeLauncher.defaultFlags().filter(\n (flag) => !EXCLUDED_CHROME_FLAGS.includes(flag)\n );\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 { chromiumLaunch = defaultChromiumLaunch } = 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 (\n (await fileExists(localStatePath)) && (await isDirectory(defaultPath))\n );\n }\n\n static async isProfileDir(dirPath: string): Promise<boolean> {\n const securePreferencesPath = path.join(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 * 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\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]\n .concat(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\n if (userDataDir && this.params.keepProfileChanges) {\n if (\n profileDirName &&\n !(await ChromiumExtensionRunner.isUserDataDir(userDataDir))\n ) {\n throw new Error(\n '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 }\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(\n path.join(userDataDir, profileDirName),\n path.join(tmpDirPath, 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\n : [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 );\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 );\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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"}
|
|
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","cleanupCallbacks","params","chromiumInstance","chromiumLaunch","reloadManagerExtension","wss","exiting","_promiseSetupDone","constructor","Set","getName","run","setupInstance","isUserDataDir","dirPath","localStatePath","join","defaultPath","isProfileDir","securePreferencesPath","getProfilePaths","chromiumProfile","userDataDir","profileDirName","isProfileDirAndNotUserData","dir","base","parse","Promise","resolve","server","port","host","clientTracking","on","socket","err","debug","createReloadManagerExtension","extensions","concat","map","sourceDir","chromiumBinary","chromeFlags","push","args","keepProfileChanges","Error","tmpDir","create","tmpDirPath","copy","startingUrl","startUrl","startingUrls","Array","isArray","shift","enableExtensions","chromePath","ignoreDefaultFlags","process","once","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","_this$wss","terminate","close","error"],"sources":["../../src/extension-runners/chromium.js"],"sourcesContent":["/**\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 isDirectory from '../util/is-directory.js';\nimport fileExists from '../util/file-exists.js';\n\nconst log = createLogger(import.meta.url);\n\nconst EXCLUDED_CHROME_FLAGS = ['--disable-extensions', '--mute-audio'];\n\nexport const DEFAULT_CHROME_FLAGS = ChromeLauncher.defaultFlags().filter(\n (flag) => !EXCLUDED_CHROME_FLAGS.includes(flag),\n);\n\n/**\n * Implements an IExtensionRunner which manages a Chromium instance.\n */\nexport class ChromiumExtensionRunner {\n cleanupCallbacks;\n params;\n chromiumInstance;\n chromiumLaunch;\n reloadManagerExtension;\n wss;\n exiting;\n _promiseSetupDone;\n\n constructor(params) {\n const { chromiumLaunch = defaultChromiumLaunch } = 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() {\n return 'Chromium';\n }\n\n async run() {\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) {\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 (\n (await fileExists(localStatePath)) && (await isDirectory(defaultPath))\n );\n }\n\n static async isProfileDir(dirPath) {\n const securePreferencesPath = path.join(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) {\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 * Setup the Chromium Profile and run a Chromium instance.\n */\n async setupInstance() {\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\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]\n .concat(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\n if (userDataDir && this.params.keepProfileChanges) {\n if (\n profileDirName &&\n !(await ChromiumExtensionRunner.isUserDataDir(userDataDir))\n ) {\n throw new Error(\n '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 }\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(\n path.join(userDataDir, profileDirName),\n path.join(tmpDirPath, 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\n : [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) {\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() {\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 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() {\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 );\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, // eslint-disable-line no-unused-vars\n ) {\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) {\n this.cleanupCallbacks.add(fn);\n }\n\n /**\n * Exits the runner, by closing the managed Chromium instance.\n */\n async exit() {\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 );\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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","ignoreList":[]}
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
* This module provide an ExtensionRunner subclass that manage an extension executed
|
|
3
3
|
* in a Firefox for Android instance.
|
|
4
4
|
*/
|
|
5
|
+
|
|
5
6
|
import path from 'path';
|
|
6
7
|
import readline from 'readline';
|
|
7
8
|
import { withTempDir } from '../util/temp-dir.js';
|
|
8
9
|
import DefaultADBUtils from '../util/adb.js';
|
|
9
|
-
import { showDesktopNotification as defaultDesktopNotifications } from '../util/desktop-notifier.js';
|
|
10
10
|
import { MultiExtensionsReloadError, UsageError, WebExtError } from '../errors.js';
|
|
11
|
-
import
|
|
12
|
-
import { connectWithMaxRetries as defaultFirefoxConnector, findFreeTcpPort } from '../firefox/remote.js';
|
|
11
|
+
import { findFreeTcpPort } from '../firefox/remote.js';
|
|
13
12
|
import { createLogger } from '../util/logger.js';
|
|
14
13
|
import { isTTY, setRawMode } from '../util/stdin.js';
|
|
15
14
|
const log = createLogger(import.meta.url);
|
|
@@ -30,6 +29,7 @@ const DEFAULT_ADB_HOST = '127.0.0.1';
|
|
|
30
29
|
const getIgnoredParamsWarningsMessage = optionName => {
|
|
31
30
|
return `The Firefox for Android target does not support ${optionName}`;
|
|
32
31
|
};
|
|
32
|
+
|
|
33
33
|
/**
|
|
34
34
|
* Implements an IExtensionRunner which manages a Firefox for Android instance.
|
|
35
35
|
*/
|
|
@@ -38,6 +38,18 @@ export class FirefoxAndroidExtensionRunner {
|
|
|
38
38
|
static unixSocketDiscoveryRetryInterval = 3 * 1000;
|
|
39
39
|
// Wait for at most 3 minutes before giving up.
|
|
40
40
|
static unixSocketDiscoveryMaxTime = 3 * 60 * 1000;
|
|
41
|
+
params;
|
|
42
|
+
adbUtils;
|
|
43
|
+
exiting;
|
|
44
|
+
selectedAdbDevice;
|
|
45
|
+
selectedFirefoxApk;
|
|
46
|
+
selectedArtifactsDir;
|
|
47
|
+
selectedRDPSocketFile;
|
|
48
|
+
selectedTCPPort;
|
|
49
|
+
cleanupCallbacks;
|
|
50
|
+
adbExtensionsPathBySourceDir;
|
|
51
|
+
reloadableExtensions;
|
|
52
|
+
remoteFirefox;
|
|
41
53
|
constructor(params) {
|
|
42
54
|
this.params = params;
|
|
43
55
|
this.cleanupCallbacks = new Set();
|