616 lines
14 KiB
JavaScript
616 lines
14 KiB
JavaScript
/* Copyright 2012 Mozilla Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
/* eslint-env node, shelljs */
|
|
|
|
'use strict';
|
|
|
|
try {
|
|
require('shelljs/make');
|
|
} catch (e) {
|
|
throw new Error('ShellJS is not installed. Run "npm install" to install ' +
|
|
'all dependencies.');
|
|
}
|
|
|
|
var fs = require('fs');
|
|
|
|
var ROOT_DIR = __dirname + '/', // absolute path to project's root
|
|
BUILD_DIR = 'build/',
|
|
SRC_DIR = 'src/',
|
|
GENERIC_DIR = BUILD_DIR + 'generic/',
|
|
MINIFIED_DIR = BUILD_DIR + 'minified/',
|
|
DIST_DIR = BUILD_DIR + 'dist/',
|
|
SINGLE_FILE_DIR = BUILD_DIR + 'singlefile/',
|
|
COMPONENTS_DIR = BUILD_DIR + 'components/',
|
|
LIB_DIR = BUILD_DIR + 'lib/';
|
|
|
|
function getCurrentVersion() {
|
|
// The 'build/version.json' file is created by 'buildnumber' task.
|
|
return JSON.parse(fs.readFileSync(ROOT_DIR + 'build/version.json').toString())
|
|
.version;
|
|
}
|
|
|
|
function execGulp(cmd) {
|
|
var result = exec('gulp ' + cmd);
|
|
if (result.code) {
|
|
echo('ERROR: gulp exited with ' + result.code);
|
|
exit(result.code);
|
|
}
|
|
}
|
|
|
|
//
|
|
// make all
|
|
//
|
|
target.all = function() {
|
|
execGulp('default');
|
|
};
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Production stuff
|
|
//
|
|
|
|
//
|
|
// make generic
|
|
// Builds the generic production viewer that should be compatible with most
|
|
// modern HTML5 browsers.
|
|
//
|
|
target.generic = function() {
|
|
execGulp('generic');
|
|
};
|
|
|
|
target.components = function() {
|
|
execGulp('components');
|
|
};
|
|
|
|
target.jsdoc = function() {
|
|
execGulp('jsdoc');
|
|
};
|
|
|
|
//
|
|
// make web
|
|
// Generates the website for the project, by checking out the gh-pages branch
|
|
// underneath the build directory, and then moving the various viewer files
|
|
// into place.
|
|
//
|
|
target.web = function() {
|
|
execGulp('web');
|
|
};
|
|
|
|
target.dist = function() {
|
|
execGulp('dist-pre');
|
|
|
|
var DIST_REPO_URL = 'https://github.com/mozilla/pdfjs-dist';
|
|
var VERSION = getCurrentVersion();
|
|
|
|
cd(ROOT_DIR);
|
|
|
|
echo();
|
|
echo('### Cloning baseline distribution');
|
|
|
|
rm('-rf', DIST_DIR);
|
|
mkdir('-p', DIST_DIR);
|
|
exec('git clone --depth 1 ' + DIST_REPO_URL + ' ' + DIST_DIR);
|
|
|
|
echo();
|
|
echo('### Overwriting all files');
|
|
rm('-rf', DIST_DIR + '*');
|
|
|
|
cp('-R', ROOT_DIR + 'external/dist/*', DIST_DIR);
|
|
cp('-R', GENERIC_DIR + 'LICENSE', DIST_DIR);
|
|
cp('-R', GENERIC_DIR + 'web/cmaps', DIST_DIR);
|
|
mkdir('-p', DIST_DIR + 'build/');
|
|
cp('-R', [
|
|
GENERIC_DIR + 'build/pdf.js',
|
|
GENERIC_DIR + 'build/pdf.worker.js',
|
|
SINGLE_FILE_DIR + 'build/pdf.combined.js',
|
|
SRC_DIR + 'pdf.worker.entry.js',
|
|
], DIST_DIR + 'build/');
|
|
cp(MINIFIED_DIR + 'build/pdf.js', DIST_DIR + 'build/pdf.min.js');
|
|
cp(MINIFIED_DIR + 'build/pdf.worker.js',
|
|
DIST_DIR + 'build/pdf.worker.min.js');
|
|
|
|
mkdir('-p', DIST_DIR + 'web/');
|
|
cp('-R', [
|
|
COMPONENTS_DIR + '*',
|
|
], DIST_DIR + 'web/');
|
|
|
|
cp('-R', LIB_DIR, DIST_DIR + 'lib/');
|
|
|
|
echo();
|
|
echo('### Rebuilding manifests');
|
|
|
|
var DIST_NAME = 'pdfjs-dist';
|
|
var DIST_DESCRIPTION = 'Generic build of Mozilla\'s PDF.js library.';
|
|
var DIST_KEYWORDS = ['Mozilla', 'pdf', 'pdf.js'];
|
|
var DIST_HOMEPAGE = 'http://mozilla.github.io/pdf.js/';
|
|
var DIST_BUGS_URL = 'https://github.com/mozilla/pdf.js/issues';
|
|
var DIST_LICENSE = 'Apache-2.0';
|
|
var npmManifest = {
|
|
name: DIST_NAME,
|
|
version: VERSION,
|
|
main: 'build/pdf.js',
|
|
description: DIST_DESCRIPTION,
|
|
keywords: DIST_KEYWORDS,
|
|
homepage: DIST_HOMEPAGE,
|
|
bugs: DIST_BUGS_URL,
|
|
license: DIST_LICENSE,
|
|
dependencies: {
|
|
'node-ensure': '^0.0.0', // shim for node for require.ensure
|
|
'worker-loader': '^0.8.0', // used in external/dist/webpack.json
|
|
},
|
|
browser: {
|
|
'node-ensure': false
|
|
},
|
|
format: 'amd', // to not allow system.js to choose 'cjs'
|
|
repository: {
|
|
type: 'git',
|
|
url: DIST_REPO_URL
|
|
},
|
|
};
|
|
fs.writeFileSync(DIST_DIR + 'package.json',
|
|
JSON.stringify(npmManifest, null, 2));
|
|
var bowerManifest = {
|
|
name: DIST_NAME,
|
|
version: VERSION,
|
|
main: [
|
|
'build/pdf.js',
|
|
'build/pdf.worker.js',
|
|
],
|
|
ignore: [],
|
|
keywords: DIST_KEYWORDS,
|
|
};
|
|
fs.writeFileSync(DIST_DIR + 'bower.json',
|
|
JSON.stringify(bowerManifest, null, 2));
|
|
|
|
echo();
|
|
echo('### Committing changes');
|
|
|
|
cd(DIST_DIR);
|
|
var reason = process.env['PDFJS_UPDATE_REASON'];
|
|
var message = 'PDF.js version ' + VERSION + (reason ? ' - ' + reason : '');
|
|
exec('git add *');
|
|
exec('git commit -am \"' + message + '\"');
|
|
exec('git tag -a v' + VERSION + ' -m \"' + message + '\"');
|
|
|
|
cd(ROOT_DIR);
|
|
|
|
echo();
|
|
echo('Done. Push with');
|
|
echo(' cd ' + DIST_DIR + '; git push --tags ' + DIST_REPO_URL + ' master');
|
|
echo();
|
|
};
|
|
|
|
target.publish = function() {
|
|
execGulp('publish');
|
|
};
|
|
|
|
//
|
|
// make locale
|
|
// Creates localized resources for the viewer and extension.
|
|
//
|
|
target.locale = function() {
|
|
execGulp('locale');
|
|
};
|
|
|
|
//
|
|
// make cmaps
|
|
// Compresses cmap files. Ensure that Adobe cmap download and uncompressed at
|
|
// ./external/cmaps location.
|
|
//
|
|
target.cmaps = function () {
|
|
execGulp('cmaps');
|
|
};
|
|
|
|
//
|
|
// make bundle
|
|
// Bundles all source files into one wrapper 'pdf.js' file, in the given order.
|
|
//
|
|
target.bundle = function(args) {
|
|
execGulp('bundle');
|
|
};
|
|
|
|
//
|
|
// make singlefile
|
|
// Concatenates pdf.js and pdf.worker.js into one big pdf.combined.js, and
|
|
// flags the script loader to not attempt to load the separate worker JS file.
|
|
//
|
|
target.singlefile = function() {
|
|
execGulp('singlefile');
|
|
};
|
|
|
|
//
|
|
// make minified
|
|
// Builds the minified production viewer that should be compatible with most
|
|
// modern HTML5 browsers.
|
|
//
|
|
target.minified = function() {
|
|
execGulp('minified');
|
|
};
|
|
|
|
target.minifiedpost = function () {
|
|
var viewerFiles = [
|
|
'external/webL10n/l10n.js',
|
|
MINIFIED_DIR + BUILD_DIR + 'pdf.js',
|
|
MINIFIED_DIR + '/web/viewer.js'
|
|
];
|
|
|
|
echo();
|
|
echo('### Minifying js files');
|
|
|
|
var UglifyJS = require('uglify-js');
|
|
// V8 chokes on very long sequences. Works around that.
|
|
var optsForHugeFile = {compress: {sequences: false}};
|
|
|
|
UglifyJS.minify(viewerFiles).code
|
|
.to(MINIFIED_DIR + '/web/pdf.viewer.js');
|
|
UglifyJS.minify(MINIFIED_DIR + '/build/pdf.js').code
|
|
.to(MINIFIED_DIR + '/build/pdf.min.js');
|
|
UglifyJS.minify(MINIFIED_DIR + '/build/pdf.worker.js', optsForHugeFile).code
|
|
.to(MINIFIED_DIR + '/build/pdf.worker.min.js');
|
|
|
|
echo();
|
|
echo('### Cleaning js files');
|
|
|
|
rm(MINIFIED_DIR + '/web/viewer.js');
|
|
rm(MINIFIED_DIR + '/web/debugger.js');
|
|
rm(MINIFIED_DIR + '/build/pdf.js');
|
|
rm(MINIFIED_DIR + '/build/pdf.worker.js');
|
|
mv(MINIFIED_DIR + '/build/pdf.min.js',
|
|
MINIFIED_DIR + '/build/pdf.js');
|
|
mv(MINIFIED_DIR + '/build/pdf.worker.min.js',
|
|
MINIFIED_DIR + '/build/pdf.worker.js');
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Extension stuff
|
|
//
|
|
|
|
//
|
|
// make extension
|
|
//
|
|
target.extension = function() {
|
|
execGulp('extension');
|
|
};
|
|
|
|
target.buildnumber = function() {
|
|
execGulp('buildnumber');
|
|
};
|
|
|
|
//
|
|
// make firefox
|
|
//
|
|
target.firefox = function() {
|
|
execGulp('firefox');
|
|
};
|
|
|
|
//
|
|
// make mozcentral
|
|
//
|
|
target.mozcentral = function() {
|
|
execGulp('mozcentral');
|
|
};
|
|
|
|
//
|
|
// make chrome
|
|
//
|
|
target.chromium = function() {
|
|
execGulp('chromium');
|
|
};
|
|
|
|
target.signchromium = function () {
|
|
cd(ROOT_DIR);
|
|
|
|
var CHROME_BUILD_DIR = BUILD_DIR + '/chromium/';
|
|
|
|
// Bundle the files to a Chrome extension file .crx if path to key is set
|
|
var pem = env['PDFJS_CHROME_KEY'];
|
|
if (!pem) {
|
|
echo('The PDFJS_CHROME_KEY must be specified.');
|
|
exit(1);
|
|
}
|
|
|
|
echo();
|
|
echo('### Bundling .crx extension into ' + CHROME_BUILD_DIR);
|
|
|
|
if (!test('-f', pem)) {
|
|
echo('Incorrect PDFJS_CHROME_KEY path');
|
|
exit(1);
|
|
}
|
|
|
|
var browserManifest = env['PDF_BROWSERS'] ||
|
|
'test/resources/browser_manifests/browser_manifest.json';
|
|
|
|
if (!test('-f', browserManifest)) {
|
|
echo('Browser manifest file ' + browserManifest + ' does not exist.');
|
|
echo('Copy and adjust the example in test/resources/browser_manifests.');
|
|
exit(1);
|
|
}
|
|
|
|
var manifest;
|
|
try {
|
|
manifest = JSON.parse(cat(browserManifest));
|
|
} catch (e) {
|
|
echo('Malformed browser manifest file');
|
|
echo(e.message);
|
|
exit(1);
|
|
}
|
|
|
|
var executable;
|
|
manifest.forEach(function(browser) {
|
|
if (browser.name === 'chrome') {
|
|
executable = browser.path;
|
|
}
|
|
});
|
|
|
|
// If there was no chrome entry in the browser manifest, exit
|
|
if (!executable) {
|
|
echo('There was no \'chrome\' entry in the browser manifest');
|
|
exit(1);
|
|
}
|
|
|
|
// If we're on a Darwin (Mac) OS, then let's check for an .app path
|
|
if (process.platform === 'darwin' && executable.indexOf('.app') !== -1) {
|
|
executable = executable + '/Contents/MacOS/Google Chrome';
|
|
}
|
|
|
|
// If the chrome executable doesn't exist
|
|
if (!test('-f', executable)) {
|
|
echo('Incorrect executable path to chrome');
|
|
exit(1);
|
|
}
|
|
|
|
// Let chrome pack the extension for us
|
|
exec('"' + executable + '"' +
|
|
' --no-message-box' +
|
|
' "--pack-extension=' + ROOT_DIR + CHROME_BUILD_DIR + '"' +
|
|
' "--pack-extension-key=' + pem + '"');
|
|
|
|
// Rename to pdf.js.crx
|
|
mv(BUILD_DIR + 'chrome.crx', CHROME_BUILD_DIR + 'pdf.js.crx');
|
|
};
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Test stuff
|
|
//
|
|
|
|
//
|
|
// make test
|
|
//
|
|
target.test = function() {
|
|
execGulp('test');
|
|
};
|
|
|
|
//
|
|
// make bottest
|
|
// (Special tests for the Github bot)
|
|
//
|
|
target.bottest = function() {
|
|
execGulp('bottest');
|
|
};
|
|
|
|
//
|
|
// make browsertest
|
|
//
|
|
target.browsertest = function(options) {
|
|
if (options && options.noreftest) {
|
|
execGulp('browsertest-noreftest');
|
|
} else {
|
|
execGulp('browsertest');
|
|
}
|
|
};
|
|
|
|
//
|
|
// make unittest
|
|
//
|
|
target.unittest = function(options, callback) {
|
|
execGulp('unittest');
|
|
};
|
|
|
|
//
|
|
// make fonttest
|
|
//
|
|
target.fonttest = function(options, callback) {
|
|
execGulp('fonttest');
|
|
};
|
|
|
|
//
|
|
// make botmakeref
|
|
//
|
|
target.botmakeref = function() {
|
|
execGulp('botmakeref');
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Baseline operation
|
|
//
|
|
target.baseline = function() {
|
|
execGulp('baseline');
|
|
};
|
|
|
|
target.mozcentralbaseline = function() {
|
|
target.baseline();
|
|
|
|
cd(ROOT_DIR);
|
|
|
|
echo();
|
|
echo('### Creating mozcentral baseline environment');
|
|
|
|
var BASELINE_DIR = BUILD_DIR + 'baseline';
|
|
var MOZCENTRAL_BASELINE_DIR = BUILD_DIR + 'mozcentral.baseline';
|
|
if (test('-d', MOZCENTRAL_BASELINE_DIR)) {
|
|
rm('-rf', MOZCENTRAL_BASELINE_DIR);
|
|
}
|
|
|
|
cd(BASELINE_DIR);
|
|
if (test('-d', 'build')) {
|
|
rm('-rf', 'build');
|
|
}
|
|
exec('node make mozcentral');
|
|
|
|
cd(ROOT_DIR);
|
|
mkdir(MOZCENTRAL_BASELINE_DIR);
|
|
cp('-Rf', BASELINE_DIR + '/build/mozcentral/*', MOZCENTRAL_BASELINE_DIR);
|
|
// fixing baseline
|
|
if (test('-f', MOZCENTRAL_BASELINE_DIR +
|
|
'/browser/extensions/pdfjs/PdfStreamConverter.js')) {
|
|
rm(MOZCENTRAL_BASELINE_DIR +
|
|
'/browser/extensions/pdfjs/PdfStreamConverter.js');
|
|
}
|
|
|
|
cd(MOZCENTRAL_BASELINE_DIR);
|
|
exec('git init');
|
|
exec('git add .');
|
|
exec('git commit -m "mozcentral baseline"');
|
|
};
|
|
|
|
target.mozcentraldiff = function() {
|
|
target.mozcentral();
|
|
|
|
cd(ROOT_DIR);
|
|
|
|
echo();
|
|
echo('### Creating mozcentral diff');
|
|
|
|
var MOZCENTRAL_DIFF = BUILD_DIR + 'mozcentral.diff';
|
|
if (test('-f', MOZCENTRAL_DIFF)) {
|
|
rm(MOZCENTRAL_DIFF);
|
|
}
|
|
|
|
var MOZCENTRAL_BASELINE_DIR = BUILD_DIR + 'mozcentral.baseline';
|
|
if (!test('-d', MOZCENTRAL_BASELINE_DIR)) {
|
|
echo('mozcentral baseline was not found');
|
|
echo('Please build one using "gulp mozcentralbaseline"');
|
|
exit(1);
|
|
}
|
|
cd(MOZCENTRAL_BASELINE_DIR);
|
|
exec('git reset --hard');
|
|
cd(ROOT_DIR); rm('-rf', MOZCENTRAL_BASELINE_DIR + '/*'); // trying to be safe
|
|
cd(MOZCENTRAL_BASELINE_DIR);
|
|
cp('-Rf', '../mozcentral/*', '.');
|
|
exec('git add -A');
|
|
exec('git diff --binary --cached --unified=8', {silent: true}).output.
|
|
to('../mozcentral.diff');
|
|
|
|
echo('Result diff can be found at ' + MOZCENTRAL_DIFF);
|
|
};
|
|
|
|
target.mozcentralcheck = function() {
|
|
cd(ROOT_DIR);
|
|
|
|
echo();
|
|
echo('### Checking mozcentral changes');
|
|
|
|
var mcPath = env['MC_PATH'];
|
|
if (!mcPath) {
|
|
echo('mozilla-central path is not provided.');
|
|
echo('Please specify MC_PATH variable');
|
|
exit(1);
|
|
}
|
|
if ((mcPath[0] !== '/' && mcPath[0] !== '~' && mcPath[1] !== ':') ||
|
|
!test('-d', mcPath)) {
|
|
echo('mozilla-central path is not in absolute form or does not exist.');
|
|
exit(1);
|
|
}
|
|
|
|
var MOZCENTRAL_DIFF = BUILD_DIR + 'mozcentral_changes.diff';
|
|
if (test('-f', MOZCENTRAL_DIFF)) {
|
|
rm(MOZCENTRAL_DIFF);
|
|
}
|
|
|
|
var MOZCENTRAL_BASELINE_DIR = BUILD_DIR + 'mozcentral.baseline';
|
|
if (!test('-d', MOZCENTRAL_BASELINE_DIR)) {
|
|
echo('mozcentral baseline was not found');
|
|
echo('Please build one using "gulp mozcentralbaseline"');
|
|
exit(1);
|
|
}
|
|
cd(MOZCENTRAL_BASELINE_DIR);
|
|
exec('git reset --hard');
|
|
cd(ROOT_DIR); rm('-rf', MOZCENTRAL_BASELINE_DIR + '/*'); // trying to be safe
|
|
cd(MOZCENTRAL_BASELINE_DIR);
|
|
mkdir('browser');
|
|
cd('browser');
|
|
mkdir('-p', 'extensions/pdfjs');
|
|
cp('-Rf', mcPath + '/browser/extensions/pdfjs/*', 'extensions/pdfjs');
|
|
mkdir('-p', 'locales/en-US/pdfviewer');
|
|
cp('-Rf', mcPath + '/browser/locales/en-US/pdfviewer/*',
|
|
'locales/en-US/pdfviewer');
|
|
// Remove '.DS_Store' and other hidden files
|
|
find('.').forEach(function(file) {
|
|
if (file.match(/^\.\w|~$/)) {
|
|
rm('-f', file);
|
|
}
|
|
});
|
|
|
|
cd('..');
|
|
exec('git add -A');
|
|
var diff = exec('git diff --binary --cached --unified=8',
|
|
{silent: true}).output;
|
|
|
|
if (diff) {
|
|
echo('There were changes found at mozilla-central.');
|
|
diff.to('../mozcentral_changes.diff');
|
|
echo('Result diff can be found at ' + MOZCENTRAL_DIFF);
|
|
exit(1);
|
|
}
|
|
|
|
echo('Success: there are no changes at mozilla-central');
|
|
};
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Other
|
|
//
|
|
|
|
//
|
|
// make server
|
|
//
|
|
target.server = function () {
|
|
execGulp('server');
|
|
};
|
|
|
|
//
|
|
// make lint
|
|
//
|
|
target.lint = function() {
|
|
execGulp('lint');
|
|
};
|
|
|
|
//
|
|
// make clean
|
|
//
|
|
target.clean = function() {
|
|
execGulp('clean');
|
|
};
|
|
|
|
//
|
|
// make makefile
|
|
//
|
|
target.makefile = function () {
|
|
execGulp('makefile');
|
|
};
|
|
|
|
//
|
|
// make importl10n
|
|
//
|
|
target.importl10n = function() {
|
|
execGulp('importl10n');
|
|
};
|