Adding type definitions for typescript (#72)

* Adding type definitions for typescript
* Requested changes
* Adding type support for sequences
diff --git a/lib/main.d.ts b/lib/main.d.ts
new file mode 100644
index 0000000..f2815e6
--- /dev/null
+++ b/lib/main.d.ts
@@ -0,0 +1,294 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more contributor
+// license agreements; and to You under the Apache License, Version 2.0.
+
+import * as Swagger from 'swagger-schema-official'
+
+export = openwhisk;
+
+declare function openwhisk(options?: openwhisk.Options): openwhisk.Client;
+
+declare namespace openwhisk {
+    interface Options {
+        api?: string;
+        api_key?: string;
+        apihost?: string;
+        namespace?: string;
+        ignore_certs?: boolean;
+        apigw_token?: string;
+        apigw_space_guid?: string;
+    }
+
+    // Client
+
+    interface Client {
+        actions: Actions;
+        activations: Activations;
+        namespaces: Namespaces;
+        packages: Packages;
+        rules: Rules;
+        triggers: Triggers;
+        feeds: Feeds;
+        routes: Routes;
+    }
+
+    // Ressources
+
+    interface Actions {
+        list(options?: { namespace?: string; skip?: number; limit?: number; }): Promise<ActionDesc[]>;
+        get(options: string): Promise<Action>
+        get(options: { name: string; namespace?: string }): Promise<Action>;
+        get(options: (string | { name: string; namespace?: string })[]): Promise<Action[]>;
+        invoke(options: string): Promise<{ activationId: string }>
+        invoke(options: { name: string; namespace?: string; blocking: true; params?: Dict; result: true; }): Promise<Dict>;
+        invoke(options: { name: string; namespace?: string; blocking: true; params?: Dict; result?: false; }): Promise<Activation<Dict>>;
+        invoke(options: { name: string; namespace?: string; blocking?: false; params?: Dict; result?: boolean; }): Promise<{ activationId: string }>;
+        invoke(options: (string | { name: string; namespace?: string; blocking?: boolean; params?: Dict; result?: boolean; })[]): Promise<{ activationId: string }[]>;
+        invoke<In extends Dict, Out extends Dict>(options: { name: string; namespace?: string; blocking: true; params?: In; result: true; }): Promise<Out>;
+        invoke<In extends Dict, Out extends Dict>(options: { name: string; namespace?: string; blocking: true; params?: In; result?: false; }): Promise<Activation<Out>>;
+        invoke<In extends Dict, Out extends Dict>(options: { name: string; namespace?: string; blocking?: false; params?: In; result?: boolean; }): Promise<{ activationId: string }>;
+        create(options: { name: string; namespace?: string; action: (string | Buffer | Action); kind?: Kind; overwrite?: boolean; params?: Dict; version?: string; }): Promise<Action>;
+        //create(options: { name: string; namespace?: string; action: (string | Buffer | Action); kind?: Kind; overwrite?: boolean; params?: Dict; version?: string; }[]): Promise<Action[]>;
+        update(options: { name: string; namespace?: string; action: (string | Buffer | Action); kind?: Kind; params?: Dict; version?: string; }): Promise<Action>;
+        //update(options: ({ name: string; namespace?: string; action: (string | Buffer | Action); kind?: Kind; params?: Dict; version?: string; })[]): Promise<Action[]>;
+        delete(options: string): Promise<Action>;
+        delete(options: { name: string; namespace?: string; }): Promise<Action>;
+        delete(options: (string | { name: string; namespace?: string; })[]): Promise<Action[]>;
+    }
+
+    interface Activations {
+        list(options?: { namespace?: string; name?: string; skip?: number; limit?: number; upto?: number; docs?: boolean; since?: number }): Promise<ActivationDesc[]>;
+        get<T extends Dict>(options: string): Promise<Activation<T>>;
+        get<T extends Dict>(options: { name: string; namespace?: string }): Promise<Activation<T>>;
+        get(options: string): Promise<Activation<Dict>>;
+        get(options: { name: string; namespace?: string }): Promise<Activation<Dict>>;
+        //get(options: (string | { name: string; namespace?: string })[]): Promise<Activation<Dict>[]>;
+        logs(options: { name: string; namespace?: string }): Promise<{ logs: String[] }>;
+        result<T extends Dict>(options: { name: string; namespace?: string }): Promise<Response<T>>;
+        result(options: { name: string; namespace?: string }): Promise<Response<Dict>>;
+    }
+
+    interface Namespaces {
+        list(): Promise<string[]>;
+        get(options: string): Promise<Namespace>
+        get(options: { namespace: string }): Promise<Namespace>
+        //get(options: (string | { namespace: string })[]): Promise<Namespace[]>
+    }
+
+    interface Packages {
+        list(options?: { namespace?: string; skip?: number; limit?: number; public?: boolean; }): Promise<PackageDesc[]>;
+        get(options: string): Promise<Package>
+        get(options: { name: string; namespace?: string }): Promise<Package>;
+        get(options: (string | { name: string; namespace?: string })[]): Promise<Package[]>;
+        create(options: { name: string; namespace?: string; package?: Package; overwrite?: boolean }): Promise<Package>;
+        update(options: { name: string; namespace?: string; package?: Package }): Promise<Package>;
+        delete(options: string): Promise<Package>
+        delete(options: { name: string; namespace?: string; }): Promise<Package>;
+        delete(options: (string | { name: string; namespace?: string; })[]): Promise<Package[]>;
+    }
+
+    interface Rules {
+        list(options?: { namespace?: string; skip?: number; limit?: number; }): Promise<RuleDesc[]>;
+        get(options: string): Promise<Rule>;
+        get(options: { name: string; namespace?: string; }): Promise<Rule>;
+        get(options: (string | { name: string; namespace?: string; })[]): Promise<Rule[]>;
+        create(options: { name: string; namespace?: string; action: string; trigger: string; status?: Status; overwrite?: boolean }): Promise<Rule>;
+        update(options: { name: string; namespace?: string; action: string; trigger: string; status?: Status }): Promise<Rule>;
+        delete(options: string): Promise<Rule>
+        delete(options: { name: string; namespace?: string; }): Promise<Rule>;
+        delete(options: (string | { name: string; namespace?: string; })[]): Promise<Rule[]>;
+        enable(options: { name: string; namespace?: string; }): Promise<String>;
+        disable(options: { name: string; namespace?: string; }): Promise<String>;
+    }
+
+    interface Triggers {
+        list(options?: { namespace?: string; skip?: number; limit?: number; }): Promise<TriggerDesc[]>;
+        get(options: string): Promise<Trigger>
+        get(options: { name: string; namespace?: string; }): Promise<Trigger>;
+        get(options: (string | { name: string; namespace?: string; })[]): Promise<Trigger[]>;
+        invoke(options: string): Promise<{ activationId: string }>
+        invoke(options: { name: string; namespace?: string; params?: Dict }): Promise<{ activationId: string }>
+        invoke(options: (string | { name: string; namespace?: string; params?: Dict })[]): Promise<{ activationId: string }[]>
+        invoke<T extends Dict>(options: { name: string; namespace?: string; params?: T }): Promise<{ activationId: string }>
+        create(options: { name: string; namespace?: string; trigger?: Trigger; overwrite?: boolean; }): Promise<Trigger>;
+        update(options: { name: string; namespace?: string; trigger?: Trigger }): Promise<Trigger>;
+        delete(options: string): Promise<Trigger>
+        delete(options: { name: string; namespace?: string; }): Promise<Trigger>;
+        delete(options: (string | { name: string; namespace?: string; })[]): Promise<Trigger[]>;
+    }
+
+    interface Feeds {
+        create(options: { name: string; trigger: string; namespace?: string; params?: Dict }): Promise<Activation<FeedActionDesc>>;
+        delete(options: { name: string; trigger: string; namespace?: string; }): Promise<Activation<FeedActionDesc>>;
+        feed(event: Event, options: { name: string; trigger: string; namespace?: string; }): Promise<Activation<FeedActionDesc>>;
+    }
+
+    interface Routes {
+        list(options?: { relpath?: string, basepath?: string, operation?: string, limit?: number, skip?: number }): Promise<{ apis: Route[] }>;
+        delete(options: { basepath: string; relpath?: string, operation?: Operation }): Promise<{}>;
+        create(options: { basepath?: string; relpath: string, operation: Operation, action: string }): Promise<Api>;
+    }
+
+    // Descriptions
+
+    interface ShortDesc {
+        name: string;
+        annotations?: KeyVal[];
+        version?: string;
+    }
+
+    interface Desc extends ShortDesc {
+        publish?: boolean;
+        namespace?: string;
+    }
+
+    type ActionDesc = Desc
+
+    interface ActivationDesc extends Desc {
+        activationId: string;
+    }
+
+    interface PackageDesc extends Desc {
+        binding?: boolean;
+    }
+
+    type RuleDesc = Desc
+
+    type TriggerDesc = Desc
+
+    interface FeedActionDesc {
+        lifecycleEvent: Event;
+        authKey: string;
+        triggerName: string;
+    }
+
+    // Entities
+
+    interface Action extends ActionDesc {
+        parameters?: KeyVal[];
+        limits?: Limits;
+        exec: Exec | Sequence;
+    }
+
+    interface Activation<T extends Dict> extends ActivationDesc {
+        subject: string;
+        start: number;
+        end: number;
+        duration: number;
+        response?: Response<T>;
+        logs: string[];
+    }
+
+    interface Namespace {
+        actions?: ActionDesc[];
+        packages?: PackageDesc[];
+        rules?: RuleDesc[];
+        triggers?: TriggerDesc[];
+    }
+
+    interface Package extends Desc {
+        actions?: ShortDesc[];
+        feeds?: ShortDesc[];
+        parameters?: KeyVal[];
+        binding?: {} | Package;
+    }
+
+    interface Rule extends RuleDesc {
+        trigger: PathName;
+        status: Status;
+        action: PathName;
+    }
+
+    interface Trigger extends TriggerDesc {
+        parameters?: KeyVal[];
+        limits?: any;
+    }
+
+    interface Route {
+        id: string;
+        key: string;
+        value: Api;
+    }
+
+    // Other
+
+    interface Dict {
+        [key: string]: any
+    }
+
+    interface Exec {
+        kind: Kind;
+        code: string;
+        binary?: boolean
+    }
+
+    interface Sequence {
+        kind: "sequence";
+        components: string[];
+    }
+
+    type Kind =
+        "" |
+        "nodejs:default" |
+        "nodejs:6" |
+        "python:default" |
+        "python:3" |
+        "python:2" |
+        "swift:default" |
+        "swift:3.1.1" |
+        "php:default" |
+        "php:7.1";
+
+    interface Limits {
+        timeout: number;
+        memory: number;
+        logs: number;
+    }
+
+    interface Response<T extends Dict> {
+        status: "success" | "failure";
+        statusCode?: number;
+        success: boolean;
+        result: T
+    }
+
+    interface KeyVal {
+        key: string;
+        value: any;
+    }
+
+    interface PathName {
+        path: string;
+        name: string;
+    }
+
+    type Status =
+        "" |
+        "active" |
+        "inactive" |
+        "activating" |
+        "deactivating";
+
+    type Event =
+        "" |
+        "CREATE" |
+        "DELETE" |
+        "PAUSE" |
+        "UNPAUSE"
+
+    type Operation =
+        "" |
+        "GET" |
+        "POST" |
+        "PUT" |
+        "PATCH" |
+        "DELETE"
+
+    interface Api {
+        namespace: string;
+        gwApiActivated: boolean;
+        tenantId: boolean;
+        gwApiUrl: string;
+        apidoc: Swagger.Spec;
+    }
+
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index e3cdec8..8a7f3e1 100644
--- a/package.json
+++ b/package.json
@@ -3,6 +3,7 @@
   "version": "3.6.0",
   "description": "JavaScript client library for the OpenWhisk platform",
   "main": "lib/main.js",
+  "typings": "lib/main.d.ts",
   "engines": {
     "node": ">=4.0.0"
   },
@@ -41,7 +42,9 @@
     "proxyquire": "1.7.4"
   },
   "dependencies": {
-    "request-promise": "^2.0.1"
+    "request-promise": "^2.0.1",
+    "@types/node": "^8.0.26",
+    "@types/swagger-schema-official": "^2.0.6"
   },
   "babel": {
     "presets": [
@@ -62,4 +65,4 @@
       "babel-core/register"
     ]
   }
-}
+}
\ No newline at end of file