bug fixes, updated templates, php support (#25)

* bug fixes (it works again), php support, updated language templates for latest versions

* added release notes, cleaned up repo
diff --git a/.gitignore b/.gitignore
index d6cee56..bc2fef9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 node_modules
 *.vsix
-out
\ No newline at end of file
+out
+package-lock.json
\ No newline at end of file
diff --git a/.vscodeignore b/.vscodeignore
index d726f57..2bd6dba 100644
--- a/.vscodeignore
+++ b/.vscodeignore
@@ -4,3 +4,4 @@
 .gitignore

 jsconfig.json

 vsc-extension-quickstart.md

+RELEASE-README.md
\ No newline at end of file
diff --git a/README.md b/README.md
index 7bc28aa..81c5331 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 
 Download and run the installer for your platform from the [Downloads Section](#downloads).
 
-[![Build Status](https://travis-ci.org/openwhisk/openwhisk-vscode.svg?branch=master)](https://travis-ci.org/openwhisk/openwhisk-vscode) [![License](http://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://raw.githubusercontent.com/openwhisk/openwhisk-vscode/blob/master/LICENSE)
+[![Build Status](https://travis-ci.org/openwhisk/openwhisk-vscode.svg?branch=master)](https://travis-ci.org/openwhisk/openwhisk-vscode) [![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://raw.githubusercontent.com/openwhisk/openwhisk-vscode/blob/master/LICENSE)
 
 Preview of VS Code OpenWhisk extension here:
 
diff --git a/RELEASE-README.md b/RELEASE-README.md
new file mode 100644
index 0000000..589c6f3
--- /dev/null
+++ b/RELEASE-README.md
@@ -0,0 +1,18 @@
+# Packaging the VSCode extension for release
+
+All based on information here: https://code.visualstudio.com/docs/extensions/publish-extension
+
+## Packaging a VS Code extension for local distribution.
+
+1. cd into the project root directory (this is the one that contains `package.json`)
+2. Update the `version` value in `package.json` (this can be manual or using `npm version`)
+3. Run the command `vsce package` - this compiles the .vsix file for release, which can be installed into vscode.  This file can be uploaded into the "Releases" section on github
+
+----
+
+## Packaging for remote distribution in windows marketplace:
+
+1. cd into the project root directory (this is the one that contains `package.json`)
+2. Update the `version` value in `package.json` (this can be manual or using `npm version`)
+3. Run the command `vsce publish` - This compiles the extension and publishes to the windows marketplace in one step. ***This requires an account with sufficient priveleges
+
diff --git a/package.json b/package.json
index aa1f979..847d942 100644
--- a/package.json
+++ b/package.json
@@ -1,198 +1,223 @@
 {
-  "name": "openwhisk",
-  "displayName": "OpenWhisk",
-  "description": "A VSCode extension for OpenWhisk",
-  "version": "0.0.5",
-  "publisher": "IBM",
-  "engines": {
-    "vscode": "^0.10.10"
-  },
-  "categories": [
-    "Languages",
-    "Other"
-  ],
-  "activationEvents": [
-    "*"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/openwhisk/openwhisk-vscode.git"
-  },
-  "author": {
-    "name": "Andrew Trice",
-    "email": "amtrice@us.ibm.com"
-  },
-  "contributors": [
-    {
-      "name": "Jeff Sloyer",
-      "email": "jbsloyer@us.ibm.com"
-    }
-  ],
-  "icon": "github-assets/logo.png",
-  "galleryBanner": {
-    "color": "#CFB69A",
-    "theme": "light"
-  },
-  "main": "./static-src/extension",
-  "contributes": {
-		"commands": [{
+	"name": "openwhisk",
+	"displayName": "OpenWhisk",
+	"description": "A VSCode extension for OpenWhisk",
+	"version": "0.0.6",
+	"publisher": "IBM",
+	"engines": {
+		"vscode": "^0.10.10"
+	},
+	"categories": [
+		"Languages",
+		"Other"
+	],
+	"activationEvents": [
+		"*"
+	],
+	"repository": {
+		"type": "git",
+		"url": "https://github.com/openwhisk/openwhisk-vscode.git"
+	},
+	"author": {
+		"name": "Andrew Trice",
+		"email": "amtrice@us.ibm.com"
+	},
+	"contributors": [
+		{
+			"name": "Jeff Sloyer",
+			"email": "jbsloyer@us.ibm.com"
+		}
+	],
+	"icon": "github-assets/logo.png",
+	"galleryBanner": {
+		"color": "#CFB69A",
+		"theme": "light"
+	},
+	"main": "./static-src/extension",
+	"contributes": {
+		"commands": [
+			{
 				"command": "extension.wsk.list",
 				"title": "wsk list"
-			}, {
+			},
+			{
 				"command": "extension.wsk.help",
 				"title": "wsk"
-			}, {
+			},
+			{
 				"command": "extension.wsk.help",
 				"title": "wsk help"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action",
 				"title": "wsk action"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.list",
 				"title": "wsk action list"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.invoke",
 				"title": "wsk action invoke"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.debug",
 				"title": "wsk action debug"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.create",
 				"title": "wsk action create"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.sequence.create",
 				"title": "wsk sequence create"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.update",
 				"title": "wsk action update"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.delete",
 				"title": "wsk action delete"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.get",
 				"title": "wsk action get"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.init",
 				"title": "wsk action init"
-			}, {
+			},
+			{
 				"command": "extension.wsk.action.rest",
 				"title": "wsk action REST"
 			},
-
-
 			{
 				"command": "extension.wsk.util.bluemix",
 				"title": "wsk bluemix"
-			}, {
+			},
+			{
 				"command": "extension.wsk.util.docs",
 				"title": "wsk docs"
 			},
-
-
 			{
 				"command": "extension.wsk.property.get",
 				"title": "wsk property get"
-			}, {
+			},
+			{
 				"command": "extension.wsk.property.set",
 				"title": "wsk property set"
-			}, {
+			},
+			{
 				"command": "extension.wsk.property.unset",
 				"title": "wsk property unset"
 			},
-
-
 			{
 				"command": "extension.wsk.trigger",
 				"title": "wsk trigger"
-			}, {
+			},
+			{
 				"command": "extension.wsk.trigger.list",
 				"title": "wsk trigger list"
-			}, {
+			},
+			{
 				"command": "extension.wsk.trigger.create",
 				"title": "wsk trigger create"
-			}, {
+			},
+			{
 				"command": "extension.wsk.trigger.update",
 				"title": "wsk trigger update"
-			}, {
+			},
+			{
 				"command": "extension.wsk.trigger.delete",
 				"title": "wsk trigger delete"
-			}, {
+			},
+			{
 				"command": "extension.wsk.trigger.get",
 				"title": "wsk trigger get"
-			}, {
+			},
+			{
 				"command": "extension.wsk.trigger.fire",
 				"title": "wsk trigger fire"
 			},
-
-
 			{
 				"command": "extension.wsk.rule",
 				"title": "wsk rule"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.list",
 				"title": "wsk rule list"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.create",
 				"title": "wsk rule create"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.update",
 				"title": "wsk rule update"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.delete",
 				"title": "wsk rule delete"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.enable",
 				"title": "wsk rule enable"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.disable",
 				"title": "wsk rule disable"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.status",
 				"title": "wsk rule status"
-			}, {
+			},
+			{
 				"command": "extension.wsk.rule.get",
 				"title": "wsk rule get"
 			},
-
-
 			{
 				"command": "extension.wsk.activation",
 				"title": "wsk activation"
-			}, {
+			},
+			{
 				"command": "extension.wsk.activation.list",
 				"title": "wsk activation list"
-			}, {
+			},
+			{
 				"command": "extension.wsk.activation.get",
 				"title": "wsk activation get"
-			}, {
+			},
+			{
 				"command": "extension.wsk.activation.logs",
 				"title": "wsk activation logs"
-			}, {
+			},
+			{
 				"command": "extension.wsk.activation.result",
 				"title": "wsk activation result"
 			}
 		]
 	},
-  "scripts": {
-    "postinstall": "rm -rf ./node_modules/openwhisk/test/"
-  },
-  "devDependencies": {
-    "gulp": "^3.9.1",
-    "gulp-vinyl-zip": "^1.2.2",
-    "vscode": "^0.11.0"
-  },
-  "dependencies": {
-    "open": "0.0.5",
-    "openwhisk": "https://github.com/triceam/openwhisk-client-js/tarball/master",
-    "request-promise": "^3.0.0"
-  },
-  "keywords": [
-    "IBM",
-    "openwhisk"
-  ],
-  "bugs": {
-    "url": "https://github.com/openwhisk/openwhisk-vscode/issues"
-  },
-  "license": "MIT",
-  "homepage": "https://github.com/openwhisk/openwhisk-vscode/blob/master/README.md"
+	"scripts": {
+		"postinstall": "rm -rf ./node_modules/openwhisk/test/"
+	},
+	"devDependencies": {
+		"gulp": "^3.9.1",
+		"gulp-vinyl-zip": "^1.2.2",
+		"vscode": "^0.11.0"
+	},
+	"dependencies": {
+		"open": "0.0.5",
+		"openwhisk": "https://github.com/triceam/openwhisk-client-js/tarball/master",
+		"request-promise": "^3.0.0"
+	},
+	"keywords": [
+		"IBM",
+		"openwhisk"
+	],
+	"bugs": {
+		"url": "https://github.com/openwhisk/openwhisk-vscode/issues"
+	},
+	"license": "MIT",
+	"homepage": "https://github.com/openwhisk/openwhisk-vscode/blob/master/README.md"
 }
diff --git a/static-src/commands/util.js b/static-src/commands/util.js
index 8dd0480..44b5402 100644
--- a/static-src/commands/util.js
+++ b/static-src/commands/util.js
@@ -92,6 +92,9 @@
             log.appendLine(error.error.logs[x]);
         }
     }
+    else if (error.error.error) {
+        log.appendLine(error.error.error);
+    }
 }
 
 function parseParametersString(parameterString) {
diff --git a/static-src/commands/wsk.action.js b/static-src/commands/wsk.action.js
index f680046..1d9ecdc 100644
--- a/static-src/commands/wsk.action.js
+++ b/static-src/commands/wsk.action.js
@@ -35,6 +35,7 @@
 //supported OpenWhisk file formats
 var NODE = 'JavaScript',
     NODE6 = 'JavaScript 6',
+    PHP = 'PHP',
     PYTHON = 'Python',
     SWIFT = 'Swift';
 
@@ -349,10 +350,24 @@
         };
 
         var swiftExt = '.swift';
+        var pyExt = '.py';
+        var phpExt = '.php';
         var lastIndex = vscode.window.activeTextEditor.document.uri.fsPath.lastIndexOf(swiftExt);
         if (lastIndex == vscode.window.activeTextEditor.document.uri.fsPath.length - swiftExt.length) {
-            //it's a swift file, handle it differently
             options.action = { exec: { kind: 'swift:3', code: options.action }}
+        } else {
+
+            lastIndex = vscode.window.activeTextEditor.document.uri.fsPath.lastIndexOf(pyExt);
+            if (lastIndex == vscode.window.activeTextEditor.document.uri.fsPath.length - pyExt.length) {
+                options.action = { exec: { kind: 'python:3', code: options.action }}
+            }else {
+                lastIndex = vscode.window.activeTextEditor.document.uri.fsPath.lastIndexOf(phpExt);
+                if (lastIndex == vscode.window.activeTextEditor.document.uri.fsPath.length - phpExt.length) {
+                    options.action = { exec: { kind: 'php:7.1', code: options.action }}
+                }else {
+                    options.action = { exec: { kind: 'nodejs:6', code: options.action }}
+                }
+            }
         }
 
         ow.actions.create(options)
@@ -408,10 +423,24 @@
                 };
 
                 var swiftExt = '.swift';
+                var pyExt = '.py';
+                var phpExt = '.php';
                 var lastIndex = vscode.window.activeTextEditor.document.uri.fsPath.lastIndexOf(swiftExt);
                 if (lastIndex == vscode.window.activeTextEditor.document.uri.fsPath.length - swiftExt.length) {
-                    //it's a swift file, handle it differently
                     options.action = { exec: { kind: 'swift:3', code: options.action }}
+                } else {
+
+                    lastIndex = vscode.window.activeTextEditor.document.uri.fsPath.lastIndexOf(pyExt);
+                    if (lastIndex == vscode.window.activeTextEditor.document.uri.fsPath.length - pyExt.length) {
+                        options.action = { exec: { kind: 'python:3', code: options.action }}
+                    }else {
+                        lastIndex = vscode.window.activeTextEditor.document.uri.fsPath.lastIndexOf(phpExt);
+                        if (lastIndex == vscode.window.activeTextEditor.document.uri.fsPath.length - phpExt.length) {
+                            options.action = { exec: { kind: 'php:7.1', code: options.action }}
+                        }else {
+                            options.action = { exec: { kind: 'nodejs:6', code: options.action }}
+                        }
+                    }
                 }
 
                 ow.actions.update(options)
@@ -476,7 +505,7 @@
 
                             var options = {
                                 actionName: action,
-                                action: { exec: { kind: 'nodejs', code: pipeCode },
+                                action: { exec: { kind: 'nodejs:6', code: pipeCode },
                                 parameters:[{
                                         'key': '_actions',
                                         'value': sequenceActions
@@ -674,7 +703,7 @@
         return;
     }
 
-    vscode.window.showQuickPick( [NODE, PYTHON, SWIFT], {placeHolder:'Select the type of action:'}).then( function (action) {
+    vscode.window.showQuickPick( [NODE, PHP, PYTHON, SWIFT], {placeHolder:'Select the type of action:'}).then( function (action) {
 
         if (action == undefined) {
             return;
@@ -707,6 +736,8 @@
             var fileExt = '';
             if (action == NODE || action == NODE6) {
                 fileExt += '.js'
+            } else if (action == PHP) {
+                fileExt += '.php'
             } else if (action == PYTHON) {
                 fileExt += '.py'
             } else {
diff --git a/static-src/templates/javascript.template b/static-src/templates/javascript.template
index fff1cb3..b215cff 100644
--- a/static-src/templates/javascript.template
+++ b/static-src/templates/javascript.template
@@ -1,26 +1,12 @@
 /**
   *
-  * main() will be invoked when you Run This Action.
-  * 
-  * @param Whisk actions accept a single parameter,
-  *        which must be a JSON object.
+  * main() will be invoked when you Run This Action
   *
-  * In this case, the params variable will look like:
-  *     { "message": "xxxx" }
+  * @param Cloud Functions actions accept a single parameter, which must be a JSON object.
   *
-  * @return The return value must also be JSON.
-  *         It will be the output of this action.
-  *         You can also return whisk.asyn(), and 
-  *         later call whisk.done() for asynchronus operations
+  * @return The output of this action, which must be a JSON object.
   *
   */
-
-var request = require('request');
-
-function main(args) {
-    var url = 'https://httpbin.org/get';
-    request.get(url, function(error, response, body) {
-        whisk.done({response: body});
-    });
-    return whisk.async();
-}
\ No newline at end of file
+function main(params) {
+	return { message: 'Hello World' };
+}
diff --git a/static-src/templates/javascript6.template b/static-src/templates/javascript6.template
index fff1cb3..b215cff 100644
--- a/static-src/templates/javascript6.template
+++ b/static-src/templates/javascript6.template
@@ -1,26 +1,12 @@
 /**
   *
-  * main() will be invoked when you Run This Action.
-  * 
-  * @param Whisk actions accept a single parameter,
-  *        which must be a JSON object.
+  * main() will be invoked when you Run This Action
   *
-  * In this case, the params variable will look like:
-  *     { "message": "xxxx" }
+  * @param Cloud Functions actions accept a single parameter, which must be a JSON object.
   *
-  * @return The return value must also be JSON.
-  *         It will be the output of this action.
-  *         You can also return whisk.asyn(), and 
-  *         later call whisk.done() for asynchronus operations
+  * @return The output of this action, which must be a JSON object.
   *
   */
-
-var request = require('request');
-
-function main(args) {
-    var url = 'https://httpbin.org/get';
-    request.get(url, function(error, response, body) {
-        whisk.done({response: body});
-    });
-    return whisk.async();
-}
\ No newline at end of file
+function main(params) {
+	return { message: 'Hello World' };
+}
diff --git a/static-src/templates/php.template b/static-src/templates/php.template
new file mode 100644
index 0000000..dfeaccb
--- /dev/null
+++ b/static-src/templates/php.template
@@ -0,0 +1,17 @@
+<?php
+/**
+  *
+  * main() will be invoked when you Run This Action
+  *
+  * @param Cloud Functions actions accept a single parameter, which must be a JSON object.
+  *
+  * @return The output of this action, which must be a JSON object.
+  *
+  */
+function main(array $args) : array
+{
+    $name = $args["message"] ?? "stranger";
+    $greeting = "Hello $name!";
+    echo $greeting;
+    return ["greeting" => $greeting];
+}