Skip to content

Commit

Permalink
feat: Add file extension option to web-ext build
Browse files Browse the repository at this point in the history
  • Loading branch information
rhelmer committed Aug 5, 2016
1 parent 947f8c2 commit 3556526
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 4 deletions.
21 changes: 17 additions & 4 deletions src/cmd/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const log = createLogger(__filename);


function defaultPackageCreator(
{manifestData, sourceDir, fileFilter, artifactsDir}) {
{manifestData, sourceDir, fileFilter, artifactsDir, fileExtension}) {

return new Promise(
(resolve) => {
Expand All @@ -32,8 +32,13 @@ function defaultPackageCreator(
filter: (...args) => fileFilter.wantFile(...args),
})
.then((buffer) => {
let ext = 'zip';
// override file extension if appropriate
if (fileExtension) {
ext = fileExtension;
}
let packageName = safeFileName(
`${manifestData.name}-${manifestData.version}.zip`);
`${manifestData.name}-${manifestData.version}.${ext}`);
let extensionPath = path.join(artifactsDir, packageName);
let stream = createWriteStream(extensionPath);
let promisedStream = streamToPromise(stream);
Expand All @@ -51,7 +56,7 @@ function defaultPackageCreator(


export default function build(
{sourceDir, artifactsDir, asNeeded=false}: Object,
{sourceDir, artifactsDir, asNeeded=false, extension}: Object,
{manifestData, fileFilter=new FileFilter(),
onSourceChange=defaultSourceWatcher,
packageCreator=defaultPackageCreator}
Expand All @@ -60,8 +65,16 @@ export default function build(
const rebuildAsNeeded = asNeeded; // alias for `build --as-needed`
log.info(`Building web extension from ${sourceDir}`);

const fileExtension = extension; // alias for `build --extension <ext>`
let allowedExtension = /^[a-zA-Z0-9_-]+$/;
if (!allowedExtension.test(fileExtension)) {
throw Error('Only alphanumeric, -, _ characters are ' +
'allowed for --extension.');
}
log.info(`Using custom file extension ${extension}`);

const createPackage = () => packageCreator({
manifestData, sourceDir, fileFilter, artifactsDir,
manifestData, sourceDir, fileFilter, artifactsDir, fileExtension,
});

return prepareArtifactsDir(artifactsDir)
Expand Down
5 changes: 5 additions & 0 deletions src/program.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,11 @@ Example: $0 --help run.
describe: 'Watch for file changes and re-build as needed',
type: 'boolean',
},
'extension': {
describe: 'Change the file extension from .zip to something else.' +
'Example: --extension=xpi',
type: 'string',
},
})
.command(
'sign',
Expand Down
34 changes: 34 additions & 0 deletions tests/test-cmd/test.build.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,40 @@ describe('build', () => {
);
});

it('zips a package with custom file extension', () => {
return withTempDir(
(tmpDir) =>
build({
sourceDir: fixturePath('minimal-web-ext'),
artifactsDir: tmpDir.path(),
extension: 'blah',
})
.then((buildResult) => {
assert.match(buildResult.extensionPath,
/minimal_extension-1\.0\.blah$/);
return buildResult.extensionPath;
})
);
});

it('throws an error when invalid extension is provided', () => {
let failed = false;
try {
build({
sourceDir: fixturePath('minimal-web-ext'),
extension: '$#@',
});
} catch (error) {
failed = true;
assert.include(
error.message,
'Only alphanumeric, -, _ characters are ' +
'allowed for --extension.'
);
}
assert.equal(failed, true);
});

it('can build an extension without an ID', () => {
return withTempDir(
(tmpDir) => {
Expand Down

0 comments on commit 3556526

Please sign in to comment.