Skip to content

Commit

Permalink
Merge 8068adb into c73c315
Browse files Browse the repository at this point in the history
  • Loading branch information
rpl committed Aug 4, 2016
2 parents c73c315 + 8068adb commit 08b37b9
Show file tree
Hide file tree
Showing 9 changed files with 438 additions and 396 deletions.
4 changes: 4 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@
"transform-flow-strip-types",
"transform-class-properties",
"transform-es2015-modules-commonjs",
["transform-runtime", {
"polyfill": false,
"regenerator": true
}]
]
}
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,10 @@
"babel-plugin-transform-class-properties": "6.11.5",
"babel-plugin-transform-es2015-modules-commonjs": "6.11.5",
"babel-plugin-transform-flow-strip-types": "6.8.0",
"babel-plugin-transform-runtime": "6.12.0",
"babel-preset-es2015": "6.9.0",
"babel-preset-stage-2": "6.11.0",
"babel-runtime": "6.11.6",
"chai": "3.5.0",
"conventional-changelog-cli": "1.2.0",
"conventional-changelog-lint": "1.0.0",
Expand Down
129 changes: 80 additions & 49 deletions src/cmd/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,44 @@ import {createLogger} from '../util/logger';

const log = createLogger(__filename);


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

return new Promise(
// Flow Types

import type {OnSourceChangeFn} from '../watcher';
import type {ExtensionManifest} from '../util/manifest';

export type PackageCreatorFn =
(params: PackageCreatorParams) => Promise<ExtensionBuildResult>;

export type ExtensionBuildResult = {
extensionPath: string,
};

export type PackageCreatorParams = {
manifestData?: ExtensionManifest,
sourceDir: string,
fileFilter: FileFilter,
artifactsDir: string,
};

export type BuildCmdParams = {
sourceDir: string,
artifactsDir: string,
asNeeded?: boolean,
};

export type BuildCmdExtraParams = {
manifestData?: ExtensionManifest,
fileFilter?: FileFilter,
onSourceChange?: OnSourceChangeFn,
packageCreator?: PackageCreatorFn,
};

// Private Helpers

async function defaultPackageCreator(
{manifestData, sourceDir, fileFilter, artifactsDir}: PackageCreatorParams
): Promise<ExtensionBuildResult> {
manifestData = await new Promise(
(resolve) => {
if (manifestData) {
const id = getManifestId(manifestData);
Expand All @@ -25,63 +58,61 @@ function defaultPackageCreator(
} else {
resolve(getValidatedManifest(sourceDir));
}
})
.then((manifestData) => {
return zipDir(
sourceDir, {
filter: (...args) => fileFilter.wantFile(...args),
})
.then((buffer) => {
let packageName = safeFileName(
`${manifestData.name}-${manifestData.version}.zip`);
let extensionPath = path.join(artifactsDir, packageName);
let stream = createWriteStream(extensionPath);
let promisedStream = streamToPromise(stream);

stream.write(buffer, () => stream.end());

return promisedStream
.then(() => {
log.info(`Your web extension is ready: ${extensionPath}`);
return {extensionPath};
});
});
});
}

let buffer = await zipDir(
sourceDir, {
filter: (...args) => fileFilter.wantFile(...args),
});

let packageName = safeFileName(
`${manifestData.name}-${manifestData.version}.zip`);
let extensionPath = path.join(artifactsDir, packageName);
let stream = createWriteStream(extensionPath);

stream.write(buffer, () => stream.end());
await streamToPromise(stream);

export default function build(
{sourceDir, artifactsDir, asNeeded=false}: Object,
{manifestData, fileFilter=new FileFilter(),
onSourceChange=defaultSourceWatcher,
packageCreator=defaultPackageCreator}
: Object = {}): Promise {
log.info(`Your web extension is ready: ${extensionPath}`);
return {extensionPath};
}

// Exports

export default async function build(
{sourceDir, artifactsDir, asNeeded=false}: BuildCmdParams,
{
manifestData, fileFilter=new FileFilter(),
onSourceChange=defaultSourceWatcher,
packageCreator=defaultPackageCreator,
}: BuildCmdExtraParams = {}
): Promise<ExtensionBuildResult> {
const rebuildAsNeeded = asNeeded; // alias for `build --as-needed`
log.info(`Building web extension from ${sourceDir}`);

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

return prepareArtifactsDir(artifactsDir)
.then(() => createPackage())
.then((result) => {
if (rebuildAsNeeded) {
log.info('Rebuilding when files change...');
onSourceChange({
sourceDir, artifactsDir,
onChange: () => {
return createPackage().catch((error) => {
log.error(error.stack);
throw error;
});
},
shouldWatchFile: (...args) => fileFilter.wantFile(...args),
await prepareArtifactsDir(artifactsDir);

let result = await createPackage();

if (rebuildAsNeeded) {
log.info('Rebuilding when files change...');
onSourceChange({
sourceDir, artifactsDir,
onChange: () => {
return createPackage().catch((error) => {
log.error(error.stack);
throw error;
});
}
return result;
},
shouldWatchFile: (...args) => fileFilter.wantFile(...args),
});
}

return result;
}


Expand Down
132 changes: 53 additions & 79 deletions src/cmd/run.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export function defaultFirefoxClient(
}


export default function run(
export default async function run(
{sourceDir, artifactsDir, firefoxBinary, firefoxProfile,
preInstall=false, noReload=false}: Object,
{firefoxClient=defaultFirefoxClient, firefox=defaultFirefox,
Expand All @@ -98,85 +98,59 @@ export default function run(
const requiresRemote = !preInstall;
let installed = false;

return getValidatedManifest(sourceDir)
.then((manifestData) => {
return new ExtensionRunner({
sourceDir,
firefox,
firefoxBinary,
manifestData,
firefoxProfile,
});
})
.then((runner) => {
return runner.getProfile().then((profile) => {
return {runner, profile};
});
})
.then((config) => {
const {runner, profile} = config;
return new Promise(
(resolve) => {
if (!preInstall) {
log.debug('Deferring extension installation until after ' +
'connecting to the remote debugger');
resolve(config);
} else {
log.debug('Pre-installing extension as a proxy file');
resolve(runner.installAsProxy(profile).then((addonId) => {
installed = true;
return {addonId, ...config};
}));
}
});
})
.then((config) => {
const {runner, profile} = config;
return runner.run(profile).then((firefox) => {
return {firefox, ...config};
});
})
.then((config) => {
if (requiresRemote) {
return firefoxClient().then((client) => {
return {client, ...config};
});
} else {
return config;
}
})
.then((config) => {
if (installed) {
log.debug('Not installing as temporary add-on because the ' +
'add-on was already installed');
return config;
} else {
const {runner, client} = config;
return runner.installAsTemporaryAddon(client)
.then((installResult) => {
return {addonId: installResult.addon.id, ...config};
});
}
})
.catch(onlyInstancesOf(RemoteTempInstallNotSupported, (error) => {
log.debug(`Caught: ${error}`);
throw new WebExtError(
'Temporary add-on installation is not supported in this version ' +
'of Firefox (you need Firefox 49 or higher). For older Firefox ' +
'versions, use --pre-install');
}))
.then(({firefox, profile, client, addonId}) => {
if (noReload) {
log.debug('Extension auto-reloading has been disabled');
} else {
log.debug(
`Reloading extension when the source changes; id=${addonId}`);
reloadStrategy({
firefox, profile, client, sourceDir, artifactsDir, addonId,
});
}
return firefox;
let manifestData = await getValidatedManifest(sourceDir);

let runner = new ExtensionRunner({
sourceDir,
firefox,
firefoxBinary,
manifestData,
firefoxProfile,
});

let profile = await runner.getProfile();
let addonId;

if (!preInstall) {
log.debug('Deferring extension installation until after ' +
'connecting to the remote debugger');
} else {
log.debug('Pre-installing extension as a proxy file');
addonId = await runner.installAsProxy(profile);
installed = true;
}

let firefoxInstance = await runner.run(profile);

let client;

if (installed) {
log.debug('Not installing as temporary add-on because the ' +
'add-on was already installed');
} else if (requiresRemote) {
client = await firefoxClient();
addonId = await runner.installAsTemporaryAddon(client)
.then((installResult) => installResult.addon.id)
.catch(onlyInstancesOf(RemoteTempInstallNotSupported, (error) => {
log.debug(`Caught: ${error}`);
throw new WebExtError(
'Temporary add-on installation is not supported in this version ' +
'of Firefox (you need Firefox 49 or higher). For older Firefox ' +
'versions, use --pre-install');
}));
}

if (noReload) {
log.debug('Extension auto-reloading has been disabled');
} else {
log.debug(
`Reloading extension when the source changes; id=${addonId}`);
reloadStrategy({
firefoxInstance, profile, client, sourceDir, artifactsDir, addonId,
});
}

return firefoxInstance;
}


Expand Down
Loading

0 comments on commit 08b37b9

Please sign in to comment.