blob: 253c093867903d8ae4aff57356c752393ec41ec6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
/*
* create a cordova/blackberry project
*
* USAGE
* ./create [path package appname]
*/
var build,
path = require("path"),
fs = require("fs"),
wrench = require("wrench"),
utils = require(path.join(__dirname, 'lib/utils')),
version = getVersion(),
project_path = path.resolve(process.argv[2]),
app_id = process.argv[3],
bar_name = process.argv[4],
TARGETS = ["device", "simulator"],
TEMPLATE_PROJECT_DIR = path.join(__dirname, "templates", "project"),
MODULES_PROJECT_DIR = path.join(__dirname, "..", "node_modules"),
BOOTSTRAP_PROJECT_DIR = path.join(__dirname, "..", "framework", "bootstrap"),
FRAMEWORK_LIB_PROJECT_DIR = path.join(__dirname, "..", "framework", "lib"),
BUILD_DIR = path.join(__dirname, "build"),
CORDOVA_JS_SRC = path.join(__dirname, "..", "javascript", "cordova.blackberry10.js"),
update_dir = path.join(project_path, "lib", "cordova." + version),
native_dir = path.join(project_path, "native"),
js_path = "javascript",
js_basename = "cordova-" + version + ".js";
function getVersion() {
var version = fs.readFileSync(path.join(__dirname, "..", "VERSION"));
if (version) {
return version.toString().replace( /([^\x00-\xFF]|\s)*$/g, '' );
}
}
function validPackageName(packageName) {
var domainRegex = /^[a-zA-Z]([a-zA-Z0-9])*(\.[a-zA-Z]([a-zA-Z0-9])*)*$/;
if (typeof packageName !== "undefined") {
if ((packageName.length > 50) || !domainRegex.test(packageName)) {
return false;
}
}
return true;
}
function validBarName(barName) {
var barNameRegex = /^[a-zA-Z0-9._\-]+$/;
return (typeof barName === "undefined") || barNameRegex.test(barName);
}
function validate() {
if (!project_path) {
throw "You must give a project PATH";
}
if (fs.existsSync(project_path)) {
throw "The project path must be an empty directory";
}
if (!validPackageName(app_id)) {
throw "App ID must be sequence of alpha-numeric (optionally seperated by '.') characters, no longer than 50 characters";
}
if (!validBarName(bar_name)) {
throw "BAR filename can only contain alpha-numeric, '.', '-' and '_' characters";
}
}
function clean() {
if (fs.existsSync(BUILD_DIR)) {
wrench.rmdirSyncRecursive(BUILD_DIR);
}
}
function copyJavascript() {
wrench.mkdirSyncRecursive(path.join(BUILD_DIR, js_path), 0777);
utils.copyFile(CORDOVA_JS_SRC, path.join(BUILD_DIR, js_path));
//rename copied cordova.blackberry10.js file
fs.renameSync(path.join(BUILD_DIR, js_path, "cordova.blackberry10.js"), path.join(BUILD_DIR, js_path, js_basename));
}
function copyFilesToProject() {
var nodeModulesDest = path.join(project_path, "cordova", "node_modules");
// create project using template directory
wrench.mkdirSyncRecursive(project_path, 0777);
wrench.copyDirSyncRecursive(TEMPLATE_PROJECT_DIR, project_path);
// change file permission for cordova scripts because ant copy doesn't preserve file permissions
wrench.chmodSyncRecursive(path.join(project_path,"cordova"), 0700);
//copy cordova-*version*.js to www
utils.copyFile(path.join(BUILD_DIR, js_path, js_basename), path.join(project_path, "www"));
//copy node modules to cordova build directory
wrench.mkdirSyncRecursive(nodeModulesDest, 0777);
wrench.copyDirSyncRecursive(MODULES_PROJECT_DIR, nodeModulesDest);
//change permissions of plugman
fs.chmodSync(path.join(nodeModulesDest, "plugman", "main.js"), 0755);
//copy framework bootstrap
TARGETS.forEach(function (target) {
var chromeDir = path.join(native_dir, target, "chrome"),
frameworkLibDir = path.join(chromeDir, "lib");
wrench.mkdirSyncRecursive(frameworkLibDir);
wrench.copyDirSyncRecursive(BOOTSTRAP_PROJECT_DIR, chromeDir);
wrench.copyDirSyncRecursive(FRAMEWORK_LIB_PROJECT_DIR, frameworkLibDir);
});
// save release
wrench.mkdirSyncRecursive(update_dir, 0777);
wrench.copyDirSyncRecursive(BUILD_DIR, update_dir);
}
function updateProject() {
var projectJson = require(path.resolve(path.join(project_path, "project.json"))),
configXMLPath = path.resolve(path.join(project_path, "www", "config.xml")),
xmlString;
if (typeof app_id !== "undefined") {
xmlString = fs.readFileSync(configXMLPath, "utf-8");
fs.writeFileSync(configXMLPath, xmlString.replace("default.app.id", app_id), "utf-8");
}
if (typeof bar_name !== "undefined") {
projectJson.barName = bar_name;
}
projectJson.globalFetchDir = path.join(__dirname, "..", "plugins");
fs.writeFileSync(path.join(project_path, "project.json"), JSON.stringify(projectJson, null, 4) + "\n", "utf-8");
}
function installPlugins() {
var pluginScript = path.resolve(__dirname, "..", path.join(project_path, "cordova", "lib", "plugin.js"));
require(pluginScript).add(path.join(__dirname, "..", "plugins"));
}
if ( process.argv[2] === "-h" || process.argv[2] === "--help" ) {
console.log("\nUsage: create <project path> [package name [BAR filename]] \n");
console.log("Options: \n");
console.log(" -h, --help output usage information \n");
} else {
try {
validate();
clean();
copyJavascript();
copyFilesToProject();
updateProject();
installPlugins();
clean();
process.exit();
} catch (ex) {
console.log("Project creation failed!\n" + "Error: " + ex);
process.exit(1);
}
}