blob: 977ca2bb7b366d9f32cbbd75b4b2bab7283d1a36 [file] [log] [blame]
/*
* Copyright 2012 Research In Motion Limited.
*
* 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.
*/
var path = require("path"),
util = require("util"),
packagerUtils = require("./packager-utils"),
fs = require("fs"),
conf = require("./conf"),
BBWPignore = require('./bbwpignore'),
wrench = require("wrench"),
zip = require("zip"),
localize = require("./localize"),
logger = require("./logger"),
CLIENT_JS = "client.js",
SERVER_JS = "index.js",
VALID_EXTENSIONS = [".js", ".json"],
CORDOVA_JS_REGEX = /(cordova-.+js)|cordova\.js/,
MODULES_TO_KEEP = ["lib/utils.js", "lib/exception.js"];
function unzip(from, to) {
var data, entries, p, parent;
if (fs.existsSync(from)) {
data = fs.readFileSync(from);
entries = zip.Reader(data).toObject();
if (!fs.existsSync(to)) {
wrench.mkdirSyncRecursive(to, "0755");
}
for (p in entries) {
if (entries.hasOwnProperty(p)) {
if (p.indexOf("__MACOSX") >= 0) {
continue;
}
if (p.split("/").length > 1) {
parent = p.split("/").slice(0, -1).join("/");
wrench.mkdirSyncRecursive(to + "/" + parent, "0755");
}
fs.writeFileSync(to + "/" + p, entries[p]);
}
}
} else {
throw localize.translate("EXCEPTION_WIDGET_ARCHIVE_NOT_FOUND", from);
}
}
function copyDirContents(from, to) {
var files = wrench.readdirSyncRecursive(from),
bbwpignoreFile = path.join(from, conf.BBWP_IGNORE_FILENAME),
bbwpignore,
ignoreFiles = conf.BBWP_IGNORE_FILENAME;
if (fs.existsSync(bbwpignoreFile)) {
bbwpignore = new BBWPignore(bbwpignoreFile, files);
bbwpignore.matchedFiles.push(conf.BBWP_IGNORE_FILENAME); //add the .bbwpignore file to the ignore list
ignoreFiles = bbwpignore.matchedFiles.join("|");
}
wrench.copyDirSyncRecursive(from, to, {preserve: true, whitelist: false, filter: new RegExp(ignoreFiles, "g")});
}
function prepare(session) {
var conf = session.conf,
dest = session.sourcePaths;
if (fs.existsSync(session.sourceDir)) {
wrench.rmdirSyncRecursive(session.sourceDir);
}
// unzip archive
if (fs.existsSync(session.archivePath)) {
if (session.archivePath.toLowerCase().match("[.]zip$")) {
unzip(session.archivePath, session.sourceDir);
} else {
copyDirContents(session.archivePath, session.sourceDir);
}
} else {
throw localize.translate("EXCEPTION_INVALID_ARCHIVE_PATH", session.archivePath);
}
}
function getModulesArray(dest, files, baseDir) {
var modulesList = [],
EXCLUDE_FILES = ["client.js", "manifest.json"];
function isExcluded(file) {
return EXCLUDE_FILES.indexOf(path.basename(file)) !== -1 || !file.match(/\.(js|json)$/);
}
files.forEach(function (file) {
file = path.resolve(baseDir, file);
if (!fs.statSync(file).isDirectory()) {
if (!isExcluded(file)) {
modulesList.push({name: path.relative(path.normalize(dest.CHROME), file).replace(/\\/g, "/"), file: file});
}
}
});
return modulesList;
}
function generateFrameworkModulesJS(session) {
var dest = session.sourcePaths,
modulesList = [],
modulesStr = "(function () { ",
frameworkModulesStr = "window.frameworkModules = [",
libFiles = wrench.readdirSyncRecursive(dest.LIB),
extFiles,
extModules;
modulesList = modulesList.concat(getModulesArray(dest, libFiles, dest.LIB));
if (fs.existsSync(dest.EXT)) {
extFiles = wrench.readdirSyncRecursive(dest.EXT);
extModules = getModulesArray(dest, extFiles, dest.EXT);
modulesList = modulesList.concat(extModules);
}
modulesList.forEach(function (module, index) {
modulesStr += "define('" + module.name + "', function (require, exports, module) {\n" +
fs.readFileSync(module.file, "utf-8") + "\n" +
"});\n";
frameworkModulesStr += "'" + module.name + "'" + (index !== modulesList.length - 1 ? ", " : "");
// Issue with 10.1 webplatform - requires certain files in chrome/lib
if (MODULES_TO_KEEP.indexOf(module.name) < 0) {
fs.unlinkSync(path.normalize(dest.CHROME + "/" + module.name));
}
});
modulesStr += "}());";
frameworkModulesStr += "];\n";
fs.writeFileSync(path.normalize(dest.CHROME + "/frameworkModules.js"), frameworkModulesStr + modulesStr);
}
function copyNative(session, target) {
var src = path.normalize(session.conf.NATIVE + "/" + target),
dest = path.normalize(session.sourceDir);
copyDirContents(src, dest);
}
function copyWebworks(session) {
var srcPath = path.normalize(session.conf.PROJECT_ROOT + "/lib"),
dest = path.normalize(session.sourceDir),
srcFiles;
srcFiles = packagerUtils.listFiles(srcPath, function (file) {
return CORDOVA_JS_REGEX.test(file);
});
if (srcFiles.length === 1) {
packagerUtils.copyFile(srcFiles[0], dest);
//Rename file to webworks.js
fs.renameSync(path.join(dest, path.basename(srcFiles[0])), path.join(dest, "cordova.js"));
} else {
throw localize.translate("EXCEPTION_CORDOVA_JS_IN_LIB_DIR", srcFiles.length);
}
}
function hasValidExtension(file) {
return VALID_EXTENSIONS.some(function (element, index, array) {
return path.extname(file) === element;
});
}
function generateUserConfig(session, config) {
packagerUtils.writeFile(path.join(session.sourcePaths.LIB, "config"), "user.js", "module.exports = " + JSON.stringify(config, null, " ") + ";");
}
module.exports = {
unzip: unzip,
copyNative: copyNative,
copyWebworks : copyWebworks,
prepareOutputFiles: prepare,
generateFrameworkModulesJS: generateFrameworkModulesJS,
generateUserConfig: generateUserConfig,
cleanSource: function (session) {
if (!session.keepSource) {
wrench.rmdirSyncRecursive(session.sourceDir);
}
},
copyDirContents: copyDirContents
};