web-ext 7.2.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +2 -2
  2. package/lib/cmd/build.js +18 -36
  3. package/lib/cmd/build.js.map +1 -1
  4. package/lib/cmd/docs.js +1 -0
  5. package/lib/cmd/docs.js.map +1 -1
  6. package/lib/cmd/index.js +3 -5
  7. package/lib/cmd/index.js.map +1 -1
  8. package/lib/cmd/lint.js +28 -17
  9. package/lib/cmd/lint.js.map +1 -1
  10. package/lib/cmd/run.js +19 -23
  11. package/lib/cmd/run.js.map +1 -1
  12. package/lib/cmd/sign.js +80 -47
  13. package/lib/cmd/sign.js.map +1 -1
  14. package/lib/config.js +18 -29
  15. package/lib/config.js.map +1 -1
  16. package/lib/errors.js +8 -18
  17. package/lib/errors.js.map +1 -1
  18. package/lib/extension-runners/base.js +2 -0
  19. package/lib/extension-runners/base.js.map +1 -1
  20. package/lib/extension-runners/chromium.js +36 -62
  21. package/lib/extension-runners/chromium.js.map +1 -1
  22. package/lib/extension-runners/firefox-android.js +65 -102
  23. package/lib/extension-runners/firefox-android.js.map +1 -1
  24. package/lib/extension-runners/firefox-desktop.js +29 -42
  25. package/lib/extension-runners/firefox-desktop.js.map +1 -1
  26. package/lib/extension-runners/index.js +33 -46
  27. package/lib/extension-runners/index.js.map +1 -1
  28. package/lib/firefox/index.js +59 -52
  29. package/lib/firefox/index.js.map +1 -1
  30. package/lib/firefox/package-identifiers.js +2 -0
  31. package/lib/firefox/package-identifiers.js.map +1 -1
  32. package/lib/firefox/preferences.js +14 -15
  33. package/lib/firefox/preferences.js.map +1 -1
  34. package/lib/firefox/rdp-client.js +16 -64
  35. package/lib/firefox/rdp-client.js.map +1 -1
  36. package/lib/firefox/remote.js +15 -30
  37. package/lib/firefox/remote.js.map +1 -1
  38. package/lib/main.js +4 -2
  39. package/lib/main.js.map +1 -1
  40. package/lib/program.js +74 -76
  41. package/lib/program.js.map +1 -1
  42. package/lib/util/adb.js +33 -63
  43. package/lib/util/adb.js.map +1 -1
  44. package/lib/util/artifacts.js +3 -5
  45. package/lib/util/artifacts.js.map +1 -1
  46. package/lib/util/desktop-notifier.js +1 -0
  47. package/lib/util/desktop-notifier.js.map +1 -1
  48. package/lib/util/file-exists.js +1 -2
  49. package/lib/util/file-exists.js.map +1 -1
  50. package/lib/util/file-filter.js +17 -19
  51. package/lib/util/file-filter.js.map +1 -1
  52. package/lib/util/is-directory.js +2 -1
  53. package/lib/util/is-directory.js.map +1 -1
  54. package/lib/util/logger.js +7 -12
  55. package/lib/util/logger.js.map +1 -1
  56. package/lib/util/manifest.js +6 -13
  57. package/lib/util/manifest.js.map +1 -1
  58. package/lib/util/promisify.js +7 -3
  59. package/lib/util/promisify.js.map +1 -1
  60. package/lib/util/stdin.js +2 -0
  61. package/lib/util/stdin.js.map +1 -1
  62. package/lib/util/submit-addon.js +288 -0
  63. package/lib/util/submit-addon.js.map +1 -0
  64. package/lib/util/temp-dir.js +8 -18
  65. package/lib/util/temp-dir.js.map +1 -1
  66. package/lib/util/updates.js +1 -1
  67. package/lib/util/updates.js.map +1 -1
  68. package/lib/watcher.js +14 -9
  69. package/lib/watcher.js.map +1 -1
  70. package/package.json +16 -14
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","names":["fs","defaultBuildExtension","showDesktopNotification","defaultDesktopNotifications","defaultFirefoxApp","connectWithMaxRetries","defaultFirefoxClient","createLogger","defaultGetValidatedManifest","UsageError","createExtensionRunner","defaultReloadStrategy","MultiExtensionRunner","DefaultMultiExtensionRunner","log","import","meta","url","run","artifactsDir","browserConsole","pref","firefox","firefoxProfile","profileCreateIfMissing","keepProfileChanges","ignoreFiles","noInput","noReload","preInstall","sourceDir","watchFile","watchIgnored","startUrl","target","args","firefoxPreview","adbBin","adbHost","adbPort","adbDevice","adbDiscoveryTimeout","adbRemoveOldArtifacts","firefoxApk","firefoxApkComponent","chromiumBinary","chromiumProfile","buildExtension","desktopNotifications","firefoxApp","firefoxClient","reloadStrategy","getValidatedManifest","info","Array","isArray","every","el","customPrefs","includes","manifestData","profileDir","isDir","existsSync","mkdir","runners","commonRunnerParams","extensions","length","firefoxDesktopRunnerParams","firefoxBinary","profilePath","firefoxDesktopRunner","params","push","firefoxAndroidRunnerParams","buildSourceDir","extensionSourceDir","tmpArtifactsDir","asNeeded","showReadyMessage","firefoxAndroidRunner","chromiumRunnerParams","chromiumRunner","extensionRunner"],"sources":["../../src/cmd/run.js"],"sourcesContent":["/* @flow */\nimport { fs } from 'mz';\n\nimport defaultBuildExtension from './build.js';\nimport {\n showDesktopNotification as defaultDesktopNotifications,\n} from '../util/desktop-notifier.js';\nimport * as defaultFirefoxApp from '../firefox/index.js';\nimport {\n connectWithMaxRetries as defaultFirefoxClient,\n} 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// Import objects that are only used as Flow types.\nimport type {FirefoxPreferences} from '../firefox/preferences.js';\n\nconst log = createLogger(import.meta.url);\n\n\n// Run command types and implementation.\n\nexport type CmdRunParams = {|\n artifactsDir: string,\n browserConsole: boolean,\n pref?: FirefoxPreferences,\n firefox: string,\n firefoxProfile?: string,\n profileCreateIfMissing?: boolean,\n ignoreFiles?: Array<string>,\n keepProfileChanges: boolean,\n noInput?: boolean,\n noReload: boolean,\n preInstall: boolean,\n sourceDir: string,\n watchFile?: Array<string>,\n watchIgnored?: Array<string>,\n startUrl?: Array<string>,\n target?: Array<string>,\n args?: Array<string>,\n firefoxPreview: Array<string>,\n\n // Android CLI options.\n adbBin?: string,\n adbHost?: string,\n adbPort?: string,\n adbDevice?: string,\n adbDiscoveryTimeout?: number,\n adbRemoveOldArtifacts?: boolean,\n firefoxApk?: string,\n firefoxApkComponent?: string,\n\n // Chromium Desktop CLI options.\n chromiumBinary?: string,\n chromiumProfile?: string,\n|};\n\nexport type CmdRunOptions = {\n buildExtension: typeof defaultBuildExtension,\n desktopNotifications: typeof defaultDesktopNotifications,\n firefoxApp: typeof defaultFirefoxApp,\n firefoxClient: typeof defaultFirefoxClient,\n reloadStrategy: typeof defaultReloadStrategy,\n shouldExitProgram?: boolean,\n MultiExtensionRunner?: typeof DefaultMultiExtensionRunner,\n getValidatedManifest?: typeof defaultGetValidatedManifest,\n};\n\nexport default async function run(\n {\n artifactsDir,\n browserConsole = 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 watchFile,\n watchIgnored,\n startUrl,\n target,\n args,\n firefoxPreview = [],\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 chromiumProfile,\n }: CmdRunParams,\n {\n buildExtension = defaultBuildExtension,\n desktopNotifications = defaultDesktopNotifications,\n firefoxApp = defaultFirefoxApp,\n firefoxClient = defaultFirefoxClient,\n reloadStrategy = defaultReloadStrategy,\n MultiExtensionRunner = DefaultMultiExtensionRunner,\n getValidatedManifest = defaultGetValidatedManifest,\n }: CmdRunOptions = {}): Promise<DefaultMultiExtensionRunner> {\n\n log.info(`Running web extension from ${sourceDir}`);\n if (preInstall) {\n log.info('Disabled auto-reloading because it\\'s not possible with ' +\n '--pre-install');\n noReload = true;\n }\n\n if (watchFile != null && (!Array.isArray(watchFile) ||\n !watchFile.every((el) => typeof el === 'string'))) {\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: FirefoxPreferences = {...pref};\n if (firefoxPreview.includes('mv3')) {\n log.info('Configuring Firefox preferences for Manifest V3');\n customPrefs['extensions.manifestV3.enabled'] = true;\n }\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 = fs.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 desktopNotifications,\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 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 desktopNotifications: defaultDesktopNotifications,\n buildSourceDir: (extensionSourceDir: string, tmpArtifactsDir: string) => {\n return buildExtension({\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 // Suppress the message usually logged by web-ext build.\n showReadyMessage: false,\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 chromiumBinary,\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 desktopNotifications,\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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"}
1
+ {"version":3,"file":"run.js","names":["fs","defaultBuildExtension","showDesktopNotification","defaultDesktopNotifications","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","watchFile","watchIgnored","startUrl","target","args","firefoxPreview","adbBin","adbHost","adbPort","adbDevice","adbDiscoveryTimeout","adbRemoveOldArtifacts","firefoxApk","firefoxApkComponent","chromiumBinary","chromiumProfile","buildExtension","desktopNotifications","firefoxApp","firefoxClient","reloadStrategy","getValidatedManifest","info","Array","isArray","every","el","customPrefs","includes","manifestData","profileDir","isDir","existsSync","mkdir","runners","commonRunnerParams","extensions","length","firefoxDesktopRunnerParams","firefoxBinary","profilePath","firefoxDesktopRunner","params","push","firefoxAndroidRunnerParams","buildSourceDir","extensionSourceDir","tmpArtifactsDir","asNeeded","showReadyMessage","firefoxAndroidRunner","chromiumRunnerParams","chromiumRunner","extensionRunner"],"sources":["../../src/cmd/run.js"],"sourcesContent":["/* @flow */\nimport { fs } from 'mz';\n\nimport defaultBuildExtension from './build.js';\nimport {\n showDesktopNotification as defaultDesktopNotifications,\n} from '../util/desktop-notifier.js';\nimport * as defaultFirefoxApp from '../firefox/index.js';\nimport {\n connectWithMaxRetries as defaultFirefoxClient,\n} 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// Import objects that are only used as Flow types.\nimport type {FirefoxPreferences} from '../firefox/preferences.js';\n\nconst log = createLogger(import.meta.url);\n\n\n// Run command types and implementation.\n\nexport type CmdRunParams = {|\n artifactsDir: string,\n browserConsole: boolean,\n devtools: boolean,\n pref?: FirefoxPreferences,\n firefox: string,\n firefoxProfile?: string,\n profileCreateIfMissing?: boolean,\n ignoreFiles?: Array<string>,\n keepProfileChanges: boolean,\n noInput?: boolean,\n noReload: boolean,\n preInstall: boolean,\n sourceDir: string,\n watchFile?: Array<string>,\n watchIgnored?: Array<string>,\n startUrl?: Array<string>,\n target?: Array<string>,\n args?: Array<string>,\n firefoxPreview: Array<string>,\n\n // Android CLI options.\n adbBin?: string,\n adbHost?: string,\n adbPort?: string,\n adbDevice?: string,\n adbDiscoveryTimeout?: number,\n adbRemoveOldArtifacts?: boolean,\n firefoxApk?: string,\n firefoxApkComponent?: string,\n\n // Chromium Desktop CLI options.\n chromiumBinary?: string,\n chromiumProfile?: string,\n|};\n\nexport type CmdRunOptions = {\n buildExtension: typeof defaultBuildExtension,\n desktopNotifications: typeof defaultDesktopNotifications,\n firefoxApp: typeof defaultFirefoxApp,\n firefoxClient: typeof defaultFirefoxClient,\n reloadStrategy: typeof defaultReloadStrategy,\n shouldExitProgram?: boolean,\n MultiExtensionRunner?: typeof DefaultMultiExtensionRunner,\n getValidatedManifest?: typeof defaultGetValidatedManifest,\n};\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 watchFile,\n watchIgnored,\n startUrl,\n target,\n args,\n firefoxPreview = [],\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 chromiumProfile,\n }: CmdRunParams,\n {\n buildExtension = defaultBuildExtension,\n desktopNotifications = defaultDesktopNotifications,\n firefoxApp = defaultFirefoxApp,\n firefoxClient = defaultFirefoxClient,\n reloadStrategy = defaultReloadStrategy,\n MultiExtensionRunner = DefaultMultiExtensionRunner,\n getValidatedManifest = defaultGetValidatedManifest,\n }: CmdRunOptions = {}): Promise<DefaultMultiExtensionRunner> {\n\n log.info(`Running web extension from ${sourceDir}`);\n if (preInstall) {\n log.info('Disabled auto-reloading because it\\'s not possible with ' +\n '--pre-install');\n noReload = true;\n }\n\n if (watchFile != null && (!Array.isArray(watchFile) ||\n !watchFile.every((el) => typeof el === 'string'))) {\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: FirefoxPreferences = {...pref};\n if (firefoxPreview.includes('mv3')) {\n log.info('Configuring Firefox preferences for Manifest V3');\n customPrefs['extensions.manifestV3.enabled'] = true;\n }\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 = fs.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 desktopNotifications,\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 desktopNotifications: defaultDesktopNotifications,\n buildSourceDir: (extensionSourceDir: string, tmpArtifactsDir: string) => {\n return buildExtension({\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 // Suppress the message usually logged by web-ext build.\n showReadyMessage: false,\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 chromiumBinary,\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 desktopNotifications,\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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"}
package/lib/cmd/sign.js CHANGED
@@ -1,43 +1,51 @@
1
+
1
2
  import path from 'path';
2
3
  import { fs } from 'mz';
3
4
  import { signAddon as defaultAddonSigner } from 'sign-addon';
4
5
  import defaultBuilder from './build.js';
5
- import getValidatedManifest, { getManifestId } from '../util/manifest.js';
6
- import { withTempDir } from '../util/temp-dir.js';
7
6
  import { isErrorWithCode, UsageError, WebExtError } from '../errors.js';
8
7
  import { prepareArtifactsDir } from '../util/artifacts.js';
9
8
  import { createLogger } from '../util/logger.js';
9
+ import getValidatedManifest, { getManifestId } from '../util/manifest.js';
10
+ import { signAddon as defaultSubmitAddonSigner, saveIdToFile } from '../util/submit-addon.js';
11
+ import { withTempDir } from '../util/temp-dir.js';
10
12
  const log = createLogger(import.meta.url);
11
13
  const defaultAsyncFsReadFile = fs.readFile.bind(fs);
12
- export const extensionIdFile = '.web-extension-id'; // Sign command types and implementation.
14
+ export const extensionIdFile = '.web-extension-id';
15
+
16
+ // Sign command types and implementation.
13
17
 
14
18
  export default function sign({
19
+ amoBaseUrl,
15
20
  apiKey,
16
21
  apiProxy,
17
22
  apiSecret,
18
23
  apiUrlPrefix,
24
+ useSubmissionApi = false,
19
25
  artifactsDir,
20
26
  id,
21
27
  ignoreFiles = [],
22
28
  sourceDir,
23
29
  timeout,
24
30
  verbose,
25
- channel
31
+ channel,
32
+ amoMetadata
26
33
  }, {
27
34
  build = defaultBuilder,
28
35
  preValidatedManifest,
29
- signAddon = defaultAddonSigner
36
+ signAddon = defaultAddonSigner,
37
+ submitAddon = defaultSubmitAddonSigner,
38
+ asyncFsReadFile = defaultAsyncFsReadFile
30
39
  } = {}) {
31
40
  return withTempDir(async function (tmpDir) {
32
41
  await prepareArtifactsDir(artifactsDir);
33
42
  let manifestData;
34
-
43
+ const savedIdPath = path.join(sourceDir, extensionIdFile);
35
44
  if (preValidatedManifest) {
36
45
  manifestData = preValidatedManifest;
37
46
  } else {
38
47
  manifestData = await getValidatedManifest(sourceDir);
39
48
  }
40
-
41
49
  const [buildResult, idFromSourceDir] = await Promise.all([build({
42
50
  sourceDir,
43
51
  ignoreFiles,
@@ -45,65 +53,100 @@ export default function sign({
45
53
  }, {
46
54
  manifestData,
47
55
  showReadyMessage: false
48
- }), getIdFromSourceDir(sourceDir)]);
56
+ }), getIdFromFile(savedIdPath)]);
49
57
  const manifestId = getManifestId(manifestData);
50
-
58
+ if (useSubmissionApi && id && !manifestId) {
59
+ throw new UsageError(`Cannot set custom ID ${id} - addon submission API requires a ` + 'custom ID be specified in the manifest');
60
+ }
61
+ if (useSubmissionApi && idFromSourceDir && !manifestId) {
62
+ throw new UsageError('Cannot use previously auto-generated extension ID ' + `${idFromSourceDir} - addon submission API ` + 'requires a custom ID be specified in the manifest');
63
+ }
51
64
  if (id && manifestId) {
52
65
  throw new UsageError(`Cannot set custom ID ${id} because manifest.json ` + `declares ID ${manifestId}`);
53
66
  }
54
-
55
67
  if (id) {
56
68
  log.debug(`Using custom ID declared as --id=${id}`);
57
69
  }
58
-
59
70
  if (manifestId) {
60
71
  id = manifestId;
61
72
  }
62
-
63
73
  if (!id && idFromSourceDir) {
64
74
  log.info(`Using previously auto-generated extension ID: ${idFromSourceDir}`);
65
75
  id = idFromSourceDir;
66
76
  }
67
-
68
77
  if (!id) {
69
78
  log.warn('No extension ID specified (it will be auto-generated)');
70
79
  }
71
-
72
- const signingResult = await signAddon({
80
+ if (useSubmissionApi && !channel) {
81
+ throw new UsageError('channel is a required parameter for the addon submission API');
82
+ }
83
+ if (useSubmissionApi && apiProxy) {
84
+ // https://github.com/mozilla/web-ext/issues/2472
85
+ throw new UsageError("apiProxy isn't yet supported for the addon submission API. " + 'See https://github.com/mozilla/web-ext/issues/2472');
86
+ }
87
+ let metaDataJson;
88
+ if (amoMetadata) {
89
+ const metadataFileBuffer = await asyncFsReadFile(amoMetadata);
90
+ try {
91
+ metaDataJson = JSON.parse(metadataFileBuffer.toString());
92
+ } catch (err) {
93
+ throw new UsageError('Invalid JSON in listing metadata');
94
+ }
95
+ }
96
+ const signSubmitArgs = {
73
97
  apiKey,
74
98
  apiSecret,
75
- apiUrlPrefix,
76
- apiProxy,
77
99
  timeout,
78
- verbose,
79
100
  id,
80
101
  xpiPath: buildResult.extensionPath,
81
- version: manifestData.version,
82
102
  downloadDir: artifactsDir,
83
103
  channel
84
- });
85
-
86
- if (signingResult.id) {
87
- await saveIdToSourceDir(sourceDir, signingResult.id);
88
- } // All information about the downloaded files would have
89
- // already been logged by signAddon().
90
-
91
-
92
- if (signingResult.success) {
93
- log.info(`Extension ID: ${signingResult.id}`);
94
- log.info('SUCCESS');
95
- } else {
104
+ };
105
+ let result;
106
+ try {
107
+ if (useSubmissionApi) {
108
+ result = await submitAddon({
109
+ ...signSubmitArgs,
110
+ amoBaseUrl,
111
+ // $FlowIgnore: we verify 'channel' is set above
112
+ channel,
113
+ savedIdPath,
114
+ metaDataJson
115
+ });
116
+ } else {
117
+ const {
118
+ success,
119
+ id: newId,
120
+ downloadedFiles
121
+ } = await signAddon({
122
+ ...signSubmitArgs,
123
+ apiUrlPrefix,
124
+ apiProxy,
125
+ verbose,
126
+ version: manifestData.version
127
+ });
128
+ if (!success) {
129
+ throw new Error('The extension could not be signed');
130
+ }
131
+ result = {
132
+ id: newId,
133
+ downloadedFiles
134
+ };
135
+ // All information about the downloaded files would have already been
136
+ // logged by signAddon(). submitAddon() calls saveIdToFile itself.
137
+ await saveIdToFile(savedIdPath, newId);
138
+ log.info(`Extension ID: ${newId}`);
139
+ log.info('SUCCESS');
140
+ }
141
+ } catch (clientError) {
96
142
  log.info('FAIL');
97
- throw new WebExtError('The extension could not be signed');
143
+ throw new WebExtError(clientError.message);
98
144
  }
99
-
100
- return signingResult;
145
+ return result;
101
146
  });
102
147
  }
103
- export async function getIdFromSourceDir(sourceDir, asyncFsReadFile = defaultAsyncFsReadFile) {
104
- const filePath = path.join(sourceDir, extensionIdFile);
148
+ export async function getIdFromFile(filePath, asyncFsReadFile = defaultAsyncFsReadFile) {
105
149
  let content;
106
-
107
150
  try {
108
151
  content = await asyncFsReadFile(filePath);
109
152
  } catch (error) {
@@ -111,30 +154,20 @@ export async function getIdFromSourceDir(sourceDir, asyncFsReadFile = defaultAsy
111
154
  log.debug(`No ID file found at: ${filePath}`);
112
155
  return;
113
156
  }
114
-
115
157
  throw error;
116
158
  }
117
-
118
159
  let lines = content.toString().split('\n');
119
160
  lines = lines.filter(line => {
120
161
  line = line.trim();
121
-
122
162
  if (line && !line.startsWith('#')) {
123
163
  return line;
124
164
  }
125
165
  });
126
166
  const id = lines[0];
127
167
  log.debug(`Found extension ID ${id} in ${filePath}`);
128
-
129
168
  if (!id) {
130
169
  throw new UsageError(`No ID found in extension ID file ${filePath}`);
131
170
  }
132
-
133
171
  return id;
134
172
  }
135
- export async function saveIdToSourceDir(sourceDir, id) {
136
- const filePath = path.join(sourceDir, extensionIdFile);
137
- await fs.writeFile(filePath, ['# This file was created by https://github.com/mozilla/web-ext', '# Your auto-generated extension ID for addons.mozilla.org is:', id.toString()].join('\n'));
138
- log.debug(`Saved auto-generated ID ${id} to ${filePath}`);
139
- }
140
173
  //# sourceMappingURL=sign.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sign.js","names":["path","fs","signAddon","defaultAddonSigner","defaultBuilder","getValidatedManifest","getManifestId","withTempDir","isErrorWithCode","UsageError","WebExtError","prepareArtifactsDir","createLogger","log","import","meta","url","defaultAsyncFsReadFile","readFile","bind","extensionIdFile","sign","apiKey","apiProxy","apiSecret","apiUrlPrefix","artifactsDir","id","ignoreFiles","sourceDir","timeout","verbose","channel","build","preValidatedManifest","tmpDir","manifestData","buildResult","idFromSourceDir","Promise","all","showReadyMessage","getIdFromSourceDir","manifestId","debug","info","warn","signingResult","xpiPath","extensionPath","version","downloadDir","saveIdToSourceDir","success","asyncFsReadFile","filePath","join","content","error","lines","toString","split","filter","line","trim","startsWith","writeFile"],"sources":["../../src/cmd/sign.js"],"sourcesContent":["/* @flow */\nimport path from 'path';\n\nimport {fs} from 'mz';\nimport {signAddon as defaultAddonSigner} from 'sign-addon';\n\nimport defaultBuilder from './build.js';\nimport getValidatedManifest, {getManifestId} from '../util/manifest.js';\nimport {withTempDir} from '../util/temp-dir.js';\nimport {isErrorWithCode, UsageError, WebExtError} from '../errors.js';\nimport {prepareArtifactsDir} from '../util/artifacts.js';\nimport {createLogger} from '../util/logger.js';\nimport type {ExtensionManifest} from '../util/manifest.js';\n\nconst log = createLogger(import.meta.url);\n\nconst defaultAsyncFsReadFile: (string) => Promise<Buffer> =\n fs.readFile.bind(fs);\n\nexport const extensionIdFile = '.web-extension-id';\n\n// Sign command types and implementation.\n\nexport type SignParams = {|\n apiKey: string,\n apiProxy: string,\n apiSecret: string,\n apiUrlPrefix: string,\n artifactsDir: string,\n id?: string,\n ignoreFiles?: Array<string>,\n sourceDir: string,\n timeout: number,\n verbose?: boolean,\n channel?: string,\n|};\n\nexport type SignOptions = {\n build?: typeof defaultBuilder,\n signAddon?: typeof defaultAddonSigner,\n preValidatedManifest?: ExtensionManifest,\n shouldExitProgram?: boolean,\n};\n\nexport type SignResult = {|\n success: boolean,\n id: string,\n downloadedFiles: Array<string>,\n|};\n\nexport default function sign(\n {\n apiKey,\n apiProxy,\n apiSecret,\n apiUrlPrefix,\n artifactsDir,\n id,\n ignoreFiles = [],\n sourceDir,\n timeout,\n verbose,\n channel,\n }: SignParams,\n {\n build = defaultBuilder,\n preValidatedManifest,\n signAddon = defaultAddonSigner,\n }: SignOptions = {}\n): Promise<SignResult> {\n return withTempDir(\n async function(tmpDir) {\n await prepareArtifactsDir(artifactsDir);\n\n let manifestData;\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({sourceDir, ignoreFiles, artifactsDir: tmpDir.path()},\n {manifestData, showReadyMessage: false}),\n getIdFromSourceDir(sourceDir),\n ]);\n\n const manifestId = getManifestId(manifestData);\n\n if (id && manifestId) {\n throw new UsageError(\n `Cannot set custom ID ${id} because manifest.json ` +\n `declares ID ${manifestId}`);\n }\n if (id) {\n log.debug(`Using custom ID declared as --id=${id}`);\n }\n\n if (manifestId) {\n id = manifestId;\n }\n\n if (!id && idFromSourceDir) {\n log.info(\n `Using previously auto-generated extension ID: ${idFromSourceDir}`);\n id = idFromSourceDir;\n }\n\n if (!id) {\n log.warn('No extension ID specified (it will be auto-generated)');\n }\n\n const signingResult = await signAddon({\n apiKey,\n apiSecret,\n apiUrlPrefix,\n apiProxy,\n timeout,\n verbose,\n id,\n xpiPath: buildResult.extensionPath,\n version: manifestData.version,\n downloadDir: artifactsDir,\n channel,\n });\n\n if (signingResult.id) {\n await saveIdToSourceDir(sourceDir, signingResult.id);\n }\n\n // All information about the downloaded files would have\n // already been logged by signAddon().\n if (signingResult.success) {\n log.info(`Extension ID: ${signingResult.id}`);\n log.info('SUCCESS');\n } else {\n log.info('FAIL');\n throw new WebExtError(\n 'The extension could not be signed');\n }\n\n return signingResult;\n }\n );\n}\n\n\nexport async function getIdFromSourceDir(\n sourceDir: string,\n asyncFsReadFile: typeof defaultAsyncFsReadFile = defaultAsyncFsReadFile,\n): Promise<string | void> {\n const filePath = path.join(sourceDir, extensionIdFile);\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\n\nexport async function saveIdToSourceDir(\n sourceDir: string, id: string\n): Promise<void> {\n const filePath = path.join(sourceDir, extensionIdFile);\n await fs.writeFile(filePath, [\n '# This file was created by https://github.com/mozilla/web-ext',\n '# Your auto-generated extension ID for addons.mozilla.org is:',\n id.toString(),\n ].join('\\n'));\n\n log.debug(`Saved auto-generated ID ${id} to ${filePath}`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sign.js","names":["path","fs","signAddon","defaultAddonSigner","defaultBuilder","isErrorWithCode","UsageError","WebExtError","prepareArtifactsDir","createLogger","getValidatedManifest","getManifestId","defaultSubmitAddonSigner","saveIdToFile","withTempDir","log","import","meta","url","defaultAsyncFsReadFile","readFile","bind","extensionIdFile","sign","amoBaseUrl","apiKey","apiProxy","apiSecret","apiUrlPrefix","useSubmissionApi","artifactsDir","id","ignoreFiles","sourceDir","timeout","verbose","channel","amoMetadata","build","preValidatedManifest","submitAddon","asyncFsReadFile","tmpDir","manifestData","savedIdPath","join","buildResult","idFromSourceDir","Promise","all","showReadyMessage","getIdFromFile","manifestId","debug","info","warn","metaDataJson","metadataFileBuffer","JSON","parse","toString","err","signSubmitArgs","xpiPath","extensionPath","downloadDir","result","success","newId","downloadedFiles","version","Error","clientError","message","filePath","content","error","lines","split","filter","line","trim","startsWith"],"sources":["../../src/cmd/sign.js"],"sourcesContent":["/* @flow */\nimport path from 'path';\n\nimport {fs} from 'mz';\nimport {signAddon as defaultAddonSigner} from 'sign-addon';\n\nimport defaultBuilder from './build.js';\nimport {isErrorWithCode, UsageError, WebExtError} from '../errors.js';\nimport {prepareArtifactsDir} from '../util/artifacts.js';\nimport {createLogger} from '../util/logger.js';\nimport getValidatedManifest, {getManifestId} from '../util/manifest.js';\nimport type {ExtensionManifest} from '../util/manifest.js';\nimport {\n signAddon as defaultSubmitAddonSigner,\n saveIdToFile,\n} from '../util/submit-addon.js';\nimport type { SignResult } from '../util/submit-addon.js';\nimport {withTempDir} from '../util/temp-dir.js';\n\nexport type { SignResult };\n\nconst log = createLogger(import.meta.url);\n\nconst defaultAsyncFsReadFile: (string) => Promise<Buffer> =\n fs.readFile.bind(fs);\n\nexport const extensionIdFile = '.web-extension-id';\n\n// Sign command types and implementation.\n\nexport type SignParams = {|\n amoBaseUrl: string,\n apiKey: string,\n apiProxy?: string,\n apiSecret: string,\n apiUrlPrefix: string,\n useSubmissionApi?: boolean,\n artifactsDir: string,\n id?: string,\n ignoreFiles?: Array<string>,\n sourceDir: string,\n timeout: number,\n verbose?: boolean,\n channel?: string,\n amoMetadata?: string,\n|};\n\nexport type SignOptions = {\n build?: typeof defaultBuilder,\n signAddon?: typeof defaultAddonSigner,\n submitAddon?: typeof defaultSubmitAddonSigner,\n preValidatedManifest?: ExtensionManifest,\n shouldExitProgram?: boolean,\n asyncFsReadFile?: typeof defaultAsyncFsReadFile,\n};\n\nexport default function sign(\n {\n amoBaseUrl,\n apiKey,\n apiProxy,\n apiSecret,\n apiUrlPrefix,\n useSubmissionApi = false,\n artifactsDir,\n id,\n ignoreFiles = [],\n sourceDir,\n timeout,\n verbose,\n channel,\n amoMetadata,\n }: SignParams,\n {\n build = defaultBuilder,\n preValidatedManifest,\n signAddon = defaultAddonSigner,\n submitAddon = defaultSubmitAddonSigner,\n asyncFsReadFile = defaultAsyncFsReadFile,\n }: SignOptions = {}\n): Promise<SignResult> {\n return withTempDir(\n async function(tmpDir) {\n await prepareArtifactsDir(artifactsDir);\n\n let manifestData;\n const savedIdPath = path.join(sourceDir, extensionIdFile);\n\n if (preValidatedManifest) {\n manifestData = preValidatedManifest;\n } else {\n manifestData = await getValidatedManifest(sourceDir);\n }\n\n const [buildResult, idFromSourceDir] = await Promise.all([\n build({sourceDir, ignoreFiles, artifactsDir: tmpDir.path()},\n {manifestData, showReadyMessage: false}),\n getIdFromFile(savedIdPath),\n ]);\n\n const manifestId = getManifestId(manifestData);\n\n if (useSubmissionApi && id && !manifestId) {\n throw new UsageError(\n `Cannot set custom ID ${id} - addon submission API requires a ` +\n 'custom ID be specified in the manifest'\n );\n }\n if (useSubmissionApi && idFromSourceDir && !manifestId) {\n throw new UsageError(\n 'Cannot use previously auto-generated extension ID ' +\n `${idFromSourceDir} - addon submission API ` +\n 'requires a custom ID be specified in the manifest'\n );\n }\n if (id && manifestId) {\n throw new UsageError(\n `Cannot set custom ID ${id} because manifest.json ` +\n `declares ID ${manifestId}`);\n }\n if (id) {\n log.debug(`Using custom ID declared as --id=${id}`);\n }\n\n if (manifestId) {\n id = manifestId;\n }\n\n if (!id && idFromSourceDir) {\n log.info(\n `Using previously auto-generated extension ID: ${idFromSourceDir}`);\n id = idFromSourceDir;\n }\n\n if (!id) {\n log.warn('No extension ID specified (it will be auto-generated)');\n }\n\n if (useSubmissionApi && !channel) {\n throw new UsageError(\n 'channel is a required parameter for the addon submission API'\n );\n }\n\n if (useSubmissionApi && apiProxy) {\n // https://github.com/mozilla/web-ext/issues/2472\n throw new UsageError(\n \"apiProxy isn't yet supported for the addon submission API. \" +\n 'See https://github.com/mozilla/web-ext/issues/2472'\n );\n }\n\n let metaDataJson;\n if (amoMetadata) {\n const metadataFileBuffer = await asyncFsReadFile(amoMetadata);\n try {\n metaDataJson = JSON.parse(metadataFileBuffer.toString());\n } catch (err) {\n throw new UsageError('Invalid JSON in listing metadata');\n }\n }\n\n const signSubmitArgs = {\n apiKey,\n apiSecret,\n timeout,\n id,\n xpiPath: buildResult.extensionPath,\n downloadDir: artifactsDir,\n channel,\n };\n\n let result;\n try {\n if (useSubmissionApi) {\n result = await submitAddon({\n ...signSubmitArgs,\n amoBaseUrl,\n // $FlowIgnore: we verify 'channel' is set above\n channel,\n savedIdPath,\n metaDataJson,\n });\n } else {\n const { success, id: newId, downloadedFiles } = await signAddon({\n ...signSubmitArgs,\n apiUrlPrefix,\n apiProxy,\n verbose,\n version: manifestData.version,\n });\n if (!success) {\n throw new Error('The extension could not be signed');\n }\n result = { id: newId, downloadedFiles };\n // All information about the downloaded files would have already been\n // logged by signAddon(). submitAddon() calls saveIdToFile itself.\n await saveIdToFile(savedIdPath, newId);\n log.info(`Extension ID: ${newId}`);\n log.info('SUCCESS');\n }\n } catch (clientError) {\n log.info('FAIL');\n throw new WebExtError(clientError.message);\n }\n\n return result;\n });\n}\n\n\nexport async function getIdFromFile(\n filePath: string,\n asyncFsReadFile: typeof defaultAsyncFsReadFile = defaultAsyncFsReadFile,\n): Promise<string | void> {\n let content;\n\n try {\n content = await asyncFsReadFile(filePath);\n } catch (error) {\n if (isErrorWithCode('ENOENT', error)) {\n log.debug(`No ID file found at: ${filePath}`);\n return;\n }\n throw error;\n }\n\n let lines = content.toString().split('\\n');\n lines = lines.filter((line) => {\n line = line.trim();\n if (line && !line.startsWith('#')) {\n return line;\n }\n });\n\n const id = lines[0];\n log.debug(`Found extension ID ${id} in ${filePath}`);\n\n if (!id) {\n throw new UsageError(`No ID found in extension ID file ${filePath}`);\n }\n\n return id;\n}\n"],"mappings":"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"}
package/lib/config.js CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  import os from 'os';
2
3
  import path from 'path';
3
4
  import importFresh from 'import-fresh';
@@ -14,16 +15,16 @@ export function applyConfigToArgv({
14
15
  options,
15
16
  configFileName
16
17
  }) {
17
- let newArgv = { ...argv
18
+ let newArgv = {
19
+ ...argv
18
20
  };
19
-
20
21
  for (const option of Object.keys(configObject)) {
21
22
  if (camelCase(option) !== option) {
22
23
  throw new UsageError(`The config option "${option}" must be ` + `specified in camel case: "${camelCase(option)}"`);
23
- } // A config option cannot be a sub-command config
24
- // object if it is an array.
25
-
24
+ }
26
25
 
26
+ // A config option cannot be a sub-command config
27
+ // object if it is an array.
27
28
  if (!Array.isArray(configObject[option]) && typeof options[option] === 'object' && typeof configObject[option] === 'object') {
28
29
  // Descend into the nested configuration for a sub-command.
29
30
  newArgv = applyConfigToArgv({
@@ -35,97 +36,85 @@ export function applyConfigToArgv({
35
36
  });
36
37
  continue;
37
38
  }
38
-
39
39
  const decamelizedOptName = decamelize(option, {
40
40
  separator: '-'
41
41
  });
42
-
43
42
  if (typeof options[decamelizedOptName] !== 'object') {
44
43
  throw new UsageError(`The config file at ${configFileName} specified ` + `an unknown option: "${option}"`);
45
44
  }
46
-
47
45
  if (options[decamelizedOptName].type === undefined) {
48
46
  // This means yargs option type wasn't not defined correctly
49
47
  throw new WebExtError(`Option: ${option} was defined without a type.`);
50
48
  }
51
-
52
49
  const expectedType = options[decamelizedOptName].type === 'count' ? 'number' : options[decamelizedOptName].type;
53
50
  const optionType = Array.isArray(configObject[option]) ? 'array' : typeof configObject[option];
54
-
55
51
  if (optionType !== expectedType) {
56
52
  throw new UsageError(`The config file at ${configFileName} specified ` + `the type of "${option}" incorrectly as "${optionType}"` + ` (expected type "${expectedType}")`);
57
53
  }
58
-
59
54
  let defaultValue;
60
-
61
55
  if (options[decamelizedOptName]) {
62
56
  if (options[decamelizedOptName].default !== undefined) {
63
57
  defaultValue = options[decamelizedOptName].default;
64
58
  } else if (expectedType === 'boolean') {
65
59
  defaultValue = false;
66
60
  }
67
- } // This is our best effort (without patching yargs) to detect
61
+ }
62
+
63
+ // This is our best effort (without patching yargs) to detect
68
64
  // if a value was set on the CLI instead of in the config.
69
65
  // It looks for a default value and if the argv value is
70
66
  // different, it assumes that the value was configured on the CLI.
71
67
 
72
-
73
68
  const wasValueSetOnCLI = typeof argvFromCLI[option] !== 'undefined' && argvFromCLI[option] !== defaultValue;
74
-
75
69
  if (wasValueSetOnCLI) {
76
70
  log.debug(`Favoring CLI: ${option}=${argvFromCLI[option]} over ` + `configuration: ${option}=${configObject[option]}`);
77
71
  newArgv[option] = argvFromCLI[option];
78
72
  continue;
79
73
  }
80
-
81
74
  newArgv[option] = configObject[option];
82
75
  const coerce = options[decamelizedOptName].coerce;
83
-
84
76
  if (coerce) {
85
77
  log.debug(`Calling coerce() on configured value for ${option}`);
86
78
  newArgv[option] = coerce(newArgv[option]);
87
79
  }
88
-
89
80
  newArgv[decamelizedOptName] = newArgv[option];
90
81
  }
91
-
92
82
  return newArgv;
93
83
  }
94
84
  export function loadJSConfigFile(filePath) {
95
85
  const resolvedFilePath = path.resolve(filePath);
96
86
  log.debug(`Loading JS config file: "${filePath}" ` + `(resolved to "${resolvedFilePath}")`);
97
87
  let configObject;
98
-
99
88
  try {
100
89
  configObject = importFresh(resolvedFilePath);
101
90
  } catch (error) {
102
91
  log.debug('Handling error:', error);
103
92
  throw new UsageError(`Cannot read config file: ${resolvedFilePath}\n` + `Error: ${error.message}`);
104
93
  }
105
-
106
94
  if (filePath.endsWith('package.json')) {
107
95
  log.debug('Looking for webExt key inside package.json file');
108
96
  configObject = configObject.webExt || {};
109
97
  }
110
-
111
98
  if (Object.keys(configObject).length === 0) {
112
99
  log.debug(`Config file ${resolvedFilePath} did not define any options. ` + 'Did you set module.exports = {...}?');
113
100
  }
114
-
115
101
  return configObject;
116
102
  }
117
103
  export async function discoverConfigFiles({
118
104
  getHomeDir = os.homedir
119
105
  } = {}) {
120
- const magicConfigName = 'web-ext-config.js'; // Config files will be loaded in this order.
121
-
122
- const possibleConfigs = [// Look for a magic hidden config (preceded by dot) in home dir.
123
- path.join(getHomeDir(), `.${magicConfigName}`), // Look for webExt key inside package.json file
124
- path.join(process.cwd(), 'package.json'), // Look for a magic config in the current working directory.
106
+ const magicConfigName = 'web-ext-config.js';
107
+
108
+ // Config files will be loaded in this order.
109
+ const possibleConfigs = [
110
+ // Look for a magic hidden config (preceded by dot) in home dir.
111
+ path.join(getHomeDir(), `.${magicConfigName}`),
112
+ // Look for webExt key inside package.json file
113
+ path.join(process.cwd(), 'package.json'),
114
+ // Look for a magic config in the current working directory.
125
115
  path.join(process.cwd(), magicConfigName)];
126
116
  const configs = await Promise.all(possibleConfigs.map(async fileName => {
127
117
  const resolvedFileName = path.resolve(fileName);
128
-
129
118
  if (await fileExists(resolvedFileName)) {
130
119
  return resolvedFileName;
131
120
  } else {
package/lib/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":["os","path","importFresh","camelCase","decamelize","fileExists","createLogger","UsageError","WebExtError","log","import","meta","url","applyConfigToArgv","argv","argvFromCLI","configObject","options","configFileName","newArgv","option","Object","keys","Array","isArray","decamelizedOptName","separator","type","undefined","expectedType","optionType","defaultValue","default","wasValueSetOnCLI","debug","coerce","loadJSConfigFile","filePath","resolvedFilePath","resolve","error","message","endsWith","webExt","length","discoverConfigFiles","getHomeDir","homedir","magicConfigName","possibleConfigs","join","process","cwd","configs","Promise","all","map","fileName","resolvedFileName","existingConfigs","forEach","f","push"],"sources":["../src/config.js"],"sourcesContent":["/* @flow */\nimport os from 'os';\nimport path from 'path';\n\nimport importFresh from 'import-fresh';\nimport camelCase from 'camelcase';\nimport decamelize from 'decamelize';\n\nimport fileExists from './util/file-exists.js';\nimport {createLogger} from './util/logger.js';\nimport {UsageError, WebExtError} from './errors.js';\n\nconst log = createLogger(import.meta.url);\n\ntype ApplyConfigToArgvParams = {|\n // This is the argv object which will get updated by each\n // config applied.\n argv: Object,\n // This is the argv that only has CLI values applied to it.\n argvFromCLI: Object,\n configObject: Object,\n options: Object,\n configFileName: string,\n|};\n\nexport function applyConfigToArgv({\n argv,\n argvFromCLI,\n configObject,\n options,\n configFileName,\n}: ApplyConfigToArgvParams): Object {\n let newArgv = {...argv};\n\n for (const option of Object.keys(configObject)) {\n if (camelCase(option) !== option) {\n throw new UsageError(\n `The config option \"${option}\" must be ` +\n `specified in camel case: \"${camelCase(option)}\"`);\n }\n\n // A config option cannot be a sub-command config\n // object if it is an array.\n if (!Array.isArray(configObject[option]) &&\n typeof options[option] === 'object' &&\n typeof configObject[option] === 'object') {\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 continue;\n }\n\n const decamelizedOptName = decamelize(option, {separator: '-'});\n\n if (typeof options[decamelizedOptName] !== 'object') {\n throw new UsageError(`The config file at ${configFileName} specified ` +\n `an unknown option: \"${option}\"`);\n }\n if (options[decamelizedOptName].type === undefined) {\n // This means yargs option type wasn't not defined correctly\n throw new WebExtError(\n `Option: ${option} was defined without a type.`);\n }\n\n const expectedType = options[decamelizedOptName].type ===\n 'count' ? 'number' : options[decamelizedOptName].type;\n\n const optionType = (\n Array.isArray(configObject[option]) ?\n 'array' : typeof configObject[option]\n );\n\n if (optionType !== expectedType) {\n throw new UsageError(`The config file at ${configFileName} specified ` +\n `the type of \"${option}\" incorrectly as \"${optionType}\"` +\n ` (expected type \"${expectedType}\")`);\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 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(\n `Calling coerce() on configured value for ${option}`);\n newArgv[option] = coerce(newArgv[option]);\n }\n\n newArgv[decamelizedOptName] = newArgv[option];\n }\n return newArgv;\n}\n\nexport function loadJSConfigFile(filePath: string): Object {\n const resolvedFilePath = path.resolve(filePath);\n log.debug(\n `Loading JS config file: \"${filePath}\" ` +\n `(resolved to \"${resolvedFilePath}\")`);\n let configObject;\n try {\n configObject = importFresh(resolvedFilePath);\n } catch (error) {\n log.debug('Handling error:', error);\n throw new UsageError(\n `Cannot read config file: ${resolvedFilePath}\\n` +\n `Error: ${error.message}`);\n }\n if (filePath.endsWith('package.json')) {\n log.debug('Looking for webExt key inside package.json file');\n configObject = configObject.webExt || {};\n }\n if (Object.keys(configObject).length === 0) {\n log.debug(`Config file ${resolvedFilePath} did not define any options. ` +\n 'Did you set module.exports = {...}?');\n }\n return configObject;\n}\n\ntype DiscoverConfigFilesParams = {\n getHomeDir: () => string,\n};\n\nexport async function discoverConfigFiles(\n {getHomeDir = os.homedir}: DiscoverConfigFilesParams = {}\n): Promise<Array<string>> {\n const magicConfigName = 'web-ext-config.js';\n\n // Config files will be loaded in this order.\n const possibleConfigs = [\n // Look for a magic hidden config (preceded by dot) in home dir.\n path.join(getHomeDir(), `.${magicConfigName}`),\n // Look for webExt key inside package.json file\n path.join(process.cwd(), 'package.json'),\n // Look for a magic config in the current working directory.\n path.join(process.cwd(), magicConfigName),\n ];\n\n const configs = await Promise.all(possibleConfigs.map(\n 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 return undefined;\n }\n }\n ));\n\n const existingConfigs = [];\n configs.forEach((f) => {\n if (typeof f === 'string') {\n existingConfigs.push(f);\n }\n });\n return existingConfigs;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","names":["os","path","importFresh","camelCase","decamelize","fileExists","createLogger","UsageError","WebExtError","log","import","meta","url","applyConfigToArgv","argv","argvFromCLI","configObject","options","configFileName","newArgv","option","Object","keys","Array","isArray","decamelizedOptName","separator","type","undefined","expectedType","optionType","defaultValue","default","wasValueSetOnCLI","debug","coerce","loadJSConfigFile","filePath","resolvedFilePath","resolve","error","message","endsWith","webExt","length","discoverConfigFiles","getHomeDir","homedir","magicConfigName","possibleConfigs","join","process","cwd","configs","Promise","all","map","fileName","resolvedFileName","existingConfigs","forEach","f","push"],"sources":["../src/config.js"],"sourcesContent":["/* @flow */\nimport os from 'os';\nimport path from 'path';\n\nimport importFresh from 'import-fresh';\nimport camelCase from 'camelcase';\nimport decamelize from 'decamelize';\n\nimport fileExists from './util/file-exists.js';\nimport {createLogger} from './util/logger.js';\nimport {UsageError, WebExtError} from './errors.js';\n\nconst log = createLogger(import.meta.url);\n\ntype ApplyConfigToArgvParams = {|\n // This is the argv object which will get updated by each\n // config applied.\n argv: Object,\n // This is the argv that only has CLI values applied to it.\n argvFromCLI: Object,\n configObject: Object,\n options: Object,\n configFileName: string,\n|};\n\nexport function applyConfigToArgv({\n argv,\n argvFromCLI,\n configObject,\n options,\n configFileName,\n}: ApplyConfigToArgvParams): Object {\n let newArgv = {...argv};\n\n for (const option of Object.keys(configObject)) {\n if (camelCase(option) !== option) {\n throw new UsageError(\n `The config option \"${option}\" must be ` +\n `specified in camel case: \"${camelCase(option)}\"`);\n }\n\n // A config option cannot be a sub-command config\n // object if it is an array.\n if (!Array.isArray(configObject[option]) &&\n typeof options[option] === 'object' &&\n typeof configObject[option] === 'object') {\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 continue;\n }\n\n const decamelizedOptName = decamelize(option, {separator: '-'});\n\n if (typeof options[decamelizedOptName] !== 'object') {\n throw new UsageError(`The config file at ${configFileName} specified ` +\n `an unknown option: \"${option}\"`);\n }\n if (options[decamelizedOptName].type === undefined) {\n // This means yargs option type wasn't not defined correctly\n throw new WebExtError(\n `Option: ${option} was defined without a type.`);\n }\n\n const expectedType = options[decamelizedOptName].type ===\n 'count' ? 'number' : options[decamelizedOptName].type;\n\n const optionType = (\n Array.isArray(configObject[option]) ?\n 'array' : typeof configObject[option]\n );\n\n if (optionType !== expectedType) {\n throw new UsageError(`The config file at ${configFileName} specified ` +\n `the type of \"${option}\" incorrectly as \"${optionType}\"` +\n ` (expected type \"${expectedType}\")`);\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 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(\n `Calling coerce() on configured value for ${option}`);\n newArgv[option] = coerce(newArgv[option]);\n }\n\n newArgv[decamelizedOptName] = newArgv[option];\n }\n return newArgv;\n}\n\nexport function loadJSConfigFile(filePath: string): Object {\n const resolvedFilePath = path.resolve(filePath);\n log.debug(\n `Loading JS config file: \"${filePath}\" ` +\n `(resolved to \"${resolvedFilePath}\")`);\n let configObject;\n try {\n configObject = importFresh(resolvedFilePath);\n } catch (error) {\n log.debug('Handling error:', error);\n throw new UsageError(\n `Cannot read config file: ${resolvedFilePath}\\n` +\n `Error: ${error.message}`);\n }\n if (filePath.endsWith('package.json')) {\n log.debug('Looking for webExt key inside package.json file');\n configObject = configObject.webExt || {};\n }\n if (Object.keys(configObject).length === 0) {\n log.debug(`Config file ${resolvedFilePath} did not define any options. ` +\n 'Did you set module.exports = {...}?');\n }\n return configObject;\n}\n\ntype DiscoverConfigFilesParams = {\n getHomeDir: () => string,\n};\n\nexport async function discoverConfigFiles(\n {getHomeDir = os.homedir}: DiscoverConfigFilesParams = {}\n): Promise<Array<string>> {\n const magicConfigName = 'web-ext-config.js';\n\n // Config files will be loaded in this order.\n const possibleConfigs = [\n // Look for a magic hidden config (preceded by dot) in home dir.\n path.join(getHomeDir(), `.${magicConfigName}`),\n // Look for webExt key inside package.json file\n path.join(process.cwd(), 'package.json'),\n // Look for a magic config in the current working directory.\n path.join(process.cwd(), magicConfigName),\n ];\n\n const configs = await Promise.all(possibleConfigs.map(\n 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 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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"}