diff --git a/package-lock.json b/package-lock.json index c39a11081f..69edab825c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4415,7 +4415,8 @@ "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.13.1" + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "dependencies": { "caller-path": { @@ -4437,6 +4438,16 @@ "resolve-from": "^3.0.0" } }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -4837,7 +4848,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } }, "defaults": { "version": "1.0.3", @@ -5847,7 +5869,8 @@ "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", - "pify": "^2.0.0" + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -5928,6 +5951,12 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true } } }, @@ -8465,7 +8494,27 @@ "dev": true, "requires": { "graceful-fs": "^4.1.2", - "pify": "^3.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "loader-runner": { diff --git a/src/cmd/build.js b/src/cmd/build.js index 572fa54f00..e509c66141 100644 --- a/src/cmd/build.js +++ b/src/cmd/build.js @@ -43,7 +43,8 @@ export type PackageCreatorParams = {| fileFilter: FileFilter, artifactsDir: string, overwriteDest: boolean, - showReadyMessage: boolean + showReadyMessage: boolean, + filename?: string, |}; export type LocalizedNameParams = {| @@ -115,6 +116,7 @@ export async function defaultPackageCreator( artifactsDir, overwriteDest, showReadyMessage, + filename, }: PackageCreatorParams, { eventToPromise = defaultEventToPromise, @@ -132,22 +134,27 @@ export async function defaultPackageCreator( filter: (...args) => fileFilter.wantFile(...args), }); - let extensionName: string = manifestData.name; - - let {default_locale} = manifestData; - if (default_locale) { - default_locale = default_locale.replace(/-/g, '_'); - const messageFile = path.join( - sourceDir, '_locales', - default_locale, 'messages.json' - ); - log.debug('Manifest declared default_locale, localizing extension name'); - extensionName = await getDefaultLocalizedName({ - messageFile, manifestData, - }); + let packageName; + if (filename) { + packageName = `${filename}.zip`; + } else { + let extensionName: string = manifestData.name; + + let {default_locale} = manifestData; + if (default_locale) { + default_locale = default_locale.replace(/-/g, '_'); + const messageFile = path.join( + sourceDir, '_locales', + default_locale, 'messages.json' + ); + log.debug('Manifest declared default_locale, localizing extension name'); + extensionName = await getDefaultLocalizedName({ + messageFile, manifestData, + }); + } + packageName = safeFileName( + `${extensionName}-${manifestData.version}.zip`); } - const packageName = safeFileName( - `${extensionName}-${manifestData.version}.zip`); const extensionPath = path.join(artifactsDir, packageName); // Added 'wx' flags to avoid overwriting of existing package. @@ -187,6 +194,7 @@ export type BuildCmdParams = {| asNeeded?: boolean, overwriteDest?: boolean, ignoreFiles?: Array, + filename?: string, |}; export type BuildCmdOptions = {| @@ -206,6 +214,7 @@ export default async function build( asNeeded = false, overwriteDest = false, ignoreFiles = [], + filename, }: BuildCmdParams, { manifestData, @@ -231,6 +240,7 @@ export default async function build( artifactsDir, overwriteDest, showReadyMessage, + filename, }); await prepareArtifactsDir(artifactsDir); diff --git a/src/program.js b/src/program.js index 865c136ec9..739844883b 100644 --- a/src/program.js +++ b/src/program.js @@ -381,6 +381,15 @@ Example: $0 --help run. default: true, type: 'boolean', }, + 'filename': { + alias: 'f', + describe: 'Name of the created extension package.', + default: undefined, + normalize: true, + demandOption: false, + requiresArg: false, + type: 'string', + }, }); program diff --git a/tests/unit/test-cmd/test.build.js b/tests/unit/test-cmd/test.build.js index 291f93cedb..2be1ad27d2 100644 --- a/tests/unit/test-cmd/test.build.js +++ b/tests/unit/test-cmd/test.build.js @@ -72,6 +72,21 @@ describe('build', () => { }); }); + it('gives the correct custom name to an extension', () => { + return withTempDir( + (tmpDir) => + build({ + sourceDir: fixturePath('minimal-web-ext'), + artifactsDir: tmpDir.path(), + filename: 'test', + }) + .then((buildResult) => { + assert.match(buildResult.extensionPath, + /test\.zip$/); + }) + ); + }); + it('gives the correct name to a localized extension', () => { return withTempDir( (tmpDir) =>