web-ext 7.11.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -8
- package/bin/web-ext.js +1 -1
- package/lib/cmd/build.js +1 -3
- package/lib/cmd/build.js.map +1 -1
- package/lib/cmd/docs.js +1 -0
- package/lib/cmd/docs.js.map +1 -1
- package/lib/cmd/dump-config.js +6 -0
- package/lib/cmd/dump-config.js.map +1 -0
- package/lib/cmd/index.js +16 -8
- package/lib/cmd/index.js.map +1 -1
- package/lib/cmd/lint.js +0 -8
- package/lib/cmd/lint.js.map +1 -1
- package/lib/cmd/run.js +0 -7
- package/lib/cmd/run.js.map +1 -1
- package/lib/cmd/sign.js +29 -85
- package/lib/cmd/sign.js.map +1 -1
- package/lib/config.js +53 -7
- package/lib/config.js.map +1 -1
- package/lib/errors.js.map +1 -1
- package/lib/extension-runners/chromium.js +11 -3
- package/lib/extension-runners/chromium.js.map +1 -1
- package/lib/extension-runners/firefox-android.js +15 -3
- package/lib/extension-runners/firefox-android.js.map +1 -1
- package/lib/extension-runners/firefox-desktop.js +7 -8
- package/lib/extension-runners/firefox-desktop.js.map +1 -1
- package/lib/extension-runners/index.js +2 -2
- package/lib/extension-runners/index.js.map +1 -1
- package/lib/firefox/index.js +1 -8
- package/lib/firefox/index.js.map +1 -1
- package/lib/firefox/package-identifiers.js +3 -1
- package/lib/firefox/package-identifiers.js.map +1 -1
- package/lib/firefox/preferences.js +0 -2
- package/lib/firefox/preferences.js.map +1 -1
- package/lib/firefox/rdp-client.js +10 -2
- package/lib/firefox/rdp-client.js.map +1 -1
- package/lib/firefox/remote.js +3 -2
- package/lib/firefox/remote.js.map +1 -1
- package/lib/main.js.map +1 -1
- package/lib/program.js +25 -48
- package/lib/program.js.map +1 -1
- package/lib/util/adb.js +26 -10
- package/lib/util/adb.js.map +1 -1
- package/lib/util/artifacts.js.map +1 -1
- package/lib/util/desktop-notifier.js.map +1 -1
- package/lib/util/file-exists.js +1 -0
- package/lib/util/file-exists.js.map +1 -1
- package/lib/util/file-filter.js +2 -0
- package/lib/util/file-filter.js.map +1 -1
- package/lib/util/is-directory.js.map +1 -1
- package/lib/util/logger.js +5 -5
- package/lib/util/logger.js.map +1 -1
- package/lib/util/manifest.js +1 -1
- package/lib/util/manifest.js.map +1 -1
- package/lib/util/promisify.js +0 -7
- package/lib/util/promisify.js.map +1 -1
- package/lib/util/stdin.js +0 -2
- package/lib/util/stdin.js.map +1 -1
- package/lib/util/submit-addon.js +214 -50
- package/lib/util/submit-addon.js.map +1 -1
- package/lib/util/temp-dir.js +2 -0
- package/lib/util/temp-dir.js.map +1 -1
- package/lib/util/updates.js.map +1 -1
- package/lib/watcher.js.map +1 -1
- package/package.json +38 -40
- package/lib/extension-runners/base.js +0 -2
- package/lib/extension-runners/base.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,8 +5,6 @@ This is a command line tool to help build, run, and test
|
|
|
5
5
|
|
|
6
6
|
[](https://circleci.com/gh/mozilla/web-ext)
|
|
7
7
|
[](https://codecov.io/gh/mozilla/web-ext)
|
|
8
|
-
[](https://david-dm.org/mozilla/web-ext)
|
|
9
|
-
[](https://david-dm.org/mozilla/web-ext#info=devDependencies)
|
|
10
8
|
[](https://badge.fury.io/js/web-ext)
|
|
11
9
|
|
|
12
10
|
Ultimately, it aims to support browser extensions in a standard, portable,
|
|
@@ -16,7 +14,7 @@ cross-platform way. Initially, it will provide a streamlined experience for deve
|
|
|
16
14
|
## Documentation
|
|
17
15
|
|
|
18
16
|
- [Getting started with web-ext][web-ext-user-docs]
|
|
19
|
-
- [Command reference](https://extensionworkshop.com/documentation/develop/web-ext-command-reference)
|
|
17
|
+
- [Command reference](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/)
|
|
20
18
|
|
|
21
19
|
Here are the commands you can run. Click on each one for detailed documentation or use `--help` on the command line, such as `web-ext build --help`.
|
|
22
20
|
|
|
@@ -76,8 +74,8 @@ version on the command line with this:
|
|
|
76
74
|
|
|
77
75
|
You'll need:
|
|
78
76
|
|
|
79
|
-
- [Node.js](https://nodejs.org/en/)
|
|
80
|
-
- [npm](https://www.npmjs.com/),
|
|
77
|
+
- [Node.js](https://nodejs.org/en/) (current [LTS](https://github.com/nodejs/LTS))
|
|
78
|
+
- [npm](https://www.npmjs.com/), 8.0.0 or higher is recommended
|
|
81
79
|
|
|
82
80
|
Optionally, you may like:
|
|
83
81
|
|
|
@@ -141,7 +139,7 @@ webExt.cmd
|
|
|
141
139
|
// You need to specify this one so that your NodeJS application
|
|
142
140
|
// can continue running after web-ext is finished.
|
|
143
141
|
shouldExitProgram: false,
|
|
144
|
-
}
|
|
142
|
+
},
|
|
145
143
|
)
|
|
146
144
|
.then((extensionRunner) => {
|
|
147
145
|
// The command has finished. Each command resolves its
|
|
@@ -203,7 +201,7 @@ webExt.cmd.run(
|
|
|
203
201
|
version: '1.0.0',
|
|
204
202
|
}),
|
|
205
203
|
shouldExitProgram: false,
|
|
206
|
-
}
|
|
204
|
+
},
|
|
207
205
|
);
|
|
208
206
|
```
|
|
209
207
|
|
|
@@ -237,7 +235,7 @@ Here is a partial list of examples:
|
|
|
237
235
|
- Integrating with services.
|
|
238
236
|
- Mozilla offers some useful services such as
|
|
239
237
|
[linting](https://github.com/mozilla/addons-linter) and
|
|
240
|
-
[signing](https://addons-server.readthedocs.io/en/latest/topics/api/signing.html)
|
|
238
|
+
[signing](https://addons-server.readthedocs.io/en/latest/topics/api/v4_frozen/signing.html)
|
|
241
239
|
extensions.
|
|
242
240
|
|
|
243
241
|
[web-ext-user-docs]: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_started_with_web-ext
|
package/bin/web-ext.js
CHANGED
package/lib/cmd/build.js
CHANGED
|
@@ -10,9 +10,7 @@ import getValidatedManifest, { getManifestId } from '../util/manifest.js';
|
|
|
10
10
|
import { prepareArtifactsDir } from '../util/artifacts.js';
|
|
11
11
|
import { createLogger } from '../util/logger.js';
|
|
12
12
|
import { UsageError, isErrorWithCode } from '../errors.js';
|
|
13
|
-
import { createFileFilter as defaultFileFilterCreator
|
|
14
|
-
// Import flow types.
|
|
15
|
-
|
|
13
|
+
import { createFileFilter as defaultFileFilterCreator } from '../util/file-filter.js';
|
|
16
14
|
const log = createLogger(import.meta.url);
|
|
17
15
|
const DEFAULT_FILENAME_TEMPLATE = '{name}-{version}.zip';
|
|
18
16
|
export function safeFileName(name) {
|
package/lib/cmd/build.js.map
CHANGED
|
@@ -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","FileFilter","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":["/* @flow */\nimport path from 'path';\nimport { createWriteStream } from 'fs';\n\nimport { fs } from 'mz';\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 {\n createFileFilter as defaultFileFilterCreator,\n FileFilter,\n} from '../util/file-filter.js';\n// Import flow types.\nimport type { OnSourceChangeFn } from '../watcher.js';\nimport type { ExtensionManifest } from '../util/manifest.js';\nimport type { FileFilterCreatorFn } from '../util/file-filter.js';\n\nconst log = createLogger(import.meta.url);\nconst DEFAULT_FILENAME_TEMPLATE = '{name}-{version}.zip';\n\nexport function safeFileName(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9.-]+/g, '_');\n}\n\n// defaultPackageCreator types and implementation.\n\nexport type ExtensionBuildResult = {|\n extensionPath: string,\n|};\n\nexport type PackageCreatorParams = {|\n manifestData?: ExtensionManifest,\n sourceDir: string,\n fileFilter: FileFilter,\n artifactsDir: string,\n overwriteDest: boolean,\n showReadyMessage: boolean,\n filename?: string,\n|};\n\nexport type LocalizedNameParams = {|\n messageFile: string,\n manifestData: ExtensionManifest,\n|};\n\nexport type PackageCreatorOptions = {\n fromEvent: typeof defaultFromEvent,\n};\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\ntype LocalizedMessageData = {|\n [messageName: string]: {|\n description: string,\n message: string,\n |},\n|};\n\nexport async function getDefaultLocalizedName({\n messageFile,\n manifestData,\n}: LocalizedNameParams): Promise<string> {\n let messageData: LocalizedMessageData;\n let messageContents: string | Buffer;\n let extensionName: string = 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: string, obj: Object): string {\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(\n filenameTemplate: string,\n manifestData: ExtensionManifest\n): string {\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 type PackageCreatorFn = (\n params: PackageCreatorParams\n) => Promise<ExtensionBuildResult>;\n\nexport async function defaultPackageCreator(\n {\n manifestData,\n sourceDir,\n fileFilter,\n artifactsDir,\n overwriteDest,\n showReadyMessage,\n filename = DEFAULT_FILENAME_TEMPLATE,\n }: PackageCreatorParams,\n { fromEvent = defaultFromEvent }: PackageCreatorOptions = {}\n): Promise<ExtensionBuildResult> {\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 type BuildCmdParams = {|\n sourceDir: string,\n artifactsDir: string,\n asNeeded?: boolean,\n overwriteDest?: boolean,\n ignoreFiles?: Array<string>,\n filename?: string,\n|};\n\nexport type BuildCmdOptions = {\n manifestData?: ExtensionManifest,\n fileFilter?: FileFilter,\n onSourceChange?: OnSourceChangeFn,\n packageCreator?: PackageCreatorFn,\n showReadyMessage?: boolean,\n createFileFilter?: FileFilterCreatorFn,\n shouldExitProgram?: boolean,\n};\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 }: BuildCmdParams,\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 }: BuildCmdOptions = {}\n): Promise<ExtensionBuildResult> {\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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"}
|
|
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';\n\nimport { fs } from 'mz';\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":[]}
|
package/lib/cmd/docs.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import open from 'open';
|
|
2
2
|
import { createLogger } from '../util/logger.js';
|
|
3
3
|
const log = createLogger(import.meta.url);
|
|
4
|
+
|
|
4
5
|
// eslint-disable-next-line max-len
|
|
5
6
|
export const url = 'https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/';
|
|
6
7
|
export default async function docs(params, {
|
package/lib/cmd/docs.js.map
CHANGED
|
@@ -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":["
|
|
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\n// eslint-disable-next-line max-len\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;AACA,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":[]}
|
|
@@ -0,0 +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":[]}
|
package/lib/cmd/index.js
CHANGED
|
@@ -2,12 +2,25 @@
|
|
|
2
2
|
// reasons (faster start-up), the implementations are not statically imported
|
|
3
3
|
// at the top of the file, but lazily loaded in the (exported) functions.
|
|
4
4
|
// The latter would slow down start-up by several seconds, as seen in #1302 .
|
|
5
|
+
|
|
5
6
|
async function build(params, options) {
|
|
6
7
|
const {
|
|
7
8
|
default: runCommand
|
|
8
9
|
} = await import('./build.js');
|
|
9
10
|
return runCommand(params, options);
|
|
10
11
|
}
|
|
12
|
+
async function docs(params, options) {
|
|
13
|
+
const {
|
|
14
|
+
default: runCommand
|
|
15
|
+
} = await import('./docs.js');
|
|
16
|
+
return runCommand(params, options);
|
|
17
|
+
}
|
|
18
|
+
async function dumpConfig(params, options) {
|
|
19
|
+
const {
|
|
20
|
+
default: runCommand
|
|
21
|
+
} = await import('./dump-config.js');
|
|
22
|
+
return runCommand(params, options);
|
|
23
|
+
}
|
|
11
24
|
async function lint(params, options) {
|
|
12
25
|
const {
|
|
13
26
|
default: runCommand
|
|
@@ -26,17 +39,12 @@ async function sign(params, options) {
|
|
|
26
39
|
} = await import('./sign.js');
|
|
27
40
|
return runCommand(params, options);
|
|
28
41
|
}
|
|
29
|
-
async function docs(params, options) {
|
|
30
|
-
const {
|
|
31
|
-
default: runCommand
|
|
32
|
-
} = await import('./docs.js');
|
|
33
|
-
return runCommand(params, options);
|
|
34
|
-
}
|
|
35
42
|
export default {
|
|
36
43
|
build,
|
|
44
|
+
docs,
|
|
45
|
+
dumpConfig,
|
|
37
46
|
lint,
|
|
38
47
|
run,
|
|
39
|
-
sign
|
|
40
|
-
docs
|
|
48
|
+
sign
|
|
41
49
|
};
|
|
42
50
|
//# sourceMappingURL=index.js.map
|
package/lib/cmd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["build","params","options","default","runCommand","lint","run","sign"
|
|
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":[]}
|
package/lib/cmd/lint.js
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
import { createInstance as defaultLinterCreator } from 'addons-linter';
|
|
2
2
|
import { createLogger } from '../util/logger.js';
|
|
3
3
|
import { createFileFilter as defaultFileFilterCreator } from '../util/file-filter.js';
|
|
4
|
-
// import flow types
|
|
5
|
-
|
|
6
4
|
const log = createLogger(import.meta.url);
|
|
7
5
|
|
|
8
|
-
// Define the needed 'addons-linter' module flow types.
|
|
9
|
-
|
|
10
6
|
// Lint command types and implementation.
|
|
11
7
|
|
|
12
8
|
export default function lint({
|
|
13
9
|
artifactsDir,
|
|
14
10
|
boring,
|
|
15
|
-
firefoxPreview = [],
|
|
16
11
|
ignoreFiles,
|
|
17
12
|
metadata,
|
|
18
13
|
output,
|
|
@@ -49,9 +44,6 @@ export default function lint({
|
|
|
49
44
|
// the directory to the extension.
|
|
50
45
|
_: [sourceDir]
|
|
51
46
|
};
|
|
52
|
-
if (firefoxPreview.includes('mv3')) {
|
|
53
|
-
log.warn(['Manifest Version 3 is now officially supported and', '"--firefox-preview=mv3" is no longer needed.', 'In addition, the "mv3" value will be removed in the future.'].join(' '));
|
|
54
|
-
}
|
|
55
47
|
log.debug(`Running addons-linter on ${sourceDir}`);
|
|
56
48
|
const linter = createLinter({
|
|
57
49
|
config,
|
package/lib/cmd/lint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","names":["createInstance","defaultLinterCreator","createLogger","createFileFilter","defaultFileFilterCreator","log","import","meta","url","lint","artifactsDir","boring","
|
|
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","_","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 // 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;IACrB;IACA;IACAC,CAAC,EAAE,CAAChB,SAAS;EACf,CAAC;EAEDZ,GAAG,CAAC6B,KAAK,CAAC,4BAA4BjB,SAAS,EAAE,CAAC;EAClD,MAAMkB,MAAM,GAAGd,YAAY,CAAC;IAAEG,MAAM;IAAEY,WAAW,EAAEd;EAAkB,CAAC,CAAC;EACvE,OAAOa,MAAM,CAACE,GAAG,CAAC,CAAC;AACrB","ignoreList":[]}
|
package/lib/cmd/run.js
CHANGED
|
@@ -7,8 +7,6 @@ import { createLogger } from '../util/logger.js';
|
|
|
7
7
|
import defaultGetValidatedManifest from '../util/manifest.js';
|
|
8
8
|
import { UsageError } from '../errors.js';
|
|
9
9
|
import { createExtensionRunner, defaultReloadStrategy, MultiExtensionRunner as DefaultMultiExtensionRunner } from '../extension-runners/index.js';
|
|
10
|
-
// Import objects that are only used as Flow types.
|
|
11
|
-
|
|
12
10
|
const log = createLogger(import.meta.url);
|
|
13
11
|
|
|
14
12
|
// Run command types and implementation.
|
|
@@ -32,7 +30,6 @@ export default async function run({
|
|
|
32
30
|
startUrl,
|
|
33
31
|
target,
|
|
34
32
|
args,
|
|
35
|
-
firefoxPreview = [],
|
|
36
33
|
// Android CLI options.
|
|
37
34
|
adbBin,
|
|
38
35
|
adbHost,
|
|
@@ -68,10 +65,6 @@ export default async function run({
|
|
|
68
65
|
const customPrefs = {
|
|
69
66
|
...pref
|
|
70
67
|
};
|
|
71
|
-
if (firefoxPreview.includes('mv3')) {
|
|
72
|
-
log.info('Configuring Firefox preferences for Manifest V3');
|
|
73
|
-
customPrefs['extensions.manifestV3.enabled'] = true;
|
|
74
|
-
}
|
|
75
68
|
const manifestData = await getValidatedManifest(sourceDir);
|
|
76
69
|
const profileDir = firefoxProfile || chromiumProfile;
|
|
77
70
|
if (profileCreateIfMissing) {
|
package/lib/cmd/run.js.map
CHANGED
|
@@ -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","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 { showDesktopNotification as defaultDesktopNotifications } from '../util/desktop-notifier.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// 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// 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 = {}\n): Promise<DefaultMultiExtensionRunner> {\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: 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 {\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 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":"AACA,SAASA,EAAE,QAAQ,IAAI;AAEvB,OAAOC,qBAAqB,MAAM,YAAY;AAC9C,SAASC,uBAAuB,IAAIC,2BAA2B,QAAQ,6BAA6B;AACpG,OAAO,KAAKC,iBAAiB,MAAM,qBAAqB;AACxD,SAASC,qBAAqB,IAAIC,oBAAoB,QAAQ,sBAAsB;AACpF,SAASC,YAAY,QAAQ,mBAAmB;AAChD,OAAOC,2BAA2B,MAAM,qBAAqB;AAC7D,SAASC,UAAU,QAAQ,cAAc;AACzC,SACEC,qBAAqB,EACrBC,qBAAqB,EACrBC,oBAAoB,IAAIC,2BAA2B,QAC9C,+BAA+B;AACtC;;AAGA,MAAMC,GAAG,GAAGP,YAAY,CAACQ,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC;;AAEzC;;AAiDA,eAAe,eAAeC,GAAGA,CAC/B;EACEC,YAAY;EACZC,cAAc,GAAG,KAAK;EACtBC,QAAQ,GAAG,KAAK;EAChBC,IAAI;EACJC,OAAO;EACPC,cAAc;EACdC,sBAAsB;EACtBC,kBAAkB,GAAG,KAAK;EAC1BC,WAAW;EACXC,OAAO,GAAG,KAAK;EACfC,QAAQ,GAAG,KAAK;EAChBC,UAAU,GAAG,KAAK;EAClBC,SAAS;EACTC,SAAS;EACTC,YAAY;EACZC,QAAQ;EACRC,MAAM;EACNC,IAAI;EACJC,cAAc,GAAG,EAAE;EACnB;EACAC,MAAM;EACNC,OAAO;EACPC,OAAO;EACPC,SAAS;EACTC,mBAAmB;EACnBC,qBAAqB;EACrBC,UAAU;EACVC,mBAAmB;EACnB;EACAC,cAAc;EACdC;AACY,CAAC,EACf;EACEC,cAAc,GAAG/C,qBAAqB;EACtCgD,oBAAoB,GAAG9C,2BAA2B;EAClD+C,UAAU,GAAG9C,iBAAiB;EAC9B+C,aAAa,GAAG7C,oBAAoB;EACpC8C,cAAc,GAAGzC,qBAAqB;EACtCC,oBAAoB,GAAGC,2BAA2B;EAClDwC,oBAAoB,GAAG7C;AACV,CAAC,GAAG,CAAC,CAAC,EACiB;EACtCM,GAAG,CAACwC,IAAI,CAAE,8BAA6BvB,SAAU,EAAC,CAAC;EACnD,IAAID,UAAU,EAAE;IACdhB,GAAG,CAACwC,IAAI,CACN,yDAAyD,GACvD,eACJ,CAAC;IACDzB,QAAQ,GAAG,IAAI;EACjB;EAEA,IACEG,SAAS,IAAI,IAAI,KAChB,CAACuB,KAAK,CAACC,OAAO,CAACxB,SAAS,CAAC,IACxB,CAACA,SAAS,CAACyB,KAAK,CAAEC,EAAE,IAAK,OAAOA,EAAE,KAAK,QAAQ,CAAC,CAAC,EACnD;IACA,MAAM,IAAIjD,UAAU,CAAC,2BAA2B,CAAC;EACnD;;EAEA;EACA;EACA,MAAMkD,WAA+B,GAAG;IAAE,GAAGrC;EAAK,CAAC;EACnD,IAAIe,cAAc,CAACuB,QAAQ,CAAC,KAAK,CAAC,EAAE;IAClC9C,GAAG,CAACwC,IAAI,CAAC,iDAAiD,CAAC;IAC3DK,WAAW,CAAC,+BAA+B,CAAC,GAAG,IAAI;EACrD;EAEA,MAAME,YAAY,GAAG,MAAMR,oBAAoB,CAACtB,SAAS,CAAC;EAE1D,MAAM+B,UAAU,GAAGtC,cAAc,IAAIuB,eAAe;EAEpD,IAAItB,sBAAsB,EAAE;IAC1B,IAAI,CAACqC,UAAU,EAAE;MACf,MAAM,IAAIrD,UAAU,CAClB,uCAAuC,GACrC,yCACJ,CAAC;IACH;IACA,MAAMsD,KAAK,GAAG/D,EAAE,CAACgE,UAAU,CAACF,UAAU,CAAC;IACvC,IAAIC,KAAK,EAAE;MACTjD,GAAG,CAACwC,IAAI,CAAE,qBAAoBQ,UAAW,iBAAgB,CAAC;IAC5D,CAAC,MAAM;MACLhD,GAAG,CAACwC,IAAI,CAAE,mDAAkDQ,UAAW,EAAC,CAAC;MACzE,MAAM9D,EAAE,CAACiE,KAAK,CAACH,UAAU,CAAC;IAC5B;EACF;EAEA,MAAMI,OAAO,GAAG,EAAE;EAElB,MAAMC,kBAAkB,GAAG;IACzB;IACAC,UAAU,EAAE,CAAC;MAAErC,SAAS;MAAE8B;IAAa,CAAC,CAAC;IACzCnC,kBAAkB;IAClBQ,QAAQ;IACRE,IAAI;IACJa;EACF,CAAC;EAED,IAAI,CAACd,MAAM,IAAIA,MAAM,CAACkC,MAAM,KAAK,CAAC,IAAIlC,MAAM,CAACyB,QAAQ,CAAC,iBAAiB,CAAC,EAAE;IACxE,MAAMU,0BAA0B,GAAG;MACjC,GAAGH,kBAAkB;MAErB;MACAI,aAAa,EAAEhD,OAAO;MACtBiD,WAAW,EAAEhD,cAAc;MAC3BmC,WAAW;MACXvC,cAAc;MACdC,QAAQ;MACRS,UAAU;MAEV;MACAoB,UAAU;MACVC;IACF,CAAC;IAED,MAAMsB,oBAAoB,GAAG,MAAM/D,qBAAqB,CAAC;MACvDyB,MAAM,EAAE,iBAAiB;MACzBuC,MAAM,EAAEJ;IACV,CAAC,CAAC;IACFJ,OAAO,CAACS,IAAI,CAACF,oBAAoB,CAAC;EACpC;EAEA,IAAItC,MAAM,IAAIA,MAAM,CAACyB,QAAQ,CAAC,iBAAiB,CAAC,EAAE;IAChD,MAAMgB,0BAA0B,GAAG;MACjC,GAAGT,kBAAkB;MAErB;MACAK,WAAW,EAAEhD,cAAc;MAC3BmC,WAAW;MACXvC,cAAc;MACdU,UAAU;MACVc,UAAU;MACVC,mBAAmB;MACnBJ,SAAS;MACTF,OAAO;MACPC,OAAO;MACPF,MAAM;MACNI,mBAAmB;MACnBC,qBAAqB;MAErB;MACAO,UAAU;MACVC,aAAa;MACbF,oBAAoB,EAAE9C,2BAA2B;MACjD0E,cAAc,EAAEA,CAACC,kBAA0B,EAAEC,eAAuB,KAAK;QACvE,OAAO/B,cAAc,CACnB;UACEjB,SAAS,EAAE+C,kBAAkB;UAC7BnD,WAAW;UACXqD,QAAQ,EAAE,KAAK;UACf;UACA;UACA7D,YAAY,EAAE4D;QAChB,CAAC,EACD;UACE;UACAE,gBAAgB,EAAE;QACpB,CACF,CAAC;MACH;IACF,CAAC;IAED,MAAMC,oBAAoB,GAAG,MAAMxE,qBAAqB,CAAC;MACvDyB,MAAM,EAAE,iBAAiB;MACzBuC,MAAM,EAAEE;IACV,CAAC,CAAC;IACFV,OAAO,CAACS,IAAI,CAACO,oBAAoB,CAAC;EACpC;EAEA,IAAI/C,MAAM,IAAIA,MAAM,CAACyB,QAAQ,CAAC,UAAU,CAAC,EAAE;IACzC,MAAMuB,oBAAoB,GAAG;MAC3B,GAAGhB,kBAAkB;MACrBrB,cAAc;MACdC;IACF,CAAC;IAED,MAAMqC,cAAc,GAAG,MAAM1E,qBAAqB,CAAC;MACjDyB,MAAM,EAAE,UAAU;MAClBuC,MAAM,EAAES;IACV,CAAC,CAAC;IACFjB,OAAO,CAACS,IAAI,CAACS,cAAc,CAAC;EAC9B;EAEA,MAAMC,eAAe,GAAG,IAAIzE,oBAAoB,CAAC;IAC/CqC,oBAAoB;IACpBiB;EACF,CAAC,CAAC;EAEF,MAAMmB,eAAe,CAACnE,GAAG,CAAC,CAAC;EAE3B,IAAIW,QAAQ,EAAE;IACZf,GAAG,CAACwC,IAAI,CAAC,iDAAiD,CAAC;EAC7D,CAAC,MAAM;IACLxC,GAAG,CAACwC,IAAI,CAAC,sDAAsD,CAAC;IAEhEF,cAAc,CAAC;MACbiC,eAAe;MACftD,SAAS;MACTC,SAAS;MACTC,YAAY;MACZd,YAAY;MACZQ,WAAW;MACXC;IACF,CAAC,CAAC;EACJ;EAEA,OAAOyD,eAAe;AACxB"}
|
|
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","adbBin","adbHost","adbPort","adbDevice","adbDiscoveryTimeout","adbRemoveOldArtifacts","firefoxApk","firefoxApkComponent","chromiumBinary","chromiumProfile","buildExtension","desktopNotifications","firefoxApp","firefoxClient","reloadStrategy","getValidatedManifest","info","Array","isArray","every","el","customPrefs","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 { fs } from 'mz';\n\nimport defaultBuildExtension from './build.js';\nimport { showDesktopNotification as defaultDesktopNotifications } from '../util/desktop-notifier.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 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 chromiumProfile,\n },\n {\n buildExtension = defaultBuildExtension,\n desktopNotifications = defaultDesktopNotifications,\n firefoxApp = defaultFirefoxApp,\n firefoxClient = defaultFirefoxClient,\n reloadStrategy = defaultReloadStrategy,\n MultiExtensionRunner = DefaultMultiExtensionRunner,\n getValidatedManifest = defaultGetValidatedManifest,\n } = {},\n) {\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 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, 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 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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","ignoreList":[]}
|
package/lib/cmd/sign.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
-
import { fs } from 'mz';
|
|
3
|
-
import { signAddon as defaultAddonSigner } from 'sign-addon';
|
|
4
2
|
import defaultBuilder from './build.js';
|
|
5
3
|
import { isErrorWithCode, UsageError, WebExtError } from '../errors.js';
|
|
6
4
|
import { prepareArtifactsDir } from '../util/artifacts.js';
|
|
7
5
|
import { createLogger } from '../util/logger.js';
|
|
8
6
|
import getValidatedManifest, { getManifestId } from '../util/manifest.js';
|
|
9
|
-
import { signAddon as defaultSubmitAddonSigner
|
|
7
|
+
import { defaultAsyncFsReadFile, signAddon as defaultSubmitAddonSigner } from '../util/submit-addon.js';
|
|
10
8
|
import { withTempDir } from '../util/temp-dir.js';
|
|
11
|
-
import { isTTY } from '../util/stdin.js';
|
|
12
9
|
const log = createLogger(import.meta.url);
|
|
13
|
-
const defaultAsyncFsReadFile = fs.readFile.bind(fs);
|
|
14
10
|
export const extensionIdFile = '.web-extension-id';
|
|
11
|
+
export const uploadUuidFile = '.amo-upload-uuid';
|
|
15
12
|
|
|
16
13
|
// Sign command types and implementation.
|
|
17
14
|
|
|
@@ -20,32 +17,26 @@ export default function sign({
|
|
|
20
17
|
apiKey,
|
|
21
18
|
apiProxy,
|
|
22
19
|
apiSecret,
|
|
23
|
-
apiUrlPrefix,
|
|
24
|
-
useSubmissionApi = false,
|
|
25
20
|
artifactsDir,
|
|
26
|
-
id,
|
|
27
21
|
ignoreFiles = [],
|
|
28
22
|
sourceDir,
|
|
29
23
|
timeout,
|
|
30
|
-
|
|
31
|
-
verbose,
|
|
24
|
+
approvalTimeout,
|
|
32
25
|
channel,
|
|
33
26
|
amoMetadata,
|
|
27
|
+
uploadSourceCode,
|
|
34
28
|
webextVersion
|
|
35
29
|
}, {
|
|
36
30
|
build = defaultBuilder,
|
|
37
31
|
preValidatedManifest,
|
|
38
|
-
signAddon = defaultAddonSigner,
|
|
39
32
|
submitAddon = defaultSubmitAddonSigner,
|
|
40
33
|
asyncFsReadFile = defaultAsyncFsReadFile
|
|
41
34
|
} = {}) {
|
|
42
|
-
if (!useSubmissionApi) {
|
|
43
|
-
log.warn('IMPORTANT: web-ext v8 will introduce a new AMO submission API for signing and you might need to take actions when upgrading from v7 to v8. You can test this upcoming change now by specifying `--use-submission-api` to the `sign` command. If you want to keep using the API you are using now (via "sign-addon"), you must stay on v7.');
|
|
44
|
-
}
|
|
45
35
|
return withTempDir(async function (tmpDir) {
|
|
46
36
|
await prepareArtifactsDir(artifactsDir);
|
|
47
37
|
let manifestData;
|
|
48
38
|
const savedIdPath = path.join(sourceDir, extensionIdFile);
|
|
39
|
+
const savedUploadUuidPath = path.join(sourceDir, uploadUuidFile);
|
|
49
40
|
if (preValidatedManifest) {
|
|
50
41
|
manifestData = preValidatedManifest;
|
|
51
42
|
} else {
|
|
@@ -59,35 +50,19 @@ export default function sign({
|
|
|
59
50
|
manifestData,
|
|
60
51
|
showReadyMessage: false
|
|
61
52
|
}), getIdFromFile(savedIdPath)]);
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
64
|
-
throw new UsageError(
|
|
65
|
-
}
|
|
66
|
-
if (useSubmissionApi && idFromSourceDir && !manifestId) {
|
|
67
|
-
throw new UsageError('Cannot use previously auto-generated extension ID ' + `${idFromSourceDir} - addon submission API ` + 'requires a custom ID be specified in the manifest');
|
|
68
|
-
}
|
|
69
|
-
if (id && manifestId) {
|
|
70
|
-
throw new UsageError(`Cannot set custom ID ${id} because manifest.json ` + `declares ID ${manifestId}`);
|
|
71
|
-
}
|
|
72
|
-
if (id) {
|
|
73
|
-
log.debug(`Using custom ID declared as --id=${id}`);
|
|
74
|
-
}
|
|
75
|
-
if (manifestId) {
|
|
76
|
-
id = manifestId;
|
|
77
|
-
}
|
|
78
|
-
if (!id && idFromSourceDir) {
|
|
79
|
-
log.info(`Using previously auto-generated extension ID: ${idFromSourceDir}`);
|
|
80
|
-
id = idFromSourceDir;
|
|
53
|
+
const id = getManifestId(manifestData);
|
|
54
|
+
if (idFromSourceDir && !id) {
|
|
55
|
+
throw new UsageError('Cannot use previously auto-generated extension ID ' + `${idFromSourceDir} - This extension ID must be specified in the manifest.json file.`);
|
|
81
56
|
}
|
|
82
57
|
if (!id) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
58
|
+
// We only auto-generate add-on IDs for MV2 add-ons on AMO.
|
|
59
|
+
if (manifestData.manifest_version !== 2) {
|
|
60
|
+
throw new UsageError('An extension ID must be specified in the manifest.json file.');
|
|
61
|
+
}
|
|
62
|
+
log.warn('No extension ID specified (it will be auto-generated the first time)');
|
|
87
63
|
}
|
|
88
|
-
if (
|
|
89
|
-
|
|
90
|
-
throw new UsageError("apiProxy isn't yet supported for the addon submission API. " + 'See https://github.com/mozilla/web-ext/issues/2472');
|
|
64
|
+
if (!channel) {
|
|
65
|
+
throw new UsageError('You must specify a channel');
|
|
91
66
|
}
|
|
92
67
|
let metaDataJson;
|
|
93
68
|
if (amoMetadata) {
|
|
@@ -102,60 +77,29 @@ export default function sign({
|
|
|
102
77
|
const signSubmitArgs = {
|
|
103
78
|
apiKey,
|
|
104
79
|
apiSecret,
|
|
105
|
-
|
|
80
|
+
apiProxy,
|
|
106
81
|
id,
|
|
107
82
|
xpiPath: buildResult.extensionPath,
|
|
108
83
|
downloadDir: artifactsDir,
|
|
109
84
|
channel
|
|
110
85
|
};
|
|
111
|
-
let result;
|
|
112
86
|
try {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
id: newId,
|
|
127
|
-
downloadedFiles
|
|
128
|
-
} = await signAddon({
|
|
129
|
-
...signSubmitArgs,
|
|
130
|
-
apiUrlPrefix,
|
|
131
|
-
apiProxy,
|
|
132
|
-
disableProgressBar,
|
|
133
|
-
verbose,
|
|
134
|
-
version: manifestData.version,
|
|
135
|
-
apiRequestConfig: {
|
|
136
|
-
headers: {
|
|
137
|
-
'User-Agent': userAgentString
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
if (!success) {
|
|
142
|
-
throw new Error('The extension could not be signed');
|
|
143
|
-
}
|
|
144
|
-
result = {
|
|
145
|
-
id: newId,
|
|
146
|
-
downloadedFiles
|
|
147
|
-
};
|
|
148
|
-
// All information about the downloaded files would have already been
|
|
149
|
-
// logged by signAddon(). submitAddon() calls saveIdToFile itself.
|
|
150
|
-
await saveIdToFile(savedIdPath, newId);
|
|
151
|
-
log.info(`Extension ID: ${newId}`);
|
|
152
|
-
log.info('SUCCESS');
|
|
153
|
-
}
|
|
87
|
+
const result = await submitAddon({
|
|
88
|
+
...signSubmitArgs,
|
|
89
|
+
amoBaseUrl,
|
|
90
|
+
channel,
|
|
91
|
+
savedIdPath,
|
|
92
|
+
savedUploadUuidPath,
|
|
93
|
+
metaDataJson,
|
|
94
|
+
userAgentString,
|
|
95
|
+
validationCheckTimeout: timeout,
|
|
96
|
+
approvalCheckTimeout: approvalTimeout !== undefined ? approvalTimeout : timeout,
|
|
97
|
+
submissionSource: uploadSourceCode
|
|
98
|
+
});
|
|
99
|
+
return result;
|
|
154
100
|
} catch (clientError) {
|
|
155
|
-
log.info('FAIL');
|
|
156
101
|
throw new WebExtError(clientError.message);
|
|
157
102
|
}
|
|
158
|
-
return result;
|
|
159
103
|
});
|
|
160
104
|
}
|
|
161
105
|
export async function getIdFromFile(filePath, asyncFsReadFile = defaultAsyncFsReadFile) {
|