split wp8 into it's own file for future branching, today it is roughly identical to the wp7.js file but that could change
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugman/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugman/commit/43fbb280 Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugman/tree/43fbb280 Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugman/diff/43fbb280 Branch: refs/heads/master Commit: 43fbb28079a6debd8db45f8793365dc09fa8de75 Parents: 1fd68b1 Author: Jesse MacFadyen <[email protected]> Authored: Wed Apr 17 15:45:20 2013 -0700 Committer: Anis Kadri <[email protected]> Committed: Mon Apr 22 16:28:05 2013 -0700 ---------------------------------------------------------------------- platforms/wp8.js | 237 +++++++++++++++++++++++++++++++++++++++++++++++++ plugman.js | 2 +- 2 files changed, 238 insertions(+), 1 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/43fbb280/platforms/wp8.js ---------------------------------------------------------------------- diff --git a/platforms/wp8.js b/platforms/wp8.js new file mode 100644 index 0000000..d1406ee --- /dev/null +++ b/platforms/wp8.js @@ -0,0 +1,237 @@ +/* +/* + * + * Copyright 2013 Jesse MacFadyen + * + * 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. + * +*/ + +/* +node plugman --platform wp8 --project '/c//users/jesse/documents/visual studio 2012/Projects/TestPlugin7/' --plugin '.\test\plugins\ChildBrowser\' + +TODO: ( Apr. 16, 2013 - jm ) +- Update WMAppManifest.xml with any new required capabilities +- add references for any new libraries required by plugin + + + +*/ + +var fs = require('fs'), + path = require('path'), + glob = require('glob'), + shell = require('shelljs'), + et = require('elementtree'), + xml_helpers = require('../util/xml-helpers'), + getConfigChanges = require('../util/config-changes'), + assetsDir = 'www'; // relative path to project's web assets + +var unix_projPath, // for use with glob + projectFilename,// first csproj returned by glob unix_projPath + projPath, // full path to the project file, including file name + configFilePath, // path to config.xml + assets, // assets node et in root ./asset + platformTag, // wp8 platform node et + sourceFiles, // ./source-file inside platform + hosts, // ./access inside root + projectChanges; // <config-file target=".csproj" parent=".">, inside platform + + + +function copyFileSync(srcPath, destPath) { + + var stats = fs.statSync(srcPath); + if(stats.isDirectory()) { + shell.mkdir('-p', destPath); + // without the added slash at the end, we will get an extra folder inside destination + shell.cp('-r', srcPath + "/" , destPath); + } + else if(fs.existsSync(srcPath)) { + shell.cp(srcPath, destPath); + } + else { + console.log("File does not exist :: " + srcPath); + return; + } + + var msg = shell.error(); + if(msg) { + console.log("msg" + msg); + throw { name: "ShellError", message: msg}; + } +} + +function initPaths(project_dir, plugin_dir, plugin_et, variables) { + + unix_projPath = project_dir.split("\\").join("/"); + configFilePath = path.join(unix_projPath,'config.xml'); + projectFilename = glob.sync('*.csproj',{nocase:true,cwd:unix_projPath})[0]; + projPath = path.join(unix_projPath,projectFilename); + assets = plugin_et.findall('./asset'); + platformTag = plugin_et.find('./platform[@name="wp8"]'); + sourceFiles = platformTag.findall('./source-file'); + projectChanges = platformTag.findall('./config-file[@target=".csproj"]'); + hosts = plugin_et.findall('./access'); +} + +function install(project_dir, plugin_dir, plugin_et, variables) { + + // move asset files + assets && assets.forEach(function (asset) { + var srcPath = path.resolve(plugin_dir, asset.attrib['src']); + var targetPath = path.resolve(project_dir, assetsDir, asset.attrib['target']); + copyFileSync(srcPath, targetPath); + }); + + // move source files + sourceFiles && sourceFiles.forEach(function (sourceFile) { + var srcFilePath = path.resolve(plugin_dir, sourceFile.attrib['src']); + var destDir = path.resolve(project_dir, sourceFile.attrib['target-dir']); + var destFilePath = path.resolve(destDir, path.basename(sourceFile.attrib['src'])); + copyFileSync(srcFilePath, destFilePath); + }); + + updateConfigXml("install", configFilePath, plugin_et); + + et.register_namespace("csproj", "http://schemas.microsoft.com/developer/msbuild/2003"); + projectChanges && projectChanges.forEach(function (configNode) { + + var docStr = fs.readFileSync(projPath,"utf8"); + + // child is the configNode child that we will insert into csproj + var child = configNode.find('*'); + // we use empty text as a default, so we always modify the project file so Visual Studio will notice if open. + var newNodeText = ""; + if(child) { + + newNodeText = new et.ElementTree(child).write({xml_declaration:false}); + newNodeText = newNodeText.split("
").join("\n").split("
").join("\r"); + newNodeText += "\n\r"; + } + + // insert text right before closing tag + var newDocStr = docStr.replace("</Project>", newNodeText + "</Project>"); + + // save it, and get out + fs.writeFileSync(projPath, newDocStr); + }); +} + +function updateConfigXml(action, config_path, plugin_et) { + + var hosts = plugin_et.findall('./access'); + var platformTag = plugin_et.find('./platform[@name="wp8"]'); + var configChanges = getConfigChanges(platformTag); + var base_config_path = path.basename(config_path); + // add whitelist hosts + var root = et.Element("config-file"); + root.attrib['parent'] = '.'; + + hosts && hosts.forEach( function (tag) { + root.append(tag); + }); + + if (root.len()) { + var changeList = configChanges[path.basename(config_path)]; + // if changeList then add to it, otherwise create it. + if(changeList) { + changeList.push(root); + } + else { + configChanges[path.basename(config_path)] = [root] + } + } + + if (configChanges[path.basename(config_path)]) { + + // edit configuration files + var xmlDoc = xml_helpers.parseElementtreeSync(config_path) + configChanges[base_config_path].forEach( function (configNode) { + var selector = configNode.attrib["parent"], + children = configNode.findall('*'); + if( action == 'install') { + if (!xml_helpers.graftXML(xmlDoc, children, selector)) { + throw new Error('failed to add children to ' + selector + ' in ' + config_path); + } + } else { + if (!xml_helpers.pruneXML(xmlDoc, children, selector)) { + throw new Error('failed to remove children from ' + selector + ' in ' + config_path); + } + } + }); + } + + fs.writeFileSync(config_path, xmlDoc.write({indent: 4})); +} + +function uninstall(project_dir, plugin_dir, plugin_et, variables) { + + assets && assets.forEach(function (asset) { + var targetPath = path.resolve(project_dir, assetsDir, asset.attrib['target']); + shell.rm('-rf', targetPath); + }); + + sourceFiles && sourceFiles.forEach(function (sourceFile) { + var destDir = path.resolve(project_dir, sourceFile.attrib['target-dir']); + var destFilePath = path.resolve(destDir, path.basename(sourceFile.attrib['src'])); + shell.rm('-rf', destFilePath); + }); + + updateConfigXml("uninstall", configFilePath, plugin_et); + + et.register_namespace("csproj", "http://schemas.microsoft.com/developer/msbuild/2003"); + + projectChanges && projectChanges.forEach(function (configNode) { + + var docStr = fs.readFileSync(projPath,"utf8"); + + // child is the configNode child that we will insert into csproj + var child = configNode.find('*'); + if(child) { + var newNodeText = new et.ElementTree(child).write({xml_declaration:false}); + + newNodeText = newNodeText.split("
").join("\n").split("
").join("\r"); + + // insert text right before closing tag + var splitString = docStr.split(newNodeText); + console.log("split length = " + splitString.length); + var newDocStr = splitString.join(""); + + // save it, and get out + fs.writeFileSync(projPath, newDocStr); + } + else { + // this just lets Visual Studio know to reload the project if it is open + fs.writeFileSync(projPath, docStr); + } + }); +} + +exports.handlePlugin = function (action, project_dir, plugin_dir, plugin_et, variables) { + console.log("action = " + action); + switch(action) { + case 'install' : + initPaths(project_dir, plugin_dir, plugin_et, variables); + install(project_dir, plugin_dir, plugin_et, variables); + break; + case 'uninstall' : + initPaths(project_dir, plugin_dir, plugin_et, variables); + uninstall(project_dir, plugin_dir, plugin_et, variables); + break; + default : + throw 'error unknown action'; + break; + } +} http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/43fbb280/plugman.js ---------------------------------------------------------------------- diff --git a/plugman.js b/plugman.js index 16bc669..e0c926a 100755 --- a/plugman.js +++ b/plugman.js @@ -31,7 +31,7 @@ var fs = require('fs') 'ios': require('./platforms/ios'), 'blackberry': require('./platforms/blackberry'), 'wp7': require('./platforms/wp7'), - 'wp8': require('./platforms/wp7'), + 'wp8': require('./platforms/wp8'), 'www': require('./platforms/www') };
