blob: ab073cad5486a5125bcce4f51a4d6ce299d64a24 [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.
*/
var Q = require('Q'),
fs = require('fs'),
path = require('path'),
shell = require('shelljs'),
uuid = require('node-uuid');
var defaultAppName = "CordovaWP8AppProj";
var defaultSlnName = "CordovaWP8Solution";
// Creates cordova-windows project at specified path with specified namespace, app name and GUID
module.exports.run = function (argv) {
// Get script args
var args = argv.slice(2);
// Set and validate parameters/defaults for create
var projectPath = args[0];
if (fs.existsSync(projectPath)){
return Q.reject("Project directory already exists:\n\t" + projectPath);
}
// Package name can't contain dashes, so replace it with underscores
// if replacing the - with a _ does not work, give up
var packageName = args[1] ? args[1].replace("-", "_") : "Cordova.Example";
if(!/^[a-zA-Z0-9._$]+$/g.test(packageName)) {
return Q.reject("Invalid identifier. PackageName may only include letters, numbers, _ and $");
}
var appName = args[2] || defaultAppName,
safeAppName = appName.replace(/(\.\s|\s\.|\s+|\.+)/g, '_'),
platformRoot = path.join(__dirname, '..', '..'),
templatePath = path.join(platformRoot, "template"),
customTemplate = args[3];
console.log("Creating Cordova Windows Project:");
console.log("\tApp Name : " + appName);
console.log("\tNamespace : " + packageName);
console.log("\tPath : " + projectPath);
if (customTemplate) {
console.log("Custom template path: " + customTemplate);
}
console.log('Copying necessary files to ' + projectPath);
// Copy the template source files to the new destination
shell.cp("-rf", path.join(templatePath, '*'), projectPath);
// Copy our unique VERSION file, so peeps can tell what version this project was created from.
shell.cp("-rf", path.join(platformRoot, 'VERSION'), projectPath);
// copy the defaults.xml into config.xml so this project can be built when create is called minus the cordova-cli
shell.cp(path.join(projectPath, "cordova", "defaults.xml"), path.join(projectPath, "config.xml"));
// if any custom template is provided, just copy it over created project
if (customTemplate && fs.existsSync(customTemplate)) {
console.log('Copying template overrides from ' + customTemplate + ' to ' + projectPath);
shell.cp("-rf", customTemplate, projectPath);
}
console.log("Updating project files");
// replace values in the AppManifest
var wmAppManifest = path.join(projectPath, "Properties", "WMAppManifest.xml"),
guid = uuid.v1();
shell.sed("-i", /\$guid1\$/g, guid, wmAppManifest);
shell.sed("-i", /\$safeprojectname\$/g, appName, wmAppManifest);
//replace projectname in project files
["App.xaml", "App.xaml.cs", "MainPage.xaml", "MainPage.xaml.cs", defaultAppName + ".csproj"].forEach(function (file) {
shell.sed("-i", /\$safeprojectname\$/g, packageName, path.join(projectPath, file));
});
if (appName != defaultAppName) {
var slnFile = path.join(projectPath, defaultSlnName + ".sln"),
csprojFile = path.join(projectPath, defaultAppName + ".csproj");
shell.sed("-i", new RegExp(defaultAppName, "g"), safeAppName, slnFile);
// rename project and solution
shell.mv("-f", slnFile, path.join(projectPath, safeAppName + ".sln"));
shell.mv("-f", csprojFile, path.join(projectPath, safeAppName + ".csproj"));
}
// remove template cruft
["__PreviewImage.jpg", "__TemplateIcon.png", "MyTemplate.vstemplate"].forEach(function (file) {
shell.rm(path.join(projectPath, file));
});
// Delete bld forder and bin folder
["bld", "bin", "*.user", "*.suo"].forEach(function (file) {
shell.rm('-rf', path.join(projectPath, file));
});
return Q.resolve();
};
module.exports.help = function () {
console.log("Usage: create PathToNewProject [ PackageName [ AppName [ CustomTemplate ] ] ]");
console.log(" PathToNewProject : The path to where you wish to create the project");
console.log(" PackageName : The namespace for the project (default is Cordova.Example)");
console.log(" AppName : The name of the application (default is CordovaAppProj)");
console.log(" CustomTemplate : The path to project template overrides");
console.log(" (will be copied over default platform template files)");
console.log("examples:");
console.log(" create C:\\Users\\anonymous\\Desktop\\MyProject");
console.log(" create C:\\Users\\anonymous\\Desktop\\MyProject io.Cordova.Example AnApp");
};