web-ext 10.4.0 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/lib/cmd/build.js.map +1 -1
  2. package/lib/cmd/docs.js.map +1 -1
  3. package/lib/cmd/dump-config.js.map +1 -1
  4. package/lib/cmd/index.js.map +1 -1
  5. package/lib/cmd/lint.js +2 -0
  6. package/lib/cmd/lint.js.map +1 -1
  7. package/lib/cmd/run.js.map +1 -1
  8. package/lib/cmd/sign.js.map +1 -1
  9. package/lib/config.js.map +1 -1
  10. package/lib/errors.js.map +1 -1
  11. package/lib/extension-runners/chromium.js +1 -2
  12. package/lib/extension-runners/chromium.js.map +1 -1
  13. package/lib/extension-runners/firefox-android.js.map +1 -1
  14. package/lib/extension-runners/firefox-desktop.js.map +1 -1
  15. package/lib/extension-runners/index.js.map +1 -1
  16. package/lib/firefox/index.js.map +1 -1
  17. package/lib/firefox/package-identifiers.js.map +1 -1
  18. package/lib/firefox/preferences.js.map +1 -1
  19. package/lib/firefox/rdp-client.js +2 -2
  20. package/lib/firefox/rdp-client.js.map +1 -1
  21. package/lib/firefox/remote.js.map +1 -1
  22. package/lib/main.js.map +1 -1
  23. package/lib/program.js +6 -1
  24. package/lib/program.js.map +1 -1
  25. package/lib/util/adb.js.map +1 -1
  26. package/lib/util/artifacts.js.map +1 -1
  27. package/lib/util/expand-prefs.js.map +1 -1
  28. package/lib/util/file-exists.js.map +1 -1
  29. package/lib/util/file-filter.js.map +1 -1
  30. package/lib/util/is-directory.js.map +1 -1
  31. package/lib/util/logger.js.map +1 -1
  32. package/lib/util/manifest.js +1 -1
  33. package/lib/util/manifest.js.map +1 -1
  34. package/lib/util/promisify.js.map +1 -1
  35. package/lib/util/stdin.js.map +1 -1
  36. package/lib/util/submit-addon.js +6 -3
  37. package/lib/util/submit-addon.js.map +1 -1
  38. package/lib/util/temp-dir.js.map +1 -1
  39. package/lib/util/updates.js.map +1 -1
  40. package/lib/watcher.js.map +1 -1
  41. package/package.json +12 -19
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","names":["path","createWriteStream","fs","parseJSON","stripBom","defaultFromEvent","zipDir","defaultSourceWatcher","getValidatedManifest","getManifestId","prepareArtifactsDir","createLogger","UsageError","isErrorWithCode","createFileFilter","defaultFileFilterCreator","log","import","meta","url","DEFAULT_FILENAME_TEMPLATE","safeFileName","name","toLowerCase","replace","getDefaultLocalizedName","messageFile","manifestData","messageData","messageContents","extensionName","readFile","encoding","error","default","stripJsonComments","match","messageName","message","Promise","resolve","getStringPropertyValue","prop","obj","properties","split","value","reduce","prev","curr","includes","stringValue","length","getPackageNameFromTemplate","filenameTemplate","packageName","manifestProperty","parsed","parse","dir","ext","defaultPackageCreator","sourceDir","fileFilter","artifactsDir","overwriteDest","showReadyMessage","filename","fromEvent","id","debug","buffer","filter","args","wantFile","default_locale","join","extensionPath","stream","flags","write","end","info","overwriteStream","build","asNeeded","ignoreFiles","onSourceChange","packageCreator","rebuildAsNeeded","createPackage","result","onChange","catch","stack","shouldWatchFile"],"sources":["../../src/cmd/build.js"],"sourcesContent":["import path from 'path';\nimport { createWriteStream } from 'fs';\nimport fs from 'fs/promises';\n\nimport parseJSON from 'parse-json';\nimport stripBom from 'strip-bom';\nimport defaultFromEvent from 'promise-toolbox/fromEvent';\nimport zipDir from 'zip-dir';\n\nimport defaultSourceWatcher from '../watcher.js';\nimport getValidatedManifest, { getManifestId } from '../util/manifest.js';\nimport { prepareArtifactsDir } from '../util/artifacts.js';\nimport { createLogger } from '../util/logger.js';\nimport { UsageError, isErrorWithCode } from '../errors.js';\nimport { createFileFilter as defaultFileFilterCreator } from '../util/file-filter.js';\n\nconst log = createLogger(import.meta.url);\nconst DEFAULT_FILENAME_TEMPLATE = '{name}-{version}.zip';\n\nexport function safeFileName(name) {\n return name.toLowerCase().replace(/[^a-z0-9.-]+/g, '_');\n}\n\n// defaultPackageCreator types and implementation.\n\n// This defines the _locales/messages.json type. See:\n// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Internationalization#Providing_localized_strings_in__locales\n\nexport async function getDefaultLocalizedName({ messageFile, manifestData }) {\n let messageData;\n let messageContents;\n let extensionName = manifestData.name;\n\n try {\n messageContents = await fs.readFile(messageFile, { encoding: 'utf-8' });\n } catch (error) {\n throw new UsageError(\n `Error reading messages.json file at ${messageFile}: ${error}`,\n );\n }\n\n messageContents = stripBom(messageContents);\n\n const { default: stripJsonComments } = await import('strip-json-comments');\n try {\n messageData = parseJSON(stripJsonComments(messageContents));\n } catch (error) {\n throw new UsageError(\n `Error parsing messages.json file at ${messageFile}: ${error}`,\n );\n }\n\n extensionName = manifestData.name.replace(\n /__MSG_([A-Za-z0-9@_]+?)__/g,\n (match, messageName) => {\n if (!(messageData[messageName] && messageData[messageName].message)) {\n const error = new UsageError(\n `The locale file ${messageFile} ` + `is missing key: ${messageName}`,\n );\n throw error;\n } else {\n return messageData[messageName].message;\n }\n },\n );\n return Promise.resolve(extensionName);\n}\n\n// https://stackoverflow.com/a/22129960\nexport function getStringPropertyValue(prop, obj) {\n const properties = prop.split('.');\n const value = properties.reduce((prev, curr) => prev && prev[curr], obj);\n if (!['string', 'number'].includes(typeof value)) {\n throw new UsageError(\n `Manifest key \"${prop}\" is missing or has an invalid type: ${value}`,\n );\n }\n const stringValue = `${value}`;\n if (!stringValue.length) {\n throw new UsageError(`Manifest key \"${prop}\" value is an empty string`);\n }\n return stringValue;\n}\n\nfunction getPackageNameFromTemplate(filenameTemplate, manifestData) {\n const packageName = filenameTemplate.replace(\n /{([A-Za-z0-9._]+?)}/g,\n (match, manifestProperty) => {\n return safeFileName(\n getStringPropertyValue(manifestProperty, manifestData),\n );\n },\n );\n\n // Validate the resulting packageName string, after interpolating the manifest property\n // specified in the template string.\n const parsed = path.parse(packageName);\n if (parsed.dir) {\n throw new UsageError(\n `Invalid filename template \"${filenameTemplate}\". ` +\n `Filename \"${packageName}\" should not contain a path`,\n );\n }\n if (!['.zip', '.xpi'].includes(parsed.ext)) {\n throw new UsageError(\n `Invalid filename template \"${filenameTemplate}\". ` +\n `Filename \"${packageName}\" should have a zip or xpi extension`,\n );\n }\n\n return packageName;\n}\n\nexport async function defaultPackageCreator(\n {\n manifestData,\n sourceDir,\n fileFilter,\n artifactsDir,\n overwriteDest,\n showReadyMessage,\n filename = DEFAULT_FILENAME_TEMPLATE,\n },\n { fromEvent = defaultFromEvent } = {},\n) {\n let id;\n if (manifestData) {\n id = getManifestId(manifestData);\n log.debug(`Using manifest id=${id || '[not specified]'}`);\n } else {\n manifestData = await getValidatedManifest(sourceDir);\n }\n\n const buffer = await zipDir(sourceDir, {\n filter: (...args) => fileFilter.wantFile(...args),\n });\n\n let filenameTemplate = filename;\n\n let { default_locale } = manifestData;\n if (default_locale) {\n default_locale = default_locale.replace(/-/g, '_');\n const messageFile = path.join(\n sourceDir,\n '_locales',\n default_locale,\n 'messages.json',\n );\n log.debug('Manifest declared default_locale, localizing extension name');\n const extensionName = await getDefaultLocalizedName({\n messageFile,\n manifestData,\n });\n // allow for a localized `{name}`, without mutating `manifestData`\n filenameTemplate = filenameTemplate.replace(/{name}/g, extensionName);\n }\n\n const packageName = safeFileName(\n getPackageNameFromTemplate(filenameTemplate, manifestData),\n );\n const extensionPath = path.join(artifactsDir, packageName);\n\n // Added 'wx' flags to avoid overwriting of existing package.\n const stream = createWriteStream(extensionPath, { flags: 'wx' });\n\n stream.write(buffer, () => {\n stream.end();\n });\n\n try {\n await fromEvent(stream, 'close');\n } catch (error) {\n if (!isErrorWithCode('EEXIST', error)) {\n throw error;\n }\n if (!overwriteDest) {\n throw new UsageError(\n `Extension exists at the destination path: ${extensionPath}\\n` +\n 'Use --overwrite-dest to enable overwriting.',\n );\n }\n log.info(`Destination exists, overwriting: ${extensionPath}`);\n const overwriteStream = createWriteStream(extensionPath);\n overwriteStream.write(buffer, () => {\n overwriteStream.end();\n });\n await fromEvent(overwriteStream, 'close');\n }\n\n if (showReadyMessage) {\n log.info(`Your web extension is ready: ${extensionPath}`);\n }\n return { extensionPath };\n}\n\n// Build command types and implementation.\n\nexport default async function build(\n {\n sourceDir,\n artifactsDir,\n asNeeded = false,\n overwriteDest = false,\n ignoreFiles = [],\n filename = DEFAULT_FILENAME_TEMPLATE,\n },\n {\n manifestData,\n createFileFilter = defaultFileFilterCreator,\n fileFilter = createFileFilter({\n sourceDir,\n artifactsDir,\n ignoreFiles,\n }),\n onSourceChange = defaultSourceWatcher,\n packageCreator = defaultPackageCreator,\n showReadyMessage = true,\n } = {},\n) {\n const rebuildAsNeeded = asNeeded; // alias for `build --as-needed`\n log.info(`Building web extension from ${sourceDir}`);\n\n const createPackage = () =>\n packageCreator({\n manifestData,\n sourceDir,\n fileFilter,\n artifactsDir,\n overwriteDest,\n showReadyMessage,\n filename,\n });\n\n await prepareArtifactsDir(artifactsDir);\n const result = await createPackage();\n\n if (rebuildAsNeeded) {\n log.info('Rebuilding when files change...');\n onSourceChange({\n sourceDir,\n artifactsDir,\n onChange: () => {\n return createPackage().catch((error) => {\n log.error(error.stack);\n throw error;\n });\n },\n shouldWatchFile: (...args) => fileFilter.wantFile(...args),\n });\n }\n\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"build.js","names":[],"sources":["../../src/cmd/build.js"],"sourcesContent":["import path from 'path';\nimport { createWriteStream } from 'fs';\nimport fs from 'fs/promises';\n\nimport parseJSON from 'parse-json';\nimport stripBom from 'strip-bom';\nimport defaultFromEvent from 'promise-toolbox/fromEvent';\nimport zipDir from 'zip-dir';\n\nimport defaultSourceWatcher from '../watcher.js';\nimport getValidatedManifest, { getManifestId } from '../util/manifest.js';\nimport { prepareArtifactsDir } from '../util/artifacts.js';\nimport { createLogger } from '../util/logger.js';\nimport { UsageError, isErrorWithCode } from '../errors.js';\nimport { createFileFilter as defaultFileFilterCreator } from '../util/file-filter.js';\n\nconst log = createLogger(import.meta.url);\nconst DEFAULT_FILENAME_TEMPLATE = '{name}-{version}.zip';\n\nexport function safeFileName(name) {\n return name.toLowerCase().replace(/[^a-z0-9.-]+/g, '_');\n}\n\n// defaultPackageCreator types and implementation.\n\n// This defines the _locales/messages.json type. See:\n// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Internationalization#Providing_localized_strings_in__locales\n\nexport async function getDefaultLocalizedName({ messageFile, manifestData }) {\n let messageData;\n let messageContents;\n let extensionName = manifestData.name;\n\n try {\n messageContents = await fs.readFile(messageFile, { encoding: 'utf-8' });\n } catch (error) {\n throw new UsageError(\n `Error reading messages.json file at ${messageFile}: ${error}`,\n );\n }\n\n messageContents = stripBom(messageContents);\n\n const { default: stripJsonComments } = await import('strip-json-comments');\n try {\n messageData = parseJSON(stripJsonComments(messageContents));\n } catch (error) {\n throw new UsageError(\n `Error parsing messages.json file at ${messageFile}: ${error}`,\n );\n }\n\n extensionName = manifestData.name.replace(\n /__MSG_([A-Za-z0-9@_]+?)__/g,\n (match, messageName) => {\n if (!(messageData[messageName] && messageData[messageName].message)) {\n const error = new UsageError(\n `The locale file ${messageFile} ` + `is missing key: ${messageName}`,\n );\n throw error;\n } else {\n return messageData[messageName].message;\n }\n },\n );\n return Promise.resolve(extensionName);\n}\n\n// https://stackoverflow.com/a/22129960\nexport function getStringPropertyValue(prop, obj) {\n const properties = prop.split('.');\n const value = properties.reduce((prev, curr) => prev && prev[curr], obj);\n if (!['string', 'number'].includes(typeof value)) {\n throw new UsageError(\n `Manifest key \"${prop}\" is missing or has an invalid type: ${value}`,\n );\n }\n const stringValue = `${value}`;\n if (!stringValue.length) {\n throw new UsageError(`Manifest key \"${prop}\" value is an empty string`);\n }\n return stringValue;\n}\n\nfunction getPackageNameFromTemplate(filenameTemplate, manifestData) {\n const packageName = filenameTemplate.replace(\n /{([A-Za-z0-9._]+?)}/g,\n (match, manifestProperty) => {\n return safeFileName(\n getStringPropertyValue(manifestProperty, manifestData),\n );\n },\n );\n\n // Validate the resulting packageName string, after interpolating the manifest property\n // specified in the template string.\n const parsed = path.parse(packageName);\n if (parsed.dir) {\n throw new UsageError(\n `Invalid filename template \"${filenameTemplate}\". ` +\n `Filename \"${packageName}\" should not contain a path`,\n );\n }\n if (!['.zip', '.xpi'].includes(parsed.ext)) {\n throw new UsageError(\n `Invalid filename template \"${filenameTemplate}\". ` +\n `Filename \"${packageName}\" should have a zip or xpi extension`,\n );\n }\n\n return packageName;\n}\n\nexport async function defaultPackageCreator(\n {\n manifestData,\n sourceDir,\n fileFilter,\n artifactsDir,\n overwriteDest,\n showReadyMessage,\n filename = DEFAULT_FILENAME_TEMPLATE,\n },\n { fromEvent = defaultFromEvent } = {},\n) {\n let id;\n if (manifestData) {\n id = getManifestId(manifestData);\n log.debug(`Using manifest id=${id || '[not specified]'}`);\n } else {\n manifestData = await getValidatedManifest(sourceDir);\n }\n\n const buffer = await zipDir(sourceDir, {\n filter: (...args) => fileFilter.wantFile(...args),\n });\n\n let filenameTemplate = filename;\n\n let { default_locale } = manifestData;\n if (default_locale) {\n default_locale = default_locale.replace(/-/g, '_');\n const messageFile = path.join(\n sourceDir,\n '_locales',\n default_locale,\n 'messages.json',\n );\n log.debug('Manifest declared default_locale, localizing extension name');\n const extensionName = await getDefaultLocalizedName({\n messageFile,\n manifestData,\n });\n // allow for a localized `{name}`, without mutating `manifestData`\n filenameTemplate = filenameTemplate.replace(/{name}/g, extensionName);\n }\n\n const packageName = safeFileName(\n getPackageNameFromTemplate(filenameTemplate, manifestData),\n );\n const extensionPath = path.join(artifactsDir, packageName);\n\n // Added 'wx' flags to avoid overwriting of existing package.\n const stream = createWriteStream(extensionPath, { flags: 'wx' });\n\n stream.write(buffer, () => {\n stream.end();\n });\n\n try {\n await fromEvent(stream, 'close');\n } catch (error) {\n if (!isErrorWithCode('EEXIST', error)) {\n throw error;\n }\n if (!overwriteDest) {\n throw new UsageError(\n `Extension exists at the destination path: ${extensionPath}\\n` +\n 'Use --overwrite-dest to enable overwriting.',\n );\n }\n log.info(`Destination exists, overwriting: ${extensionPath}`);\n const overwriteStream = createWriteStream(extensionPath);\n overwriteStream.write(buffer, () => {\n overwriteStream.end();\n });\n await fromEvent(overwriteStream, 'close');\n }\n\n if (showReadyMessage) {\n log.info(`Your web extension is ready: ${extensionPath}`);\n }\n return { extensionPath };\n}\n\n// Build command types and implementation.\n\nexport default async function build(\n {\n sourceDir,\n artifactsDir,\n asNeeded = false,\n overwriteDest = false,\n ignoreFiles = [],\n filename = DEFAULT_FILENAME_TEMPLATE,\n },\n {\n manifestData,\n createFileFilter = defaultFileFilterCreator,\n fileFilter = createFileFilter({\n sourceDir,\n artifactsDir,\n ignoreFiles,\n }),\n onSourceChange = defaultSourceWatcher,\n packageCreator = defaultPackageCreator,\n showReadyMessage = true,\n } = {},\n) {\n const rebuildAsNeeded = asNeeded; // alias for `build --as-needed`\n log.info(`Building web extension from ${sourceDir}`);\n\n const createPackage = () =>\n packageCreator({\n manifestData,\n sourceDir,\n fileFilter,\n artifactsDir,\n overwriteDest,\n showReadyMessage,\n filename,\n });\n\n await prepareArtifactsDir(artifactsDir);\n const result = await createPackage();\n\n if (rebuildAsNeeded) {\n log.info('Rebuilding when files change...');\n onSourceChange({\n sourceDir,\n artifactsDir,\n onChange: () => {\n return createPackage().catch((error) => {\n log.error(error.stack);\n throw error;\n });\n },\n shouldWatchFile: (...args) => fileFilter.wantFile(...args),\n });\n }\n\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","names":["open","createLogger","log","import","meta","url","docs","params","openUrl","error","debug"],"sources":["../../src/cmd/docs.js"],"sourcesContent":["import open from 'open';\n\nimport { createLogger } from '../util/logger.js';\n\nconst log = createLogger(import.meta.url);\n\nexport const url =\n 'https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/';\n\nexport default async function docs(params, { openUrl = open } = {}) {\n try {\n await openUrl(url);\n } catch (error) {\n log.debug(`Encountered an error while opening URL ${url}`, error);\n throw error;\n }\n}\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,MAAM;AAEvB,SAASC,YAAY,QAAQ,mBAAmB;AAEhD,MAAMC,GAAG,GAAGD,YAAY,CAACE,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC;AAEzC,OAAO,MAAMA,GAAG,GACd,mFAAmF;AAErF,eAAe,eAAeC,IAAIA,CAACC,MAAM,EAAE;EAAEC,OAAO,GAAGR;AAAK,CAAC,GAAG,CAAC,CAAC,EAAE;EAClE,IAAI;IACF,MAAMQ,OAAO,CAACH,GAAG,CAAC;EACpB,CAAC,CAAC,OAAOI,KAAK,EAAE;IACdP,GAAG,CAACQ,KAAK,CAAC,0CAA0CL,GAAG,EAAE,EAAEI,KAAK,CAAC;IACjE,MAAMA,KAAK;EACb;AACF","ignoreList":[]}
1
+ {"version":3,"file":"docs.js","names":[],"sources":["../../src/cmd/docs.js"],"sourcesContent":["import open from 'open';\n\nimport { createLogger } from '../util/logger.js';\n\nconst log = createLogger(import.meta.url);\n\nexport const url =\n 'https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/';\n\nexport default async function docs(params, { openUrl = open } = {}) {\n try {\n await openUrl(url);\n } catch (error) {\n log.debug(`Encountered an error while opening URL ${url}`, error);\n throw error;\n }\n}\n"],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM;AAEvB,SAAS,YAAY,QAAQ,mBAAmB;AAEhD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAEzC,OAAO,MAAM,GAAG,GACd,mFAAmF;AAErF,eAAe,eAAe,IAAI,CAAC,MAAM,EAAE;EAAE,OAAO,GAAG;AAAK,CAAC,GAAG,CAAC,CAAC,EAAE;EAClE,IAAI;IACF,MAAM,OAAO,CAAC,GAAG,CAAC;EACpB,CAAC,CAAC,OAAO,KAAK,EAAE;IACd,GAAG,CAAC,KAAK,CAAC,0CAA0C,GAAG,EAAE,EAAE,KAAK,CAAC;IACjE,MAAM,KAAK;EACb;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"dump-config.js","names":["createLogger","log","import","meta","url","config","configData","info","JSON","stringify"],"sources":["../../src/cmd/dump-config.js"],"sourcesContent":["import { createLogger } from '../util/logger.js';\n\nconst log = createLogger(import.meta.url);\n\nexport default async function config(configData) {\n log.info(JSON.stringify(configData, null, 2));\n}\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,mBAAmB;AAEhD,MAAMC,GAAG,GAAGD,YAAY,CAACE,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC;AAEzC,eAAe,eAAeC,MAAMA,CAACC,UAAU,EAAE;EAC/CL,GAAG,CAACM,IAAI,CAACC,IAAI,CAACC,SAAS,CAACH,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/C","ignoreList":[]}
1
+ {"version":3,"file":"dump-config.js","names":[],"sources":["../../src/cmd/dump-config.js"],"sourcesContent":["import { createLogger } from '../util/logger.js';\n\nconst log = createLogger(import.meta.url);\n\nexport default async function config(configData) {\n log.info(JSON.stringify(configData, null, 2));\n}\n"],"mappings":"AAAA,SAAS,YAAY,QAAQ,mBAAmB;AAEhD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAEzC,eAAe,eAAe,MAAM,CAAC,UAAU,EAAE;EAC/C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/C","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["build","params","options","default","runCommand","docs","dumpConfig","lint","run","sign"],"sources":["../../src/cmd/index.js"],"sourcesContent":["// This module exports entry points for all supported commands. For performance\n// reasons (faster start-up), the implementations are not statically imported\n// at the top of the file, but lazily loaded in the (exported) functions.\n// The latter would slow down start-up by several seconds, as seen in #1302 .\n\nasync function build(params, options) {\n const { default: runCommand } = await import('./build.js');\n return runCommand(params, options);\n}\n\nasync function docs(params, options) {\n const { default: runCommand } = await import('./docs.js');\n return runCommand(params, options);\n}\n\nasync function dumpConfig(params, options) {\n const { default: runCommand } = await import('./dump-config.js');\n return runCommand(params, options);\n}\n\nasync function lint(params, options) {\n const { default: runCommand } = await import('./lint.js');\n return runCommand(params, options);\n}\n\nasync function run(params, options) {\n const { default: runCommand } = await import('./run.js');\n return runCommand(params, options);\n}\n\nasync function sign(params, options) {\n const { default: runCommand } = await import('./sign.js');\n return runCommand(params, options);\n}\n\nexport default { build, docs, dumpConfig, lint, run, sign };\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA,eAAeA,KAAKA,CAACC,MAAM,EAAEC,OAAO,EAAE;EACpC,MAAM;IAAEC,OAAO,EAAEC;EAAW,CAAC,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;EAC1D,OAAOA,UAAU,CAACH,MAAM,EAAEC,OAAO,CAAC;AACpC;AAEA,eAAeG,IAAIA,CAACJ,MAAM,EAAEC,OAAO,EAAE;EACnC,MAAM;IAAEC,OAAO,EAAEC;EAAW,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;EACzD,OAAOA,UAAU,CAACH,MAAM,EAAEC,OAAO,CAAC;AACpC;AAEA,eAAeI,UAAUA,CAACL,MAAM,EAAEC,OAAO,EAAE;EACzC,MAAM;IAAEC,OAAO,EAAEC;EAAW,CAAC,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC;EAChE,OAAOA,UAAU,CAACH,MAAM,EAAEC,OAAO,CAAC;AACpC;AAEA,eAAeK,IAAIA,CAACN,MAAM,EAAEC,OAAO,EAAE;EACnC,MAAM;IAAEC,OAAO,EAAEC;EAAW,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;EACzD,OAAOA,UAAU,CAACH,MAAM,EAAEC,OAAO,CAAC;AACpC;AAEA,eAAeM,GAAGA,CAACP,MAAM,EAAEC,OAAO,EAAE;EAClC,MAAM;IAAEC,OAAO,EAAEC;EAAW,CAAC,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;EACxD,OAAOA,UAAU,CAACH,MAAM,EAAEC,OAAO,CAAC;AACpC;AAEA,eAAeO,IAAIA,CAACR,MAAM,EAAEC,OAAO,EAAE;EACnC,MAAM;IAAEC,OAAO,EAAEC;EAAW,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;EACzD,OAAOA,UAAU,CAACH,MAAM,EAAEC,OAAO,CAAC;AACpC;AAEA,eAAe;EAAEF,KAAK;EAAEK,IAAI;EAAEC,UAAU;EAAEC,IAAI;EAAEC,GAAG;EAAEC;AAAK,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/cmd/index.js"],"sourcesContent":["// This module exports entry points for all supported commands. For performance\n// reasons (faster start-up), the implementations are not statically imported\n// at the top of the file, but lazily loaded in the (exported) functions.\n// The latter would slow down start-up by several seconds, as seen in #1302 .\n\nasync function build(params, options) {\n const { default: runCommand } = await import('./build.js');\n return runCommand(params, options);\n}\n\nasync function docs(params, options) {\n const { default: runCommand } = await import('./docs.js');\n return runCommand(params, options);\n}\n\nasync function dumpConfig(params, options) {\n const { default: runCommand } = await import('./dump-config.js');\n return runCommand(params, options);\n}\n\nasync function lint(params, options) {\n const { default: runCommand } = await import('./lint.js');\n return runCommand(params, options);\n}\n\nasync function run(params, options) {\n const { default: runCommand } = await import('./run.js');\n return runCommand(params, options);\n}\n\nasync function sign(params, options) {\n const { default: runCommand } = await import('./sign.js');\n return runCommand(params, options);\n}\n\nexport default { build, docs, dumpConfig, lint, run, sign };\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;EACpC,MAAM;IAAE,OAAO,EAAE;EAAW,CAAC,GAAG,MAAM,OAAO,YAAY,CAAC;EAC1D,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC;AAEA,eAAe,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;EACnC,MAAM;IAAE,OAAO,EAAE;EAAW,CAAC,GAAG,MAAM,OAAO,WAAW,CAAC;EACzD,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC;AAEA,eAAe,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;EACzC,MAAM;IAAE,OAAO,EAAE;EAAW,CAAC,GAAG,MAAM,OAAO,kBAAkB,CAAC;EAChE,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC;AAEA,eAAe,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;EACnC,MAAM;IAAE,OAAO,EAAE;EAAW,CAAC,GAAG,MAAM,OAAO,WAAW,CAAC;EACzD,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC;AAEA,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE;EAClC,MAAM;IAAE,OAAO,EAAE;EAAW,CAAC,GAAG,MAAM,OAAO,UAAU,CAAC;EACxD,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC;AAEA,eAAe,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;EACnC,MAAM;IAAE,OAAO,EAAE;EAAW,CAAC,GAAG,MAAM,OAAO,WAAW,CAAC;EACzD,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC;AAEA,eAAe;EAAE,KAAK;EAAE,IAAI;EAAE,UAAU;EAAE,IAAI;EAAE,GAAG;EAAE;AAAK,CAAC","ignoreList":[]}
package/lib/cmd/lint.js CHANGED
@@ -8,6 +8,7 @@ const log = createLogger(import.meta.url);
8
8
  export default function lint({
9
9
  artifactsDir,
10
10
  boring,
11
+ enterprise,
11
12
  ignoreFiles,
12
13
  metadata,
13
14
  output,
@@ -37,6 +38,7 @@ export default function lint({
37
38
  output,
38
39
  boring,
39
40
  selfHosted,
41
+ enterprise,
40
42
  shouldScanFile: fileName => fileFilter.wantFile(fileName),
41
43
  minManifestVersion: 2,
42
44
  maxManifestVersion: 3,
@@ -1 +1 @@
1
- {"version":3,"file":"lint.js","names":["createInstance","defaultLinterCreator","createLogger","createFileFilter","defaultFileFilterCreator","log","import","meta","url","lint","artifactsDir","boring","ignoreFiles","metadata","output","pretty","privileged","sourceDir","selfHosted","verbose","warningsAsErrors","createLinter","shouldExitProgram","fileFilter","config","logLevel","stack","Boolean","shouldScanFile","fileName","wantFile","minManifestVersion","maxManifestVersion","enableDataCollectionPermissions","_","debug","linter","runAsBinary","run"],"sources":["../../src/cmd/lint.js"],"sourcesContent":["import { createInstance as defaultLinterCreator } from 'addons-linter';\n\nimport { createLogger } from '../util/logger.js';\nimport { createFileFilter as defaultFileFilterCreator } from '../util/file-filter.js';\n\nconst log = createLogger(import.meta.url);\n\n// Lint command types and implementation.\n\nexport default function lint(\n {\n artifactsDir,\n boring,\n ignoreFiles,\n metadata,\n output,\n pretty,\n privileged,\n sourceDir,\n selfHosted,\n verbose,\n warningsAsErrors,\n },\n {\n createLinter = defaultLinterCreator,\n createFileFilter = defaultFileFilterCreator,\n shouldExitProgram = true,\n } = {},\n) {\n const fileFilter = createFileFilter({ sourceDir, ignoreFiles, artifactsDir });\n\n const config = {\n logLevel: verbose ? 'debug' : 'fatal',\n stack: Boolean(verbose),\n pretty,\n privileged,\n warningsAsErrors,\n metadata,\n output,\n boring,\n selfHosted,\n shouldScanFile: (fileName) => fileFilter.wantFile(fileName),\n minManifestVersion: 2,\n maxManifestVersion: 3,\n enableDataCollectionPermissions: true,\n // This mimics the first command line argument from yargs, which should be\n // the directory to the extension.\n _: [sourceDir],\n };\n\n log.debug(`Running addons-linter on ${sourceDir}`);\n const linter = createLinter({ config, runAsBinary: shouldExitProgram });\n return linter.run();\n}\n"],"mappings":"AAAA,SAASA,cAAc,IAAIC,oBAAoB,QAAQ,eAAe;AAEtE,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,gBAAgB,IAAIC,wBAAwB,QAAQ,wBAAwB;AAErF,MAAMC,GAAG,GAAGH,YAAY,CAACI,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC;;AAEzC;;AAEA,eAAe,SAASC,IAAIA,CAC1B;EACEC,YAAY;EACZC,MAAM;EACNC,WAAW;EACXC,QAAQ;EACRC,MAAM;EACNC,MAAM;EACNC,UAAU;EACVC,SAAS;EACTC,UAAU;EACVC,OAAO;EACPC;AACF,CAAC,EACD;EACEC,YAAY,GAAGpB,oBAAoB;EACnCE,gBAAgB,GAAGC,wBAAwB;EAC3CkB,iBAAiB,GAAG;AACtB,CAAC,GAAG,CAAC,CAAC,EACN;EACA,MAAMC,UAAU,GAAGpB,gBAAgB,CAAC;IAAEc,SAAS;IAAEL,WAAW;IAAEF;EAAa,CAAC,CAAC;EAE7E,MAAMc,MAAM,GAAG;IACbC,QAAQ,EAAEN,OAAO,GAAG,OAAO,GAAG,OAAO;IACrCO,KAAK,EAAEC,OAAO,CAACR,OAAO,CAAC;IACvBJ,MAAM;IACNC,UAAU;IACVI,gBAAgB;IAChBP,QAAQ;IACRC,MAAM;IACNH,MAAM;IACNO,UAAU;IACVU,cAAc,EAAGC,QAAQ,IAAKN,UAAU,CAACO,QAAQ,CAACD,QAAQ,CAAC;IAC3DE,kBAAkB,EAAE,CAAC;IACrBC,kBAAkB,EAAE,CAAC;IACrBC,+BAA+B,EAAE,IAAI;IACrC;IACA;IACAC,CAAC,EAAE,CAACjB,SAAS;EACf,CAAC;EAEDZ,GAAG,CAAC8B,KAAK,CAAC,4BAA4BlB,SAAS,EAAE,CAAC;EAClD,MAAMmB,MAAM,GAAGf,YAAY,CAAC;IAAEG,MAAM;IAAEa,WAAW,EAAEf;EAAkB,CAAC,CAAC;EACvE,OAAOc,MAAM,CAACE,GAAG,CAAC,CAAC;AACrB","ignoreList":[]}
1
+ {"version":3,"file":"lint.js","names":[],"sources":["../../src/cmd/lint.js"],"sourcesContent":["import { createInstance as defaultLinterCreator } from 'addons-linter';\n\nimport { createLogger } from '../util/logger.js';\nimport { createFileFilter as defaultFileFilterCreator } from '../util/file-filter.js';\n\nconst log = createLogger(import.meta.url);\n\n// Lint command types and implementation.\n\nexport default function lint(\n {\n artifactsDir,\n boring,\n enterprise,\n ignoreFiles,\n metadata,\n output,\n pretty,\n privileged,\n sourceDir,\n selfHosted,\n verbose,\n warningsAsErrors,\n },\n {\n createLinter = defaultLinterCreator,\n createFileFilter = defaultFileFilterCreator,\n shouldExitProgram = true,\n } = {},\n) {\n const fileFilter = createFileFilter({ sourceDir, ignoreFiles, artifactsDir });\n\n const config = {\n logLevel: verbose ? 'debug' : 'fatal',\n stack: Boolean(verbose),\n pretty,\n privileged,\n warningsAsErrors,\n metadata,\n output,\n boring,\n selfHosted,\n enterprise,\n shouldScanFile: (fileName) => fileFilter.wantFile(fileName),\n minManifestVersion: 2,\n maxManifestVersion: 3,\n enableDataCollectionPermissions: true,\n // This mimics the first command line argument from yargs, which should be\n // the directory to the extension.\n _: [sourceDir],\n };\n\n log.debug(`Running addons-linter on ${sourceDir}`);\n const linter = createLinter({ config, runAsBinary: shouldExitProgram });\n return linter.run();\n}\n"],"mappings":"AAAA,SAAS,cAAc,IAAI,oBAAoB,QAAQ,eAAe;AAEtE,SAAS,YAAY,QAAQ,mBAAmB;AAChD,SAAS,gBAAgB,IAAI,wBAAwB,QAAQ,wBAAwB;AAErF,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;;AAEzC;;AAEA,eAAe,SAAS,IAAI,CAC1B;EACE,YAAY;EACZ,MAAM;EACN,UAAU;EACV,WAAW;EACX,QAAQ;EACR,MAAM;EACN,MAAM;EACN,UAAU;EACV,SAAS;EACT,UAAU;EACV,OAAO;EACP;AACF,CAAC,EACD;EACE,YAAY,GAAG,oBAAoB;EACnC,gBAAgB,GAAG,wBAAwB;EAC3C,iBAAiB,GAAG;AACtB,CAAC,GAAG,CAAC,CAAC,EACN;EACA,MAAM,UAAU,GAAG,gBAAgB,CAAC;IAAE,SAAS;IAAE,WAAW;IAAE;EAAa,CAAC,CAAC;EAE7E,MAAM,MAAM,GAAG;IACb,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO;IACrC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;IACvB,MAAM;IACN,UAAU;IACV,gBAAgB;IAChB,QAAQ;IACR,MAAM;IACN,MAAM;IACN,UAAU;IACV,UAAU;IACV,cAAc,EAAG,QAAQ,IAAK,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC3D,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,CAAC;IACrB,+BAA+B,EAAE,IAAI;IACrC;IACA;IACA,CAAC,EAAE,CAAC,SAAS;EACf,CAAC;EAED,GAAG,CAAC,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC;EAClD,MAAM,MAAM,GAAG,YAAY,CAAC;IAAE,MAAM;IAAE,WAAW,EAAE;EAAkB,CAAC,CAAC;EACvE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","names":["path","fs","nodeFs","defaultBuildExtension","defaultFirefoxApp","connectWithMaxRetries","defaultFirefoxClient","createLogger","defaultGetValidatedManifest","UsageError","createExtensionRunner","defaultReloadStrategy","MultiExtensionRunner","DefaultMultiExtensionRunner","log","import","meta","url","run","artifactsDir","browserConsole","devtools","pref","firefox","firefoxProfile","profileCreateIfMissing","keepProfileChanges","ignoreFiles","noInput","noReload","preInstall","sourceDir","verbose","watchFile","watchIgnored","startUrl","target","args","adbBin","adbHost","adbPort","adbDevice","adbDiscoveryTimeout","adbRemoveOldArtifacts","firefoxApk","firefoxApkComponent","chromiumBinary","chromiumPref","chromiumProfile","buildExtension","firefoxApp","firefoxClient","reloadStrategy","getValidatedManifest","resolve","info","Array","isArray","every","el","customPrefs","customChromiumPrefs","manifestData","profileDir","isDir","existsSync","mkdir","runners","commonRunnerParams","extensions","length","includes","firefoxDesktopRunnerParams","firefoxBinary","profilePath","firefoxDesktopRunner","params","push","firefoxAndroidRunnerParams","buildSourceDir","extensionSourceDir","tmpArtifactsDir","asNeeded","showReadyMessage","firefoxAndroidRunner","chromiumRunnerParams","chromiumRunner","extensionRunner"],"sources":["../../src/cmd/run.js"],"sourcesContent":["import path from 'path';\nimport fs from 'fs/promises';\nimport nodeFs from 'fs';\n\nimport defaultBuildExtension from './build.js';\nimport * as defaultFirefoxApp from '../firefox/index.js';\nimport { connectWithMaxRetries as defaultFirefoxClient } from '../firefox/remote.js';\nimport { createLogger } from '../util/logger.js';\nimport defaultGetValidatedManifest from '../util/manifest.js';\nimport { UsageError } from '../errors.js';\nimport {\n createExtensionRunner,\n defaultReloadStrategy,\n MultiExtensionRunner as DefaultMultiExtensionRunner,\n} from '../extension-runners/index.js';\n\nconst log = createLogger(import.meta.url);\n\n// Run command types and implementation.\n\nexport default async function run(\n {\n artifactsDir,\n browserConsole = false,\n devtools = false,\n pref,\n firefox,\n firefoxProfile,\n profileCreateIfMissing,\n keepProfileChanges = false,\n ignoreFiles,\n noInput = false,\n noReload = false,\n preInstall = false,\n sourceDir,\n verbose = false,\n watchFile,\n watchIgnored,\n startUrl,\n target,\n args,\n // Android CLI options.\n adbBin,\n adbHost,\n adbPort,\n adbDevice,\n adbDiscoveryTimeout,\n adbRemoveOldArtifacts,\n firefoxApk,\n firefoxApkComponent,\n // Chromium CLI options.\n chromiumBinary,\n chromiumPref = {},\n chromiumProfile,\n },\n {\n buildExtension = defaultBuildExtension,\n firefoxApp = defaultFirefoxApp,\n firefoxClient = defaultFirefoxClient,\n reloadStrategy = defaultReloadStrategy,\n MultiExtensionRunner = DefaultMultiExtensionRunner,\n getValidatedManifest = defaultGetValidatedManifest,\n } = {},\n) {\n sourceDir = path.resolve(sourceDir);\n log.info(`Running web extension from ${sourceDir}`);\n if (preInstall) {\n log.info(\n \"Disabled auto-reloading because it's not possible with \" +\n '--pre-install',\n );\n noReload = true;\n }\n\n if (\n watchFile != null &&\n (!Array.isArray(watchFile) ||\n !watchFile.every((el) => typeof el === 'string'))\n ) {\n throw new UsageError('Unexpected watchFile type');\n }\n\n // Create an alias for --pref since it has been transformed into an\n // object containing one or more preferences.\n const customPrefs = pref;\n\n // Create an alias for --chromium-pref since it has been transformed into an\n // object containing one or more preferences.\n const customChromiumPrefs = chromiumPref;\n\n const manifestData = await getValidatedManifest(sourceDir);\n\n const profileDir = firefoxProfile || chromiumProfile;\n\n if (profileCreateIfMissing) {\n if (!profileDir) {\n throw new UsageError(\n '--profile-create-if-missing requires ' +\n '--firefox-profile or --chromium-profile',\n );\n }\n const isDir = nodeFs.existsSync(profileDir);\n if (isDir) {\n log.info(`Profile directory ${profileDir} already exists`);\n } else {\n log.info(`Profile directory not found. Creating directory ${profileDir}`);\n await fs.mkdir(profileDir);\n }\n }\n\n const runners = [];\n\n const commonRunnerParams = {\n // Common options.\n extensions: [{ sourceDir, manifestData }],\n keepProfileChanges,\n startUrl,\n args,\n };\n\n if (!target || target.length === 0 || target.includes('firefox-desktop')) {\n const firefoxDesktopRunnerParams = {\n ...commonRunnerParams,\n\n // Firefox specific CLI options.\n firefoxBinary: firefox,\n profilePath: firefoxProfile,\n customPrefs,\n browserConsole,\n devtools,\n preInstall,\n\n // Firefox runner injected dependencies.\n firefoxApp,\n firefoxClient,\n };\n\n const firefoxDesktopRunner = await createExtensionRunner({\n target: 'firefox-desktop',\n params: firefoxDesktopRunnerParams,\n });\n runners.push(firefoxDesktopRunner);\n }\n\n if (target && target.includes('firefox-android')) {\n const firefoxAndroidRunnerParams = {\n ...commonRunnerParams,\n\n // Firefox specific CLI options.\n profilePath: firefoxProfile,\n customPrefs,\n browserConsole,\n preInstall,\n firefoxApk,\n firefoxApkComponent,\n adbDevice,\n adbHost,\n adbPort,\n adbBin,\n adbDiscoveryTimeout,\n adbRemoveOldArtifacts,\n\n // Injected dependencies.\n firefoxApp,\n firefoxClient,\n buildSourceDir: (extensionSourceDir, tmpArtifactsDir) => {\n return buildExtension(\n {\n sourceDir: extensionSourceDir,\n ignoreFiles,\n asNeeded: false,\n // Use a separate temporary directory for building the extension zip file\n // that we are going to upload on the android device.\n artifactsDir: tmpArtifactsDir,\n },\n {\n // Suppress the message usually logged by web-ext build.\n showReadyMessage: false,\n },\n );\n },\n };\n\n const firefoxAndroidRunner = await createExtensionRunner({\n target: 'firefox-android',\n params: firefoxAndroidRunnerParams,\n });\n runners.push(firefoxAndroidRunner);\n }\n\n if (target && target.includes('chromium')) {\n const chromiumRunnerParams = {\n ...commonRunnerParams,\n verbose,\n chromiumBinary,\n customChromiumPrefs,\n chromiumProfile,\n };\n\n const chromiumRunner = await createExtensionRunner({\n target: 'chromium',\n params: chromiumRunnerParams,\n });\n runners.push(chromiumRunner);\n }\n\n const extensionRunner = new MultiExtensionRunner({\n runners,\n });\n\n await extensionRunner.run();\n\n if (noReload) {\n log.info('Automatic extension reloading has been disabled');\n } else {\n log.info('The extension will reload if any source file changes');\n\n reloadStrategy({\n extensionRunner,\n sourceDir,\n watchFile,\n watchIgnored,\n artifactsDir,\n ignoreFiles,\n noInput,\n });\n }\n\n return extensionRunner;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"run.js","names":[],"sources":["../../src/cmd/run.js"],"sourcesContent":["import path from 'path';\nimport fs from 'fs/promises';\nimport nodeFs from 'fs';\n\nimport defaultBuildExtension from './build.js';\nimport * as defaultFirefoxApp from '../firefox/index.js';\nimport { connectWithMaxRetries as defaultFirefoxClient } from '../firefox/remote.js';\nimport { createLogger } from '../util/logger.js';\nimport defaultGetValidatedManifest from '../util/manifest.js';\nimport { UsageError } from '../errors.js';\nimport {\n createExtensionRunner,\n defaultReloadStrategy,\n MultiExtensionRunner as DefaultMultiExtensionRunner,\n} from '../extension-runners/index.js';\n\nconst log = createLogger(import.meta.url);\n\n// Run command types and implementation.\n\nexport default async function run(\n {\n artifactsDir,\n browserConsole = false,\n devtools = false,\n pref,\n firefox,\n firefoxProfile,\n profileCreateIfMissing,\n keepProfileChanges = false,\n ignoreFiles,\n noInput = false,\n noReload = false,\n preInstall = false,\n sourceDir,\n verbose = false,\n watchFile,\n watchIgnored,\n startUrl,\n target,\n args,\n // Android CLI options.\n adbBin,\n adbHost,\n adbPort,\n adbDevice,\n adbDiscoveryTimeout,\n adbRemoveOldArtifacts,\n firefoxApk,\n firefoxApkComponent,\n // Chromium CLI options.\n chromiumBinary,\n chromiumPref = {},\n chromiumProfile,\n },\n {\n buildExtension = defaultBuildExtension,\n firefoxApp = defaultFirefoxApp,\n firefoxClient = defaultFirefoxClient,\n reloadStrategy = defaultReloadStrategy,\n MultiExtensionRunner = DefaultMultiExtensionRunner,\n getValidatedManifest = defaultGetValidatedManifest,\n } = {},\n) {\n sourceDir = path.resolve(sourceDir);\n log.info(`Running web extension from ${sourceDir}`);\n if (preInstall) {\n log.info(\n \"Disabled auto-reloading because it's not possible with \" +\n '--pre-install',\n );\n noReload = true;\n }\n\n if (\n watchFile != null &&\n (!Array.isArray(watchFile) ||\n !watchFile.every((el) => typeof el === 'string'))\n ) {\n throw new UsageError('Unexpected watchFile type');\n }\n\n // Create an alias for --pref since it has been transformed into an\n // object containing one or more preferences.\n const customPrefs = pref;\n\n // Create an alias for --chromium-pref since it has been transformed into an\n // object containing one or more preferences.\n const customChromiumPrefs = chromiumPref;\n\n const manifestData = await getValidatedManifest(sourceDir);\n\n const profileDir = firefoxProfile || chromiumProfile;\n\n if (profileCreateIfMissing) {\n if (!profileDir) {\n throw new UsageError(\n '--profile-create-if-missing requires ' +\n '--firefox-profile or --chromium-profile',\n );\n }\n const isDir = nodeFs.existsSync(profileDir);\n if (isDir) {\n log.info(`Profile directory ${profileDir} already exists`);\n } else {\n log.info(`Profile directory not found. Creating directory ${profileDir}`);\n await fs.mkdir(profileDir);\n }\n }\n\n const runners = [];\n\n const commonRunnerParams = {\n // Common options.\n extensions: [{ sourceDir, manifestData }],\n keepProfileChanges,\n startUrl,\n args,\n };\n\n if (!target || target.length === 0 || target.includes('firefox-desktop')) {\n const firefoxDesktopRunnerParams = {\n ...commonRunnerParams,\n\n // Firefox specific CLI options.\n firefoxBinary: firefox,\n profilePath: firefoxProfile,\n customPrefs,\n browserConsole,\n devtools,\n preInstall,\n\n // Firefox runner injected dependencies.\n firefoxApp,\n firefoxClient,\n };\n\n const firefoxDesktopRunner = await createExtensionRunner({\n target: 'firefox-desktop',\n params: firefoxDesktopRunnerParams,\n });\n runners.push(firefoxDesktopRunner);\n }\n\n if (target && target.includes('firefox-android')) {\n const firefoxAndroidRunnerParams = {\n ...commonRunnerParams,\n\n // Firefox specific CLI options.\n profilePath: firefoxProfile,\n customPrefs,\n browserConsole,\n preInstall,\n firefoxApk,\n firefoxApkComponent,\n adbDevice,\n adbHost,\n adbPort,\n adbBin,\n adbDiscoveryTimeout,\n adbRemoveOldArtifacts,\n\n // Injected dependencies.\n firefoxApp,\n firefoxClient,\n buildSourceDir: (extensionSourceDir, tmpArtifactsDir) => {\n return buildExtension(\n {\n sourceDir: extensionSourceDir,\n ignoreFiles,\n asNeeded: false,\n // Use a separate temporary directory for building the extension zip file\n // that we are going to upload on the android device.\n artifactsDir: tmpArtifactsDir,\n },\n {\n // Suppress the message usually logged by web-ext build.\n showReadyMessage: false,\n },\n );\n },\n };\n\n const firefoxAndroidRunner = await createExtensionRunner({\n target: 'firefox-android',\n params: firefoxAndroidRunnerParams,\n });\n runners.push(firefoxAndroidRunner);\n }\n\n if (target && target.includes('chromium')) {\n const chromiumRunnerParams = {\n ...commonRunnerParams,\n verbose,\n chromiumBinary,\n customChromiumPrefs,\n chromiumProfile,\n };\n\n const chromiumRunner = await createExtensionRunner({\n target: 'chromium',\n params: chromiumRunnerParams,\n });\n runners.push(chromiumRunner);\n }\n\n const extensionRunner = new MultiExtensionRunner({\n runners,\n });\n\n await extensionRunner.run();\n\n if (noReload) {\n log.info('Automatic extension reloading has been disabled');\n } else {\n log.info('The extension will reload if any source file changes');\n\n reloadStrategy({\n extensionRunner,\n sourceDir,\n watchFile,\n watchIgnored,\n artifactsDir,\n ignoreFiles,\n noInput,\n });\n }\n\n return extensionRunner;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
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","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 {\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":[]}
1
+ {"version":3,"file":"sign.js","names":[],"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 {\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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":["os","path","fs","camelCase","decamelize","parseJSON","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","endsWith","nonce","Date","now","Math","random","configModule","readFile","encoding","configDefault","esmConfigMod","error","configFileError","cause","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":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs/promises';\n\nimport camelCase from 'camelcase';\nimport decamelize from 'decamelize';\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\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\n if (filePath.endsWith('.js')) {\n throw new UsageError(\n ` Invalid config file \"${resolvedFilePath}\": the file extension should be` +\n '\".cjs\" or \".mjs\". More information at: https://mzl.la/web-ext-config-file',\n );\n }\n\n let configObject;\n try {\n const nonce = `${Date.now()}-${Math.random()}`;\n\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 if (filePath.endsWith('.cjs')) {\n // Remove the additional 'module.exports' named export that Node.js >=\n // 24 is returning from the dynamic import call (in addition to being\n // also set on the default property as in Node.js < 24).\n delete esmConfigMod['module.exports'];\n }\n configObject = { ...configDefault, ...esmConfigMod };\n } else {\n configObject = { ...configModule };\n }\n } catch (error) {\n const configFileError = new UsageError(\n `Cannot read config file \"${resolvedFilePath}\":\\n${error}`,\n );\n configFileError.cause = error;\n throw configFileError;\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\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\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;AACvB,OAAOC,EAAE,MAAM,aAAa;AAE5B,OAAOC,SAAS,MAAM,WAAW;AACjC,OAAOC,UAAU,MAAM,YAAY;AACnC,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,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,IAAId,SAAS,CAACkB,MAAM,CAAC,KAAKA,MAAM,EAAE;MAChC,MAAM,IAAIb,UAAU,CAClB,sBAAsBa,MAAM,YAAY,GACtC,6BAA6BlB,SAAS,CAACkB,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,GAAGtB,UAAU,CAACiB,MAAM,EAAE;MAAEM,SAAS,EAAE;IAAI,CAAC,CAAC;IAEjE,IAAI,OAAOT,OAAO,CAACQ,kBAAkB,CAAC,KAAK,QAAQ,EAAE;MACnD,MAAM,IAAIlB,UAAU,CAClB,sBAAsBW,cAAc,aAAa,GAC/C,uBAAuBE,MAAM,GACjC,CAAC;IACH;IACA,IAAIH,OAAO,CAACQ,kBAAkB,CAAC,CAACE,IAAI,KAAKC,SAAS,EAAE;MAClD;MACA,MAAM,IAAIpB,WAAW,CAAC,WAAWY,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,IAAItB,UAAU,CAClB,sBAAsBW,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;MACpBxB,GAAG,CAACyB,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;MACV1B,GAAG,CAACyB,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,GAAGtC,IAAI,CAACuC,OAAO,CAACF,QAAQ,CAAC;EAC/C5B,GAAG,CAACyB,KAAK,CACP,4BAA4BG,QAAQ,IAAI,GACtC,iBAAiBC,gBAAgB,IACrC,CAAC;EAED,IAAID,QAAQ,CAACG,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC5B,MAAM,IAAIjC,UAAU,CAClB,yBAAyB+B,gBAAgB,iCAAiC,GACxE,2EACJ,CAAC;EACH;EAEA,IAAItB,YAAY;EAChB,IAAI;IACF,MAAMyB,KAAK,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,IAAIC,IAAI,CAACC,MAAM,CAAC,CAAC,EAAE;IAE9C,IAAIC,YAAY;IAChB,IAAIR,gBAAgB,CAACE,QAAQ,CAAC,cAAc,CAAC,EAAE;MAC7CM,YAAY,GAAG1C,SAAS,CACtB,MAAMH,EAAE,CAAC8C,QAAQ,CAACT,gBAAgB,EAAE;QAAEU,QAAQ,EAAE;MAAQ,CAAC,CAC3D,CAAC;IACH,CAAC,MAAM;MACLF,YAAY,GAAG,MAAM,MAAM,CAAC,UAAUR,gBAAgB,UAAUG,KAAK,EAAE,CAAC;IAC1E;IAEA,IAAIK,YAAY,CAACd,OAAO,EAAE;MACxB,MAAM;QAAEA,OAAO,EAAEiB,aAAa;QAAE,GAAGC;MAAa,CAAC,GAAGJ,YAAY;MAChE;MACA;MACA;MACA,IAAIT,QAAQ,CAACG,QAAQ,CAAC,MAAM,CAAC,EAAE;QAC7B;QACA;QACA;QACA,OAAOU,YAAY,CAAC,gBAAgB,CAAC;MACvC;MACAlC,YAAY,GAAG;QAAE,GAAGiC,aAAa;QAAE,GAAGC;MAAa,CAAC;IACtD,CAAC,MAAM;MACLlC,YAAY,GAAG;QAAE,GAAG8B;MAAa,CAAC;IACpC;EACF,CAAC,CAAC,OAAOK,KAAK,EAAE;IACd,MAAMC,eAAe,GAAG,IAAI7C,UAAU,CACpC,4BAA4B+B,gBAAgB,OAAOa,KAAK,EAC1D,CAAC;IACDC,eAAe,CAACC,KAAK,GAAGF,KAAK;IAC7B,MAAMC,eAAe;EACvB;EAEA,IAAIf,QAAQ,CAACG,QAAQ,CAAC,cAAc,CAAC,EAAE;IACrC/B,GAAG,CAACyB,KAAK,CAAC,iDAAiD,CAAC;IAC5DlB,YAAY,GAAGA,YAAY,CAACsC,MAAM,IAAI,CAAC,CAAC;EAC1C;EAEA,IAAIjC,MAAM,CAACC,IAAI,CAACN,YAAY,CAAC,CAACuC,MAAM,KAAK,CAAC,EAAE;IAC1C9C,GAAG,CAACyB,KAAK,CACP,eAAeI,gBAAgB,+BAA+B,GAC5D,qCACJ,CAAC;EACH;EAEA,OAAOtB,YAAY;AACrB;AAEA,OAAO,eAAewC,mBAAmBA,CAAC;EAAEC,UAAU,GAAG1D,EAAE,CAAC2D;AAAQ,CAAC,GAAG,CAAC,CAAC,EAAE;EAC1E,MAAMC,eAAe,GAAG,gBAAgB;;EAExC;EACA,MAAMC,eAAe,GAAG;EACtB;EACA5D,IAAI,CAAC6D,IAAI,CAACJ,UAAU,CAAC,CAAC,EAAE,IAAIE,eAAe,MAAM,CAAC,EAClD3D,IAAI,CAAC6D,IAAI,CAACJ,UAAU,CAAC,CAAC,EAAE,IAAIE,eAAe,MAAM,CAAC,EAClD3D,IAAI,CAAC6D,IAAI,CAACJ,UAAU,CAAC,CAAC,EAAE,IAAIE,eAAe,KAAK,CAAC;EACjD;EACA3D,IAAI,CAAC6D,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC;EACxC;EACA/D,IAAI,CAAC6D,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGJ,eAAe,MAAM,CAAC,EAClD3D,IAAI,CAAC6D,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGJ,eAAe,MAAM,CAAC,EAClD3D,IAAI,CAAC6D,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,GAAGJ,eAAe,KAAK,CAAC;EACjD;EACA3D,IAAI,CAAC6D,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,IAAIJ,eAAe,MAAM,CAAC,EACnD3D,IAAI,CAAC6D,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,IAAIJ,eAAe,MAAM,CAAC,EACnD3D,IAAI,CAAC6D,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,IAAIJ,eAAe,KAAK,CAAC,CACnD;EAED,MAAMK,OAAO,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC/BN,eAAe,CAACO,GAAG,CAAC,MAAOC,QAAQ,IAAK;IACtC,MAAMC,gBAAgB,GAAGrE,IAAI,CAACuC,OAAO,CAAC6B,QAAQ,CAAC;IAC/C,IAAI,MAAM/D,UAAU,CAACgE,gBAAgB,CAAC,EAAE;MACtC,OAAOA,gBAAgB;IACzB,CAAC,MAAM;MACL5D,GAAG,CAACyB,KAAK,CACP,sBAAsBmC,gBAAgB,aAAa,GACjD,0BACJ,CAAC;MACD,OAAOzC,SAAS;IAClB;EACF,CAAC,CACH,CAAC;EAED,MAAM0C,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":[]}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../src/config.js"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs/promises';\n\nimport camelCase from 'camelcase';\nimport decamelize from 'decamelize';\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\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\n if (filePath.endsWith('.js')) {\n throw new UsageError(\n ` Invalid config file \"${resolvedFilePath}\": the file extension should be` +\n '\".cjs\" or \".mjs\". More information at: https://mzl.la/web-ext-config-file',\n );\n }\n\n let configObject;\n try {\n const nonce = `${Date.now()}-${Math.random()}`;\n\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 if (filePath.endsWith('.cjs')) {\n // Remove the additional 'module.exports' named export that Node.js >=\n // 24 is returning from the dynamic import call (in addition to being\n // also set on the default property as in Node.js < 24).\n delete esmConfigMod['module.exports'];\n }\n configObject = { ...configDefault, ...esmConfigMod };\n } else {\n configObject = { ...configModule };\n }\n } catch (error) {\n const configFileError = new UsageError(\n `Cannot read config file \"${resolvedFilePath}\":\\n${error}`,\n );\n configFileError.cause = error;\n throw configFileError;\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\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\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":"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","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":["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":[]}
1
+ {"version":3,"file":"errors.js","names":[],"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":"AAAA,OAAO,eAAe,MAAM,WAAW;;AAEvC;AACA;AACA;AACA,OAAO,MAAM,WAAW,SAAS,eAAe,CAAC;EAC/C,WAAW,CAAC,OAAO,EAAE;IACnB,KAAK,CAAC,OAAO,CAAC;EAChB;AACF;;AAEA;AACA;AACA;AACA,OAAO,MAAM,UAAU,SAAS,WAAW,CAAC;EAC1C,WAAW,CAAC,OAAO,EAAE;IACnB,KAAK,CAAC,OAAO,CAAC;EAChB;AACF;;AAEA;AACA;AACA;AACA,OAAO,MAAM,eAAe,SAAS,UAAU,CAAC;EAC9C,WAAW,CAAC,OAAO,EAAE;IACnB,KAAK,CAAC,OAAO,CAAC;EAChB;AACF;;AAEA;AACA;AACA;AACA,OAAO,MAAM,6BAA6B,SAAS,WAAW,CAAC;EAC7D,WAAW,CAAC,OAAO,EAAE;IACnB,KAAK,CAAC,OAAO,CAAC;EAChB;AACF;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAM,0BAA0B,SAAS,WAAW,CAAC;EAC1D,WAAW,CAAC,SAAS,EAAE;IACrB,IAAI,MAAM,GAAG,EAAE;IACf,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE;MAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;MACzB,MAAM,IAAI,oCAAoC,SAAS,KAAK,GAAG,IAAI;IACrE;IACA,MAAM,OAAO,GAAG,kBAAkB,MAAM,EAAE;IAE1C,KAAK,CAAC,OAAO,CAAC;IACd,IAAI,CAAC,iBAAiB,GAAG,SAAS;EACpC;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE;EACvD,OAAQ,KAAK,IAAK;IAChB,IAAI,KAAK,YAAY,SAAS,EAAE;MAC9B,OAAO,YAAY,CAAC,KAAK,CAAC;IAC5B,CAAC,MAAM;MACL,MAAM,KAAK;IACb;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,kBAAkB,CAAC,UAAU,EAAE,YAAY,EAAE;EAC3D,OAAQ,KAAK,IAAK;IAChB,IAAI,UAAU,GAAG,IAAI;IAErB,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;MAC7B,IACE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IACrC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EACtC;QACA,UAAU,GAAG,KAAK;MACpB;IACF,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE;MAClE,UAAU,GAAG,KAAK;IACpB;IAEA,IAAI,UAAU,EAAE;MACd,MAAM,KAAK;IACb;IAEA,OAAO,YAAY,CAAC,KAAK,CAAC;EAC5B,CAAC;AACH;AAEA,OAAO,SAAS,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE;EACjD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;IACtE,OAAO,IAAI;EACb,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;IACpC,OAAO,IAAI;EACb;EAEA,OAAO,KAAK;AACd","ignoreList":[]}
@@ -497,12 +497,11 @@ export class ChromiumExtensionRunner {
497
497
  // In practice, we're going to run the logic only once. But if we are
498
498
  // unlucky, chrome://extensions is still loading, so we will then retry.
499
499
  for (let i = 0; i < 3; ++i) {
500
- var _evalResult$result;
501
500
  const evalResult = await this.cdp.sendCommand('Runtime.evaluate', {
502
501
  expression: `(${codeToEvaluateInChrome})();`,
503
502
  awaitPromise: true
504
503
  }, targetResult.sessionId);
505
- const evalResultReturnValue = (_evalResult$result = evalResult.result) === null || _evalResult$result === void 0 ? void 0 : _evalResult$result.value;
504
+ const evalResultReturnValue = evalResult.result?.value;
506
505
  if (evalResultReturnValue === 'NOT_READY_PLEASE_RETRY') {
507
506
  await new Promise(r => setTimeout(r, 200 * i));
508
507
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"chromium.js","names":["fs","path","Launcher","ChromeLauncher","launch","defaultChromiumLaunch","createLogger","TempDir","isDirectory","fileExists","expandPrefs","log","import","meta","url","EXCLUDED_CHROME_FLAGS","DEFAULT_CHROME_FLAGS","defaultFlags","filter","flag","includes","DEFAULT_PREFS","_receivedData","WeakMap","_isProcessingMessage","_lastId","_deferredResponses","_disconnected","_disconnectedPromise","_resolveDisconnectedPromise","_ChromeDevtoolsProtocolClient_brand","WeakSet","ChromeDevtoolsProtocolClient","constructor","chromiumInstance","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","Map","_defineProperty","process","env","TEST_LOG_VERBOSE_CDP","incoming","outgoing","remoteDebuggingPipes","_classPrivateFieldSet","Promise","resolve","closed","warn","_assertClassBrand","_finalizeDisconnect","call","on","data","_classPrivateFieldGet","_processNextMessage","error","outgoingPipe","waitUntilDisconnected","sendCommand","method","params","sessionId","undefined","_this$lastId","Error","message","id","rawMessage","JSON","stringify","stderr","write","reject","set","end","indexOf","slice","result","parse","deferredResponse","get","delete","err","e","values","clear","ChromiumExtensionRunner","cleanupCallbacks","chromiumLaunch","forceUseDeprecatedLoadExtension","exiting","_promiseSetupDone","Set","getName","run","setupInstance","isUserDataDir","dirPath","localStatePath","join","defaultPath","isProfileDir","securePreferencesPath","getProfilePaths","chromiumProfile","userDataDir","profileDirName","isProfileDirAndNotUserData","dir","base","extensions","map","sourceDir","chromiumBinary","debug","chromeFlags","push","args","some","test","keepProfileChanges","tmpDir","create","tmpDirPath","cp","recursive","startingUrl","startUrl","startingUrls","Array","isArray","shift","chromePath","logLevel","verbose","ignoreDefaultFlags","prefs","getPrefs","cdp","initialChromiumInstance","once","info","exit","cdpSupportsExtensionsLoadUnpacked","kill","reloadAllExtensions","runnerName","reloadAllExtensionsFallbackForChrome125andEarlier","stdout","Date","toTimeString","targetInfos","targets","type","t","startsWith","targetId","hasExistingTarget","length","newWindow","background","windowState","codeToEvaluateInChrome","developerPrivate","chrome","getExtensionsInfo","extensionIds","extension","location","reloadPromises","extensionId","reload","failQuietly","populateErrorForUnpacked","loadError","all","targetResult","flatten","i","_evalResult$result","evalResult","expression","awaitPromise","evalResultReturnValue","value","r","setTimeout","exceptionDetails","text","reloadExtensionBySourceDir","extensionSourceDir","registerCleanup","fn","add","catch","customChromiumPrefs"],"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 fs from 'fs/promises';\nimport path from 'path';\n\nimport {\n Launcher as ChromeLauncher,\n launch as defaultChromiumLaunch,\n} from 'chrome-launcher';\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';\nimport expandPrefs from '../util/expand-prefs.js';\n\nconst log = createLogger(import.meta.url);\n\nconst EXCLUDED_CHROME_FLAGS = [\n '--disable-extensions',\n '--mute-audio',\n '--disable-component-update',\n];\n\nexport const DEFAULT_CHROME_FLAGS = ChromeLauncher.defaultFlags().filter(\n (flag) => !EXCLUDED_CHROME_FLAGS.includes(flag),\n);\n\nconst DEFAULT_PREFS = { 'extensions.ui.developer_mode': true };\n\n// This is a client for the Chrome Devtools protocol. The methods and results\n// are documented at https://chromedevtools.github.io/devtools-protocol/tot/\nclass ChromeDevtoolsProtocolClient {\n #receivedData = '';\n #isProcessingMessage = false;\n #lastId = 0;\n #deferredResponses = new Map();\n #disconnected = false;\n #disconnectedPromise;\n #resolveDisconnectedPromise;\n\n // Print all exchanged CDP messages to ease debugging.\n TEST_LOG_VERBOSE_CDP = process.env.TEST_LOG_VERBOSE_CDP;\n\n constructor(chromiumInstance) {\n // remoteDebuggingPipes is from chrome-launcher, see\n // https://github.com/GoogleChrome/chrome-launcher/pull/347\n const { incoming, outgoing } = chromiumInstance.remoteDebuggingPipes;\n this.#disconnectedPromise = new Promise((resolve) => {\n this.#resolveDisconnectedPromise = resolve;\n });\n if (incoming.closed) {\n // Strange. Did Chrome fail to start, or exit on startup?\n log.warn('CDP already disconnected at initialization');\n this.#finalizeDisconnect();\n return;\n }\n incoming.on('data', (data) => {\n this.#receivedData += data;\n this.#processNextMessage();\n });\n incoming.on('error', (error) => {\n log.error(error);\n this.#finalizeDisconnect();\n });\n incoming.on('close', () => this.#finalizeDisconnect());\n this.outgoingPipe = outgoing;\n }\n\n waitUntilDisconnected() {\n return this.#disconnectedPromise;\n }\n\n async sendCommand(method, params, sessionId = undefined) {\n if (this.#disconnected) {\n throw new Error(`CDP disconnected, cannot send: command ${method}`);\n }\n const message = {\n id: ++this.#lastId,\n method,\n params,\n sessionId,\n };\n const rawMessage = `${JSON.stringify(message)}\\x00`;\n if (this.TEST_LOG_VERBOSE_CDP) {\n process.stderr.write(`[CDP] [SEND] ${rawMessage}\\n`);\n }\n return new Promise((resolve, reject) => {\n // CDP will always send a response.\n this.#deferredResponses.set(message.id, { method, resolve, reject });\n this.outgoingPipe.write(rawMessage);\n });\n }\n\n #processNextMessage() {\n if (this.#isProcessingMessage) {\n return;\n }\n this.#isProcessingMessage = true;\n let end = this.#receivedData.indexOf('\\x00');\n while (end !== -1) {\n const rawMessage = this.#receivedData.slice(0, end);\n this.#receivedData = this.#receivedData.slice(end + 1); // +1 skips \\x00.\n try {\n if (this.TEST_LOG_VERBOSE_CDP) {\n process.stderr.write(`[CDP] [RECV] ${rawMessage}\\n`);\n }\n const { id, error, result } = JSON.parse(rawMessage);\n const deferredResponse = this.#deferredResponses.get(id);\n if (deferredResponse) {\n this.#deferredResponses.delete(id);\n if (error) {\n const err = new Error(error.message || 'Unexpected CDP response');\n deferredResponse.reject(err);\n } else {\n deferredResponse.resolve(result);\n }\n } else {\n // Dropping events and non-response messages since we don't need it.\n }\n } catch (e) {\n log.error(e);\n }\n end = this.#receivedData.indexOf('\\x00');\n }\n this.#isProcessingMessage = false;\n if (this.#disconnected) {\n for (const { method, reject } of this.#deferredResponses.values()) {\n reject(new Error(`CDP connection closed before response to ${method}`));\n }\n this.#deferredResponses.clear();\n this.#resolveDisconnectedPromise();\n }\n }\n\n #finalizeDisconnect() {\n if (!this.#disconnected) {\n this.#disconnected = true;\n this.#processNextMessage();\n }\n }\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 // --load-extension is deprecated, but only supported in Chrome 126+, see:\n // https://github.com/mozilla/web-ext/issues/3388#issuecomment-2906982117\n forceUseDeprecatedLoadExtension;\n exiting;\n _promiseSetupDone;\n\n constructor(params) {\n const { chromiumLaunch = defaultChromiumLaunch } = params;\n this.params = params;\n this.chromiumLaunch = chromiumLaunch;\n // We will try to use Extensions.loadUnpacked first (Chrome 126+), and if\n // that does not work fall back to --load-extension.\n this.forceUseDeprecatedLoadExtension = false;\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 // NOTE: This function may be called twice, if the user is using an old\n // Chrome version (before Chrome 126), because then we have to add a\n // command-line flag (--load-extension) to load the extension. For details,\n // see:\n // https://github.com/mozilla/web-ext/issues/3388#issuecomment-2906982117\n\n // Start chrome pointing it to a given profile dir\n const extensions = this.params.extensions.map(({ sourceDir }) => sourceDir);\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 chromeFlags.push('--remote-debugging-pipe');\n\n if (!this.forceUseDeprecatedLoadExtension) {\n chromeFlags.push('--enable-unsafe-extension-debugging');\n } else {\n chromeFlags.push(`--load-extension=${extensions.join(',')}`);\n }\n\n if (this.params.args) {\n chromeFlags.push(...this.params.args);\n }\n\n // `--remote-debugging-pipe` results in `navigator.webdriver == true` in\n // the launched Chromium instance (unless a Chromium session exists\n // already, in which case the existing session is used, which typically\n // has `navigator.webdriver == false`). This breaks websites with bot\n // detection features. The following flag prevents this.\n // Only pass this flag if `--enable-blink-features=AutomationControlled`\n // is not passed.\n if (\n !chromeFlags.some((flag) =>\n /^--enable-blink-features=(.*,)?AutomationControlled(,|$)/.test(flag),\n )\n ) {\n chromeFlags.push('--disable-blink-features=AutomationControlled');\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.cp(\n path.join(userDataDir, profileDirName),\n path.join(tmpDirPath, profileDirName),\n { recursive: true },\n );\n } else if (userDataDir) {\n await fs.cp(userDataDir, tmpDirPath, { recursive: true });\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 chromePath: chromiumBinary,\n chromeFlags,\n startingUrl,\n userDataDir,\n logLevel: this.params.verbose ? 'verbose' : 'silent',\n // Ignore default flags to keep the extension enabled.\n ignoreDefaultFlags: true,\n prefs: this.getPrefs(),\n });\n this.cdp = new ChromeDevtoolsProtocolClient(this.chromiumInstance);\n\n const initialChromiumInstance = this.chromiumInstance;\n this.chromiumInstance.process.once('close', () => {\n if (this.chromiumInstance !== initialChromiumInstance) {\n // This happens when we restart Chrome to fall back to --load-extension.\n return;\n }\n this.chromiumInstance = null;\n\n if (!this.exiting) {\n log.info('Exiting on Chromium instance disconnected.');\n this.exit();\n }\n });\n\n if (!this.forceUseDeprecatedLoadExtension) {\n // Assume that the required Extensions.loadUnpacked CDP method is\n // supported. If it is not, we will fall back to --load-extension.\n let cdpSupportsExtensionsLoadUnpacked = true;\n for (const sourceDir of extensions) {\n try {\n await this.cdp.sendCommand('Extensions.loadUnpacked', {\n path: sourceDir,\n });\n } catch (e) {\n // Chrome 125- will emit the following message:\n if (e.message === \"'Extensions.loadUnpacked' wasn't found\") {\n cdpSupportsExtensionsLoadUnpacked = false;\n break;\n }\n log.error(`Failed to load extension at ${sourceDir}: ${e.message}`);\n // We do not have to throw - the extension can work again when\n // auto-reload is used. But users may like a hard fail, and this is\n // consistent with the firefox runner.\n throw e;\n }\n }\n if (!cdpSupportsExtensionsLoadUnpacked) {\n // Retry once, now with --load-extension.\n log.warn('Cannot load extension via CDP, falling back to old method');\n this.forceUseDeprecatedLoadExtension = true;\n this.chromiumInstance = null;\n await initialChromiumInstance.kill();\n await this.cdp.waitUntilDisconnected();\n this.cdp = null;\n return this.setupInstance();\n }\n }\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 if (this.forceUseDeprecatedLoadExtension) {\n this.reloadAllExtensionsFallbackForChrome125andEarlier();\n } else {\n for (const { sourceDir } of this.params.extensions) {\n try {\n await this.cdp.sendCommand('Extensions.loadUnpacked', {\n path: sourceDir,\n });\n } catch (e) {\n log.error(`Failed to load extension at ${sourceDir}: ${e.message}`);\n }\n }\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 async reloadAllExtensionsFallbackForChrome125andEarlier() {\n // Ideally, we'd like to use the \"Extensions.loadUnpacked\" CDP command to\n // reload an extension, but that is unsupported in Chrome 125 and earlier.\n //\n // As a fallback, connect to chrome://extensions/ and reload from there.\n // Since we are targeting old Chrome versions, we can safely use the\n // chrome.developerPrivate APIs, because these are never going to change\n // for the old browser versions. Do NOT use this for newer versions!\n //\n // Target.* CDP methods documented at: https://chromedevtools.github.io/devtools-protocol/tot/Target/\n // developerPrivate documented at:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl\n //\n // Specific revision that exposed developerPrivate to chrome://extensions/:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl;drc=69bf75316e7ae533c0a0dccc1a56ca019aa95a1e\n // https://chromium.googlesource.com/chromium/src.git/+/69bf75316e7ae533c0a0dccc1a56ca019aa95a1e\n //\n // Specific revision that introduced developerPrivate.getExtensionsInfo:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl;drc=69bf75316e7ae533c0a0dccc1a56ca019aa95a1e\n //\n // The above changes are from 2015; The --remote-debugging-pipe feature\n // that we rely on for CDP was added in 2018; this is the version of the\n // developerPrivate API at that time:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl;drc=c9ae59c8f37d487f1f01c222deb6b7d1f51c99c2\n\n // Find an existing chrome://extensions/ tab, if it exists.\n let { targetInfos: targets } = await this.cdp.sendCommand(\n 'Target.getTargets',\n { filter: [{ type: 'tab' }] },\n );\n targets = targets.filter((t) => t.url.startsWith('chrome://extensions/'));\n let targetId;\n const hasExistingTarget = targets.length > 0;\n if (hasExistingTarget) {\n targetId = targets[0].targetId;\n } else {\n const result = await this.cdp.sendCommand('Target.createTarget', {\n url: 'chrome://extensions/',\n newWindow: true,\n background: true,\n windowState: 'minimized',\n });\n targetId = result.targetId;\n }\n const codeToEvaluateInChrome = async () => {\n // This function is serialized and executed in Chrome. Designed for\n // compatibility with Chrome 69 - 125. Do not use JS syntax of functions\n // that are not supported in these versions!\n\n // eslint-disable-next-line no-undef\n const developerPrivate = chrome.developerPrivate;\n if (!developerPrivate || !developerPrivate.getExtensionsInfo) {\n // When chrome://extensions/ is still loading, its document URL may be\n // about:blank and the chrome.developerPrivate API is not exposed.\n return 'NOT_READY_PLEASE_RETRY';\n }\n const extensionIds = [];\n await new Promise((resolve) => {\n developerPrivate.getExtensionsInfo((extensions) => {\n for (const extension of extensions || []) {\n if (extension.location === 'UNPACKED') {\n // We only care about those loaded via --load-extension.\n extensionIds.push(extension.id);\n }\n }\n resolve();\n });\n });\n const reloadPromises = extensionIds.map((extensionId) => {\n return new Promise((resolve, reject) => {\n developerPrivate.reload(\n extensionId,\n // Suppress alert dialog when load fails.\n { failQuietly: true, populateErrorForUnpacked: true },\n (loadError) => {\n if (loadError) {\n reject(new Error(loadError.error));\n } else {\n resolve();\n }\n },\n );\n });\n });\n await Promise.all(reloadPromises);\n return reloadPromises.length;\n };\n try {\n const targetResult = await this.cdp.sendCommand('Target.attachToTarget', {\n targetId,\n flatten: true,\n });\n if (!targetResult.sessionId) {\n throw new Error('Unexpectedly, no sessionId from attachToTarget');\n }\n // In practice, we're going to run the logic only once. But if we are\n // unlucky, chrome://extensions is still loading, so we will then retry.\n for (let i = 0; i < 3; ++i) {\n const evalResult = await this.cdp.sendCommand(\n 'Runtime.evaluate',\n {\n expression: `(${codeToEvaluateInChrome})();`,\n awaitPromise: true,\n },\n targetResult.sessionId,\n );\n const evalResultReturnValue = evalResult.result?.value;\n if (evalResultReturnValue === 'NOT_READY_PLEASE_RETRY') {\n await new Promise((r) => setTimeout(r, 200 * i));\n continue;\n }\n if (evalResult.exceptionDetails) {\n log.error(`Failed to reload: ${evalResult.exceptionDetails.text}`);\n }\n if (evalResultReturnValue !== this.params.extensions.length) {\n log.warn(`Failed to reload extensions: ${evalResultReturnValue}`);\n }\n break;\n }\n } finally {\n if (!hasExistingTarget && targetId) {\n try {\n await this.cdp.sendCommand('Target.closeTarget', { targetId });\n } catch (e) {\n log.error(e);\n }\n }\n }\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.cdp) {\n await this.cdp.waitUntilDisconnected();\n this.cdp = 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 /**\n * Returns a deep preferences object based on a set of flat preferences, like\n * \"extensions.ui.developer_mode\".\n */\n getPrefs() {\n return expandPrefs({\n ...DEFAULT_PREFS,\n ...this.params.customChromiumPrefs,\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"chromium.js","names":[],"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 fs from 'fs/promises';\nimport path from 'path';\n\nimport {\n Launcher as ChromeLauncher,\n launch as defaultChromiumLaunch,\n} from 'chrome-launcher';\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';\nimport expandPrefs from '../util/expand-prefs.js';\n\nconst log = createLogger(import.meta.url);\n\nconst EXCLUDED_CHROME_FLAGS = [\n '--disable-extensions',\n '--mute-audio',\n '--disable-component-update',\n];\n\nexport const DEFAULT_CHROME_FLAGS = ChromeLauncher.defaultFlags().filter(\n (flag) => !EXCLUDED_CHROME_FLAGS.includes(flag),\n);\n\nconst DEFAULT_PREFS = { 'extensions.ui.developer_mode': true };\n\n// This is a client for the Chrome Devtools protocol. The methods and results\n// are documented at https://chromedevtools.github.io/devtools-protocol/tot/\nclass ChromeDevtoolsProtocolClient {\n #receivedData = '';\n #isProcessingMessage = false;\n #lastId = 0;\n #deferredResponses = new Map();\n #disconnected = false;\n #disconnectedPromise;\n #resolveDisconnectedPromise;\n\n // Print all exchanged CDP messages to ease debugging.\n TEST_LOG_VERBOSE_CDP = process.env.TEST_LOG_VERBOSE_CDP;\n\n constructor(chromiumInstance) {\n // remoteDebuggingPipes is from chrome-launcher, see\n // https://github.com/GoogleChrome/chrome-launcher/pull/347\n const { incoming, outgoing } = chromiumInstance.remoteDebuggingPipes;\n this.#disconnectedPromise = new Promise((resolve) => {\n this.#resolveDisconnectedPromise = resolve;\n });\n if (incoming.closed) {\n // Strange. Did Chrome fail to start, or exit on startup?\n log.warn('CDP already disconnected at initialization');\n this.#finalizeDisconnect();\n return;\n }\n incoming.on('data', (data) => {\n this.#receivedData += data;\n this.#processNextMessage();\n });\n incoming.on('error', (error) => {\n log.error(error);\n this.#finalizeDisconnect();\n });\n incoming.on('close', () => this.#finalizeDisconnect());\n this.outgoingPipe = outgoing;\n }\n\n waitUntilDisconnected() {\n return this.#disconnectedPromise;\n }\n\n async sendCommand(method, params, sessionId = undefined) {\n if (this.#disconnected) {\n throw new Error(`CDP disconnected, cannot send: command ${method}`);\n }\n const message = {\n id: ++this.#lastId,\n method,\n params,\n sessionId,\n };\n const rawMessage = `${JSON.stringify(message)}\\x00`;\n if (this.TEST_LOG_VERBOSE_CDP) {\n process.stderr.write(`[CDP] [SEND] ${rawMessage}\\n`);\n }\n return new Promise((resolve, reject) => {\n // CDP will always send a response.\n this.#deferredResponses.set(message.id, { method, resolve, reject });\n this.outgoingPipe.write(rawMessage);\n });\n }\n\n #processNextMessage() {\n if (this.#isProcessingMessage) {\n return;\n }\n this.#isProcessingMessage = true;\n let end = this.#receivedData.indexOf('\\x00');\n while (end !== -1) {\n const rawMessage = this.#receivedData.slice(0, end);\n this.#receivedData = this.#receivedData.slice(end + 1); // +1 skips \\x00.\n try {\n if (this.TEST_LOG_VERBOSE_CDP) {\n process.stderr.write(`[CDP] [RECV] ${rawMessage}\\n`);\n }\n const { id, error, result } = JSON.parse(rawMessage);\n const deferredResponse = this.#deferredResponses.get(id);\n if (deferredResponse) {\n this.#deferredResponses.delete(id);\n if (error) {\n const err = new Error(error.message || 'Unexpected CDP response');\n deferredResponse.reject(err);\n } else {\n deferredResponse.resolve(result);\n }\n } else {\n // Dropping events and non-response messages since we don't need it.\n }\n } catch (e) {\n log.error(e);\n }\n end = this.#receivedData.indexOf('\\x00');\n }\n this.#isProcessingMessage = false;\n if (this.#disconnected) {\n for (const { method, reject } of this.#deferredResponses.values()) {\n reject(new Error(`CDP connection closed before response to ${method}`));\n }\n this.#deferredResponses.clear();\n this.#resolveDisconnectedPromise();\n }\n }\n\n #finalizeDisconnect() {\n if (!this.#disconnected) {\n this.#disconnected = true;\n this.#processNextMessage();\n }\n }\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 // --load-extension is deprecated, but only supported in Chrome 126+, see:\n // https://github.com/mozilla/web-ext/issues/3388#issuecomment-2906982117\n forceUseDeprecatedLoadExtension;\n exiting;\n _promiseSetupDone;\n\n constructor(params) {\n const { chromiumLaunch = defaultChromiumLaunch } = params;\n this.params = params;\n this.chromiumLaunch = chromiumLaunch;\n // We will try to use Extensions.loadUnpacked first (Chrome 126+), and if\n // that does not work fall back to --load-extension.\n this.forceUseDeprecatedLoadExtension = false;\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 // NOTE: This function may be called twice, if the user is using an old\n // Chrome version (before Chrome 126), because then we have to add a\n // command-line flag (--load-extension) to load the extension. For details,\n // see:\n // https://github.com/mozilla/web-ext/issues/3388#issuecomment-2906982117\n\n // Start chrome pointing it to a given profile dir\n const extensions = this.params.extensions.map(({ sourceDir }) => sourceDir);\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 chromeFlags.push('--remote-debugging-pipe');\n\n if (!this.forceUseDeprecatedLoadExtension) {\n chromeFlags.push('--enable-unsafe-extension-debugging');\n } else {\n chromeFlags.push(`--load-extension=${extensions.join(',')}`);\n }\n\n if (this.params.args) {\n chromeFlags.push(...this.params.args);\n }\n\n // `--remote-debugging-pipe` results in `navigator.webdriver == true` in\n // the launched Chromium instance (unless a Chromium session exists\n // already, in which case the existing session is used, which typically\n // has `navigator.webdriver == false`). This breaks websites with bot\n // detection features. The following flag prevents this.\n // Only pass this flag if `--enable-blink-features=AutomationControlled`\n // is not passed.\n if (\n !chromeFlags.some((flag) =>\n /^--enable-blink-features=(.*,)?AutomationControlled(,|$)/.test(flag),\n )\n ) {\n chromeFlags.push('--disable-blink-features=AutomationControlled');\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.cp(\n path.join(userDataDir, profileDirName),\n path.join(tmpDirPath, profileDirName),\n { recursive: true },\n );\n } else if (userDataDir) {\n await fs.cp(userDataDir, tmpDirPath, { recursive: true });\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 chromePath: chromiumBinary,\n chromeFlags,\n startingUrl,\n userDataDir,\n logLevel: this.params.verbose ? 'verbose' : 'silent',\n // Ignore default flags to keep the extension enabled.\n ignoreDefaultFlags: true,\n prefs: this.getPrefs(),\n });\n this.cdp = new ChromeDevtoolsProtocolClient(this.chromiumInstance);\n\n const initialChromiumInstance = this.chromiumInstance;\n this.chromiumInstance.process.once('close', () => {\n if (this.chromiumInstance !== initialChromiumInstance) {\n // This happens when we restart Chrome to fall back to --load-extension.\n return;\n }\n this.chromiumInstance = null;\n\n if (!this.exiting) {\n log.info('Exiting on Chromium instance disconnected.');\n this.exit();\n }\n });\n\n if (!this.forceUseDeprecatedLoadExtension) {\n // Assume that the required Extensions.loadUnpacked CDP method is\n // supported. If it is not, we will fall back to --load-extension.\n let cdpSupportsExtensionsLoadUnpacked = true;\n for (const sourceDir of extensions) {\n try {\n await this.cdp.sendCommand('Extensions.loadUnpacked', {\n path: sourceDir,\n });\n } catch (e) {\n // Chrome 125- will emit the following message:\n if (e.message === \"'Extensions.loadUnpacked' wasn't found\") {\n cdpSupportsExtensionsLoadUnpacked = false;\n break;\n }\n log.error(`Failed to load extension at ${sourceDir}: ${e.message}`);\n // We do not have to throw - the extension can work again when\n // auto-reload is used. But users may like a hard fail, and this is\n // consistent with the firefox runner.\n throw e;\n }\n }\n if (!cdpSupportsExtensionsLoadUnpacked) {\n // Retry once, now with --load-extension.\n log.warn('Cannot load extension via CDP, falling back to old method');\n this.forceUseDeprecatedLoadExtension = true;\n this.chromiumInstance = null;\n await initialChromiumInstance.kill();\n await this.cdp.waitUntilDisconnected();\n this.cdp = null;\n return this.setupInstance();\n }\n }\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 if (this.forceUseDeprecatedLoadExtension) {\n this.reloadAllExtensionsFallbackForChrome125andEarlier();\n } else {\n for (const { sourceDir } of this.params.extensions) {\n try {\n await this.cdp.sendCommand('Extensions.loadUnpacked', {\n path: sourceDir,\n });\n } catch (e) {\n log.error(`Failed to load extension at ${sourceDir}: ${e.message}`);\n }\n }\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 async reloadAllExtensionsFallbackForChrome125andEarlier() {\n // Ideally, we'd like to use the \"Extensions.loadUnpacked\" CDP command to\n // reload an extension, but that is unsupported in Chrome 125 and earlier.\n //\n // As a fallback, connect to chrome://extensions/ and reload from there.\n // Since we are targeting old Chrome versions, we can safely use the\n // chrome.developerPrivate APIs, because these are never going to change\n // for the old browser versions. Do NOT use this for newer versions!\n //\n // Target.* CDP methods documented at: https://chromedevtools.github.io/devtools-protocol/tot/Target/\n // developerPrivate documented at:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl\n //\n // Specific revision that exposed developerPrivate to chrome://extensions/:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl;drc=69bf75316e7ae533c0a0dccc1a56ca019aa95a1e\n // https://chromium.googlesource.com/chromium/src.git/+/69bf75316e7ae533c0a0dccc1a56ca019aa95a1e\n //\n // Specific revision that introduced developerPrivate.getExtensionsInfo:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl;drc=69bf75316e7ae533c0a0dccc1a56ca019aa95a1e\n //\n // The above changes are from 2015; The --remote-debugging-pipe feature\n // that we rely on for CDP was added in 2018; this is the version of the\n // developerPrivate API at that time:\n // https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/extensions/api/developer_private.idl;drc=c9ae59c8f37d487f1f01c222deb6b7d1f51c99c2\n\n // Find an existing chrome://extensions/ tab, if it exists.\n let { targetInfos: targets } = await this.cdp.sendCommand(\n 'Target.getTargets',\n { filter: [{ type: 'tab' }] },\n );\n targets = targets.filter((t) => t.url.startsWith('chrome://extensions/'));\n let targetId;\n const hasExistingTarget = targets.length > 0;\n if (hasExistingTarget) {\n targetId = targets[0].targetId;\n } else {\n const result = await this.cdp.sendCommand('Target.createTarget', {\n url: 'chrome://extensions/',\n newWindow: true,\n background: true,\n windowState: 'minimized',\n });\n targetId = result.targetId;\n }\n const codeToEvaluateInChrome = async () => {\n // This function is serialized and executed in Chrome. Designed for\n // compatibility with Chrome 69 - 125. Do not use JS syntax of functions\n // that are not supported in these versions!\n\n // eslint-disable-next-line no-undef\n const developerPrivate = chrome.developerPrivate;\n if (!developerPrivate || !developerPrivate.getExtensionsInfo) {\n // When chrome://extensions/ is still loading, its document URL may be\n // about:blank and the chrome.developerPrivate API is not exposed.\n return 'NOT_READY_PLEASE_RETRY';\n }\n const extensionIds = [];\n await new Promise((resolve) => {\n developerPrivate.getExtensionsInfo((extensions) => {\n for (const extension of extensions || []) {\n if (extension.location === 'UNPACKED') {\n // We only care about those loaded via --load-extension.\n extensionIds.push(extension.id);\n }\n }\n resolve();\n });\n });\n const reloadPromises = extensionIds.map((extensionId) => {\n return new Promise((resolve, reject) => {\n developerPrivate.reload(\n extensionId,\n // Suppress alert dialog when load fails.\n { failQuietly: true, populateErrorForUnpacked: true },\n (loadError) => {\n if (loadError) {\n reject(new Error(loadError.error));\n } else {\n resolve();\n }\n },\n );\n });\n });\n await Promise.all(reloadPromises);\n return reloadPromises.length;\n };\n try {\n const targetResult = await this.cdp.sendCommand('Target.attachToTarget', {\n targetId,\n flatten: true,\n });\n if (!targetResult.sessionId) {\n throw new Error('Unexpectedly, no sessionId from attachToTarget');\n }\n // In practice, we're going to run the logic only once. But if we are\n // unlucky, chrome://extensions is still loading, so we will then retry.\n for (let i = 0; i < 3; ++i) {\n const evalResult = await this.cdp.sendCommand(\n 'Runtime.evaluate',\n {\n expression: `(${codeToEvaluateInChrome})();`,\n awaitPromise: true,\n },\n targetResult.sessionId,\n );\n const evalResultReturnValue = evalResult.result?.value;\n if (evalResultReturnValue === 'NOT_READY_PLEASE_RETRY') {\n await new Promise((r) => setTimeout(r, 200 * i));\n continue;\n }\n if (evalResult.exceptionDetails) {\n log.error(`Failed to reload: ${evalResult.exceptionDetails.text}`);\n }\n if (evalResultReturnValue !== this.params.extensions.length) {\n log.warn(`Failed to reload extensions: ${evalResultReturnValue}`);\n }\n break;\n }\n } finally {\n if (!hasExistingTarget && targetId) {\n try {\n await this.cdp.sendCommand('Target.closeTarget', { targetId });\n } catch (e) {\n log.error(e);\n }\n }\n }\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.cdp) {\n await this.cdp.waitUntilDisconnected();\n this.cdp = 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 /**\n * Returns a deep preferences object based on a set of flat preferences, like\n * \"extensions.ui.developer_mode\".\n */\n getPrefs() {\n return expandPrefs({\n ...DEFAULT_PREFS,\n ...this.params.customChromiumPrefs,\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}